dielines 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,18 @@
1
- (function(q,nt){typeof exports=="object"&&typeof module<"u"?nt(exports):typeof define=="function"&&define.amd?define(["exports"],nt):(q=typeof globalThis<"u"?globalThis:q||self,nt(q.Dielines={}))})(this,function(q){"use strict";function nt(r,t,e,s){return r<=s&&t>=e}class ot{constructor(t=1/0,e=1/0,s=-1/0,n=-1/0){this.xMin=t,this.yMin=e,this.xMax=s,this.yMax=n}get width(){return this.xMax-this.xMin}get height(){return this.yMax-this.yMin}contains(t){const[e,s]=t;return nt(this.xMin,this.xMax,e,e)&&nt(this.yMin,this.yMax,s,s)}overlaps(t){return nt(this.xMin,this.xMax,t.xMin,t.xMax)&&nt(this.yMin,this.yMax,t.yMin,t.yMax)}addPoint(t){const[e,s]=t;return new ot(Math.min(this.xMin,e),Math.min(this.yMin,s),Math.max(this.xMax,e),Math.max(this.yMax,s))}merge(t){return new ot(Math.min(this.xMin,t.xMin),Math.min(this.yMin,t.yMin),Math.max(this.xMax,t.xMax),Math.max(this.yMax,t.yMax))}}function ms(r){return r.reduce((t,e)=>t.addPoint(e),new ot)}const le=(r,t=1e-9)=>{let e=r;return Math.abs(r)<t&&(e=0),e.toFixed(-Math.log10(t))};function it(r,t=1e-9){return Array.from(new Map(r.map(([e,s])=>[`[${le(e,t)},${le(s,t)}]`,[e,s]])).values())}const bt=Math.PI/180,Ut=180/Math.PI,F=r=>`[${r[0]}, ${r[1]}]`,b=([r,t],[e,s],n=1e-9)=>Math.abs(r-e)<=n&&Math.abs(t-s)<=n,$=([r,t],[e,s])=>[r+e,t+s],j=([r,t],[e,s])=>[r-e,t-s],Rt=([r,t])=>r*r+t*t,I=([r,t],e)=>[r*e,t*e],Pt=([r,t],[e,s]=[0,0])=>(r-e)**2+(t-s)**2,B=(r,t=[0,0])=>Math.sqrt(Pt(r,t));function ht([r,t],[e,s]){return r*s-t*e}function Yt([r,t],[e,s]){return r*e+t*s}function H([r,t]){const e=B([r,t]);return[r/e,t/e]}function at(r,t){const e=Math.cos(t)*r,s=Math.sin(t)*r;return[e,s]}function gs([r,t]){return Math.atan2(t,r)}function ue(r){const t=B(r),e=gs(r);return[t,e]}function Dt(r,t,e=1e-9){const s=ht(r,t),n=Rt(r),o=Rt(t);return s*s<n*o*e*e}function O(r){return[-r[1],r[0]]}function xt(r){return[r[1],-r[0]]}function ps(r,t,e){return b(e,r)||Dt(j(e,r),t)}const ft=(r,t)=>{const[e,s,n,o,i,h,l,a,c]=r,[u,m,p,g,d,M,f,w,y]=t;return[e*u+s*g+n*f,e*m+s*d+n*w,e*p+s*M+n*y,o*u+i*g+h*f,o*m+i*d+h*w,o*p+i*M+h*y,l*u+a*g+c*f,l*m+a*d+c*w,l*p+a*M+c*y]},ws=r=>{const[t,e,s,n,o,i,h,l,a]=r,c=t*(o*a-i*l)-e*(n*a-i*h)+s*(n*l-o*h);return[(o*a-i*l)/c,(s*l-e*a)/c,(e*i-s*o)/c,(i*h-n*a)/c,(t*a-s*h)/c,(s*n-t*i)/c,(n*l-o*h)/c,(e*h-t*l)/c,(t*o-e*n)/c]},ds=r=>{const[t,e,s,n,o,i,h,l,a]=r;return[t,n,h,e,o,l,s,i,a]};class z{constructor(t){this._matrix=[1,0,0,0,1,0,0,0,1],t&&(this._matrix=[...t])}clone(){return new z(this._matrix)}transpose(){return this._matrix=ds(this._matrix),this}inverse(){return this._matrix=ws(this._matrix),this}translate(t,e){return this._matrix=ft(this._matrix,[1,0,t,0,1,e,0,0,1]),this}rotate(t,e){const s=Math.cos(t),n=Math.sin(t),o=[s,-n,0,n,s,0,0,0,1];return e&&this.translate(e[0],e[1]),this._matrix=ft(this._matrix,o),e&&this.translate(-e[0],-e[1]),this}mirrorX(){return this._matrix=ft(this._matrix,[1,0,0,0,-1,0,0,0,1]),this}mirrorY(){return this._matrix=ft(this._matrix,[-1,0,0,0,1,0,0,0,1]),this}mirrorLine(t,e){const[s,n]=t,o=Math.atan2(n,s);return e&&this.translate(e[0],e[1]),this.rotate(o),this.mirrorX(),this.rotate(-o),e&&this.translate(-e[0],-e[1]),this}mirrorCenter(t){return t&&this.translate(t[0],t[1]),this._matrix=ft(this._matrix,[-1,0,0,0,-1,0,0,0,1]),t&&this.translate(-t[0],-t[1]),this}scale(t,e){return e&&this.translate(e[0],e[1]),this._matrix=ft(this._matrix,[t,0,0,0,t,0,0,0,1]),e&&this.translate(-e[0],-e[1]),this}transform(t){const[e,s]=t,[n,o,i,h,l,a]=this._matrix;return[n*e+o*s+i,h*e+l*s+a]}transformAngle(t){const[e,s]=this.transform([Math.cos(t),Math.sin(t)]),[n,o]=this.transform([0,0]);return Math.atan2(s-o,e-n)}keepsOrientation(){const[t,,,,e]=this._matrix;return t*e>0}scaleFactor(){const[t,,,e]=this._matrix;return Math.sqrt(t*t+e*e)}}let lt=class{translateX(t){const e=new z().translate(t,0);return this.transform(e)}translateY(t){const e=new z().translate(0,t);return this.transform(e)}translate(t,e){const s=new z().translate(t,e);return this.transform(s)}translateTo([t,e]){const s=new z().translate(t,e);return this.transform(s)}rotate(t,e){const s=new z().rotate(t*bt,e);return this.transform(s)}scale(t,e){const s=new z().scale(t,e);return this.transform(s)}mirrorCenter(t){const e=new z().mirrorCenter(t);return this.transform(e)}mirror(t="x",e){const s=new z;return t==="x"?s.mirrorX():t==="y"?s.mirrorY():s.mirrorLine(t,e),this.transform(s)}};class Xt extends lt{constructor(t,e){super(),this.firstPoint=t,this.lastPoint=e,this.precision=1e-9,this.firstPoint=t,this.lastPoint=e}get repr(){return`${this.segmentType} ${F(this.firstPoint)} - ${F(this.lastPoint)}`}get info(){return this.repr}[Symbol.for("nodejs.util.inspect.custom")](){return this.repr}}class v extends Xt{constructor(){super(...arguments),this.segmentType="LINE",this._V=null,this._slope=null,this._yIntercept=null,this._boundingBox=null}isValidParameter(t){const e=this.length*this.precision;return t>=-e&&1-t>=-e}paramPoint(t){return $(this.firstPoint,I(this.V,t))}get length(){return B(this.firstPoint,this.lastPoint)}get squareLength(){return Pt(this.firstPoint,this.lastPoint)}get V(){return this._V===null&&(this._V=j(this.lastPoint,this.firstPoint)),this._V}get slope(){if(this._slope===null){const[t,e]=this.V;this._slope=e/t}return this._slope}get yIntercept(){return this._yIntercept===null&&(this._yIntercept=this.firstPoint[1]-this.slope*this.firstPoint[0]),this._yIntercept}get midPoint(){return $(this.firstPoint,I(this.V,.5))}isSame(t){return t instanceof v?b(this.firstPoint,t.firstPoint)&&b(this.lastPoint,t.lastPoint)||b(this.lastPoint,t.firstPoint)&&b(this.firstPoint,t.lastPoint):!1}clone(){return new v(this.firstPoint,this.lastPoint)}reverse(){return new v(this.lastPoint,this.firstPoint)}get boundingBox(){return this._boundingBox===null&&(this._boundingBox=new ot(Math.min(this.firstPoint[0],this.lastPoint[0])-this.precision,Math.min(this.firstPoint[1],this.lastPoint[1])-this.precision,Math.max(this.firstPoint[0],this.lastPoint[0])+this.precision,Math.max(this.firstPoint[1],this.lastPoint[1])+this.precision)),this._boundingBox}distanceFrom(t){const e=j(t,this.firstPoint),s=Yt(e,this.V)/this.squareLength;if(s<0)return B(t,this.firstPoint);if(s>1)return B(t,this.lastPoint);const n=this.paramPoint(s);return B(t,n)}isOnSegment(t){if(b(t,this.firstPoint,this.precision))return!0;const e=j(t,this.firstPoint);if(!Dt(this.V,e))return!1;const s=Yt(e,this.V)/this.squareLength;return this.isValidParameter(s)}gradientAt(t){return this.V}tangentAt(t){if(!this.isOnSegment(t))throw new Error("Point is not on segment");return H(this.V)}get normalVector(){return O(H(this.V))}get tangentAtFirstPoint(){return H(this.V)}get tangentAtLastPoint(){return H(this.V)}splitAt(t){let e;if(Array.isArray(t)&&t.length===0)return[this];Array.isArray(t[0])?e=t:e=[t],e.forEach(l=>{if(!this.isOnSegment(l))throw new Error(`Point ${F(l)} is not on segment ${this.repr}`)});const s=[this.firstPoint,...e,this.lastPoint],n=it(s),o=this.lastPoint[0]-this.firstPoint[0];let i=Math.sign(o),h=0;return Math.abs(o)<this.precision&&(i=Math.sign(this.lastPoint[1]-this.firstPoint[1]),h=1),n.sort((l,a)=>i*(l[h]-a[h])),n.flatMap((l,a)=>a===n.length-1?[]:new v(l,n[a+1]))}transform(t){return new v(t.transform(this.firstPoint),t.transform(this.lastPoint))}}function ys(r){return Array.from(Array(r).keys())}function Z(r){const t=Math.min(...r.map(e=>e.length));return ys(t).map(e=>r.map(s=>s[e]))}function ut(r,t=1e-9){return r<0?r+2*Math.PI:r>=2*Math.PI?r%(2*Math.PI):r>2*Math.PI-t?0:r}function Tt(r,t,e,s=1e-9){let n=t-r;return e&&(n=-n),n<0&&(n+=2*Math.PI),n>2*Math.PI-s?0:n}const $t=(r,t,e)=>{const s=ht(r.V,t.V),n=Rt(r.V),o=Rt(t.V),i=e?e*e:r.precision*t.precision;if(s*s<n*o*i)return"parallel";const h=j(t.firstPoint,r.firstPoint),l=ht(h,t.V)/s,a=ht(h,r.V)/s;return{intersectionParam1:l,intersectionParam2:a}};function ce(r,t,e=!1,s){const n=$t(r,t,s);if(n==="parallel"){if(!e)return null;if(r.isSame(t))return r;const h=it([t.isOnSegment(r.firstPoint)?r.firstPoint:null,t.isOnSegment(r.lastPoint)?r.lastPoint:null,r.isOnSegment(t.firstPoint)?t.firstPoint:null,r.isOnSegment(t.lastPoint)?t.lastPoint:null].filter(l=>l!==null)).sort((l,a)=>l[0]-a[0]);if(h.length===0||h.length===1)return null;if(h.length===2)return new v(h[0],h[1]);throw console.error(h),new Error("Unexpected number of points while intersecting parallel lines")}const{intersectionParam1:o,intersectionParam2:i}=n;return!r.isValidParameter(o)||!t.isValidParameter(i)?null:r.paramPoint(o)}const _t=(r,t)=>{const e=j(r,t);return ue(e)};class S extends Xt{constructor(t,e,s,n=!1,{ignoreChecks:o=!1}={}){if(super(t,e),this.segmentType="ARC",this._coefficients=null,this._angularLength=null,this._radius=null,this._firstAngle=null,this._lastAngle=null,this._boundingBox=null,this.center=s,this.clockwise=n,!o){if(b(t,e))throw new Error("Invalid arc, cannot be a full circle");if(Math.abs(this.radius-B(this.lastPoint,this.center))>this.precision)throw new Error(`Invalid arc, radius does not match between ${F(t)} and ${F(e)}} (center ${F(s)})`)}}get info(){return`ARC(${F(this.firstPoint)}, ${F(this.lastPoint)}, ${F(this.center)}, ${this.clockwise?"CW":"CCW"})`}get coefficients(){if(this._coefficients===null){const[t,e]=this.center,s=this.radius*this.radius;this._coefficients={x2:1/s,xy:0,y2:1/s,x:-(2*t)/s,y:-(2*e)/s,c:(t*t+e*e-s)/s}}return this._coefficients}isValidParameter(t){return 1-t>=-this.precision&&t>=-this.precision}angleToParam(t){return Tt(this.firstAngle,ut(t),this.clockwise)/this.angularLength}get angularLength(){return this._angularLength||(this._angularLength=Tt(this.firstAngle,this.lastAngle,this.clockwise)),this._angularLength}paramPoint(t){return $(this.center,at(this.radius,this.firstAngle+t*this.angularLength*(this.clockwise?-1:1)))}pointToParam(t){const[e,s]=_t(t,this.center);if(Math.abs(e-this.radius)>this.precision)throw new Error(`Point ${F(t)} is not on segment ${this.repr}`);const n=this.angleToParam(s);if(!this.isValidParameter(n))throw new Error(`Point ${F(t)} is not on segment ${this.repr}`);return n}get radius(){return this._radius===null&&(this._radius=B(this.firstPoint,this.center)),this._radius}get firstAngle(){if(this._firstAngle===null){const[t,e]=j(this.firstPoint,this.center);this._firstAngle=ut(Math.atan2(e,t))}return this._firstAngle}get lastAngle(){if(this._lastAngle===null){const[t,e]=j(this.lastPoint,this.center);this._lastAngle=ut(Math.atan2(e,t))}return this._lastAngle}get length(){return this.radius*this.angularLength}get squareLength(){return this.length*this.length}get midPoint(){return this.paramPoint(.5)}isSame(t){return!(t instanceof S)||!b(this.center,t.center)?!1:b(this.firstPoint,t.firstPoint)&&b(this.lastPoint,t.lastPoint)&&this.clockwise===t.clockwise||b(this.lastPoint,t.firstPoint)&&b(this.firstPoint,t.lastPoint)&&this.clockwise===!t.clockwise}clone(){return new S(this.firstPoint,this.lastPoint,this.center,this.clockwise)}reverse(){return new S(this.lastPoint,this.firstPoint,this.center,!this.clockwise)}get boundingBox(){if(this._boundingBox===null){const t=this.radius+this.precision,e=s=>this.isValidParameter(this.angleToParam(s));this._boundingBox=new ot(e(Math.PI)?this.center[0]-t:Math.min(this.firstPoint[0],this.lastPoint[0])-this.precision,e(Math.PI*1.5)?this.center[1]-t:Math.min(this.firstPoint[1],this.lastPoint[1])-this.precision,e(0)?this.center[0]+t:Math.max(this.firstPoint[0],this.lastPoint[0])+this.precision,e(Math.PI/2)?this.center[1]+t:Math.max(this.firstPoint[1],this.lastPoint[1])+this.precision)}return this._boundingBox}distanceFrom(t){const[e,s]=_t(t,this.center);return this.isValidParameter(this.angleToParam(s))?Math.abs(e-this.radius):Math.sqrt(Math.min(Pt(t,this.firstPoint),Pt(t,this.lastPoint)))}isOnSegment(t){if(b(t,this.firstPoint)||b(t,this.lastPoint))return!0;const[e,s]=_t(t,this.center);if(Math.abs(e-this.radius)>this.precision)return!1;const n=this.angleToParam(s);return this.isValidParameter(n)}gradientAt(t){const e=this.firstAngle+t*this.angularLength*(this.clockwise?-1:1),s=this.radius*this.angularLength,n=-s*Math.sin(e),o=s*Math.cos(e);return this.clockwise?[-n,-o]:[n,o]}tangentAt(t){const[e,s]=_t(t,this.center);if(Math.abs(e-this.radius)>this.precision)throw new Error("Point is not on the arc");const n=this.angleToParam(s);if(!this.isValidParameter(n))throw new Error("Point is not on the arc");const o=at(1,s);return(this.clockwise?xt:O)(H(o))}get tangentAtFirstPoint(){const t=at(1,this.firstAngle);return(this.clockwise?xt:O)(H(t))}get tangentAtLastPoint(){const t=at(1,this.lastAngle);return(this.clockwise?xt:O)(H(t))}splitAt(t){let e;if(Array.isArray(t)&&t.length===0)return[this];Array.isArray(t[0])?e=t:e=[t];const s=[0,1,...e.map(i=>this.pointToParam(i))],n=new Map(Z([s,[this.firstPoint,this.lastPoint,...e]]));s.sort((i,h)=>i-h);let o=null;return s.flatMap((i,h)=>{if(h===s.length-1)return[];const l=s[h+1];if(l-i<this.precision)return o===null&&(o=i),[];const a=o===null?i:o,c=new S(n.get(a)||this.paramPoint(a),n.get(l)||this.paramPoint(l),this.center,this.clockwise);return o=null,c})}transform(t){return new S(t.transform(this.firstPoint),t.transform(this.lastPoint),t.transform(this.center),t.keepsOrientation()?this.clockwise:!this.clockwise)}}function Ms(r,t,e){const s=new v(t,r),n=new v(t,e),o=O(s.tangentAtFirstPoint),i=O(n.tangentAtLastPoint),h=$t({firstPoint:s.midPoint,V:o,precision:1e-9},{firstPoint:n.midPoint,V:i,precision:1e-9});if(h==="parallel")throw new Error("Cannot create an arc from three colinear points");const l=ht(j(r,t),j(e,t))>0;return new S(r,e,$(s.midPoint,I(o,h.intersectionParam1)),l,{ignoreChecks:!0})}function fe(r,t,e){const s=new v(t,r),n=O(s.tangentAtFirstPoint),o=$t({firstPoint:s.midPoint,V:n,precision:1e-9},{firstPoint:r,V:O(e),precision:1e-9});if(o==="parallel")throw new Error("Cannot create an arc from three colinear points");const i=$(s.midPoint,I(n,o.intersectionParam1)),h=ht(j(i,r),j(i,$(r,e)))<0;return new S(r,t,i,h,{ignoreChecks:!0})}function bs(r,t){const e=j(t,r.firstPoint),s=Yt(e,r.V)/r.squareLength;return r.paramPoint(s)}function Ft(r,t,e){const s=e||r.precision,n=bs(r,t.center),o=B(n,t.center);if(o>t.radius+s)return[];if(Math.abs(o-t.radius)<s){const u=n;return r.isOnSegment(u)&&t.isOnSegment(u)?[u]:[]}const i=[],h=Math.sqrt(t.radius*t.radius-o*o),l=r.tangentAtFirstPoint,a=$(n,I(l,h));r.isOnSegment(a)&&t.isOnSegment(a)&&i.push(a);const c=$(n,I(l,-h));return r.isOnSegment(c)&&t.isOnSegment(c)&&i.push(c),i}const Ps=r=>{const{firstPoint:t,lastPoint:e,center:s,clockwise:n}=r;return new S(e,t,s,n,{ignoreChecks:!0})},xs=(r,t)=>{if(r.isSame(t))return[r];const e=it([t.isOnSegment(r.firstPoint)?r.firstPoint:null,t.isOnSegment(r.lastPoint)?r.lastPoint:null,r.isOnSegment(t.firstPoint)?t.firstPoint:null,r.isOnSegment(t.lastPoint)?t.lastPoint:null].filter(s=>s!==null)).sort((s,n)=>r.pointToParam(s)-r.pointToParam(n));if(e.length===0)return[];if(e.length===1)return[];if(e.length===2)return r.isSame(Ps(t))?[]:[new S(e[0],e[1],r.center,r.clockwise)];if(e.length===3){const s=b(e[0],t.lastPoint)||b(e[0],t.firstPoint)?1:0;return[new S(e[0+s],e[1+s],r.center,r.clockwise)]}else if(e.length===4)return[new S(e[0],e[1],r.center,r.clockwise),new S(e[2],e[3],r.center,r.clockwise)];throw new Error("Bug in the arc arc overlap algorithm")};function me(r,t,e=!1,s){const n=s||r.precision,o=B(r.center,t.center),i=r.radius+t.radius;if(o>i+n)return[];const h=Math.abs(r.radius-t.radius);if(o<h-n)return[];if(o<n)return h>n?[]:e?xs(r,t):[];const l=H(j(t.center,r.center)),a=o>i-n;if(a||Math.abs(o-h)<n){const f=a||r.radius>t.radius?1:-1,w=$(r.center,I(l,f*r.radius));return r.isOnSegment(w)&&t.isOnSegment(w)?[w]:[]}const c=r.radius*r.radius/(2*o)-t.radius*t.radius/(2*o)+o/2,u=$(r.center,I(l,c)),m=Math.sqrt(r.radius*r.radius-c*c),p=O(l),g=$(u,I(p,m)),d=$(u,I(p,-m)),M=[];return r.isOnSegment(g)&&t.isOnSegment(g)&&M.push(g),r.isOnSegment(d)&&t.isOnSegment(d)&&M.push(d),M}let U=class kt extends Xt{constructor(t,e,s,n,o,i,h=!1,{ignoreChecks:l=!1,angleUnits:a="deg"}={}){super(t,e),this.segmentType="ELLIPSE_ARC",this.precision=1e-6,this._coefficients=null,this.center=s;const c=n>=o;this.majorRadius=c?n:o,this.minorRadius=c?o:n;const u=a==="deg"?i*bt:i;if(this.tiltAngle=ut(c?u:u+Math.PI/2),this.clockwise=h,!l){if(b(t,e))throw new Error("Invalid arc, cannot be a full circle");if(!this.isPointOnEllipse(t))throw new Error(`First point ${F(t)} not on the ellipse defined by ${this.info}`);if(!this.isPointOnEllipse(e))throw new Error(`Last point ${F(e)} not on the ellipse defined by ${this.info}`);if(Math.abs(this.majorRadius-this.minorRadius)<this.precision)throw new Error("Both radii should be different, create an arc instead")}}get coefficients(){if(this._coefficients===null){const[t,e]=this.center,s=this.majorRadius*this.majorRadius,n=this.minorRadius*this.minorRadius,o=Math.cos(this.tiltAngle),i=Math.sin(this.tiltAngle),h=s*i*i+n*o*o,l=2*(n-s)*i*o,a=s*o*o+n*i*i;this._coefficients={x2:h,xy:l,y2:a,x:-2*h*t-l*e,y:-2*a*e-l*t,c:h*t*t+l*t*e+a*e*e-s*n}}return this._coefficients}get info(){return`ELLIPSE_ARC(${F(this.firstPoint)}, ${F(this.lastPoint)}, ${F(this.center)}, ${this.majorRadius}, ${this.minorRadius}, ${this.tiltAngle*Ut}, ${this.clockwise?"CW":"CCW"})`}reverse(){return new kt(this.lastPoint,this.firstPoint,this.center,this.majorRadius,this.minorRadius,this.tiltAngle,!this.clockwise,{ignoreChecks:!0,angleUnits:"rad"})}clone(){return new kt(this.firstPoint,this.lastPoint,this.center,this.majorRadius,this.minorRadius,this.tiltAngle,this.clockwise,{ignoreChecks:!0,angleUnits:"rad"})}computeEllipseExtrema(){const t=Math.tan(this.tiltAngle),e=this.minorRadius/this.majorRadius,s=-Math.atan(e*t),n=Math.atan(e/t);return[s,Math.PI+s,n,Math.PI+n].map(o=>this.thetaToParam(o)).filter(o=>this.isValidParameter(o)).map(o=>this.paramPoint(o))}get boundingBox(){if(this._boundingBox===void 0){const t=this.computeEllipseExtrema(),e=[this.firstPoint,this.lastPoint,...t];this._boundingBox=ms(e)}return this._boundingBox}get linearExentricity(){return this._linearExentricity===void 0&&(this._linearExentricity=Math.sqrt(this.majorRadius*this.majorRadius-this.minorRadius*this.minorRadius)),this._linearExentricity}get exentricity(){return this._exentricity===void 0&&(this._exentricity=this.linearExentricity/this.majorRadius),this._exentricity}get focals(){if(this._focals===void 0){const t=this.majorAxis;this._focals=[$(this.center,I(t,this.linearExentricity)),$(this.center,I(t,-this.linearExentricity))]}return this._focals}get majorAxis(){return at(1,this.tiltAngle)}paramPoint(t){const e=this.firstAngle+t*this.deltaAngle*(this.clockwise?-1:1);return this.reverseEllipseReferenceFrameTransform.transform([this.majorRadius*Math.cos(e),this.minorRadius*Math.sin(e)])}pointToParam(t){if(!this.isPointOnEllipse(t))throw new Error(`Point ${F(t)} not on the ellipse defined by ${this.repr}`);const e=this.thetaToParam(this.pointTheta(t));if(!this.isValidParameter(e))throw new Error(`Point ${F(t)} is not on segment ${this.repr}`);return e}get midPoint(){return this.paramPoint(.5)}isValidParameter(t){return 1-t>=-this.precision&&t>=-this.precision}isSame(t){return b(this.center,t.center)&&Math.abs(this.majorRadius-t.majorRadius)<this.precision&&Math.abs(this.minorRadius-t.minorRadius)<this.precision&&(Math.abs(this.tiltAngle-t.tiltAngle)<this.precision||Math.abs(Math.abs(this.tiltAngle-t.tiltAngle)-Math.PI)<this.precision)&&(b(this.firstPoint,t.firstPoint)&&this.clockwise===t.clockwise||b(this.firstPoint,t.lastPoint)&&this.clockwise!==t.clockwise)}pointTheta(t){const e=this.ellipseReferenceFrameTransform.transform(t),s=Math.atan2(e[1]/this.minorRadius,e[0]/this.majorRadius);return ut(s)}thetaToParam(t){return Tt(this.firstAngle,ut(t),this.clockwise)/this.deltaAngle}isPointOnEllipse(t){const[e,s]=this.focals,n=B(t,e),o=B(t,s);return Math.abs(2*this.majorRadius-n-o)<this.precision}isOnSegment(t){return this.isPointOnEllipse(t)?this.isValidParameter(this.thetaToParam(this.pointTheta(t))):!1}distanceFrom(t){let e;if(b(t,this.center)?e=$(this.center,I(O(this.majorAxis),this.minorRadius)):e=this.reverseEllipseReferenceFrameTransform.transform(As(this.majorRadius,this.minorRadius,this.ellipseReferenceFrameTransform.transform(t))),this.isValidParameter(this.thetaToParam(this.pointTheta(t))))return B(t,e);if(ps(t,this.majorAxis,this.center)){const s=ut(2*Math.PI-this.pointTheta(t)),n=this.thetaToParam(s);if(this.isValidParameter(n))return B(t,this.paramPoint(n))}return Math.min(B(t,this.firstPoint),B(t,this.lastPoint))}get ellipseReferenceFrameTransform(){return this._ellipseReferenceFrameTransform===void 0&&(this._ellipseReferenceFrameTransform=new z().rotate(-this.tiltAngle).translate(-this.center[0],-this.center[1])),this._ellipseReferenceFrameTransform}get reverseEllipseReferenceFrameTransform(){return this._reverseEllipseReferenceFrameTransform===void 0&&(this._reverseEllipseReferenceFrameTransform=new z().translate(this.center[0],this.center[1]).rotate(this.tiltAngle)),this._reverseEllipseReferenceFrameTransform}get rotateFromEllipseReferenceFrame(){return this._rotateFromEllipseReferenceFrame===void 0&&(this._rotateFromEllipseReferenceFrame=new z().rotate(this.tiltAngle)),this._rotateFromEllipseReferenceFrame}get firstAngle(){return this._firstAngle===void 0&&(this._firstAngle=this.pointTheta(this.firstPoint)),this._firstAngle}get lastAngle(){return this._lastAngle===void 0&&(this._lastAngle=this.pointTheta(this.lastPoint)),this._lastAngle}get deltaAngle(){return this._deltaAngle===void 0&&(this._deltaAngle=Tt(this.firstAngle,this.lastAngle,this.clockwise)),this._deltaAngle}normalAt(t){const e=this.tangentAt(t);return this.clockwise?O(e):xt(e)}gradientAt(t){const e=this.firstAngle+t*this.deltaAngle*(this.clockwise?-1:1),s=-this.majorRadius*this.deltaAngle*Math.sin(e),n=this.minorRadius*this.deltaAngle*Math.cos(e),o=this.clockwise?[-s,-n]:[s,n];return this.rotateFromEllipseReferenceFrame.transform(o)}tangentAt(t){const e=this.pointTheta(t),s=-this.majorRadius*Math.sin(e),n=this.minorRadius*Math.cos(e),o=this.clockwise?[-s,-n]:[s,n];return H(this.rotateFromEllipseReferenceFrame.transform(o))}get tangentAtFirstPoint(){const t=-this.majorRadius*Math.sin(this.firstAngle),e=this.minorRadius*Math.cos(this.firstAngle),s=this.clockwise?[-t,-e]:[t,e];return H(this.rotateFromEllipseReferenceFrame.transform(s))}get tangentAtLastPoint(){const t=-this.majorRadius*Math.sin(this.lastAngle),e=this.minorRadius*Math.cos(this.lastAngle),s=this.clockwise?[-t,-e]:[t,e];return H(this.rotateFromEllipseReferenceFrame.transform(s))}transform(t){const e=t.transformAngle(this.tiltAngle),s=t.scaleFactor();return new kt(t.transform(this.firstPoint),t.transform(this.lastPoint),t.transform(this.center),this.majorRadius*s,this.minorRadius*s,e,t.keepsOrientation()?this.clockwise:!this.clockwise,{angleUnits:"rad"})}splitAt(t){let e;if(Array.isArray(t)&&t.length===0)return[this];Array.isArray(t[0])?e=t:e=[t];const s=[0,1,...e.map(i=>this.pointToParam(i))],n=new Map(Z([s,[this.firstPoint,this.lastPoint,...e]]));s.sort((i,h)=>i-h);let o=null;return s.flatMap((i,h)=>{if(h===s.length-1)return[];const l=s[h+1];if(l-i<this.precision)return o===null&&(o=i),[];const a=o===null?i:o,c=new kt(n.get(a)||this.paramPoint(a),n.get(l)||this.paramPoint(l),this.center,this.majorRadius,this.minorRadius,this.tiltAngle,this.clockwise,{angleUnits:"rad"});return o=null,c})}};function Es(r,t,e,s,n,o,i){const{center:h,rx:l,ry:a}=vs(r,t,e,s,n*bt,!o,i);return Math.abs(l-a)<1e-9?new S(r,t,h,i):new U(r,t,h,l,a,n,i)}function vs([r,t],[e,s],n,o,i,h,l){if(n<0&&(n=-n),o<0&&(o=-o),n==0||o==0)throw Error("rx and ry can not be 0");const a=Math.sin(i),c=Math.cos(i),u=(r-e)/2,m=(t-s)/2,p=(r+e)/2,g=(t+s)/2,d=c*u+a*m,M=c*m-a*u,f=d*d/(n*n)+M*M/(o*o);f>1&&(n=n*Math.sqrt(f),o=o*Math.sqrt(f));const w=n*o,y=n*M,x=o*d,E=y*y+x*x;if(!E)throw Error("start point can not be same as end point");let R=Math.sqrt(Math.abs((w*w-E)/E));h==l&&(R=-R);const k=R*y/o,P=-R*x/n,T=c*k-a*P+p,_=a*k+c*P+g;return{center:[T,_],rx:n,ry:o}}function As(r,t,e){const s=Math.abs(e[0]),n=Math.abs(e[1]);let o=.707,i=.707;const h=r,l=t;for(let a=0;a<3;a++){const c=h*o,u=l*i,m=(h*h-l*l)*o**3/h,p=(l*l-h*h)*i**3/l,g=c-m,d=u-p,M=s-m,f=n-p,w=Math.hypot(g,d),y=Math.hypot(M,f);o=Math.min(1,Math.max(0,(M*w/y+m)/h)),i=Math.min(1,Math.max(0,(f*w/y+p)/l));const x=Math.hypot(o,i);o/=x,i/=x}return[h*o*Math.sign(e[0]),l*i*Math.sign(e[1])]}function Wt(r,t,e=1e-9){const s=r.transform(t.ellipseReferenceFrameTransform),n=s.slope,o=s.yIntercept,i=t.majorRadius*t.majorRadius,h=t.minorRadius*t.minorRadius,l=t.majorRadius*t.minorRadius,a=s.slope*s.slope,c=s.yIntercept*s.yIntercept,u=f=>f.map(w=>t.reverseEllipseReferenceFrameTransform.transform(w)).filter(w=>r.isOnSegment(w)&&t.isOnSegment(w));if(!Number.isFinite(n)){const f=s.firstPoint[0];if(Math.abs(f)-t.majorRadius>e)return[];if(Math.abs(Math.abs(f)-t.majorRadius)<e)return u([[f,0]]);const w=t.minorRadius*Math.sqrt(1-f*f/i),y=[f,w],x=[f,-w];return u([y,x])}const m=i*a+h-c;if(m<-e)return[];const p=i*a+h;if(Math.abs(m)<e){const f=-(i*n*o)/p,w=h*o/p;return u([[f,w]])}const g=Math.sqrt(m),d=[-(i*n*o+l*g)/p,(h*o-l*n*g)/p],M=[-(i*n*o-l*g)/p,(h*o+l*n*g)/p];return u([d,M])}const Ss=Object.prototype.toString;function Y(r){const t=Ss.call(r);return t.endsWith("Array]")&&!t.includes("Big")}function ks(r){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(!Y(r))throw new TypeError("input must be an array");if(r.length===0)throw new TypeError("input must not be empty");var e=t.fromIndex,s=e===void 0?0:e,n=t.toIndex,o=n===void 0?r.length:n;if(s<0||s>=r.length||!Number.isInteger(s))throw new Error("fromIndex must be a positive integer smaller than length");if(o<=s||o>r.length||!Number.isInteger(o))throw new Error("toIndex must be an integer greater than fromIndex and at most equal to length");for(var i=r[s],h=s+1;h<o;h++)r[h]>i&&(i=r[h]);return i}function Rs(r){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(!Y(r))throw new TypeError("input must be an array");if(r.length===0)throw new TypeError("input must not be empty");var e=t.fromIndex,s=e===void 0?0:e,n=t.toIndex,o=n===void 0?r.length:n;if(s<0||s>=r.length||!Number.isInteger(s))throw new Error("fromIndex must be a positive integer smaller than length");if(o<=s||o>r.length||!Number.isInteger(o))throw new Error("toIndex must be an integer greater than fromIndex and at most equal to length");for(var i=r[s],h=s+1;h<o;h++)r[h]<i&&(i=r[h]);return i}function ge(r){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(Y(r)){if(r.length===0)throw new TypeError("input must not be empty")}else throw new TypeError("input must be an array");var e;if(t.output!==void 0){if(!Y(t.output))throw new TypeError("output option must be an array if specified");e=t.output}else e=new Array(r.length);var s=Rs(r),n=ks(r);if(s===n)throw new RangeError("minimum and maximum input values are equal. Cannot rescale a constant array");var o=t.min,i=o===void 0?t.autoMinMax?s:0:o,h=t.max,l=h===void 0?t.autoMinMax?n:1:h;if(i>=l)throw new RangeError("min option must be smaller than max option");for(var a=(l-i)/(n-s),c=0;c<r.length;c++)e[c]=(r[c]-s)*a+i;return e}const It=" ".repeat(2),pe=" ".repeat(4);function Ts(){return we(this)}function we(r,t={}){const{maxRows:e=15,maxColumns:s=10,maxNumSize:n=8,padMinus:o="auto"}=t;return`${r.constructor.name} {
2
- ${It}[
3
- ${pe}${$s(r,e,s,n,o)}
4
- ${It}]
5
- ${It}rows: ${r.rows}
6
- ${It}columns: ${r.columns}
7
- }`}function $s(r,t,e,s,n){const{rows:o,columns:i}=r,h=Math.min(o,t),l=Math.min(i,e),a=[];if(n==="auto"){n=!1;t:for(let c=0;c<h;c++)for(let u=0;u<l;u++)if(r.get(c,u)<0){n=!0;break t}}for(let c=0;c<h;c++){let u=[];for(let m=0;m<l;m++)u.push(_s(r.get(c,m),s,n));a.push(`${u.join(" ")}`)}return l!==i&&(a[a.length-1]+=` ... ${i-e} more columns`),h!==o&&a.push(`... ${o-t} more rows`),a.join(`
8
- ${pe}`)}function _s(r,t,e){return(r>=0&&e?` ${de(r,t-1)}`:de(r,t)).padEnd(t)}function de(r,t){let e=r.toString();if(e.length<=t)return e;let s=r.toFixed(t);if(s.length>t&&(s=r.toFixed(Math.max(0,t-(s.length-t)))),s.length<=t&&!s.startsWith("0.000")&&!s.startsWith("-0.000"))return s;let n=r.toExponential(t);return n.length>t&&(n=r.toExponential(Math.max(0,t-(n.length-t)))),n.slice(0)}function Fs(r,t){r.prototype.add=function(e){return typeof e=="number"?this.addS(e):this.addM(e)},r.prototype.addS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)+e);return this},r.prototype.addM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)+e.get(s,n));return this},r.add=function(e,s){return new t(e).add(s)},r.prototype.sub=function(e){return typeof e=="number"?this.subS(e):this.subM(e)},r.prototype.subS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)-e);return this},r.prototype.subM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)-e.get(s,n));return this},r.sub=function(e,s){return new t(e).sub(s)},r.prototype.subtract=r.prototype.sub,r.prototype.subtractS=r.prototype.subS,r.prototype.subtractM=r.prototype.subM,r.subtract=r.sub,r.prototype.mul=function(e){return typeof e=="number"?this.mulS(e):this.mulM(e)},r.prototype.mulS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)*e);return this},r.prototype.mulM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)*e.get(s,n));return this},r.mul=function(e,s){return new t(e).mul(s)},r.prototype.multiply=r.prototype.mul,r.prototype.multiplyS=r.prototype.mulS,r.prototype.multiplyM=r.prototype.mulM,r.multiply=r.mul,r.prototype.div=function(e){return typeof e=="number"?this.divS(e):this.divM(e)},r.prototype.divS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)/e);return this},r.prototype.divM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)/e.get(s,n));return this},r.div=function(e,s){return new t(e).div(s)},r.prototype.divide=r.prototype.div,r.prototype.divideS=r.prototype.divS,r.prototype.divideM=r.prototype.divM,r.divide=r.div,r.prototype.mod=function(e){return typeof e=="number"?this.modS(e):this.modM(e)},r.prototype.modS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)%e);return this},r.prototype.modM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)%e.get(s,n));return this},r.mod=function(e,s){return new t(e).mod(s)},r.prototype.modulus=r.prototype.mod,r.prototype.modulusS=r.prototype.modS,r.prototype.modulusM=r.prototype.modM,r.modulus=r.mod,r.prototype.and=function(e){return typeof e=="number"?this.andS(e):this.andM(e)},r.prototype.andS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)&e);return this},r.prototype.andM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)&e.get(s,n));return this},r.and=function(e,s){return new t(e).and(s)},r.prototype.or=function(e){return typeof e=="number"?this.orS(e):this.orM(e)},r.prototype.orS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)|e);return this},r.prototype.orM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)|e.get(s,n));return this},r.or=function(e,s){return new t(e).or(s)},r.prototype.xor=function(e){return typeof e=="number"?this.xorS(e):this.xorM(e)},r.prototype.xorS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)^e);return this},r.prototype.xorM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)^e.get(s,n));return this},r.xor=function(e,s){return new t(e).xor(s)},r.prototype.leftShift=function(e){return typeof e=="number"?this.leftShiftS(e):this.leftShiftM(e)},r.prototype.leftShiftS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)<<e);return this},r.prototype.leftShiftM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)<<e.get(s,n));return this},r.leftShift=function(e,s){return new t(e).leftShift(s)},r.prototype.signPropagatingRightShift=function(e){return typeof e=="number"?this.signPropagatingRightShiftS(e):this.signPropagatingRightShiftM(e)},r.prototype.signPropagatingRightShiftS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)>>e);return this},r.prototype.signPropagatingRightShiftM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)>>e.get(s,n));return this},r.signPropagatingRightShift=function(e,s){return new t(e).signPropagatingRightShift(s)},r.prototype.rightShift=function(e){return typeof e=="number"?this.rightShiftS(e):this.rightShiftM(e)},r.prototype.rightShiftS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)>>>e);return this},r.prototype.rightShiftM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)>>>e.get(s,n));return this},r.rightShift=function(e,s){return new t(e).rightShift(s)},r.prototype.zeroFillRightShift=r.prototype.rightShift,r.prototype.zeroFillRightShiftS=r.prototype.rightShiftS,r.prototype.zeroFillRightShiftM=r.prototype.rightShiftM,r.zeroFillRightShift=r.rightShift,r.prototype.not=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,~this.get(e,s));return this},r.not=function(e){return new t(e).not()},r.prototype.abs=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.abs(this.get(e,s)));return this},r.abs=function(e){return new t(e).abs()},r.prototype.acos=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.acos(this.get(e,s)));return this},r.acos=function(e){return new t(e).acos()},r.prototype.acosh=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.acosh(this.get(e,s)));return this},r.acosh=function(e){return new t(e).acosh()},r.prototype.asin=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.asin(this.get(e,s)));return this},r.asin=function(e){return new t(e).asin()},r.prototype.asinh=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.asinh(this.get(e,s)));return this},r.asinh=function(e){return new t(e).asinh()},r.prototype.atan=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.atan(this.get(e,s)));return this},r.atan=function(e){return new t(e).atan()},r.prototype.atanh=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.atanh(this.get(e,s)));return this},r.atanh=function(e){return new t(e).atanh()},r.prototype.cbrt=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.cbrt(this.get(e,s)));return this},r.cbrt=function(e){return new t(e).cbrt()},r.prototype.ceil=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.ceil(this.get(e,s)));return this},r.ceil=function(e){return new t(e).ceil()},r.prototype.clz32=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.clz32(this.get(e,s)));return this},r.clz32=function(e){return new t(e).clz32()},r.prototype.cos=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.cos(this.get(e,s)));return this},r.cos=function(e){return new t(e).cos()},r.prototype.cosh=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.cosh(this.get(e,s)));return this},r.cosh=function(e){return new t(e).cosh()},r.prototype.exp=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.exp(this.get(e,s)));return this},r.exp=function(e){return new t(e).exp()},r.prototype.expm1=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.expm1(this.get(e,s)));return this},r.expm1=function(e){return new t(e).expm1()},r.prototype.floor=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.floor(this.get(e,s)));return this},r.floor=function(e){return new t(e).floor()},r.prototype.fround=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.fround(this.get(e,s)));return this},r.fround=function(e){return new t(e).fround()},r.prototype.log=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.log(this.get(e,s)));return this},r.log=function(e){return new t(e).log()},r.prototype.log1p=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.log1p(this.get(e,s)));return this},r.log1p=function(e){return new t(e).log1p()},r.prototype.log10=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.log10(this.get(e,s)));return this},r.log10=function(e){return new t(e).log10()},r.prototype.log2=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.log2(this.get(e,s)));return this},r.log2=function(e){return new t(e).log2()},r.prototype.round=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.round(this.get(e,s)));return this},r.round=function(e){return new t(e).round()},r.prototype.sign=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.sign(this.get(e,s)));return this},r.sign=function(e){return new t(e).sign()},r.prototype.sin=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.sin(this.get(e,s)));return this},r.sin=function(e){return new t(e).sin()},r.prototype.sinh=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.sinh(this.get(e,s)));return this},r.sinh=function(e){return new t(e).sinh()},r.prototype.sqrt=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.sqrt(this.get(e,s)));return this},r.sqrt=function(e){return new t(e).sqrt()},r.prototype.tan=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.tan(this.get(e,s)));return this},r.tan=function(e){return new t(e).tan()},r.prototype.tanh=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.tanh(this.get(e,s)));return this},r.tanh=function(e){return new t(e).tanh()},r.prototype.trunc=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.trunc(this.get(e,s)));return this},r.trunc=function(e){return new t(e).trunc()},r.pow=function(e,s){return new t(e).pow(s)},r.prototype.pow=function(e){return typeof e=="number"?this.powS(e):this.powM(e)},r.prototype.powS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,Math.pow(this.get(s,n),e));return this},r.prototype.powM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,Math.pow(this.get(s,n),e.get(s,n)));return this}}function J(r,t,e){let s=e?r.rows:r.rows-1;if(t<0||t>s)throw new RangeError("Row index out of range")}function K(r,t,e){let s=e?r.columns:r.columns-1;if(t<0||t>s)throw new RangeError("Column index out of range")}function mt(r,t){if(t.to1DArray&&(t=t.to1DArray()),t.length!==r.columns)throw new RangeError("vector size must be the same as the number of columns");return t}function gt(r,t){if(t.to1DArray&&(t=t.to1DArray()),t.length!==r.rows)throw new RangeError("vector size must be the same as the number of rows");return t}function Is(r,t){if(!Y(t))throw new TypeError("row indices must be an array");for(let e=0;e<t.length;e++)if(t[e]<0||t[e]>=r.rows)throw new RangeError("row indices are out of range")}function Ls(r,t){if(!Y(t))throw new TypeError("column indices must be an array");for(let e=0;e<t.length;e++)if(t[e]<0||t[e]>=r.columns)throw new RangeError("column indices are out of range")}function ye(r,t,e,s,n){if(arguments.length!==5)throw new RangeError("expected 4 arguments");if(Ct("startRow",t),Ct("endRow",e),Ct("startColumn",s),Ct("endColumn",n),t>e||s>n||t<0||t>=r.rows||e<0||e>=r.rows||s<0||s>=r.columns||n<0||n>=r.columns)throw new RangeError("Submatrix indices are out of range")}function Lt(r,t=0){let e=[];for(let s=0;s<r;s++)e.push(t);return e}function Ct(r,t){if(typeof t!="number")throw new TypeError(`${r} must be a number`)}function pt(r){if(r.isEmpty())throw new Error("Empty matrix has no elements to index")}function Cs(r){let t=Lt(r.rows);for(let e=0;e<r.rows;++e)for(let s=0;s<r.columns;++s)t[e]+=r.get(e,s);return t}function Bs(r){let t=Lt(r.columns);for(let e=0;e<r.rows;++e)for(let s=0;s<r.columns;++s)t[s]+=r.get(e,s);return t}function js(r){let t=0;for(let e=0;e<r.rows;e++)for(let s=0;s<r.columns;s++)t+=r.get(e,s);return t}function Vs(r){let t=Lt(r.rows,1);for(let e=0;e<r.rows;++e)for(let s=0;s<r.columns;++s)t[e]*=r.get(e,s);return t}function Ns(r){let t=Lt(r.columns,1);for(let e=0;e<r.rows;++e)for(let s=0;s<r.columns;++s)t[s]*=r.get(e,s);return t}function qs(r){let t=1;for(let e=0;e<r.rows;e++)for(let s=0;s<r.columns;s++)t*=r.get(e,s);return t}function Os(r,t,e){const s=r.rows,n=r.columns,o=[];for(let i=0;i<s;i++){let h=0,l=0,a=0;for(let c=0;c<n;c++)a=r.get(i,c)-e[i],h+=a,l+=a*a;t?o.push((l-h*h/n)/(n-1)):o.push((l-h*h/n)/n)}return o}function zs(r,t,e){const s=r.rows,n=r.columns,o=[];for(let i=0;i<n;i++){let h=0,l=0,a=0;for(let c=0;c<s;c++)a=r.get(c,i)-e[i],h+=a,l+=a*a;t?o.push((l-h*h/s)/(s-1)):o.push((l-h*h/s)/s)}return o}function Us(r,t,e){const s=r.rows,n=r.columns,o=s*n;let i=0,h=0,l=0;for(let a=0;a<s;a++)for(let c=0;c<n;c++)l=r.get(a,c)-e,i+=l,h+=l*l;return t?(h-i*i/o)/(o-1):(h-i*i/o)/o}function Ys(r,t){for(let e=0;e<r.rows;e++)for(let s=0;s<r.columns;s++)r.set(e,s,r.get(e,s)-t[e])}function Ds(r,t){for(let e=0;e<r.rows;e++)for(let s=0;s<r.columns;s++)r.set(e,s,r.get(e,s)-t[s])}function Xs(r,t){for(let e=0;e<r.rows;e++)for(let s=0;s<r.columns;s++)r.set(e,s,r.get(e,s)-t)}function Ws(r){const t=[];for(let e=0;e<r.rows;e++){let s=0;for(let n=0;n<r.columns;n++)s+=Math.pow(r.get(e,n),2)/(r.columns-1);t.push(Math.sqrt(s))}return t}function Gs(r,t){for(let e=0;e<r.rows;e++)for(let s=0;s<r.columns;s++)r.set(e,s,r.get(e,s)/t[e])}function Hs(r){const t=[];for(let e=0;e<r.columns;e++){let s=0;for(let n=0;n<r.rows;n++)s+=Math.pow(r.get(n,e),2)/(r.rows-1);t.push(Math.sqrt(s))}return t}function Js(r,t){for(let e=0;e<r.rows;e++)for(let s=0;s<r.columns;s++)r.set(e,s,r.get(e,s)/t[s])}function Ks(r){const t=r.size-1;let e=0;for(let s=0;s<r.columns;s++)for(let n=0;n<r.rows;n++)e+=Math.pow(r.get(n,s),2)/t;return Math.sqrt(e)}function Qs(r,t){for(let e=0;e<r.rows;e++)for(let s=0;s<r.columns;s++)r.set(e,s,r.get(e,s)/t)}let L=class C{static from1DArray(t,e,s){if(t*e!==s.length)throw new RangeError("data length does not match given dimensions");let n=new A(t,e);for(let o=0;o<t;o++)for(let i=0;i<e;i++)n.set(o,i,s[o*e+i]);return n}static rowVector(t){let e=new A(1,t.length);for(let s=0;s<t.length;s++)e.set(0,s,t[s]);return e}static columnVector(t){let e=new A(t.length,1);for(let s=0;s<t.length;s++)e.set(s,0,t[s]);return e}static zeros(t,e){return new A(t,e)}static ones(t,e){return new A(t,e).fill(1)}static rand(t,e,s={}){if(typeof s!="object")throw new TypeError("options must be an object");const{random:n=Math.random}=s;let o=new A(t,e);for(let i=0;i<t;i++)for(let h=0;h<e;h++)o.set(i,h,n());return o}static randInt(t,e,s={}){if(typeof s!="object")throw new TypeError("options must be an object");const{min:n=0,max:o=1e3,random:i=Math.random}=s;if(!Number.isInteger(n))throw new TypeError("min must be an integer");if(!Number.isInteger(o))throw new TypeError("max must be an integer");if(n>=o)throw new RangeError("min must be smaller than max");let h=o-n,l=new A(t,e);for(let a=0;a<t;a++)for(let c=0;c<e;c++){let u=n+Math.round(i()*h);l.set(a,c,u)}return l}static eye(t,e,s){e===void 0&&(e=t),s===void 0&&(s=1);let n=Math.min(t,e),o=this.zeros(t,e);for(let i=0;i<n;i++)o.set(i,i,s);return o}static diag(t,e,s){let n=t.length;e===void 0&&(e=n),s===void 0&&(s=e);let o=Math.min(n,e,s),i=this.zeros(e,s);for(let h=0;h<o;h++)i.set(h,h,t[h]);return i}static min(t,e){t=this.checkMatrix(t),e=this.checkMatrix(e);let s=t.rows,n=t.columns,o=new A(s,n);for(let i=0;i<s;i++)for(let h=0;h<n;h++)o.set(i,h,Math.min(t.get(i,h),e.get(i,h)));return o}static max(t,e){t=this.checkMatrix(t),e=this.checkMatrix(e);let s=t.rows,n=t.columns,o=new this(s,n);for(let i=0;i<s;i++)for(let h=0;h<n;h++)o.set(i,h,Math.max(t.get(i,h),e.get(i,h)));return o}static checkMatrix(t){return C.isMatrix(t)?t:new A(t)}static isMatrix(t){return t!=null&&t.klass==="Matrix"}get size(){return this.rows*this.columns}apply(t){if(typeof t!="function")throw new TypeError("callback must be a function");for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)t.call(this,e,s);return this}to1DArray(){let t=[];for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)t.push(this.get(e,s));return t}to2DArray(){let t=[];for(let e=0;e<this.rows;e++){t.push([]);for(let s=0;s<this.columns;s++)t[e].push(this.get(e,s))}return t}toJSON(){return this.to2DArray()}isRowVector(){return this.rows===1}isColumnVector(){return this.columns===1}isVector(){return this.rows===1||this.columns===1}isSquare(){return this.rows===this.columns}isEmpty(){return this.rows===0||this.columns===0}isSymmetric(){if(this.isSquare()){for(let t=0;t<this.rows;t++)for(let e=0;e<=t;e++)if(this.get(t,e)!==this.get(e,t))return!1;return!0}return!1}isEchelonForm(){let t=0,e=0,s=-1,n=!0,o=!1;for(;t<this.rows&&n;){for(e=0,o=!1;e<this.columns&&o===!1;)this.get(t,e)===0?e++:this.get(t,e)===1&&e>s?(o=!0,s=e):(n=!1,o=!0);t++}return n}isReducedEchelonForm(){let t=0,e=0,s=-1,n=!0,o=!1;for(;t<this.rows&&n;){for(e=0,o=!1;e<this.columns&&o===!1;)this.get(t,e)===0?e++:this.get(t,e)===1&&e>s?(o=!0,s=e):(n=!1,o=!0);for(let i=e+1;i<this.rows;i++)this.get(t,i)!==0&&(n=!1);t++}return n}echelonForm(){let t=this.clone(),e=0,s=0;for(;e<t.rows&&s<t.columns;){let n=e;for(let o=e;o<t.rows;o++)t.get(o,s)>t.get(n,s)&&(n=o);if(t.get(n,s)===0)s++;else{t.swapRows(e,n);let o=t.get(e,s);for(let i=s;i<t.columns;i++)t.set(e,i,t.get(e,i)/o);for(let i=e+1;i<t.rows;i++){let h=t.get(i,s)/t.get(e,s);t.set(i,s,0);for(let l=s+1;l<t.columns;l++)t.set(i,l,t.get(i,l)-t.get(e,l)*h)}e++,s++}}return t}reducedEchelonForm(){let t=this.echelonForm(),e=t.columns,s=t.rows,n=s-1;for(;n>=0;)if(t.maxRow(n)===0)n--;else{let o=0,i=!1;for(;o<s&&i===!1;)t.get(n,o)===1?i=!0:o++;for(let h=0;h<n;h++){let l=t.get(h,o);for(let a=o;a<e;a++){let c=t.get(h,a)-l*t.get(n,a);t.set(h,a,c)}}n--}return t}set(){throw new Error("set method is unimplemented")}get(){throw new Error("get method is unimplemented")}repeat(t={}){if(typeof t!="object")throw new TypeError("options must be an object");const{rows:e=1,columns:s=1}=t;if(!Number.isInteger(e)||e<=0)throw new TypeError("rows must be a positive integer");if(!Number.isInteger(s)||s<=0)throw new TypeError("columns must be a positive integer");let n=new A(this.rows*e,this.columns*s);for(let o=0;o<e;o++)for(let i=0;i<s;i++)n.setSubMatrix(this,this.rows*o,this.columns*i);return n}fill(t){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,t);return this}neg(){return this.mulS(-1)}getRow(t){J(this,t);let e=[];for(let s=0;s<this.columns;s++)e.push(this.get(t,s));return e}getRowVector(t){return A.rowVector(this.getRow(t))}setRow(t,e){J(this,t),e=mt(this,e);for(let s=0;s<this.columns;s++)this.set(t,s,e[s]);return this}swapRows(t,e){J(this,t),J(this,e);for(let s=0;s<this.columns;s++){let n=this.get(t,s);this.set(t,s,this.get(e,s)),this.set(e,s,n)}return this}getColumn(t){K(this,t);let e=[];for(let s=0;s<this.rows;s++)e.push(this.get(s,t));return e}getColumnVector(t){return A.columnVector(this.getColumn(t))}setColumn(t,e){K(this,t),e=gt(this,e);for(let s=0;s<this.rows;s++)this.set(s,t,e[s]);return this}swapColumns(t,e){K(this,t),K(this,e);for(let s=0;s<this.rows;s++){let n=this.get(s,t);this.set(s,t,this.get(s,e)),this.set(s,e,n)}return this}addRowVector(t){t=mt(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)+t[s]);return this}subRowVector(t){t=mt(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)-t[s]);return this}mulRowVector(t){t=mt(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)*t[s]);return this}divRowVector(t){t=mt(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)/t[s]);return this}addColumnVector(t){t=gt(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)+t[e]);return this}subColumnVector(t){t=gt(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)-t[e]);return this}mulColumnVector(t){t=gt(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)*t[e]);return this}divColumnVector(t){t=gt(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)/t[e]);return this}mulRow(t,e){J(this,t);for(let s=0;s<this.columns;s++)this.set(t,s,this.get(t,s)*e);return this}mulColumn(t,e){K(this,t);for(let s=0;s<this.rows;s++)this.set(s,t,this.get(s,t)*e);return this}max(t){if(this.isEmpty())return NaN;switch(t){case"row":{const e=new Array(this.rows).fill(Number.NEGATIVE_INFINITY);for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)>e[s]&&(e[s]=this.get(s,n));return e}case"column":{const e=new Array(this.columns).fill(Number.NEGATIVE_INFINITY);for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)>e[n]&&(e[n]=this.get(s,n));return e}case void 0:{let e=this.get(0,0);for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)>e&&(e=this.get(s,n));return e}default:throw new Error(`invalid option: ${t}`)}}maxIndex(){pt(this);let t=this.get(0,0),e=[0,0];for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)>t&&(t=this.get(s,n),e[0]=s,e[1]=n);return e}min(t){if(this.isEmpty())return NaN;switch(t){case"row":{const e=new Array(this.rows).fill(Number.POSITIVE_INFINITY);for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)<e[s]&&(e[s]=this.get(s,n));return e}case"column":{const e=new Array(this.columns).fill(Number.POSITIVE_INFINITY);for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)<e[n]&&(e[n]=this.get(s,n));return e}case void 0:{let e=this.get(0,0);for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)<e&&(e=this.get(s,n));return e}default:throw new Error(`invalid option: ${t}`)}}minIndex(){pt(this);let t=this.get(0,0),e=[0,0];for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)<t&&(t=this.get(s,n),e[0]=s,e[1]=n);return e}maxRow(t){if(J(this,t),this.isEmpty())return NaN;let e=this.get(t,0);for(let s=1;s<this.columns;s++)this.get(t,s)>e&&(e=this.get(t,s));return e}maxRowIndex(t){J(this,t),pt(this);let e=this.get(t,0),s=[t,0];for(let n=1;n<this.columns;n++)this.get(t,n)>e&&(e=this.get(t,n),s[1]=n);return s}minRow(t){if(J(this,t),this.isEmpty())return NaN;let e=this.get(t,0);for(let s=1;s<this.columns;s++)this.get(t,s)<e&&(e=this.get(t,s));return e}minRowIndex(t){J(this,t),pt(this);let e=this.get(t,0),s=[t,0];for(let n=1;n<this.columns;n++)this.get(t,n)<e&&(e=this.get(t,n),s[1]=n);return s}maxColumn(t){if(K(this,t),this.isEmpty())return NaN;let e=this.get(0,t);for(let s=1;s<this.rows;s++)this.get(s,t)>e&&(e=this.get(s,t));return e}maxColumnIndex(t){K(this,t),pt(this);let e=this.get(0,t),s=[0,t];for(let n=1;n<this.rows;n++)this.get(n,t)>e&&(e=this.get(n,t),s[0]=n);return s}minColumn(t){if(K(this,t),this.isEmpty())return NaN;let e=this.get(0,t);for(let s=1;s<this.rows;s++)this.get(s,t)<e&&(e=this.get(s,t));return e}minColumnIndex(t){K(this,t),pt(this);let e=this.get(0,t),s=[0,t];for(let n=1;n<this.rows;n++)this.get(n,t)<e&&(e=this.get(n,t),s[0]=n);return s}diag(){let t=Math.min(this.rows,this.columns),e=[];for(let s=0;s<t;s++)e.push(this.get(s,s));return e}norm(t="frobenius"){let e=0;if(t==="max")return this.max();if(t==="frobenius"){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)e=e+this.get(s,n)*this.get(s,n);return Math.sqrt(e)}else throw new RangeError(`unknown norm type: ${t}`)}cumulativeSum(){let t=0;for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)t+=this.get(e,s),this.set(e,s,t);return this}dot(t){C.isMatrix(t)&&(t=t.to1DArray());let e=this.to1DArray();if(e.length!==t.length)throw new RangeError("vectors do not have the same size");let s=0;for(let n=0;n<e.length;n++)s+=e[n]*t[n];return s}mmul(t){t=A.checkMatrix(t);let e=this.rows,s=this.columns,n=t.columns,o=new A(e,n),i=new Float64Array(s);for(let h=0;h<n;h++){for(let l=0;l<s;l++)i[l]=t.get(l,h);for(let l=0;l<e;l++){let a=0;for(let c=0;c<s;c++)a+=this.get(l,c)*i[c];o.set(l,h,a)}}return o}strassen2x2(t){t=A.checkMatrix(t);let e=new A(2,2);const s=this.get(0,0),n=t.get(0,0),o=this.get(0,1),i=t.get(0,1),h=this.get(1,0),l=t.get(1,0),a=this.get(1,1),c=t.get(1,1),u=(s+a)*(n+c),m=(h+a)*n,p=s*(i-c),g=a*(l-n),d=(s+o)*c,M=(h-s)*(n+i),f=(o-a)*(l+c),w=u+g-d+f,y=p+d,x=m+g,E=u-m+p+M;return e.set(0,0,w),e.set(0,1,y),e.set(1,0,x),e.set(1,1,E),e}strassen3x3(t){t=A.checkMatrix(t);let e=new A(3,3);const s=this.get(0,0),n=this.get(0,1),o=this.get(0,2),i=this.get(1,0),h=this.get(1,1),l=this.get(1,2),a=this.get(2,0),c=this.get(2,1),u=this.get(2,2),m=t.get(0,0),p=t.get(0,1),g=t.get(0,2),d=t.get(1,0),M=t.get(1,1),f=t.get(1,2),w=t.get(2,0),y=t.get(2,1),x=t.get(2,2),E=(s+n+o-i-h-c-u)*M,R=(s-i)*(-p+M),k=h*(-m+p+d-M-f-w+x),P=(-s+i+h)*(m-p+M),T=(i+h)*(-m+p),_=s*m,N=(-s+a+c)*(m-g+f),Q=(-s+a)*(g-f),tt=(a+c)*(-m+g),et=(s+n+o-h-l-a-c)*f,V=c*(-m+g+d-M-f-w+y),X=(-o+c+u)*(M+w-y),Ot=(o-u)*(M-y),st=o*w,yt=(c+u)*(-w+y),W=(-o+h+l)*(f+w-x),us=(o-l)*(f-x),cs=(h+l)*(-w+x),Wn=n*d,Gn=l*y,Hn=i*g,Jn=a*p,Kn=u*x,Qn=_+st+Wn,Zn=E+P+T+_+X+st+yt,tr=_+N+tt+et+st+W+cs,er=R+k+P+_+st+W+us,sr=R+P+T+_+Gn,nr=st+W+us+cs+Hn,rr=_+N+Q+V+X+Ot+st,or=X+Ot+st+yt+Jn,ir=_+N+Q+tt+Kn;return e.set(0,0,Qn),e.set(0,1,Zn),e.set(0,2,tr),e.set(1,0,er),e.set(1,1,sr),e.set(1,2,nr),e.set(2,0,rr),e.set(2,1,or),e.set(2,2,ir),e}mmulStrassen(t){t=A.checkMatrix(t);let e=this.clone(),s=e.rows,n=e.columns,o=t.rows,i=t.columns;n!==o&&console.warn(`Multiplying ${s} x ${n} and ${o} x ${i} matrix: dimensions do not match.`);function h(u,m,p){let g=u.rows,d=u.columns;if(g===m&&d===p)return u;{let M=C.zeros(m,p);return M=M.setSubMatrix(u,0,0),M}}let l=Math.max(s,o),a=Math.max(n,i);e=h(e,l,a),t=h(t,l,a);function c(u,m,p,g){if(p<=512||g<=512)return u.mmul(m);p%2===1&&g%2===1?(u=h(u,p+1,g+1),m=h(m,p+1,g+1)):p%2===1?(u=h(u,p+1,g),m=h(m,p+1,g)):g%2===1&&(u=h(u,p,g+1),m=h(m,p,g+1));let d=parseInt(u.rows/2,10),M=parseInt(u.columns/2,10),f=u.subMatrix(0,d-1,0,M-1),w=m.subMatrix(0,d-1,0,M-1),y=u.subMatrix(0,d-1,M,u.columns-1),x=m.subMatrix(0,d-1,M,m.columns-1),E=u.subMatrix(d,u.rows-1,0,M-1),R=m.subMatrix(d,m.rows-1,0,M-1),k=u.subMatrix(d,u.rows-1,M,u.columns-1),P=m.subMatrix(d,m.rows-1,M,m.columns-1),T=c(C.add(f,k),C.add(w,P),d,M),_=c(C.add(E,k),w,d,M),N=c(f,C.sub(x,P),d,M),Q=c(k,C.sub(R,w),d,M),tt=c(C.add(f,y),P,d,M),et=c(C.sub(E,f),C.add(w,x),d,M),V=c(C.sub(y,k),C.add(R,P),d,M),X=C.add(T,Q);X.sub(tt),X.add(V);let Ot=C.add(N,tt),st=C.add(_,Q),yt=C.sub(T,_);yt.add(N),yt.add(et);let W=C.zeros(2*X.rows,2*X.columns);return W=W.setSubMatrix(X,0,0),W=W.setSubMatrix(Ot,X.rows,0),W=W.setSubMatrix(st,0,X.columns),W=W.setSubMatrix(yt,X.rows,X.columns),W.subMatrix(0,p-1,0,g-1)}return c(e,t,l,a)}scaleRows(t={}){if(typeof t!="object")throw new TypeError("options must be an object");const{min:e=0,max:s=1}=t;if(!Number.isFinite(e))throw new TypeError("min must be a number");if(!Number.isFinite(s))throw new TypeError("max must be a number");if(e>=s)throw new RangeError("min must be smaller than max");let n=new A(this.rows,this.columns);for(let o=0;o<this.rows;o++){const i=this.getRow(o);i.length>0&&ge(i,{min:e,max:s,output:i}),n.setRow(o,i)}return n}scaleColumns(t={}){if(typeof t!="object")throw new TypeError("options must be an object");const{min:e=0,max:s=1}=t;if(!Number.isFinite(e))throw new TypeError("min must be a number");if(!Number.isFinite(s))throw new TypeError("max must be a number");if(e>=s)throw new RangeError("min must be smaller than max");let n=new A(this.rows,this.columns);for(let o=0;o<this.columns;o++){const i=this.getColumn(o);i.length&&ge(i,{min:e,max:s,output:i}),n.setColumn(o,i)}return n}flipRows(){const t=Math.ceil(this.columns/2);for(let e=0;e<this.rows;e++)for(let s=0;s<t;s++){let n=this.get(e,s),o=this.get(e,this.columns-1-s);this.set(e,s,o),this.set(e,this.columns-1-s,n)}return this}flipColumns(){const t=Math.ceil(this.rows/2);for(let e=0;e<this.columns;e++)for(let s=0;s<t;s++){let n=this.get(s,e),o=this.get(this.rows-1-s,e);this.set(s,e,o),this.set(this.rows-1-s,e,n)}return this}kroneckerProduct(t){t=A.checkMatrix(t);let e=this.rows,s=this.columns,n=t.rows,o=t.columns,i=new A(e*n,s*o);for(let h=0;h<e;h++)for(let l=0;l<s;l++)for(let a=0;a<n;a++)for(let c=0;c<o;c++)i.set(n*h+a,o*l+c,this.get(h,l)*t.get(a,c));return i}kroneckerSum(t){if(t=A.checkMatrix(t),!this.isSquare()||!t.isSquare())throw new Error("Kronecker Sum needs two Square Matrices");let e=this.rows,s=t.rows,n=this.kroneckerProduct(A.eye(s,s)),o=A.eye(e,e).kroneckerProduct(t);return n.add(o)}transpose(){let t=new A(this.columns,this.rows);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)t.set(s,e,this.get(e,s));return t}sortRows(t=Me){for(let e=0;e<this.rows;e++)this.setRow(e,this.getRow(e).sort(t));return this}sortColumns(t=Me){for(let e=0;e<this.columns;e++)this.setColumn(e,this.getColumn(e).sort(t));return this}subMatrix(t,e,s,n){ye(this,t,e,s,n);let o=new A(e-t+1,n-s+1);for(let i=t;i<=e;i++)for(let h=s;h<=n;h++)o.set(i-t,h-s,this.get(i,h));return o}subMatrixRow(t,e,s){if(e===void 0&&(e=0),s===void 0&&(s=this.columns-1),e>s||e<0||e>=this.columns||s<0||s>=this.columns)throw new RangeError("Argument out of range");let n=new A(t.length,s-e+1);for(let o=0;o<t.length;o++)for(let i=e;i<=s;i++){if(t[o]<0||t[o]>=this.rows)throw new RangeError(`Row index out of range: ${t[o]}`);n.set(o,i-e,this.get(t[o],i))}return n}subMatrixColumn(t,e,s){if(e===void 0&&(e=0),s===void 0&&(s=this.rows-1),e>s||e<0||e>=this.rows||s<0||s>=this.rows)throw new RangeError("Argument out of range");let n=new A(s-e+1,t.length);for(let o=0;o<t.length;o++)for(let i=e;i<=s;i++){if(t[o]<0||t[o]>=this.columns)throw new RangeError(`Column index out of range: ${t[o]}`);n.set(i-e,o,this.get(i,t[o]))}return n}setSubMatrix(t,e,s){if(t=A.checkMatrix(t),t.isEmpty())return this;let n=e+t.rows-1,o=s+t.columns-1;ye(this,e,n,s,o);for(let i=0;i<t.rows;i++)for(let h=0;h<t.columns;h++)this.set(e+i,s+h,t.get(i,h));return this}selection(t,e){Is(this,t),Ls(this,e);let s=new A(t.length,e.length);for(let n=0;n<t.length;n++){let o=t[n];for(let i=0;i<e.length;i++){let h=e[i];s.set(n,i,this.get(o,h))}}return s}trace(){let t=Math.min(this.rows,this.columns),e=0;for(let s=0;s<t;s++)e+=this.get(s,s);return e}clone(){let t=new A(this.rows,this.columns);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)t.set(e,s,this.get(e,s));return t}sum(t){switch(t){case"row":return Cs(this);case"column":return Bs(this);case void 0:return js(this);default:throw new Error(`invalid option: ${t}`)}}product(t){switch(t){case"row":return Vs(this);case"column":return Ns(this);case void 0:return qs(this);default:throw new Error(`invalid option: ${t}`)}}mean(t){const e=this.sum(t);switch(t){case"row":{for(let s=0;s<this.rows;s++)e[s]/=this.columns;return e}case"column":{for(let s=0;s<this.columns;s++)e[s]/=this.rows;return e}case void 0:return e/this.size;default:throw new Error(`invalid option: ${t}`)}}variance(t,e={}){if(typeof t=="object"&&(e=t,t=void 0),typeof e!="object")throw new TypeError("options must be an object");const{unbiased:s=!0,mean:n=this.mean(t)}=e;if(typeof s!="boolean")throw new TypeError("unbiased must be a boolean");switch(t){case"row":{if(!Y(n))throw new TypeError("mean must be an array");return Os(this,s,n)}case"column":{if(!Y(n))throw new TypeError("mean must be an array");return zs(this,s,n)}case void 0:{if(typeof n!="number")throw new TypeError("mean must be a number");return Us(this,s,n)}default:throw new Error(`invalid option: ${t}`)}}standardDeviation(t,e){typeof t=="object"&&(e=t,t=void 0);const s=this.variance(t,e);if(t===void 0)return Math.sqrt(s);for(let n=0;n<s.length;n++)s[n]=Math.sqrt(s[n]);return s}center(t,e={}){if(typeof t=="object"&&(e=t,t=void 0),typeof e!="object")throw new TypeError("options must be an object");const{center:s=this.mean(t)}=e;switch(t){case"row":{if(!Y(s))throw new TypeError("center must be an array");return Ys(this,s),this}case"column":{if(!Y(s))throw new TypeError("center must be an array");return Ds(this,s),this}case void 0:{if(typeof s!="number")throw new TypeError("center must be a number");return Xs(this,s),this}default:throw new Error(`invalid option: ${t}`)}}scale(t,e={}){if(typeof t=="object"&&(e=t,t=void 0),typeof e!="object")throw new TypeError("options must be an object");let s=e.scale;switch(t){case"row":{if(s===void 0)s=Ws(this);else if(!Y(s))throw new TypeError("scale must be an array");return Gs(this,s),this}case"column":{if(s===void 0)s=Hs(this);else if(!Y(s))throw new TypeError("scale must be an array");return Js(this,s),this}case void 0:{if(s===void 0)s=Ks(this);else if(typeof s!="number")throw new TypeError("scale must be a number");return Qs(this,s),this}default:throw new Error(`invalid option: ${t}`)}}toString(t){return we(this,t)}};L.prototype.klass="Matrix",typeof Symbol<"u"&&(L.prototype[Symbol.for("nodejs.util.inspect.custom")]=Ts);function Me(r,t){return r-t}function Zs(r){return r.every(t=>typeof t=="number")}L.random=L.rand,L.randomInt=L.randInt,L.diagonal=L.diag,L.prototype.diagonal=L.prototype.diag,L.identity=L.eye,L.prototype.negate=L.prototype.neg,L.prototype.tensorProduct=L.prototype.kroneckerProduct;let A=class fs extends L{constructor(t,e){if(super(),fs.isMatrix(t))return t.clone();if(Number.isInteger(t)&&t>=0)if(this.data=[],Number.isInteger(e)&&e>=0)for(let s=0;s<t;s++)this.data.push(new Float64Array(e));else throw new TypeError("nColumns must be a positive integer");else if(Y(t)){const s=t;if(t=s.length,e=t?s[0].length:0,typeof e!="number")throw new TypeError("Data must be a 2D array with at least one element");this.data=[];for(let n=0;n<t;n++){if(s[n].length!==e)throw new RangeError("Inconsistent array dimensions");if(!Zs(s[n]))throw new TypeError("Input data contains non-numeric values");this.data.push(Float64Array.from(s[n]))}}else throw new TypeError("First argument must be a positive number or an array");this.rows=t,this.columns=e}set(t,e,s){return this.data[t][e]=s,this}get(t,e){return this.data[t][e]}removeRow(t){return J(this,t),this.data.splice(t,1),this.rows-=1,this}addRow(t,e){return e===void 0&&(e=t,t=this.rows),J(this,t,!0),e=Float64Array.from(mt(this,e)),this.data.splice(t,0,e),this.rows+=1,this}removeColumn(t){K(this,t);for(let e=0;e<this.rows;e++){const s=new Float64Array(this.columns-1);for(let n=0;n<t;n++)s[n]=this.data[e][n];for(let n=t+1;n<this.columns;n++)s[n-1]=this.data[e][n];this.data[e]=s}return this.columns-=1,this}addColumn(t,e){typeof e>"u"&&(e=t,t=this.columns),K(this,t,!0),e=gt(this,e);for(let s=0;s<this.rows;s++){const n=new Float64Array(this.columns+1);let o=0;for(;o<t;o++)n[o]=this.data[s][o];for(n[o++]=e[s];o<this.columns+1;o++)n[o]=this.data[s][o-1];this.data[s]=n}return this.columns+=1,this}};Fs(L,A);class tn extends L{constructor(t){super(),this.data=t,this.rows=t.length,this.columns=t[0].length}set(t,e,s){return this.data[t][e]=s,this}get(t,e){return this.data[t][e]}}function be(r,t){let e=0;return Math.abs(r)>Math.abs(t)?(e=t/r,Math.abs(r)*Math.sqrt(1+e*e)):t!==0?(e=r/t,Math.abs(t)*Math.sqrt(1+e*e)):0}class en{constructor(t,e={}){const{assumeSymmetric:s=!1}=e;if(t=tn.checkMatrix(t),!t.isSquare())throw new Error("Matrix is not a square matrix");if(t.isEmpty())throw new Error("Matrix must be non-empty");let n=t.columns,o=new A(n,n),i=new Float64Array(n),h=new Float64Array(n),l=t,a,c,u=!1;if(s?u=!0:u=t.isSymmetric(),u){for(a=0;a<n;a++)for(c=0;c<n;c++)o.set(a,c,l.get(a,c));sn(n,h,i,o),nn(n,h,i,o)}else{let m=new A(n,n),p=new Float64Array(n);for(c=0;c<n;c++)for(a=0;a<n;a++)m.set(a,c,l.get(a,c));rn(n,m,p,o),on(n,h,i,o,m)}this.n=n,this.e=h,this.d=i,this.V=o}get realEigenvalues(){return Array.from(this.d)}get imaginaryEigenvalues(){return Array.from(this.e)}get eigenvectorMatrix(){return this.V}get diagonalMatrix(){let t=this.n,e=this.e,s=this.d,n=new A(t,t),o,i;for(o=0;o<t;o++){for(i=0;i<t;i++)n.set(o,i,0);n.set(o,o,s[o]),e[o]>0?n.set(o,o+1,e[o]):e[o]<0&&n.set(o,o-1,e[o])}return n}}function sn(r,t,e,s){let n,o,i,h,l,a,c,u;for(l=0;l<r;l++)e[l]=s.get(r-1,l);for(h=r-1;h>0;h--){for(u=0,i=0,a=0;a<h;a++)u=u+Math.abs(e[a]);if(u===0)for(t[h]=e[h-1],l=0;l<h;l++)e[l]=s.get(h-1,l),s.set(h,l,0),s.set(l,h,0);else{for(a=0;a<h;a++)e[a]/=u,i+=e[a]*e[a];for(n=e[h-1],o=Math.sqrt(i),n>0&&(o=-o),t[h]=u*o,i=i-n*o,e[h-1]=n-o,l=0;l<h;l++)t[l]=0;for(l=0;l<h;l++){for(n=e[l],s.set(l,h,n),o=t[l]+s.get(l,l)*n,a=l+1;a<=h-1;a++)o+=s.get(a,l)*e[a],t[a]+=s.get(a,l)*n;t[l]=o}for(n=0,l=0;l<h;l++)t[l]/=i,n+=t[l]*e[l];for(c=n/(i+i),l=0;l<h;l++)t[l]-=c*e[l];for(l=0;l<h;l++){for(n=e[l],o=t[l],a=l;a<=h-1;a++)s.set(a,l,s.get(a,l)-(n*t[a]+o*e[a]));e[l]=s.get(h-1,l),s.set(h,l,0)}}e[h]=i}for(h=0;h<r-1;h++){if(s.set(r-1,h,s.get(h,h)),s.set(h,h,1),i=e[h+1],i!==0){for(a=0;a<=h;a++)e[a]=s.get(a,h+1)/i;for(l=0;l<=h;l++){for(o=0,a=0;a<=h;a++)o+=s.get(a,h+1)*s.get(a,l);for(a=0;a<=h;a++)s.set(a,l,s.get(a,l)-o*e[a])}}for(a=0;a<=h;a++)s.set(a,h+1,0)}for(l=0;l<r;l++)e[l]=s.get(r-1,l),s.set(r-1,l,0);s.set(r-1,r-1,1),t[0]=0}function nn(r,t,e,s){let n,o,i,h,l,a,c,u,m,p,g,d,M,f,w,y;for(i=1;i<r;i++)t[i-1]=t[i];t[r-1]=0;let x=0,E=0,R=Number.EPSILON;for(a=0;a<r;a++){for(E=Math.max(E,Math.abs(e[a])+Math.abs(t[a])),c=a;c<r&&!(Math.abs(t[c])<=R*E);)c++;if(c>a)do{for(n=e[a],u=(e[a+1]-n)/(2*t[a]),m=be(u,1),u<0&&(m=-m),e[a]=t[a]/(u+m),e[a+1]=t[a]*(u+m),p=e[a+1],o=n-e[a],i=a+2;i<r;i++)e[i]-=o;for(x=x+o,u=e[c],g=1,d=g,M=g,f=t[a+1],w=0,y=0,i=c-1;i>=a;i--)for(M=d,d=g,y=w,n=g*t[i],o=g*u,m=be(u,t[i]),t[i+1]=w*m,w=t[i]/m,g=u/m,u=g*e[i]-w*n,e[i+1]=o+w*(g*n+w*e[i]),l=0;l<r;l++)o=s.get(l,i+1),s.set(l,i+1,w*s.get(l,i)+g*o),s.set(l,i,g*s.get(l,i)-w*o);u=-w*y*M*f*t[a]/p,t[a]=w*u,e[a]=g*u}while(Math.abs(t[a])>R*E);e[a]=e[a]+x,t[a]=0}for(i=0;i<r-1;i++){for(l=i,u=e[i],h=i+1;h<r;h++)e[h]<u&&(l=h,u=e[h]);if(l!==i)for(e[l]=e[i],e[i]=u,h=0;h<r;h++)u=s.get(h,i),s.set(h,i,s.get(h,l)),s.set(h,l,u)}}function rn(r,t,e,s){let n=0,o=r-1,i,h,l,a,c,u,m;for(u=n+1;u<=o-1;u++){for(m=0,a=u;a<=o;a++)m=m+Math.abs(t.get(a,u-1));if(m!==0){for(l=0,a=o;a>=u;a--)e[a]=t.get(a,u-1)/m,l+=e[a]*e[a];for(h=Math.sqrt(l),e[u]>0&&(h=-h),l=l-e[u]*h,e[u]=e[u]-h,c=u;c<r;c++){for(i=0,a=o;a>=u;a--)i+=e[a]*t.get(a,c);for(i=i/l,a=u;a<=o;a++)t.set(a,c,t.get(a,c)-i*e[a])}for(a=0;a<=o;a++){for(i=0,c=o;c>=u;c--)i+=e[c]*t.get(a,c);for(i=i/l,c=u;c<=o;c++)t.set(a,c,t.get(a,c)-i*e[c])}e[u]=m*e[u],t.set(u,u-1,m*h)}}for(a=0;a<r;a++)for(c=0;c<r;c++)s.set(a,c,a===c?1:0);for(u=o-1;u>=n+1;u--)if(t.get(u,u-1)!==0){for(a=u+1;a<=o;a++)e[a]=t.get(a,u-1);for(c=u;c<=o;c++){for(h=0,a=u;a<=o;a++)h+=e[a]*s.get(a,c);for(h=h/e[u]/t.get(u,u-1),a=u;a<=o;a++)s.set(a,c,s.get(a,c)+h*e[a])}}}function on(r,t,e,s,n){let o=r-1,i=0,h=r-1,l=Number.EPSILON,a=0,c=0,u=0,m=0,p=0,g=0,d=0,M=0,f,w,y,x,E,R,k,P,T,_,N,Q,tt,et,V;for(f=0;f<r;f++)for((f<i||f>h)&&(e[f]=n.get(f,f),t[f]=0),w=Math.max(f-1,0);w<r;w++)c=c+Math.abs(n.get(f,w));for(;o>=i;){for(x=o;x>i&&(g=Math.abs(n.get(x-1,x-1))+Math.abs(n.get(x,x)),g===0&&(g=c),!(Math.abs(n.get(x,x-1))<l*g));)x--;if(x===o)n.set(o,o,n.get(o,o)+a),e[o]=n.get(o,o),t[o]=0,o--,M=0;else if(x===o-1){if(k=n.get(o,o-1)*n.get(o-1,o),u=(n.get(o-1,o-1)-n.get(o,o))/2,m=u*u+k,d=Math.sqrt(Math.abs(m)),n.set(o,o,n.get(o,o)+a),n.set(o-1,o-1,n.get(o-1,o-1)+a),P=n.get(o,o),m>=0){for(d=u>=0?u+d:u-d,e[o-1]=P+d,e[o]=e[o-1],d!==0&&(e[o]=P-k/d),t[o-1]=0,t[o]=0,P=n.get(o,o-1),g=Math.abs(P)+Math.abs(d),u=P/g,m=d/g,p=Math.sqrt(u*u+m*m),u=u/p,m=m/p,w=o-1;w<r;w++)d=n.get(o-1,w),n.set(o-1,w,m*d+u*n.get(o,w)),n.set(o,w,m*n.get(o,w)-u*d);for(f=0;f<=o;f++)d=n.get(f,o-1),n.set(f,o-1,m*d+u*n.get(f,o)),n.set(f,o,m*n.get(f,o)-u*d);for(f=i;f<=h;f++)d=s.get(f,o-1),s.set(f,o-1,m*d+u*s.get(f,o)),s.set(f,o,m*s.get(f,o)-u*d)}else e[o-1]=P+u,e[o]=P+u,t[o-1]=d,t[o]=-d;o=o-2,M=0}else{if(P=n.get(o,o),T=0,k=0,x<o&&(T=n.get(o-1,o-1),k=n.get(o,o-1)*n.get(o-1,o)),M===10){for(a+=P,f=i;f<=o;f++)n.set(f,f,n.get(f,f)-P);g=Math.abs(n.get(o,o-1))+Math.abs(n.get(o-1,o-2)),P=T=.75*g,k=-.4375*g*g}if(M===30&&(g=(T-P)/2,g=g*g+k,g>0)){for(g=Math.sqrt(g),T<P&&(g=-g),g=P-k/((T-P)/2+g),f=i;f<=o;f++)n.set(f,f,n.get(f,f)-g);a+=g,P=T=k=.964}for(M=M+1,E=o-2;E>=x&&(d=n.get(E,E),p=P-d,g=T-d,u=(p*g-k)/n.get(E+1,E)+n.get(E,E+1),m=n.get(E+1,E+1)-d-p-g,p=n.get(E+2,E+1),g=Math.abs(u)+Math.abs(m)+Math.abs(p),u=u/g,m=m/g,p=p/g,!(E===x||Math.abs(n.get(E,E-1))*(Math.abs(m)+Math.abs(p))<l*(Math.abs(u)*(Math.abs(n.get(E-1,E-1))+Math.abs(d)+Math.abs(n.get(E+1,E+1))))));)E--;for(f=E+2;f<=o;f++)n.set(f,f-2,0),f>E+2&&n.set(f,f-3,0);for(y=E;y<=o-1&&(et=y!==o-1,y!==E&&(u=n.get(y,y-1),m=n.get(y+1,y-1),p=et?n.get(y+2,y-1):0,P=Math.abs(u)+Math.abs(m)+Math.abs(p),P!==0&&(u=u/P,m=m/P,p=p/P)),P!==0);y++)if(g=Math.sqrt(u*u+m*m+p*p),u<0&&(g=-g),g!==0){for(y!==E?n.set(y,y-1,-g*P):x!==E&&n.set(y,y-1,-n.get(y,y-1)),u=u+g,P=u/g,T=m/g,d=p/g,m=m/u,p=p/u,w=y;w<r;w++)u=n.get(y,w)+m*n.get(y+1,w),et&&(u=u+p*n.get(y+2,w),n.set(y+2,w,n.get(y+2,w)-u*d)),n.set(y,w,n.get(y,w)-u*P),n.set(y+1,w,n.get(y+1,w)-u*T);for(f=0;f<=Math.min(o,y+3);f++)u=P*n.get(f,y)+T*n.get(f,y+1),et&&(u=u+d*n.get(f,y+2),n.set(f,y+2,n.get(f,y+2)-u*p)),n.set(f,y,n.get(f,y)-u),n.set(f,y+1,n.get(f,y+1)-u*m);for(f=i;f<=h;f++)u=P*s.get(f,y)+T*s.get(f,y+1),et&&(u=u+d*s.get(f,y+2),s.set(f,y+2,s.get(f,y+2)-u*p)),s.set(f,y,s.get(f,y)-u),s.set(f,y+1,s.get(f,y+1)-u*m)}}}if(c!==0){for(o=r-1;o>=0;o--)if(u=e[o],m=t[o],m===0)for(x=o,n.set(o,o,1),f=o-1;f>=0;f--){for(k=n.get(f,f)-u,p=0,w=x;w<=o;w++)p=p+n.get(f,w)*n.get(w,o);if(t[f]<0)d=k,g=p;else if(x=f,t[f]===0?n.set(f,o,k!==0?-p/k:-p/(l*c)):(P=n.get(f,f+1),T=n.get(f+1,f),m=(e[f]-u)*(e[f]-u)+t[f]*t[f],R=(P*g-d*p)/m,n.set(f,o,R),n.set(f+1,o,Math.abs(P)>Math.abs(d)?(-p-k*R)/P:(-g-T*R)/d)),R=Math.abs(n.get(f,o)),l*R*R>1)for(w=f;w<=o;w++)n.set(w,o,n.get(w,o)/R)}else if(m<0)for(x=o-1,Math.abs(n.get(o,o-1))>Math.abs(n.get(o-1,o))?(n.set(o-1,o-1,m/n.get(o,o-1)),n.set(o-1,o,-(n.get(o,o)-u)/n.get(o,o-1))):(V=Bt(0,-n.get(o-1,o),n.get(o-1,o-1)-u,m),n.set(o-1,o-1,V[0]),n.set(o-1,o,V[1])),n.set(o,o-1,0),n.set(o,o,1),f=o-2;f>=0;f--){for(_=0,N=0,w=x;w<=o;w++)_=_+n.get(f,w)*n.get(w,o-1),N=N+n.get(f,w)*n.get(w,o);if(k=n.get(f,f)-u,t[f]<0)d=k,p=_,g=N;else if(x=f,t[f]===0?(V=Bt(-_,-N,k,m),n.set(f,o-1,V[0]),n.set(f,o,V[1])):(P=n.get(f,f+1),T=n.get(f+1,f),Q=(e[f]-u)*(e[f]-u)+t[f]*t[f]-m*m,tt=(e[f]-u)*2*m,Q===0&&tt===0&&(Q=l*c*(Math.abs(k)+Math.abs(m)+Math.abs(P)+Math.abs(T)+Math.abs(d))),V=Bt(P*p-d*_+m*N,P*g-d*N-m*_,Q,tt),n.set(f,o-1,V[0]),n.set(f,o,V[1]),Math.abs(P)>Math.abs(d)+Math.abs(m)?(n.set(f+1,o-1,(-_-k*n.get(f,o-1)+m*n.get(f,o))/P),n.set(f+1,o,(-N-k*n.get(f,o)-m*n.get(f,o-1))/P)):(V=Bt(-p-T*n.get(f,o-1),-g-T*n.get(f,o),d,m),n.set(f+1,o-1,V[0]),n.set(f+1,o,V[1]))),R=Math.max(Math.abs(n.get(f,o-1)),Math.abs(n.get(f,o))),l*R*R>1)for(w=f;w<=o;w++)n.set(w,o-1,n.get(w,o-1)/R),n.set(w,o,n.get(w,o)/R)}for(f=0;f<r;f++)if(f<i||f>h)for(w=f;w<r;w++)s.set(f,w,n.get(f,w));for(w=r-1;w>=i;w--)for(f=i;f<=h;f++){for(d=0,y=i;y<=Math.min(w,h);y++)d=d+s.get(f,y)*n.get(y,w);s.set(f,w,d)}}}function Bt(r,t,e,s){let n,o;return Math.abs(e)>Math.abs(s)?(n=s/e,o=e+n*s,[(r+n*t)/o,(t-n*r)/o]):(n=e/s,o=s+n*e,[(n*r+t)/o,(n*t-r)/o])}function Pe(r,t=1e-9){if(r[r.length-1]==0)return Pe(r.slice(0,-1),t);const e=new A([r.slice(0,-1).reverse().map(n=>-n/r[r.length-1]),...Array.from({length:r.length-2},(n,o)=>{const i=new Array(r.length-1).fill(0);return i[o]=1,i})]),s=new en(e);return s.realEigenvalues.filter((n,o)=>Math.abs(s.imaginaryEigenvalues[o])<t)}function xe(r,t){const e=Math.max(r.precision,t.precision),s=r.coefficients,n=s.x2,o=s.xy,i=s.y2,h=s.x,l=s.y,a=s.c,c=t.coefficients,u=c.x2,m=c.xy,p=c.y2,g=c.x,d=c.y,M=c.c,f={z0:a*n*g*g+n*n*M*M-h*n*g*M+u*u*a*a-2*n*M*u*a-h*g*u*a+u*h*h*M,z1:d*h*h*u-M*g*n*o-2*n*M*u*l-a*u*m*h+2*g*m*n*a+2*d*M*n*n+g*g*n*l-d*g*n*h-2*n*d*u*a-a*u*g*o+2*a*l*u*u-M*m*n*h-l*u*g*h+2*M*o*u*h,z2:d*d*n*n+2*p*M*n*n-l*u*g*o+M*u*o*o-l*u*m*h-M*m*n*o-2*n*d*u*l+2*g*m*n*l-p*g*n*h-2*n*p*u*a+m*m*n*a+2*d*o*u*h+l*l*u*u-i*u*g*h-d*m*n*h+2*a*i*u*u-a*u*m*o+p*h*h*u+g*g*n*i-d*g*n*o-2*n*M*u*i,z3:-2*n*u*i*d+d*u*o*o+2*p*o*u*h-i*u*m*h+m*m*n*l-d*m*n*o-2*n*p*u*l-l*u*m*o-p*m*n*h+2*d*p*n*n+2*l*i*u*u-i*u*g*o+2*g*m*n*i-p*g*n*o,z4:n*n*p*p-2*n*p*u*i+u*u*i*i-o*n*m*p-o*m*u*i+o*o*u*p+i*n*m*m},w=Pe([f.z0,f.z1,f.z2,f.z3,f.z4],e).flatMap(y=>{const x=n*m*y+n*g-u*o*y-u*h;if(x)return[[-(n*M+n*p*y*y-u*i*y*y+n*d*y-u*l*y-u*a)/x,y]];const E=o*y+h,R=-E/(2*n),k=i*y*y+l*y+a,P=E*E/(4*n*n)-k/n;if(Math.abs(P)<e)return[[R,y]];if(P>0){const T=Math.sqrt(P);return[[R+T,y],[R-T,y]]}return[]});return it(w,e)}function Ee(r,t){return xe(r,t).filter(e=>r.isOnSegment(e)&&t.isOnSegment(e))}const hn=r=>{const{firstPoint:t,lastPoint:e,center:s,majorRadius:n,minorRadius:o,tiltAngle:i,clockwise:h}=r;return new U(e,t,s,n,o,i,h,{ignoreChecks:!0,angleUnits:"rad"})},an=(r,t)=>{if(r.isSame(t))return[r];const e=(n,o)=>new U(n,o,r.center,r.majorRadius,r.minorRadius,r.tiltAngle,r.clockwise,{ignoreChecks:!0,angleUnits:"rad"}),s=it([t.isOnSegment(r.firstPoint)?r.firstPoint:null,t.isOnSegment(r.lastPoint)?r.lastPoint:null,r.isOnSegment(t.firstPoint)?t.firstPoint:null,r.isOnSegment(t.lastPoint)?t.lastPoint:null].filter(n=>n!==null)).sort((n,o)=>r.pointToParam(n)-r.pointToParam(o));if(s.length===0)return[];if(s.length===1)return[];if(s.length===2)return r.isSame(hn(t))?[]:[e(s[0],s[1])];if(s.length===3){const n=b(s[0],t.lastPoint)||b(s[0],t.firstPoint)?1:0;return[e(s[0+n],s[1+n])]}else if(s.length===4)return[e(s[0],s[1]),e(s[2],s[3])];throw new Error("Bug in the ellipse arc ellipse arc overlap algorithm")};function ln(r,t,e=!1){const s=Math.max(r.precision,t.precision);return b(r.center,t.center)&&Math.abs(r.majorRadius-t.majorRadius)<s&&Math.abs(r.minorRadius-t.minorRadius)<s&&(Math.abs(r.tiltAngle-t.tiltAngle)<s||Math.abs(Math.abs(r.tiltAngle-t.tiltAngle)-Math.PI)<s)?e?an(r,t):[]:xe(r,t).filter(n=>r.isOnSegment(n)&&t.isOnSegment(n))}function un(r,t,e){if(r instanceof v&&t instanceof v){const s=ce(r,t,!1,e);return s===null?[]:[s]}if(r instanceof v&&t instanceof S)return Ft(r,t,e);if(r instanceof S&&t instanceof v)return Ft(t,r,e);if(r instanceof S&&t instanceof S)return me(r,t,!1,e);throw new Error("Not implemented")}function Et(r,t,e){if(r instanceof v&&t instanceof v){const s=ce(r,t,!0,e);return s===null?{intersections:[],overlaps:[],count:0}:s instanceof v?{intersections:[],overlaps:[s],count:1}:{intersections:[s],overlaps:[],count:1}}if(!r.boundingBox.overlaps(t.boundingBox))return{intersections:[],overlaps:[],count:0};if(r instanceof v&&t instanceof S){const s=Ft(r,t,e);return{intersections:s,overlaps:[],count:s.length}}if(r instanceof S&&t instanceof v){const s=Ft(t,r,e);return{intersections:s,overlaps:[],count:s.length}}if(r instanceof S&&t instanceof S){const s=me(r,t,!0,e);return s.length?s[0]instanceof S?{intersections:[],overlaps:s,count:s.length}:{intersections:s,overlaps:[],count:s.length}:{intersections:[],overlaps:[],count:0}}if(r instanceof v&&t instanceof U){const s=Wt(r,t,e);return{intersections:s,overlaps:[],count:s.length}}if(t instanceof v&&r instanceof U){const s=Wt(t,r,e);return{intersections:s,overlaps:[],count:s.length}}if(r instanceof S&&t instanceof U){const s=Ee(r,t);return{intersections:s,overlaps:[],count:s.length}}if(t instanceof S&&r instanceof U){const s=Ee(t,r);return{intersections:s,overlaps:[],count:s.length}}if(r instanceof U&&t instanceof U){const s=ln(r,t,!0);return s.length?s[0]instanceof U?{intersections:[],overlaps:s,count:s.length}:{intersections:s,overlaps:[],count:s.length}:{intersections:[],overlaps:[],count:0}}throw new Error("Not implemented")}function ve(r){const t=[];for(let e=0;e<r;e++)for(let s=0;s<=e;s++)t.push([e,s]);return t}function*Gt(r){for(const[t,e]of ve(r.length))t!==e&&(yield[r[t],r[e]])}class Ae extends lt{constructor(t,{ignoreChecks:e=!1}={}){super(),this._boundingBox=null,e||Se(t),this.segments=t}get repr(){return this.segments.map(t=>t.repr).join(`
1
+ (function(X,ht){typeof exports=="object"&&typeof module<"u"?ht(exports):typeof define=="function"&&define.amd?define(["exports"],ht):(X=typeof globalThis<"u"?globalThis:X||self,ht(X.Dielines={}))})(this,function(X){"use strict";var xr=Object.defineProperty;var vr=(X,ht,Ft)=>ht in X?xr(X,ht,{enumerable:!0,configurable:!0,writable:!0,value:Ft}):X[ht]=Ft;var Et=(X,ht,Ft)=>vr(X,typeof ht!="symbol"?ht+"":ht,Ft);var ht=Object.defineProperty,Ft=(i,t,e)=>t in i?ht(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e,A=(i,t,e)=>(Ft(i,typeof t!="symbol"?t+"":t,e),e);function Kt(i,t,e,s){return i<=s&&t>=e}let Yt=class Qt{constructor(t=1/0,e=1/0,s=-1/0,n=-1/0){A(this,"xMin"),A(this,"yMin"),A(this,"xMax"),A(this,"yMax"),this.xMin=t,this.yMin=e,this.xMax=s,this.yMax=n}get width(){return this.xMax-this.xMin}get height(){return this.yMax-this.yMin}get center(){return[(this.xMin+this.xMax)/2,(this.yMin+this.yMax)/2]}grow(t){return new Qt(this.xMin-t,this.yMin-t,this.xMax+t,this.yMax+t)}contains(t){const[e,s]=t;return Kt(this.xMin,this.xMax,e,e)&&Kt(this.yMin,this.yMax,s,s)}overlaps(t){return Kt(this.xMin,this.xMax,t.xMin,t.xMax)&&Kt(this.yMin,this.yMax,t.yMin,t.yMax)}addPoint(t){const[e,s]=t;return new Qt(Math.min(this.xMin,e),Math.min(this.yMin,s),Math.max(this.xMax,e),Math.max(this.yMax,s))}merge(t){return new Qt(Math.min(this.xMin,t.xMin),Math.min(this.yMin,t.yMin),Math.max(this.xMax,t.xMax),Math.max(this.yMax,t.yMax))}intersection(t){return new Qt(Math.max(this.xMin,t.xMin),Math.max(this.yMin,t.yMin),Math.min(this.xMax,t.xMax),Math.min(this.yMax,t.yMax))}};function xe(i){return i.reduce((t,e)=>t.addPoint(e),new Yt)}const Ze=(i,t=1e-9)=>{let e=i;return Math.abs(i)<t&&(e=0),e.toFixed(-Math.log10(t))};function Pt(i,t=1e-9){return Array.from(new Map(i.map(([e,s])=>[`[${Ze(e,t)},${Ze(s,t)}]`,[e,s]])).values())}const St=Math.PI/180,ve=180/Math.PI,H=i=>`[${i[0]}, ${i[1]}]`,y=([i,t],[e,s],n=1e-9)=>Math.abs(i-e)<=n&&Math.abs(t-s)<=n,O=([i,t],[e,s])=>[i+e,t+s],q=([i,t],[e,s])=>[i-e,t-s],wt=([i,t])=>i*i+t*t,fi=([i,t])=>Math.sqrt(wt([i,t])),G=([i,t],e)=>[i*e,t*e],kt=([i,t],[e,s]=[0,0])=>(i-e)**2+(t-s)**2,N=(i,t=[0,0])=>Math.sqrt(kt(i,t));function bt([i,t],[e,s]){return i*s-t*e}function Ae([i,t],[e,s]){return i*e+t*s}function W([i,t]){const e=N([i,t]);return[i/e,t/e]}function Mt(i,t){const e=Math.cos(t)*i,s=Math.sin(t)*i;return[e,s]}function mi([i,t]){return Math.atan2(t,i)}function Qe(i){const t=N(i),e=mi(i);return[t,e]}function Ee(i,t,e=1e-9){const s=bt(i,t),n=wt(i),r=wt(t);return s*s<n*r*e*e}function tt(i){return[-i[1],i[0]]}function Dt(i){return[i[1],-i[0]]}function gi(i,t,e){return y(e,i)||Ee(q(e,i),t)}const It=(i,t)=>{const[e,s,n,r,o,h,l,a,c]=i,[u,f,p,g,w,P,m,d,M]=t;return[e*u+s*g+n*m,e*f+s*w+n*d,e*p+s*P+n*M,r*u+o*g+h*m,r*f+o*w+h*d,r*p+o*P+h*M,l*u+a*g+c*m,l*f+a*w+c*d,l*p+a*P+c*M]},pi=i=>{const[t,e,s,n,r,o,h,l,a]=i,c=t*(r*a-o*l)-e*(n*a-o*h)+s*(n*l-r*h);return[(r*a-o*l)/c,(s*l-e*a)/c,(e*o-s*r)/c,(o*h-n*a)/c,(t*a-s*h)/c,(s*n-t*o)/c,(n*l-r*h)/c,(e*h-t*l)/c,(t*r-e*n)/c]},wi=i=>{const[t,e,s,n,r,o,h,l,a]=i;return[t,n,h,e,r,l,s,o,a]};let at=class ui{constructor(t){A(this,"_matrix",[1,0,0,0,1,0,0,0,1]),t&&(this._matrix=[...t])}clone(){return new ui(this._matrix)}transpose(){return this._matrix=wi(this._matrix),this}inverse(){return this._matrix=pi(this._matrix),this}translate(t,e){return this._matrix=It(this._matrix,[1,0,t,0,1,e,0,0,1]),this}rotate(t,e){const s=Math.cos(t),n=Math.sin(t),r=[s,-n,0,n,s,0,0,0,1];return e&&this.translate(e[0],e[1]),this._matrix=It(this._matrix,r),e&&this.translate(-e[0],-e[1]),this}mirrorX(){return this._matrix=It(this._matrix,[1,0,0,0,-1,0,0,0,1]),this}mirrorY(){return this._matrix=It(this._matrix,[-1,0,0,0,1,0,0,0,1]),this}mirrorLine(t,e){const[s,n]=t,r=Math.atan2(n,s);return e&&this.translate(e[0],e[1]),this.rotate(r),this.mirrorX(),this.rotate(-r),e&&this.translate(-e[0],-e[1]),this}mirrorCenter(t){return t&&this.translate(t[0],t[1]),this._matrix=It(this._matrix,[-1,0,0,0,-1,0,0,0,1]),t&&this.translate(-t[0],-t[1]),this}scale(t,e){return e&&this.translate(e[0],e[1]),this._matrix=It(this._matrix,[t,0,0,0,t,0,0,0,1]),e&&this.translate(-e[0],-e[1]),this}transform(t){const[e,s]=t,[n,r,o,h,l,a]=this._matrix;return[n*e+r*s+o,h*e+l*s+a]}transformAngle(t){const[e,s]=this.transform([Math.cos(t),Math.sin(t)]),[n,r]=this.transform([0,0]);return Math.atan2(s-r,e-n)}keepsOrientation(){const[t,,,,e]=this._matrix;return t*e>0}scaleFactor(){const[t,,,e]=this._matrix;return Math.sqrt(t*t+e*e)}};class $t{translateX(t){const e=new at().translate(t,0);return this.transform(e)}translateY(t){const e=new at().translate(0,t);return this.transform(e)}translate(t,e){const s=new at().translate(t,e);return this.transform(s)}translateTo([t,e]){const s=new at().translate(t,e);return this.transform(s)}rotate(t,e){const s=new at().rotate(t*St,e);return this.transform(s)}scale(t,e){const s=new at().scale(t,e);return this.transform(s)}mirrorCenter(t){const e=new at().mirrorCenter(t);return this.transform(e)}mirror(t="x",e){const s=new at;return t==="x"?s.mirrorX():t==="y"?s.mirrorY():s.mirrorLine(t,e),this.transform(s)}}let Xt=class extends $t{constructor(t,e){super(),A(this,"precision",1e-9),this.firstPoint=t,this.lastPoint=e,this.firstPoint=t,this.lastPoint=e}get repr(){return`${this.segmentType} ${H(this.firstPoint)} - ${H(this.lastPoint)}`}get info(){return this.repr}[Symbol.for("nodejs.util.inspect.custom")](){return this.repr}},B=class Ot extends Xt{constructor(){super(...arguments),A(this,"segmentType","LINE"),A(this,"_V",null),A(this,"_slope",null),A(this,"_yIntercept",null),A(this,"_boundingBox",null)}isValidParameter(t){const e=this.length*this.precision;return t>=-e&&1-t>=-e}paramPoint(t){return O(this.firstPoint,G(this.V,t))}get length(){return N(this.firstPoint,this.lastPoint)}get squareLength(){return kt(this.firstPoint,this.lastPoint)}get V(){return this._V===null&&(this._V=q(this.lastPoint,this.firstPoint)),this._V}get slope(){if(this._slope===null){const[t,e]=this.V;this._slope=e/t}return this._slope}get yIntercept(){return this._yIntercept===null&&(this._yIntercept=this.firstPoint[1]-this.slope*this.firstPoint[0]),this._yIntercept}get midPoint(){return O(this.firstPoint,G(this.V,.5))}isSame(t){return t instanceof Ot?y(this.firstPoint,t.firstPoint)&&y(this.lastPoint,t.lastPoint)||y(this.lastPoint,t.firstPoint)&&y(this.firstPoint,t.lastPoint):!1}clone(){return new Ot(this.firstPoint,this.lastPoint)}reverse(){return new Ot(this.lastPoint,this.firstPoint)}get boundingBox(){return this._boundingBox===null&&(this._boundingBox=new Yt(Math.min(this.firstPoint[0],this.lastPoint[0])-this.precision,Math.min(this.firstPoint[1],this.lastPoint[1])-this.precision,Math.max(this.firstPoint[0],this.lastPoint[0])+this.precision,Math.max(this.firstPoint[1],this.lastPoint[1])+this.precision)),this._boundingBox}distanceFrom(t){const e=q(t,this.firstPoint),s=Ae(e,this.V)/this.squareLength;if(s<0)return N(t,this.firstPoint);if(s>1)return N(t,this.lastPoint);const n=this.paramPoint(s);return N(t,n)}isOnSegment(t){if(y(t,this.firstPoint,this.precision))return!0;const e=q(t,this.firstPoint);if(!Ee(this.V,e))return!1;const s=Ae(e,this.V)/this.squareLength;return this.isValidParameter(s)}gradientAt(t){return this.V}tangentAt(t){if(!this.isOnSegment(t))throw new Error("Point is not on segment");return W(this.V)}get normalVector(){return tt(W(this.V))}get tangentAtFirstPoint(){return W(this.V)}get tangentAtLastPoint(){return W(this.V)}splitAt(t){let e;if(Array.isArray(t)&&t.length===0)return[this];Array.isArray(t[0])?e=t:e=[t],e.forEach(l=>{if(!this.isOnSegment(l))throw new Error(`Point ${H(l)} is not on segment ${this.repr}`)});const s=[this.firstPoint,...e,this.lastPoint],n=Pt(s),r=this.lastPoint[0]-this.firstPoint[0];let o=Math.sign(r),h=0;return Math.abs(r)<this.precision&&(o=Math.sign(this.lastPoint[1]-this.firstPoint[1]),h=1),n.sort((l,a)=>o*(l[h]-a[h])),n.flatMap((l,a)=>a===n.length-1?[]:new Ot(l,n[a+1]))}transform(t){return new Ot(t.transform(this.firstPoint),t.transform(this.lastPoint))}};function di(i){return Array.from(Array(i).keys())}function mt(i){const t=Math.min(...i.map(e=>e.length));return di(t).map(e=>i.map(s=>s[e]))}function Ct(i,t=1e-9){return i<0?i+2*Math.PI:i>=2*Math.PI?i%(2*Math.PI):i>2*Math.PI-t?0:i}function te(i,t,e,s=1e-9){let n=t-i;return e&&(n=-n),n<0&&(n+=2*Math.PI),n>2*Math.PI-s?0:n}const ee=(i,t,e)=>{const s=bt(i.V,t.V),n=wt(i.V),r=wt(t.V),o=e?e*e:i.precision*t.precision;if(s*s<n*r*o)return"parallel";const h=q(t.firstPoint,i.firstPoint),l=bt(h,t.V)/s,a=bt(h,i.V)/s;return{intersectionParam1:l,intersectionParam2:a}};function Je(i,t,e=!1,s){const n=ee(i,t,s);if(n==="parallel"){if(!e)return null;if(i.isSame(t))return i;const h=Pt([t.isOnSegment(i.firstPoint)?i.firstPoint:null,t.isOnSegment(i.lastPoint)?i.lastPoint:null,i.isOnSegment(t.firstPoint)?t.firstPoint:null,i.isOnSegment(t.lastPoint)?t.lastPoint:null].filter(l=>l!==null)).sort((l,a)=>l[0]-a[0]);if(h.length===0||h.length===1)return null;if(h.length===2)return new B(h[0],h[1]);throw console.error(h),new Error("Unexpected number of points while intersecting parallel lines")}const{intersectionParam1:r,intersectionParam2:o}=n;return!i.isValidParameter(r)||!t.isValidParameter(o)?null:i.paramPoint(r)}const se=(i,t)=>{const e=q(i,t);return Qe(e)};let L=class Nt extends Xt{constructor(t,e,s,n=!1,{ignoreChecks:r=!1}={}){if(super(t,e),A(this,"segmentType","ARC"),A(this,"center"),A(this,"clockwise"),A(this,"_coefficients",null),A(this,"_angularLength",null),A(this,"_radius",null),A(this,"_firstAngle",null),A(this,"_lastAngle",null),A(this,"_boundingBox",null),this.center=s,this.clockwise=n,!r){if(y(t,e))throw new Error("Invalid arc, cannot be a full circle");if(Math.abs(this.radius-N(this.lastPoint,this.center))>this.precision)throw new Error(`Invalid arc, radius does not match between ${H(t)} and ${H(e)}} (center ${H(s)})`)}}get info(){return`ARC(${H(this.firstPoint)}, ${H(this.lastPoint)}, ${H(this.center)}, ${this.clockwise?"CW":"CCW"})`}get coefficients(){if(this._coefficients===null){const[t,e]=this.center,s=this.radius*this.radius;this._coefficients={x2:1/s,xy:0,y2:1/s,x:-(2*t)/s,y:-(2*e)/s,c:(t*t+e*e-s)/s}}return this._coefficients}isValidParameter(t){return 1-t>=-this.precision&&t>=-this.precision}angleToParam(t){return te(this.firstAngle,Ct(t),this.clockwise)/this.angularLength}get angularLength(){return this._angularLength||(this._angularLength=te(this.firstAngle,this.lastAngle,this.clockwise)),this._angularLength}paramPoint(t){return O(this.center,Mt(this.radius,this.firstAngle+t*this.angularLength*(this.clockwise?-1:1)))}pointToParam(t){const[e,s]=se(t,this.center);if(Math.abs(e-this.radius)>this.precision)throw new Error(`Point ${H(t)} is not on segment ${this.repr}`);const n=this.angleToParam(s);if(!this.isValidParameter(n))throw new Error(`Point ${H(t)} is not on segment ${this.repr}`);return n}get radius(){return this._radius===null&&(this._radius=N(this.firstPoint,this.center)),this._radius}get firstAngle(){if(this._firstAngle===null){const[t,e]=q(this.firstPoint,this.center);this._firstAngle=Ct(Math.atan2(e,t))}return this._firstAngle}get lastAngle(){if(this._lastAngle===null){const[t,e]=q(this.lastPoint,this.center);this._lastAngle=Ct(Math.atan2(e,t))}return this._lastAngle}get length(){return this.radius*this.angularLength}get squareLength(){return this.length*this.length}get midPoint(){return this.paramPoint(.5)}isSame(t){return!(t instanceof Nt)||!y(this.center,t.center)?!1:y(this.firstPoint,t.firstPoint)&&y(this.lastPoint,t.lastPoint)&&this.clockwise===t.clockwise||y(this.lastPoint,t.firstPoint)&&y(this.firstPoint,t.lastPoint)&&this.clockwise===!t.clockwise}clone(){return new Nt(this.firstPoint,this.lastPoint,this.center,this.clockwise)}reverse(){return new Nt(this.lastPoint,this.firstPoint,this.center,!this.clockwise)}get boundingBox(){if(this._boundingBox===null){const t=this.radius+this.precision,e=s=>this.isValidParameter(this.angleToParam(s));this._boundingBox=new Yt(e(Math.PI)?this.center[0]-t:Math.min(this.firstPoint[0],this.lastPoint[0])-this.precision,e(Math.PI*1.5)?this.center[1]-t:Math.min(this.firstPoint[1],this.lastPoint[1])-this.precision,e(0)?this.center[0]+t:Math.max(this.firstPoint[0],this.lastPoint[0])+this.precision,e(Math.PI/2)?this.center[1]+t:Math.max(this.firstPoint[1],this.lastPoint[1])+this.precision)}return this._boundingBox}distanceFrom(t){const[e,s]=se(t,this.center);return this.isValidParameter(this.angleToParam(s))?Math.abs(e-this.radius):Math.sqrt(Math.min(kt(t,this.firstPoint),kt(t,this.lastPoint)))}isOnSegment(t){if(y(t,this.firstPoint)||y(t,this.lastPoint))return!0;const[e,s]=se(t,this.center);if(Math.abs(e-this.radius)>this.precision)return!1;const n=this.angleToParam(s);return this.isValidParameter(n)}gradientAt(t){const e=this.firstAngle+t*this.angularLength*(this.clockwise?-1:1),s=this.radius*this.angularLength,n=-s*Math.sin(e),r=s*Math.cos(e);return this.clockwise?[-n,-r]:[n,r]}tangentAt(t){const[e,s]=se(t,this.center);if(Math.abs(e-this.radius)>this.precision)throw new Error("Point is not on the arc");const n=this.angleToParam(s);if(!this.isValidParameter(n))throw new Error("Point is not on the arc");const r=Mt(1,s);return(this.clockwise?Dt:tt)(W(r))}get tangentAtFirstPoint(){const t=Mt(1,this.firstAngle);return(this.clockwise?Dt:tt)(W(t))}get tangentAtLastPoint(){const t=Mt(1,this.lastAngle);return(this.clockwise?Dt:tt)(W(t))}splitAt(t){let e;if(Array.isArray(t)&&t.length===0)return[this];Array.isArray(t[0])?e=t:e=[t];const s=[0,1,...e.map(o=>this.pointToParam(o))],n=new Map(mt([s,[this.firstPoint,this.lastPoint,...e]]));s.sort((o,h)=>o-h);let r=null;return s.flatMap((o,h)=>{if(h===s.length-1)return[];const l=s[h+1];if(l-o<this.precision)return r===null&&(r=o),[];const a=r===null?o:r,c=new Nt(n.get(a)||this.paramPoint(a),n.get(l)||this.paramPoint(l),this.center,this.clockwise);return r=null,c})}transform(t){return new Nt(t.transform(this.firstPoint),t.transform(this.lastPoint),t.transform(this.center),t.keepsOrientation()?this.clockwise:!this.clockwise)}};function Pi(i,t,e){const s=new B(t,i),n=new B(t,e),r=tt(s.tangentAtFirstPoint),o=tt(n.tangentAtLastPoint),h=ee({firstPoint:s.midPoint,V:r,precision:1e-9},{firstPoint:n.midPoint,V:o,precision:1e-9});if(h==="parallel")throw new Error("Cannot create an arc from three colinear points");const l=bt(q(i,t),q(e,t))>0;return new L(i,e,O(s.midPoint,G(r,h.intersectionParam1)),l,{ignoreChecks:!0})}function Ke(i,t,e){const s=new B(t,i),n=tt(s.tangentAtFirstPoint),r=ee({firstPoint:s.midPoint,V:n,precision:1e-9},{firstPoint:i,V:tt(e),precision:1e-9});if(r==="parallel")throw new Error("Cannot create an arc from three colinear points");const o=O(s.midPoint,G(n,r.intersectionParam1)),h=bt(q(o,i),q(o,O(i,e)))<0;return new L(i,t,o,h,{ignoreChecks:!0})}const ts=1e-21,ie=1.618034;function es(i,t=0,e=1,s=110,n=1e3){let r,o,h,l,a,c,u,f,p,g,w,P,m;for(o=i(t),h=i(e),o<h&&([t,e]=[e,t],[o,h]=[h,o]),m=e+ie*(e-t),l=i(m),a=3,u=0;l<h;){if(f=(e-t)*(h-l),p=(e-m)*(h-o),g=p-f,Math.abs(g)<ts?r=2*ts:r=2*g,w=e-((e-m)*p-(e-t)*f)/r,P=e+s*(m-e),u>n)throw new Error("Too many iterations.");if(u+=1,(w-m)*(e-w)>0){if(c=i(w),a+=1,c<l)return t=e,e=w,o=h,h=c,[t,e,m,o,h,l,a];if(c>h)return m=w,l=c,[t,e,m,o,h,l,a];w=m+ie*(m-e),c=i(w),a+=1}else(w-P)*(P-m)>=0?(w=P,c=i(w),a+=1):(w-P)*(m-w)>0?(c=i(w),a+=1,c<l&&(e=m,m=w,w=m+ie*(m-e),h=l,l=c,c=i(w),a+=1)):(w=m+ie*(m-e),c=i(w),a+=1);t=e,e=m,m=w,o=h,h=l,l=c}return[t,e,m,o,h,l,a]}const ss=.381966,Mi=1e-11;class yi{constructor(t,e=148e-10,s=500){A(this,"xmin"),A(this,"fval"),A(this,"iter"),A(this,"funcalls"),A(this,"brack"),this.func=t,this.tol=e,this.maxiter=s,this.func=t,this.tol=e,this.maxiter=s,this.xmin=1/0,this.fval=1/0,this.iter=0,this.funcalls=0,this.brack=null}setBracket(t=null){this.brack=t}getBracketInfo(){let t,e,s,n,r,o,h;const l=this.func,a=this.brack;if(a===null)[r,o,h,t,e,s,n]=es(l);else if(a.length===2)[r,o,h,t,e,s,n]=es(l,a[0],a[1]);else if(a.length===3){if([r,o,h]=a,r>h&&([h,r]=[r,h]),!(r<o&&o<h))throw new Error("Not a bracketing interval.");if(t=l(r),e=l(o),s=l(h),!(e<t&&e<s))throw new Error("Not a bracketing interval.");n=3}else throw new Error("Bracketing interval must be length 2 or 3 sequence.");return[r,o,h,t,e,s,n]}optimize(){const t=this.func;let[e,s,n,,,,r]=this.getBracketInfo(),o=s,h=s,l=s,a=t(o),c=a,u=a,f,p;e<n?(f=e,p=n):(f=n,p=e);let g=0;r=1;let w=0,P=0,m;for(;w<this.maxiter;){const d=this.tol*Math.abs(o)+Mi,M=2*d,x=.5*(f+p);if(Math.abs(o-x)<M-.5*(p-f))break;if(Math.abs(g)<=d)o>=x?g=f-o:g=p-o,P=ss*g;else{const $=(o-h)*(u-c);let E=(o-l)*(u-a),b=(o-l)*E-(o-h)*$;E=2*(E-$),E>0&&(b=-b),E=Math.abs(E);const T=g;g=P,b>E*(f-o)&&b<E*(p-o)&&Math.abs(b)<Math.abs(.5*E*T)?(P=b*1/E,m=o+P,(m-f<M||p-m<M)&&(x-o>=0?P=d:P=-d)):(o>=x?g=f-o:g=p-o,P=ss*g)}Math.abs(P)<d?P>=0?m=o+d:m=o-d:m=o+P;const v=t(m);r+=1,v>u?(m<o?f=m:p=m,v<=a||h===o?(l=h,h=m,c=a,a=v):(v<=c||l===o||l===h)&&(l=m,c=v)):(m>=o?f=o:p=o,l=h,h=o,o=m,c=a,a=u,u=v),w+=1}this.xmin=o,this.fval=u,this.iter=w,this.funcalls=r}results(){return{argMin:this.xmin,fMin:this.fval,iterations:this.iter,funcCalls:this.funcalls}}run(){return this.optimize(),this.results()}}function is(i,t=1e-8,e=1e3){const s=new yi(i,t,e);return s.setBracket([0,1]),s.run()}const bi=Object.prototype.toString;function lt(i){const t=bi.call(i);return t.endsWith("Array]")&&!t.includes("Big")}function xi(i){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(!lt(i))throw new TypeError("input must be an array");if(i.length===0)throw new TypeError("input must not be empty");var e=t.fromIndex,s=e===void 0?0:e,n=t.toIndex,r=n===void 0?i.length:n;if(s<0||s>=i.length||!Number.isInteger(s))throw new Error("fromIndex must be a positive integer smaller than length");if(r<=s||r>i.length||!Number.isInteger(r))throw new Error("toIndex must be an integer greater than fromIndex and at most equal to length");for(var o=i[s],h=s+1;h<r;h++)i[h]>o&&(o=i[h]);return o}function vi(i){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(!lt(i))throw new TypeError("input must be an array");if(i.length===0)throw new TypeError("input must not be empty");var e=t.fromIndex,s=e===void 0?0:e,n=t.toIndex,r=n===void 0?i.length:n;if(s<0||s>=i.length||!Number.isInteger(s))throw new Error("fromIndex must be a positive integer smaller than length");if(r<=s||r>i.length||!Number.isInteger(r))throw new Error("toIndex must be an integer greater than fromIndex and at most equal to length");for(var o=i[s],h=s+1;h<r;h++)i[h]<o&&(o=i[h]);return o}function ns(i){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(lt(i)){if(i.length===0)throw new TypeError("input must not be empty")}else throw new TypeError("input must be an array");var e;if(t.output!==void 0){if(!lt(t.output))throw new TypeError("output option must be an array if specified");e=t.output}else e=new Array(i.length);var s=vi(i),n=xi(i);if(s===n)throw new RangeError("minimum and maximum input values are equal. Cannot rescale a constant array");var r=t.min,o=r===void 0?t.autoMinMax?s:0:r,h=t.max,l=h===void 0?t.autoMinMax?n:1:h;if(o>=l)throw new RangeError("min option must be smaller than max option");for(var a=(l-o)/(n-s),c=0;c<i.length;c++)e[c]=(i[c]-s)*a+o;return e}const ne=" ".repeat(2),rs=" ".repeat(4);function Ai(){return os(this)}function os(i,t={}){const{maxRows:e=15,maxColumns:s=10,maxNumSize:n=8,padMinus:r="auto"}=t;return`${i.constructor.name} {
2
+ ${ne}[
3
+ ${rs}${Ei(i,e,s,n,r)}
4
+ ${ne}]
5
+ ${ne}rows: ${i.rows}
6
+ ${ne}columns: ${i.columns}
7
+ }`}function Ei(i,t,e,s,n){const{rows:r,columns:o}=i,h=Math.min(r,t),l=Math.min(o,e),a=[];if(n==="auto"){n=!1;t:for(let c=0;c<h;c++)for(let u=0;u<l;u++)if(i.get(c,u)<0){n=!0;break t}}for(let c=0;c<h;c++){let u=[];for(let f=0;f<l;f++)u.push(Si(i.get(c,f),s,n));a.push(`${u.join(" ")}`)}return l!==o&&(a[a.length-1]+=` ... ${o-e} more columns`),h!==r&&a.push(`... ${r-t} more rows`),a.join(`
8
+ ${rs}`)}function Si(i,t,e){return(i>=0&&e?` ${hs(i,t-1)}`:hs(i,t)).padEnd(t)}function hs(i,t){let e=i.toString();if(e.length<=t)return e;let s=i.toFixed(t);if(s.length>t&&(s=i.toFixed(Math.max(0,t-(s.length-t)))),s.length<=t&&!s.startsWith("0.000")&&!s.startsWith("-0.000"))return s;let n=i.toExponential(t);return n.length>t&&(n=i.toExponential(Math.max(0,t-(n.length-t)))),n.slice(0)}function ki(i,t){i.prototype.add=function(e){return typeof e=="number"?this.addS(e):this.addM(e)},i.prototype.addS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)+e);return this},i.prototype.addM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)+e.get(s,n));return this},i.add=function(e,s){return new t(e).add(s)},i.prototype.sub=function(e){return typeof e=="number"?this.subS(e):this.subM(e)},i.prototype.subS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)-e);return this},i.prototype.subM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)-e.get(s,n));return this},i.sub=function(e,s){return new t(e).sub(s)},i.prototype.subtract=i.prototype.sub,i.prototype.subtractS=i.prototype.subS,i.prototype.subtractM=i.prototype.subM,i.subtract=i.sub,i.prototype.mul=function(e){return typeof e=="number"?this.mulS(e):this.mulM(e)},i.prototype.mulS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)*e);return this},i.prototype.mulM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)*e.get(s,n));return this},i.mul=function(e,s){return new t(e).mul(s)},i.prototype.multiply=i.prototype.mul,i.prototype.multiplyS=i.prototype.mulS,i.prototype.multiplyM=i.prototype.mulM,i.multiply=i.mul,i.prototype.div=function(e){return typeof e=="number"?this.divS(e):this.divM(e)},i.prototype.divS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)/e);return this},i.prototype.divM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)/e.get(s,n));return this},i.div=function(e,s){return new t(e).div(s)},i.prototype.divide=i.prototype.div,i.prototype.divideS=i.prototype.divS,i.prototype.divideM=i.prototype.divM,i.divide=i.div,i.prototype.mod=function(e){return typeof e=="number"?this.modS(e):this.modM(e)},i.prototype.modS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)%e);return this},i.prototype.modM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)%e.get(s,n));return this},i.mod=function(e,s){return new t(e).mod(s)},i.prototype.modulus=i.prototype.mod,i.prototype.modulusS=i.prototype.modS,i.prototype.modulusM=i.prototype.modM,i.modulus=i.mod,i.prototype.and=function(e){return typeof e=="number"?this.andS(e):this.andM(e)},i.prototype.andS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)&e);return this},i.prototype.andM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)&e.get(s,n));return this},i.and=function(e,s){return new t(e).and(s)},i.prototype.or=function(e){return typeof e=="number"?this.orS(e):this.orM(e)},i.prototype.orS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)|e);return this},i.prototype.orM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)|e.get(s,n));return this},i.or=function(e,s){return new t(e).or(s)},i.prototype.xor=function(e){return typeof e=="number"?this.xorS(e):this.xorM(e)},i.prototype.xorS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)^e);return this},i.prototype.xorM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)^e.get(s,n));return this},i.xor=function(e,s){return new t(e).xor(s)},i.prototype.leftShift=function(e){return typeof e=="number"?this.leftShiftS(e):this.leftShiftM(e)},i.prototype.leftShiftS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)<<e);return this},i.prototype.leftShiftM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)<<e.get(s,n));return this},i.leftShift=function(e,s){return new t(e).leftShift(s)},i.prototype.signPropagatingRightShift=function(e){return typeof e=="number"?this.signPropagatingRightShiftS(e):this.signPropagatingRightShiftM(e)},i.prototype.signPropagatingRightShiftS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)>>e);return this},i.prototype.signPropagatingRightShiftM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)>>e.get(s,n));return this},i.signPropagatingRightShift=function(e,s){return new t(e).signPropagatingRightShift(s)},i.prototype.rightShift=function(e){return typeof e=="number"?this.rightShiftS(e):this.rightShiftM(e)},i.prototype.rightShiftS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)>>>e);return this},i.prototype.rightShiftM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,this.get(s,n)>>>e.get(s,n));return this},i.rightShift=function(e,s){return new t(e).rightShift(s)},i.prototype.zeroFillRightShift=i.prototype.rightShift,i.prototype.zeroFillRightShiftS=i.prototype.rightShiftS,i.prototype.zeroFillRightShiftM=i.prototype.rightShiftM,i.zeroFillRightShift=i.rightShift,i.prototype.not=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,~this.get(e,s));return this},i.not=function(e){return new t(e).not()},i.prototype.abs=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.abs(this.get(e,s)));return this},i.abs=function(e){return new t(e).abs()},i.prototype.acos=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.acos(this.get(e,s)));return this},i.acos=function(e){return new t(e).acos()},i.prototype.acosh=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.acosh(this.get(e,s)));return this},i.acosh=function(e){return new t(e).acosh()},i.prototype.asin=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.asin(this.get(e,s)));return this},i.asin=function(e){return new t(e).asin()},i.prototype.asinh=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.asinh(this.get(e,s)));return this},i.asinh=function(e){return new t(e).asinh()},i.prototype.atan=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.atan(this.get(e,s)));return this},i.atan=function(e){return new t(e).atan()},i.prototype.atanh=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.atanh(this.get(e,s)));return this},i.atanh=function(e){return new t(e).atanh()},i.prototype.cbrt=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.cbrt(this.get(e,s)));return this},i.cbrt=function(e){return new t(e).cbrt()},i.prototype.ceil=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.ceil(this.get(e,s)));return this},i.ceil=function(e){return new t(e).ceil()},i.prototype.clz32=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.clz32(this.get(e,s)));return this},i.clz32=function(e){return new t(e).clz32()},i.prototype.cos=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.cos(this.get(e,s)));return this},i.cos=function(e){return new t(e).cos()},i.prototype.cosh=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.cosh(this.get(e,s)));return this},i.cosh=function(e){return new t(e).cosh()},i.prototype.exp=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.exp(this.get(e,s)));return this},i.exp=function(e){return new t(e).exp()},i.prototype.expm1=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.expm1(this.get(e,s)));return this},i.expm1=function(e){return new t(e).expm1()},i.prototype.floor=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.floor(this.get(e,s)));return this},i.floor=function(e){return new t(e).floor()},i.prototype.fround=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.fround(this.get(e,s)));return this},i.fround=function(e){return new t(e).fround()},i.prototype.log=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.log(this.get(e,s)));return this},i.log=function(e){return new t(e).log()},i.prototype.log1p=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.log1p(this.get(e,s)));return this},i.log1p=function(e){return new t(e).log1p()},i.prototype.log10=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.log10(this.get(e,s)));return this},i.log10=function(e){return new t(e).log10()},i.prototype.log2=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.log2(this.get(e,s)));return this},i.log2=function(e){return new t(e).log2()},i.prototype.round=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.round(this.get(e,s)));return this},i.round=function(e){return new t(e).round()},i.prototype.sign=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.sign(this.get(e,s)));return this},i.sign=function(e){return new t(e).sign()},i.prototype.sin=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.sin(this.get(e,s)));return this},i.sin=function(e){return new t(e).sin()},i.prototype.sinh=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.sinh(this.get(e,s)));return this},i.sinh=function(e){return new t(e).sinh()},i.prototype.sqrt=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.sqrt(this.get(e,s)));return this},i.sqrt=function(e){return new t(e).sqrt()},i.prototype.tan=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.tan(this.get(e,s)));return this},i.tan=function(e){return new t(e).tan()},i.prototype.tanh=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.tanh(this.get(e,s)));return this},i.tanh=function(e){return new t(e).tanh()},i.prototype.trunc=function(){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,Math.trunc(this.get(e,s)));return this},i.trunc=function(e){return new t(e).trunc()},i.pow=function(e,s){return new t(e).pow(s)},i.prototype.pow=function(e){return typeof e=="number"?this.powS(e):this.powM(e)},i.prototype.powS=function(e){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,Math.pow(this.get(s,n),e));return this},i.prototype.powM=function(e){if(e=t.checkMatrix(e),this.rows!==e.rows||this.columns!==e.columns)throw new RangeError("Matrices dimensions must be equal");for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.set(s,n,Math.pow(this.get(s,n),e.get(s,n)));return this}}function gt(i,t,e){let s=e?i.rows:i.rows-1;if(t<0||t>s)throw new RangeError("Row index out of range")}function pt(i,t,e){let s=e?i.columns:i.columns-1;if(t<0||t>s)throw new RangeError("Column index out of range")}function _t(i,t){if(t.to1DArray&&(t=t.to1DArray()),t.length!==i.columns)throw new RangeError("vector size must be the same as the number of columns");return t}function Lt(i,t){if(t.to1DArray&&(t=t.to1DArray()),t.length!==i.rows)throw new RangeError("vector size must be the same as the number of rows");return t}function $i(i,t){if(!lt(t))throw new TypeError("row indices must be an array");for(let e=0;e<t.length;e++)if(t[e]<0||t[e]>=i.rows)throw new RangeError("row indices are out of range")}function Ci(i,t){if(!lt(t))throw new TypeError("column indices must be an array");for(let e=0;e<t.length;e++)if(t[e]<0||t[e]>=i.columns)throw new RangeError("column indices are out of range")}function as(i,t,e,s,n){if(arguments.length!==5)throw new RangeError("expected 4 arguments");if(oe("startRow",t),oe("endRow",e),oe("startColumn",s),oe("endColumn",n),t>e||s>n||t<0||t>=i.rows||e<0||e>=i.rows||s<0||s>=i.columns||n<0||n>=i.columns)throw new RangeError("Submatrix indices are out of range")}function re(i,t=0){let e=[];for(let s=0;s<i;s++)e.push(t);return e}function oe(i,t){if(typeof t!="number")throw new TypeError(`${i} must be a number`)}function Bt(i){if(i.isEmpty())throw new Error("Empty matrix has no elements to index")}function Ri(i){let t=re(i.rows);for(let e=0;e<i.rows;++e)for(let s=0;s<i.columns;++s)t[e]+=i.get(e,s);return t}function Ti(i){let t=re(i.columns);for(let e=0;e<i.rows;++e)for(let s=0;s<i.columns;++s)t[s]+=i.get(e,s);return t}function Fi(i){let t=0;for(let e=0;e<i.rows;e++)for(let s=0;s<i.columns;s++)t+=i.get(e,s);return t}function Ii(i){let t=re(i.rows,1);for(let e=0;e<i.rows;++e)for(let s=0;s<i.columns;++s)t[e]*=i.get(e,s);return t}function _i(i){let t=re(i.columns,1);for(let e=0;e<i.rows;++e)for(let s=0;s<i.columns;++s)t[s]*=i.get(e,s);return t}function Li(i){let t=1;for(let e=0;e<i.rows;e++)for(let s=0;s<i.columns;s++)t*=i.get(e,s);return t}function Bi(i,t,e){const s=i.rows,n=i.columns,r=[];for(let o=0;o<s;o++){let h=0,l=0,a=0;for(let c=0;c<n;c++)a=i.get(o,c)-e[o],h+=a,l+=a*a;t?r.push((l-h*h/n)/(n-1)):r.push((l-h*h/n)/n)}return r}function ji(i,t,e){const s=i.rows,n=i.columns,r=[];for(let o=0;o<n;o++){let h=0,l=0,a=0;for(let c=0;c<s;c++)a=i.get(c,o)-e[o],h+=a,l+=a*a;t?r.push((l-h*h/s)/(s-1)):r.push((l-h*h/s)/s)}return r}function qi(i,t,e){const s=i.rows,n=i.columns,r=s*n;let o=0,h=0,l=0;for(let a=0;a<s;a++)for(let c=0;c<n;c++)l=i.get(a,c)-e,o+=l,h+=l*l;return t?(h-o*o/r)/(r-1):(h-o*o/r)/r}function Vi(i,t){for(let e=0;e<i.rows;e++)for(let s=0;s<i.columns;s++)i.set(e,s,i.get(e,s)-t[e])}function Oi(i,t){for(let e=0;e<i.rows;e++)for(let s=0;s<i.columns;s++)i.set(e,s,i.get(e,s)-t[s])}function Ni(i,t){for(let e=0;e<i.rows;e++)for(let s=0;s<i.columns;s++)i.set(e,s,i.get(e,s)-t)}function zi(i){const t=[];for(let e=0;e<i.rows;e++){let s=0;for(let n=0;n<i.columns;n++)s+=Math.pow(i.get(e,n),2)/(i.columns-1);t.push(Math.sqrt(s))}return t}function Ui(i,t){for(let e=0;e<i.rows;e++)for(let s=0;s<i.columns;s++)i.set(e,s,i.get(e,s)/t[e])}function Yi(i){const t=[];for(let e=0;e<i.columns;e++){let s=0;for(let n=0;n<i.rows;n++)s+=Math.pow(i.get(n,e),2)/(i.rows-1);t.push(Math.sqrt(s))}return t}function Di(i,t){for(let e=0;e<i.rows;e++)for(let s=0;s<i.columns;s++)i.set(e,s,i.get(e,s)/t[s])}function Xi(i){const t=i.size-1;let e=0;for(let s=0;s<i.columns;s++)for(let n=0;n<i.rows;n++)e+=Math.pow(i.get(n,s),2)/t;return Math.sqrt(e)}function Hi(i,t){for(let e=0;e<i.rows;e++)for(let s=0;s<i.columns;s++)i.set(e,s,i.get(e,s)/t)}let Z=class Q{static from1DArray(t,e,s){if(t*e!==s.length)throw new RangeError("data length does not match given dimensions");let n=new R(t,e);for(let r=0;r<t;r++)for(let o=0;o<e;o++)n.set(r,o,s[r*e+o]);return n}static rowVector(t){let e=new R(1,t.length);for(let s=0;s<t.length;s++)e.set(0,s,t[s]);return e}static columnVector(t){let e=new R(t.length,1);for(let s=0;s<t.length;s++)e.set(s,0,t[s]);return e}static zeros(t,e){return new R(t,e)}static ones(t,e){return new R(t,e).fill(1)}static rand(t,e,s={}){if(typeof s!="object")throw new TypeError("options must be an object");const{random:n=Math.random}=s;let r=new R(t,e);for(let o=0;o<t;o++)for(let h=0;h<e;h++)r.set(o,h,n());return r}static randInt(t,e,s={}){if(typeof s!="object")throw new TypeError("options must be an object");const{min:n=0,max:r=1e3,random:o=Math.random}=s;if(!Number.isInteger(n))throw new TypeError("min must be an integer");if(!Number.isInteger(r))throw new TypeError("max must be an integer");if(n>=r)throw new RangeError("min must be smaller than max");let h=r-n,l=new R(t,e);for(let a=0;a<t;a++)for(let c=0;c<e;c++){let u=n+Math.round(o()*h);l.set(a,c,u)}return l}static eye(t,e,s){e===void 0&&(e=t),s===void 0&&(s=1);let n=Math.min(t,e),r=this.zeros(t,e);for(let o=0;o<n;o++)r.set(o,o,s);return r}static diag(t,e,s){let n=t.length;e===void 0&&(e=n),s===void 0&&(s=e);let r=Math.min(n,e,s),o=this.zeros(e,s);for(let h=0;h<r;h++)o.set(h,h,t[h]);return o}static min(t,e){t=this.checkMatrix(t),e=this.checkMatrix(e);let s=t.rows,n=t.columns,r=new R(s,n);for(let o=0;o<s;o++)for(let h=0;h<n;h++)r.set(o,h,Math.min(t.get(o,h),e.get(o,h)));return r}static max(t,e){t=this.checkMatrix(t),e=this.checkMatrix(e);let s=t.rows,n=t.columns,r=new this(s,n);for(let o=0;o<s;o++)for(let h=0;h<n;h++)r.set(o,h,Math.max(t.get(o,h),e.get(o,h)));return r}static checkMatrix(t){return Q.isMatrix(t)?t:new R(t)}static isMatrix(t){return t!=null&&t.klass==="Matrix"}get size(){return this.rows*this.columns}apply(t){if(typeof t!="function")throw new TypeError("callback must be a function");for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)t.call(this,e,s);return this}to1DArray(){let t=[];for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)t.push(this.get(e,s));return t}to2DArray(){let t=[];for(let e=0;e<this.rows;e++){t.push([]);for(let s=0;s<this.columns;s++)t[e].push(this.get(e,s))}return t}toJSON(){return this.to2DArray()}isRowVector(){return this.rows===1}isColumnVector(){return this.columns===1}isVector(){return this.rows===1||this.columns===1}isSquare(){return this.rows===this.columns}isEmpty(){return this.rows===0||this.columns===0}isSymmetric(){if(this.isSquare()){for(let t=0;t<this.rows;t++)for(let e=0;e<=t;e++)if(this.get(t,e)!==this.get(e,t))return!1;return!0}return!1}isEchelonForm(){let t=0,e=0,s=-1,n=!0,r=!1;for(;t<this.rows&&n;){for(e=0,r=!1;e<this.columns&&r===!1;)this.get(t,e)===0?e++:this.get(t,e)===1&&e>s?(r=!0,s=e):(n=!1,r=!0);t++}return n}isReducedEchelonForm(){let t=0,e=0,s=-1,n=!0,r=!1;for(;t<this.rows&&n;){for(e=0,r=!1;e<this.columns&&r===!1;)this.get(t,e)===0?e++:this.get(t,e)===1&&e>s?(r=!0,s=e):(n=!1,r=!0);for(let o=e+1;o<this.rows;o++)this.get(t,o)!==0&&(n=!1);t++}return n}echelonForm(){let t=this.clone(),e=0,s=0;for(;e<t.rows&&s<t.columns;){let n=e;for(let r=e;r<t.rows;r++)t.get(r,s)>t.get(n,s)&&(n=r);if(t.get(n,s)===0)s++;else{t.swapRows(e,n);let r=t.get(e,s);for(let o=s;o<t.columns;o++)t.set(e,o,t.get(e,o)/r);for(let o=e+1;o<t.rows;o++){let h=t.get(o,s)/t.get(e,s);t.set(o,s,0);for(let l=s+1;l<t.columns;l++)t.set(o,l,t.get(o,l)-t.get(e,l)*h)}e++,s++}}return t}reducedEchelonForm(){let t=this.echelonForm(),e=t.columns,s=t.rows,n=s-1;for(;n>=0;)if(t.maxRow(n)===0)n--;else{let r=0,o=!1;for(;r<s&&o===!1;)t.get(n,r)===1?o=!0:r++;for(let h=0;h<n;h++){let l=t.get(h,r);for(let a=r;a<e;a++){let c=t.get(h,a)-l*t.get(n,a);t.set(h,a,c)}}n--}return t}set(){throw new Error("set method is unimplemented")}get(){throw new Error("get method is unimplemented")}repeat(t={}){if(typeof t!="object")throw new TypeError("options must be an object");const{rows:e=1,columns:s=1}=t;if(!Number.isInteger(e)||e<=0)throw new TypeError("rows must be a positive integer");if(!Number.isInteger(s)||s<=0)throw new TypeError("columns must be a positive integer");let n=new R(this.rows*e,this.columns*s);for(let r=0;r<e;r++)for(let o=0;o<s;o++)n.setSubMatrix(this,this.rows*r,this.columns*o);return n}fill(t){for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,t);return this}neg(){return this.mulS(-1)}getRow(t){gt(this,t);let e=[];for(let s=0;s<this.columns;s++)e.push(this.get(t,s));return e}getRowVector(t){return R.rowVector(this.getRow(t))}setRow(t,e){gt(this,t),e=_t(this,e);for(let s=0;s<this.columns;s++)this.set(t,s,e[s]);return this}swapRows(t,e){gt(this,t),gt(this,e);for(let s=0;s<this.columns;s++){let n=this.get(t,s);this.set(t,s,this.get(e,s)),this.set(e,s,n)}return this}getColumn(t){pt(this,t);let e=[];for(let s=0;s<this.rows;s++)e.push(this.get(s,t));return e}getColumnVector(t){return R.columnVector(this.getColumn(t))}setColumn(t,e){pt(this,t),e=Lt(this,e);for(let s=0;s<this.rows;s++)this.set(s,t,e[s]);return this}swapColumns(t,e){pt(this,t),pt(this,e);for(let s=0;s<this.rows;s++){let n=this.get(s,t);this.set(s,t,this.get(s,e)),this.set(s,e,n)}return this}addRowVector(t){t=_t(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)+t[s]);return this}subRowVector(t){t=_t(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)-t[s]);return this}mulRowVector(t){t=_t(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)*t[s]);return this}divRowVector(t){t=_t(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)/t[s]);return this}addColumnVector(t){t=Lt(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)+t[e]);return this}subColumnVector(t){t=Lt(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)-t[e]);return this}mulColumnVector(t){t=Lt(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)*t[e]);return this}divColumnVector(t){t=Lt(this,t);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)this.set(e,s,this.get(e,s)/t[e]);return this}mulRow(t,e){gt(this,t);for(let s=0;s<this.columns;s++)this.set(t,s,this.get(t,s)*e);return this}mulColumn(t,e){pt(this,t);for(let s=0;s<this.rows;s++)this.set(s,t,this.get(s,t)*e);return this}max(t){if(this.isEmpty())return NaN;switch(t){case"row":{const e=new Array(this.rows).fill(Number.NEGATIVE_INFINITY);for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)>e[s]&&(e[s]=this.get(s,n));return e}case"column":{const e=new Array(this.columns).fill(Number.NEGATIVE_INFINITY);for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)>e[n]&&(e[n]=this.get(s,n));return e}case void 0:{let e=this.get(0,0);for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)>e&&(e=this.get(s,n));return e}default:throw new Error(`invalid option: ${t}`)}}maxIndex(){Bt(this);let t=this.get(0,0),e=[0,0];for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)>t&&(t=this.get(s,n),e[0]=s,e[1]=n);return e}min(t){if(this.isEmpty())return NaN;switch(t){case"row":{const e=new Array(this.rows).fill(Number.POSITIVE_INFINITY);for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)<e[s]&&(e[s]=this.get(s,n));return e}case"column":{const e=new Array(this.columns).fill(Number.POSITIVE_INFINITY);for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)<e[n]&&(e[n]=this.get(s,n));return e}case void 0:{let e=this.get(0,0);for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)<e&&(e=this.get(s,n));return e}default:throw new Error(`invalid option: ${t}`)}}minIndex(){Bt(this);let t=this.get(0,0),e=[0,0];for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)this.get(s,n)<t&&(t=this.get(s,n),e[0]=s,e[1]=n);return e}maxRow(t){if(gt(this,t),this.isEmpty())return NaN;let e=this.get(t,0);for(let s=1;s<this.columns;s++)this.get(t,s)>e&&(e=this.get(t,s));return e}maxRowIndex(t){gt(this,t),Bt(this);let e=this.get(t,0),s=[t,0];for(let n=1;n<this.columns;n++)this.get(t,n)>e&&(e=this.get(t,n),s[1]=n);return s}minRow(t){if(gt(this,t),this.isEmpty())return NaN;let e=this.get(t,0);for(let s=1;s<this.columns;s++)this.get(t,s)<e&&(e=this.get(t,s));return e}minRowIndex(t){gt(this,t),Bt(this);let e=this.get(t,0),s=[t,0];for(let n=1;n<this.columns;n++)this.get(t,n)<e&&(e=this.get(t,n),s[1]=n);return s}maxColumn(t){if(pt(this,t),this.isEmpty())return NaN;let e=this.get(0,t);for(let s=1;s<this.rows;s++)this.get(s,t)>e&&(e=this.get(s,t));return e}maxColumnIndex(t){pt(this,t),Bt(this);let e=this.get(0,t),s=[0,t];for(let n=1;n<this.rows;n++)this.get(n,t)>e&&(e=this.get(n,t),s[0]=n);return s}minColumn(t){if(pt(this,t),this.isEmpty())return NaN;let e=this.get(0,t);for(let s=1;s<this.rows;s++)this.get(s,t)<e&&(e=this.get(s,t));return e}minColumnIndex(t){pt(this,t),Bt(this);let e=this.get(0,t),s=[0,t];for(let n=1;n<this.rows;n++)this.get(n,t)<e&&(e=this.get(n,t),s[0]=n);return s}diag(){let t=Math.min(this.rows,this.columns),e=[];for(let s=0;s<t;s++)e.push(this.get(s,s));return e}norm(t="frobenius"){let e=0;if(t==="max")return this.max();if(t==="frobenius"){for(let s=0;s<this.rows;s++)for(let n=0;n<this.columns;n++)e=e+this.get(s,n)*this.get(s,n);return Math.sqrt(e)}else throw new RangeError(`unknown norm type: ${t}`)}cumulativeSum(){let t=0;for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)t+=this.get(e,s),this.set(e,s,t);return this}dot(t){Q.isMatrix(t)&&(t=t.to1DArray());let e=this.to1DArray();if(e.length!==t.length)throw new RangeError("vectors do not have the same size");let s=0;for(let n=0;n<e.length;n++)s+=e[n]*t[n];return s}mmul(t){t=R.checkMatrix(t);let e=this.rows,s=this.columns,n=t.columns,r=new R(e,n),o=new Float64Array(s);for(let h=0;h<n;h++){for(let l=0;l<s;l++)o[l]=t.get(l,h);for(let l=0;l<e;l++){let a=0;for(let c=0;c<s;c++)a+=this.get(l,c)*o[c];r.set(l,h,a)}}return r}strassen2x2(t){t=R.checkMatrix(t);let e=new R(2,2);const s=this.get(0,0),n=t.get(0,0),r=this.get(0,1),o=t.get(0,1),h=this.get(1,0),l=t.get(1,0),a=this.get(1,1),c=t.get(1,1),u=(s+a)*(n+c),f=(h+a)*n,p=s*(o-c),g=a*(l-n),w=(s+r)*c,P=(h-s)*(n+o),m=(r-a)*(l+c),d=u+g-w+m,M=p+w,x=f+g,v=u-f+p+P;return e.set(0,0,d),e.set(0,1,M),e.set(1,0,x),e.set(1,1,v),e}strassen3x3(t){t=R.checkMatrix(t);let e=new R(3,3);const s=this.get(0,0),n=this.get(0,1),r=this.get(0,2),o=this.get(1,0),h=this.get(1,1),l=this.get(1,2),a=this.get(2,0),c=this.get(2,1),u=this.get(2,2),f=t.get(0,0),p=t.get(0,1),g=t.get(0,2),w=t.get(1,0),P=t.get(1,1),m=t.get(1,2),d=t.get(2,0),M=t.get(2,1),x=t.get(2,2),v=(s+n+r-o-h-c-u)*P,$=(s-o)*(-p+P),E=h*(-f+p+w-P-m-d+x),b=(-s+o+h)*(f-p+P),T=(o+h)*(-f+p),V=s*f,Y=(-s+a+c)*(f-g+m),nt=(-s+a)*(g-m),_=(a+c)*(-f+g),C=(s+n+r-h-l-a-c)*m,k=c*(-f+g+w-P-m-d+M),S=(-r+c+u)*(P+d-M),vt=(r-u)*(P-M),I=r*d,j=(c+u)*(-d+M),F=(-r+h+l)*(m+d-x),z=(r-l)*(m-x),D=(h+l)*(-d+x),U=n*w,rt=l*M,yt=o*g,dt=a*p,At=u*x,Xe=V+I+U,He=v+b+T+V+S+I+j,Ge=V+Y+_+C+I+F+D,We=$+E+b+V+I+F+z,we=$+b+T+V+rt,de=I+F+z+D+yt,Pe=V+Y+nt+k+S+vt+I,Me=S+vt+I+j+dt,ye=V+Y+nt+_+At;return e.set(0,0,Xe),e.set(0,1,He),e.set(0,2,Ge),e.set(1,0,We),e.set(1,1,we),e.set(1,2,de),e.set(2,0,Pe),e.set(2,1,Me),e.set(2,2,ye),e}mmulStrassen(t){t=R.checkMatrix(t);let e=this.clone(),s=e.rows,n=e.columns,r=t.rows,o=t.columns;n!==r&&console.warn(`Multiplying ${s} x ${n} and ${r} x ${o} matrix: dimensions do not match.`);function h(u,f,p){let g=u.rows,w=u.columns;if(g===f&&w===p)return u;{let P=Q.zeros(f,p);return P=P.setSubMatrix(u,0,0),P}}let l=Math.max(s,r),a=Math.max(n,o);e=h(e,l,a),t=h(t,l,a);function c(u,f,p,g){if(p<=512||g<=512)return u.mmul(f);p%2===1&&g%2===1?(u=h(u,p+1,g+1),f=h(f,p+1,g+1)):p%2===1?(u=h(u,p+1,g),f=h(f,p+1,g)):g%2===1&&(u=h(u,p,g+1),f=h(f,p,g+1));let w=parseInt(u.rows/2,10),P=parseInt(u.columns/2,10),m=u.subMatrix(0,w-1,0,P-1),d=f.subMatrix(0,w-1,0,P-1),M=u.subMatrix(0,w-1,P,u.columns-1),x=f.subMatrix(0,w-1,P,f.columns-1),v=u.subMatrix(w,u.rows-1,0,P-1),$=f.subMatrix(w,f.rows-1,0,P-1),E=u.subMatrix(w,u.rows-1,P,u.columns-1),b=f.subMatrix(w,f.rows-1,P,f.columns-1),T=c(Q.add(m,E),Q.add(d,b),w,P),V=c(Q.add(v,E),d,w,P),Y=c(m,Q.sub(x,b),w,P),nt=c(E,Q.sub($,d),w,P),_=c(Q.add(m,M),b,w,P),C=c(Q.sub(v,m),Q.add(d,x),w,P),k=c(Q.sub(M,E),Q.add($,b),w,P),S=Q.add(T,nt);S.sub(_),S.add(k);let vt=Q.add(Y,_),I=Q.add(V,nt),j=Q.sub(T,V);j.add(Y),j.add(C);let F=Q.zeros(2*S.rows,2*S.columns);return F=F.setSubMatrix(S,0,0),F=F.setSubMatrix(vt,S.rows,0),F=F.setSubMatrix(I,0,S.columns),F=F.setSubMatrix(j,S.rows,S.columns),F.subMatrix(0,p-1,0,g-1)}return c(e,t,l,a)}scaleRows(t={}){if(typeof t!="object")throw new TypeError("options must be an object");const{min:e=0,max:s=1}=t;if(!Number.isFinite(e))throw new TypeError("min must be a number");if(!Number.isFinite(s))throw new TypeError("max must be a number");if(e>=s)throw new RangeError("min must be smaller than max");let n=new R(this.rows,this.columns);for(let r=0;r<this.rows;r++){const o=this.getRow(r);o.length>0&&ns(o,{min:e,max:s,output:o}),n.setRow(r,o)}return n}scaleColumns(t={}){if(typeof t!="object")throw new TypeError("options must be an object");const{min:e=0,max:s=1}=t;if(!Number.isFinite(e))throw new TypeError("min must be a number");if(!Number.isFinite(s))throw new TypeError("max must be a number");if(e>=s)throw new RangeError("min must be smaller than max");let n=new R(this.rows,this.columns);for(let r=0;r<this.columns;r++){const o=this.getColumn(r);o.length&&ns(o,{min:e,max:s,output:o}),n.setColumn(r,o)}return n}flipRows(){const t=Math.ceil(this.columns/2);for(let e=0;e<this.rows;e++)for(let s=0;s<t;s++){let n=this.get(e,s),r=this.get(e,this.columns-1-s);this.set(e,s,r),this.set(e,this.columns-1-s,n)}return this}flipColumns(){const t=Math.ceil(this.rows/2);for(let e=0;e<this.columns;e++)for(let s=0;s<t;s++){let n=this.get(s,e),r=this.get(this.rows-1-s,e);this.set(s,e,r),this.set(this.rows-1-s,e,n)}return this}kroneckerProduct(t){t=R.checkMatrix(t);let e=this.rows,s=this.columns,n=t.rows,r=t.columns,o=new R(e*n,s*r);for(let h=0;h<e;h++)for(let l=0;l<s;l++)for(let a=0;a<n;a++)for(let c=0;c<r;c++)o.set(n*h+a,r*l+c,this.get(h,l)*t.get(a,c));return o}kroneckerSum(t){if(t=R.checkMatrix(t),!this.isSquare()||!t.isSquare())throw new Error("Kronecker Sum needs two Square Matrices");let e=this.rows,s=t.rows,n=this.kroneckerProduct(R.eye(s,s)),r=R.eye(e,e).kroneckerProduct(t);return n.add(r)}transpose(){let t=new R(this.columns,this.rows);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)t.set(s,e,this.get(e,s));return t}sortRows(t=ls){for(let e=0;e<this.rows;e++)this.setRow(e,this.getRow(e).sort(t));return this}sortColumns(t=ls){for(let e=0;e<this.columns;e++)this.setColumn(e,this.getColumn(e).sort(t));return this}subMatrix(t,e,s,n){as(this,t,e,s,n);let r=new R(e-t+1,n-s+1);for(let o=t;o<=e;o++)for(let h=s;h<=n;h++)r.set(o-t,h-s,this.get(o,h));return r}subMatrixRow(t,e,s){if(e===void 0&&(e=0),s===void 0&&(s=this.columns-1),e>s||e<0||e>=this.columns||s<0||s>=this.columns)throw new RangeError("Argument out of range");let n=new R(t.length,s-e+1);for(let r=0;r<t.length;r++)for(let o=e;o<=s;o++){if(t[r]<0||t[r]>=this.rows)throw new RangeError(`Row index out of range: ${t[r]}`);n.set(r,o-e,this.get(t[r],o))}return n}subMatrixColumn(t,e,s){if(e===void 0&&(e=0),s===void 0&&(s=this.rows-1),e>s||e<0||e>=this.rows||s<0||s>=this.rows)throw new RangeError("Argument out of range");let n=new R(s-e+1,t.length);for(let r=0;r<t.length;r++)for(let o=e;o<=s;o++){if(t[r]<0||t[r]>=this.columns)throw new RangeError(`Column index out of range: ${t[r]}`);n.set(o-e,r,this.get(o,t[r]))}return n}setSubMatrix(t,e,s){if(t=R.checkMatrix(t),t.isEmpty())return this;let n=e+t.rows-1,r=s+t.columns-1;as(this,e,n,s,r);for(let o=0;o<t.rows;o++)for(let h=0;h<t.columns;h++)this.set(e+o,s+h,t.get(o,h));return this}selection(t,e){$i(this,t),Ci(this,e);let s=new R(t.length,e.length);for(let n=0;n<t.length;n++){let r=t[n];for(let o=0;o<e.length;o++){let h=e[o];s.set(n,o,this.get(r,h))}}return s}trace(){let t=Math.min(this.rows,this.columns),e=0;for(let s=0;s<t;s++)e+=this.get(s,s);return e}clone(){let t=new R(this.rows,this.columns);for(let e=0;e<this.rows;e++)for(let s=0;s<this.columns;s++)t.set(e,s,this.get(e,s));return t}sum(t){switch(t){case"row":return Ri(this);case"column":return Ti(this);case void 0:return Fi(this);default:throw new Error(`invalid option: ${t}`)}}product(t){switch(t){case"row":return Ii(this);case"column":return _i(this);case void 0:return Li(this);default:throw new Error(`invalid option: ${t}`)}}mean(t){const e=this.sum(t);switch(t){case"row":{for(let s=0;s<this.rows;s++)e[s]/=this.columns;return e}case"column":{for(let s=0;s<this.columns;s++)e[s]/=this.rows;return e}case void 0:return e/this.size;default:throw new Error(`invalid option: ${t}`)}}variance(t,e={}){if(typeof t=="object"&&(e=t,t=void 0),typeof e!="object")throw new TypeError("options must be an object");const{unbiased:s=!0,mean:n=this.mean(t)}=e;if(typeof s!="boolean")throw new TypeError("unbiased must be a boolean");switch(t){case"row":{if(!lt(n))throw new TypeError("mean must be an array");return Bi(this,s,n)}case"column":{if(!lt(n))throw new TypeError("mean must be an array");return ji(this,s,n)}case void 0:{if(typeof n!="number")throw new TypeError("mean must be a number");return qi(this,s,n)}default:throw new Error(`invalid option: ${t}`)}}standardDeviation(t,e){typeof t=="object"&&(e=t,t=void 0);const s=this.variance(t,e);if(t===void 0)return Math.sqrt(s);for(let n=0;n<s.length;n++)s[n]=Math.sqrt(s[n]);return s}center(t,e={}){if(typeof t=="object"&&(e=t,t=void 0),typeof e!="object")throw new TypeError("options must be an object");const{center:s=this.mean(t)}=e;switch(t){case"row":{if(!lt(s))throw new TypeError("center must be an array");return Vi(this,s),this}case"column":{if(!lt(s))throw new TypeError("center must be an array");return Oi(this,s),this}case void 0:{if(typeof s!="number")throw new TypeError("center must be a number");return Ni(this,s),this}default:throw new Error(`invalid option: ${t}`)}}scale(t,e={}){if(typeof t=="object"&&(e=t,t=void 0),typeof e!="object")throw new TypeError("options must be an object");let s=e.scale;switch(t){case"row":{if(s===void 0)s=zi(this);else if(!lt(s))throw new TypeError("scale must be an array");return Ui(this,s),this}case"column":{if(s===void 0)s=Yi(this);else if(!lt(s))throw new TypeError("scale must be an array");return Di(this,s),this}case void 0:{if(s===void 0)s=Xi(this);else if(typeof s!="number")throw new TypeError("scale must be a number");return Hi(this,s),this}default:throw new Error(`invalid option: ${t}`)}}toString(t){return os(this,t)}};Z.prototype.klass="Matrix",typeof Symbol<"u"&&(Z.prototype[Symbol.for("nodejs.util.inspect.custom")]=Ai);function ls(i,t){return i-t}function Gi(i){return i.every(t=>typeof t=="number")}Z.random=Z.rand,Z.randomInt=Z.randInt,Z.diagonal=Z.diag,Z.prototype.diagonal=Z.prototype.diag,Z.identity=Z.eye,Z.prototype.negate=Z.prototype.neg,Z.prototype.tensorProduct=Z.prototype.kroneckerProduct;let R=class ci extends Z{constructor(t,e){if(super(),ci.isMatrix(t))return t.clone();if(Number.isInteger(t)&&t>=0)if(this.data=[],Number.isInteger(e)&&e>=0)for(let s=0;s<t;s++)this.data.push(new Float64Array(e));else throw new TypeError("nColumns must be a positive integer");else if(lt(t)){const s=t;if(t=s.length,e=t?s[0].length:0,typeof e!="number")throw new TypeError("Data must be a 2D array with at least one element");this.data=[];for(let n=0;n<t;n++){if(s[n].length!==e)throw new RangeError("Inconsistent array dimensions");if(!Gi(s[n]))throw new TypeError("Input data contains non-numeric values");this.data.push(Float64Array.from(s[n]))}}else throw new TypeError("First argument must be a positive number or an array");this.rows=t,this.columns=e}set(t,e,s){return this.data[t][e]=s,this}get(t,e){return this.data[t][e]}removeRow(t){return gt(this,t),this.data.splice(t,1),this.rows-=1,this}addRow(t,e){return e===void 0&&(e=t,t=this.rows),gt(this,t,!0),e=Float64Array.from(_t(this,e)),this.data.splice(t,0,e),this.rows+=1,this}removeColumn(t){pt(this,t);for(let e=0;e<this.rows;e++){const s=new Float64Array(this.columns-1);for(let n=0;n<t;n++)s[n]=this.data[e][n];for(let n=t+1;n<this.columns;n++)s[n-1]=this.data[e][n];this.data[e]=s}return this.columns-=1,this}addColumn(t,e){typeof e>"u"&&(e=t,t=this.columns),pt(this,t,!0),e=Lt(this,e);for(let s=0;s<this.rows;s++){const n=new Float64Array(this.columns+1);let r=0;for(;r<t;r++)n[r]=this.data[s][r];for(n[r++]=e[s];r<this.columns+1;r++)n[r]=this.data[s][r-1];this.data[s]=n}return this.columns+=1,this}};ki(Z,R);class Wi extends Z{constructor(t){super(),this.data=t,this.rows=t.length,this.columns=t[0].length}set(t,e,s){return this.data[t][e]=s,this}get(t,e){return this.data[t][e]}}function us(i,t){let e=0;return Math.abs(i)>Math.abs(t)?(e=t/i,Math.abs(i)*Math.sqrt(1+e*e)):t!==0?(e=i/t,Math.abs(t)*Math.sqrt(1+e*e)):0}class Zi{constructor(t,e={}){const{assumeSymmetric:s=!1}=e;if(t=Wi.checkMatrix(t),!t.isSquare())throw new Error("Matrix is not a square matrix");if(t.isEmpty())throw new Error("Matrix must be non-empty");let n=t.columns,r=new R(n,n),o=new Float64Array(n),h=new Float64Array(n),l=t,a,c,u=!1;if(s?u=!0:u=t.isSymmetric(),u){for(a=0;a<n;a++)for(c=0;c<n;c++)r.set(a,c,l.get(a,c));Qi(n,h,o,r),Ji(n,h,o,r)}else{let f=new R(n,n),p=new Float64Array(n);for(c=0;c<n;c++)for(a=0;a<n;a++)f.set(a,c,l.get(a,c));Ki(n,f,p,r),tn(n,h,o,r,f)}this.n=n,this.e=h,this.d=o,this.V=r}get realEigenvalues(){return Array.from(this.d)}get imaginaryEigenvalues(){return Array.from(this.e)}get eigenvectorMatrix(){return this.V}get diagonalMatrix(){let t=this.n,e=this.e,s=this.d,n=new R(t,t),r,o;for(r=0;r<t;r++){for(o=0;o<t;o++)n.set(r,o,0);n.set(r,r,s[r]),e[r]>0?n.set(r,r+1,e[r]):e[r]<0&&n.set(r,r-1,e[r])}return n}}function Qi(i,t,e,s){let n,r,o,h,l,a,c,u;for(l=0;l<i;l++)e[l]=s.get(i-1,l);for(h=i-1;h>0;h--){for(u=0,o=0,a=0;a<h;a++)u=u+Math.abs(e[a]);if(u===0)for(t[h]=e[h-1],l=0;l<h;l++)e[l]=s.get(h-1,l),s.set(h,l,0),s.set(l,h,0);else{for(a=0;a<h;a++)e[a]/=u,o+=e[a]*e[a];for(n=e[h-1],r=Math.sqrt(o),n>0&&(r=-r),t[h]=u*r,o=o-n*r,e[h-1]=n-r,l=0;l<h;l++)t[l]=0;for(l=0;l<h;l++){for(n=e[l],s.set(l,h,n),r=t[l]+s.get(l,l)*n,a=l+1;a<=h-1;a++)r+=s.get(a,l)*e[a],t[a]+=s.get(a,l)*n;t[l]=r}for(n=0,l=0;l<h;l++)t[l]/=o,n+=t[l]*e[l];for(c=n/(o+o),l=0;l<h;l++)t[l]-=c*e[l];for(l=0;l<h;l++){for(n=e[l],r=t[l],a=l;a<=h-1;a++)s.set(a,l,s.get(a,l)-(n*t[a]+r*e[a]));e[l]=s.get(h-1,l),s.set(h,l,0)}}e[h]=o}for(h=0;h<i-1;h++){if(s.set(i-1,h,s.get(h,h)),s.set(h,h,1),o=e[h+1],o!==0){for(a=0;a<=h;a++)e[a]=s.get(a,h+1)/o;for(l=0;l<=h;l++){for(r=0,a=0;a<=h;a++)r+=s.get(a,h+1)*s.get(a,l);for(a=0;a<=h;a++)s.set(a,l,s.get(a,l)-r*e[a])}}for(a=0;a<=h;a++)s.set(a,h+1,0)}for(l=0;l<i;l++)e[l]=s.get(i-1,l),s.set(i-1,l,0);s.set(i-1,i-1,1),t[0]=0}function Ji(i,t,e,s){let n,r,o,h,l,a,c,u,f,p,g,w,P,m,d,M;for(o=1;o<i;o++)t[o-1]=t[o];t[i-1]=0;let x=0,v=0,$=Number.EPSILON;for(a=0;a<i;a++){for(v=Math.max(v,Math.abs(e[a])+Math.abs(t[a])),c=a;c<i&&!(Math.abs(t[c])<=$*v);)c++;if(c>a)do{for(n=e[a],u=(e[a+1]-n)/(2*t[a]),f=us(u,1),u<0&&(f=-f),e[a]=t[a]/(u+f),e[a+1]=t[a]*(u+f),p=e[a+1],r=n-e[a],o=a+2;o<i;o++)e[o]-=r;for(x=x+r,u=e[c],g=1,w=g,P=g,m=t[a+1],d=0,M=0,o=c-1;o>=a;o--)for(P=w,w=g,M=d,n=g*t[o],r=g*u,f=us(u,t[o]),t[o+1]=d*f,d=t[o]/f,g=u/f,u=g*e[o]-d*n,e[o+1]=r+d*(g*n+d*e[o]),l=0;l<i;l++)r=s.get(l,o+1),s.set(l,o+1,d*s.get(l,o)+g*r),s.set(l,o,g*s.get(l,o)-d*r);u=-d*M*P*m*t[a]/p,t[a]=d*u,e[a]=g*u}while(Math.abs(t[a])>$*v);e[a]=e[a]+x,t[a]=0}for(o=0;o<i-1;o++){for(l=o,u=e[o],h=o+1;h<i;h++)e[h]<u&&(l=h,u=e[h]);if(l!==o)for(e[l]=e[o],e[o]=u,h=0;h<i;h++)u=s.get(h,o),s.set(h,o,s.get(h,l)),s.set(h,l,u)}}function Ki(i,t,e,s){let n=0,r=i-1,o,h,l,a,c,u,f;for(u=n+1;u<=r-1;u++){for(f=0,a=u;a<=r;a++)f=f+Math.abs(t.get(a,u-1));if(f!==0){for(l=0,a=r;a>=u;a--)e[a]=t.get(a,u-1)/f,l+=e[a]*e[a];for(h=Math.sqrt(l),e[u]>0&&(h=-h),l=l-e[u]*h,e[u]=e[u]-h,c=u;c<i;c++){for(o=0,a=r;a>=u;a--)o+=e[a]*t.get(a,c);for(o=o/l,a=u;a<=r;a++)t.set(a,c,t.get(a,c)-o*e[a])}for(a=0;a<=r;a++){for(o=0,c=r;c>=u;c--)o+=e[c]*t.get(a,c);for(o=o/l,c=u;c<=r;c++)t.set(a,c,t.get(a,c)-o*e[c])}e[u]=f*e[u],t.set(u,u-1,f*h)}}for(a=0;a<i;a++)for(c=0;c<i;c++)s.set(a,c,a===c?1:0);for(u=r-1;u>=n+1;u--)if(t.get(u,u-1)!==0){for(a=u+1;a<=r;a++)e[a]=t.get(a,u-1);for(c=u;c<=r;c++){for(h=0,a=u;a<=r;a++)h+=e[a]*s.get(a,c);for(h=h/e[u]/t.get(u,u-1),a=u;a<=r;a++)s.set(a,c,s.get(a,c)+h*e[a])}}}function tn(i,t,e,s,n){let r=i-1,o=0,h=i-1,l=Number.EPSILON,a=0,c=0,u=0,f=0,p=0,g=0,w=0,P=0,m,d,M,x,v,$,E,b,T,V,Y,nt,_,C,k;for(m=0;m<i;m++)for((m<o||m>h)&&(e[m]=n.get(m,m),t[m]=0),d=Math.max(m-1,0);d<i;d++)c=c+Math.abs(n.get(m,d));for(;r>=o;){for(x=r;x>o&&(g=Math.abs(n.get(x-1,x-1))+Math.abs(n.get(x,x)),g===0&&(g=c),!(Math.abs(n.get(x,x-1))<l*g));)x--;if(x===r)n.set(r,r,n.get(r,r)+a),e[r]=n.get(r,r),t[r]=0,r--,P=0;else if(x===r-1){if(E=n.get(r,r-1)*n.get(r-1,r),u=(n.get(r-1,r-1)-n.get(r,r))/2,f=u*u+E,w=Math.sqrt(Math.abs(f)),n.set(r,r,n.get(r,r)+a),n.set(r-1,r-1,n.get(r-1,r-1)+a),b=n.get(r,r),f>=0){for(w=u>=0?u+w:u-w,e[r-1]=b+w,e[r]=e[r-1],w!==0&&(e[r]=b-E/w),t[r-1]=0,t[r]=0,b=n.get(r,r-1),g=Math.abs(b)+Math.abs(w),u=b/g,f=w/g,p=Math.sqrt(u*u+f*f),u=u/p,f=f/p,d=r-1;d<i;d++)w=n.get(r-1,d),n.set(r-1,d,f*w+u*n.get(r,d)),n.set(r,d,f*n.get(r,d)-u*w);for(m=0;m<=r;m++)w=n.get(m,r-1),n.set(m,r-1,f*w+u*n.get(m,r)),n.set(m,r,f*n.get(m,r)-u*w);for(m=o;m<=h;m++)w=s.get(m,r-1),s.set(m,r-1,f*w+u*s.get(m,r)),s.set(m,r,f*s.get(m,r)-u*w)}else e[r-1]=b+u,e[r]=b+u,t[r-1]=w,t[r]=-w;r=r-2,P=0}else{if(b=n.get(r,r),T=0,E=0,x<r&&(T=n.get(r-1,r-1),E=n.get(r,r-1)*n.get(r-1,r)),P===10){for(a+=b,m=o;m<=r;m++)n.set(m,m,n.get(m,m)-b);g=Math.abs(n.get(r,r-1))+Math.abs(n.get(r-1,r-2)),b=T=.75*g,E=-.4375*g*g}if(P===30&&(g=(T-b)/2,g=g*g+E,g>0)){for(g=Math.sqrt(g),T<b&&(g=-g),g=b-E/((T-b)/2+g),m=o;m<=r;m++)n.set(m,m,n.get(m,m)-g);a+=g,b=T=E=.964}for(P=P+1,v=r-2;v>=x&&(w=n.get(v,v),p=b-w,g=T-w,u=(p*g-E)/n.get(v+1,v)+n.get(v,v+1),f=n.get(v+1,v+1)-w-p-g,p=n.get(v+2,v+1),g=Math.abs(u)+Math.abs(f)+Math.abs(p),u=u/g,f=f/g,p=p/g,!(v===x||Math.abs(n.get(v,v-1))*(Math.abs(f)+Math.abs(p))<l*(Math.abs(u)*(Math.abs(n.get(v-1,v-1))+Math.abs(w)+Math.abs(n.get(v+1,v+1))))));)v--;for(m=v+2;m<=r;m++)n.set(m,m-2,0),m>v+2&&n.set(m,m-3,0);for(M=v;M<=r-1&&(C=M!==r-1,M!==v&&(u=n.get(M,M-1),f=n.get(M+1,M-1),p=C?n.get(M+2,M-1):0,b=Math.abs(u)+Math.abs(f)+Math.abs(p),b!==0&&(u=u/b,f=f/b,p=p/b)),b!==0);M++)if(g=Math.sqrt(u*u+f*f+p*p),u<0&&(g=-g),g!==0){for(M!==v?n.set(M,M-1,-g*b):x!==v&&n.set(M,M-1,-n.get(M,M-1)),u=u+g,b=u/g,T=f/g,w=p/g,f=f/u,p=p/u,d=M;d<i;d++)u=n.get(M,d)+f*n.get(M+1,d),C&&(u=u+p*n.get(M+2,d),n.set(M+2,d,n.get(M+2,d)-u*w)),n.set(M,d,n.get(M,d)-u*b),n.set(M+1,d,n.get(M+1,d)-u*T);for(m=0;m<=Math.min(r,M+3);m++)u=b*n.get(m,M)+T*n.get(m,M+1),C&&(u=u+w*n.get(m,M+2),n.set(m,M+2,n.get(m,M+2)-u*p)),n.set(m,M,n.get(m,M)-u),n.set(m,M+1,n.get(m,M+1)-u*f);for(m=o;m<=h;m++)u=b*s.get(m,M)+T*s.get(m,M+1),C&&(u=u+w*s.get(m,M+2),s.set(m,M+2,s.get(m,M+2)-u*p)),s.set(m,M,s.get(m,M)-u),s.set(m,M+1,s.get(m,M+1)-u*f)}}}if(c!==0){for(r=i-1;r>=0;r--)if(u=e[r],f=t[r],f===0)for(x=r,n.set(r,r,1),m=r-1;m>=0;m--){for(E=n.get(m,m)-u,p=0,d=x;d<=r;d++)p=p+n.get(m,d)*n.get(d,r);if(t[m]<0)w=E,g=p;else if(x=m,t[m]===0?n.set(m,r,E!==0?-p/E:-p/(l*c)):(b=n.get(m,m+1),T=n.get(m+1,m),f=(e[m]-u)*(e[m]-u)+t[m]*t[m],$=(b*g-w*p)/f,n.set(m,r,$),n.set(m+1,r,Math.abs(b)>Math.abs(w)?(-p-E*$)/b:(-g-T*$)/w)),$=Math.abs(n.get(m,r)),l*$*$>1)for(d=m;d<=r;d++)n.set(d,r,n.get(d,r)/$)}else if(f<0)for(x=r-1,Math.abs(n.get(r,r-1))>Math.abs(n.get(r-1,r))?(n.set(r-1,r-1,f/n.get(r,r-1)),n.set(r-1,r,-(n.get(r,r)-u)/n.get(r,r-1))):(k=he(0,-n.get(r-1,r),n.get(r-1,r-1)-u,f),n.set(r-1,r-1,k[0]),n.set(r-1,r,k[1])),n.set(r,r-1,0),n.set(r,r,1),m=r-2;m>=0;m--){for(V=0,Y=0,d=x;d<=r;d++)V=V+n.get(m,d)*n.get(d,r-1),Y=Y+n.get(m,d)*n.get(d,r);if(E=n.get(m,m)-u,t[m]<0)w=E,p=V,g=Y;else if(x=m,t[m]===0?(k=he(-V,-Y,E,f),n.set(m,r-1,k[0]),n.set(m,r,k[1])):(b=n.get(m,m+1),T=n.get(m+1,m),nt=(e[m]-u)*(e[m]-u)+t[m]*t[m]-f*f,_=(e[m]-u)*2*f,nt===0&&_===0&&(nt=l*c*(Math.abs(E)+Math.abs(f)+Math.abs(b)+Math.abs(T)+Math.abs(w))),k=he(b*p-w*V+f*Y,b*g-w*Y-f*V,nt,_),n.set(m,r-1,k[0]),n.set(m,r,k[1]),Math.abs(b)>Math.abs(w)+Math.abs(f)?(n.set(m+1,r-1,(-V-E*n.get(m,r-1)+f*n.get(m,r))/b),n.set(m+1,r,(-Y-E*n.get(m,r)-f*n.get(m,r-1))/b)):(k=he(-p-T*n.get(m,r-1),-g-T*n.get(m,r),w,f),n.set(m+1,r-1,k[0]),n.set(m+1,r,k[1]))),$=Math.max(Math.abs(n.get(m,r-1)),Math.abs(n.get(m,r))),l*$*$>1)for(d=m;d<=r;d++)n.set(d,r-1,n.get(d,r-1)/$),n.set(d,r,n.get(d,r)/$)}for(m=0;m<i;m++)if(m<o||m>h)for(d=m;d<i;d++)s.set(m,d,n.get(m,d));for(d=i-1;d>=o;d--)for(m=o;m<=h;m++){for(w=0,M=o;M<=Math.min(d,h);M++)w=w+s.get(m,M)*n.get(M,d);s.set(m,d,w)}}}function he(i,t,e,s){let n,r;return Math.abs(e)>Math.abs(s)?(n=s/e,r=e+n*s,[(i+n*t)/r,(t-n*i)/r]):(n=e/s,r=s+n*e,[(n*i+t)/r,(n*t-i)/r])}function ae(i,t,e){const s=i/e,n=t/e;if(!(isFinite(s)&&isFinite(n))){const l=-i/t;return isFinite(l)?[l]:i==0&&t==0?[0]:[]}const r=n*n-4*s;let o=0;if(isFinite(r)){if(r<0)return[];if(r==0)return[-.5*n];o=-.5*(n+jt(Math.sqrt(r),n))}else o=-n;const h=s/o;return isFinite(h)?h>o?[o,h]:[h,o]:[o]}function cs(i,t,e,s){const n=e/(3*s),r=t/(3*s),o=i/s;if(!(isFinite(o)&&isFinite(r)&&isFinite(n)))return ae(i,t,e);const h=-n*n+r,l=-r*n+o,a=n*o-r*r,c=4*h*a-l*l,u=-2*n*h+l;if(c<0){const f=Math.sqrt(-.25*c),p=-.5*u;return[Math.cbrt(p+f)+Math.cbrt(p-f)-n]}else if(c==0){const f=jt(Math.sqrt(-h),u);return[f-n,-2*f-n]}else{const f=Math.atan2(Math.sqrt(c),-u)/3,p=Math.cos(f),g=Math.sin(f)*Math.sqrt(3),w=.5*(-p+g),P=.5*(-p-g),m=2*Math.sqrt(-h);return[m*p-n,m*w-n,m*P-n]}}function en(i,t,e,s,n){if(n==0)return cs(i,t,e,s);const r=s/n,o=e/n,h=t/n,l=i/n;let a=fs(r,o,h,l,!1);if(a!==null)return a;const c=716e74;for(let u=0;u<2;u++)if(a=fs(r/c,o/(c*c),h/(c*c*c),l/(c*c*c*c),u!=0),a!==null){for(let f=0;f<a.length;f++)a[f]*=c;return a}return[]}function Rt(i,t){return t==0?Math.abs(i):Math.abs((i-t)/t)}function fs(i,t,e,s,n){const r=sn(i,t,e,s,n);if(r!==null&&r.length==4){let o=[];for(let h=0;h<2;h++){const l=r[h*2],a=r[h*2+1];o=o.concat(ae(a,l,1))}return o}return null}function sn(i,t,e,s,n){function r(I,j,F,z){const D=Rt(I+F,i),U=Rt(j+I*F+z,t),rt=Rt(j*F+I*z,e);return D+U+rt}function o(I,j,F,z){return r(I,j,F,z)+Rt(j*z,s)}const h=9*i*i-24*t,l=h>=0?-2*t/(3*i+jt(Math.sqrt(h),i)):-.25*i,a=i+4*l,c=t+3*l*(i+2*l),u=e+l*(2*t+l*(3*i+4*l)),f=s+l*(e+l*(t+l*(i+l)));let p=0,g=0;const w=349e100;if(n){const I=a/w,j=c/w,F=u/w,z=f/w;p=I*F-4/w*z-1/3*j*j,g=(I*F-8/w*z-2/9*j*j)*(1/3)*j-F*(F/w)-I*I*z}else p=a*u-4*f-1/3*c*c,g=(a*u+8*f-2/9*c*c)*(1/3)*c-u*u-a*a*f;if(!isFinite(p)&&isFinite(g))return null;let P=nn(p,g);n&&(P*=w);const m=i*.5,d=1/6*t+.5*P,M=e-i*d,x=2/3*t-P-m*m,v=.5*M/x,$=2*(s-d*d)/M,E=.5*M/$;let b=0,T=0,V=0;for(let I=0;I<3;I++){const j=I==1?E:x,F=I==0?v:$,z=Rt(j+m*m+2*d,t),D=Rt(2*(j*F+m*d),e),U=Rt(j*F*F+d*d,s),rt=z+D+U;(I==0||rt<V)&&(b=j,T=F,V=rt)}const Y=b,nt=T;let _=0,C=0,k=0,S=0;if(Y<0){const I=Math.sqrt(-Y);if(_=m+I,C=d+I*nt,k=m-I,S=d-I*nt,Math.abs(S)<Math.abs(C)?S=s/C:Math.abs(S)>Math.abs(C)&&(C=s/S),Math.abs(_)!=Math.abs(k)){let j=null,F=null;if(Math.abs(_)<Math.abs(k)){const D=(e-C*k)/S,U=(t-S-C)/k;j=[i-k,D,U],F=[k,k,k]}else{const D=(e-_*S)/C,U=(t-S-C)/_,rt=i-_;j=[_,_,_],F=[rt,D,U]}let z=0;for(let D=0;D<3;D++){const U=j[D],rt=F[D];if(isFinite(U)&&isFinite(rt)){const yt=r(U,C,rt,S);(D==0||yt<z)&&(_=U,k=rt,z=yt)}}}}else if(Y==0){const I=s-d*d;_=m,C=d+Math.sqrt(-I),k=m,S=d-Math.sqrt(-I),Math.abs(C)>Math.abs(S)?S=s/C:Math.abs(S)>Math.abs(C)&&(C=s/S)}else return[];let vt=o(_,C,k,S);for(let I=0;I<8&&vt!=0;I++){const j=C*S-s,F=C*k+_*S-e,z=C+_*k+S-t,D=_+k-i,U=_-k,rt=C*C-C*(k*U+2*S)+S*(_*U+S);if(rt==0)break;const yt=1/rt,dt=S-C,At=C*k-_*S,Xe=U*j+dt*F+At*z-(C*dt+_*At)*D,He=(_*U+dt)*j-C*(U*F+dt*z+At*D),Ge=-U*j-dt*F-At*z+(k*At+S*dt)*D,We=-(k*U+dt)*j+S*(U*F+dt*z+At*D),we=_-yt*Xe,de=C-yt*He,Pe=k-yt*Ge,Me=S-yt*We,ye=o(we,de,Pe,Me);if(ye<vt)_=we,C=de,k=Pe,S=Me,vt=ye;else break}return[_,C,k,S]}function nn(i,t){const e=-.3333333333333333*i,s=.5*t;let n,r=null;if((Math.abs(e)>=1e102||Math.abs(s)>=1e164)&&(Math.abs(e)<Math.abs(s)?r=1-e*(e/s)*(e/s):r=Math.sign(e)*(s/e*(s/e)/e-1)),r!==null&&s==0)i>0?n=0:n=Math.sqrt(-i);else if(r!==null?r<0:s*s<e*e*e){const a=r!==null?s/e/Math.sqrt(e):s/Math.sqrt(e*e*e);n=-2*Math.sqrt(e)*jt(Math.cos(Math.acos(Math.abs(a))*(1/3)),a)}else{let a;r!==null?Math.abs(e)<Math.abs(s)?a=-s*(1+Math.sqrt(r)):a=-s-jt(Math.sqrt(Math.abs(e))*e*Math.sqrt(r),s):a=Math.cbrt(-s-jt(Math.sqrt(s*s-e*e*e),s));const c=a==0?0:e/a;n=a+c}let o=n,h=(o*o+i)*o+t;if(Math.abs(h)<222045e-21*Math.max(o*o*o,i*o,t))return o;for(let a=0;a<8;a++){const c=3*o*o+i;if(c==0)break;const u=o-h/c,f=(u*u+i)*u+t;if(f==0)return u;if(Math.abs(f)>=Math.abs(h))break;o=u,h=f}return o}function jt(i,t){const e=Math.abs(i);return t<0?-e:e}function Se(i,t=1e-9){if(i[i.length-1]==0)return Se(i.slice(0,-1),t);const e=new R([i.slice(0,-1).reverse().map(n=>-n/i[i.length-1]),...Array.from({length:i.length-2},(n,r)=>{const o=new Array(i.length-1).fill(0);return o[r]=1,o})]),s=new Zi(e);return s.realEigenvalues.filter((n,r)=>Math.abs(s.imaginaryEigenvalues[r])<t)}const rn=(i,t,e)=>[i[0]*(1-e)+t[0]*e,i[1]*(1-e)+t[1]*e];function on(i){const t=[];for(let e=0;e<i.length-1;e++)t.push([i[e],i[e+1]]);return t}function ke(i,t){const e=on(i).map(([s,n])=>rn(s,n,t));return i.length===2?[e]:[...ke(e,t),e]}let et=class zt extends Xt{constructor(t,e,s,n){super(t,e),A(this,"segmentType","CUBIC_BEZIER"),A(this,"firstControlPoint"),A(this,"lastControlPoint"),A(this,"_boundingBox",null),A(this,"_polynomialCoefficients",null),this.firstControlPoint=s,this.lastControlPoint=n}get midPoint(){return this.paramPoint(.5)}get boundingBox(){if(this._boundingBox===null){const t=e=>{const[s,n,r,o]=[this.firstPoint[e],this.firstControlPoint[e],this.lastControlPoint[e],this.lastPoint[e]],h=-s+3*n-3*r+o,l=2*s-4*n+2*r,a=-s+n;return ae(a,l,h).filter(c=>c>=-this.precision&&c<=1+this.precision)};this._boundingBox=xe([this.firstPoint,...t(0).map(e=>this.paramPoint(e)),...t(1).map(e=>this.paramPoint(e)),this.lastPoint]).grow(this.precision)}return this._boundingBox}clone(){return new zt(this.firstPoint,this.lastPoint,this.firstControlPoint,this.lastControlPoint)}reverse(){return new zt(this.lastPoint,this.firstPoint,this.lastControlPoint,this.firstControlPoint)}isSame(t){return t.segmentType!=="CUBIC_BEZIER"?!1:y(this.firstPoint,t.firstPoint)&&y(this.lastPoint,t.lastPoint)&&y(this.firstControlPoint,t.firstControlPoint)&&y(this.lastControlPoint,t.lastControlPoint)}distanceFrom(t){const e=is(s=>kt(this.paramPoint(s),t),this.precision);return e.argMin<-this.precision||e.argMin>1+this.precision?Math.min(N(this.firstPoint,t),N(this.lastPoint,t)):Math.sqrt(e.fMin)}isOnSegment(t){if(!this.boundingBox.contains(t))return!1;try{const e=this.pointToParam(t);return e>=-this.precision&&e<=1+this.precision}catch{return!1}}gradientAt(t){const e=1-t,s=e*e,n=t*t,r=3*s,o=6*e*t,h=3*n,l=q(this.firstControlPoint,this.firstPoint),a=q(this.lastControlPoint,this.firstControlPoint),c=q(this.lastPoint,this.lastControlPoint);return[r*l[0]+o*a[0]+h*c[0],r*l[1]+o*a[1]+h*c[1]]}tangentAt(t){const e=this.pointToParam(t);return W(this.gradientAt(e))}get tangentAtFirstPoint(){return W(q(this.firstControlPoint,this.firstPoint))}get tangentAtLastPoint(){return W(q(this.lastControlPoint,this.lastPoint))}normalAt(t){const e=this.tangentAt(t);return tt(e)}splitAtParameters(t,e=null){const s=[...t];s.sort((r,o)=>r-o);let n={originalParam:0,param:0,p0:this.firstPoint,p1:this.firstControlPoint,p2:this.lastControlPoint};return s.flatMap((r,o)=>{if(r-n.originalParam<this.precision)return[];let h=!1;r>1-this.precision&&(h=!0);const l=(r-n.originalParam)/(1-n.originalParam),a=ke([n.p0,n.p1,n.p2,this.lastPoint],h?1:l),c=h?this.lastPoint:(e==null?void 0:e.get(r))??a[0][0],u=a[1][0],f=a[2][0],p=a[1][1],g=a[2][2],w=new zt(n.p0,c,f,u);return n={param:l,originalParam:r,p0:c,p1:p,p2:g},o===s.length-1&&!h?[w,new zt(n.p0,this.lastPoint,n.p1,n.p2)]:w})}splitAt(t){let e;if(Array.isArray(t)&&t.length===0)return[this];Array.isArray(t[0])?e=t:e=[t];const s=e.map(r=>this.pointToParam(r)),n=new Map(mt([s,e]));return this.splitAtParameters(s,n)}transform(t){return new zt(t.transform(this.firstPoint),t.transform(this.lastPoint),t.transform(this.firstControlPoint),t.transform(this.lastControlPoint))}paramPoint(t){const e=1-t,s=e*e,n=t*t,r=s*e,o=3*s*t,h=3*e*n,l=n*t;return[r*this.firstPoint[0]+o*this.firstControlPoint[0]+h*this.lastControlPoint[0]+l*this.lastPoint[0],r*this.firstPoint[1]+o*this.firstControlPoint[1]+h*this.lastControlPoint[1]+l*this.lastPoint[1]]}get polynomialCoefficients(){if(this._polynomialCoefficients===null){const t=e=>{const s=this.firstPoint[e],n=this.firstControlPoint[e],r=this.lastControlPoint[e],o=this.lastPoint[e],h=-s+3*n-3*r+o,l=3*s-6*n+3*r,a=-3*s+3*n;return[s,a,l,h]};this._polynomialCoefficients=[t(0),t(1)]}return this._polynomialCoefficients}paramsAtY(t){const[e,s,n,r]=this.polynomialCoefficients[1];return cs(e-t,s,n,r).filter(o=>o>=-this.precision&&o<=1+this.precision)}pointToParam(t){const e=this.paramsAtY(t[1]);if(e.length===0)throw new Error("Point is not on the curve");const s=r=>Math.abs(this.paramPoint(r)[0]-t[0])<=this.precision,n=e.find(s);if(n===void 0)throw new Error("Point is not on the curve");return n}},J=class Jt extends Xt{constructor(t,e,s,n,r,o,h=!1,{ignoreChecks:l=!1,angleUnits:a="deg"}={}){super(t,e),A(this,"segmentType","ELLIPSE_ARC"),A(this,"precision",1e-6),A(this,"majorRadius"),A(this,"minorRadius"),A(this,"center"),A(this,"tiltAngle"),A(this,"clockwise"),A(this,"_coefficients",null),A(this,"_boundingBox"),A(this,"_linearExentricity"),A(this,"_exentricity"),A(this,"_focals"),A(this,"_ellipseReferenceFrameTransform"),A(this,"_reverseEllipseReferenceFrameTransform"),A(this,"_rotateFromEllipseReferenceFrame"),A(this,"_firstAngle"),A(this,"_lastAngle"),A(this,"_deltaAngle"),this.center=s;const c=n>=r;this.majorRadius=c?n:r,this.minorRadius=c?r:n;const u=a==="deg"?o*St:o;if(this.tiltAngle=Ct(c?u:u+Math.PI/2),this.clockwise=h,!l){if(y(t,e))throw new Error("Invalid arc, cannot be a full circle");if(!this.isPointOnEllipse(t))throw new Error(`First point ${H(t)} not on the ellipse defined by ${this.info}`);if(!this.isPointOnEllipse(e))throw new Error(`Last point ${H(e)} not on the ellipse defined by ${this.info}`);if(Math.abs(this.majorRadius-this.minorRadius)<this.precision)throw new Error("Both radii should be different, create an arc instead")}}get coefficients(){if(this._coefficients===null){const[t,e]=this.center,s=this.majorRadius*this.majorRadius,n=this.minorRadius*this.minorRadius,r=Math.cos(this.tiltAngle),o=Math.sin(this.tiltAngle),h=s*o*o+n*r*r,l=2*(n-s)*o*r,a=s*r*r+n*o*o;this._coefficients={x2:h,xy:l,y2:a,x:-2*h*t-l*e,y:-2*a*e-l*t,c:h*t*t+l*t*e+a*e*e-s*n}}return this._coefficients}get info(){return`ELLIPSE_ARC(${H(this.firstPoint)}, ${H(this.lastPoint)}, ${H(this.center)}, ${this.majorRadius}, ${this.minorRadius}, ${this.tiltAngle*ve}, ${this.clockwise?"CW":"CCW"})`}reverse(){return new Jt(this.lastPoint,this.firstPoint,this.center,this.majorRadius,this.minorRadius,this.tiltAngle,!this.clockwise,{ignoreChecks:!0,angleUnits:"rad"})}clone(){return new Jt(this.firstPoint,this.lastPoint,this.center,this.majorRadius,this.minorRadius,this.tiltAngle,this.clockwise,{ignoreChecks:!0,angleUnits:"rad"})}computeEllipseExtrema(){const t=Math.tan(this.tiltAngle),e=this.minorRadius/this.majorRadius,s=-Math.atan(e*t),n=Math.atan(e/t);return[s,Math.PI+s,n,Math.PI+n].map(r=>this.thetaToParam(r)).filter(r=>this.isValidParameter(r)).map(r=>this.paramPoint(r))}get boundingBox(){if(this._boundingBox===void 0){const t=this.computeEllipseExtrema(),e=[this.firstPoint,this.lastPoint,...t];this._boundingBox=xe(e).grow(this.precision)}return this._boundingBox}get linearExentricity(){return this._linearExentricity===void 0&&(this._linearExentricity=Math.sqrt(this.majorRadius*this.majorRadius-this.minorRadius*this.minorRadius)),this._linearExentricity}get exentricity(){return this._exentricity===void 0&&(this._exentricity=this.linearExentricity/this.majorRadius),this._exentricity}get focals(){if(this._focals===void 0){const t=this.majorAxis;this._focals=[O(this.center,G(t,this.linearExentricity)),O(this.center,G(t,-this.linearExentricity))]}return this._focals}get majorAxis(){return Mt(1,this.tiltAngle)}paramPoint(t){const e=this.firstAngle+t*this.deltaAngle*(this.clockwise?-1:1);return this.reverseEllipseReferenceFrameTransform.transform([this.majorRadius*Math.cos(e),this.minorRadius*Math.sin(e)])}pointToParam(t){if(!this.isPointOnEllipse(t))throw new Error(`Point ${H(t)} not on the ellipse defined by ${this.repr}`);const e=this.thetaToParam(this.pointTheta(t));if(!this.isValidParameter(e))throw new Error(`Point ${H(t)} is not on segment ${this.repr}`);return e}get midPoint(){return this.paramPoint(.5)}isValidParameter(t){return 1-t>=-this.precision&&t>=-this.precision}isSame(t){return y(this.center,t.center)&&Math.abs(this.majorRadius-t.majorRadius)<this.precision&&Math.abs(this.minorRadius-t.minorRadius)<this.precision&&(Math.abs(this.tiltAngle-t.tiltAngle)<this.precision||Math.abs(Math.abs(this.tiltAngle-t.tiltAngle)-Math.PI)<this.precision)&&(y(this.firstPoint,t.firstPoint)&&this.clockwise===t.clockwise||y(this.firstPoint,t.lastPoint)&&this.clockwise!==t.clockwise)}pointTheta(t){const e=this.ellipseReferenceFrameTransform.transform(t),s=Math.atan2(e[1]/this.minorRadius,e[0]/this.majorRadius);return Ct(s)}thetaToParam(t){return te(this.firstAngle,Ct(t),this.clockwise)/this.deltaAngle}isPointOnEllipse(t){const[e,s]=this.focals,n=N(t,e),r=N(t,s);return Math.abs(2*this.majorRadius-n-r)<this.precision}isOnSegment(t){return this.isPointOnEllipse(t)?this.isValidParameter(this.thetaToParam(this.pointTheta(t))):!1}distanceFrom(t){let e;if(y(t,this.center)?e=O(this.center,G(tt(this.majorAxis),this.minorRadius)):e=this.reverseEllipseReferenceFrameTransform.transform(ln(this.majorRadius,this.minorRadius,this.ellipseReferenceFrameTransform.transform(t))),this.isValidParameter(this.thetaToParam(this.pointTheta(t))))return N(t,e);if(gi(t,this.majorAxis,this.center)){const s=Ct(2*Math.PI-this.pointTheta(t)),n=this.thetaToParam(s);if(this.isValidParameter(n))return N(t,this.paramPoint(n))}return Math.min(N(t,this.firstPoint),N(t,this.lastPoint))}get ellipseReferenceFrameTransform(){return this._ellipseReferenceFrameTransform===void 0&&(this._ellipseReferenceFrameTransform=new at().rotate(-this.tiltAngle).translate(-this.center[0],-this.center[1])),this._ellipseReferenceFrameTransform}get reverseEllipseReferenceFrameTransform(){return this._reverseEllipseReferenceFrameTransform===void 0&&(this._reverseEllipseReferenceFrameTransform=new at().translate(this.center[0],this.center[1]).rotate(this.tiltAngle)),this._reverseEllipseReferenceFrameTransform}get rotateFromEllipseReferenceFrame(){return this._rotateFromEllipseReferenceFrame===void 0&&(this._rotateFromEllipseReferenceFrame=new at().rotate(this.tiltAngle)),this._rotateFromEllipseReferenceFrame}get firstAngle(){return this._firstAngle===void 0&&(this._firstAngle=this.pointTheta(this.firstPoint)),this._firstAngle}get lastAngle(){return this._lastAngle===void 0&&(this._lastAngle=this.pointTheta(this.lastPoint)),this._lastAngle}get deltaAngle(){return this._deltaAngle===void 0&&(this._deltaAngle=te(this.firstAngle,this.lastAngle,this.clockwise)),this._deltaAngle}normalAt(t){const e=this.tangentAt(t);return this.clockwise?tt(e):Dt(e)}gradientAt(t){const e=this.firstAngle+t*this.deltaAngle*(this.clockwise?-1:1),s=-this.majorRadius*this.deltaAngle*Math.sin(e),n=this.minorRadius*this.deltaAngle*Math.cos(e),r=this.clockwise?[-s,-n]:[s,n];return this.rotateFromEllipseReferenceFrame.transform(r)}tangentAt(t){const e=this.pointTheta(t),s=-this.majorRadius*Math.sin(e),n=this.minorRadius*Math.cos(e),r=this.clockwise?[-s,-n]:[s,n];return W(this.rotateFromEllipseReferenceFrame.transform(r))}get tangentAtFirstPoint(){const t=-this.majorRadius*Math.sin(this.firstAngle),e=this.minorRadius*Math.cos(this.firstAngle),s=this.clockwise?[-t,-e]:[t,e];return W(this.rotateFromEllipseReferenceFrame.transform(s))}get tangentAtLastPoint(){const t=-this.majorRadius*Math.sin(this.lastAngle),e=this.minorRadius*Math.cos(this.lastAngle),s=this.clockwise?[-t,-e]:[t,e];return W(this.rotateFromEllipseReferenceFrame.transform(s))}transform(t){const e=t.transformAngle(this.tiltAngle),s=t.scaleFactor();return new Jt(t.transform(this.firstPoint),t.transform(this.lastPoint),t.transform(this.center),this.majorRadius*s,this.minorRadius*s,e,t.keepsOrientation()?this.clockwise:!this.clockwise,{angleUnits:"rad"})}splitAt(t){let e;if(Array.isArray(t)&&t.length===0)return[this];Array.isArray(t[0])?e=t:e=[t];const s=[0,1,...e.map(o=>this.pointToParam(o))],n=new Map(mt([s,[this.firstPoint,this.lastPoint,...e]]));s.sort((o,h)=>o-h);let r=null;return s.flatMap((o,h)=>{if(h===s.length-1)return[];const l=s[h+1];if(l-o<this.precision)return r===null&&(r=o),[];const a=r===null?o:r,c=new Jt(n.get(a)||this.paramPoint(a),n.get(l)||this.paramPoint(l),this.center,this.majorRadius,this.minorRadius,this.tiltAngle,this.clockwise,{angleUnits:"rad"});return r=null,c})}};function hn(i,t,e,s,n,r,o){const{center:h,rx:l,ry:a}=an(i,t,e,s,n*St,!r,o);return Math.abs(l-a)<1e-9?new L(i,t,h,o):new J(i,t,h,l,a,n,o)}function an([i,t],[e,s],n,r,o,h,l){if(n<0&&(n=-n),r<0&&(r=-r),n==0||r==0)throw Error("rx and ry can not be 0");const a=Math.sin(o),c=Math.cos(o),u=(i-e)/2,f=(t-s)/2,p=(i+e)/2,g=(t+s)/2,w=c*u+a*f,P=c*f-a*u,m=w*w/(n*n)+P*P/(r*r);m>1&&(n=n*Math.sqrt(m),r=r*Math.sqrt(m));const d=n*r,M=n*P,x=r*w,v=M*M+x*x;if(!v)throw Error("start point can not be same as end point");let $=Math.sqrt(Math.abs((d*d-v)/v));h==l&&($=-$);const E=$*M/r,b=-$*x/n,T=c*E-a*b+p,V=a*E+c*b+g;return{center:[T,V],rx:n,ry:r}}function ln(i,t,e){const s=Math.abs(e[0]),n=Math.abs(e[1]);let r=.707,o=.707;const h=i,l=t;for(let a=0;a<3;a++){const c=h*r,u=l*o,f=(h*h-l*l)*r**3/h,p=(l*l-h*h)*o**3/l,g=c-f,w=u-p,P=s-f,m=n-p,d=Math.hypot(g,w),M=Math.hypot(P,m);r=Math.min(1,Math.max(0,(P*d/M+f)/h)),o=Math.min(1,Math.max(0,(m*d/M+p)/l));const x=Math.hypot(r,o);r/=x,o/=x}return[h*r*Math.sign(e[0]),l*o*Math.sign(e[1])]}let K=class Ut extends Xt{constructor(t,e,s){super(t,e),A(this,"segmentType","QUADRATIC_BEZIER"),A(this,"controlPoint"),A(this,"_boundingBox",null),A(this,"_polynomialCoefficients",null),this.controlPoint=s}get midPoint(){return this.paramPoint(.5)}get boundingBox(){if(this._boundingBox===null){const t=e=>{const[s,n,r]=[this.firstPoint[e],this.controlPoint[e],this.lastPoint[e]],o=s-2*n+r;if(!o)return[];const h=(s-n)/o;return h>=-this.precision&&h<=1+this.precision?[h]:[]};this._boundingBox=xe([this.firstPoint,...t(0).map(e=>this.paramPoint(e)),...t(1).map(e=>this.paramPoint(e)),this.lastPoint]).grow(this.precision)}return this._boundingBox}clone(){return new Ut(this.firstPoint,this.lastPoint,this.controlPoint)}reverse(){return new Ut(this.lastPoint,this.firstPoint,this.controlPoint)}isSame(t){return t.segmentType!=="QUADRATIC_BEZIER"?!1:y(this.firstPoint,t.firstPoint)&&y(this.lastPoint,t.lastPoint)&&y(this.controlPoint,t.controlPoint)}distanceFrom(t){const e=is(s=>kt(this.paramPoint(s),t),this.precision);return e.argMin<-this.precision||e.argMin>1+this.precision?Math.min(N(this.firstPoint,t),N(this.lastPoint,t)):Math.sqrt(e.fMin)}isOnSegment(t){if(!this.boundingBox.contains(t))return!1;try{const e=this.pointToParam(t);return e>=-this.precision&&e<=1+this.precision}catch{return!1}}gradientAt(t){const e=s=>{const n=this.firstPoint[s],r=this.controlPoint[s],o=this.lastPoint[s];return 2*(t*(n-2*r+o)-n+r)};return[e(0),e(1)]}tangentAt(t){const e=this.pointToParam(t);return W(this.gradientAt(e))}get tangentAtFirstPoint(){return W(q(this.controlPoint,this.firstPoint))}get tangentAtLastPoint(){return W(q(this.controlPoint,this.lastPoint))}normalAt(t){const e=this.tangentAt(t);return tt(e)}splitAtParameters(t,e=null){const s=[...t];s.sort((r,o)=>r-o);let n={originalParam:0,param:0,p0:this.firstPoint,p1:this.controlPoint};return s.flatMap((r,o)=>{if(r-n.originalParam<this.precision)return[];let h=!1;r>1-this.precision&&(h=!0);const l=(r-n.originalParam)/(1-n.originalParam),a=ke([n.p0,n.p1,this.lastPoint],h?1:l),c=h?this.lastPoint:(e==null?void 0:e.get(r))??a[0][0],u=a[1][0],f=a[1][1],p=new Ut(n.p0,c,u);return n={param:l,originalParam:r,p0:c,p1:f},o===s.length-1&&!h?[p,new Ut(n.p0,this.lastPoint,n.p1)]:p})}splitAt(t){let e;if(Array.isArray(t)&&t.length===0)return[this];Array.isArray(t[0])?e=t:e=[t];const s=e.map(r=>this.pointToParam(r)),n=new Map(mt([s,e]));return this.splitAtParameters(s,n)}transform(t){return new Ut(t.transform(this.firstPoint),t.transform(this.lastPoint),t.transform(this.controlPoint))}paramPoint(t){const e=1-t,s=e*e,n=2*e*t,r=t*t;return[s*this.firstPoint[0]+n*this.controlPoint[0]+r*this.lastPoint[0],s*this.firstPoint[1]+n*this.controlPoint[1]+r*this.lastPoint[1]]}get polynomialCoefficients(){if(this._polynomialCoefficients===null){const t=e=>{const s=this.firstPoint[e],n=this.controlPoint[e],r=this.lastPoint[e],o=s-2*n+r,h=2*(n-s);return[s,h,o]};this._polynomialCoefficients=[t(0),t(1)]}return this._polynomialCoefficients}paramsAtY(t){const[e,s,n]=this.polynomialCoefficients[1];return ae(e-t,s,n).filter(r=>r>=-this.precision&&r<=1+this.precision)}pointToParam(t){const e=this.paramsAtY(t[1]);if(e.length===0)throw new Error("Point is not on the curve!");const s=r=>Math.abs(this.paramPoint(r)[0]-t[0])<=this.precision,n=e.find(s);if(n===void 0)throw new Error("Point is not on the curve");return n}};var un=Object.defineProperty,cn=(i,t,e)=>t in i?un(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e,st=(i,t,e)=>(cn(i,typeof t!="symbol"?t+"":t,e),e);function fn(i,t){const e=q(t,i.firstPoint),s=Ae(e,i.V)/i.squareLength;return i.paramPoint(s)}function le(i,t,e){const s=e||i.precision,n=fn(i,t.center),r=N(n,t.center);if(r>t.radius+s)return[];if(Math.abs(r-t.radius)<s){const u=n;return i.isOnSegment(u)&&t.isOnSegment(u)?[u]:[]}const o=[],h=Math.sqrt(t.radius*t.radius-r*r),l=i.tangentAtFirstPoint,a=O(n,G(l,h));i.isOnSegment(a)&&t.isOnSegment(a)&&o.push(a);const c=O(n,G(l,-h));return i.isOnSegment(c)&&t.isOnSegment(c)&&o.push(c),o}const mn=i=>{const{firstPoint:t,lastPoint:e,center:s,clockwise:n}=i;return new L(e,t,s,n,{ignoreChecks:!0})},gn=(i,t)=>{if(i.isSame(t))return[i];const e=Pt([t.isOnSegment(i.firstPoint)?i.firstPoint:null,t.isOnSegment(i.lastPoint)?i.lastPoint:null,i.isOnSegment(t.firstPoint)?t.firstPoint:null,i.isOnSegment(t.lastPoint)?t.lastPoint:null].filter(s=>s!==null)).sort((s,n)=>i.pointToParam(s)-i.pointToParam(n));if(e.length===0)return[];if(e.length===1)return[];if(e.length===2)return i.isSame(mn(t))?[]:[new L(e[0],e[1],i.center,i.clockwise)];if(e.length===3){const s=y(e[0],t.lastPoint)||y(e[0],t.firstPoint)?1:0;return[new L(e[0+s],e[1+s],i.center,i.clockwise)]}else if(e.length===4)return[new L(e[0],e[1],i.center,i.clockwise),new L(e[2],e[3],i.center,i.clockwise)];throw new Error("Bug in the arc arc overlap algorithm")};function ms(i,t,e=!1,s){const n=s||i.precision,r=N(i.center,t.center),o=i.radius+t.radius;if(r>o+n)return[];const h=Math.abs(i.radius-t.radius);if(r<h-n)return[];if(r<n)return h>n?[]:e?gn(i,t):[];const l=W(q(t.center,i.center)),a=r>o-n;if(a||Math.abs(r-h)<n){const m=a||i.radius>t.radius?1:-1,d=O(i.center,G(l,m*i.radius));return i.isOnSegment(d)&&t.isOnSegment(d)?[d]:[]}const c=i.radius*i.radius/(2*r)-t.radius*t.radius/(2*r)+r/2,u=O(i.center,G(l,c)),f=Math.sqrt(i.radius*i.radius-c*c),p=tt(l),g=O(u,G(p,f)),w=O(u,G(p,-f)),P=[];return i.isOnSegment(g)&&t.isOnSegment(g)&&P.push(g),i.isOnSegment(w)&&t.isOnSegment(w)&&P.push(w),P}function $e(i,t,e=1e-9){const s=i.transform(t.ellipseReferenceFrameTransform),n=s.slope,r=s.yIntercept,o=t.majorRadius*t.majorRadius,h=t.minorRadius*t.minorRadius,l=t.majorRadius*t.minorRadius,a=s.slope*s.slope,c=s.yIntercept*s.yIntercept,u=m=>m.map(d=>t.reverseEllipseReferenceFrameTransform.transform(d)).filter(d=>i.isOnSegment(d)&&t.isOnSegment(d));if(!Number.isFinite(n)){const m=s.firstPoint[0];if(Math.abs(m)-t.majorRadius>e)return[];if(Math.abs(Math.abs(m)-t.majorRadius)<e)return u([[m,0]]);const d=t.minorRadius*Math.sqrt(1-m*m/o),M=[m,d],x=[m,-d];return u([M,x])}const f=o*a+h-c;if(f<-e)return[];const p=o*a+h;if(Math.abs(f)<e){const m=-(o*n*r)/p,d=h*r/p;return u([[m,d]])}const g=Math.sqrt(f),w=[-(o*n*r+l*g)/p,(h*r-l*n*g)/p],P=[-(o*n*r-l*g)/p,(h*r+l*n*g)/p];return u([w,P])}function gs(i,t){const e=Math.max(i.precision,t.precision),s=i.coefficients,n=s.x2,r=s.xy,o=s.y2,h=s.x,l=s.y,a=s.c,c=t.coefficients,u=c.x2,f=c.xy,p=c.y2,g=c.x,w=c.y,P=c.c,m={z0:a*n*g*g+n*n*P*P-h*n*g*P+u*u*a*a-2*n*P*u*a-h*g*u*a+u*h*h*P,z1:w*h*h*u-P*g*n*r-2*n*P*u*l-a*u*f*h+2*g*f*n*a+2*w*P*n*n+g*g*n*l-w*g*n*h-2*n*w*u*a-a*u*g*r+2*a*l*u*u-P*f*n*h-l*u*g*h+2*P*r*u*h,z2:w*w*n*n+2*p*P*n*n-l*u*g*r+P*u*r*r-l*u*f*h-P*f*n*r-2*n*w*u*l+2*g*f*n*l-p*g*n*h-2*n*p*u*a+f*f*n*a+2*w*r*u*h+l*l*u*u-o*u*g*h-w*f*n*h+2*a*o*u*u-a*u*f*r+p*h*h*u+g*g*n*o-w*g*n*r-2*n*P*u*o,z3:-2*n*u*o*w+w*u*r*r+2*p*r*u*h-o*u*f*h+f*f*n*l-w*f*n*r-2*n*p*u*l-l*u*f*r-p*f*n*h+2*w*p*n*n+2*l*o*u*u-o*u*g*r+2*g*f*n*o-p*g*n*r,z4:n*n*p*p-2*n*p*u*o+u*u*o*o-r*n*f*p-r*f*u*o+r*r*u*p+o*n*f*f},d=Se([m.z0,m.z1,m.z2,m.z3,m.z4],e).flatMap(M=>{const x=n*f*M+n*g-u*r*M-u*h;if(x)return[[-(n*P+n*p*M*M-u*o*M*M+n*w*M-u*l*M-u*a)/x,M]];const v=r*M+h,$=-v/(2*n),E=o*M*M+l*M+a,b=v*v/(4*n*n)-E/n;if(Math.abs(b)<e)return[[$,M]];if(b>0){const T=Math.sqrt(b);return[[$+T,M],[$-T,M]]}return[]});return Pt(d,e)}function ps(i,t){return gs(i,t).filter(e=>i.isOnSegment(e)&&t.isOnSegment(e))}const pn=i=>{const{firstPoint:t,lastPoint:e,center:s,majorRadius:n,minorRadius:r,tiltAngle:o,clockwise:h}=i;return new J(e,t,s,n,r,o,h,{ignoreChecks:!0,angleUnits:"rad"})},wn=(i,t)=>{if(i.isSame(t))return[i];const e=(n,r)=>new J(n,r,i.center,i.majorRadius,i.minorRadius,i.tiltAngle,i.clockwise,{ignoreChecks:!0,angleUnits:"rad"}),s=Pt([t.isOnSegment(i.firstPoint)?i.firstPoint:null,t.isOnSegment(i.lastPoint)?i.lastPoint:null,i.isOnSegment(t.firstPoint)?t.firstPoint:null,i.isOnSegment(t.lastPoint)?t.lastPoint:null].filter(n=>n!==null)).sort((n,r)=>i.pointToParam(n)-i.pointToParam(r));if(s.length===0)return[];if(s.length===1)return[];if(s.length===2)return i.isSame(pn(t))?[]:[e(s[0],s[1])];if(s.length===3){const n=y(s[0],t.lastPoint)||y(s[0],t.firstPoint)?1:0;return[e(s[0+n],s[1+n])]}else if(s.length===4)return[e(s[0],s[1]),e(s[2],s[3])];throw new Error("Bug in the ellipse arc ellipse arc overlap algorithm")};function dn(i,t,e=!1){const s=Math.max(i.precision,t.precision);return y(i.center,t.center)&&Math.abs(i.majorRadius-t.majorRadius)<s&&Math.abs(i.minorRadius-t.minorRadius)<s&&(Math.abs(i.tiltAngle-t.tiltAngle)<s||Math.abs(Math.abs(i.tiltAngle-t.tiltAngle)-Math.PI)<s)?e?wn(i,t):[]:gs(i,t).filter(n=>i.isOnSegment(n)&&t.isOnSegment(n))}function ws(i,t){const[e,s]=i.firstPoint,[n,r]=i.lastPoint,o=new at().rotate(-Math.atan2(r-s,n-e)).translate(-e,-s),h=o.clone().inverse(),l=t.transform(o);return l.paramsAtY(0).map(a=>l.paramPoint(a)).map(a=>h.transform(a)).filter(a=>i.isOnSegment(a))}const Pn=(i,t=1e-9)=>{let e=i;return Math.abs(i)<t&&(e=0),e.toFixed(-Math.log10(t))};function ds(i,t=1e-9){return Array.from(new Map(i.map(e=>[Pn(e,t),e])).values())}const Mn=(i,t)=>{const[[e,s,n,r],[o,h,l,a]]=t.polynomialCoefficients,c=i.coefficients,u=c.x2,f=c.xy,p=c.y2,g=c.x,w=c.y,P=c.c,m=e*e,d=s*s,M=n*n,x=r*r,v=o*o,$=h*h,E=l*l,b=a*a,T=P+g*e+u*m+w*o+f*e*o+p*v,V=g*s+2*u*e*s+f*s*o+w*h+f*e*h+2*p*o*h,Y=u*d+g*n+2*u*e*n+f*n*o+f*s*h+p*$+w*l+f*e*l+2*p*o*l,nt=2*u*s*n+g*r+2*u*e*r+f*r*o+f*n*h+f*s*l+2*p*h*l+w*a+f*e*a+2*p*o*a,_=u*M+2*u*s*r+f*r*h+f*n*l+p*E+f*s*a+2*p*h*a,C=2*u*n*r+f*r*l+f*n*a+2*p*l*a,k=u*x+f*r*a+p*b;return[T,V,Y,nt,_,C,k]};function Ps(i,t){const e=Math.max(i.precision,t.precision),s=Mn(i,t),n=Se(s,e).filter(r=>r>=-t.precision&&r<=1+t.precision);return ds(n,e).map(r=>t.paramPoint(r)).filter(r=>i.isOnSegment(r))}const yn=(i,t)=>{const[[e,s,n],[r,o,h]]=t.polynomialCoefficients,l=i.coefficients,a=l.x2,c=l.xy,u=l.y2,f=l.x,p=l.y,g=l.c,w=e*e,P=s*s,m=n*n,d=r*r,M=o*o,x=h*h,v=a*w+c*e*r+u*d+f*e+p*r+g,$=2*a*e*s+c*e*o+c*s*r+2*u*r*o+f*s+p*o,E=2*a*e*n+a*P+c*e*h+c*s*o+c*n*r+2*u*r*h+u*M+f*n+p*h,b=2*a*s*n+c*s*h+c*n*o+2*u*o*h,T=a*m+c*n*h+u*x;return[v,$,E,b,T]};function Ms(i,t){const e=Math.max(i.precision,t.precision),s=yn(i,t),n=en(...s).filter(r=>r>=-t.precision&&r<=1+t.precision);return ds(n,e).map(r=>t.paramPoint(r)).filter(r=>i.isOnSegment(r))}function it(i,{firstPoint:t,lastPoint:e},s=1e-9){const n=q(e,t);return Math.abs(n[0])<s?n[1]>0?t[0]-i[0]:i[0]-t[0]:Math.abs(n[1])<s?n[0]>0?i[1]-t[1]:t[1]-i[1]:bt(n,q(i,t))/fi(n)}class Ce{constructor(t,e,s,n){this.firstPoint=t,this.lastPoint=e,this.negativeThickness=s,this.positiveThickness=n}get width(){return this.positiveThickness-this.negativeThickness}}const bn=3/4,xn=4/9;function vn(i){const t=it(i.firstControlPoint,i),e=it(i.lastControlPoint,i),s=t*e>0?bn:xn;return new Ce(i.firstPoint,i.lastPoint,s*Math.min(0,t,e),s*Math.max(0,t,e))}function An(i){const t=it(i.controlPoint,i);return new Ce(i.firstPoint,i.lastPoint,Math.min(0,t/2),Math.max(0,t/2))}function En(i){if(i instanceof et)return vn(i);if(i instanceof K)return An(i);throw new Error("Not implemented")}function Sn(i){const t=i.paramPoint(.5),e=tt(q(t,i.firstPoint)),s=O(t,e),n={firstPoint:t,lastPoint:s},r=[it(i.firstPoint,n),it(i.lastPoint,n)];return i instanceof et?r.push(it(i.firstControlPoint,n),it(i.lastControlPoint,n)):i instanceof K&&r.push(it(i.controlPoint,n)),new Ce(t,s,Math.min(...r),Math.max(...r))}function ys(i,t){const e=[];for(let s=1;s<i.length;s++){const n=i[s];if(n[1]===t){e.push(n[0]);continue}const r=i[s-1],o=t-r[1],h=t-n[1];if(o*h<0){e.push(r[0]+(t-r[1])*(n[0]-r[0])/(n[1]-r[1]));continue}}return e}let Ht=class{constructor(t,e){this.from=t,this.to=e}get size(){return this.from==="start"?this.to==="end"?1:this.to:this.to==="end"?1-this.from:Math.abs(this.from-this.to)}clipCurve(t){return this.from==="start"?this.to==="end"?t:t.splitAtParameters([this.to])[0]:this.to==="end"?t.splitAtParameters([this.from])[1]:t.splitAtParameters([this.from,this.to])[1]}};function kn(i,t){if(i instanceof et)return new Cn([it(i.firstPoint,t),it(i.firstControlPoint,t),it(i.lastControlPoint,t),it(i.lastPoint,t)]);if(i instanceof K)return new $n([it(i.firstPoint,t),it(i.controlPoint,t),it(i.lastPoint,t)]);throw new Error("Not implemented")}class $n{constructor(t){st(this,"topHull",[]),st(this,"bottomHull",[]),this.distances=t;const[e,s,n]=t,r=[0,e],o=[1/2,s],h=[1,n],l=n-e,a=e;s-(l*(1/2)+a)>0?(this.topHull=[r,o,h],this.bottomHull=[r,h]):(this.topHull=[r,h],this.bottomHull=[r,o,h])}get startDistance(){return this.distances[0]}get endDistance(){return this.distances[2]}}class Cn{constructor(t){st(this,"topHull",[]),st(this,"bottomHull",[]),this.distances=t;const[e,s,n,r]=t,o=[0,e],h=[1/3,s],l=[2/3,n],a=[1,r],c=r-e,u=e,f=s-(c*(1/3)+u),p=n-(c*(2/3)+u);let g=null,w=null;if(f*p<0)g=[o,h,a],w=[o,l,a];else{const P=f/p;P>=2?(g=[o,h,a],w=[o,a]):P<=.5?(g=[o,l,a],w=[o,a]):(g=[o,h,l,a],w=[o,a])}f<0&&([g,w]=[w,g]),this.topHull=g,this.bottomHull=w}get startDistance(){return this.distances[0]}get endDistance(){return this.distances[3]}}function bs(i,t){const e=kn(t,i),s=ys(e.topHull,i.negativeThickness),n=ys(e.bottomHull,i.positiveThickness),r=e.endDistance>=i.negativeThickness&&e.endDistance<=i.positiveThickness;if(!s.length&&!n.length)return r?new Ht("start","end"):null;if(s.length===1&&n.length===1)return new Ht(s[0],n[0]);if(s.length===2&&n.length===2)throw new Error("Bug in the clipping algorithm, unexpected number of crossing points");const o=s.length?s:n;return o.length===2?new Ht(o[0],o[1]):r?new Ht(o[0],"end"):new Ht("start",o[0])}function xs(i,t){const e=En(i),s=bs(e,t);if(!s)return null;const n=Sn(i),r=bs(n,t);return r?s.size>r.size?r.clipCurve(t):s.clipCurve(t):null}const ue=i=>i instanceof K?wt(q(i.controlPoint,i.firstPoint))+wt(q(i.controlPoint,i.lastPoint)):wt(q(i.firstControlPoint,i.firstPoint))+wt(q(i.lastControlPoint,i.firstControlPoint))+wt(q(i.lastControlPoint,i.lastPoint));function Tt(i,t,e=1e-9,{maxIterations:s=100}={}){const n=Math.max(e*e,Number.EPSILON*10);let r=i,o=t,h=ue(r),l=ue(o);for(let a=0;a<s;a++){const c=h>n?xs(o,r):r;if(!c)return[];const u=ue(c),f=l>n?xs(c,o):o;if(!f)return[];const p=ue(f);if(u<=n&&p<=n)return[c.boundingBox.intersection(f.boundingBox).center];if(y(c.firstPoint,c.lastPoint)&&f.isOnSegment(c.firstPoint))return[c.firstPoint];if(y(f.firstPoint,f.lastPoint)&&c.isOnSegment(f.firstPoint))return[f.firstPoint];if(u>.8*h&&p>.8*l)if(u/h>p/l){const[g,w]=c.splitAtParameters([.5]);return Pt([...Tt(g,f,e,{maxIterations:s-a}),...Tt(w,f,e,{maxIterations:s-a})],e)}else{const[g,w]=f.splitAtParameters([.5]);return Pt([...Tt(c,g,e,{maxIterations:s-a}),...Tt(c,w,e,{maxIterations:s-a})],e)}r=c,o=f,h=u,l=p}throw new Error("Bézier clip: Maximum number of iterations reached")}function Rn(i,t){const e=[];if([[i.firstPoint,t],[i.lastPoint,t],[t.firstPoint,i],[t.lastPoint,i]].forEach(([s,n])=>{n.isOnSegment(s)&&e.push(s)}),e.length<2)return null;if(e.length===2)return[i.splitAt(e)[1]];if(e.length===3)return y(e[0],i.firstPoint)&&y(e[1],i.lastPoint)?[i]:[t];if(e.length===4)return[i]}function Tn(i,t,e=!1){const s=Math.max(i.precision,t.precision);if(e){const n=Rn(i,t);if(n)return n}return Tt(i,t,s)}function Fn(i,t){const e=[];if([[i.firstPoint,t],[i.lastPoint,t],[t.firstPoint,i],[t.lastPoint,i]].forEach(([s,n])=>{n.isOnSegment(s)&&e.push(s)}),e.length<2)return null;if(e.length===2)return[i.splitAt(e)[1]];if(e.length===3)return y(e[0],i.firstPoint)&&y(e[1],i.lastPoint)?[i]:[t];if(e.length===4)return[i]}function In(i,t,e=!1){const s=Math.max(i.precision,t.precision);if(e){const n=Fn(i,t);if(n)return n}return Tt(i,t,s)}function _n(i,t,e){if(i instanceof B&&t instanceof B){const s=Je(i,t,!1,e);return s===null?[]:[s]}if(i instanceof B&&t instanceof L)return le(i,t,e);if(i instanceof L&&t instanceof B)return le(t,i,e);if(i instanceof L&&t instanceof L)return ms(i,t,!1,e);throw new Error("Not implemented")}function Gt(i,t,e){if(i instanceof B&&t instanceof B){const s=Je(i,t,!0,e);return s===null?{intersections:[],overlaps:[],count:0}:s instanceof B?{intersections:[],overlaps:[s],count:1}:{intersections:[s],overlaps:[],count:1}}if(!i.boundingBox.overlaps(t.boundingBox))return{intersections:[],overlaps:[],count:0};if(i instanceof B&&t instanceof L){const s=le(i,t,e);return{intersections:s,overlaps:[],count:s.length}}if(i instanceof L&&t instanceof B){const s=le(t,i,e);return{intersections:s,overlaps:[],count:s.length}}if(i instanceof L&&t instanceof L){const s=ms(i,t,!0,e);return s.length?s[0]instanceof L?{intersections:[],overlaps:s,count:s.length}:{intersections:s,overlaps:[],count:s.length}:{intersections:[],overlaps:[],count:0}}if(i instanceof B&&t instanceof J){const s=$e(i,t,e);return{intersections:s,overlaps:[],count:s.length}}if(t instanceof B&&i instanceof J){const s=$e(t,i,e);return{intersections:s,overlaps:[],count:s.length}}if(i instanceof L&&t instanceof J){const s=ps(i,t);return{intersections:s,overlaps:[],count:s.length}}if(t instanceof L&&i instanceof J){const s=ps(t,i);return{intersections:s,overlaps:[],count:s.length}}if(i instanceof J&&t instanceof J){const s=dn(i,t,!0);return s.length?s[0]instanceof J?{intersections:[],overlaps:s,count:s.length}:{intersections:s,overlaps:[],count:s.length}:{intersections:[],overlaps:[],count:0}}if(i instanceof B&&(t instanceof et||t instanceof K)){const s=ws(i,t);return{intersections:s,overlaps:[],count:s.length}}if(t instanceof B&&(i instanceof et||i instanceof K)){const s=ws(t,i);return{intersections:s,overlaps:[],count:s.length}}if((i instanceof L||i instanceof J)&&t instanceof K){const s=Ms(i,t);return{intersections:s,overlaps:[],count:s.length}}if((t instanceof L||t instanceof J)&&i instanceof K){const s=Ms(t,i);return{intersections:s,overlaps:[],count:s.length}}if((i instanceof L||i instanceof J)&&t instanceof et){const s=Ps(i,t);return{intersections:s,overlaps:[],count:s.length}}if((t instanceof L||t instanceof J)&&i instanceof et){const s=Ps(t,i);return{intersections:s,overlaps:[],count:s.length}}if(i instanceof K&&t instanceof K){const s=In(i,t);return s.length?s[0]instanceof K?{intersections:[],overlaps:s,count:s.length}:{intersections:s,overlaps:[],count:s.length}:{intersections:[],overlaps:[],count:0}}if(i instanceof K&&t instanceof et||t instanceof K&&i instanceof et){const s=Tt(i,t);return{intersections:s,overlaps:[],count:s.length}}if(i instanceof et&&t instanceof et){const s=Tn(i,t);return s.length?s[0]instanceof et?{intersections:[],overlaps:s,count:s.length}:{intersections:s,overlaps:[],count:s.length}:{intersections:[],overlaps:[],count:0}}throw new Error("Not implemented")}function vs(i){const t=[];for(let e=0;e<i;e++)for(let s=0;s<=e;s++)t.push([e,s]);return t}function*Re(i){for(const[t,e]of vs(i.length))t!==e&&(yield[i[t],i[e]])}class As extends $t{constructor(t,{ignoreChecks:e=!1}={}){super(),st(this,"segments"),st(this,"_boundingBox",null),e||Es(t),this.segments=t}get repr(){return this.segments.map(t=>t.repr).join(`
9
9
  `)+`
10
- `}get info(){return this.repr}get firstPoint(){return this.segments[0].firstPoint}get lastPoint(){return this.segments[this.segments.length-1].lastPoint}get segmentsCount(){return this.segments.length}onStroke(t){return this.segments.some(e=>e.isOnSegment(t))}intersects(t){return this.boundingBox.overlaps(t.boundingBox)?this.segments.some(e=>t.segments.some(s=>Et(e,s).count>0)):!1}overlappingSegments(t){return this.segments.flatMap(e=>t.segments.flatMap(s=>e.boundingBox.overlaps(s.boundingBox)?Et(e,s).overlaps:[]))}get boundingBox(){if(this._boundingBox===null){let t=this.segments[0].boundingBox;this.segments.slice(1).forEach(e=>{t=t.merge(e.boundingBox)}),this._boundingBox=t}return this._boundingBox}[Symbol.for("nodejs.util.inspect.custom")](){return this.repr}}function cn(r,t="Stroke"){ve(r.length).forEach(([e,s])=>{if(e===s)return;const n=r[e],o=r[s],i=Et(n,o),h=Math.max(n.precision,o.precision);if(i.count!==0){if(i.count===1&&!i.overlaps.length){const l=e-s,a=i.intersections[0];if(l===1&&b(n.firstPoint,a,h)||l===-1&&b(n.lastPoint,a,h)||l===r.length-1&&b(n.lastPoint,a,h)&&b(o.firstPoint,a,h)||-l===r.length-1&&b(n.firstPoint,a,h)&&b(o.lastPoint,a,h))return}if(!(i.count===2&&r.length===2&&(b(n.firstPoint,i.intersections[0],h)&&b(n.lastPoint,i.intersections[1],h)||b(n.firstPoint,i.intersections[1],h)&&b(n.lastPoint,i.intersections[0],h))))throw new Error(`${t} segments must not intersect, but segments ${n.info} and ${o.info} do at ${JSON.stringify(i.intersections)}`)}})}function Se(r,t="Stroke"){if(r.length===0)throw new Error(`${t} must have at least one segment`);Z([r.slice(0,-1),r.slice(1)]).forEach(([e,s])=>{if(!b(e.lastPoint,s.firstPoint))throw new Error(`${t} segments must be connected, but ${e.info} and ${s.info} are not`)}),cn(r,t)}function ke(r,t){return!!(r instanceof v&&t instanceof v&&Dt(r.V,t.V)||r instanceof S&&t instanceof S&&b(r.center,t.center)&&r.radius-t.radius<r.precision)}function Re(r,t){if(r instanceof v&&t instanceof v)return new v(r.firstPoint,t.lastPoint);if(r instanceof S&&t instanceof S)return new S(r.firstPoint,t.lastPoint,r.center,r.clockwise);throw new Error("Not implemented")}function Te(r){let t=!1;const e=[];for(const s of r.segments){if(e.length===0){e.push(s);continue}const n=e[e.length-1];ke(n,s)?(t=!0,e.pop(),e.push(Re(n,s))):e.push(s)}if(b(r.firstPoint,r.lastPoint)&&ke(e[0],e[e.length-1])){t=!0;const s=e.pop();e[0]=Re(s,e[0])}return t?e:null}let rt=class Mt extends Ae{constructor(){super(...arguments),this.strokeType="STRAND"}reverse(){const t=this.segments.map(e=>e.reverse());return t.reverse(),new Mt(t,{ignoreChecks:!0})}clone(){return new Mt(this.segments.map(t=>t.clone()),{ignoreChecks:!0})}extend(t){if(!b(this.lastPoint,t.firstPoint))throw console.error(this.repr,t.repr),new Error("Cannot extend strand: connection point is not the same");return new Mt([...this.segments,...t.segments])}simplify(){const t=Te(this);return t?new Mt(t,{ignoreChecks:!0}):this}transform(t){return new Mt(this.segments.map(e=>e.transform(t)),{ignoreChecks:!0})}};const fn=(r,t)=>{const e=$t(t,{V:[1,0],firstPoint:r,precision:t.precision});if(e==="parallel")return 0;const{intersectionParam1:s,intersectionParam2:n}=e;if(!t.isValidParameter(s)||n<=-t.precision)return 0;if(Math.abs(s)<t.precision||Math.abs(s-1)<t.precision){const[,o]=t.midPoint;return r[1]-o<0?1:0}return 1};class $e{constructor(t){this._count=0,this.segment=t}update(t,e=!1){!e&&!this.segment.isOnSegment(t)||(b(t,this.segment.firstPoint)?this._count+=this.segment.tangentAtFirstPoint[1]>0?1:0:b(t,this.segment.lastPoint)?this._count+=this.segment.tangentAtLastPoint[1]>0?0:1:this._count+=1)}get count(){return this._count}}const mn=(r,t)=>{const e=t.precision,s=Math.abs(r[1]-t.center[1]);if(s>t.radius+e)return 0;const n=Pt(r,t.center),o=t.radius*t.radius,i=e*e;if(Math.abs(n-o)<i&&t.isOnSegment(r))return 0;const h=n-o>i;if(h&&t.center[0]<r[0])return 0;const l=Math.sqrt(t.radius*t.radius-s*s),a=new $e(t);return a.update([t.center[0]+l,r[1]]),h&&a.update([t.center[0]-l,r[1]]),a.count},gn=(r,t)=>{const e=t.boundingBox.xMax+t.boundingBox.width/2,s=new v(r,[e,r[1]]),n=new $e(t);return Wt(s,t).forEach(o=>{n.update(o,!0)}),n.count};function pn(r,t){if(t instanceof v)return fn(r,t);if(t instanceof S)return mn(r,t);if(t instanceof U)return gn(r,t);throw new Error("Not implemented")}class G extends Ae{constructor(t,{ignoreChecks:e=!1}={}){super(t,{ignoreChecks:!0}),this.strokeType="LOOP",this._clockwise=null,e||wn(t)}get clockwise(){if(this._clockwise===null){const t=this.segments.flatMap(s=>s instanceof v?[s.firstPoint]:[s.firstPoint,s.paramPoint(.5)]),e=t.map((s,n)=>{const o=t[(n+1)%t.length];return(o[0]-s[0])*(o[1]+s[1])}).reduce((s,n)=>s+n,0);this._clockwise=e>0}return this._clockwise}clone(){return new G(this.segments.map(t=>t.clone()),{ignoreChecks:!0})}reverse(){const t=this.segments.map(e=>e.reverse());return t.reverse(),new G(t,{ignoreChecks:!0})}transform(t){return new G(this.segments.map(e=>e.transform(t)),{ignoreChecks:!0})}contains(t){return this.onStroke(t)||!this.boundingBox.contains(t)?!1:this.segments.reduce((e,s)=>e+pn(t,s),0)%2===1}simplify(){const t=Te(this);return t?new G(t,{ignoreChecks:!0}):this}}function wn(r){if(Se(r,"Loop"),!b(r[0].firstPoint,r[r.length-1].lastPoint))throw new Error("Loop segment must be closed")}function _e(r){if(r instanceof v)return{type:r.segmentType,firstPoint:r.firstPoint,lastPoint:r.lastPoint};if(r instanceof S)return{type:r.segmentType,firstPoint:r.firstPoint,lastPoint:r.lastPoint,center:r.center,clockwise:r.clockwise};if(r instanceof U)return{type:r.segmentType,firstPoint:r.firstPoint,lastPoint:r.lastPoint,center:r.center,clockwise:r.clockwise,majorRadius:r.majorRadius,minorRadius:r.minorRadius,tiltAngle:r.tiltAngle};throw new Error("Unknown segment type")}function Ht(r){return{type:"LOOP",segments:r.segments.map(_e)}}function Fe(r){return{type:"FIGURE",contour:Ht(r.contour),holes:r.holes.map(Ht)}}function dn(r){return{type:"DIAGRAM",figures:r.figures.map(Fe)}}function Ie(r){if(r instanceof St)return dn(r);if(r instanceof D)return Fe(r);if(r instanceof G)return Ht(r);if(r instanceof S||r instanceof v)return _e(r);throw new Error("Unknown shape type")}class yn{constructor(){this.ids=[],this.values=[],this.length=0}clear(){this.length=0}push(t,e){let s=this.length++;for(;s>0;){const n=s-1>>1,o=this.values[n];if(e>=o)break;this.ids[s]=this.ids[n],this.values[s]=o,s=n}this.ids[s]=t,this.values[s]=e}pop(){if(this.length===0)return;const t=this.ids[0];if(this.length--,this.length>0){const e=this.ids[0]=this.ids[this.length],s=this.values[0]=this.values[this.length],n=this.length>>1;let o=0;for(;o<n;){let i=(o<<1)+1;const h=i+1;let l=this.ids[i],a=this.values[i];const c=this.values[h];if(h<this.length&&c<a&&(i=h,l=this.ids[h],a=c),a>=s)break;this.ids[o]=l,this.values[o]=a,o=i}this.ids[o]=e,this.values[o]=s}return t}peek(){if(this.length!==0)return this.ids[0]}peekValue(){if(this.length!==0)return this.values[0]}shrink(){this.ids.length=this.values.length=this.length}}const Le=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],Jt=3;class Kt{static from(t){if(!t||t.byteLength===void 0||t.buffer)throw new Error("Data must be an instance of ArrayBuffer or SharedArrayBuffer.");const[e,s]=new Uint8Array(t,0,2);if(e!==251)throw new Error("Data does not appear to be in a Flatbush format.");if(s>>4!==Jt)throw new Error(`Got v${s>>4} data when expected v${Jt}.`);const[n]=new Uint16Array(t,2,1),[o]=new Uint32Array(t,4,1);return new Kt(o,n,Le[s&15],void 0,t)}constructor(t,e=16,s=Float64Array,n=ArrayBuffer,o){if(t===void 0)throw new Error("Missing required argument: numItems.");if(isNaN(t)||t<=0)throw new Error(`Unexpected numItems value: ${t}.`);this.numItems=+t,this.nodeSize=Math.min(Math.max(+e,2),65535);let i=t,h=i;this._levelBounds=[i*4];do i=Math.ceil(i/this.nodeSize),h+=i,this._levelBounds.push(h*4);while(i!==1);this.ArrayType=s||Float64Array,this.IndexArrayType=h<16384?Uint16Array:Uint32Array;const l=Le.indexOf(this.ArrayType),a=h*4*this.ArrayType.BYTES_PER_ELEMENT;if(l<0)throw new Error(`Unexpected typed array class: ${s}.`);o&&o.byteLength!==void 0&&!o.buffer?(this.data=o,this._boxes=new this.ArrayType(this.data,8,h*4),this._indices=new this.IndexArrayType(this.data,8+a,h),this._pos=h*4,this.minX=this._boxes[this._pos-4],this.minY=this._boxes[this._pos-3],this.maxX=this._boxes[this._pos-2],this.maxY=this._boxes[this._pos-1]):(this.data=new n(8+a+h*this.IndexArrayType.BYTES_PER_ELEMENT),this._boxes=new this.ArrayType(this.data,8,h*4),this._indices=new this.IndexArrayType(this.data,8+a,h),this._pos=0,this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,new Uint8Array(this.data,0,2).set([251,(Jt<<4)+l]),new Uint16Array(this.data,2,1)[0]=e,new Uint32Array(this.data,4,1)[0]=t),this._queue=new yn}add(t,e,s,n){const o=this._pos>>2,i=this._boxes;return this._indices[o]=o,i[this._pos++]=t,i[this._pos++]=e,i[this._pos++]=s,i[this._pos++]=n,t<this.minX&&(this.minX=t),e<this.minY&&(this.minY=e),s>this.maxX&&(this.maxX=s),n>this.maxY&&(this.maxY=n),o}finish(){if(this._pos>>2!==this.numItems)throw new Error(`Added ${this._pos>>2} items when expected ${this.numItems}.`);const t=this._boxes;if(this.numItems<=this.nodeSize){t[this._pos++]=this.minX,t[this._pos++]=this.minY,t[this._pos++]=this.maxX,t[this._pos++]=this.maxY;return}const e=this.maxX-this.minX||1,s=this.maxY-this.minY||1,n=new Uint32Array(this.numItems),o=(1<<16)-1;for(let i=0,h=0;i<this.numItems;i++){const l=t[h++],a=t[h++],c=t[h++],u=t[h++],m=Math.floor(o*((l+c)/2-this.minX)/e),p=Math.floor(o*((a+u)/2-this.minY)/s);n[i]=bn(m,p)}Qt(n,t,this._indices,0,this.numItems-1,this.nodeSize);for(let i=0,h=0;i<this._levelBounds.length-1;i++){const l=this._levelBounds[i];for(;h<l;){const a=h;let c=t[h++],u=t[h++],m=t[h++],p=t[h++];for(let g=1;g<this.nodeSize&&h<l;g++)c=Math.min(c,t[h++]),u=Math.min(u,t[h++]),m=Math.max(m,t[h++]),p=Math.max(p,t[h++]);this._indices[this._pos>>2]=a,t[this._pos++]=c,t[this._pos++]=u,t[this._pos++]=m,t[this._pos++]=p}}}search(t,e,s,n,o){if(this._pos!==this._boxes.length)throw new Error("Data not yet indexed - call index.finish().");let i=this._boxes.length-4;const h=[],l=[];for(;i!==void 0;){const a=Math.min(i+this.nodeSize*4,Be(i,this._levelBounds));for(let c=i;c<a;c+=4){if(s<this._boxes[c]||n<this._boxes[c+1]||t>this._boxes[c+2]||e>this._boxes[c+3])continue;const u=this._indices[c>>2]|0;i>=this.numItems*4?h.push(u):(o===void 0||o(u))&&l.push(u)}i=h.pop()}return l}neighbors(t,e,s=1/0,n=1/0,o){if(this._pos!==this._boxes.length)throw new Error("Data not yet indexed - call index.finish().");let i=this._boxes.length-4;const h=this._queue,l=[],a=n*n;for(;i!==void 0;){const c=Math.min(i+this.nodeSize*4,Be(i,this._levelBounds));for(let u=i;u<c;u+=4){const m=this._indices[u>>2]|0,p=Ce(t,this._boxes[u],this._boxes[u+2]),g=Ce(e,this._boxes[u+1],this._boxes[u+3]),d=p*p+g*g;i>=this.numItems*4?h.push(m<<1,d):(o===void 0||o(m))&&h.push((m<<1)+1,d)}for(;h.length&&h.peek()&1;)if(h.peekValue()>a||(l.push(h.pop()>>1),l.length===s))return h.clear(),l;i=h.pop()>>1}return h.clear(),l}}function Ce(r,t,e){return r<t?t-r:r<=e?0:r-e}function Be(r,t){let e=0,s=t.length-1;for(;e<s;){const n=e+s>>1;t[n]>r?s=n:e=n+1}return t[e]}function Qt(r,t,e,s,n,o){if(Math.floor(s/o)>=Math.floor(n/o))return;const i=r[s+n>>1];let h=s-1,l=n+1;for(;;){do h++;while(r[h]<i);do l--;while(r[l]>i);if(h>=l)break;Mn(r,t,e,h,l)}Qt(r,t,e,s,l,o),Qt(r,t,e,l+1,n,o)}function Mn(r,t,e,s,n){const o=r[s];r[s]=r[n],r[n]=o;const i=4*s,h=4*n,l=t[i],a=t[i+1],c=t[i+2],u=t[i+3];t[i]=t[h],t[i+1]=t[h+1],t[i+2]=t[h+2],t[i+3]=t[h+3],t[h]=l,t[h+1]=a,t[h+2]=c,t[h+3]=u;const m=e[s];e[s]=e[n],e[n]=m}function bn(r,t){let e=r^t,s=65535^e,n=65535^(r|t),o=r&(t^65535),i=e|s>>1,h=e>>1^e,l=n>>1^s&o>>1^n,a=e&n>>1^o>>1^o;e=i,s=h,n=l,o=a,i=e&e>>2^s&s>>2,h=e&s>>2^s&(e^s)>>2,l^=e&n>>2^s&o>>2,a^=s&n>>2^(e^s)&o>>2,e=i,s=h,n=l,o=a,i=e&e>>4^s&s>>4,h=e&s>>4^s&(e^s)>>4,l^=e&n>>4^s&o>>4,a^=s&n>>4^(e^s)&o>>4,e=i,s=h,n=l,o=a,l^=e&n>>8^s&o>>8,a^=s&n>>8^(e^s)&o>>8,e=l^l>>1,s=a^a>>1;let c=r^t,u=s|65535^(c|e);return c=(c|c<<8)&16711935,c=(c|c<<4)&252645135,c=(c|c<<2)&858993459,c=(c|c<<1)&1431655765,u=(u|u<<8)&16711935,u=(u|u<<4)&252645135,u=(u|u<<2)&858993459,u=(u|u<<1)&1431655765,(u<<1|c)>>>0}function je(r,t=1e-7){if(r.length===0)return[];if(r.length===1)return[r];const e=new Kt(r.length);r.forEach(o=>{const[i,h]=o.firstPoint;e.add(i-t,h-t,i+t,h+t)}),e.finish();const s=[],n=new Set;return r.forEach((o,i)=>{if(n.has(i))return;const h=[o];let l=i;n.add(i);let a=r.length;for(;;){if(a--<0)throw new Error("Infinite loop detected");const c=h[h.length-1].lastPoint,[u,m]=c,p=e.search(u-t,m-t,u+t,m+t),g=w=>Math.abs((l-w)%r.length),d=p.filter(w=>!n.has(w)).map(w=>[r[w],w,g(w)]).sort(([,,w],[,,y])=>g(w)-g(y));if(d.length===0){s.push(h);break}const[M,f]=d[0];h.push(M),n.add(f),l=f}}),s}let D=class zt extends lt{constructor(t,e=[],{ignoreChecks:s=!1}={}){super(),s||Pn(t,e),this.contour=t,this.holes=e}get boundingBox(){return this.contour.boundingBox}get isFull(){return this.holes.length===0}get allLoops(){return[this.contour,...this.holes]}clone(){return new zt(this.contour.clone(),this.holes.map(t=>t.clone()))}transform(t){return new zt(this.contour.transform(t),this.holes.map(e=>e.transform(t)))}contains(t){return this.contour.contains(t)&&!this.holes.some(e=>e.contains(t))}intersects(t){return this.allLoops.some(e=>t.allLoops.some(s=>e.intersects(s)))}overlappingStrands(t){const e=t instanceof zt?t.allLoops:[t],s=this.allLoops.flatMap(n=>e.flatMap(o=>n.overlappingSegments(o)));return je(s).map(n=>new rt(n))}};function Pn(r,t=[]){if(!r)throw new Error("Figure must have a contour");for(const[e,s]of Gt([r,...t]))if(e.intersects(s))throw new Error("Loops in a figure must not intersect");if(t.some(e=>!r.contains(e.firstPoint)&&!r.onStroke(e.firstPoint)))throw new Error("Holes must be inside the contour");for(const[e,s]of Gt(t))if(e.contains(s.firstPoint))throw console.error(Ie(e),Ie(s)),new Error("Holes must not be inside other holes")}const xn=r=>{const t=r.map((n,o)=>r.slice(o+1).map((i,h)=>[h+o+1,i]).filter(([,i])=>n.boundingBox.overlaps(i.boundingBox)).map(([i])=>i)),e=[],s=Array(t.length);return t.forEach((n,o)=>{let i=s[o];i||(i=[],e.push(i)),i.push(r[o]),n.length&&n.forEach(h=>{s[h]=i})}),e},Ve=r=>r.map((t,e)=>{const s=t.segments[0].midPoint,n=r.filter((o,i)=>e===i?!1:o.contains(s));return{loop:t,isIn:n}}),En=(r,t)=>r.flatMap(({loop:e})=>Zt(t.filter(({loop:s,isIn:n})=>s===e||n.indexOf(e)!==-1))),vn=(r,t)=>{const e=t.filter(({isIn:n})=>n.length<=1),s=Zt(Ve(r.map(({loop:n})=>n)));return[e,...s]},Zt=r=>{if(!r.length)return[];const t=r.filter(({isIn:s})=>!s.length),e=r.filter(({isIn:s})=>s.length>1);return t.length===1&&e.length===0?[r]:t.length>1?En(t,r):vn(e,r)};function vt(r){return xn(r).map(Ve).flatMap(Zt).map(t=>{if(t.length===1)return new D(t[0].loop);t.sort((n,o)=>n.isIn.length-o.isIn.length);const[e,...s]=t.map(({loop:n})=>n);return new D(e,s)})}function An(r,t){const e=[];for(const s of r)for(const n of t)e.push([s,n]);return e}function*te(r,t,e){const s=i=>t.some(h=>b(h,i.lastPoint)),n=i=>e.some(h=>i.isSame(h));let o=[];for(const i of r)s(i)?(o.push(i),yield new rt(o,{ignoreChecks:!0}),o=[]):n(i)?(o.length&&(yield new rt(o,{ignoreChecks:!0}),o=[]),yield new rt([i],{ignoreChecks:!0})):o.push(i);o.length&&(yield new rt(o,{ignoreChecks:!0}))}const Ne=(r,t)=>{const e=r.findIndex(n=>b(t,n.firstPoint)),s=r.slice(0,e);return r.slice(e).concat(s)},qe=(r,t)=>{let e=r;const s=i=>b(i.firstPoint,t.firstPoint)&&b(i.lastPoint,t.lastPoint);let n=r.findIndex(s);if(n===-1){const i=r.map(h=>h.reverse());if(i.reverse(),n=i.findIndex(s),n===-1)throw console.error(i.map(h=>h.repr),t.repr),new Error("Failed to rotate to segment start");e=i}const o=e.slice(0,n);return e.slice(n).concat(o)};function Sn(r,t,e){return r.filter(s=>{const n=t.filter(i=>b(i.firstPoint,s)||b(i.lastPoint,s));if(n.length%2)throw new Error("Bug in the intersection algo on non crossing point");const o=n.map(i=>e.contains(i.midPoint));return!(o.every(i=>i)||!o.some(i=>i))})}function kn(r,t,e){let s=[];const n=[],o=new Array(r.segments.length).fill(0).map(()=>[]),i=new Array(t.segments.length).fill(0).map(()=>[]);if(r.segments.forEach((m,p)=>{t.segments.forEach((g,d)=>{const{intersections:M,overlaps:f}=Et(m,g,e);s.push(...M),o[p].push(...M),i[d].push(...M),n.push(...f);const w=f.flatMap(y=>[y.firstPoint,y.lastPoint]);s.push(...w),o[p].push(...w),i[d].push(...w)})}),s=it(s,e),!s.length||s.length===1)return null;const h=([m,p])=>p.length?m.splitAt(p):[m];let l=Z([r.segments,o]).flatMap(h),a=Z([t.segments,i]).flatMap(h);if(s=Sn(s,l,t),!s.length&&!n.length)return null;if(n.length){const m=n[0];l=qe(l,m),a=qe(a,m)}else{const m=s[0];l=Ne(l,m),a=Ne(a,m)}let c=Array.from(te(l,s,n)),u=Array.from(te(a,s,n));return(!b(u[0].lastPoint,c[0].lastPoint)||n.length>0&&u[0].segmentsCount!==1)&&(u=u.map(m=>m.reverse()).reverse(),b(u[0].lastPoint,c[0].lastPoint)||(c=c.map(m=>m.reverse()).reverse())),Z([c,u]).map(([m,p])=>m.segmentsCount===1&&n.some(g=>m.segments[0].isSame(g))?[m,"same"]:[m,p])}function Oe(r){let t=r[0];for(const e of r.slice(1))t=t.extend(e);if(!b(t.firstPoint,t.lastPoint))throw console.error(F(t.firstPoint),F(t.lastPoint)),new Error("Bug in the intersection algo on non closing strand");return new G(t.segments)}function Rn(r,t){const e=Z([t.slice(0,-1),t.slice(1)]).map(([n,o])=>Oe(r.slice(n,o)));let s=r.slice(t[t.length-1]);return t[0]!==0&&(s=s.concat(r.slice(0,t[0]))),e.push(Oe(s)),e}function Tn(r){if(!r.length)return[];const t=r.map(n=>n.firstPoint);let e=r.map(n=>n.lastPoint);e=e.slice(-1).concat(e.slice(0,-1));const s=Z([t,e]).flatMap(([n,o],i)=>b(n,o)?[]:i);try{return Rn(r,s)}catch{return je(r.flatMap(n=>n.segments)).filter(n=>n.length>1).filter(n=>b(n[0].firstPoint,n.at(-1).lastPoint)).map(n=>new G(n))}}const ze=(r,t)=>{if(r.length===0)return[t];const e=r.at(-1);return b(e.lastPoint,t.firstPoint)?r.slice(0,-1).concat([e.extend(t)]):b(e.lastPoint,t.lastPoint)?r.slice(0,-1).concat([e.extend(t.reverse())]):r.concat([t])},$n=(r,t)=>r.length===0?[t]:b(r[0].firstPoint,t.lastPoint)?[t.extend(r[0])].concat(r.slice(1)):[t].concat(r);function ee(r,t,{firstInside:e,secondInside:s}){const n=kn(r,t);if(!n){const l=r.segments[0].midPoint,a=t.contains(l),c=t.segments[0].midPoint,u=r.contains(c);return{identical:!1,firstCurveInSecond:a,secondCurveInFirst:u}}if(n.every(([,l])=>l==="same"))return{identical:!0};let o=null,i=null;const h=n.flatMap(([l,a])=>{let c=[],u=0;if(a==="same")return i===1?(i=1,l):i===2||i===0?(i=null,[]):i===null?(o?o=o.extend(l):o=l,[]):(console.error("weird situation"),[]);const m=l.segments[0].midPoint,p=t.contains(m);(e==="keep"&&p||e==="remove"&&!p)&&(u+=1,c=ze(c,l));const g=a.segments[0].midPoint,d=r.contains(g);if(s==="keep"&&d||s==="remove"&&!d){const M=a;u+=1,u===2&&c.length?(c=ze(c,M),o=null):c=[M]}return i===null&&u===1&&o&&(c=$n(c,o)),u===1&&(i=u,o=null),c.length?c:(o=null,[])});return Tn(h)}const _n=(r,t)=>{const e=ee(r,t,{firstInside:"remove",secondInside:"remove"});return Array.isArray(e)?e:e.identical?[r]:e.firstCurveInSecond?[t]:e.secondCurveInFirst?[r]:[r,t]},jt=(r,t)=>{const e=ee(r,t,{firstInside:"remove",secondInside:"keep"});return Array.isArray(e)?e:e.identical?[]:e.firstCurveInSecond?[]:e.secondCurveInFirst?[r,t]:[r]},se=(r,t)=>{const e=ee(r,t,{firstInside:"keep",secondInside:"keep"});return Array.isArray(e)?e:e.identical?[r]:e.firstCurveInSecond?[r]:e.secondCurveInFirst?[t]:[]};function Fn(r){const t=new Map,e=[];return r.forEach((s,n)=>{let o;t.has(n)?o=t.get(n):(o={current:[s],fusedWith:new Set([n])},e.push(o)),r.slice(n+1).forEach((i,h)=>{const l=o.current,a=n+h+1;if(o.fusedWith.has(a))return;let c=[i],u=!1;if(t.has(a)&&(c=t.get(a).current,u=!0),!l.some(p=>c.some(g=>p.intersects(g))))return;let m;l.length>1||c.length>1?m=At(l,c):m=Ue(l[0],c[0]),o.fusedWith.add(a),o.current=m,u||t.set(a,o)})}),e.flatMap(({current:s})=>s)}function Ue(r,t){const e=_n(r.contour,t.contour),s=t.holes.flatMap(i=>jt(i,r.contour)),n=r.holes.flatMap(i=>jt(i,t.contour)),o=An(r.holes,t.holes).flatMap(([i,h])=>se(i,h));return vt([...e,...s,...n,...o])}function Vt(r,t){if(r.isFull&&t.isFull)return vt(jt(r.contour,t.contour));if(r.isFull){const s=jt(r.contour,t.contour),n=t.holes.flatMap(o=>se(o,r.contour));return vt([...s,...n])}else if(t.isFull&&!r.contour.intersects(t.contour))if(r.contour.contains(t.contour.firstPoint)){const s=At(r.holes.map(n=>new D(n)),[t]);return vt([r.contour,...s.flatMap(n=>n.allLoops)])}else return[r];let e=Vt(new D(r.contour),t);return r.holes.forEach(s=>{e=e.flatMap(n=>Vt(n,new D(s)))}),e}function In(r,t){const e=se(r.contour,t.contour);if(!e.length)return[];let s=vt(e);return s=wt(s,r.holes.map(n=>new D(n))),wt(s,t.holes.map(n=>new D(n)))}function At(r,t){if(!r.length)return t;if(!t.length)return r;if(r.length===1&&t.length>1||t.length===1&&r.length>1)return Fn([...r,...t]);if(r.length>1&&t.length>1){let e=At([r[0]],t);return r.slice(1).forEach(s=>{e=At([s],e)}),e}return r.length===1&&t.length===1?Ue(r[0],t[0]):[]}function wt(r,t){if(!r.length)return[];if(!t.length)return r;if(r.length===1&&t.length===1)return Vt(r[0],t[0]);if(r.length>1)return r.flatMap(s=>wt([s],t));let e=Vt(r[0],t[0]);return t.slice(1).forEach(s=>{e=wt(e,[s])}),e}function ne(r,t){return!r.length||!t.length?[]:r.length===1&&t.length===1?In(r[0],t[0]):r.length>1?r.flatMap(e=>ne([e],t)):t.flatMap(e=>ne(r,[e]))}let St=class ct extends lt{constructor(t=[],{ignoreChecks:e=!1}={}){super(),this._boundingBox=null,e||Ln(t),this.figures=t}get isEmpty(){return this.figures.length===0}get boundingBox(){if(this.isEmpty)return new ot;if(this._boundingBox===null){let t=this.figures[0].boundingBox;for(const e of this.figures.slice(1))t=t.merge(e.boundingBox);this._boundingBox=t}return this._boundingBox}clone(){return new ct(this.figures.map(t=>t.clone()))}transform(t){return new ct(this.figures.map(e=>e.transform(t)))}contains(t){return this.figures.some(e=>e.contains(t))}intersects(t){return this.figures.some(e=>t.figures.some(s=>e.intersects(s)))}overlappingStrands(t){return this.figures.flatMap(e=>t instanceof ct?t.figures.flatMap(s=>e.overlappingStrands(s)):e.overlappingStrands(t))}fuse(t){return new ct(At(this.figures,t.figures))}cut(t){return new ct(wt(this.figures,t.figures))}intersect(t){return new ct(ne(this.figures,t.figures))}};function Ln(r){for(const[t,e]of Gt(r))if(t.intersects(e))throw new Error("Diagram figures must not intersect")}class re{constructor(t,e){this.firstPoint=t,this.lastPoint=e}}function Ye(r,t){if(r instanceof v)return Cn(r,t);if(r instanceof S)return Bn(r,t);throw new Error("Not implemented")}function Cn(r,t){const{firstPoint:e,lastPoint:s}=r,n=r.normalVector;return new v($(e,I(n,t)),$(s,I(n,t)))}function Bn(r,t){const e=$(r.firstPoint,I(O(r.tangentAtFirstPoint),t)),s=$(r.lastPoint,I(O(r.tangentAtLastPoint),t)),n=t*(r.clockwise?1:-1);return r.radius+n<r.precision?new re(e,s):new S(e,s,r.center,r.clockwise)}function De(r,t,e){const s=ht(r.tangentAtLastPoint,t.tangentAtFirstPoint);if(Math.abs(s)<1e-10)return null;const n=s>0?1:-1,o=Math.abs(e)*n,i=Ye(r,o),h=Ye(t,o);if(i instanceof re||h instanceof re)return null;let l;try{l=un(i,h,1e-9).at(-1)}catch{return null}if(!l)return null;const a=l,c=(p,g)=>{const d=g.tangentAt(a),M=xt(d),f=$(a,I(M,o));return p.splitAt(f)},[u]=c(r,i),[,m]=c(t,h);return{first:u,second:m,center:a}}function Xe(r,t,e){const s=De(r,t,e);if(!s)return console.warn("Cannot fillet between segments",r.repr,t.repr),[r,t];const{first:n,second:o}=s;return[n,fe(n.lastPoint,o.firstPoint,n.tangentAtLastPoint),o]}function We(r,t,e){const s=De(r,t,e);if(!s)return console.warn("Cannot chamfer between segments",r.repr,t.repr),[r,t];const{first:n,second:o}=s;return[n,new v(n.lastPoint,o.firstPoint),o]}function Ge(r,{ignoreChecks:t=!1}={}){return new St([new D(new G([...r],{ignoreChecks:t}))])}let jn=class{constructor(t=[0,0]){this.pointer=t,this.firstPoint=t,this.pendingSegments=[],this._nextCorner=null}movePointerTo(t){if(this.pendingSegments.length)throw new Error("You can only move the pointer if there is no segment defined");return this.pointer=t,this.firstPoint=t,this}saveSegment(t){if(b(t.firstPoint,t.lastPoint))throw new Error(`Segment has no length, ${t.repr}`);if(!this._nextCorner)return this.pendingSegments.push(t),this;const e=this.pendingSegments.pop();if(!e)throw new Error("bug in the custom corner algorithm");const s=this._nextCorner.mode==="chamfer"?We:Xe;return this.pendingSegments.push(...s(e,t,this._nextCorner.radius)),this._nextCorner=null,this}lineTo(t){const e=new v(this.pointer,t);return this.pointer=t,this.saveSegment(e)}line(t,e){return this.lineTo([this.pointer[0]+t,this.pointer[1]+e])}vLine(t){return this.line(0,t)}hLine(t){return this.line(t,0)}vLineTo(t){return this.lineTo([this.pointer[0],t])}hLineTo(t){return this.lineTo([t,this.pointer[1]])}polarLineTo([t,e]){const s=e*bt,n=at(t,s);return this.lineTo(n)}polarLine(t,e){const s=e*bt,[n,o]=at(t,s);return this.line(n,o)}tangentLine(t){const e=this.pendingSegments.at(-1);if(!e)throw new Error("You need a previous segment to sketch a tangent line");const[s,n]=e.tangentAtLastPoint;return this.line(s*t,n*t)}threePointsArcTo(t,e){return this.saveSegment(Ms(this.pointer,e,t)),this.pointer=t,this}threePointsArc(t,e,s,n){const[o,i]=this.pointer;return this.threePointsArcTo([o+t,i+e],[o+s,i+n])}sagittaArcTo(t,e){if(!e)return this.lineTo(t);const s=new v(this.pointer,t),n=O(s.tangentAtFirstPoint),o=$(s.midPoint,I(n,e));return this.threePointsArcTo(t,o)}sagittaArc(t,e,s){return this.sagittaArcTo([t+this.pointer[0],e+this.pointer[1]],s)}vSagittaArc(t,e){return this.sagittaArc(0,t,e)}hSagittaArc(t,e){return this.sagittaArc(t,0,e)}bulgeArcTo(t,e){if(!e)return this.lineTo(t);const s=B(this.pointer,t)/2,n=-e*s;return this.sagittaArcTo(t,n)}bulgeArc(t,e,s){return this.bulgeArcTo([t+this.pointer[0],e+this.pointer[1]],s)}vBulgeArc(t,e){return this.bulgeArc(0,t,e)}hBulgeArc(t,e){return this.bulgeArc(t,0,e)}tangentArcTo(t,e){const s=this.pendingSegments.at(-1);if(!s)throw new Error("You need a previous curve to sketch a tangent arc");return this.saveSegment(fe(this.pointer,t,e??s.tangentAtLastPoint)),this.pointer=t,this}tangentArc(t,e,s){const[n,o]=this.pointer;return this.tangentArcTo([t+n,e+o],s)}ellipseTo(t,e,s,n,o,i){return this.saveSegment(Es(this.pointer,t,e,s,n,o,i)),this.pointer=t,this}ellipse(t,e,s,n,o,i,h){return this.ellipseTo([t+this.pointer[0],e+this.pointer[1]],s,n,o,i,h)}halfEllipseTo(t,e){const[s,n]=ue(j(t,this.pointer));return this.ellipseTo(t,s/2,Math.abs(e),n*Ut,!0,e>0)}halfEllipse(t,e,s){return this.halfEllipseTo([t+this.pointer[0],e+this.pointer[1]],s)}customCorner(t,e="fillet"){if(!this.pendingSegments.length)throw new Error("You need a segment defined to fillet the angle");return t?(this._nextCorner={mode:e,radius:t},this):this}_customCornerLastWithFirst(t,e="fillet"){if(!t)return;const s=this.pendingSegments.pop(),n=this.pendingSegments.shift();if(!s||!n)throw new Error("Not enough curves to close and fillet");const o=e==="chamfer"?We:Xe;this.pendingSegments.push(...o(s,n,t))}close(t=!1){if(!this.pendingSegments.length)throw new Error("No segments to close");const e=this.pendingSegments[0],s=this.pendingSegments.at(-1);return b(e.firstPoint,s.lastPoint)||this.lineTo(e.firstPoint),this._nextCorner!==null&&(this._customCornerLastWithFirst(this._nextCorner.radius,this._nextCorner.mode),this._nextCorner=null),Ge(this.pendingSegments,{ignoreChecks:t})}closeWithMirror(t=!1){if(!this.pendingSegments.length)throw new Error("No segments to close");const e=this.pendingSegments[0],s=this.pendingSegments.at(-1),n=j(s.lastPoint,e.firstPoint),o=new z().mirrorLine(n,e.firstPoint),i=this.pendingSegments.map(h=>h.transform(o).reverse());return i.reverse(),Ge([...this.pendingSegments,...i],{ignoreChecks:t})}asStrand(){return new rt([...this.pendingSegments])}};function He(r=[0,0]){return new jn(r)}function Je(r){if(r instanceof D)return[r];if(r instanceof G)return[new D(r)];if(r instanceof St)return r.figures;throw new Error("Unknown shape")}function Ke(r,t,e=1e-9){let s=[];const n=[],o=new Array(t.segments.length).fill(0).map(()=>[]);t.segments.forEach((h,l)=>{r.segments.forEach(a=>{const{intersections:c,overlaps:u}=Et(h,a,e);s.push(...c),o[l].push(...c),n.push(...u);const m=u.flatMap(p=>[p.firstPoint,p.lastPoint]);s.push(...m),o[l].push(...m)})}),s=it(s,e);const i=Z([t.segments,o]).flatMap(([h,l])=>l.length?h.splitAt(l):[h]);return Array.from(te(i,s,n))}function Qe(r,t,e=!1){return Ke(t,r).filter(s=>{const n=s.segments[0].midPoint;return t.onStroke(n)?!e:!t.contains(n)})}function Vn(r,t,e=!1){return Ke(t,r).filter(s=>{const n=s.segments[0].midPoint;return t.onStroke(n)?!e:t.contains(n)})}function Ze(r,t,e=!1){const s=Qe(r,t.contour,e),n=t.holes.flatMap(o=>Vn(r,o,e));return[...s,...n]}function Nn(r,t){return new St(wt(Je(r),Je(t)))}function oe(r,t,e=!0){if(t instanceof G)return Qe(r,t,e);if(t instanceof D)return Ze(r,t,e);let s=[new rt([...r.segments])];return t.figures.forEach(n=>{s=s.flatMap(o=>Ze(o,n,e))}),s}function ie(r){if(r instanceof v)return`L ${r.lastPoint.join(" ")}`;if(r instanceof S)return`A ${r.radius} ${r.radius} 0 ${r.angularLength>Math.PI?"1":"0"} ${r.clockwise?"0":"1"} ${r.lastPoint.join(" ")}`;if(r instanceof U)return`A ${r.majorRadius} ${r.minorRadius} ${r.tiltAngle*Ut} ${r.deltaAngle>Math.PI?"1":"0"} ${r.clockwise?"0":"1"} ${r.lastPoint.join(" ")}`;throw new Error("Unknown segment type")}function ts(r){const t=`M ${r.firstPoint.join(" ")}`,e=r.segments.map(ie).join(" ");return`${t} ${e} Z`}function es(r){return`<path d="${r.allLoops.map(ts).join(" ")}" />`}function qn(r){return`<g>
11
- ${r.figures.map(es).join(`
10
+ `}get info(){return this.repr}get firstPoint(){return this.segments[0].firstPoint}get lastPoint(){return this.segments[this.segments.length-1].lastPoint}get segmentsCount(){return this.segments.length}onStroke(t){return this.segments.some(e=>e.isOnSegment(t))}intersects(t){return this.boundingBox.overlaps(t.boundingBox)?this.segments.some(e=>t.segments.some(s=>Gt(e,s).count>0)):!1}overlappingSegments(t){return this.segments.flatMap(e=>t.segments.flatMap(s=>e.boundingBox.overlaps(s.boundingBox)?Gt(e,s).overlaps:[]))}get boundingBox(){if(this._boundingBox===null){let t=this.segments[0].boundingBox;this.segments.slice(1).forEach(e=>{t=t.merge(e.boundingBox)}),this._boundingBox=t}return this._boundingBox}[Symbol.for("nodejs.util.inspect.custom")](){return this.repr}}function Ln(i,t="Stroke"){vs(i.length).forEach(([e,s])=>{if(e===s)return;const n=i[e],r=i[s],o=Gt(n,r),h=Math.max(n.precision,r.precision);if(o.count!==0){if(o.count===1&&!o.overlaps.length){const l=e-s,a=o.intersections[0];if(l===1&&y(n.firstPoint,a,h)||l===-1&&y(n.lastPoint,a,h)||l===i.length-1&&y(n.lastPoint,a,h)&&y(r.firstPoint,a,h)||-l===i.length-1&&y(n.firstPoint,a,h)&&y(r.lastPoint,a,h))return}if(!(o.count===2&&i.length===2&&(y(n.firstPoint,o.intersections[0],h)&&y(n.lastPoint,o.intersections[1],h)||y(n.firstPoint,o.intersections[1],h)&&y(n.lastPoint,o.intersections[0],h))))throw new Error(`${t} segments must not intersect, but segments ${n.info} and ${r.info} do at ${JSON.stringify(o.intersections)}`)}})}function Es(i,t="Stroke"){if(i.length===0)throw new Error(`${t} must have at least one segment`);mt([i.slice(0,-1),i.slice(1)]).forEach(([e,s])=>{if(!y(e.lastPoint,s.firstPoint))throw new Error(`${t} segments must be connected, but ${e.info} and ${s.info} are not`)}),Ln(i,t)}function Ss(i,t){return!!(i instanceof B&&t instanceof B&&Ee(i.V,t.V)||i instanceof L&&t instanceof L&&y(i.center,t.center)&&i.radius-t.radius<i.precision)}function ks(i,t){if(i instanceof B&&t instanceof B)return new B(i.firstPoint,t.lastPoint);if(i instanceof L&&t instanceof L)return new L(i.firstPoint,t.lastPoint,i.center,i.clockwise);throw new Error("Not implemented")}function $s(i){let t=!1;const e=[];for(const s of i.segments){if(e.length===0){e.push(s);continue}const n=e[e.length-1];Ss(n,s)?(t=!0,e.pop(),e.push(ks(n,s))):e.push(s)}if(y(i.firstPoint,i.lastPoint)&&Ss(e[0],e[e.length-1])){t=!0;const s=e.pop();e[0]=ks(s,e[0])}return t?e:null}class ot extends As{constructor(){super(...arguments),st(this,"strokeType","STRAND")}reverse(){const t=this.segments.map(e=>e.reverse());return t.reverse(),new ot(t,{ignoreChecks:!0})}clone(){return new ot(this.segments.map(t=>t.clone()),{ignoreChecks:!0})}extend(t){if(!y(this.lastPoint,t.firstPoint))throw console.error(this.repr,t.repr),new Error("Cannot extend strand: connection point is not the same");return new ot([...this.segments,...t.segments])}simplify(){const t=$s(this);return t?new ot(t,{ignoreChecks:!0}):this}transform(t){return new ot(this.segments.map(e=>e.transform(t)),{ignoreChecks:!0})}}const Bn=(i,t)=>{const e=ee(t,{V:[1,0],firstPoint:i,precision:t.precision});if(e==="parallel")return 0;const{intersectionParam1:s,intersectionParam2:n}=e;if(!t.isValidParameter(s)||n<=-t.precision)return 0;if(Math.abs(s)<t.precision||Math.abs(s-1)<t.precision){const[,r]=t.midPoint;return i[1]-r<0?1:0}return 1};class Te{constructor(t){st(this,"_count",0),st(this,"segment"),this.segment=t}update(t,e=!1){!e&&!this.segment.isOnSegment(t)||(y(t,this.segment.firstPoint)?this._count+=this.segment.tangentAtFirstPoint[1]>0?1:0:y(t,this.segment.lastPoint)?this._count+=this.segment.tangentAtLastPoint[1]>0?0:1:this._count+=1)}get count(){return this._count}}const jn=(i,t)=>{const e=t.precision,s=Math.abs(i[1]-t.center[1]);if(s>t.radius+e)return 0;const n=kt(i,t.center),r=t.radius*t.radius,o=e*e;if(Math.abs(n-r)<o&&t.isOnSegment(i))return 0;const h=n-r>o;if(h&&t.center[0]<i[0])return 0;const l=Math.sqrt(t.radius*t.radius-s*s),a=new Te(t);return a.update([t.center[0]+l,i[1]]),h&&a.update([t.center[0]-l,i[1]]),a.count},qn=(i,t)=>{const e=t.boundingBox.xMax+t.boundingBox.width/2,s=new B(i,[e,i[1]]),n=new Te(t);return $e(s,t).forEach(r=>{n.update(r,!0)}),n.count},Vn=(i,t)=>{const e=new Te(t);return t.paramsAtY(i[1]).map(s=>{try{return t.paramPoint(s)}catch{return null}}).filter(s=>s!==null).filter(s=>{const[n]=s;return n>=i[0]}).forEach(s=>{e.update(s,!0)}),e.count};function On(i,t){if(t instanceof B)return Bn(i,t);if(t instanceof L)return jn(i,t);if(t instanceof J)return qn(i,t);if(t instanceof et||t instanceof K)return Vn(i,t);throw new Error("Not implemented")}class ct extends As{constructor(t,{ignoreChecks:e=!1}={}){super(t,{ignoreChecks:!0}),st(this,"strokeType","LOOP"),st(this,"_clockwise",null),e||Nn(t)}get clockwise(){if(this._clockwise===null){const t=this.segments.flatMap(s=>s instanceof B?[s.firstPoint]:[s.firstPoint,s.paramPoint(.5)]),e=t.map((s,n)=>{const r=t[(n+1)%t.length];return(r[0]-s[0])*(r[1]+s[1])}).reduce((s,n)=>s+n,0);this._clockwise=e>0}return this._clockwise}clone(){return new ct(this.segments.map(t=>t.clone()),{ignoreChecks:!0})}reverse(){const t=this.segments.map(e=>e.reverse());return t.reverse(),new ct(t,{ignoreChecks:!0})}transform(t){return new ct(this.segments.map(e=>e.transform(t)),{ignoreChecks:!0})}contains(t){return this.onStroke(t)||!this.boundingBox.contains(t)?!1:this.segments.reduce((e,s)=>e+On(t,s),0)%2===1}simplify(){const t=$s(this);return t?new ct(t,{ignoreChecks:!0}):this}}function Nn(i){if(Es(i,"Loop"),!y(i[0].firstPoint,i[i.length-1].lastPoint))throw new Error("Loop segment must be closed")}const zn=[B,L,J,K,et];function Cs(i){return zn.some(t=>i instanceof t)}function Rs(i){if(i instanceof B)return{type:i.segmentType,firstPoint:i.firstPoint,lastPoint:i.lastPoint};if(i instanceof L)return{type:i.segmentType,firstPoint:i.firstPoint,lastPoint:i.lastPoint,center:i.center,clockwise:i.clockwise};if(i instanceof J)return{type:i.segmentType,firstPoint:i.firstPoint,lastPoint:i.lastPoint,center:i.center,clockwise:i.clockwise,majorRadius:i.majorRadius,minorRadius:i.minorRadius,tiltAngle:i.tiltAngle};if(i instanceof K)return{type:i.segmentType,firstPoint:i.firstPoint,lastPoint:i.lastPoint,controlPoint:i.controlPoint};if(i instanceof et)return{type:i.segmentType,firstPoint:i.firstPoint,lastPoint:i.lastPoint,firstControlPoint:i.firstControlPoint,lastControlPoint:i.lastControlPoint};throw new Error("Unknown segment type")}function Fe(i){return{type:"LOOP",segments:i.segments.map(Rs)}}function Ts(i){return{type:"FIGURE",contour:Fe(i.contour),holes:i.holes.map(Fe)}}function Un(i){return{type:"DIAGRAM",figures:i.figures.map(Ts)}}function Fs(i){if(i instanceof ft)return Un(i);if(i instanceof ut)return Ts(i);if(i instanceof ct)return Fe(i);if(Cs(i))return Rs(i);throw new Error("Unknown shape type")}class Yn{constructor(){this.ids=[],this.values=[],this.length=0}clear(){this.length=0}push(t,e){let s=this.length++;for(;s>0;){const n=s-1>>1,r=this.values[n];if(e>=r)break;this.ids[s]=this.ids[n],this.values[s]=r,s=n}this.ids[s]=t,this.values[s]=e}pop(){if(this.length===0)return;const t=this.ids[0];if(this.length--,this.length>0){const e=this.ids[0]=this.ids[this.length],s=this.values[0]=this.values[this.length],n=this.length>>1;let r=0;for(;r<n;){let o=(r<<1)+1;const h=o+1;let l=this.ids[o],a=this.values[o];const c=this.values[h];if(h<this.length&&c<a&&(o=h,l=this.ids[h],a=c),a>=s)break;this.ids[r]=l,this.values[r]=a,r=o}this.ids[r]=e,this.values[r]=s}return t}peek(){if(this.length!==0)return this.ids[0]}peekValue(){if(this.length!==0)return this.values[0]}shrink(){this.ids.length=this.values.length=this.length}}const Is=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],Ie=3;class _e{static from(t){if(!t||t.byteLength===void 0||t.buffer)throw new Error("Data must be an instance of ArrayBuffer or SharedArrayBuffer.");const[e,s]=new Uint8Array(t,0,2);if(e!==251)throw new Error("Data does not appear to be in a Flatbush format.");if(s>>4!==Ie)throw new Error(`Got v${s>>4} data when expected v${Ie}.`);const[n]=new Uint16Array(t,2,1),[r]=new Uint32Array(t,4,1);return new _e(r,n,Is[s&15],void 0,t)}constructor(t,e=16,s=Float64Array,n=ArrayBuffer,r){if(t===void 0)throw new Error("Missing required argument: numItems.");if(isNaN(t)||t<=0)throw new Error(`Unexpected numItems value: ${t}.`);this.numItems=+t,this.nodeSize=Math.min(Math.max(+e,2),65535);let o=t,h=o;this._levelBounds=[o*4];do o=Math.ceil(o/this.nodeSize),h+=o,this._levelBounds.push(h*4);while(o!==1);this.ArrayType=s||Float64Array,this.IndexArrayType=h<16384?Uint16Array:Uint32Array;const l=Is.indexOf(this.ArrayType),a=h*4*this.ArrayType.BYTES_PER_ELEMENT;if(l<0)throw new Error(`Unexpected typed array class: ${s}.`);r&&r.byteLength!==void 0&&!r.buffer?(this.data=r,this._boxes=new this.ArrayType(this.data,8,h*4),this._indices=new this.IndexArrayType(this.data,8+a,h),this._pos=h*4,this.minX=this._boxes[this._pos-4],this.minY=this._boxes[this._pos-3],this.maxX=this._boxes[this._pos-2],this.maxY=this._boxes[this._pos-1]):(this.data=new n(8+a+h*this.IndexArrayType.BYTES_PER_ELEMENT),this._boxes=new this.ArrayType(this.data,8,h*4),this._indices=new this.IndexArrayType(this.data,8+a,h),this._pos=0,this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,new Uint8Array(this.data,0,2).set([251,(Ie<<4)+l]),new Uint16Array(this.data,2,1)[0]=e,new Uint32Array(this.data,4,1)[0]=t),this._queue=new Yn}add(t,e,s,n){const r=this._pos>>2,o=this._boxes;return this._indices[r]=r,o[this._pos++]=t,o[this._pos++]=e,o[this._pos++]=s,o[this._pos++]=n,t<this.minX&&(this.minX=t),e<this.minY&&(this.minY=e),s>this.maxX&&(this.maxX=s),n>this.maxY&&(this.maxY=n),r}finish(){if(this._pos>>2!==this.numItems)throw new Error(`Added ${this._pos>>2} items when expected ${this.numItems}.`);const t=this._boxes;if(this.numItems<=this.nodeSize){t[this._pos++]=this.minX,t[this._pos++]=this.minY,t[this._pos++]=this.maxX,t[this._pos++]=this.maxY;return}const e=this.maxX-this.minX||1,s=this.maxY-this.minY||1,n=new Uint32Array(this.numItems),r=65535;for(let o=0,h=0;o<this.numItems;o++){const l=t[h++],a=t[h++],c=t[h++],u=t[h++],f=Math.floor(r*((l+c)/2-this.minX)/e),p=Math.floor(r*((a+u)/2-this.minY)/s);n[o]=Xn(f,p)}Le(n,t,this._indices,0,this.numItems-1,this.nodeSize);for(let o=0,h=0;o<this._levelBounds.length-1;o++){const l=this._levelBounds[o];for(;h<l;){const a=h;let c=t[h++],u=t[h++],f=t[h++],p=t[h++];for(let g=1;g<this.nodeSize&&h<l;g++)c=Math.min(c,t[h++]),u=Math.min(u,t[h++]),f=Math.max(f,t[h++]),p=Math.max(p,t[h++]);this._indices[this._pos>>2]=a,t[this._pos++]=c,t[this._pos++]=u,t[this._pos++]=f,t[this._pos++]=p}}}search(t,e,s,n,r){if(this._pos!==this._boxes.length)throw new Error("Data not yet indexed - call index.finish().");let o=this._boxes.length-4;const h=[],l=[];for(;o!==void 0;){const a=Math.min(o+this.nodeSize*4,Ls(o,this._levelBounds));for(let c=o;c<a;c+=4){if(s<this._boxes[c]||n<this._boxes[c+1]||t>this._boxes[c+2]||e>this._boxes[c+3])continue;const u=this._indices[c>>2]|0;o>=this.numItems*4?h.push(u):(r===void 0||r(u))&&l.push(u)}o=h.pop()}return l}neighbors(t,e,s=1/0,n=1/0,r){if(this._pos!==this._boxes.length)throw new Error("Data not yet indexed - call index.finish().");let o=this._boxes.length-4;const h=this._queue,l=[],a=n*n;for(;o!==void 0;){const c=Math.min(o+this.nodeSize*4,Ls(o,this._levelBounds));for(let u=o;u<c;u+=4){const f=this._indices[u>>2]|0,p=_s(t,this._boxes[u],this._boxes[u+2]),g=_s(e,this._boxes[u+1],this._boxes[u+3]),w=p*p+g*g;o>=this.numItems*4?h.push(f<<1,w):(r===void 0||r(f))&&h.push((f<<1)+1,w)}for(;h.length&&h.peek()&1;)if(h.peekValue()>a||(l.push(h.pop()>>1),l.length===s))return h.clear(),l;o=h.pop()>>1}return h.clear(),l}}function _s(i,t,e){return i<t?t-i:i<=e?0:i-e}function Ls(i,t){let e=0,s=t.length-1;for(;e<s;){const n=e+s>>1;t[n]>i?s=n:e=n+1}return t[e]}function Le(i,t,e,s,n,r){if(Math.floor(s/r)>=Math.floor(n/r))return;const o=i[s+n>>1];let h=s-1,l=n+1;for(;;){do h++;while(i[h]<o);do l--;while(i[l]>o);if(h>=l)break;Dn(i,t,e,h,l)}Le(i,t,e,s,l,r),Le(i,t,e,l+1,n,r)}function Dn(i,t,e,s,n){const r=i[s];i[s]=i[n],i[n]=r;const o=4*s,h=4*n,l=t[o],a=t[o+1],c=t[o+2],u=t[o+3];t[o]=t[h],t[o+1]=t[h+1],t[o+2]=t[h+2],t[o+3]=t[h+3],t[h]=l,t[h+1]=a,t[h+2]=c,t[h+3]=u;const f=e[s];e[s]=e[n],e[n]=f}function Xn(i,t){let e=i^t,s=65535^e,n=65535^(i|t),r=i&(t^65535),o=e|s>>1,h=e>>1^e,l=n>>1^s&r>>1^n,a=e&n>>1^r>>1^r;e=o,s=h,n=l,r=a,o=e&e>>2^s&s>>2,h=e&s>>2^s&(e^s)>>2,l^=e&n>>2^s&r>>2,a^=s&n>>2^(e^s)&r>>2,e=o,s=h,n=l,r=a,o=e&e>>4^s&s>>4,h=e&s>>4^s&(e^s)>>4,l^=e&n>>4^s&r>>4,a^=s&n>>4^(e^s)&r>>4,e=o,s=h,n=l,r=a,l^=e&n>>8^s&r>>8,a^=s&n>>8^(e^s)&r>>8,e=l^l>>1,s=a^a>>1;let c=i^t,u=s|65535^(c|e);return c=(c|c<<8)&16711935,c=(c|c<<4)&252645135,c=(c|c<<2)&858993459,c=(c|c<<1)&1431655765,u=(u|u<<8)&16711935,u=(u|u<<4)&252645135,u=(u|u<<2)&858993459,u=(u|u<<1)&1431655765,(u<<1|c)>>>0}function Bs(i,t=1e-7){if(i.length===0)return[];if(i.length===1)return[i];const e=new _e(i.length);i.forEach(r=>{const[o,h]=r.firstPoint;e.add(o-t,h-t,o+t,h+t)}),e.finish();const s=[],n=new Set;return i.forEach((r,o)=>{if(n.has(o))return;const h=[r];let l=o;n.add(o);let a=i.length;for(;;){if(a--<0)throw new Error("Infinite loop detected");const c=h[h.length-1].lastPoint,[u,f]=c,p=e.search(u-t,f-t,u+t,f+t),g=d=>Math.abs((l-d)%i.length),w=p.filter(d=>!n.has(d)).map(d=>[i[d],d,g(d)]).sort(([,,d],[,,M])=>g(d)-g(M));if(w.length===0){s.push(h);break}const[P,m]=w[0];h.push(P),n.add(m),l=m}}),s}let ut=class be extends $t{constructor(t,e=[],{ignoreChecks:s=!1}={}){super(),st(this,"contour"),st(this,"holes"),s||Hn(t,e),this.contour=t,this.holes=e}get boundingBox(){return this.contour.boundingBox}get isFull(){return this.holes.length===0}get allLoops(){return[this.contour,...this.holes]}clone(){return new be(this.contour.clone(),this.holes.map(t=>t.clone()))}transform(t){return new be(this.contour.transform(t),this.holes.map(e=>e.transform(t)))}contains(t){return this.contour.contains(t)&&!this.holes.some(e=>e.contains(t))}intersects(t){return this.allLoops.some(e=>t.allLoops.some(s=>e.intersects(s)))}overlappingStrands(t){const e=t instanceof be?t.allLoops:[t],s=this.allLoops.flatMap(n=>e.flatMap(r=>n.overlappingSegments(r)));return Bs(s).map(n=>new ot(n))}};function Hn(i,t=[]){if(!i)throw new Error("Figure must have a contour");for(const[e,s]of Re([i,...t]))if(e.intersects(s))throw new Error("Loops in a figure must not intersect");if(t.some(e=>!i.contains(e.firstPoint)&&!i.onStroke(e.firstPoint)))throw new Error("Holes must be inside the contour");for(const[e,s]of Re(t))if(e.contains(s.firstPoint))throw console.error(Fs(e),Fs(s)),new Error("Holes must not be inside other holes")}const Gn=i=>{const t=i.map((n,r)=>i.slice(r+1).map((o,h)=>[h+r+1,o]).filter(([,o])=>n.boundingBox.overlaps(o.boundingBox)).map(([o])=>o)),e=[],s=Array(t.length);return t.forEach((n,r)=>{let o=s[r];o||(o=[],e.push(o)),o.push(i[r]),n.length&&n.forEach(h=>{s[h]=o})}),e},js=i=>i.map((t,e)=>{const s=t.segments[0].midPoint,n=i.filter((r,o)=>e===o?!1:r.contains(s));return{loop:t,isIn:n}}),Wn=(i,t)=>i.flatMap(({loop:e})=>Be(t.filter(({loop:s,isIn:n})=>s===e||n.indexOf(e)!==-1))),Zn=(i,t)=>{const e=t.filter(({isIn:n})=>n.length<=1),s=Be(js(i.map(({loop:n})=>n)));return[e,...s]},Be=i=>{if(!i.length)return[];const t=i.filter(({isIn:s})=>!s.length),e=i.filter(({isIn:s})=>s.length>1);return t.length===1&&e.length===0?[i]:t.length>1?Wn(t,i):Zn(e,i)};function Wt(i){return Gn(i).map(js).flatMap(Be).map(t=>{if(t.length===1)return new ut(t[0].loop);t.sort((n,r)=>n.isIn.length-r.isIn.length);const[e,...s]=t.map(({loop:n})=>n);return new ut(e,s)})}function Qn(i,t){const e=[];for(const s of i)for(const n of t)e.push([s,n]);return e}function*je(i,t,e){const s=o=>t.some(h=>y(h,o.lastPoint)),n=o=>e.some(h=>o.isSame(h));let r=[];for(const o of i)s(o)?(r.push(o),yield new ot(r,{ignoreChecks:!0}),r=[]):n(o)?(r.length&&(yield new ot(r,{ignoreChecks:!0}),r=[]),yield new ot([o],{ignoreChecks:!0})):r.push(o);r.length&&(yield new ot(r,{ignoreChecks:!0}))}const qs=(i,t)=>{const e=i.findIndex(n=>y(t,n.firstPoint)),s=i.slice(0,e);return i.slice(e).concat(s)},Vs=(i,t)=>{let e=i;const s=o=>y(o.firstPoint,t.firstPoint)&&y(o.lastPoint,t.lastPoint);let n=i.findIndex(s);if(n===-1){const o=i.map(h=>h.reverse());if(o.reverse(),n=o.findIndex(s),n===-1)throw console.error(o.map(h=>h.repr),t.repr),new Error("Failed to rotate to segment start");e=o}const r=e.slice(0,n);return e.slice(n).concat(r)};function Jn(i,t,e){return i.filter(s=>{const n=t.filter(o=>y(o.firstPoint,s)||y(o.lastPoint,s));if(n.length%2)throw new Error("Bug in the intersection algo on non crossing point");const r=n.map(o=>e.contains(o.midPoint));return!(r.every(o=>o)||!r.some(o=>o))})}function Kn(i,t,e){let s=[];const n=[],r=new Array(i.segments.length).fill(0).map(()=>[]),o=new Array(t.segments.length).fill(0).map(()=>[]);if(i.segments.forEach((f,p)=>{t.segments.forEach((g,w)=>{const{intersections:P,overlaps:m}=Gt(f,g,e);s.push(...P),r[p].push(...P),o[w].push(...P),n.push(...m);const d=m.flatMap(M=>[M.firstPoint,M.lastPoint]);s.push(...d),r[p].push(...d),o[w].push(...d)})}),s=Pt(s,e),!s.length||s.length===1)return null;const h=([f,p])=>p.length?f.splitAt(p):[f];let l=mt([i.segments,r]).flatMap(h),a=mt([t.segments,o]).flatMap(h);if(s=Jn(s,l,t),!s.length&&!n.length)return null;if(n.length){const f=n[0];l=Vs(l,f),a=Vs(a,f)}else{const f=s[0];l=qs(l,f),a=qs(a,f)}let c=Array.from(je(l,s,n)),u=Array.from(je(a,s,n));return(!y(u[0].lastPoint,c[0].lastPoint)||n.length>0&&u[0].segmentsCount!==1)&&(u=u.map(f=>f.reverse()).reverse(),y(u[0].lastPoint,c[0].lastPoint)||(c=c.map(f=>f.reverse()).reverse())),mt([c,u]).map(([f,p])=>f.segmentsCount===1&&n.some(g=>f.segments[0].isSame(g))?[f,"same"]:[f,p])}function Os(i){let t=i[0];for(const e of i.slice(1))t=t.extend(e);if(!y(t.firstPoint,t.lastPoint))throw console.error(H(t.firstPoint),H(t.lastPoint)),new Error("Bug in the intersection algo on non closing strand");return new ct(t.segments)}function tr(i,t){const e=mt([t.slice(0,-1),t.slice(1)]).map(([n,r])=>Os(i.slice(n,r)));let s=i.slice(t[t.length-1]);return t[0]!==0&&(s=s.concat(i.slice(0,t[0]))),e.push(Os(s)),e}function er(i){if(!i.length)return[];const t=i.map(n=>n.firstPoint);let e=i.map(n=>n.lastPoint);e=e.slice(-1).concat(e.slice(0,-1));const s=mt([t,e]).flatMap(([n,r],o)=>y(n,r)?[]:o);try{return tr(i,s)}catch{return Bs(i.flatMap(n=>n.segments)).filter(n=>n.length>1).filter(n=>y(n[0].firstPoint,n.at(-1).lastPoint)).map(n=>new ct(n))}}const Ns=(i,t)=>{if(i.length===0)return[t];const e=i.at(-1);return y(e.lastPoint,t.firstPoint)?i.slice(0,-1).concat([e.extend(t)]):y(e.lastPoint,t.lastPoint)?i.slice(0,-1).concat([e.extend(t.reverse())]):i.concat([t])},sr=(i,t)=>i.length===0?[t]:y(i[0].firstPoint,t.lastPoint)?[t.extend(i[0])].concat(i.slice(1)):[t].concat(i);function qe(i,t,{firstInside:e,secondInside:s}){const n=Kn(i,t);if(!n){const l=i.segments[0].midPoint,a=t.contains(l),c=t.segments[0].midPoint,u=i.contains(c);return{identical:!1,firstCurveInSecond:a,secondCurveInFirst:u}}if(n.every(([,l])=>l==="same"))return{identical:!0};let r=null,o=null;const h=n.flatMap(([l,a])=>{let c=[],u=0;if(a==="same")return o===1?(o=1,l):o===2||o===0?(o=null,[]):o===null?(r?r=r.extend(l):r=l,[]):(console.error("weird situation"),[]);const f=l.segments[0].midPoint,p=t.contains(f);(e==="keep"&&p||e==="remove"&&!p)&&(u+=1,c=Ns(c,l));const g=a.segments[0].midPoint,w=i.contains(g);if(s==="keep"&&w||s==="remove"&&!w){const P=a;u+=1,u===2&&c.length?(c=Ns(c,P),r=null):c=[P]}return o===null&&u===1&&r&&(c=sr(c,r)),u===1&&(o=u,r=null),c.length?c:(r=null,[])});return er(h)}const ir=(i,t)=>{const e=qe(i,t,{firstInside:"remove",secondInside:"remove"});return Array.isArray(e)?e:e.identical?[i]:e.firstCurveInSecond?[t]:e.secondCurveInFirst?[i]:[i,t]},ce=(i,t)=>{const e=qe(i,t,{firstInside:"remove",secondInside:"keep"});return Array.isArray(e)?e:e.identical?[]:e.firstCurveInSecond?[]:e.secondCurveInFirst?[i,t]:[i]},Ve=(i,t)=>{const e=qe(i,t,{firstInside:"keep",secondInside:"keep"});return Array.isArray(e)?e:e.identical?[i]:e.firstCurveInSecond?[i]:e.secondCurveInFirst?[t]:[]};function nr(i){const t=new Map,e=[];return i.forEach((s,n)=>{let r;t.has(n)?r=t.get(n):(r={current:[s],fusedWith:new Set([n])},e.push(r)),i.slice(n+1).forEach((o,h)=>{const l=r.current,a=n+h+1;if(r.fusedWith.has(a))return;let c=[o],u=!1;if(t.has(a)&&(c=t.get(a).current,u=!0),!l.some(p=>c.some(g=>p.intersects(g))))return;let f;l.length>1||c.length>1?f=Zt(l,c):f=zs(l[0],c[0]),r.fusedWith.add(a),r.current=f,u||t.set(a,r)})}),e.flatMap(({current:s})=>s)}function zs(i,t){const e=ir(i.contour,t.contour),s=t.holes.flatMap(o=>ce(o,i.contour)),n=i.holes.flatMap(o=>ce(o,t.contour)),r=Qn(i.holes,t.holes).flatMap(([o,h])=>Ve(o,h));return Wt([...e,...s,...n,...r])}function fe(i,t){if(i.isFull&&t.isFull)return Wt(ce(i.contour,t.contour));if(i.isFull){const s=ce(i.contour,t.contour),n=t.holes.flatMap(r=>Ve(r,i.contour));return Wt([...s,...n])}else if(t.isFull&&!i.contour.intersects(t.contour))if(i.contour.contains(t.contour.firstPoint)){const s=Zt(i.holes.map(n=>new ut(n)),[t]);return Wt([i.contour,...s.flatMap(n=>n.allLoops)])}else return[i];let e=fe(new ut(i.contour),t);return i.holes.forEach(s=>{e=e.flatMap(n=>fe(n,new ut(s)))}),e}function rr(i,t){const e=Ve(i.contour,t.contour);if(!e.length)return[];let s=Wt(e);return s=qt(s,i.holes.map(n=>new ut(n))),qt(s,t.holes.map(n=>new ut(n)))}function Zt(i,t){if(!i.length)return t;if(!t.length)return i;if(i.length===1&&t.length>1||t.length===1&&i.length>1)return nr([...i,...t]);if(i.length>1&&t.length>1){let e=Zt([i[0]],t);return i.slice(1).forEach(s=>{e=Zt([s],e)}),e}return i.length===1&&t.length===1?zs(i[0],t[0]):[]}function qt(i,t){if(!i.length)return[];if(!t.length)return i;if(i.length===1&&t.length===1)return fe(i[0],t[0]);if(i.length>1)return i.flatMap(s=>qt([s],t));let e=fe(i[0],t[0]);return t.slice(1).forEach(s=>{e=qt(e,[s])}),e}function Oe(i,t){return!i.length||!t.length?[]:i.length===1&&t.length===1?rr(i[0],t[0]):i.length>1?i.flatMap(e=>Oe([e],t)):t.flatMap(e=>Oe(i,[e]))}class ft extends $t{constructor(t=[],{ignoreChecks:e=!1}={}){super(),st(this,"figures"),st(this,"_boundingBox",null),e||or(t),this.figures=t}get isEmpty(){return this.figures.length===0}get boundingBox(){if(this.isEmpty)return new Yt;if(this._boundingBox===null){let t=this.figures[0].boundingBox;for(const e of this.figures.slice(1))t=t.merge(e.boundingBox);this._boundingBox=t}return this._boundingBox}clone(){return new ft(this.figures.map(t=>t.clone()))}transform(t){return new ft(this.figures.map(e=>e.transform(t)))}contains(t){return this.figures.some(e=>e.contains(t))}intersects(t){return this.figures.some(e=>t.figures.some(s=>e.intersects(s)))}overlappingStrands(t){return this.figures.flatMap(e=>t instanceof ft?t.figures.flatMap(s=>e.overlappingStrands(s)):e.overlappingStrands(t))}fuse(t){return new ft(Zt(this.figures,t.figures))}cut(t){return new ft(qt(this.figures,t.figures))}intersect(t){return new ft(Oe(this.figures,t.figures))}}function or(i){for(const[t,e]of Re(i))if(t.intersects(e))throw new Error("Diagram figures must not intersect")}var hr=Object.defineProperty,ar=(i,t,e)=>t in i?hr(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e,me=(i,t,e)=>(ar(i,typeof t!="symbol"?t+"":t,e),e);class Ne{constructor(t,e){this.firstPoint=t,this.lastPoint=e}}function Us(i,t){if(i instanceof B)return lr(i,t);if(i instanceof L)return ur(i,t);throw new Error("Not implemented")}function lr(i,t){const{firstPoint:e,lastPoint:s}=i,n=i.normalVector;return new B(O(e,G(n,t)),O(s,G(n,t)))}function ur(i,t){const e=O(i.firstPoint,G(tt(i.tangentAtFirstPoint),t)),s=O(i.lastPoint,G(tt(i.tangentAtLastPoint),t)),n=t*(i.clockwise?1:-1);return i.radius+n<i.precision?new Ne(e,s):new L(e,s,i.center,i.clockwise)}function Ys(i,t,e){const s=bt(i.tangentAtLastPoint,t.tangentAtFirstPoint);if(Math.abs(s)<1e-10)return null;const n=s>0?1:-1,r=Math.abs(e)*n,o=Us(i,r),h=Us(t,r);if(o instanceof Ne||h instanceof Ne)return null;let l;try{l=_n(o,h,1e-9).at(-1)}catch{return null}if(!l)return null;const a=l,c=(p,g)=>{const w=g.tangentAt(a),P=Dt(w),m=O(a,G(P,r));return p.splitAt(m)},[u]=c(i,o),[,f]=c(t,h);return{first:u,second:f,center:a}}function Ds(i,t,e){const s=Ys(i,t,e);if(!s)return console.warn("Cannot fillet between segments",i.repr,t.repr),[i,t];const{first:n,second:r}=s;return[n,Ke(n.lastPoint,r.firstPoint,n.tangentAtLastPoint),r]}function Xs(i,t,e){const s=Ys(i,t,e);if(!s)return console.warn("Cannot chamfer between segments",i.repr,t.repr),[i,t];const{first:n,second:r}=s;return[n,new B(n.lastPoint,r.firstPoint),r]}const cr=i=>{let t;i?typeof i=="number"||Array.isArray(i)&&i.length===2?t={endTangent:i}:t={endTangent:0,...i}:t={endTangent:[1,0]};const{endTangent:e,startFactor:s=1,endFactor:n=1,startTangent:r}=t;let o;typeof e=="number"?o=Mt(1,e*St):o=e;let h;return typeof r=="number"?h=Mt(1,r*St):h=r,{endTangent:o,startFactor:s,endFactor:n,startTangent:h}};function Hs(i,{ignoreChecks:t=!1}={}){return new ft([new ut(new ct([...i],{ignoreChecks:t}))])}class fr{constructor(t=[0,0]){me(this,"pointer"),me(this,"firstPoint"),me(this,"pendingSegments"),me(this,"_nextCorner"),this.pointer=t,this.firstPoint=t,this.pendingSegments=[],this._nextCorner=null}movePointerTo(t){if(this.pendingSegments.length)throw new Error("You can only move the pointer if there is no segment defined");return this.pointer=t,this.firstPoint=t,this}saveSegment(t){if(y(t.firstPoint,t.lastPoint))throw new Error(`Segment has no length, ${t.repr}`);if(!this._nextCorner)return this.pendingSegments.push(t),this;const e=this.pendingSegments.pop();if(!e)throw new Error("bug in the custom corner algorithm");const s=this._nextCorner.mode==="chamfer"?Xs:Ds;return this.pendingSegments.push(...s(e,t,this._nextCorner.radius)),this._nextCorner=null,this}lineTo(t){const e=new B(this.pointer,t);return this.pointer=t,this.saveSegment(e)}line(t,e){return this.lineTo([this.pointer[0]+t,this.pointer[1]+e])}vLine(t){return this.line(0,t)}hLine(t){return this.line(t,0)}vLineTo(t){return this.lineTo([this.pointer[0],t])}hLineTo(t){return this.lineTo([t,this.pointer[1]])}polarLineTo([t,e]){const s=e*St,n=Mt(t,s);return this.lineTo(n)}polarLine(t,e){const s=e*St,[n,r]=Mt(t,s);return this.line(n,r)}tangentLine(t){const e=this.pendingSegments.at(-1);if(!e)throw new Error("You need a previous segment to sketch a tangent line");const[s,n]=e.tangentAtLastPoint;return this.line(s*t,n*t)}threePointsArcTo(t,e){return this.saveSegment(Pi(this.pointer,e,t)),this.pointer=t,this}threePointsArc(t,e,s,n){const[r,o]=this.pointer;return this.threePointsArcTo([r+t,o+e],[r+s,o+n])}sagittaArcTo(t,e){if(!e)return this.lineTo(t);const s=new B(this.pointer,t),n=tt(s.tangentAtFirstPoint),r=O(s.midPoint,G(n,e));return this.threePointsArcTo(t,r)}sagittaArc(t,e,s){return this.sagittaArcTo([t+this.pointer[0],e+this.pointer[1]],s)}vSagittaArc(t,e){return this.sagittaArc(0,t,e)}hSagittaArc(t,e){return this.sagittaArc(t,0,e)}bulgeArcTo(t,e){if(!e)return this.lineTo(t);const s=N(this.pointer,t)/2,n=-e*s;return this.sagittaArcTo(t,n)}bulgeArc(t,e,s){return this.bulgeArcTo([t+this.pointer[0],e+this.pointer[1]],s)}vBulgeArc(t,e){return this.bulgeArc(0,t,e)}hBulgeArc(t,e){return this.bulgeArc(t,0,e)}tangentArcTo(t,e){const s=this.pendingSegments.at(-1);if(!s)throw new Error("You need a previous curve to sketch a tangent arc");return this.saveSegment(Ke(this.pointer,t,e??s.tangentAtLastPoint)),this.pointer=t,this}tangentArc(t,e,s){const[n,r]=this.pointer;return this.tangentArcTo([t+n,e+r],s)}ellipseTo(t,e,s,n,r,o){return this.saveSegment(hn(this.pointer,t,e,s,n,r,o)),this.pointer=t,this}ellipse(t,e,s,n,r,o,h){return this.ellipseTo([t+this.pointer[0],e+this.pointer[1]],s,n,r,o,h)}halfEllipseTo(t,e){const[s,n]=Qe(q(t,this.pointer));return this.ellipseTo(t,s/2,Math.abs(e),n*ve,!0,e>0)}halfEllipse(t,e,s){return this.halfEllipseTo([t+this.pointer[0],e+this.pointer[1]],s)}cubicBezierCurveTo(t,e,s){return this.saveSegment(new et(this.pointer,t,e,s)),this.pointer=t,this}quadraticBezierCurveTo(t,e){return this.saveSegment(new K(this.pointer,t,e)),this.pointer=t,this}smoothCurveTo(t,e){const{endTangent:s,startTangent:n,startFactor:r,endFactor:o}=cr(e),h=this.pendingSegments.length?this.pendingSegments[this.pendingSegments.length-1]:null,l=N(this.pointer,t)/3;let a;n?a=n:h?a=h.tangentAtLastPoint:a=[1,0],a=W(a);const c=[this.pointer[0]+a[0]*r*l,this.pointer[1]+a[1]*r*l];let u=s;u=W(u);const f=[t[0]-u[0]*o*l,t[1]-u[1]*o*l];return this.cubicBezierCurveTo(t,c,f)}smoothCurve(t,e,s){return this.smoothCurveTo([t+this.pointer[0],e+this.pointer[1]],s)}customCorner(t,e="fillet"){if(!this.pendingSegments.length)throw new Error("You need a segment defined to fillet the angle");return t?(this._nextCorner={mode:e,radius:t},this):this}_customCornerLastWithFirst(t,e="fillet"){if(!t)return;const s=this.pendingSegments.pop(),n=this.pendingSegments.shift();if(!s||!n)throw new Error("Not enough curves to close and fillet");const r=e==="chamfer"?Xs:Ds;this.pendingSegments.push(...r(s,n,t))}close(t=!1){if(!this.pendingSegments.length)throw new Error("No segments to close");const e=this.pendingSegments[0],s=this.pendingSegments.at(-1);return y(e.firstPoint,s.lastPoint)||this.lineTo(e.firstPoint),this._nextCorner!==null&&(this._customCornerLastWithFirst(this._nextCorner.radius,this._nextCorner.mode),this._nextCorner=null),Hs(this.pendingSegments,{ignoreChecks:t})}closeWithMirror(t=!1){if(!this.pendingSegments.length)throw new Error("No segments to close");const e=this.pendingSegments[0],s=this.pendingSegments.at(-1),n=q(s.lastPoint,e.firstPoint),r=new at().mirrorLine(n,e.firstPoint),o=this.pendingSegments.map(h=>h.transform(r).reverse());return o.reverse(),Hs([...this.pendingSegments,...o],{ignoreChecks:t})}asStrand(){return new ot([...this.pendingSegments])}get isClosed(){var t;return y(this.pointer,(t=this.pendingSegments[0])==null?void 0:t.firstPoint)}}function Gs(i=[0,0]){return new fr(i)}function xt([i,t]){return`${i} ${t}`}function ze(i){if(i instanceof B)return`L ${xt(i.lastPoint)}`;if(i instanceof L)return`A ${i.radius} ${i.radius} 0 ${i.angularLength>Math.PI?"1":"0"} ${i.clockwise?"0":"1"} ${xt(i.lastPoint)}`;if(i instanceof J)return`A ${i.majorRadius} ${i.minorRadius} ${i.tiltAngle*ve} ${i.deltaAngle>Math.PI?"1":"0"} ${i.clockwise?"0":"1"} ${xt(i.lastPoint)}`;if(i instanceof K)return`Q ${[xt(i.controlPoint),xt(i.lastPoint)].join(" ")}`;if(i instanceof et)return`C ${[xt(i.firstControlPoint),xt(i.lastControlPoint),xt(i.lastPoint)].join(" ")}`;throw new Error("Unknown segment type")}function Ws(i){const t=`M ${i.firstPoint.join(" ")}`,e=i.segments.map(ze).join(" ");return`${t} ${e} Z`}function Zs(i){return`<path d="${i.allLoops.map(Ws).join(" ")}" />`}function mr(i){return`<g>
11
+ ${i.figures.map(Zs).join(`
12
12
  `)}
13
- </g>`}function On(r){const t=`M ${r.firstPoint.join(" ")}`,e=r.segments.map(ie).join(" ");return`${t} ${e}`}function zn(r,t=1){const e=r.xMin-t,s=r.yMin-t;return`${e} ${s} ${r.width+2*t} ${r.height+2*t}`}function ss(r,t,e=1,s){const n=zn(t,e),o=s?`width="${t.width+2*e}${s}" height="${t.height+2*e}${s}"`:"";return`<?xml version="1.0" encoding="UTF-8" standalone="no"?>
14
- <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="${n}" fill="none" stroke="black" stroke-width="0.2%" vector-effect="non-scaling-stroke" ${o}>
15
- ${r}
16
- </svg>`}function ns(r){if(r instanceof St)return qn(r);if(r instanceof D)return es(r);if(r instanceof G)return`<path d="${ts(r)}" />`;if(r instanceof rt)return`<path d="${On(r)}" />`;if(r instanceof S||r instanceof v||r instanceof U)return`<path d="${`M ${r.firstPoint.join(" ")}`} ${ie(r)}" />`;throw new Error("Unknown shape type")}const rs=r=>"shape"in r?r.shape:r,os=(r,t)=>{if(!("shape"in r))return t;const{color:e}=r;return e?`<g stroke="${e}">${t}</g>`:t};function Un(r,{margin:t=1,unit:e=null}={}){if(Array.isArray(r)){const n=r.map(h=>rs(h).mirror()),o=n.map((h,l)=>os(r[l],ns(h))).join(`
17
- `),i=n.slice(1).reduce((h,l)=>h.merge(l.boundingBox),n[0].boundingBox);return ss(o,i,t,e)}const s=rs(r).mirror();return ss(os(r,ns(s)),s.boundingBox,t,e)}class dt extends lt{constructor(t,{cutLines:e=[],foldLines:s=[],foldLinesForwards:n=[],foldLinesBackwards:o=[]}={}){super(),this.body=t,this.cutLines=[...e],this.foldLinesBackwards=[...s,...o],this.foldLinesForwards=[...n]}get foldLines(){return[...this.foldLinesForwards,...this.foldLinesBackwards]}clone(){return new dt(this.body,{cutLines:[...this.cutLines],foldLinesForwards:[...this.foldLinesForwards],foldLinesBackwards:[...this.foldLinesBackwards]})}addCutLine(t){return this.cutLines.push(t),this}addFoldLine(t,e="backwards"){e==="forwards"?this.foldLinesForwards.push(t):this.foldLinesBackwards.push(t)}fuseFold(t,e="backwards"){const s=t instanceof dt?t.body:t,n=this.body.overlappingStrands(s);return e==="forwards"?this.foldLinesForwards.push(...n):this.foldLinesBackwards.push(...n),this.fuseBody(t),this}fuseBody(t){let e;return t instanceof dt?(e=t.body,this.cutLines.push(...t.cutLines),this.foldLinesForwards.push(...t.foldLinesForwards),this.foldLinesBackwards.push(...t.foldLinesBackwards)):e=t,this.body=this.body.fuse(e),this}cutShape(t){return this.body=Nn(this.body,t),this.cutLines=this.cutLines.flatMap(e=>oe(e,t,!0)),this.eraseFolds(t),this}eraseFolds(t){this.foldLinesBackwards=this.foldLinesBackwards.flatMap(e=>oe(e,t,!0)),this.foldLinesForwards=this.foldLinesForwards.flatMap(e=>oe(e,t,!0))}transform(t){return new dt(this.body.transform(t),{cutLines:this.cutLines.map(s=>s.transform(t)),foldLinesForwards:this.foldLinesForwards.map(s=>s.transform(t)),foldLinesBackwards:this.foldLinesBackwards.map(s=>s.transform(t))})}asSVG(){const t=[];return this.body&&t.push({shape:this.body,color:"red"}),this.cutLines.length&&this.cutLines.map(e=>t.push({shape:e,color:"red"})),this.foldLinesBackwards.length&&this.foldLinesBackwards.map(e=>t.push({shape:e,color:"green"})),this.foldLinesForwards.length&&this.foldLinesForwards.map(e=>t.push({shape:e,color:"blue"})),Un(t,{unit:"mm"})}}function he(r,t,{fillet:e=1,contraction:s=1,contractionMode:n="rounded",contractionLeft:o,contractionRight:i,leftContractionMode:h,rightContractionMode:l}={}){const a=o??s,c=i??s,u=He([-r/2,0]).hLine(r);return c?(l??n)==="rounded"?(u.tangentArc(-c,c,[-1,0]),u.vLine(t-c)):u.line(-c,t):u.vLine(t),u.customCorner(e),u.hLine(-r+a+c),u.customCorner(e),a?(h??n)==="rounded"?(u.vLine(-t+a),u.tangentArcTo([-r/2,0])):u.lineTo([-r/2,0]):u.vLine(-t),u.close()}function is(r,t,e={}){return he(r,t,e)}function hs(r,t,e={}){return he(r,t,e).mirror("x")}function ae(r,t,{contractionTop:e,contractionBottom:s,topContractionMode:n,bottomContractionMode:o,...i}={}){return he(r,t,{contractionLeft:e,contractionRight:s,leftContractionMode:n,rightContractionMode:o,...i}).rotate(90)}function as(r,t,e={}){return ae(r,t,e).mirror("y")}const Yn={right:as,left:ae,top:is,bottom:hs},ls=(r,t)=>He([-r/2,0]).line(t,-t).hLine(r-2*t).line(t,t);class Nt extends lt{constructor(t,e=.2){if(super(),typeof t!="number"){this.cut=t.cut,this.unfold=t.unfold,this.bump=t.bump;return}const s=ls(t,e*2.5);this.cut=s.asStrand(),this.unfold=s.close(),this.bump=ls(t-5*e,5*e).close().mirror("x")}clone(){return new Nt(this)}transform(t){return new Nt({cut:this.cut.transform(t),unfold:this.unfold.transform(t),bump:this.bump.transform(t)})}makeCut(t){t.eraseFolds(this.unfold),t.addCutLine(this.cut)}fuseBump(t){t.fuseBody(this.bump)}}class qt extends lt{constructor(t){super(),this.points=t,this.points=t}transform(t){return new qt(this.points.map(t.transform))}distribute(t){return this.points.map(e=>t.translateTo(e))}cloneDistribute(t){return this.points.map(e=>t.clone().translateTo(e))}}function Dn(r,t,e=3,s=0){if(r<=t*2)throw new Error("totalWidth must be greater than twice the objectWidth");const n=Math.max(Math.floor((r-2*s)/(t*(e+1))),2),i=(r-2*s-n*t)/(n-1),h=[];for(let l=0;l<n;l++)h.push(s+l*(t+i)-r/2+t/2);return new qt(h.map(l=>[l,0]))}function Xn(r,t,e="x"){const s=r*(t-1),n=[];for(let o=0;o<t;o++)n.push(o*r-s/2);return new qt(n.map(o=>e.toLowerCase()==="x"?[o,0]:[0,o]))}q.Dieline=dt,q.FoldLockBump=Nt,q.bottomFlap=hs,q.drawFlaps=Yn,q.leftFlap=ae,q.linearDistribution=Dn,q.linearSpread=Xn,q.rightFlap=as,q.topFlap=is,Object.defineProperty(q,Symbol.toStringTag,{value:"Module"})});
13
+ </g>`}function gr(i){const t=`M ${i.firstPoint.join(" ")}`,e=i.segments.map(ze).join(" ");return`${t} ${e}`}function pr(i,t=1){const e=i.xMin-t,s=i.yMin-t;return`${e} ${s} ${i.width+2*t} ${i.height+2*t}`}function Qs(i,t,e=1,s){const n=pr(t,e),r=s?`width="${t.width+2*e}${s}" height="${t.height+2*e}${s}"`:"";return`<?xml version="1.0" encoding="UTF-8" standalone="no"?>
14
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="${n}" fill="none" stroke="black" stroke-width="0.2%" vector-effect="non-scaling-stroke" ${r}>
15
+ ${i}
16
+ </svg>`}function Js(i){if(i instanceof ut)return[i];if(i instanceof ct)return[new ut(i)];if(i instanceof ft)return i.figures;throw new Error("Unknown shape")}function Ks(i,t,e=1e-9){let s=[];const n=[],r=new Array(t.segments.length).fill(0).map(()=>[]);t.segments.forEach((h,l)=>{i.segments.forEach(a=>{const{intersections:c,overlaps:u}=Gt(h,a,e);s.push(...c),r[l].push(...c),n.push(...u);const f=u.flatMap(p=>[p.firstPoint,p.lastPoint]);s.push(...f),r[l].push(...f)})}),s=Pt(s,e);const o=mt([t.segments,r]).flatMap(([h,l])=>l.length?h.splitAt(l):[h]);return Array.from(je(o,s,n))}function ti(i,t,e=!1){return Ks(t,i).filter(s=>{const n=s.segments[0].midPoint;return t.onStroke(n)?!e:!t.contains(n)})}function wr(i,t,e=!1){return Ks(t,i).filter(s=>{const n=s.segments[0].midPoint;return t.onStroke(n)?!e:t.contains(n)})}function ei(i,t,e=!1){const s=ti(i,t.contour,e),n=t.holes.flatMap(r=>wr(i,r,e));return[...s,...n]}function dr(i,t){return new ft(qt(Js(i),Js(t)))}function Ue(i,t,e=!0){if(t instanceof ct)return ti(i,t,e);if(t instanceof ut)return ei(i,t,e);let s=[new ot([...i.segments])];return t.figures.forEach(n=>{s=s.flatMap(r=>ei(r,n,e))}),s}function si(i){if(i instanceof ft)return mr(i);if(i instanceof ut)return Zs(i);if(i instanceof ct)return`<path d="${Ws(i)}" />`;if(i instanceof ot)return`<path d="${gr(i)}" />`;if(Cs(i))return`<path d="${`M ${i.firstPoint.join(" ")}`} ${ze(i)}" />`;throw new Error("Unknown shape type")}const ii=i=>"shape"in i?i.shape:i,ni=(i,t)=>{if(!("shape"in i))return t;const{color:e}=i;return e?`<g stroke="${e}">${t}</g>`:t},ri=i=>new Yt(i.xMin,-i.yMax,i.xMax,-i.yMin);function Pr(i,{margin:t=1,unit:e=null,viewBox:s}={}){if(Array.isArray(i)){const r=i.map(l=>ii(l).mirror()),o=r.map((l,a)=>ni(i[a],si(l))).join(`
17
+ `),h=r.slice(1).reduce((l,a)=>l.merge(a.boundingBox),r[0].boundingBox);return Qs(o,s?ri(s):h,t,e)}const n=ii(i).mirror();return Qs(ni(i,si(n)),s?ri(s):n.boundingBox,t,e)}class Vt extends $t{constructor(e,{cutLines:s=[],foldLines:n=[],foldLinesForwards:r=[],foldLinesBackwards:o=[]}={}){super();Et(this,"body");Et(this,"cutLines");Et(this,"foldLinesBackwards");Et(this,"foldLinesForwards");this.body=e,this.cutLines=[...s],this.foldLinesBackwards=[...n,...o],this.foldLinesForwards=[...r]}get foldLines(){return[...this.foldLinesForwards,...this.foldLinesBackwards]}clone(){return new Vt(this.body,{cutLines:[...this.cutLines],foldLinesForwards:[...this.foldLinesForwards],foldLinesBackwards:[...this.foldLinesBackwards]})}addCutLine(e){return this.cutLines.push(e),this}addFoldLine(e,s="backwards"){s==="forwards"?this.foldLinesForwards.push(e):this.foldLinesBackwards.push(e)}fuseFold(e,s="backwards"){const n=e instanceof Vt?e.body:e,r=this.body.overlappingStrands(n);return s==="forwards"?this.foldLinesForwards.push(...r):this.foldLinesBackwards.push(...r),this.fuseBody(e),this}fuseBody(e){let s;return e instanceof Vt?(s=e.body,this.cutLines.push(...e.cutLines),this.foldLinesForwards.push(...e.foldLinesForwards),this.foldLinesBackwards.push(...e.foldLinesBackwards)):s=e,this.body=this.body.fuse(s),this}cutShape(e){return this.body=dr(this.body,e),this.cutLines=this.cutLines.flatMap(s=>Ue(s,e,!0)),this.eraseFolds(e),this}eraseFolds(e){this.foldLinesBackwards=this.foldLinesBackwards.flatMap(s=>Ue(s,e,!0)),this.foldLinesForwards=this.foldLinesForwards.flatMap(s=>Ue(s,e,!0))}transform(e){return new Vt(this.body.transform(e),{cutLines:this.cutLines.map(n=>n.transform(e)),foldLinesForwards:this.foldLinesForwards.map(n=>n.transform(e)),foldLinesBackwards:this.foldLinesBackwards.map(n=>n.transform(e))})}asSVG(){const e=[];return this.body&&e.push({shape:this.body,color:"red"}),this.cutLines.length&&this.cutLines.map(s=>e.push({shape:s,color:"red"})),this.foldLinesBackwards.length&&this.foldLinesBackwards.map(s=>e.push({shape:s,color:"green"})),this.foldLinesForwards.length&&this.foldLinesForwards.map(s=>e.push({shape:s,color:"blue"})),Pr(e,{unit:"mm"})}}function Ye(i,t,{fillet:e=1,contraction:s=1,contractionMode:n="rounded",contractionLeft:r,contractionRight:o,leftContractionMode:h,rightContractionMode:l}={}){const a=r??s,c=o??s,u=Gs([-i/2,0]).hLine(i);return c?(l??n)==="rounded"?(u.tangentArc(-c,c,[-1,0]),u.vLine(t-c)):u.line(-c,t):u.vLine(t),u.customCorner(e),u.hLine(-i+a+c),u.customCorner(e),a?(h??n)==="rounded"?(u.vLine(-t+a),u.tangentArcTo([-i/2,0])):u.lineTo([-i/2,0]):u.vLine(-t),u.close()}function oi(i,t,e={}){return Ye(i,t,e)}function hi(i,t,e={}){return Ye(i,t,e).mirror("x")}function De(i,t,{contractionTop:e,contractionBottom:s,topContractionMode:n,bottomContractionMode:r,...o}={}){return Ye(i,t,{contractionLeft:e,contractionRight:s,leftContractionMode:n,rightContractionMode:r,...o}).rotate(90)}function ai(i,t,e={}){return De(i,t,e).mirror("y")}const Mr={right:ai,left:De,top:oi,bottom:hi},li=(i,t)=>Gs([-i/2,0]).line(t,-t).hLine(i-2*t).line(t,t);class ge extends $t{constructor(e,s=.2){super();Et(this,"cut");Et(this,"unfold");Et(this,"bump");if(typeof e!="number"){this.cut=e.cut,this.unfold=e.unfold,this.bump=e.bump;return}const n=li(e,s*2.5);this.cut=n.asStrand(),this.unfold=n.close(),this.bump=li(e-5*s,5*s).close().mirror("x")}clone(){return new ge(this)}transform(e){return new ge({cut:this.cut.transform(e),unfold:this.unfold.transform(e),bump:this.bump.transform(e)})}makeCut(e){e.eraseFolds(this.unfold),e.addCutLine(this.cut)}fuseBump(e){e.fuseBody(this.bump)}}class pe extends $t{constructor(t){super(),this.points=t,this.points=t}transform(t){return new pe(this.points.map(t.transform))}distribute(t){return this.points.map(e=>t.translateTo(e))}cloneDistribute(t){return this.points.map(e=>t.clone().translateTo(e))}}function yr(i,t,e=3,s=0){if(i<=t*2)throw new Error("totalWidth must be greater than twice the objectWidth");const n=Math.max(Math.floor((i-2*s)/(t*(e+1))),2),o=(i-2*s-n*t)/(n-1),h=[];for(let l=0;l<n;l++)h.push(s+l*(t+o)-i/2+t/2);return new pe(h.map(l=>[l,0]))}function br(i,t,e="x"){const s=i*(t-1),n=[];for(let r=0;r<t;r++)n.push(r*i-s/2);return new pe(n.map(r=>e.toLowerCase()==="x"?[r,0]:[0,r]))}X.Dieline=Vt,X.FoldLockBump=ge,X.bottomFlap=hi,X.drawFlaps=Mr,X.leftFlap=De,X.linearDistribution=yr,X.linearSpread=br,X.rightFlap=ai,X.topFlap=oi,Object.defineProperty(X,Symbol.toStringTag,{value:"Module"})});
18
18
  //# sourceMappingURL=dielines.umd.cjs.map