@tscircuit/eval 0.0.835 → 0.0.836
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blob-url.js +1 -1
- package/dist/webworker/entrypoint.js +1 -1
- package/package.json +2 -2
|
@@ -769,7 +769,7 @@ ${spiceString}`)}catch(error2){debug10(`Failed to convert circuit JSON to SPICE:
|
|
|
769
769
|
`)}},__publicField(_a290,"token","generated"),__publicField(_a290,"parentToken","kicad_pcb"),_a290);SxClass.register(Generated);var _a291,PcbArc=(_a291=class extends SxClass{constructor(params={}){super();__publicField(this,"token","arc");__publicField(this,"_start");__publicField(this,"_mid");__publicField(this,"_end");__publicField(this,"_sxWidth");__publicField(this,"_sxLayer");__publicField(this,"_net");__publicField(this,"_sxUuid");params.start!==void 0&&(this.start=params.start),params.mid!==void 0&&(this.mid=params.mid),params.end!==void 0&&(this.end=params.end),params.width!==void 0&&(this.width=params.width),params.layer!==void 0&&(this.layer=params.layer),params.net!==void 0&&(this.net=params.net),params.uuid!==void 0&&(this.uuid=params.uuid)}static fromSexprPrimitives(primitiveSexprs){let arc2=new _a291;for(let primitive of primitiveSexprs){if(!Array.isArray(primitive)||primitive.length===0)throw new Error(`arc encountered unsupported child: ${JSON.stringify(primitive)}`);let[token,...args]=primitive;if(token==="start"){arc2._start=parsePoint(args,"start");continue}if(token==="mid"){arc2._mid=parsePoint(args,"mid");continue}if(token==="end"){arc2._end=parsePoint(args,"end");continue}if(token==="width"){arc2._sxWidth=new Width(parseNumber(args[0],"width"));continue}if(token==="layer"){let layerName=parseLayer(args);arc2._sxLayer=new Layer([layerName]);continue}if(token==="net"){arc2._net=parseNumber(args[0],"net");continue}if(token==="uuid"){arc2._sxUuid=new Uuid(parseString(args[0],"uuid"));continue}throw new Error(`arc encountered unsupported child token "${token}"`)}if(!arc2._start||!arc2._mid||!arc2._end)throw new Error("arc requires start, mid, and end child tokens");if(!arc2._sxLayer)throw new Error("arc requires a layer child token");return arc2}get start(){return this._start?{...this._start}:void 0}set start(value){this._start=value?{...value}:void 0}get mid(){return this._mid?{...this._mid}:void 0}set mid(value){this._mid=value?{...value}:void 0}get end(){return this._end?{...this._end}:void 0}set end(value){this._end=value?{...value}:void 0}get width(){return this._sxWidth?.value}set width(value){if(value===void 0){this._sxWidth=void 0;return}this._sxWidth=value instanceof Width?value:new Width(value)}get layer(){return this._sxLayer}set layer(value){if(value===void 0){this._sxLayer=void 0;return}this._sxLayer=value instanceof Layer?value:new Layer([value])}get net(){return this._net}set net(value){this._net=value}get uuid(){return this._sxUuid}set uuid(value){if(value===void 0){this._sxUuid=void 0;return}this._sxUuid=value instanceof Uuid?value:new Uuid(value)}getChildren(){return[]}getString(){let lines=["(arc"];return this._start&&lines.push(renderPoint("start",this._start)),this._mid&&lines.push(renderPoint("mid",this._mid)),this._end&&lines.push(renderPoint("end",this._end)),this._sxWidth&&lines.push(this._sxWidth.getStringIndented()),this._sxLayer&&lines.push(this._sxLayer.getStringIndented()),this._net!==void 0&&lines.push(` (net ${this._net})`),this._sxUuid&&lines.push(this._sxUuid.getStringIndented()),lines.push(")"),lines.join(`
|
|
770
770
|
`)}},__publicField(_a291,"token","arc"),__publicField(_a291,"parentToken","kicad_pcb"),_a291);SxClass.register(PcbArc);function parsePoint(args,label){if(args.length!==2)throw new Error(`arc ${label} expects two numeric values`);return{x:parseNumber(args[0],`${label}.x`),y:parseNumber(args[1],`${label}.y`)}}function parseNumber(value,label){let numeric=toNumberValue(value);if(numeric===void 0)throw new Error(`arc ${label} expects a numeric value`);return numeric}function parseString(value,label){if(typeof value!="string")throw new Error(`arc ${label} expects a string value`);return value}function parseLayer(args){if(args.length!==1)throw new Error("arc layer expects a single string value");return parseString(args[0],"layer")}function renderPoint(label,point7){return` (${label} ${point7.x} ${point7.y})`}var _a292,SegmentEnd=(_a292=class extends SxClass{constructor(x4,y4){super();__publicField(this,"token","end");__publicField(this,"_x");__publicField(this,"_y");this._x=x4,this._y=y4}static fromSexprPrimitives(primitiveSexprs){let[rawX,rawY]=primitiveSexprs,x4=toNumberValue(rawX),y4=toNumberValue(rawY);if(x4===void 0||y4===void 0)throw new Error("end expects two numeric arguments");return new _a292(x4,y4)}get x(){return this._x}set x(value){this._x=value}get y(){return this._y}set y(value){this._y=value}toObject(){return{x:this._x,y:this._y}}getChildren(){return[]}getString(){return`(end ${this._x} ${this._y})`}},__publicField(_a292,"token","end"),__publicField(_a292,"parentToken","segment"),_a292);SxClass.register(SegmentEnd);var truthyStrings4=new Set(["true","yes","1"]),_a293,SegmentLocked=(_a293=class extends SxPrimitiveBoolean{constructor(value){super(value);__publicField(this,"token","locked")}static fromSexprPrimitives(primitiveSexprs){let[rawValue]=primitiveSexprs;return typeof rawValue=="boolean"?new _a293(rawValue):typeof rawValue=="string"?new _a293(truthyStrings4.has(rawValue.toLowerCase())):new _a293(!1)}getString(){return`(locked ${this.value?"yes":"no"})`}},__publicField(_a293,"token","locked"),__publicField(_a293,"parentToken","segment"),_a293);SxClass.register(SegmentLocked);var _a294,SegmentNet=(_a294=class extends SxClass{constructor(id2,name){super();__publicField(this,"token","net");__publicField(this,"_id");__publicField(this,"_name");this._id=id2,this._name=name}static fromSexprPrimitives(primitiveSexprs){let[rawId,rawName]=primitiveSexprs,id2=toNumberValue(rawId);if(id2===void 0)throw new Error("net expects a numeric identifier");let name=rawName===void 0?void 0:toStringValue(rawName);return new _a294(id2,name??void 0)}get id(){return this._id}set id(value){this._id=value}get name(){return this._name}set name(value){this._name=value===""?void 0:value}toObject(){return this._name===void 0?{id:this._id}:{id:this._id,name:this._name}}getChildren(){return[]}getString(){let namePart=this._name?` ${quoteSExprString(this._name)}`:"";return`(net ${this._id}${namePart})`}},__publicField(_a294,"token","net"),__publicField(_a294,"parentToken","segment"),_a294);SxClass.register(SegmentNet);var _a295,SegmentStart=(_a295=class extends SxClass{constructor(x4,y4){super();__publicField(this,"token","start");__publicField(this,"_x");__publicField(this,"_y");this._x=x4,this._y=y4}static fromSexprPrimitives(primitiveSexprs){let[rawX,rawY]=primitiveSexprs,x4=toNumberValue(rawX),y4=toNumberValue(rawY);if(x4===void 0||y4===void 0)throw new Error("start expects two numeric arguments");return new _a295(x4,y4)}get x(){return this._x}set x(value){this._x=value}get y(){return this._y}set y(value){this._y=value}toObject(){return{x:this._x,y:this._y}}getChildren(){return[]}getString(){return`(start ${this._x} ${this._y})`}},__publicField(_a295,"token","start"),__publicField(_a295,"parentToken","segment"),_a295);SxClass.register(SegmentStart);var SUPPORTED_SINGLE_TOKENS12=new Set(["start","end","width","layer","net","tstamp","uuid","locked"]),_a296,Segment3=(_a296=class extends SxClass{constructor(params={}){super();__publicField(this,"token","segment");__publicField(this,"_sxStart");__publicField(this,"_sxEnd");__publicField(this,"_sxWidth");__publicField(this,"_sxLayer");__publicField(this,"_sxNet");__publicField(this,"_sxTstamp");__publicField(this,"_sxUuid");__publicField(this,"_sxLocked");params.start!==void 0&&(this.start=params.start),params.end!==void 0&&(this.end=params.end),params.width!==void 0&&(this.width=params.width),params.layer!==void 0&&(this.layer=params.layer),params.net!==void 0&&(this.net=params.net),params.tstamp!==void 0&&(this.tstamp=params.tstamp),params.uuid!==void 0&&(this.uuid=params.uuid),params.locked!==void 0&&(this.locked=params.locked)}static fromSexprPrimitives(primitiveSexprs){let segment2=new _a296,{propertyMap,arrayPropertyMap}=SxClass.parsePrimitivesToClassProperties(primitiveSexprs,this.token),unexpectedSingleTokens=Object.keys(propertyMap).filter(token=>!SUPPORTED_SINGLE_TOKENS12.has(token));if(unexpectedSingleTokens.length>0)throw new Error(`Unsupported child tokens inside segment expression: ${unexpectedSingleTokens.join(", ")}`);for(let[token,entries]of Object.entries(arrayPropertyMap)){if(!SUPPORTED_SINGLE_TOKENS12.has(token))throw new Error(`Unsupported child tokens inside segment expression: ${token}`);if(entries.length>1)throw new Error(`Segment does not support repeated child tokens: ${token}`)}segment2._sxStart=arrayPropertyMap.start?.[0]??propertyMap.start,segment2._sxEnd=arrayPropertyMap.end?.[0]??propertyMap.end,segment2._sxWidth=arrayPropertyMap.width?.[0]??propertyMap.width,segment2._sxLayer=arrayPropertyMap.layer?.[0]??propertyMap.layer,segment2._sxNet=arrayPropertyMap.net?.[0]??propertyMap.net;let locked=arrayPropertyMap.locked?.[0]??propertyMap.locked;return segment2._sxLocked=locked&&locked.value?locked:void 0,segment2._sxTstamp=arrayPropertyMap.tstamp?.[0]??propertyMap.tstamp,segment2._sxUuid=arrayPropertyMap.uuid?.[0]??propertyMap.uuid,segment2}get start(){return this._sxStart}set start(value){this._sxStart=this.normalizeStart(value)}get end(){return this._sxEnd}set end(value){this._sxEnd=this.normalizeEnd(value)}get startPoint(){return this._sxStart?.toObject()}get endPoint(){return this._sxEnd?.toObject()}get width(){return this._sxWidth?.value}set width(value){if(value===void 0){this._sxWidth=void 0;return}this._sxWidth=value instanceof Width?value:new Width(value)}get widthClass(){return this._sxWidth}set widthClass(value){this._sxWidth=value}get layer(){return this._sxLayer}set layer(value){if(value===void 0){this._sxLayer=void 0;return}if(value instanceof Layer){this._sxLayer=value;return}let names=Array.isArray(value)?value:[value];this._sxLayer=new Layer(names)}get net(){return this._sxNet}set net(value){if(value===void 0){this._sxNet=void 0;return}if(value instanceof SegmentNet){this._sxNet=value;return}this._sxNet=new SegmentNet(value.id,value.name)}get tstamp(){return this._sxTstamp}set tstamp(value){if(value===void 0){this._sxTstamp=void 0;return}this._sxTstamp=value instanceof Tstamp?value:new Tstamp(value)}get uuid(){return this._sxUuid}set uuid(value){if(value===void 0){this._sxUuid=void 0;return}this._sxUuid=value instanceof Uuid?value:new Uuid(value)}get locked(){return this._sxLocked?.value??!1}set locked(value){this._sxLocked=value?new SegmentLocked(!0):void 0}getChildren(){let children=[];return this._sxStart&&children.push(this._sxStart),this._sxEnd&&children.push(this._sxEnd),this._sxWidth&&children.push(this._sxWidth),this._sxLayer&&children.push(this._sxLayer),this._sxNet&&children.push(this._sxNet),this._sxLocked&&children.push(this._sxLocked),this._sxTstamp&&children.push(this._sxTstamp),this._sxUuid&&children.push(this._sxUuid),children}normalizeStart(value){if(value!==void 0)return value instanceof SegmentStart?value:new SegmentStart(value.x,value.y)}normalizeEnd(value){if(value!==void 0)return value instanceof SegmentEnd?value:new SegmentEnd(value.x,value.y)}},__publicField(_a296,"token","segment"),_a296);SxClass.register(Segment3);var _a297,Layers=(_a297=class extends SxClass{constructor(names=[]){super();__publicField(this,"token","layers");__publicField(this,"_names",[]);this.names=names}static fromSexprPrimitives(primitiveSexprs){let names=primitiveSexprs.map(primitive=>typeof primitive=="string"||typeof primitive=="number"?String(primitive):printSExpr(primitive));return new _a297(names)}get names(){return[...this._names]}set names(values){this._names=values.map(value=>String(value))}getString(){return`(layers ${this._names.map(name=>/^[^\s()"]+$/u.test(name)&&!["nil","#t","#f"].includes(name)?name:quoteSExprString(name)).join(" ")})`}},__publicField(_a297,"token","layers"),_a297);SxClass.register(Layers);var SingleValueProperty=class extends SxClass{constructor(value){super();__publicField(this,"_value");__publicField(this,"quoteStringValue",!1);this._value=value}static fromSexprPrimitives(primitiveSexprs){let[valuePrimitive]=primitiveSexprs,value=this.parsePrimitiveValue(valuePrimitive),Constructor=this;return new Constructor(value)}static parsePrimitiveValue(value){let stringValue=toStringValue(value);if(stringValue===void 0)throw new Error(`${this.name} expects a primitive value`);return stringValue}get value(){return this._value}set value(value){this._value=value}getChildren(){return[]}formatValue(){return typeof this._value=="string"?this.quoteStringValue?quoteSExprString(this._value):this._value:`${this._value}`}getString(){return`(${this.token} ${this.formatValue()})`}},NumericListProperty=class extends SxClass{constructor(values){super();__publicField(this,"_values");this._values=values}static fromSexprPrimitives(primitiveSexprs){let values=primitiveSexprs.map(primitive=>{let value=toNumberValue(primitive);if(value===void 0)throw new Error(`${this.name} expects numeric primitives but received ${primitive}`);return value}),Constructor=this;return new Constructor(values)}get values(){return[...this._values]}set values(values){this._values=[...values]}getChildren(){return[]}getString(){return`(${this.token} ${this._values.join(" ")})`}},CoordinateProperty=class extends SxClass{constructor(x4,y4){super();__publicField(this,"_x");__publicField(this,"_y");this._x=x4,this._y=y4}static fromSexprPrimitives(primitiveSexprs){let[xPrimitive,yPrimitive]=primitiveSexprs,x4=toNumberValue(xPrimitive),y4=toNumberValue(yPrimitive);if(x4===void 0||y4===void 0)throw new Error(`${this.name} expects two numeric values`);let Constructor=this;return new Constructor(x4,y4)}get x(){return this._x}set x(value){this._x=value}get y(){return this._y}set y(value){this._y=value}getChildren(){return[]}getString(){return`(${this.token} ${this._x} ${this._y})`}},_a298,PlotParamProperty=(_a298=class extends SingleValueProperty{},__publicField(_a298,"parentToken","pcbplotparams"),_a298),PlotParamNumberProperty=class extends PlotParamProperty{static parsePrimitiveValue(value){let parsed=toNumberValue(value);if(parsed===void 0)throw new Error(`pcbplotparams ${this.token} expects a numeric value`);return parsed}},_a299,PlotParamLayerSelection=(_a299=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","layerselection")}},__publicField(_a299,"token","layerselection"),_a299);SxClass.register(PlotParamLayerSelection);var _a300,PlotParamPlotOnAllLayersSelection=(_a300=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","plot_on_all_layers_selection")}},__publicField(_a300,"token","plot_on_all_layers_selection"),_a300);SxClass.register(PlotParamPlotOnAllLayersSelection);var _a301,PlotParamDashedLineDashRatio=(_a301=class extends PlotParamNumberProperty{constructor(){super(...arguments);__publicField(this,"token","dashed_line_dash_ratio")}},__publicField(_a301,"token","dashed_line_dash_ratio"),_a301);SxClass.register(PlotParamDashedLineDashRatio);var _a302,PlotParamDashedLineGapRatio=(_a302=class extends PlotParamNumberProperty{constructor(){super(...arguments);__publicField(this,"token","dashed_line_gap_ratio")}},__publicField(_a302,"token","dashed_line_gap_ratio"),_a302);SxClass.register(PlotParamDashedLineGapRatio);var _a303,PlotParamSvgPrecision=(_a303=class extends PlotParamNumberProperty{constructor(){super(...arguments);__publicField(this,"token","svgprecision")}},__publicField(_a303,"token","svgprecision"),_a303);SxClass.register(PlotParamSvgPrecision);var _a304,PlotParamLineWidth=(_a304=class extends PlotParamNumberProperty{constructor(){super(...arguments);__publicField(this,"token","linewidth")}},__publicField(_a304,"token","linewidth"),_a304);SxClass.register(PlotParamLineWidth);var _a305,PlotParamMode=(_a305=class extends PlotParamNumberProperty{constructor(){super(...arguments);__publicField(this,"token","mode")}},__publicField(_a305,"token","mode"),_a305);SxClass.register(PlotParamMode);var _a306,PlotParamHpglPenNumber=(_a306=class extends PlotParamNumberProperty{constructor(){super(...arguments);__publicField(this,"token","hpglpennumber")}},__publicField(_a306,"token","hpglpennumber"),_a306);SxClass.register(PlotParamHpglPenNumber);var _a307,PlotParamHpglPenSpeed=(_a307=class extends PlotParamNumberProperty{constructor(){super(...arguments);__publicField(this,"token","hpglpenspeed")}},__publicField(_a307,"token","hpglpenspeed"),_a307);SxClass.register(PlotParamHpglPenSpeed);var _a308,PlotParamHpglPenDiameter=(_a308=class extends PlotParamNumberProperty{constructor(){super(...arguments);__publicField(this,"token","hpglpendiameter")}},__publicField(_a308,"token","hpglpendiameter"),_a308);SxClass.register(PlotParamHpglPenDiameter);var _a309,PlotParamHpglPenOverlay=(_a309=class extends PlotParamNumberProperty{constructor(){super(...arguments);__publicField(this,"token","hpglpenoverlay")}},__publicField(_a309,"token","hpglpenoverlay"),_a309);SxClass.register(PlotParamHpglPenOverlay);var _a310,PlotParamOutputFormat=(_a310=class extends PlotParamNumberProperty{constructor(){super(...arguments);__publicField(this,"token","outputformat")}},__publicField(_a310,"token","outputformat"),_a310);SxClass.register(PlotParamOutputFormat);var _a311,PlotParamDrillShape=(_a311=class extends PlotParamNumberProperty{constructor(){super(...arguments);__publicField(this,"token","drillshape")}},__publicField(_a311,"token","drillshape"),_a311);SxClass.register(PlotParamDrillShape);var _a312,PlotParamScaleSelection=(_a312=class extends PlotParamNumberProperty{constructor(){super(...arguments);__publicField(this,"token","scaleselection")}},__publicField(_a312,"token","scaleselection"),_a312);SxClass.register(PlotParamScaleSelection);var _a313,PlotParamPlotFpText=(_a313=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","plotfptext")}},__publicField(_a313,"token","plotfptext"),_a313);SxClass.register(PlotParamPlotFpText);var _a314,PlotParamDisableApertMacros=(_a314=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","disableapertmacros")}},__publicField(_a314,"token","disableapertmacros"),_a314);SxClass.register(PlotParamDisableApertMacros);var _a315,PlotParamUseGerberExtensions=(_a315=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","usegerberextensions")}},__publicField(_a315,"token","usegerberextensions"),_a315);SxClass.register(PlotParamUseGerberExtensions);var _a316,PlotParamUseGerberAttributes=(_a316=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","usegerberattributes")}},__publicField(_a316,"token","usegerberattributes"),_a316);SxClass.register(PlotParamUseGerberAttributes);var _a317,PlotParamUseGerberAdvancedAttributes=(_a317=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","usegerberadvancedattributes")}},__publicField(_a317,"token","usegerberadvancedattributes"),_a317);SxClass.register(PlotParamUseGerberAdvancedAttributes);var _a318,PlotParamCreateGerberJobFile=(_a318=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","creategerberjobfile")}},__publicField(_a318,"token","creategerberjobfile"),_a318);SxClass.register(PlotParamCreateGerberJobFile);var _a319,PlotParamExcludeEdgeLayer=(_a319=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","excludeedgelayer")}},__publicField(_a319,"token","excludeedgelayer"),_a319);SxClass.register(PlotParamExcludeEdgeLayer);var _a320,PlotParamPlotFrameRef=(_a320=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","plotframeref")}},__publicField(_a320,"token","plotframeref"),_a320);SxClass.register(PlotParamPlotFrameRef);var _a321,PlotParamViaOnMask=(_a321=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","viasonmask")}},__publicField(_a321,"token","viasonmask"),_a321);SxClass.register(PlotParamViaOnMask);var _a322,PlotParamUseAuxOrigin=(_a322=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","useauxorigin")}},__publicField(_a322,"token","useauxorigin"),_a322);SxClass.register(PlotParamUseAuxOrigin);var _a323,PlotParamPdfFrontFpPropertyPopups=(_a323=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","pdf_front_fp_property_popups")}},__publicField(_a323,"token","pdf_front_fp_property_popups"),_a323);SxClass.register(PlotParamPdfFrontFpPropertyPopups);var _a324,PlotParamPdfBackFpPropertyPopups=(_a324=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","pdf_back_fp_property_popups")}},__publicField(_a324,"token","pdf_back_fp_property_popups"),_a324);SxClass.register(PlotParamPdfBackFpPropertyPopups);var _a325,PlotParamPdfMetadata=(_a325=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","pdf_metadata")}},__publicField(_a325,"token","pdf_metadata"),_a325);SxClass.register(PlotParamPdfMetadata);var _a326,PlotParamPdfSingleDocument=(_a326=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","pdf_single_document")}},__publicField(_a326,"token","pdf_single_document"),_a326);SxClass.register(PlotParamPdfSingleDocument);var _a327,PlotParamDxfPolygonMode=(_a327=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","dxfpolygonmode")}},__publicField(_a327,"token","dxfpolygonmode"),_a327);SxClass.register(PlotParamDxfPolygonMode);var _a328,PlotParamDxfImperialUnits=(_a328=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","dxfimperialunits")}},__publicField(_a328,"token","dxfimperialunits"),_a328);SxClass.register(PlotParamDxfImperialUnits);var _a329,PlotParamDxfUsePcbnewFont=(_a329=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","dxfusepcbnewfont")}},__publicField(_a329,"token","dxfusepcbnewfont"),_a329);SxClass.register(PlotParamDxfUsePcbnewFont);var _a330,PlotParamPsNegative=(_a330=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","psnegative")}},__publicField(_a330,"token","psnegative"),_a330);SxClass.register(PlotParamPsNegative);var _a331,PlotParamPsA4Output=(_a331=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","psa4output")}},__publicField(_a331,"token","psa4output"),_a331);SxClass.register(PlotParamPsA4Output);var _a332,PlotParamPlotReference=(_a332=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","plotreference")}},__publicField(_a332,"token","plotreference"),_a332);SxClass.register(PlotParamPlotReference);var _a333,PlotParamPlotValue=(_a333=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","plotvalue")}},__publicField(_a333,"token","plotvalue"),_a333);SxClass.register(PlotParamPlotValue);var _a334,PlotParamPlotOtherText=(_a334=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","plotothertext")}},__publicField(_a334,"token","plotothertext"),_a334);SxClass.register(PlotParamPlotOtherText);var _a335,PlotParamPlotInvisibleText=(_a335=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","plotinvisibletext")}},__publicField(_a335,"token","plotinvisibletext"),_a335);SxClass.register(PlotParamPlotInvisibleText);var _a336,PlotParamPadOnSilk=(_a336=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","padsonsilk")}},__publicField(_a336,"token","padsonsilk"),_a336);SxClass.register(PlotParamPadOnSilk);var _a337,PlotParamSketchPadsOnFab=(_a337=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","sketchpadsonfab")}},__publicField(_a337,"token","sketchpadsonfab"),_a337);SxClass.register(PlotParamSketchPadsOnFab);var _a338,PlotParamPlotPadNumbers=(_a338=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","plotpadnumbers")}},__publicField(_a338,"token","plotpadnumbers"),_a338);SxClass.register(PlotParamPlotPadNumbers);var _a339,PlotParamHideDnpOnFab=(_a339=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","hidednponfab")}},__publicField(_a339,"token","hidednponfab"),_a339);SxClass.register(PlotParamHideDnpOnFab);var _a340,PlotParamSketchDnpOnFab=(_a340=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","sketchdnponfab")}},__publicField(_a340,"token","sketchdnponfab"),_a340);SxClass.register(PlotParamSketchDnpOnFab);var _a341,PlotParamCrossoutDnpOnFab=(_a341=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","crossoutdnponfab")}},__publicField(_a341,"token","crossoutdnponfab"),_a341);SxClass.register(PlotParamCrossoutDnpOnFab);var _a342,PlotParamSubtractMaskFromSilk=(_a342=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","subtractmaskfromsilk")}},__publicField(_a342,"token","subtractmaskfromsilk"),_a342);SxClass.register(PlotParamSubtractMaskFromSilk);var _a343,PlotParamPlotBlackAndWhite=(_a343=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","plot_black_and_white")}},__publicField(_a343,"token","plot_black_and_white"),_a343);SxClass.register(PlotParamPlotBlackAndWhite);var _a344,PlotParamMirror=(_a344=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","mirror")}},__publicField(_a344,"token","mirror"),_a344);SxClass.register(PlotParamMirror);var _a345,PlotParamOutputDirectory=(_a345=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","outputdirectory");__publicField(this,"quoteStringValue",!0)}},__publicField(_a345,"token","outputdirectory"),_a345);SxClass.register(PlotParamOutputDirectory);var _a346,PlotParamPlotOnAllLayers=(_a346=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","plot_on_all_layers")}},__publicField(_a346,"token","plot_on_all_layers"),_a346);SxClass.register(PlotParamPlotOnAllLayers);var _a347,PlotParamPlotInvisible=(_a347=class extends PlotParamProperty{constructor(){super(...arguments);__publicField(this,"token","plotinvisible")}},__publicField(_a347,"token","plotinvisible"),_a347);SxClass.register(PlotParamPlotInvisible);var TOKEN_TO_KEY={layerselection:"layerselection",plot_on_all_layers_selection:"plot_on_all_layers_selection",disableapertmacros:"disableapertmacros",usegerberextensions:"usegerberextensions",usegerberattributes:"usegerberattributes",usegerberadvancedattributes:"usegerberadvancedattributes",creategerberjobfile:"creategerberjobfile",excludeedgelayer:"excludeedgelayer",dashed_line_dash_ratio:"dashed_line_dash_ratio",dashed_line_gap_ratio:"dashed_line_gap_ratio",svgprecision:"svgprecision",linewidth:"linewidth",plotframeref:"plotframeref",plotreference:"plotreference",plotvalue:"plotvalue",plotfptext:"plotfptext",plotothertext:"plotothertext",plotinvisibletext:"plotinvisibletext",padsonsilk:"padsonsilk",sketchpadsonfab:"sketchpadsonfab",plotpadnumbers:"plotpadnumbers",hidednponfab:"hidednponfab",sketchdnponfab:"sketchdnponfab",crossoutdnponfab:"crossoutdnponfab",subtractmaskfromsilk:"subtractmaskfromsilk",plot_black_and_white:"plot_black_and_white",plot_on_all_layers:"plot_on_all_layers",plotinvisible:"plotinvisible",mode:"mode",useauxorigin:"useauxorigin",viasonmask:"viasonmask",hpglpennumber:"hpglpennumber",hpglpenspeed:"hpglpenspeed",hpglpendiameter:"hpglpendiameter",hpglpenoverlay:"hpglpenoverlay",pdf_front_fp_property_popups:"pdf_front_fp_property_popups",pdf_back_fp_property_popups:"pdf_back_fp_property_popups",pdf_metadata:"pdf_metadata",pdf_single_document:"pdf_single_document",dxfpolygonmode:"dxfpolygonmode",dxfimperialunits:"dxfimperialunits",dxfusepcbnewfont:"dxfusepcbnewfont",psnegative:"psnegative",psa4output:"psa4output",mirror:"mirror",outputformat:"outputformat",drillshape:"drillshape",scaleselection:"scaleselection",outputdirectory:"outputdirectory"},PCB_PLOT_PARAM_CHILD_ORDER=["layerselection","plot_on_all_layers_selection","disableapertmacros","usegerberextensions","usegerberattributes","usegerberadvancedattributes","creategerberjobfile","excludeedgelayer","dashed_line_dash_ratio","dashed_line_gap_ratio","svgprecision","linewidth","plotframeref","plotreference","plotvalue","plotfptext","plotothertext","mode","useauxorigin","viasonmask","hpglpennumber","hpglpenspeed","hpglpendiameter","hpglpenoverlay","pdf_front_fp_property_popups","pdf_back_fp_property_popups","pdf_metadata","pdf_single_document","dxfpolygonmode","dxfimperialunits","dxfusepcbnewfont","psnegative","psa4output","plot_black_and_white","plot_on_all_layers","plotinvisible","plotinvisibletext","padsonsilk","sketchpadsonfab","plotpadnumbers","hidednponfab","sketchdnponfab","crossoutdnponfab","subtractmaskfromsilk","outputformat","mirror","drillshape","scaleselection","outputdirectory"],_a348,PcbPlotParams=(_a348=class extends SxClass{constructor(){super(...arguments);__publicField(this,"token","pcbplotparams");__publicField(this,"_properties",{})}static fromSexprPrimitives(primitiveSexprs){let params=new _a348,{propertyMap}=SxClass.parsePrimitivesToClassProperties(primitiveSexprs,this.token);for(let[token,instance]of Object.entries(propertyMap)){let key=TOKEN_TO_KEY[token];if(!key)throw new Error(`Unsupported pcbplotparams token: ${token}`);params._properties[key]=instance}return params}getChildren(){let children=[];for(let key of PCB_PLOT_PARAM_CHILD_ORDER){let child=this._properties[key];child&&children.push(child)}return children}clearProperty(key){delete this._properties[key]}setStringProperty(key,value,ClassRef){if(value===void 0){this.clearProperty(key);return}this._properties[key]=new ClassRef(value)}setNumberProperty(key,value,ClassRef){if(value===void 0){this.clearProperty(key);return}this._properties[key]=new ClassRef(value)}setStringOrNumberProperty(key,value,ClassRef){if(value===void 0){this.clearProperty(key);return}this._properties[key]=new ClassRef(value)}get layerselection(){return this._properties.layerselection?.value}set layerselection(value){this.setStringOrNumberProperty("layerselection",value,PlotParamLayerSelection)}get plot_on_all_layers_selection(){return this._properties.plot_on_all_layers_selection?.value}set plot_on_all_layers_selection(value){this.setStringOrNumberProperty("plot_on_all_layers_selection",value,PlotParamPlotOnAllLayersSelection)}get disableapertmacros(){return this._properties.disableapertmacros?.value}set disableapertmacros(value){this.setStringProperty("disableapertmacros",value,PlotParamDisableApertMacros)}get usegerberextensions(){return this._properties.usegerberextensions?.value}set usegerberextensions(value){this.setStringProperty("usegerberextensions",value,PlotParamUseGerberExtensions)}get usegerberattributes(){return this._properties.usegerberattributes?.value}set usegerberattributes(value){this.setStringProperty("usegerberattributes",value,PlotParamUseGerberAttributes)}get usegerberadvancedattributes(){return this._properties.usegerberadvancedattributes?.value}set usegerberadvancedattributes(value){this.setStringProperty("usegerberadvancedattributes",value,PlotParamUseGerberAdvancedAttributes)}get creategerberjobfile(){return this._properties.creategerberjobfile?.value}set creategerberjobfile(value){this.setStringProperty("creategerberjobfile",value,PlotParamCreateGerberJobFile)}get excludeedgelayer(){return this._properties.excludeedgelayer?.value}set excludeedgelayer(value){this.setStringProperty("excludeedgelayer",value,PlotParamExcludeEdgeLayer)}get dashed_line_dash_ratio(){return this._properties.dashed_line_dash_ratio?.value}set dashed_line_dash_ratio(value){this.setNumberProperty("dashed_line_dash_ratio",value,PlotParamDashedLineDashRatio)}get dashed_line_gap_ratio(){return this._properties.dashed_line_gap_ratio?.value}set dashed_line_gap_ratio(value){this.setNumberProperty("dashed_line_gap_ratio",value,PlotParamDashedLineGapRatio)}get svgprecision(){return this._properties.svgprecision?.value}set svgprecision(value){this.setNumberProperty("svgprecision",value,PlotParamSvgPrecision)}get linewidth(){return this._properties.linewidth?.value}set linewidth(value){this.setNumberProperty("linewidth",value,PlotParamLineWidth)}get plotframeref(){return this._properties.plotframeref?.value}set plotframeref(value){this.setStringProperty("plotframeref",value,PlotParamPlotFrameRef)}get plotreference(){return this._properties.plotreference?.value}set plotreference(value){this.setStringProperty("plotreference",value,PlotParamPlotReference)}get plotvalue(){return this._properties.plotvalue?.value}set plotvalue(value){this.setStringProperty("plotvalue",value,PlotParamPlotValue)}get plotfptext(){return this._properties.plotfptext?.value}set plotfptext(value){this.setStringProperty("plotfptext",value,PlotParamPlotFpText)}get plotothertext(){return this._properties.plotothertext?.value}set plotothertext(value){this.setStringProperty("plotothertext",value,PlotParamPlotOtherText)}get plotinvisibletext(){return this._properties.plotinvisibletext?.value}set plotinvisibletext(value){this.setStringProperty("plotinvisibletext",value,PlotParamPlotInvisibleText)}get padsonsilk(){return this._properties.padsonsilk?.value}set padsonsilk(value){this.setStringProperty("padsonsilk",value,PlotParamPadOnSilk)}get plotpadnumbers(){return this._properties.plotpadnumbers?.value}set plotpadnumbers(value){this.setStringProperty("plotpadnumbers",value,PlotParamPlotPadNumbers)}get sketchpadsonfab(){return this._properties.sketchpadsonfab?.value}set sketchpadsonfab(value){this.setStringProperty("sketchpadsonfab",value,PlotParamSketchPadsOnFab)}get hidednponfab(){return this._properties.hidednponfab?.value}set hidednponfab(value){this.setStringProperty("hidednponfab",value,PlotParamHideDnpOnFab)}get sketchdnponfab(){return this._properties.sketchdnponfab?.value}set sketchdnponfab(value){this.setStringProperty("sketchdnponfab",value,PlotParamSketchDnpOnFab)}get crossoutdnponfab(){return this._properties.crossoutdnponfab?.value}set crossoutdnponfab(value){this.setStringProperty("crossoutdnponfab",value,PlotParamCrossoutDnpOnFab)}get subtractmaskfromsilk(){return this._properties.subtractmaskfromsilk?.value}set subtractmaskfromsilk(value){this.setStringProperty("subtractmaskfromsilk",value,PlotParamSubtractMaskFromSilk)}get plot_black_and_white(){return this._properties.plot_black_and_white?.value}set plot_black_and_white(value){this.setStringProperty("plot_black_and_white",value,PlotParamPlotBlackAndWhite)}get plot_on_all_layers(){return this._properties.plot_on_all_layers?.value}set plot_on_all_layers(value){this.setStringProperty("plot_on_all_layers",value,PlotParamPlotOnAllLayers)}get plotinvisible(){return this._properties.plotinvisible?.value}set plotinvisible(value){this.setStringProperty("plotinvisible",value,PlotParamPlotInvisible)}get mode(){return this._properties.mode?.value}set mode(value){this.setNumberProperty("mode",value,PlotParamMode)}get useauxorigin(){return this._properties.useauxorigin?.value}set useauxorigin(value){this.setStringProperty("useauxorigin",value,PlotParamUseAuxOrigin)}get viasonmask(){return this._properties.viasonmask?.value}set viasonmask(value){this.setStringProperty("viasonmask",value,PlotParamViaOnMask)}get hpglpennumber(){return this._properties.hpglpennumber?.value}set hpglpennumber(value){this.setNumberProperty("hpglpennumber",value,PlotParamHpglPenNumber)}get hpglpenspeed(){return this._properties.hpglpenspeed?.value}set hpglpenspeed(value){this.setNumberProperty("hpglpenspeed",value,PlotParamHpglPenSpeed)}get hpglpendiameter(){return this._properties.hpglpendiameter?.value}set hpglpendiameter(value){this.setNumberProperty("hpglpendiameter",value,PlotParamHpglPenDiameter)}get hpglpenoverlay(){return this._properties.hpglpenoverlay?.value}set hpglpenoverlay(value){this.setNumberProperty("hpglpenoverlay",value,PlotParamHpglPenOverlay)}get pdf_front_fp_property_popups(){return this._properties.pdf_front_fp_property_popups?.value}set pdf_front_fp_property_popups(value){this.setStringProperty("pdf_front_fp_property_popups",value,PlotParamPdfFrontFpPropertyPopups)}get pdf_back_fp_property_popups(){return this._properties.pdf_back_fp_property_popups?.value}set pdf_back_fp_property_popups(value){this.setStringProperty("pdf_back_fp_property_popups",value,PlotParamPdfBackFpPropertyPopups)}get pdf_metadata(){return this._properties.pdf_metadata?.value}set pdf_metadata(value){this.setStringProperty("pdf_metadata",value,PlotParamPdfMetadata)}get pdf_single_document(){return this._properties.pdf_single_document?.value}set pdf_single_document(value){this.setStringProperty("pdf_single_document",value,PlotParamPdfSingleDocument)}get dxfpolygonmode(){return this._properties.dxfpolygonmode?.value}set dxfpolygonmode(value){this.setStringProperty("dxfpolygonmode",value,PlotParamDxfPolygonMode)}get dxfimperialunits(){return this._properties.dxfimperialunits?.value}set dxfimperialunits(value){this.setStringProperty("dxfimperialunits",value,PlotParamDxfImperialUnits)}get dxfusepcbnewfont(){return this._properties.dxfusepcbnewfont?.value}set dxfusepcbnewfont(value){this.setStringProperty("dxfusepcbnewfont",value,PlotParamDxfUsePcbnewFont)}get psnegative(){return this._properties.psnegative?.value}set psnegative(value){this.setStringProperty("psnegative",value,PlotParamPsNegative)}get psa4output(){return this._properties.psa4output?.value}set psa4output(value){this.setStringProperty("psa4output",value,PlotParamPsA4Output)}get mirror(){return this._properties.mirror?.value}set mirror(value){this.setStringProperty("mirror",value,PlotParamMirror)}get outputformat(){return this._properties.outputformat?.value}set outputformat(value){this.setNumberProperty("outputformat",value,PlotParamOutputFormat)}get drillshape(){return this._properties.drillshape?.value}set drillshape(value){this.setNumberProperty("drillshape",value,PlotParamDrillShape)}get scaleselection(){return this._properties.scaleselection?.value}set scaleselection(value){this.setNumberProperty("scaleselection",value,PlotParamScaleSelection)}get outputdirectory(){return this._properties.outputdirectory?.value}set outputdirectory(value){this.setStringProperty("outputdirectory",value,PlotParamOutputDirectory)}},__publicField(_a348,"token","pcbplotparams"),__publicField(_a348,"parentToken","setup"),_a348);SxClass.register(PcbPlotParams);var _a349,SetupStringProperty=(_a349=class extends SingleValueProperty{},__publicField(_a349,"parentToken","setup"),_a349),_a350,SetupZone45Only=(_a350=class extends SetupStringProperty{constructor(){super(...arguments);__publicField(this,"token","zone_45_only")}},__publicField(_a350,"token","zone_45_only"),_a350);SxClass.register(SetupZone45Only);var _a351,SetupAllowSoldermaskBridgesInFootprints=(_a351=class extends SetupStringProperty{constructor(){super(...arguments);__publicField(this,"token","allow_soldermask_bridges_in_footprints")}},__publicField(_a351,"token","allow_soldermask_bridges_in_footprints"),_a351);SxClass.register(SetupAllowSoldermaskBridgesInFootprints);var _a352,SetupVisibleElements=(_a352=class extends SetupStringProperty{constructor(){super(...arguments);__publicField(this,"token","visible_elements")}},__publicField(_a352,"token","visible_elements"),_a352);SxClass.register(SetupVisibleElements);var _a353,SetupUviasAllowed=(_a353=class extends SetupStringProperty{constructor(){super(...arguments);__publicField(this,"token","uvias_allowed")}},__publicField(_a353,"token","uvias_allowed"),_a353);SxClass.register(SetupUviasAllowed);var _a354,SetupTenting=(_a354=class extends SxClass{constructor(sides=[]){super();__publicField(this,"token","tenting");__publicField(this,"_sides",[]);this.sides=sides}static fromSexprPrimitives(primitiveSexprs){let sides=primitiveSexprs.map(primitive=>toStringValue(primitive)).filter(value=>value!==void 0);return new _a354(sides)}get sides(){return[...this._sides]}set sides(sides){this._sides=sides.map(side=>String(side))}getChildren(){return[]}getString(){return this._sides.length===0?"(tenting)":`(tenting ${this._sides.join(" ")})`}},__publicField(_a354,"token","tenting"),__publicField(_a354,"parentToken","setup"),_a354);SxClass.register(SetupTenting);var _a355,SetupNumericListProperty=(_a355=class extends NumericListProperty{},__publicField(_a355,"parentToken","setup"),_a355),_a356,SetupCoordinateProperty=(_a356=class extends CoordinateProperty{},__publicField(_a356,"parentToken","setup"),_a356),_a357,SetupPcbTextSize=(_a357=class extends SetupNumericListProperty{constructor(){super(...arguments);__publicField(this,"token","pcb_text_size")}},__publicField(_a357,"token","pcb_text_size"),_a357);SxClass.register(SetupPcbTextSize);var _a358,SetupModTextSize=(_a358=class extends SetupNumericListProperty{constructor(){super(...arguments);__publicField(this,"token","mod_text_size")}},__publicField(_a358,"token","mod_text_size"),_a358);SxClass.register(SetupModTextSize);var _a359,SetupPadSize=(_a359=class extends SetupNumericListProperty{constructor(){super(...arguments);__publicField(this,"token","pad_size")}},__publicField(_a359,"token","pad_size"),_a359);SxClass.register(SetupPadSize);var _a360,SetupPadToPasteClearanceValues=(_a360=class extends SetupNumericListProperty{constructor(){super(...arguments);__publicField(this,"token","pad_to_paste_clearance_values")}},__publicField(_a360,"token","pad_to_paste_clearance_values"),_a360);SxClass.register(SetupPadToPasteClearanceValues);var _a361,SetupTraceWidth=(_a361=class extends SetupNumericListProperty{constructor(){super(...arguments);__publicField(this,"token","trace_width")}},__publicField(_a361,"token","trace_width"),_a361);SxClass.register(SetupTraceWidth);var _a362,SetupAuxAxisOrigin=(_a362=class extends SetupCoordinateProperty{constructor(){super(...arguments);__publicField(this,"token","aux_axis_origin")}},__publicField(_a362,"token","aux_axis_origin"),_a362);SxClass.register(SetupAuxAxisOrigin);var _a363,SetupGridOrigin=(_a363=class extends SetupCoordinateProperty{constructor(){super(...arguments);__publicField(this,"token","grid_origin")}},__publicField(_a363,"token","grid_origin"),_a363);SxClass.register(SetupGridOrigin);var _a364,SetupNumberProperty=(_a364=class extends SingleValueProperty{static parsePrimitiveValue(value){let parsed=toNumberValue(value);if(parsed===void 0)throw new Error(`${this.name} expects a numeric value`);return parsed}},__publicField(_a364,"parentToken","setup"),_a364),_a365,SetupPadToMaskClearance=(_a365=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","pad_to_mask_clearance")}},__publicField(_a365,"token","pad_to_mask_clearance"),_a365);SxClass.register(SetupPadToMaskClearance);var _a366,SetupSolderMaskMinWidth=(_a366=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","solder_mask_min_width")}},__publicField(_a366,"token","solder_mask_min_width"),_a366);SxClass.register(SetupSolderMaskMinWidth);var _a367,SetupPadToPasteClearance=(_a367=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","pad_to_paste_clearance")}},__publicField(_a367,"token","pad_to_paste_clearance"),_a367);SxClass.register(SetupPadToPasteClearance);var _a368,SetupPadToPasteClearanceRatio=(_a368=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","pad_to_paste_clearance_ratio")}},__publicField(_a368,"token","pad_to_paste_clearance_ratio"),_a368);SxClass.register(SetupPadToPasteClearanceRatio);var _a369,SetupLastTraceWidth=(_a369=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","last_trace_width")}},__publicField(_a369,"token","last_trace_width"),_a369);SxClass.register(SetupLastTraceWidth);var _a370,SetupTraceClearance=(_a370=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","trace_clearance")}},__publicField(_a370,"token","trace_clearance"),_a370);SxClass.register(SetupTraceClearance);var _a371,SetupZoneClearance=(_a371=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","zone_clearance")}},__publicField(_a371,"token","zone_clearance"),_a371);SxClass.register(SetupZoneClearance);var _a372,SetupTraceMin=(_a372=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","trace_min")}},__publicField(_a372,"token","trace_min"),_a372);SxClass.register(SetupTraceMin);var _a373,SetupSegmentWidth=(_a373=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","segment_width")}},__publicField(_a373,"token","segment_width"),_a373);SxClass.register(SetupSegmentWidth);var _a374,SetupEdgeWidth=(_a374=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","edge_width")}},__publicField(_a374,"token","edge_width"),_a374);SxClass.register(SetupEdgeWidth);var _a375,SetupViaSize=(_a375=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","via_size")}},__publicField(_a375,"token","via_size"),_a375);SxClass.register(SetupViaSize);var _a376,SetupViaDrill=(_a376=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","via_drill")}},__publicField(_a376,"token","via_drill"),_a376);SxClass.register(SetupViaDrill);var _a377,SetupViaMinSize=(_a377=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","via_min_size")}},__publicField(_a377,"token","via_min_size"),_a377);SxClass.register(SetupViaMinSize);var _a378,SetupViaMinDrill=(_a378=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","via_min_drill")}},__publicField(_a378,"token","via_min_drill"),_a378);SxClass.register(SetupViaMinDrill);var _a379,SetupUviaSize=(_a379=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","uvia_size")}},__publicField(_a379,"token","uvia_size"),_a379);SxClass.register(SetupUviaSize);var _a380,SetupUviaDrill=(_a380=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","uvia_drill")}},__publicField(_a380,"token","uvia_drill"),_a380);SxClass.register(SetupUviaDrill);var _a381,SetupUviaMinSize=(_a381=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","uvia_min_size")}},__publicField(_a381,"token","uvia_min_size"),_a381);SxClass.register(SetupUviaMinSize);var _a382,SetupUviaMinDrill=(_a382=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","uvia_min_drill")}},__publicField(_a382,"token","uvia_min_drill"),_a382);SxClass.register(SetupUviaMinDrill);var _a383,SetupPcbTextWidth=(_a383=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","pcb_text_width")}},__publicField(_a383,"token","pcb_text_width"),_a383);SxClass.register(SetupPcbTextWidth);var _a384,SetupModEdgeWidth=(_a384=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","mod_edge_width")}},__publicField(_a384,"token","mod_edge_width"),_a384);SxClass.register(SetupModEdgeWidth);var _a385,SetupModTextWidth=(_a385=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","mod_text_width")}},__publicField(_a385,"token","mod_text_width"),_a385);SxClass.register(SetupModTextWidth);var _a386,SetupPadDrill=(_a386=class extends SetupNumberProperty{constructor(){super(...arguments);__publicField(this,"token","pad_drill")}},__publicField(_a386,"token","pad_drill"),_a386);SxClass.register(SetupPadDrill);var _a387,StackupSingleValueProperty=(_a387=class extends SingleValueProperty{},__publicField(_a387,"parentToken","stackup"),_a387),_a388,StackupCopperFinish=(_a388=class extends StackupSingleValueProperty{constructor(){super(...arguments);__publicField(this,"token","copper_finish");__publicField(this,"quoteStringValue",!0)}},__publicField(_a388,"token","copper_finish"),_a388);SxClass.register(StackupCopperFinish);var _a389,StackupDielectricConstraints=(_a389=class extends StackupSingleValueProperty{constructor(){super(...arguments);__publicField(this,"token","dielectric_constraints")}},__publicField(_a389,"token","dielectric_constraints"),_a389);SxClass.register(StackupDielectricConstraints);var _a390,StackupEdgeConnector=(_a390=class extends StackupSingleValueProperty{constructor(){super(...arguments);__publicField(this,"token","edge_connector")}},__publicField(_a390,"token","edge_connector"),_a390);SxClass.register(StackupEdgeConnector);var _a391,StackupCastellatedPads=(_a391=class extends StackupSingleValueProperty{constructor(){super(...arguments);__publicField(this,"token","castellated_pads")}},__publicField(_a391,"token","castellated_pads"),_a391);SxClass.register(StackupCastellatedPads);var _a392,StackupEdgePlating=(_a392=class extends StackupSingleValueProperty{constructor(){super(...arguments);__publicField(this,"token","edge_plating")}},__publicField(_a392,"token","edge_plating"),_a392);SxClass.register(StackupEdgePlating);var _a393,StackupLayerProperty=(_a393=class extends SingleValueProperty{},__publicField(_a393,"parentToken","layer"),_a393),_a394,StackupLayerType=(_a394=class extends StackupLayerProperty{constructor(){super(...arguments);__publicField(this,"token","type");__publicField(this,"quoteStringValue",!0)}},__publicField(_a394,"token","type"),_a394);SxClass.register(StackupLayerType);var _a395,StackupLayerColor=(_a395=class extends StackupLayerProperty{constructor(){super(...arguments);__publicField(this,"token","color");__publicField(this,"quoteStringValue",!0)}},__publicField(_a395,"token","color"),_a395);SxClass.register(StackupLayerColor);var _a396,StackupLayerThickness=(_a396=class extends StackupLayerProperty{constructor(){super(...arguments);__publicField(this,"token","thickness")}static parsePrimitiveValue(value){let parsed=toNumberValue(value);if(parsed===void 0)throw new Error("Stackup layer thickness expects a numeric value");return parsed}},__publicField(_a396,"token","thickness"),_a396);SxClass.register(StackupLayerThickness);var _a397,StackupLayerMaterial=(_a397=class extends StackupLayerProperty{constructor(){super(...arguments);__publicField(this,"token","material");__publicField(this,"quoteStringValue",!0)}},__publicField(_a397,"token","material"),_a397);SxClass.register(StackupLayerMaterial);var _a398,StackupLayerEpsilonR=(_a398=class extends StackupLayerProperty{constructor(){super(...arguments);__publicField(this,"token","epsilon_r")}static parsePrimitiveValue(value){let parsed=toNumberValue(value);if(parsed===void 0)throw new Error("Stackup layer epsilon_r expects a numeric value");return parsed}},__publicField(_a398,"token","epsilon_r"),_a398);SxClass.register(StackupLayerEpsilonR);var _a399,StackupLayerLossTangent=(_a399=class extends StackupLayerProperty{constructor(){super(...arguments);__publicField(this,"token","loss_tangent")}static parsePrimitiveValue(value){let parsed=toNumberValue(value);if(parsed===void 0)throw new Error("Stackup layer loss_tangent expects a numeric value");return parsed}},__publicField(_a399,"token","loss_tangent"),_a399);SxClass.register(StackupLayerLossTangent);var _a400,StackupLayer=(_a400=class extends SxClass{constructor(name,opts={}){super();__publicField(this,"token","layer");__publicField(this,"_name");__publicField(this,"_number");__publicField(this,"_sxType");__publicField(this,"_sxColor");__publicField(this,"_sxThickness");__publicField(this,"_sxMaterial");__publicField(this,"_sxEpsilonR");__publicField(this,"_sxLossTangent");this._name=name,this._number=opts.number,this._sxType=opts.type,this._sxColor=opts.color,this._sxThickness=opts.thickness,this._sxMaterial=opts.material,this._sxEpsilonR=opts.epsilonR,this._sxLossTangent=opts.lossTangent}static fromSexprPrimitives(primitiveSexprs){if(primitiveSexprs.length===0)throw new Error("Stackup layer requires at least a name");let name=toStringValue(primitiveSexprs[0]);if(name===void 0)throw new Error("Stackup layer name must be a string");let propertyIndex=1,number,maybeNumber2=primitiveSexprs[propertyIndex],numericLayerNumber=toNumberValue(maybeNumber2);numericLayerNumber!==void 0&&(number=numericLayerNumber,propertyIndex+=1);let propertyPrimitives=primitiveSexprs.slice(propertyIndex),{propertyMap}=SxClass.parsePrimitivesToClassProperties(propertyPrimitives,this.token);return new _a400(name,{number,type:propertyMap.type,color:propertyMap.color,thickness:propertyMap.thickness,material:propertyMap.material,epsilonR:propertyMap.epsilon_r,lossTangent:propertyMap.loss_tangent})}get name(){return this._name}set name(value){let parsed=toStringValue(value);if(parsed===void 0)throw new Error("Stackup layer name must be a string");this._name=parsed}get number(){return this._number}set number(value){if(value===void 0){this._number=void 0;return}let parsed=toNumberValue(value);if(parsed===void 0)throw new Error("Stackup layer number must be numeric");this._number=parsed}get type(){return this._sxType?.value}set type(value){if(value===void 0){this._sxType=void 0;return}this._sxType=value instanceof StackupLayerType?value:new StackupLayerType(value)}get color(){return this._sxColor?.value}set color(value){if(value===void 0){this._sxColor=void 0;return}this._sxColor=value instanceof StackupLayerColor?value:new StackupLayerColor(value)}get thickness(){return this._sxThickness?.value}set thickness(value){if(value===void 0){this._sxThickness=void 0;return}this._sxThickness=value instanceof StackupLayerThickness?value:new StackupLayerThickness(value)}get material(){return this._sxMaterial?.value}set material(value){if(value===void 0){this._sxMaterial=void 0;return}this._sxMaterial=value instanceof StackupLayerMaterial?value:new StackupLayerMaterial(value)}get epsilonR(){return this._sxEpsilonR?.value}set epsilonR(value){if(value===void 0){this._sxEpsilonR=void 0;return}this._sxEpsilonR=value instanceof StackupLayerEpsilonR?value:new StackupLayerEpsilonR(value)}get lossTangent(){return this._sxLossTangent?.value}set lossTangent(value){if(value===void 0){this._sxLossTangent=void 0;return}this._sxLossTangent=value instanceof StackupLayerLossTangent?value:new StackupLayerLossTangent(value)}getChildren(){let children=[];return this._sxType&&children.push(this._sxType),this._sxColor&&children.push(this._sxColor),this._sxThickness&&children.push(this._sxThickness),this._sxMaterial&&children.push(this._sxMaterial),this._sxEpsilonR&&children.push(this._sxEpsilonR),this._sxLossTangent&&children.push(this._sxLossTangent),children}getString(){let header=`(layer ${quoteSExprString(this._name)}${this._number!==void 0?` ${this._number}`:""}`,children=this.getChildren();if(children.length===0)return`${header})`;let lines=[header];for(let child of children)lines.push(child.getStringIndented());return lines.push(")"),lines.join(`
|
|
771
771
|
`)}},__publicField(_a400,"token","layer"),__publicField(_a400,"parentToken","stackup"),_a400);SxClass.register(StackupLayer);var _a401,Stackup=(_a401=class extends SxClass{constructor(opts={}){super();__publicField(this,"token","stackup");__publicField(this,"_layers",[]);__publicField(this,"_sxCopperFinish");__publicField(this,"_sxDielectricConstraints");__publicField(this,"_sxEdgeConnector");__publicField(this,"_sxCastellatedPads");__publicField(this,"_sxEdgePlating");this.layers=opts.layers??[],this._sxCopperFinish=opts.copperFinish,this._sxDielectricConstraints=opts.dielectricConstraints,this._sxEdgeConnector=opts.edgeConnector,this._sxCastellatedPads=opts.castellatedPads,this._sxEdgePlating=opts.edgePlating}static fromSexprPrimitives(primitiveSexprs){let{propertyMap,arrayPropertyMap}=SxClass.parsePrimitivesToClassProperties(primitiveSexprs,this.token);return new _a401({layers:arrayPropertyMap.layer??[],copperFinish:propertyMap.copper_finish,dielectricConstraints:propertyMap.dielectric_constraints,edgeConnector:propertyMap.edge_connector,castellatedPads:propertyMap.castellated_pads,edgePlating:propertyMap.edge_plating})}get layers(){return[...this._layers]}set layers(layers){this._layers=layers.map(layer=>{if(!(layer instanceof StackupLayer))throw new Error("Stackup layers must be StackupLayer instances");return layer})}get copperFinish(){return this._sxCopperFinish?.value}set copperFinish(value){this._sxCopperFinish=value?new StackupCopperFinish(value):void 0}get dielectricConstraints(){return this._sxDielectricConstraints?.value}set dielectricConstraints(value){this._sxDielectricConstraints=value?new StackupDielectricConstraints(value):void 0}get edgeConnector(){return this._sxEdgeConnector?.value}set edgeConnector(value){this._sxEdgeConnector=value?new StackupEdgeConnector(value):void 0}get castellatedPads(){return this._sxCastellatedPads?.value}set castellatedPads(value){this._sxCastellatedPads=value?new StackupCastellatedPads(value):void 0}get edgePlating(){return this._sxEdgePlating?.value}set edgePlating(value){this._sxEdgePlating=value?new StackupEdgePlating(value):void 0}getChildren(){let children=[...this._layers],optionalChildren=[this._sxCopperFinish,this._sxDielectricConstraints,this._sxEdgeConnector,this._sxCastellatedPads,this._sxEdgePlating];for(let child of optionalChildren)child&&children.push(child);return children}},__publicField(_a401,"token","stackup"),__publicField(_a401,"parentToken","setup"),_a401);SxClass.register(Stackup);var TOKEN_TO_KEY2={stackup:"stackup",pcbplotparams:"pcbPlotParams",pad_to_mask_clearance:"padToMaskClearance",solder_mask_min_width:"solderMaskMinWidth",pad_to_paste_clearance:"padToPasteClearance",pad_to_paste_clearance_ratio:"padToPasteClearanceRatio",last_trace_width:"lastTraceWidth",trace_clearance:"traceClearance",zone_clearance:"zoneClearance",zone_45_only:"zone45Only",trace_min:"traceMin",segment_width:"segmentWidth",edge_width:"edgeWidth",via_size:"viaSize",via_drill:"viaDrill",via_min_size:"viaMinSize",via_min_drill:"viaMinDrill",uvias_allowed:"uviasAllowed",uvia_size:"uviaSize",uvia_drill:"uviaDrill",uvia_min_size:"uviaMinSize",uvia_min_drill:"uviaMinDrill",pcb_text_width:"pcbTextWidth",pcb_text_size:"pcbTextSize",mod_edge_width:"modEdgeWidth",mod_text_size:"modTextSize",mod_text_width:"modTextWidth",pad_size:"padSize",pad_drill:"padDrill",allow_soldermask_bridges_in_footprints:"allowSoldermaskBridgesInFootprints",tenting:"tenting",aux_axis_origin:"auxAxisOrigin",grid_origin:"gridOrigin",visible_elements:"visibleElements",pad_to_paste_clearance_values:"padToPasteClearanceValues",trace_width:"traceWidth"},SETUP_CHILD_ORDER=["stackup","padToMaskClearance","solderMaskMinWidth","padToPasteClearance","padToPasteClearanceRatio","lastTraceWidth","traceClearance","zoneClearance","zone45Only","traceMin","segmentWidth","edgeWidth","viaSize","viaDrill","viaMinSize","viaMinDrill","uviaSize","uviaDrill","uviasAllowed","uviaMinSize","uviaMinDrill","pcbTextWidth","pcbTextSize","modEdgeWidth","modTextSize","modTextWidth","padSize","padDrill","allowSoldermaskBridgesInFootprints","tenting","auxAxisOrigin","gridOrigin","visibleElements","padToPasteClearanceValues","traceWidth","pcbPlotParams"],_a402,Setup=(_a402=class extends SxClass{constructor(){super(...arguments);__publicField(this,"token","setup");__publicField(this,"_properties",{})}static fromSexprPrimitives(primitiveSexprs){let setup=new _a402,{propertyMap}=SxClass.parsePrimitivesToClassProperties(primitiveSexprs,this.token);for(let[token,instance]of Object.entries(propertyMap)){let key=TOKEN_TO_KEY2[token];if(!key)throw new Error(`Unsupported setup property token: ${token}`);setup._properties[key]=instance}return setup}getChildren(){let children=[];for(let key of SETUP_CHILD_ORDER){let child=this._properties[key];child&&children.push(child)}return children}setProperty(key,instance){if(instance){this._properties[key]=instance;return}delete this._properties[key]}setNumberProperty(key,value,ClassRef){if(value===void 0){delete this._properties[key];return}this._properties[key]=new ClassRef(value)}getPropertyInstance(key,ClassRef){let value=this._properties[key];return value instanceof ClassRef?value:void 0}get stackup(){return this.getPropertyInstance("stackup",Stackup)}set stackup(value){if(value!==void 0&&!(value instanceof Stackup))throw new Error("stackup must be a Stackup instance");this.setProperty("stackup",value)}get pcbPlotParams(){return this.getPropertyInstance("pcbPlotParams",PcbPlotParams)}set pcbPlotParams(value){if(value!==void 0&&!(value instanceof PcbPlotParams))throw new Error("pcbPlotParams must be a PcbPlotParams instance");this.setProperty("pcbPlotParams",value)}get padToMaskClearance(){return this.getPropertyInstance("padToMaskClearance",SetupPadToMaskClearance)?.value}set padToMaskClearance(value){this.setNumberProperty("padToMaskClearance",value,SetupPadToMaskClearance)}get solderMaskMinWidth(){return this.getPropertyInstance("solderMaskMinWidth",SetupSolderMaskMinWidth)?.value}set solderMaskMinWidth(value){this.setNumberProperty("solderMaskMinWidth",value,SetupSolderMaskMinWidth)}get padToPasteClearance(){return this.getPropertyInstance("padToPasteClearance",SetupPadToPasteClearance)?.value}set padToPasteClearance(value){this.setNumberProperty("padToPasteClearance",value,SetupPadToPasteClearance)}get padToPasteClearanceRatio(){return this.getPropertyInstance("padToPasteClearanceRatio",SetupPadToPasteClearanceRatio)?.value}set padToPasteClearanceRatio(value){this.setNumberProperty("padToPasteClearanceRatio",value,SetupPadToPasteClearanceRatio)}get lastTraceWidth(){return this.getPropertyInstance("lastTraceWidth",SetupLastTraceWidth)?.value}set lastTraceWidth(value){this.setNumberProperty("lastTraceWidth",value,SetupLastTraceWidth)}get traceClearance(){return this.getPropertyInstance("traceClearance",SetupTraceClearance)?.value}set traceClearance(value){this.setNumberProperty("traceClearance",value,SetupTraceClearance)}get zoneClearance(){return this.getPropertyInstance("zoneClearance",SetupZoneClearance)?.value}set zoneClearance(value){this.setNumberProperty("zoneClearance",value,SetupZoneClearance)}get zone45Only(){return this.getPropertyInstance("zone45Only",SetupZone45Only)?.value}set zone45Only(value){this.setProperty("zone45Only",value===void 0?void 0:new SetupZone45Only(value))}get traceMin(){return this.getPropertyInstance("traceMin",SetupTraceMin)?.value}set traceMin(value){this.setNumberProperty("traceMin",value,SetupTraceMin)}get segmentWidth(){return this.getPropertyInstance("segmentWidth",SetupSegmentWidth)?.value}set segmentWidth(value){this.setNumberProperty("segmentWidth",value,SetupSegmentWidth)}get edgeWidth(){return this.getPropertyInstance("edgeWidth",SetupEdgeWidth)?.value}set edgeWidth(value){this.setNumberProperty("edgeWidth",value,SetupEdgeWidth)}get viaSize(){return this.getPropertyInstance("viaSize",SetupViaSize)?.value}set viaSize(value){this.setNumberProperty("viaSize",value,SetupViaSize)}get viaDrill(){return this.getPropertyInstance("viaDrill",SetupViaDrill)?.value}set viaDrill(value){this.setNumberProperty("viaDrill",value,SetupViaDrill)}get viaMinSize(){return this.getPropertyInstance("viaMinSize",SetupViaMinSize)?.value}set viaMinSize(value){this.setNumberProperty("viaMinSize",value,SetupViaMinSize)}get viaMinDrill(){return this.getPropertyInstance("viaMinDrill",SetupViaMinDrill)?.value}set viaMinDrill(value){this.setNumberProperty("viaMinDrill",value,SetupViaMinDrill)}get uviasAllowed(){return this.getPropertyInstance("uviasAllowed",SetupUviasAllowed)?.value}set uviasAllowed(value){this.setProperty("uviasAllowed",value===void 0?void 0:new SetupUviasAllowed(value))}get uviaSize(){return this.getPropertyInstance("uviaSize",SetupUviaSize)?.value}set uviaSize(value){this.setNumberProperty("uviaSize",value,SetupUviaSize)}get uviaDrill(){return this.getPropertyInstance("uviaDrill",SetupUviaDrill)?.value}set uviaDrill(value){this.setNumberProperty("uviaDrill",value,SetupUviaDrill)}get uviaMinSize(){return this.getPropertyInstance("uviaMinSize",SetupUviaMinSize)?.value}set uviaMinSize(value){this.setNumberProperty("uviaMinSize",value,SetupUviaMinSize)}get uviaMinDrill(){return this.getPropertyInstance("uviaMinDrill",SetupUviaMinDrill)?.value}set uviaMinDrill(value){this.setNumberProperty("uviaMinDrill",value,SetupUviaMinDrill)}get pcbTextWidth(){return this.getPropertyInstance("pcbTextWidth",SetupPcbTextWidth)?.value}set pcbTextWidth(value){this.setNumberProperty("pcbTextWidth",value,SetupPcbTextWidth)}get pcbTextSize(){return this.getPropertyInstance("pcbTextSize",SetupPcbTextSize)?.values}set pcbTextSize(values){if(values===void 0){delete this._properties.pcbTextSize;return}this.setProperty("pcbTextSize",new SetupPcbTextSize(values))}get modEdgeWidth(){return this.getPropertyInstance("modEdgeWidth",SetupModEdgeWidth)?.value}set modEdgeWidth(value){this.setNumberProperty("modEdgeWidth",value,SetupModEdgeWidth)}get modTextSize(){return this.getPropertyInstance("modTextSize",SetupModTextSize)?.values}set modTextSize(values){if(values===void 0){delete this._properties.modTextSize;return}this.setProperty("modTextSize",new SetupModTextSize(values))}get modTextWidth(){return this.getPropertyInstance("modTextWidth",SetupModTextWidth)?.value}set modTextWidth(value){this.setNumberProperty("modTextWidth",value,SetupModTextWidth)}get padSize(){return this.getPropertyInstance("padSize",SetupPadSize)?.values}set padSize(values){if(values===void 0){delete this._properties.padSize;return}this.setProperty("padSize",new SetupPadSize(values))}get padDrill(){return this.getPropertyInstance("padDrill",SetupPadDrill)?.value}set padDrill(value){this.setNumberProperty("padDrill",value,SetupPadDrill)}get allowSoldermaskBridgesInFootprints(){return this.getPropertyInstance("allowSoldermaskBridgesInFootprints",SetupAllowSoldermaskBridgesInFootprints)?.value}set allowSoldermaskBridgesInFootprints(value){this.setProperty("allowSoldermaskBridgesInFootprints",value===void 0?void 0:new SetupAllowSoldermaskBridgesInFootprints(value))}get tenting(){return this.getPropertyInstance("tenting",SetupTenting)?.sides}set tenting(sides){if(sides===void 0){delete this._properties.tenting;return}this.setProperty("tenting",new SetupTenting(sides))}get auxAxisOrigin(){let origin=this.getPropertyInstance("auxAxisOrigin",SetupAuxAxisOrigin);if(origin)return{x:origin.x,y:origin.y}}set auxAxisOrigin(origin){if(!origin){delete this._properties.auxAxisOrigin;return}this.setProperty("auxAxisOrigin",new SetupAuxAxisOrigin(origin.x,origin.y))}get gridOrigin(){let origin=this.getPropertyInstance("gridOrigin",SetupGridOrigin);if(origin)return{x:origin.x,y:origin.y}}set gridOrigin(origin){if(!origin){delete this._properties.gridOrigin;return}this.setProperty("gridOrigin",new SetupGridOrigin(origin.x,origin.y))}get visibleElements(){return this.getPropertyInstance("visibleElements",SetupVisibleElements)?.value}set visibleElements(value){this.setProperty("visibleElements",value===void 0?void 0:new SetupVisibleElements(value))}get padToPasteClearanceValues(){return this.getPropertyInstance("padToPasteClearanceValues",SetupPadToPasteClearanceValues)?.values}set padToPasteClearanceValues(values){if(values===void 0){delete this._properties.padToPasteClearanceValues;return}this.setProperty("padToPasteClearanceValues",new SetupPadToPasteClearanceValues(values))}get traceWidth(){return this.getPropertyInstance("traceWidth",SetupTraceWidth)?.values}set traceWidth(values){if(values===void 0){delete this._properties.traceWidth;return}this.setProperty("traceWidth",new SetupTraceWidth(values))}},__publicField(_a402,"token","setup"),_a402);SxClass.register(Setup);var _a403,PcbGeneralThickness=(_a403=class extends SxPrimitiveNumber{constructor(){super(...arguments);__publicField(this,"token","thickness")}},__publicField(_a403,"token","thickness"),__publicField(_a403,"parentToken","general"),_a403);SxClass.register(PcbGeneralThickness);var _a404,PcbGeneralLegacyTeardrops=(_a404=class extends SxClass{constructor(enabled){super();__publicField(this,"token","legacy_teardrops");__publicField(this,"_enabled");this._enabled=enabled}static fromSexprPrimitives(primitiveSexprs){let value=toStringValue(primitiveSexprs[0]);if(value===void 0)throw new Error("legacy_teardrops expects a string value");let enabled=/^(yes|true)$/iu.test(value);return new _a404(enabled)}get enabled(){return this._enabled}set enabled(value){this._enabled=value}getChildren(){return[]}getString(){return`(legacy_teardrops ${this._enabled?"yes":"no"})`}},__publicField(_a404,"token","legacy_teardrops"),__publicField(_a404,"parentToken","general"),_a404);SxClass.register(PcbGeneralLegacyTeardrops);var SINGLE_TOKENS3=new Set(["thickness","legacy_teardrops"]),_a405,PcbGeneral=(_a405=class extends SxClass{constructor(){super(...arguments);__publicField(this,"token","general");__publicField(this,"_sxThickness");__publicField(this,"_sxLegacyTeardrops")}static fromSexprPrimitives(primitiveSexprs){let general=new _a405,{propertyMap,arrayPropertyMap}=SxClass.parsePrimitivesToClassProperties(primitiveSexprs,this.token);for(let token of Object.keys(propertyMap))if(!SINGLE_TOKENS3.has(token))throw new Error(`general encountered unsupported child token "${token}"`);for(let[token,entries]of Object.entries(arrayPropertyMap)){if(!SINGLE_TOKENS3.has(token))throw new Error(`general encountered unsupported child token "${token}"`);if(entries.length>1)throw new Error(`general encountered repeated child token "${token}"`)}return general._sxThickness=arrayPropertyMap.thickness?.[0]??propertyMap.thickness,general._sxLegacyTeardrops=arrayPropertyMap.legacy_teardrops?.[0]??propertyMap.legacy_teardrops,general}get thickness(){return this._sxThickness?.value}set thickness(value){this._sxThickness=value===void 0?void 0:new PcbGeneralThickness(value)}get legacyTeardrops(){return this._sxLegacyTeardrops?.enabled}set legacyTeardrops(value){if(value===void 0){this._sxLegacyTeardrops=void 0;return}this._sxLegacyTeardrops=new PcbGeneralLegacyTeardrops(value)}getChildren(){let children=[];return this._sxThickness&&children.push(this._sxThickness),this._sxLegacyTeardrops&&children.push(this._sxLegacyTeardrops),children}},__publicField(_a405,"token","general"),__publicField(_a405,"parentToken","kicad_pcb"),_a405);SxClass.register(PcbGeneral);var _a406,PcbLayerDefinition=(_a406=class extends SxClass{constructor(options){super();__publicField(this,"token","__pcb_layer_definition__");__publicField(this,"_index");__publicField(this,"_name");__publicField(this,"_type");__publicField(this,"_userName");this._index=options.index,this._name=options.name,this._type=options.type,this._userName=options.userName}static fromPrimitive(primitive){if(!Array.isArray(primitive)||primitive.length<3)throw new Error(`layers entry must be an array with at least index, name, and type: ${JSON.stringify(primitive)}`);let[rawIndex,rawName,rawType,rawUser]=primitive,index=toNumberValue(rawIndex),name=toStringValue(rawName),type=toStringValue(rawType),userName=rawUser===void 0?void 0:toStringValue(rawUser);if(index===void 0||name===void 0||type===void 0)throw new Error(`layers entry is missing required values: ${JSON.stringify(primitive)}`);return new _a406({index,name,type,userName})}get index(){return this._index}set index(value){this._index=value}get name(){return this._name}set name(value){this._name=value}get type(){return this._type}set type(value){this._type=value}get userName(){return this._userName}set userName(value){this._userName=value}getChildren(){return[]}getString(){if(this._index===void 0||this._name===void 0||this._type===void 0)return"()";let tokens=[String(this._index),quoteSExprString(this._name),this._type];return this._userName!==void 0&&tokens.push(quoteSExprString(this._userName)),`(${tokens.join(" ")})`}},__publicField(_a406,"token","__pcb_layer_definition__"),__publicField(_a406,"parentToken","layers"),_a406);SxClass.register(PcbLayerDefinition);var _a407,PcbLayers=(_a407=class extends SxClass{constructor(){super(...arguments);__publicField(this,"token","layers");__publicField(this,"_definitions",[])}static fromSexprPrimitives(primitiveSexprs){let layers=new _a407;return layers._definitions=primitiveSexprs.map(primitive=>PcbLayerDefinition.fromPrimitive(primitive)),layers}get definitions(){return[...this._definitions]}set definitions(value){this._definitions=[...value]}getChildren(){return[...this._definitions]}},__publicField(_a407,"token","layers"),__publicField(_a407,"parentToken","kicad_pcb"),_a407);SxClass.register(PcbLayers);var _a408,PcbNet=(_a408=class extends SxClass{constructor(id2,name){super();__publicField(this,"token","net");__publicField(this,"_id");__publicField(this,"_name");this._id=id2,this._name=name}static fromSexprPrimitives(primitiveSexprs){let id2=toNumberValue(primitiveSexprs[0]),name=toStringValue(primitiveSexprs[1]);if(id2===void 0||name===void 0)throw new Error("net requires numeric id and string name");return new _a408(id2,name)}get id(){return this._id}set id(value){this._id=value}get name(){return this._name}set name(value){this._name=value}getChildren(){return[]}getString(){return`(net ${this._id} ${quoteSExprString(this._name)})`}},__publicField(_a408,"token","net"),__publicField(_a408,"parentToken","kicad_pcb"),_a408);SxClass.register(PcbNet);var _a409,PcbVersion=(_a409=class extends SxPrimitiveNumber{constructor(){super(...arguments);__publicField(this,"token","version")}},__publicField(_a409,"token","version"),__publicField(_a409,"parentToken","kicad_pcb"),_a409);SxClass.register(PcbVersion);var isSymbol3=value=>/^[A-Za-z0-9._-]+$/.test(value),_a410,PcbGenerator=(_a410=class extends SxPrimitiveString{constructor(){super(...arguments);__publicField(this,"token","generator")}getString(){return`(generator ${isSymbol3(this.value)?this.value:quoteSExprString(this.value)})`}},__publicField(_a410,"token","generator"),__publicField(_a410,"parentToken","kicad_pcb"),_a410);SxClass.register(PcbGenerator);var isSymbol4=value=>/^[A-Za-z0-9._-]+$/.test(value),_a411,PcbGeneratorVersion=(_a411=class extends SxPrimitiveString{constructor(){super(...arguments);__publicField(this,"token","generator_version")}getString(){return`(generator_version ${isSymbol4(this.value)?this.value:quoteSExprString(this.value)})`}},__publicField(_a411,"token","generator_version"),__publicField(_a411,"parentToken","kicad_pcb"),_a411);SxClass.register(PcbGeneratorVersion);var _a412,ViaNet=(_a412=class extends SxClass{constructor(id2,name){super();__publicField(this,"token","net");__publicField(this,"_id");__publicField(this,"_name");this._id=id2,this._name=name}static fromSexprPrimitives(primitiveSexprs){let id2=toNumberValue(primitiveSexprs[0]);if(id2===void 0)throw new Error("via net requires a numeric id");let name=primitiveSexprs.length>1?toStringValue(primitiveSexprs[1]):void 0;return new _a412(id2,name)}get id(){return this._id}set id(value){this._id=value}get name(){return this._name}set name(value){this._name=value}getChildren(){return[]}getString(){return this._name!==void 0?`(net ${this._id} ${quoteSExprString(this._name)})`:`(net ${this._id})`}},__publicField(_a412,"token","net"),__publicField(_a412,"parentToken","via"),_a412);SxClass.register(ViaNet);var BARE_FLAGS=new Set(["locked","free","remove_unused_layers","keep_end_layers"]),_a413,Via2=(_a413=class extends SxClass{constructor(params={}){super();__publicField(this,"token","via");__publicField(this,"_type");__publicField(this,"_locked",!1);__publicField(this,"_free",!1);__publicField(this,"_removeUnusedLayers",!1);__publicField(this,"_keepEndLayers",!1);__publicField(this,"_sxAt");__publicField(this,"_size");__publicField(this,"_drill");__publicField(this,"_sxLayers");__publicField(this,"_sxNet");__publicField(this,"_sxUuid");__publicField(this,"_sxTstamp");__publicField(this,"_sxTeardrops");params.type!==void 0&&(this.type=params.type),params.locked!==void 0&&(this.locked=params.locked),params.free!==void 0&&(this.free=params.free),params.removeUnusedLayers!==void 0&&(this.removeUnusedLayers=params.removeUnusedLayers),params.keepEndLayers!==void 0&&(this.keepEndLayers=params.keepEndLayers),params.at!==void 0&&(this.at=params.at),params.size!==void 0&&(this.size=params.size),params.drill!==void 0&&(this.drill=params.drill),params.layers!==void 0&&(this.layers=params.layers),params.net!==void 0&&(this.net=params.net),params.uuid!==void 0&&(this.uuid=params.uuid),params.tstamp!==void 0&&(this.tstamp=params.tstamp),params.teardrops!==void 0&&(this.teardrops=params.teardrops)}static fromSexprPrimitives(primitiveSexprs){let via=new _a413;for(let primitive of primitiveSexprs){if(typeof primitive=="string"){via.consumeBareToken(primitive);continue}if(!Array.isArray(primitive)||primitive.length===0)throw new Error(`via encountered unsupported primitive child: ${JSON.stringify(primitive)}`);let[token,...rest]=primitive;if(typeof token!="string")throw new Error(`via encountered child with non-string token: ${JSON.stringify(primitive)}`);via.consumeNode(token,rest)}return via}consumeBareToken(token){if(token==="blind"||token==="micro"){this._type=token;return}if(!BARE_FLAGS.has(token))throw new Error(`via encountered unsupported flag "${token}"`);switch(token){case"locked":this._locked=!0;break;case"free":this._free=!0;break;case"remove_unused_layers":this._removeUnusedLayers=!0;break;case"keep_end_layers":this._keepEndLayers=!0;break}}consumeNode(token,args){switch(token){case"type":{let value=toStringValue(args[0]);if(value===void 0)throw new Error("via type expects a string value");this._type=value;return}case"locked":this._locked=this.parseYesNo(args);return;case"free":this._free=this.parseYesNo(args);return;case"remove_unused_layers":this._removeUnusedLayers=this.parseYesNo(args);return;case"keep_end_layers":this._keepEndLayers=this.parseYesNo(args);return;case"at":{let parsed=SxClass.parsePrimitiveSexpr(["at",...args],{parentToken:this.token});if(!(parsed instanceof At3))throw new Error("via failed to parse at child");this._sxAt=parsed;return}case"size":{let value=toNumberValue(args[0]);if(value===void 0)throw new Error("via size expects a numeric value");this._size=value;return}case"drill":{let value=toNumberValue(args[0]);if(value===void 0)throw new Error("via drill expects a numeric value");this._drill=value;return}case"layers":{this._sxLayers=Layers.fromSexprPrimitives(args);return}case"net":{this._sxNet=ViaNet.fromSexprPrimitives(args);return}case"teardrops":{this._sxTeardrops=PadTeardrops.fromSexprPrimitives(args);return}case"uuid":{let value=toStringValue(args[0]);if(value===void 0)throw new Error("via uuid expects a string value");this._sxUuid=new Uuid(value);return}case"tstamp":{let value=toStringValue(args[0]);if(value===void 0)throw new Error("via tstamp expects a string value");this._sxTstamp=new Tstamp(value);return}default:throw new Error(`via encountered unsupported child token "${token}"`)}}parseYesNo(args){if(args.length===0)return!0;let value=toStringValue(args[0]);if(value===void 0)throw new Error("Expected string when parsing via boolean child");return/^(yes|true)$/iu.test(value)}get type(){return this._type}set type(value){this._type=value}get locked(){return this._locked}set locked(value){this._locked=value}get free(){return this._free}set free(value){this._free=value}get removeUnusedLayers(){return this._removeUnusedLayers}set removeUnusedLayers(value){this._removeUnusedLayers=value}get keepEndLayers(){return this._keepEndLayers}set keepEndLayers(value){this._keepEndLayers=value}get at(){return this._sxAt}set at(value){this._sxAt=value!==void 0?At3.from(value):void 0}get size(){return this._size}set size(value){this._size=value}get drill(){return this._drill}set drill(value){this._drill=value}get layers(){return this._sxLayers}set layers(value){if(value===void 0){this._sxLayers=void 0;return}this._sxLayers=value instanceof Layers?value:new Layers(value)}get net(){return this._sxNet}set net(value){this._sxNet=value}get uuid(){return this._sxUuid}set uuid(value){if(value===void 0){this._sxUuid=void 0;return}this._sxUuid=value instanceof Uuid?value:new Uuid(value)}get teardrops(){return this._sxTeardrops}set teardrops(value){this._sxTeardrops=value}get tstamp(){return this._sxTstamp}set tstamp(value){if(value===void 0){this._sxTstamp=void 0;return}this._sxTstamp=value instanceof Tstamp?value:new Tstamp(value)}getChildren(){let children=[];return this._sxAt&&children.push(this._sxAt),this._sxLayers&&children.push(this._sxLayers),this._sxNet&&children.push(this._sxNet),this._sxUuid&&children.push(this._sxUuid),this._sxTstamp&&children.push(this._sxTstamp),this._sxTeardrops&&children.push(this._sxTeardrops),children}getString(){let lines=["(via"];return this._type!==void 0&&lines.push(` (type ${this._type})`),this._locked&&lines.push(" (locked)"),this._free&&lines.push(" (free)"),this._removeUnusedLayers&&lines.push(" (remove_unused_layers)"),this._keepEndLayers&&lines.push(" (keep_end_layers)"),this._sxAt&&lines.push(this._sxAt.getStringIndented()),this._size!==void 0&&lines.push(` (size ${this._size})`),this._drill!==void 0&&lines.push(` (drill ${this._drill})`),this._sxLayers&&lines.push(this._sxLayers.getStringIndented()),this._sxNet&&lines.push(this._sxNet.getStringIndented()),this._sxUuid&&lines.push(this._sxUuid.getStringIndented()),this._sxTstamp&&lines.push(this._sxTstamp.getStringIndented()),this._sxTeardrops&&lines.push(this._sxTeardrops.getStringIndented()),lines.push(")"),lines.join(`
|
|
772
|
-
`)}},__publicField(_a413,"token","via"),_a413);SxClass.register(Via2);var _a414,KicadPcb=(_a414=class extends SxClass{constructor(params={}){super();__publicField(this,"token","kicad_pcb");__publicField(this,"_sxVersion");__publicField(this,"_sxGenerator");__publicField(this,"_sxGeneratorVersion");__publicField(this,"_sxGeneral");__publicField(this,"_sxPaper");__publicField(this,"_sxTitleBlock");__publicField(this,"_sxLayers");__publicField(this,"_sxSetup");__publicField(this,"_properties",[]);__publicField(this,"_nets",[]);__publicField(this,"_footprints",[]);__publicField(this,"_images",[]);__publicField(this,"_segments",[]);__publicField(this,"_arcs",[]);__publicField(this,"_grArcs",[]);__publicField(this,"_grCircles",[]);__publicField(this,"_grCurves",[]);__publicField(this,"_grLines",[]);__publicField(this,"_grTexts",[]);__publicField(this,"_grPolys",[]);__publicField(this,"_grRects",[]);__publicField(this,"_vias",[]);__publicField(this,"_zones",[]);__publicField(this,"_sxEmbeddedFonts");__publicField(this,"_sxEmbeddedFiles");__publicField(this,"_otherChildren",[]);params.version!==void 0&&(this.version=params.version),params.generator!==void 0&&(this.generator=params.generator),params.generatorVersion!==void 0&&(this.generatorVersion=params.generatorVersion),params.general!==void 0&&(this.general=params.general),params.paper!==void 0&&(this.paper=params.paper),params.titleBlock!==void 0&&(this.titleBlock=params.titleBlock),params.layers!==void 0&&(this.layers=params.layers),params.setup!==void 0&&(this.setup=params.setup),params.properties!==void 0&&(this.properties=params.properties),params.nets!==void 0&&(this.nets=params.nets),params.footprints!==void 0&&(this.footprints=params.footprints),params.images!==void 0&&(this.images=params.images),params.segments!==void 0&&(this.segments=params.segments),params.arcs!==void 0&&(this.arcs=params.arcs),params.graphicArcs!==void 0&&(this.graphicArcs=params.graphicArcs),params.graphicCircles!==void 0&&(this.graphicCircles=params.graphicCircles),params.graphicCurves!==void 0&&(this.graphicCurves=params.graphicCurves),params.graphicLines!==void 0&&(this.graphicLines=params.graphicLines),params.graphicTexts!==void 0&&(this.graphicTexts=params.graphicTexts),params.graphicPolys!==void 0&&(this.graphicPolys=params.graphicPolys),params.graphicRects!==void 0&&(this.graphicRects=params.graphicRects),params.vias!==void 0&&(this.vias=params.vias),params.zones!==void 0&&(this.zones=params.zones),params.embeddedFonts!==void 0&&(this.embeddedFonts=params.embeddedFonts),params.embeddedFiles!==void 0&&(this.embeddedFiles=params.embeddedFiles),params.otherChildren!==void 0&&(this.otherChildren=params.otherChildren)}static fromSexprPrimitives(primitiveSexprs){let pcb=new _a414;for(let primitive of primitiveSexprs){if(!Array.isArray(primitive)||primitive.length===0)throw new Error(`kicad_pcb encountered unsupported primitive child: ${JSON.stringify(primitive)}`);let parsed=SxClass.parsePrimitiveSexpr(primitive,{parentToken:_a414.token});if(!(parsed instanceof SxClass))throw new Error(`kicad_pcb expected SxClass child, received ${JSON.stringify(primitive)}`);pcb.consumeChild(parsed)}return pcb}consumeChild(child){if(child instanceof PcbVersion){this._sxVersion=child;return}if(child instanceof PcbGenerator){this._sxGenerator=child;return}if(child instanceof PcbGeneratorVersion){this._sxGeneratorVersion=child;return}if(child instanceof PcbGeneral){this._sxGeneral=child;return}if(child instanceof Paper){this._sxPaper=child;return}if(child instanceof TitleBlock){this._sxTitleBlock=child;return}if(child instanceof PcbLayers){this._sxLayers=child;return}if(child instanceof Setup){this._sxSetup=child;return}if(child instanceof Property){this._properties.push(child);return}if(child instanceof PcbNet){this._nets.push(child);return}if(child instanceof Footprint2){this._footprints.push(child);return}if(child instanceof Image){this._images.push(child);return}if(child instanceof Segment3){this._segments.push(child);return}if(child instanceof PcbArc){this._arcs.push(child);return}if(child instanceof GrArc){this._grArcs.push(child);return}if(child instanceof GrCircle){this._grCircles.push(child);return}if(child instanceof GrCurve){this._grCurves.push(child);return}if(child instanceof GrLine){this._grLines.push(child);return}if(child instanceof GrText){this._grTexts.push(child);return}if(child instanceof GrPoly){this._grPolys.push(child);return}if(child instanceof GrRect){this._grRects.push(child);return}if(child instanceof Via2){this._vias.push(child);return}if(child instanceof Zone){this._zones.push(child);return}if(child instanceof EmbeddedFonts){this._sxEmbeddedFonts=child;return}if(child instanceof EmbeddedFiles){this._sxEmbeddedFiles=child;return}this._otherChildren.push(child)}get version(){return this._sxVersion?.value}set version(value){this._sxVersion=value===void 0?void 0:new PcbVersion(value)}get generator(){return this._sxGenerator?.value}set generator(value){this._sxGenerator=value===void 0?void 0:new PcbGenerator(value)}get generatorVersion(){return this._sxGeneratorVersion?.value}set generatorVersion(value){this._sxGeneratorVersion=value===void 0?void 0:new PcbGeneratorVersion(value)}get general(){return this._sxGeneral}set general(value){this._sxGeneral=value}get paper(){return this._sxPaper}set paper(value){this._sxPaper=value}get titleBlock(){return this._sxTitleBlock}set titleBlock(value){this._sxTitleBlock=value}get layers(){return this._sxLayers}set layers(value){this._sxLayers=value}get setup(){return this._sxSetup}set setup(value){this._sxSetup=value}get properties(){return[...this._properties]}set properties(value){this._properties=[...value]}get nets(){return[...this._nets]}set nets(value){this._nets=[...value]}get footprints(){return[...this._footprints]}set footprints(value){this._footprints=[...value]}get images(){return[...this._images]}set images(value){this._images=[...value]}get segments(){return[...this._segments]}set segments(value){this._segments=[...value]}get arcs(){return[...this._arcs]}set arcs(value){this._arcs=[...value]}get graphicArcs(){return[...this._grArcs]}set graphicArcs(value){this._grArcs=[...value]}get graphicCircles(){return[...this._grCircles]}set graphicCircles(value){this._grCircles=[...value]}get graphicCurves(){return[...this._grCurves]}set graphicCurves(value){this._grCurves=[...value]}get graphicLines(){return[...this._grLines]}set graphicLines(value){this._grLines=[...value]}get graphicTexts(){return[...this._grTexts]}set graphicTexts(value){this._grTexts=[...value]}get graphicPolys(){return[...this._grPolys]}set graphicPolys(value){this._grPolys=[...value]}get graphicRects(){return[...this._grRects]}set graphicRects(value){this._grRects=[...value]}get vias(){return[...this._vias]}set vias(value){this._vias=[...value]}get zones(){return[...this._zones]}set zones(value){this._zones=[...value]}get embeddedFonts(){return this._sxEmbeddedFonts}set embeddedFonts(value){this._sxEmbeddedFonts=value}get embeddedFiles(){return this._sxEmbeddedFiles}set embeddedFiles(value){this._sxEmbeddedFiles=value}get otherChildren(){return[...this._otherChildren]}set otherChildren(value){this._otherChildren=[...value]}getChildren(){let children=[];return this._sxVersion&&children.push(this._sxVersion),this._sxGenerator&&children.push(this._sxGenerator),this._sxGeneratorVersion&&children.push(this._sxGeneratorVersion),this._sxGeneral&&children.push(this._sxGeneral),this._sxPaper&&children.push(this._sxPaper),this._sxTitleBlock&&children.push(this._sxTitleBlock),this._sxLayers&&children.push(this._sxLayers),this._sxSetup&&children.push(this._sxSetup),children.push(...this._properties),children.push(...this._nets),children.push(...this._footprints),children.push(...this._images),children.push(...this._segments),children.push(...this._arcs),children.push(...this._grArcs),children.push(...this._grCircles),children.push(...this._grCurves),children.push(...this._grLines),children.push(...this._grTexts),children.push(...this._grPolys),children.push(...this._grRects),children.push(...this._vias),children.push(...this._zones),this._sxEmbeddedFonts&&children.push(this._sxEmbeddedFonts),this._sxEmbeddedFiles&&children.push(this._sxEmbeddedFiles),children.push(...this._otherChildren),children}},__publicField(_a414,"token","kicad_pcb"),_a414);SxClass.register(KicadPcb);var parseKicadSexpr=sexpr=>SxClass.parse(sexpr),parseKicadSch=sexpr=>{let[root]=parseKicadSexpr(sexpr);if(!(root instanceof KicadSch))throw new Error(`Expected KicadSch root, got ${root?.constructor.name??"undefined"}`);return root},parseKicadPcb=sexpr=>{let[root]=parseKicadSexpr(sexpr);if(!(root instanceof KicadPcb))throw new Error(`Expected KicadPcb root, got ${root?.constructor.name??"undefined"}`);return root};init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();var ConverterStage=class{constructor(ctx){__publicField(this,"ctx");__publicField(this,"MAX_ITERATIONS",100);__publicField(this,"iterationCount",0);__publicField(this,"finished",!1);this.ctx=ctx}runUntilFinished(){for(this.iterationCount=0;!this.finished&&this.iterationCount<this.MAX_ITERATIONS;)this.step()||(this.finished=!0),this.iterationCount++;this.iterationCount>=this.MAX_ITERATIONS&&(this.ctx.warnings=this.ctx.warnings||[],this.ctx.warnings.push(`Stage ${this.constructor.name} exceeded maximum iterations (${this.MAX_ITERATIONS})`),this.finished=!0)}},INNER_COPPER_LAYER_REGEX=/^In([1-6])\.Cu$/;function dedupeLayerRefs(layers){return[...new Set(layers)]}function extractKicadLayerNames(layer){return layer?typeof layer=="string"?[layer]:Array.isArray(layer)?layer.filter(name=>typeof name=="string"):[...layer.names||[],...layer._names||[],...layer._layers||[],...layer.name?[layer.name]:[],...layer._name?[layer._name]:[]].filter(name=>typeof name=="string"):[]}function mapKicadLayerToPcbRenderLayer(layer){let layerNames=extractKicadLayerNames(layer);for(let layerName of layerNames){let copperLayer=mapKicadLayerNameToLayerRef(layerName);if(copperLayer)return`${copperLayer}_copper`;if(layerName.includes("Edge.Cuts"))return"edge_cuts";let side=mapKicadLayerToVisibleLayer(layerName);if(layerName.includes("CrtYd"))return`${side}_courtyard`;if(layerName.includes("Fab"))return`${side}_fabrication_note`;if(layerName.includes("SilkS"))return`${side}_silkscreen`}}function isPcbAnnotationRenderLayer(renderLayer){return renderLayer?.endsWith("_silkscreen")||renderLayer?.endsWith("_fabrication_note")||renderLayer?.endsWith("_courtyard")||!1}function isPcbTextRenderLayer(renderLayer){return renderLayer?.endsWith("_silkscreen")||renderLayer?.endsWith("_fabrication_note")||renderLayer?.endsWith("_copper")||!1}function mapKicadLayerNameToLayerRef(layerName){if(layerName==="F.Cu")return"top";if(layerName==="B.Cu")return"bottom";let innerLayerMatch=layerName.match(INNER_COPPER_LAYER_REGEX);if(innerLayerMatch)return`inner${innerLayerMatch[1]}`}function mapKicadLayerToLayerRef(layer){let layerNames=extractKicadLayerNames(layer);for(let layerName of layerNames){let mappedLayer=mapKicadLayerNameToLayerRef(layerName);if(mappedLayer)return mappedLayer}let layerLabel=layerNames.join(" ");return layerLabel.includes("B.")||layerLabel.includes("Back")||layerLabel.includes("Bottom")?"bottom":"top"}function mapKicadLayerToVisibleLayer(layer){return mapKicadLayerToLayerRef(layer)==="bottom"?"bottom":"top"}function getPcbCopperLayerRefs(kicadPcb){let copperLayers=(Array.isArray(kicadPcb?.layers?._definitions)?(kicadPcb?.layers)._definitions:[]).map(definition=>mapKicadLayerNameToLayerRef(definition?._name)).filter(layer=>!!layer);return copperLayers.length>0?dedupeLayerRefs(copperLayers):["top","bottom"]}function getLayerRefsFromLayers(layers,kicadPcb){let layerNames=extractKicadLayerNames(layers),mappedLayers=[];for(let layerName of layerNames){if(layerName==="*.Cu"){mappedLayers.push(...getPcbCopperLayerRefs(kicadPcb));continue}let mappedLayer=mapKicadLayerNameToLayerRef(layerName);mappedLayer&&mappedLayers.push(mappedLayer)}return dedupeLayerRefs(mappedLayers)}function expandCopperLayerSpan(layers,kicadPcb){if(layers.length<=1)return layers;let copperStack=getPcbCopperLayerRefs(kicadPcb),startIndex=copperStack.indexOf(layers[0]),endIndex=copperStack.indexOf(layers[layers.length-1]);if(startIndex===-1||endIndex===-1)return dedupeLayerRefs(layers);let[fromIndex,toIndex]=startIndex<=endIndex?[startIndex,endIndex]:[endIndex,startIndex];return copperStack.slice(fromIndex,toIndex+1)}function getCopperSpanLayerRefsFromLayers(layers,kicadPcb){return expandCopperLayerSpan(getLayerRefsFromLayers(layers,kicadPcb),kicadPcb)}function getComponentLayer(footprint){return mapKicadLayerToVisibleLayer(footprint.layer)}function determineLayerFromLayers(layers){return mapKicadLayerToLayerRef(extractKicadLayerNames(layers))}function mapTextLayer(kicadLayer){return mapKicadLayerToVisibleLayer(kicadLayer)}function insertFootprintRoute(options){let{ctx,componentId,layer,renderLayer,route,strokeWidth}=options;if(renderLayer.endsWith("_silkscreen")){ctx.db.pcb_silkscreen_path.insert({pcb_component_id:componentId,layer,route,stroke_width:strokeWidth});return}if(renderLayer.endsWith("_fabrication_note")){ctx.db.pcb_fabrication_note_path.insert({pcb_component_id:componentId,layer,route,stroke_width:strokeWidth});return}ctx.db.pcb_courtyard_outline.insert({pcb_component_id:componentId,layer,outline:route})}function rotatePoint5(x4,y4,rotationDeg){let rotationRad=rotationDeg*Math.PI/180;return{x:x4*Math.cos(rotationRad)-y4*Math.sin(rotationRad),y:x4*Math.sin(rotationRad)+y4*Math.cos(rotationRad)}}function processFootprintGraphics(ctx,footprint,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let lines=footprint.fpLines||[],lineArray=Array.isArray(lines)?lines:lines?[lines]:[];for(let line2 of lineArray)createFootprintLine(ctx,line2,componentId,kicadComponentPos,componentRotation);let rects=footprint.fpRects||[],rectArray=Array.isArray(rects)?rects:rects?[rects]:[];for(let rect of rectArray)createFootprintRect(ctx,rect,componentId,kicadComponentPos,componentRotation);let circles=footprint.fpCircles||[],circleArray=Array.isArray(circles)?circles:circles?[circles]:[];for(let circle2 of circleArray)createFootprintCircle(ctx,circle2,componentId,kicadComponentPos,componentRotation);let arcs=footprint.fpArcs||[],arcArray=Array.isArray(arcs)?arcs:arcs?[arcs]:[];for(let arc2 of arcArray)createFootprintArc(ctx,arc2,componentId,kicadComponentPos,componentRotation);let polys=footprint.fpPolys||[],polyArray=Array.isArray(polys)?polys:polys?[polys]:[];for(let poly of polyArray)createFootprintPoly(ctx,poly,componentId,kicadComponentPos,componentRotation)}function createFootprintLine(ctx,line2,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let renderLayer=mapKicadLayerToPcbRenderLayer(line2.layer);if(!isPcbAnnotationRenderLayer(renderLayer))return;let start=line2.start||{x:0,y:0},end=line2.end||{x:0,y:0},rotatedStart=rotatePoint5(start.x,start.y,-componentRotation),rotatedEnd=rotatePoint5(end.x,end.y,-componentRotation),startKicadPos={x:kicadComponentPos.x+rotatedStart.x,y:kicadComponentPos.y+rotatedStart.y},endKicadPos={x:kicadComponentPos.x+rotatedEnd.x,y:kicadComponentPos.y+rotatedEnd.y},startPos=applyToPoint(ctx.k2cMatPcb,startKicadPos),endPos=applyToPoint(ctx.k2cMatPcb,endKicadPos),layer=mapTextLayer(line2.layer),strokeWidth=line2.stroke?.width||line2.width||.12;insertFootprintRoute({ctx,componentId,layer,renderLayer,route:[startPos,endPos],strokeWidth})}function createFootprintRect(ctx,rect,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let renderLayer=mapKicadLayerToPcbRenderLayer(rect.layer);if(!isPcbAnnotationRenderLayer(renderLayer))return;let start=rect.start||{x:0,y:0},end=rect.end||{x:0,y:0},center2={x:(start.x+end.x)/2,y:(start.y+end.y)/2},rotatedCenter=rotatePoint5(center2.x,center2.y,-componentRotation),centerKicadPos={x:kicadComponentPos.x+rotatedCenter.x,y:kicadComponentPos.y+rotatedCenter.y},centerPos=applyToPoint(ctx.k2cMatPcb,centerKicadPos),layer=mapTextLayer(rect.layer),width=Math.abs(end.x-start.x),height=Math.abs(end.y-start.y),strokeWidth=rect.stroke?.width||rect.width||.12;if(renderLayer.endsWith("_courtyard")){ctx.db.pcb_courtyard_rect.insert({pcb_component_id:componentId,center:centerPos,width,height,layer,ccw_rotation:-componentRotation});return}if(renderLayer.endsWith("_fabrication_note")){ctx.db.pcb_fabrication_note_rect.insert({pcb_component_id:componentId,center:centerPos,width,height,layer,stroke_width:strokeWidth,is_filled:rect.fill?.filled===!0,has_stroke:!0});return}let route=[{x:start.x,y:start.y},{x:end.x,y:start.y},{x:end.x,y:end.y},{x:start.x,y:end.y},{x:start.x,y:start.y}].map(point7=>{let rotated=rotatePoint5(point7.x,point7.y,-componentRotation),kicadPos={x:kicadComponentPos.x+rotated.x,y:kicadComponentPos.y+rotated.y};return applyToPoint(ctx.k2cMatPcb,kicadPos)});insertFootprintRoute({ctx,componentId,layer,renderLayer,route,strokeWidth})}function createFootprintCircle(ctx,circle2,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let renderLayer=mapKicadLayerToPcbRenderLayer(circle2.layer);if(!isPcbAnnotationRenderLayer(renderLayer))return;let center2=circle2.center||{x:0,y:0},end=circle2.end||{x:0,y:0},radius=Math.sqrt((end.x-center2.x)**2+(end.y-center2.y)**2),rotatedCenter=rotatePoint5(center2.x,center2.y,-componentRotation),centerKicadPos={x:kicadComponentPos.x+rotatedCenter.x,y:kicadComponentPos.y+rotatedCenter.y},centerPos=applyToPoint(ctx.k2cMatPcb,centerKicadPos),layer=mapTextLayer(circle2.layer),strokeWidth=circle2.stroke?.width||circle2.width||.12;if(renderLayer.endsWith("_courtyard")){ctx.db.pcb_courtyard_circle.insert({pcb_component_id:componentId,center:centerPos,radius,layer});return}let numPoints=16,circleRoute=[];for(let i3=0;i3<=numPoints;i3++){let angle=i3/numPoints*2*Math.PI,x4=centerPos.x+radius*Math.cos(angle),y4=centerPos.y+radius*Math.sin(angle);circleRoute.push({x:x4,y:y4})}insertFootprintRoute({ctx,componentId,layer,renderLayer,route:circleRoute,strokeWidth})}function calculateArcCenter(p12,p22,p32){let ax3=p12.x-p22.x,ay3=p12.y-p22.y,bx3=p22.x-p32.x,by3=p22.y-p32.y,denom=2*(ax3*by3-ay3*bx3);if(Math.abs(denom)<1e-10)return null;let d12=p12.x*p12.x+p12.y*p12.y-p22.x*p22.x-p22.y*p22.y,d22=p22.x*p22.x+p22.y*p22.y-p32.x*p32.x-p32.y*p32.y,cx3=(d12*by3-d22*ay3)/denom,cy3=(ax3*d22-bx3*d12)/denom,radius=Math.sqrt((p12.x-cx3)**2+(p12.y-cy3)**2);return{center:{x:cx3,y:cy3},radius}}function createFootprintArc(ctx,arc2,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let renderLayer=mapKicadLayerToPcbRenderLayer(arc2.layer);if(!isPcbAnnotationRenderLayer(renderLayer))return;let start=arc2.start||{x:0,y:0},mid=arc2.mid||{x:0,y:0},end=arc2.end||{x:0,y:0},rotatedStart=rotatePoint5(start.x,start.y,-componentRotation),rotatedMid=rotatePoint5(mid.x,mid.y,-componentRotation),rotatedEnd=rotatePoint5(end.x,end.y,-componentRotation),startKicadPos={x:kicadComponentPos.x+rotatedStart.x,y:kicadComponentPos.y+rotatedStart.y},midKicadPos={x:kicadComponentPos.x+rotatedMid.x,y:kicadComponentPos.y+rotatedMid.y},endKicadPos={x:kicadComponentPos.x+rotatedEnd.x,y:kicadComponentPos.y+rotatedEnd.y},layer=mapTextLayer(arc2.layer),strokeWidth=arc2.stroke?.width||arc2.width||.12,arcInfo=calculateArcCenter(startKicadPos,midKicadPos,endKicadPos);if(!arcInfo){let startPos=applyToPoint(ctx.k2cMatPcb,startKicadPos),endPos=applyToPoint(ctx.k2cMatPcb,endKicadPos);insertFootprintRoute({ctx,componentId,layer,renderLayer,route:[startPos,endPos],strokeWidth});return}let{center:center2,radius}=arcInfo,startAngle=Math.atan2(startKicadPos.y-center2.y,startKicadPos.x-center2.x),midAngle=Math.atan2(midKicadPos.y-center2.y,midKicadPos.x-center2.x),sweepAngle=Math.atan2(endKicadPos.y-center2.y,endKicadPos.x-center2.x)-startAngle,midSweep=midAngle-startAngle;for(;sweepAngle>Math.PI;)sweepAngle-=2*Math.PI;for(;sweepAngle<-Math.PI;)sweepAngle+=2*Math.PI;for(;midSweep>Math.PI;)midSweep-=2*Math.PI;for(;midSweep<-Math.PI;)midSweep+=2*Math.PI;let isCCW=sweepAngle>0;isCCW&&midSweep>0&&midSweep<sweepAngle||!isCCW&&midSweep<0&&midSweep>sweepAngle||(sweepAngle=sweepAngle>0?sweepAngle-2*Math.PI:sweepAngle+2*Math.PI);let arcLength2=Math.abs(radius*sweepAngle),numSegments=Math.max(2,Math.ceil(arcLength2/.1)),arcRoute=[];for(let i3=0;i3<=numSegments;i3++){let t52=i3/numSegments,angle=startAngle+sweepAngle*t52,kicadPoint={x:center2.x+radius*Math.cos(angle),y:center2.y+radius*Math.sin(angle)},cjPoint=applyToPoint(ctx.k2cMatPcb,kicadPoint);arcRoute.push(cjPoint)}insertFootprintRoute({ctx,componentId,layer,renderLayer,route:arcRoute,strokeWidth})}function createFootprintPoly(ctx,poly,componentId,kicadComponentPos,componentCcwRotationDegrees){if(!ctx.k2cMatPcb)return;let renderLayer=mapKicadLayerToPcbRenderLayer(poly.layer);if(!isPcbAnnotationRenderLayer(renderLayer))return;let ptArray=poly.points?.points||[];if(ptArray.length===0)return;let layer=mapTextLayer(poly.layer),strokeWidth=poly.stroke?.width||poly.width||.12,transformedPts=ptArray.map(p4=>{let x4=p4.x??p4.xy?.x??0,y4=p4.y??p4.xy?.y??0,rotated=rotatePoint5(x4,y4,-componentCcwRotationDegrees),kicadPos={x:kicadComponentPos.x+rotated.x,y:kicadComponentPos.y+rotated.y};return applyToPoint(ctx.k2cMatPcb,kicadPos)});if(renderLayer.endsWith("_courtyard")){ctx.db.pcb_courtyard_outline.insert({pcb_component_id:componentId,layer,outline:transformedPts});return}insertFootprintRoute({ctx,componentId,layer,renderLayer,route:transformedPts,strokeWidth})}function createPcbPort({ctx,componentId,padInfo}){if(!padInfo.layers||padInfo.layers.length===0)return;let sourcePortId=`${componentId}_port_${padInfo.padNumber}`;return ctx.db.pcb_port.insert({pcb_component_id:componentId,source_port_id:sourcePortId,x:padInfo.position.x,y:padInfo.position.y,layers:padInfo.layers}).pcb_port_id}function processPads(ctx,footprint,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let pads=footprint.fpPads||[],padArray=Array.isArray(pads)?pads:[pads];for(let pad2 of padArray)processPad({ctx,pad:pad2,componentId,kicadComponentPos,componentRotation})}function processPad({ctx,pad:pad2,componentId,kicadComponentPos,componentRotation}){if(!ctx.k2cMatPcb)return;let padAt=pad2.at||{x:0,y:0,angle:0},padType=pad2.padType||pad2.type||"thru_hole",padShape=pad2.shape||"circle",rotationRad=-componentRotation*Math.PI/180,rotatedPadX=padAt.x*Math.cos(rotationRad)-padAt.y*Math.sin(rotationRad),rotatedPadY=padAt.x*Math.sin(rotationRad)+padAt.y*Math.cos(rotationRad),padKicadPos={x:kicadComponentPos.x+rotatedPadX,y:kicadComponentPos.y+rotatedPadY},globalPos=applyToPoint(ctx.k2cMatPcb,padKicadPos),sizeX=1,sizeY=1;pad2.size&&(Array.isArray(pad2.size)?(sizeX=pad2.size[0]||1,sizeY=pad2.size[1]||1):typeof pad2.size=="object"&&(sizeX=pad2.size._width||pad2.size.x||1,sizeY=pad2.size._height||pad2.size.y||1));let size3={x:sizeX,y:sizeY},drill=pad2.drill,mappedCopperLayers=padType==="thru_hole"?getCopperSpanLayerRefsFromLayers(pad2.layers||[],ctx.kicadPcb):getLayerRefsFromLayers(pad2.layers||[],ctx.kicadPcb),copperLayers=mappedCopperLayers.length>0?mappedCopperLayers:padType==="thru_hole"?getPcbCopperLayerRefs(ctx.kicadPcb):[],totalCcwRotationDegrees=padAt.angle||0,padNumber=pad2.number?.toString(),pcbPortId,sourcePortId;if(padNumber){let padLayers=padType==="smd"?copperLayers.slice(0,1):padType==="thru_hole"?copperLayers:[];pcbPortId=createPcbPort({ctx,componentId,padInfo:{padNumber,padType,layers:padLayers,position:globalPos}}),pcbPortId&&(sourcePortId=`${componentId}_port_${padNumber}`)}if(padType==="smd"){if(copperLayers.length===0)return;createSmdPad({ctx,pad:pad2,componentId,pos:globalPos,size:size3,shape:padShape,pcbPortId,sourcePortId,padKicadPos,totalCcwRotationDegrees})}else padType==="np_thru_hole"?createNpthHole(ctx,pad2,componentId,globalPos,drill):createPlatedHole(ctx,pad2,componentId,globalPos,size3,drill,padShape,copperLayers,totalCcwRotationDegrees,pcbPortId,sourcePortId)}function createSmdPad({ctx,pad:pad2,componentId,pos,size:size3,shape,pcbPortId,sourcePortId:_sourcePortId,padKicadPos,totalCcwRotationDegrees=0}){let layers=pad2.layers||[],layer=determineLayerFromLayers(layers);if(shape==="custom"){let primitives=pad2._sxPrimitives?._graphics||pad2.primitives||[],primitivesArray=Array.isArray(primitives)?primitives:[primitives],primitivesProcessed=0;for(let primitive of primitivesArray){if(primitive.token==="gr_poly"){let grPoly=primitive.gr_poly||primitive,rawPts=[],ptsContainer=grPoly._sxPts||grPoly.points||grPoly.pts,contours=grPoly._contours||grPoly.contours;if(ptsContainer)Array.isArray(ptsContainer)?rawPts=ptsContainer:Array.isArray(ptsContainer.points)?rawPts=ptsContainer.points:Array.isArray(ptsContainer.pts)&&(rawPts=ptsContainer.pts);else if(Array.isArray(contours))for(let contour of contours){let contourPts=contour.points||contour.pts||[];rawPts.push(...Array.isArray(contourPts)?contourPts:[contourPts])}let points=[];for(let pt3 of rawPts){let x4=pt3.x??pt3.xy?.x,y4=pt3.y??pt3.xy?.y;if(x4!==void 0&&y4!==void 0){let rotated=rotatePoint5(x4,y4,totalCcwRotationDegrees),kicadPos={x:padKicadPos.x+rotated.x,y:padKicadPos.y+rotated.y};points.push(applyToPoint(ctx.k2cMatPcb,kicadPos))}}if(points.length>0){let smtpad2={type:"pcb_smtpad",shape:"polygon",pcb_component_id:componentId,pcb_port_id:pcbPortId,pcb_smtpad_id:"pcb_smtpad_id",layer,port_hints:[pad2.number.toString()],points};ctx.db.pcb_smtpad.insert(smtpad2),primitivesProcessed++}}if(primitive.token==="gr_circle"){let grCircle=primitive.gr_circle||primitive,center2=grCircle.center||grCircle._sxCenter||{x:0,y:0},end=grCircle.end||grCircle._sxEnd||{x:0,y:0},centerlineRadius=Math.sqrt((end.x-center2.x)**2+(end.y-center2.y)**2),strokeWidth=grCircle.stroke?.width||grCircle.width||grCircle._sxWidth?.value||0,radius=(grCircle.fill?.value||grCircle.fill||grCircle._sxFill?.value)==="no"&&strokeWidth>0?centerlineRadius+strokeWidth/2:centerlineRadius,rotatedCenter=rotatePoint5(center2.x,center2.y,totalCcwRotationDegrees),kicadCenterPos={x:padKicadPos.x+rotatedCenter.x,y:padKicadPos.y+rotatedCenter.y},globalCenter=applyToPoint(ctx.k2cMatPcb,kicadCenterPos),smtpad2={type:"pcb_smtpad",shape:"circle",pcb_component_id:componentId,pcb_port_id:pcbPortId,pcb_smtpad_id:"pcb_smtpad_id",layer,port_hints:[pad2.number.toString()],x:globalCenter.x,y:globalCenter.y,width:radius*2,height:radius*2,radius};ctx.db.pcb_smtpad.insert(smtpad2),primitivesProcessed++}}if(primitivesProcessed>0){ctx.stats&&(ctx.stats.pads=(ctx.stats.pads||0)+primitivesProcessed);return}}let ccwRotationDegrees=pad2.at?.angle;if(shape==="circle"){let smtpad2={type:"pcb_smtpad",pcb_component_id:componentId,pcb_smtpad_id:"pcb_smtpad_id",x:pos.x,y:pos.y,width:size3.x,height:size3.y,layer,pcb_port_id:pcbPortId,port_hints:[pad2.number?.toString()],shape:"circle",radius:Math.max(size3.x,size3.y)/2};ctx.db.pcb_smtpad.insert(smtpad2)}else if(shape==="rect"||shape==="roundrect"){let roundrectRatio=pad2._sxRoundrectRatio?.value??pad2.roundrect_rratio,cornerRadius;shape==="roundrect"&&roundrectRatio!==void 0&&(cornerRadius=Math.min(size3.x,size3.y)*roundrectRatio/2);let normalizedCcwRotation=normalizeRotationDegrees(ccwRotationDegrees),rightAngleTurns=getRightAngleTurns(normalizedCcwRotation);if(rightAngleTurns===null&&normalizedCcwRotation!==0){let rotatedsmtpad={type:"pcb_smtpad",pcb_component_id:componentId,x:pos.x,y:pos.y,width:size3.x,height:size3.y,layer,pcb_port_id:pcbPortId,port_hints:[pad2.number.toString()],shape:"rotated_rect",ccw_rotation:normalizedCcwRotation,corner_radius:cornerRadius};ctx.db.pcb_smtpad.insert(rotatedsmtpad);return}let shouldSwapDimensions=rightAngleTurns!==null&&Math.abs(rightAngleTurns)%2===1,smtpad2={type:"pcb_smtpad",pcb_component_id:componentId,x:pos.x,y:pos.y,width:shouldSwapDimensions?size3.y:size3.x,height:shouldSwapDimensions?size3.x:size3.y,layer,pcb_port_id:pcbPortId,port_hints:[pad2.number.toString()],shape:"rect",corner_radius:cornerRadius};ctx.db.pcb_smtpad.insert(smtpad2)}else ctx.db.pcb_smtpad.insert({type:"pcb_smtpad",pcb_component_id:componentId,x:pos.x,y:pos.y,width:size3.x,height:size3.y,layer,pcb_port_id:pcbPortId,port_hints:[pad2.number?.toString()],shape:"rect"});ctx.stats&&(ctx.stats.pads=(ctx.stats.pads||0)+1)}function normalizeRotationDegrees(rotationDegrees){if(!rotationDegrees)return 0;let normalized=rotationDegrees%360;return normalized<0?normalized+360:normalized}function getRightAngleTurns(rotationDegrees){let quarterTurns=rotationDegrees/90;return Math.abs(quarterTurns-Math.round(quarterTurns))>1e-9?null:Math.round(quarterTurns)}function createPlatedHole(ctx,pad2,componentId,pos,size3,drill,shape,layers,_rotation=0,pcbPortId,_sourcePortId=void 0){let drillX=typeof drill=="object"?drill?.x||drill?._width||drill?.diameter||.8:drill||.8,drillY=typeof drill=="object"?drill?.y||drill?._height||drill?.diameter||drillX:drill||.8,holeDiameter=Math.max(drillX,drillY),drillIsOval=typeof drill=="object"&&drillX!==void 0&&drillY!==void 0&&drillX!==drillY,outerWidth=size3.x,outerHeight=size3.y;if(shape==="circle"){let platedHole={type:"pcb_plated_hole",shape:"circle",pcb_component_id:componentId,pcb_port_id:pcbPortId,x:pos.x,y:pos.y,port_hints:[pad2.number?.toString()],hole_diameter:holeDiameter,outer_diameter:Math.max(outerWidth,outerHeight),layers};ctx.db.pcb_plated_hole.insert(platedHole)}else if(shape==="oval"){let platedHole={type:"pcb_plated_hole",shape:"pill",pcb_component_id:componentId,pcb_port_id:pcbPortId,x:pos.x,y:pos.y,port_hints:[pad2.number?.toString()],hole_width:drillY,hole_height:drillX,outer_width:outerWidth,outer_height:outerHeight,ccw_rotation:pad2.at?.angle||0,layers};ctx.db.pcb_plated_hole.insert(platedHole)}else if(shape==="rect"||shape==="square"||shape==="roundrect"){let normalizedCcwRotationDegrees=normalizeRotationDegrees(pad2.at?.angle);if(drillIsOval)if(normalizedCcwRotationDegrees===0){let platedHole={type:"pcb_plated_hole",shape:"pill_hole_with_rect_pad",pcb_component_id:componentId,pcb_port_id:pcbPortId,x:pos.x,y:pos.y,port_hints:[pad2.number?.toString()],hole_shape:"pill",pad_shape:"rect",hole_width:drillY,hole_height:drillX,rect_pad_width:outerWidth,rect_pad_height:outerHeight,hole_offset_x:0,hole_offset_y:0,layers};if(shape==="roundrect"){let roundrectRatio=pad2._sxRoundrectRatio?.value??pad2.roundrect_rratio;if(roundrectRatio!==void 0){let minDimension=Math.min(outerWidth,outerHeight);platedHole.rect_border_radius=minDimension*roundrectRatio/2}}ctx.db.pcb_plated_hole.insert(platedHole)}else{let platedHole={type:"pcb_plated_hole",shape:"rotated_pill_hole_with_rect_pad",pcb_component_id:componentId,pcb_port_id:pcbPortId,x:pos.x,y:pos.y,port_hints:[pad2.number?.toString()],hole_shape:"rotated_pill",pad_shape:"rect",hole_width:drillY,hole_height:drillX,hole_ccw_rotation:normalizedCcwRotationDegrees,rect_ccw_rotation:normalizedCcwRotationDegrees,rect_pad_width:outerWidth,rect_pad_height:outerHeight,hole_offset_x:0,hole_offset_y:0,layers};if(shape==="roundrect"){let roundrectRatio=pad2._sxRoundrectRatio?.value??pad2.roundrect_rratio;if(roundrectRatio!==void 0){let minDimension=Math.min(outerWidth,outerHeight);platedHole.rect_border_radius=minDimension*roundrectRatio/2}}ctx.db.pcb_plated_hole.insert(platedHole)}else{let platedHole={type:"pcb_plated_hole",shape:"circular_hole_with_rect_pad",pcb_component_id:componentId,pcb_port_id:pcbPortId,pcb_plated_hole_id:"pcb_plated_hole_id",x:pos.x,y:pos.y,port_hints:[pad2.number?.toString()],hole_shape:"circle",pad_shape:"rect",hole_diameter:holeDiameter,rect_ccw_rotation:pad2.at?.angle||0,rect_pad_width:outerWidth,rect_pad_height:outerHeight,hole_offset_x:0,hole_offset_y:0,layers};if(shape==="roundrect"){let roundrectRatio=pad2._sxRoundrectRatio?.value??pad2.roundrect_rratio;if(roundrectRatio!==void 0){let minDimension=Math.min(outerWidth,outerHeight);platedHole.rect_border_radius=minDimension*roundrectRatio/2}}ctx.db.pcb_plated_hole.insert(platedHole)}}ctx.stats&&(ctx.stats.pads=(ctx.stats.pads||0)+1)}function createNpthHole(ctx,_pad,componentId,pos,drill){let holeDiameter=drill?.diameter||drill||1,hole={type:"pcb_hole",hole_shape:"circle",pcb_component_id:componentId,x:pos.x,y:pos.y,hole_diameter:holeDiameter};ctx.db.pcb_hole.insert(hole)}function getTextValue(footprint,type){let texts=footprint.fpTexts||[];return(Array.isArray(texts)?texts:[texts]).find(t52=>t52.type===type)?.text}function getPropertyValue(footprint,propertyName){let properties=footprint.properties||[];return(Array.isArray(properties)?properties:[properties]).find(p4=>p4.key===propertyName)?.value}function substituteKicadVariables(text,footprint){let result=text,reference=getPropertyValue(footprint,"Reference")||getTextValue(footprint,"reference")||"?",value=getPropertyValue(footprint,"Value")||getTextValue(footprint,"value")||"";return result=result.replace(/\$\{REFERENCE\}/g,reference),result=result.replace(/\$\{VALUE\}/g,value),result}function mapKicadJustifyToAnchorAlignment(justify){if(!justify)return"center";let horizontal=justify.horizontal||"center",vertical=justify.vertical||"center";if(vertical==="top"){if(horizontal==="left")return"top_left";if(horizontal==="center")return"top_center";if(horizontal==="right")return"top_right"}if(vertical==="center"){if(horizontal==="left")return"center_left";if(horizontal==="center")return"center";if(horizontal==="right")return"center_right"}if(vertical==="bottom"){if(horizontal==="left")return"bottom_left";if(horizontal==="center")return"bottom_center";if(horizontal==="right")return"bottom_right"}return"center"}function processFootprintText(ctx,footprint,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;processFootprintProperties(ctx,footprint,componentId,kicadComponentPos,componentRotation);let texts=footprint.fpTexts||[],textArray=Array.isArray(texts)?texts:[texts];for(let text of textArray){let renderLayer=mapKicadLayerToPcbRenderLayer(text.layer);if(!isPcbTextRenderLayer(renderLayer))continue;let textElement={text:text.text,at:text._sxPosition||text.at,layer:text.layer,effects:text._sxEffects||text.effects,_sxEffects:text._sxEffects};createGraphicText(ctx,textElement,renderLayer,componentId,kicadComponentPos,componentRotation,footprint)}}function processFootprintProperties(ctx,footprint,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let properties=footprint.properties||[],propertyArray=Array.isArray(properties)?properties:[properties];for(let property of propertyArray){if(!property.layer)continue;let renderLayer=mapKicadLayerToPcbRenderLayer(property.layer),isPropertyHidden=property.hidden;if(!isPcbTextRenderLayer(renderLayer)||isPropertyHidden)continue;let textElement={text:property.value,at:property._sxAt,layer:property.layer,effects:property._sxEffects||property.effects,_sxEffects:property._sxEffects};createGraphicText(ctx,textElement,renderLayer,componentId,kicadComponentPos,componentRotation,footprint)}}function createGraphicText(ctx,text,renderLayer,componentId,kicadComponentPos,componentRotation,footprint){if(!ctx.k2cMatPcb)return;let at3=text.at,textLocalX=at3?.x??0,textLocalY=at3?.y??0,rotationRad=-componentRotation*Math.PI/180,rotatedTextX=textLocalX*Math.cos(rotationRad)-textLocalY*Math.sin(rotationRad),rotatedTextY=textLocalX*Math.sin(rotationRad)+textLocalY*Math.cos(rotationRad),textKicadPos={x:kicadComponentPos.x+rotatedTextX,y:kicadComponentPos.y+rotatedTextY},pos=applyToPoint(ctx.k2cMatPcb,textKicadPos),layer=mapTextLayer(text.layer),processedText=substituteKicadVariables(text.text||"",footprint),kicadFontSize=text._sxEffects?._sxFont?._sxSize?._height||text.effects?.font?.size?.y||1,justify=text._sxEffects?._sxJustify||text.effects?.justify,anchorAlignment=mapKicadJustifyToAnchorAlignment(justify);if(renderLayer.endsWith("_silkscreen")){ctx.db.pcb_silkscreen_text.insert({pcb_component_id:componentId,font:"tscircuit2024",font_size:kicadFontSize*1.5,text:processedText,anchor_position:pos,anchor_alignment:anchorAlignment,layer});return}if(renderLayer.endsWith("_fabrication_note")){ctx.db.pcb_fabrication_note_text.insert({pcb_component_id:componentId,font:"tscircuit2024",font_size:kicadFontSize*1.5,text:processedText,anchor_position:pos,anchor_alignment:anchorAlignment,layer});return}renderLayer.endsWith("_copper")&&ctx.db.pcb_copper_text.insert({pcb_component_id:componentId,font:"tscircuit2024",font_size:kicadFontSize*1.5,text:processedText,anchor_position:pos,anchor_alignment:anchorAlignment,layer})}function inferComponentType(reference){if(!reference)return"simple_chip";switch(reference.match(/^([A-Z]+)/)?.[1]){case"R":return"simple_resistor";case"C":return"simple_capacitor";case"L":return"simple_inductor";case"D":return"simple_diode";case"LED":return"simple_diode";case"Q":return"simple_transistor";case"U":case"IC":return"simple_chip";case"J":case"P":return"simple_chip";default:return"simple_chip"}}function inferTransistorTypeFromFootprint(footprint,value){let lowerValue=(value||"").toLowerCase();if(lowerValue.includes("pnp"))return"pnp";if(lowerValue.includes("npn"))return"npn";let lowerLibId=(footprint.libraryId||"").toLowerCase();return lowerLibId.includes("pnp")?"pnp":(lowerLibId.includes("npn"),"npn")}function getFootprintProperties(footprint){let properties=footprint.properties||[];return Array.isArray(properties)?properties:[properties]}function getFootprintPropertyName(property){return property?.key}function getFootprintPropertyValue(property){return property?.value}function findFootprintProperty(footprint,propertyNames){let names=Array.isArray(propertyNames)?propertyNames:[propertyNames];return getFootprintProperties(footprint).find(property=>names.includes(getFootprintPropertyName(property)??""))}function findFootprintPropertyValue(footprint,propertyNames){let property=findFootprintProperty(footprint,propertyNames);return getFootprintPropertyValue(property)}function parseSupplierPartNumbers(value){if(!value)return;let partNumbers=value.split(/[,;]/).map(partNumber=>partNumber.trim()).filter(Boolean);return partNumbers.length>0?partNumbers:void 0}function processFootprint(ctx,footprint){if(!ctx.k2cMatPcb)return;let position4=footprint.position,kicadPos={x:position4?.x??0,y:position4?.y??0},cjPos=applyToPoint(ctx.k2cMatPcb,kicadPos),rotation5=position4?.angle??0,uuid=footprint.uuid?.value||footprint.tstamp?.value;if(!uuid)return;let refdes=getFootprintReference(footprint),value=getFootprintValue(footprint),jlcpcbPartNumbers=getJlcpcbPartNumbers(footprint),ftype=inferComponentType(refdes),sourceComponentData={name:refdes||"U",ftype};if(ftype==="simple_transistor"&&(sourceComponentData.transistor_type=inferTransistorTypeFromFootprint(footprint,value)),jlcpcbPartNumbers&&(sourceComponentData.supplier_part_numbers={jlcpcb:jlcpcbPartNumbers}),value){let sanitizedValue=value.replace(/,/g,".");switch(ftype){case"simple_resistor":sourceComponentData.resistance=sanitizedValue;break;case"simple_capacitor":sourceComponentData.capacitance=sanitizedValue;break;case"simple_inductor":sourceComponentData.inductance=sanitizedValue;break}}let sourceComponentId=ctx.db.source_component.insert(sourceComponentData).source_component_id,componentId=ctx.db.pcb_component.insert({center:{x:cjPos.x,y:cjPos.y},layer:getComponentLayer(footprint),rotation:-rotation5,width:0,height:0,source_component_id:sourceComponentId}).pcb_component_id;ctx.footprintUuidToComponentId?.set(uuid,componentId),ctx.footprintUuidToSourceComponentId?.set(uuid,sourceComponentId),processPads(ctx,footprint,componentId,kicadPos,rotation5),processFootprintText(ctx,footprint,componentId,kicadPos,rotation5),processFootprintGraphics(ctx,footprint,componentId,kicadPos,rotation5),ctx.stats&&(ctx.stats.components=(ctx.stats.components||0)+1)}function getFootprintReference(footprint){let propertyValue=findFootprintPropertyValue(footprint,"Reference");if(propertyValue)return propertyValue;let textItems=footprint.fpTexts||[],textArray=Array.isArray(textItems)?textItems:[textItems];for(let text of textArray)if(text.type==="reference")return text.text}function getFootprintValue(footprint){let propertyValue=findFootprintPropertyValue(footprint,"Value");if(propertyValue)return propertyValue;let textItems=footprint.fpTexts||[],textArray=Array.isArray(textItems)?textItems:[textItems];for(let text of textArray)if(text.type==="value")return text.text}function getJlcpcbPartNumbers(footprint){return parseSupplierPartNumbers(findFootprintPropertyValue(footprint,["JLCPCB Part #","Supplier Part Number"]))}var CollectFootprintsStage=class extends ConverterStage{constructor(){super(...arguments);__publicField(this,"processedFootprints",new Set)}step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb)return this.finished=!0,!1;let footprints=this.ctx.kicadPcb.footprints||[],footprintArray=Array.isArray(footprints)?footprints:[footprints];for(let footprint of footprintArray){let uuid=footprint.uuid?.value||footprint.tstamp?.value;uuid&&(this.processedFootprints.has(uuid)||(processFootprint(this.ctx,footprint),this.processedFootprints.add(uuid)))}return this.finished=!0,!1}},FULL_TURN=Math.PI*2;function normalizeToArray(value){return value?Array.isArray(value)?value:[value]:[]}function getLayerNames(layer){return layer?typeof layer=="string"?[layer]:layer.names||[]:[]}function getGraphicLayerNames(graphic){return getLayerNames(graphic?.layer)}function getPcbPoint(point7){return{x:point7?.x??0,y:point7?.y??0}}function getLineStartEnd(line2){return{start:getPcbPoint(line2.start),end:getPcbPoint(line2.end)}}function getArcStartMidEnd(arc2){return{start:getPcbPoint(arc2.start),mid:getPcbPoint(arc2.mid),end:getPcbPoint(arc2.end)}}function getCircleCenterEnd(circle2){return{center:getPcbPoint(circle2.center),end:getPcbPoint(circle2.end)}}function getGraphicArcs(kicadPcb){return normalizeToArray(kicadPcb.graphicArcs)}function getGraphicCircles(kicadPcb){return normalizeToArray(kicadPcb.graphicCircles)}function getGraphicCurves(kicadPcb){return normalizeToArray(kicadPcb.graphicCurves)}function getTopLevelCopperArcs(kicadPcb){return normalizeToArray(kicadPcb.arcs)}function approximateArcPoints(start,mid,end,options){let geometry=getArcGeometry(start,mid,end);if(!geometry)return[start,end];let segmentLength=options?.segmentLength??.25,minSegments=options?.minSegments??8,arcLength2=Math.abs(geometry.radius*geometry.sweepAngle),numSegments=Math.max(2,minSegments,Math.ceil(arcLength2/segmentLength)),points=[];for(let i3=0;i3<=numSegments;i3++){let t52=i3/numSegments,angle=geometry.startAngle+geometry.sweepAngle*t52;points.push({x:geometry.center.x+geometry.radius*Math.cos(angle),y:geometry.center.y+geometry.radius*Math.sin(angle)})}return points}function getCurvePoints(curve){let xyPoints=(curve.points?.points??[]).filter(point7=>point7.token==="xy").map(point7=>getPcbPoint(point7));return xyPoints.length<4?null:{start:xyPoints[0],control1:xyPoints[1],control2:xyPoints[2],end:xyPoints[3]}}function approximateCubicBezierPoints(start,control1,control2,end,options){let segmentLength=options?.segmentLength??.25,minSegments=options?.minSegments??8,controlPolygonLength=getDistance4(start,control1)+getDistance4(control1,control2)+getDistance4(control2,end),numSegments=Math.max(2,minSegments,Math.ceil(controlPolygonLength/segmentLength)),points=[];for(let i3=0;i3<=numSegments;i3++){let t52=i3/numSegments,omt=1-t52;points.push({x:omt**3*start.x+3*omt**2*t52*control1.x+3*omt*t52**2*control2.x+t52**3*end.x,y:omt**3*start.y+3*omt**2*t52*control1.y+3*omt*t52**2*control2.y+t52**3*end.y})}return points}function approximateCirclePoints(center2,end,options){let radius=getDistance4(center2,end);if(radius<=0)return[center2];let segmentLength=options?.segmentLength??.25,minSegments=options?.minSegments??16,circumference=FULL_TURN*radius,numSegments=Math.max(8,minSegments,Math.ceil(circumference/segmentLength)),startAngle=Math.atan2(end.y-center2.y,end.x-center2.x),points=[];for(let i3=0;i3<=numSegments;i3++){let t52=i3/numSegments,angle=startAngle+FULL_TURN*t52;points.push({x:center2.x+radius*Math.cos(angle),y:center2.y+radius*Math.sin(angle)})}return points}function getArcGeometry(start,mid,end){let circle2=calculateArcCenter2(start,mid,end);if(!circle2)return null;let startAngle=Math.atan2(start.y-circle2.center.y,start.x-circle2.center.x),midAngle=Math.atan2(mid.y-circle2.center.y,mid.x-circle2.center.x),endAngle=Math.atan2(end.y-circle2.center.y,end.x-circle2.center.x),sweepAngle=normalizeSignedAngle(endAngle-startAngle),midSweep=normalizeSignedAngle(midAngle-startAngle),isCounterClockwise=sweepAngle>0;return isCounterClockwise&&midSweep>0&&midSweep<sweepAngle||!isCounterClockwise&&midSweep<0&&midSweep>sweepAngle||(sweepAngle=sweepAngle>0?sweepAngle-FULL_TURN:sweepAngle+FULL_TURN),{center:circle2.center,radius:circle2.radius,startAngle,sweepAngle}}function normalizeSignedAngle(angle){for(;angle<=-Math.PI;)angle+=FULL_TURN;for(;angle>Math.PI;)angle-=FULL_TURN;return angle}function calculateArcCenter2(p12,p22,p32){let ax3=p12.x,ay3=p12.y,bx3=p22.x,by3=p22.y,cx3=p32.x,cy3=p32.y,determinant=2*(ax3*(by3-cy3)+bx3*(cy3-ay3)+cx3*(ay3-by3));if(Math.abs(determinant)<1e-10)return null;let ux3=((ax3*ax3+ay3*ay3)*(by3-cy3)+(bx3*bx3+by3*by3)*(cy3-ay3)+(cx3*cx3+cy3*cy3)*(ay3-by3))/determinant,uy3=((ax3*ax3+ay3*ay3)*(cx3-bx3)+(bx3*bx3+by3*by3)*(ax3-cx3)+(cx3*cx3+cy3*cy3)*(bx3-ax3))/determinant;return{center:{x:ux3,y:uy3},radius:Math.sqrt((ax3-ux3)**2+(ay3-uy3)**2)}}function getDistance4(a3,b3){return Math.hypot(b3.x-a3.x,b3.y-a3.y)}var CollectGraphicsStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb)return this.finished=!0,!1;let lines=this.ctx.kicadPcb.graphicLines||[],lineArray=Array.isArray(lines)?lines:[lines],arcArray=getGraphicArcs(this.ctx.kicadPcb),circleArray=getGraphicCircles(this.ctx.kicadPcb),curveArray=getGraphicCurves(this.ctx.kicadPcb),edgeCutPrimitives=[];for(let line2 of lineArray){let layerStr=getGraphicLayerNames(line2).join(" ");if(layerStr.includes("Edge.Cuts")){let{start,end}=getLineStartEnd(line2);edgeCutPrimitives.push({type:"line",start,end})}else if(layerStr.includes("SilkS")||layerStr.includes("Fab")||layerStr.includes("CrtYd")){let renderLayer=mapKicadLayerToPcbRenderLayer(line2.layer);renderLayer&&this.createGraphicPath(line2,renderLayer)}}for(let arc2 of arcArray){let layerStr=getGraphicLayerNames(arc2).join(" ");if(layerStr.includes("Edge.Cuts")){let{start,mid,end}=getArcStartMidEnd(arc2);edgeCutPrimitives.push({type:"arc",start,mid,end})}else if(layerStr.includes("SilkS")||layerStr.includes("Fab")||layerStr.includes("CrtYd")){let renderLayer=mapKicadLayerToPcbRenderLayer(arc2.layer);renderLayer&&this.createGraphicArc(arc2,renderLayer)}}for(let circle2 of circleArray){if(!getGraphicLayerNames(circle2).join(" ").includes("Edge.Cuts"))continue;let{center:center2,end}=getCircleCenterEnd(circle2);edgeCutPrimitives.push({type:"circle",center:center2,start:end,end})}for(let curve of curveArray){if(!getGraphicLayerNames(curve).join(" ").includes("Edge.Cuts"))continue;let points=getCurvePoints(curve);points&&edgeCutPrimitives.push({type:"curve",start:points.start,control1:points.control1,control2:points.control2,end:points.end})}edgeCutPrimitives.length>0&&this.createBoardOutline(edgeCutPrimitives);let grRects=this.ctx.kicadPcb.graphicRects||[];for(let rect of grRects)this.processRectangle(rect);let grPolys=this.ctx.kicadPcb.graphicPolys||[],polyArray=Array.isArray(grPolys)?grPolys:[grPolys];for(let poly of polyArray)this.processPolygon(poly);let texts=this.ctx.kicadPcb.graphicTexts||[],textArray=Array.isArray(texts)?texts:[texts];for(let text of textArray){let renderLayer=mapKicadLayerToPcbRenderLayer(text.layer);renderLayer&&this.createGraphicText(text,renderLayer)}return this.finished=!0,!1}createBoardOutline(primitives){if(!this.ctx.k2cMatPcb)return;let orderedSegments=[],remainingSegments=[...primitives];if(remainingSegments.length>0)for(orderedSegments.push(remainingSegments.shift());remainingSegments.length>0;){let lastEnd=orderedSegments[orderedSegments.length-1].end,foundIndex=remainingSegments.findIndex(seg=>this.pointsEqualKicad(seg.start,lastEnd));if(foundIndex===-1&&(foundIndex=remainingSegments.findIndex(seg=>this.pointsEqualKicad(seg.end,lastEnd)),foundIndex!==-1)){let seg=remainingSegments[foundIndex];orderedSegments.push(seg.type==="arc"?{type:"arc",start:seg.end,mid:seg.mid,end:seg.start}:seg.type==="circle"?{type:"circle",center:seg.center,start:seg.end,end:seg.start}:seg.type==="curve"?{type:"curve",start:seg.end,control1:seg.control2,control2:seg.control1,end:seg.start}:{type:"line",start:seg.end,end:seg.start}),remainingSegments.splice(foundIndex,1);continue}foundIndex!==-1?orderedSegments.push(remainingSegments.splice(foundIndex,1)[0]):orderedSegments.push(remainingSegments.shift())}let points=[];for(let segment2 of orderedSegments){let kicadPoints;segment2.type==="arc"?kicadPoints=approximateArcPoints(segment2.start,segment2.mid,segment2.end,{segmentLength:.25,minSegments:16}):segment2.type==="circle"?kicadPoints=approximateCirclePoints(segment2.center,segment2.end,{segmentLength:.25,minSegments:16}):segment2.type==="curve"?kicadPoints=approximateCubicBezierPoints(segment2.start,segment2.control1,segment2.control2,segment2.end,{segmentLength:.25,minSegments:16}):kicadPoints=[segment2.start,segment2.end];for(let kicadPoint of kicadPoints){let point7=applyToPoint(this.ctx.k2cMatPcb,kicadPoint),lastPoint=points[points.length-1];(!lastPoint||!this.pointsEqual(lastPoint,point7))&&points.push(point7)}}let existingBoard=this.ctx.db.pcb_board.list()[0];existingBoard?(existingBoard.outline=points,existingBoard.width=this.calculateWidth(points),existingBoard.height=this.calculateHeight(points)):this.ctx.db.pcb_board.insert({outline:points,width:this.calculateWidth(points),height:this.calculateHeight(points)})}createGraphicPath(line2,renderLayer){if(!this.ctx.k2cMatPcb)return;let{start,end}=getLineStartEnd(line2),startPos=applyToPoint(this.ctx.k2cMatPcb,start),endPos=applyToPoint(this.ctx.k2cMatPcb,end),layer=mapKicadLayerToVisibleLayer(line2.layer),strokeWidth=line2.width||.15;this.insertRouteGraphic({layer,renderLayer,pcbComponentId:"",route:[startPos,endPos],strokeWidth})}createGraphicArc(arc2,renderLayer){if(!this.ctx.k2cMatPcb)return;let{start,mid,end}=getArcStartMidEnd(arc2),route=approximateArcPoints(start,mid,end,{segmentLength:.1,minSegments:8}).map(point7=>applyToPoint(this.ctx.k2cMatPcb,point7)),layer=mapKicadLayerToVisibleLayer(arc2.layer),strokeWidth=arc2.stroke?.width??arc2._sxStroke?._sxWidth?.value??arc2.width??.15;this.insertRouteGraphic({layer,renderLayer,pcbComponentId:"",route,strokeWidth})}insertRouteGraphic(options){let{layer,renderLayer,pcbComponentId,route,strokeWidth}=options;if(renderLayer.endsWith("_silkscreen")){this.ctx.db.pcb_silkscreen_path.insert({pcb_component_id:pcbComponentId,layer,route,stroke_width:strokeWidth});return}if(renderLayer.endsWith("_fabrication_note")){this.ctx.db.pcb_fabrication_note_path.insert({pcb_component_id:pcbComponentId,layer,route,stroke_width:strokeWidth});return}this.ctx.db.pcb_courtyard_outline.insert({pcb_component_id:pcbComponentId,layer,outline:route})}processRectangle(rect){if(!this.ctx.k2cMatPcb)return;let start={x:rect._sxStart?._x??0,y:rect._sxStart?._y??0},end={x:rect._sxEnd?._x??0,y:rect._sxEnd?._y??0},renderLayer=mapKicadLayerToPcbRenderLayer(rect._sxLayer),isFilled=rect._sxFill&&(rect._sxFill.isFilled===!0||String(rect._sxFill).includes("fill yes")),isCopperLayer=renderLayer?.endsWith("_copper"),centerKicad={x:(start.x+end.x)/2,y:(start.y+end.y)/2},widthKicad=Math.abs(end.x-start.x),heightKicad=Math.abs(end.y-start.y),centerCJ=applyToPoint(this.ctx.k2cMatPcb,centerKicad);if(isFilled&&isCopperLayer){let layer2=mapKicadLayerToLayerRef(rect._sxLayer);this.ctx.db.pcb_smtpad.insert({pcb_component_id:"",x:centerCJ.x,y:centerCJ.y,width:widthKicad,height:heightKicad,layer:layer2,shape:"rect",port_hints:[]}),this.ctx.stats&&(this.ctx.stats.pads=(this.ctx.stats.pads||0)+1);return}let layer=mapKicadLayerToVisibleLayer(rect._sxLayer),strokeWidth=rect.stroke?.width??rect._sxStroke?._sxWidth?.value??rect.width??.15;if(renderLayer?.endsWith("_fabrication_note")){this.ctx.db.pcb_fabrication_note_rect.insert({pcb_component_id:"",center:centerCJ,width:widthKicad,height:heightKicad,layer,stroke_width:strokeWidth,is_filled:isFilled,has_stroke:!0});return}renderLayer?.endsWith("_courtyard")&&this.ctx.db.pcb_courtyard_rect.insert({pcb_component_id:"",center:centerCJ,width:widthKicad,height:heightKicad,layer})}createGraphicText(text,renderLayer){if(!this.ctx.k2cMatPcb)return;let at3=text.at||text._sxPosition,pos=applyToPoint(this.ctx.k2cMatPcb,{x:at3?.x??0,y:at3?.y??0}),layer=mapKicadLayerToVisibleLayer(text.layer),fontSize=(text._sxEffects?._sxFont?._sxSize?._height||text.effects?.font?.size?.y||1)*1.5,textValue=text.text||text._text||"",justify=text._sxEffects?._sxJustify||text.effects?.justify,anchorAlignment=mapKicadJustifyToAnchorAlignment(justify);if(renderLayer.endsWith("_silkscreen")){this.ctx.db.pcb_silkscreen_text.insert({pcb_component_id:"",text:textValue,anchor_position:pos,anchor_alignment:anchorAlignment,layer,font_size:fontSize,font:"tscircuit2024"});return}if(renderLayer.endsWith("_fabrication_note")){this.ctx.db.pcb_fabrication_note_text.insert({pcb_component_id:"",text:textValue,anchor_position:pos,anchor_alignment:anchorAlignment,layer,font_size:fontSize,font:"tscircuit2024"});return}renderLayer.endsWith("_copper")&&this.ctx.db.pcb_copper_text.insert({pcb_component_id:"",text:textValue,anchor_position:pos,anchor_alignment:anchorAlignment,layer,font_size:fontSize,font:"tscircuit2024"})}pointsEqual(p12,p22){return Math.abs(p12.x-p22.x)<.001&&Math.abs(p12.y-p22.y)<.001}pointsEqualKicad(p12,p22){return Math.abs(p12.x-p22.x)<.001&&Math.abs(p12.y-p22.y)<.001}calculateWidth(points){if(points.length===0)return 0;let xs3=points.map(p4=>p4.x);return Math.max(...xs3)-Math.min(...xs3)}calculateHeight(points){if(points.length===0)return 0;let ys3=points.map(p4=>p4.y);return Math.max(...ys3)-Math.min(...ys3)}processPolygon(poly){if(!this.ctx.k2cMatPcb)return;let renderLayer=mapKicadLayerToPcbRenderLayer(poly._sxLayer),isFilled=poly._sxFill?.filled===!0,isCopperLayer=renderLayer?.endsWith("_copper");if(!isFilled&&!renderLayer?.endsWith("_courtyard"))return;let ptsData=poly._sxPts?.points||[],points=[];for(let pt3 of ptsData)if(pt3.token==="xy")points.push({x:pt3.x,y:pt3.y});else if(pt3.token==="arc"){let arcPoints=approximateArcPoints({x:pt3._sxStart?._x,y:pt3._sxStart?._y},{x:pt3._sxMid?._x,y:pt3._sxMid?._y},{x:pt3._sxEnd?._x,y:pt3._sxEnd?._y});points.push(...arcPoints)}if(points.length<3)return;let transformedPoints=points.map(pt3=>applyToPoint(this.ctx.k2cMatPcb,pt3));if(isFilled&&isCopperLayer){let layer=mapKicadLayerToLayerRef(poly._sxLayer);this.ctx.db.pcb_smtpad.insert({pcb_component_id:"",shape:"polygon",points:transformedPoints,layer,port_hints:[]}),this.ctx.stats&&(this.ctx.stats.pads=(this.ctx.stats.pads||0)+1);return}if(renderLayer?.endsWith("_courtyard")){let layer=mapKicadLayerToVisibleLayer(poly._sxLayer);this.ctx.db.pcb_courtyard_outline.insert({pcb_component_id:"",layer,outline:transformedPoints})}}};function sanitizeCircuitJsonNetName(rawName,fallbackName){let name=(rawName?.trim()||fallbackName).replace(/\+/g,"_P").replace(/-/g,"_").replace(/[^A-Za-z0-9_]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||fallbackName;return/^\d/.test(name)?`net_${name}`:name}var CollectNetsStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let nets=this.ctx.kicadPcb.nets||[],netArray=Array.isArray(nets)?nets:[nets],usedNetNames=new Set;for(let net of netArray){let netNum=net._id??net.number??net.ordinal??0,rawNetName=net._name??net.name,sanitizedNetName=sanitizeCircuitJsonNetName(rawNetName,`Net_${netNum}`),netName=usedNetNames.has(sanitizedNetName)?`${sanitizedNetName}_${netNum}`:sanitizedNetName;usedNetNames.add(netName),this.ctx.netNumToName.set(netNum,netName)}return this.ctx.netNumToName.has(0)||this.ctx.netNumToName.set(0,""),this.finished=!0,!1}},CollectSourceTracesStage=class extends ConverterStage{constructor(){super(...arguments);__publicField(this,"processedNets",new Set)}step(){if(!this.ctx.kicadPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let netToPads=new Map,footprints=this.ctx.kicadPcb.footprints||[],footprintArray=Array.isArray(footprints)?footprints:[footprints];for(let footprint of footprintArray)this.processFootprintPads(footprint,netToPads);this.collectNetsFromCopper(netToPads);for(let[netNum,pads]of netToPads.entries())this.processedNets.has(netNum)||(this.ctx.netNumToSourcePortIds?.set(netNum,pads.map(p4=>p4.sourcePortId)),this.createSourceNet(netNum),this.processedNets.add(netNum));return this.finished=!0,!1}collectNetsFromCopper(netToPads){if(!this.ctx.kicadPcb)return;let segments=this.ctx.kicadPcb.segments||[],segmentArray=Array.isArray(segments)?segments:[segments];for(let segment2 of segmentArray){let netNum=this.getSegmentNet(segment2);netNum&&(netToPads.has(netNum)||netToPads.set(netNum,[]))}let arcArray=getTopLevelCopperArcs(this.ctx.kicadPcb);for(let arc2 of arcArray){let netNum=this.getSegmentNet(arc2);netNum&&(netToPads.has(netNum)||netToPads.set(netNum,[]))}}getSegmentNet(segment2){let net=segment2?.net;return net?typeof net=="number"?net:typeof net=="object"?net._id??net.number??net.ordinal??null:null:null}processFootprintPads(footprint,netToPads){let footprintUuid=footprint.uuid?.value||footprint.tstamp?.value;if(!footprintUuid)return;let componentId=this.ctx.footprintUuidToComponentId?.get(footprintUuid);if(!componentId)return;let pads=footprint.fpPads||[],padArray=Array.isArray(pads)?pads:[pads];for(let pad2 of padArray){let padNumber=pad2.number?.toString();if(!padNumber)continue;let netNum=this.getPadNet(pad2);if(netNum==null||netNum===0)continue;let sourcePortId=this.getOrCreateSourcePort(componentId,padNumber,footprint);netToPads.has(netNum)||netToPads.set(netNum,[]),netToPads.get(netNum).push({componentId,padNumber,sourcePortId})}}getPadNet(pad2){let net=pad2._sxNet||pad2.net;return net?typeof net=="number"?net:typeof net=="object"?net._id??net.number??net.ordinal??null:null:null}getOrCreateSourcePort(componentId,padNumber,footprint){let sourcePortId=`${componentId}_port_${padNumber}`;if(!this.ctx.db.source_port.list().find(sp3=>sp3.source_port_id===sourcePortId)){let footprintUuid=footprint.uuid?.value||footprint.tstamp?.value,sourceComponentId=footprintUuid&&this.ctx.footprintUuidToSourceComponentId?this.ctx.footprintUuidToSourceComponentId.get(footprintUuid):void 0;this.ctx.db.source_port.insert({source_port_id:sourcePortId,source_component_id:sourceComponentId||componentId,name:this.getSourcePortName(padNumber),pin_number:this.getSourcePortPinNumber(padNumber)})}return sourcePortId}getSourcePortName(padNumber){return/^\d+$/.test(padNumber)?`pin${Number(padNumber)}`:padNumber}getSourcePortPinNumber(padNumber){return/^\d+$/.test(padNumber)?Number(padNumber):padNumber}createSourceNet(netNum){let netName=this.ctx.netNumToName?.get(netNum)||`Net-${netNum}`,sourceNet=this.ctx.db.source_net.insert({name:netName,member_source_group_ids:[]});this.ctx.netNumToSourceNetId?.set(netNum,sourceNet.source_net_id),this.ctx.stats&&(this.ctx.stats.traces=(this.ctx.stats.traces||0)+1)}},CollectTracesStage=class extends ConverterStage{constructor(){super(...arguments);__publicField(this,"PORT_MATCH_TOLERANCE",.001);__publicField(this,"POINT_KEY_PRECISION",1e6)}step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb||!this.ctx.netNumToName||!this.ctx.netNumToSourceNetId)return this.finished=!0,!1;let segments=this.ctx.kicadPcb.segments||[],segmentArray=Array.isArray(segments)?segments:[segments],arcArray=getTopLevelCopperArcs(this.ctx.kicadPcb),primitives=[];for(let segment2 of segmentArray){let primitive=this.getTracePrimitiveFromSegment(segment2);primitive&&primitives.push(primitive)}for(let arc2 of arcArray){let primitive=this.getTracePrimitiveFromArc(arc2);primitive&&primitives.push(primitive)}return this.annotatePrimitivesWithConnectedSourcePorts(primitives),this.createTracesFromPrimitives(primitives),this.finished=!0,!1}getTracePrimitiveFromSegment(segment2){if(!this.ctx.k2cMatPcb)return;let start=segment2.start||{x:0,y:0},end=segment2.end||{x:0,y:0},width=segment2.width||.2,layer=segment2.layer,layerStr=getLayerNames(layer).join(" "),mappedLayer=mapKicadLayerToLayerRef(layerStr),netNum=this.getSegmentNet(segment2),startPoint={x:start.x,y:start.y},endPoint={x:end.x,y:end.y};if(!this.pointsMatch(startPoint,endPoint))return{start:startPoint,end:endPoint,points:[startPoint,endPoint],width,layer:mappedLayer,netNum}}getTracePrimitiveFromArc(arc2){if(!this.ctx.k2cMatPcb)return;let{start,mid,end}=getArcStartMidEnd(arc2),width=arc2.width??arc2._sxWidth?.value??.2,layerStr=getLayerNames(arc2.layer).join(" "),mappedLayer=mapKicadLayerToLayerRef(layerStr),netNum=this.getSegmentNet(arc2),points=approximateArcPoints(start,mid,end,{segmentLength:Math.max(width,.1),minSegments:8}),startPoint=points[0],endPoint=points[points.length-1];if(!(!startPoint||!endPoint||this.pointsMatch(startPoint,endPoint)))return{start:startPoint,end:endPoint,points,width,layer:mappedLayer,netNum}}createTracesFromPrimitives(primitives){let groupedPrimitives=new Map;for(let primitive of primitives){let key=this.getPrimitiveGroupKey(primitive),group=groupedPrimitives.get(key)??[];group.push(primitive),groupedPrimitives.set(key,group)}for(let group of groupedPrimitives.values())this.createTracesFromPrimitiveGroup(group)}createTracesFromPrimitiveGroup(primitives){let graph=this.createTraceGraph(primitives),visitedEdgeIds=new Set,isTerminal=nodeKey=>this.isTerminalNode(nodeKey,graph,primitives[0]);for(let nodeKey of graph.adjacency.keys())if(isTerminal(nodeKey))for(let edgeId of graph.adjacency.get(nodeKey)??[]){if(visitedEdgeIds.has(edgeId))continue;let path=this.walkTracePath(nodeKey,edgeId,graph,visitedEdgeIds);this.insertTracePath(path)}for(let edge of graph.edges){if(visitedEdgeIds.has(edge.id))continue;let path=this.walkTracePath(edge.startKey,edge.id,graph,visitedEdgeIds);this.insertTracePath(path)}}createTraceGraph(primitives){let edges=[],adjacency=new Map;for(let primitive of primitives){let id2=edges.length,startKey=this.getPointKey(primitive.start),endKey=this.getPointKey(primitive.end),edge={...primitive,id:id2,startKey,endKey};edges.push(edge);for(let nodeKey of[startKey,endKey]){let edgeIds=adjacency.get(nodeKey)??[];edgeIds.push(id2),adjacency.set(nodeKey,edgeIds)}}return{edges,adjacency}}walkTracePath(startNodeKey,firstEdgeId,graph,visitedEdgeIds){let path=[],currentNodeKey=startNodeKey,edgeId=firstEdgeId;for(;!visitedEdgeIds.has(edgeId);){let edge=graph.edges[edgeId];if(!edge)break;let reversed=edge.endKey===currentNodeKey;if(path.push({edge,reversed}),visitedEdgeIds.add(edgeId),currentNodeKey=reversed?edge.startKey:edge.endKey,this.isTerminalNode(currentNodeKey,graph,edge))break;let nextEdgeId=(graph.adjacency.get(currentNodeKey)??[]).find(candidateEdgeId=>candidateEdgeId!==edgeId&&!visitedEdgeIds.has(candidateEdgeId));if(nextEdgeId===void 0)break;edgeId=nextEdgeId}return path}insertTracePath(path){if(!this.ctx.k2cMatPcb||!this.ctx.netNumToSourceNetId||path.length===0)return;let routePoints=this.getPathRoutePoints(path);if(routePoints.length<2)return;let firstPoint=routePoints[0],lastPoint=routePoints[routePoints.length-1],layer=path[0].edge.layer,netNum=path[0].edge.netNum,sourceNetId=netNum!==null?this.ctx.netNumToSourceNetId.get(netNum)??void 0:void 0,startPcbPortId=this.findPortAtPosition(firstPoint,layer),endPcbPortId=this.findPortAtPosition(lastPoint,layer),connectedSourcePortIds=this.getConnectedSourcePortIds([startPcbPortId,endPcbPortId]),traceConnectedSourcePortIds=this.getTraceConnectedSourcePortIds(path),inferredSourcePortIds=this.getSourcePortIdsForTrace({netNum,connectedSourcePortIds,traceConnectedSourcePortIds}),sourceTraceId=sourceNetId?this.createSourceTraceForPath({sourceNetId,connectedSourcePortIds:inferredSourcePortIds,netNum}):void 0,route=routePoints.map((point7,index)=>({route_type:"wire",x:point7.x,y:point7.y,width:point7.width,layer,...index===0&&startPcbPortId?{start_pcb_port_id:startPcbPortId}:{},...index===routePoints.length-1&&endPcbPortId?{end_pcb_port_id:endPcbPortId}:{}}));this.ctx.db.pcb_trace.insert({route,source_trace_id:sourceTraceId,pcb_port_id:void 0}),this.ctx.stats&&(this.ctx.stats.traces=(this.ctx.stats.traces||0)+1)}getPathRoutePoints(path){let routePoints=[],lastRawPoint;for(let{edge,reversed}of path){let edgePoints=reversed?[...edge.points].reverse():edge.points;for(let point7 of edgePoints){if(lastRawPoint&&this.pointsMatch(lastRawPoint,point7))continue;let transformedPoint=applyToPoint(this.ctx.k2cMatPcb,point7);routePoints.push({x:transformedPoint.x,y:transformedPoint.y,width:edge.width}),lastRawPoint=point7}}return routePoints}isTerminalNode(nodeKey,graph,primitive){if((graph.adjacency.get(nodeKey)??[]).length!==2)return!0;let point7=this.getPointFromKey(nodeKey),transformedPoint=applyToPoint(this.ctx.k2cMatPcb,point7);return this.findPortAtPosition(transformedPoint,primitive.layer)?!0:this.hasViaAtPosition(point7,primitive.layer,primitive.netNum)}hasViaAtPosition(point7,layer,netNum){let vias=this.ctx.kicadPcb?.vias||[],viaArray=Array.isArray(vias)?vias:[vias];for(let via of viaArray){if(this.getSegmentNet(via)!==netNum)continue;let at3=via.at||{x:0,y:0};if(!this.pointsMatch(point7,{x:at3.x,y:at3.y}))continue;let viaLayers=via.layers?getCopperSpanLayerRefsFromLayers(via.layers,this.ctx.kicadPcb):[];if((viaLayers.length>0?viaLayers:getPcbCopperLayerRefs(this.ctx.kicadPcb)).includes(layer))return!0}return!1}getPrimitiveGroupKey(primitive){return[primitive.netNum??"no-net",primitive.layer,primitive.width.toFixed(6)].join(":")}getPointKey(point7){let x4=Math.round(point7.x*this.POINT_KEY_PRECISION),y4=Math.round(point7.y*this.POINT_KEY_PRECISION);return`${x4},${y4}`}getPointFromKey(pointKey){let[x4,y4]=pointKey.split(",").map(Number);return{x:(x4??0)/this.POINT_KEY_PRECISION,y:(y4??0)/this.POINT_KEY_PRECISION}}pointsMatch(a3,b3){return this.getPointKey(a3)===this.getPointKey(b3)}getPcbTraceNodeKey({netNum,layer,point:point7}){return`${netNum??"no-net"}:${layer}:${this.getPointKey(point7)}`}annotatePrimitivesWithConnectedSourcePorts(primitives){if(!this.ctx.k2cMatPcb||primitives.length===0)return;let nodes=new Map,adjacency=new Map,ensureNode=(netNum,layer,point7)=>{let key=this.getPcbTraceNodeKey({netNum,layer,point:point7});return nodes.has(key)||nodes.set(key,{key,point:point7,layer,netNum}),adjacency.has(key)||adjacency.set(key,new Set),key},connectNodes=(a3,b3)=>{adjacency.get(a3)?.add(b3),adjacency.get(b3)?.add(a3)};for(let primitive of primitives){let startKey=ensureNode(primitive.netNum,primitive.layer,primitive.start),endKey=ensureNode(primitive.netNum,primitive.layer,primitive.end);connectNodes(startKey,endKey)}let vias=this.ctx.kicadPcb?.vias||[],viaArray=Array.isArray(vias)?vias:[vias];for(let via of viaArray){let netNum=this.getSegmentNet(via);if(netNum===null)continue;let at3=via.at||{x:0,y:0},point7={x:at3.x,y:at3.y},viaLayers=via.layers?getCopperSpanLayerRefsFromLayers(via.layers,this.ctx.kicadPcb):[],viaNodeKeys=(viaLayers.length>0?viaLayers:getPcbCopperLayerRefs(this.ctx.kicadPcb)).map(layer=>ensureNode(netNum,layer,point7));for(let i3=1;i3<viaNodeKeys.length;i3++)connectNodes(viaNodeKeys[0],viaNodeKeys[i3])}let connectedSourcePortIdsByNodeKey=new Map,visited=new Set;for(let startNodeKey of nodes.keys()){if(visited.has(startNodeKey))continue;let traceNodeKeys=[],traceConnectedSourcePortIds=new Set,stack=[startNodeKey];for(visited.add(startNodeKey);stack.length>0;){let nodeKey=stack.pop(),node=nodes.get(nodeKey);if(!node)continue;traceNodeKeys.push(nodeKey);let transformedPoint=applyToPoint(this.ctx.k2cMatPcb,node.point),pcbPortId=this.findPortAtPosition(transformedPoint,node.layer),sourcePortId=this.getConnectedSourcePortIds([pcbPortId])[0];sourcePortId&&traceConnectedSourcePortIds.add(sourcePortId);for(let neighborNodeKey of adjacency.get(nodeKey)??[])visited.has(neighborNodeKey)||(visited.add(neighborNodeKey),stack.push(neighborNodeKey))}let sourcePortIds=[...traceConnectedSourcePortIds];for(let nodeKey of traceNodeKeys)connectedSourcePortIdsByNodeKey.set(nodeKey,sourcePortIds)}for(let primitive of primitives){let nodeKey=this.getPcbTraceNodeKey({netNum:primitive.netNum,layer:primitive.layer,point:primitive.start});primitive.connectedSourcePortIds=connectedSourcePortIdsByNodeKey.get(nodeKey)??[]}}getSegmentNet(segment2){let net=segment2?.net;return net?typeof net=="number"?net:typeof net=="object"?net._id??net.number??net.ordinal??null:null:null}findPortAtPosition(point7,layer){let ports=this.ctx.db.pcb_port.list();for(let port of ports){let layers=port.layers;if(!(layers?.length&&!layers.includes(layer))&&Math.abs((port.x??0)-point7.x)<=this.PORT_MATCH_TOLERANCE&&Math.abs((port.y??0)-point7.y)<=this.PORT_MATCH_TOLERANCE)return port.pcb_port_id}}getConnectedSourcePortIds(pcbPortIds){let connectedSourcePortIds=[];for(let pcbPortId of pcbPortIds){if(!pcbPortId)continue;let sourcePortId=this.ctx.db.pcb_port.get(pcbPortId)?.source_port_id;!sourcePortId||connectedSourcePortIds.includes(sourcePortId)||connectedSourcePortIds.push(sourcePortId)}return connectedSourcePortIds}getSourcePortIdsForTrace({netNum,connectedSourcePortIds,traceConnectedSourcePortIds}){if(netNum===null||connectedSourcePortIds.length>=2)return connectedSourcePortIds;let inferredSourcePortIds=[...connectedSourcePortIds];for(let sourcePortId of traceConnectedSourcePortIds)if(inferredSourcePortIds.includes(sourcePortId)||inferredSourcePortIds.push(sourcePortId),inferredSourcePortIds.length>=2)return inferredSourcePortIds.slice(0,2);let netSourcePortIds=this.ctx.netNumToSourcePortIds?.get(netNum)??[];for(let sourcePortId of netSourcePortIds)if(inferredSourcePortIds.includes(sourcePortId)||inferredSourcePortIds.push(sourcePortId),inferredSourcePortIds.length>=2)return inferredSourcePortIds.slice(0,2);return inferredSourcePortIds}getTraceConnectedSourcePortIds(path){let sourcePortIds=[];for(let{edge}of path)for(let sourcePortId of edge.connectedSourcePortIds??[])sourcePortIds.includes(sourcePortId)||sourcePortIds.push(sourcePortId);return sourcePortIds}createSourceTraceForPath({sourceNetId,connectedSourcePortIds,netNum}){let netName=netNum!==null?this.ctx.netNumToName?.get(netNum)??`Net-${netNum}`:void 0;return this.ctx.db.source_trace.insert({connected_source_port_ids:connectedSourcePortIds,connected_source_net_ids:[sourceNetId],display_name:netName}).source_trace_id}},CollectViasStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let vias=this.ctx.kicadPcb.vias||[],viaArray=Array.isArray(vias)?vias:[vias];for(let via of viaArray)this.processVia(via);return this.finished=!0,!1}processVia(via){if(!this.ctx.k2cMatPcb||!this.ctx.netNumToName)return;let at3=via.at||{x:0,y:0},pos=applyToPoint(this.ctx.k2cMatPcb,{x:at3.x,y:at3.y}),size3=via.size||.8,drill=via.drill||.4,netNum=via.net||0,netName=this.ctx.netNumToName.get(netNum)||"",mappedLayers=via.layers?getCopperSpanLayerRefsFromLayers(via.layers,this.ctx.kicadPcb):[],layers=mappedLayers.length>0?mappedLayers:getPcbCopperLayerRefs(this.ctx.kicadPcb);this.ctx.db.pcb_via.insert({x:pos.x,y:pos.y,outer_diameter:size3,hole_diameter:drill,layers}),this.ctx.stats&&(this.ctx.stats.vias=(this.ctx.stats.vias||0)+1)}},CollectZonesStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let zones=this.ctx.kicadPcb.zones||[],zoneArray=Array.isArray(zones)?zones:[zones];for(let zone of zoneArray)this.isZoneFilled(zone)&&this.createCopperPourFromZone(zone);return this.finished=!0,!1}isZoneFilled(zone){if(!zone._rawChildren||!Array.isArray(zone._rawChildren))return!1;let fillEntry=zone._rawChildren.find(child=>Array.isArray(child)&&child[0]==="fill");return fillEntry&&fillEntry[1]==="yes"?!0:zone._rawChildren.some(child=>Array.isArray(child)&&child[0]==="filled_polygon")}createCopperPourFromZone(zone){if(!this.ctx.k2cMatPcb||!this.ctx.netNumToName||!zone._rawChildren||!Array.isArray(zone._rawChildren))return;let zoneData=this.parseZoneData(zone._rawChildren),filledPolygons=this.extractFilledPolygons(zone._rawChildren);if(filledPolygons.length===0){let mainPolygon=this.extractMainPolygon(zone._rawChildren);mainPolygon.length>0&&filledPolygons.push(mainPolygon)}if(filledPolygons.length===0){this.ctx.warnings&&this.ctx.warnings.push(`Zone on layer ${zoneData.layer||"unknown"} has no valid polygon points`);return}let layer=mapKicadLayerToLayerRef(zoneData.layer),netNum=zoneData.net||0,netName=this.ctx.netNumToName.get(netNum)||zoneData.netName||"";for(let polygonPoints of filledPolygons){let transformedPoints=polygonPoints.map(point7=>applyToPoint(this.ctx.k2cMatPcb,{x:point7.x,y:point7.y}));this.ctx.db.pcb_copper_pour.insert({layer,net_name:netName,points:transformedPoints,shape:"polygon"}),this.ctx.stats&&(this.ctx.stats.copper_pours=(this.ctx.stats.copper_pours||0)+1)}}parseZoneData(children){let data={};for(let child of children)if(Array.isArray(child))switch(child[0]){case"net":data.net=child[1];break;case"net_name":data.netName=child[1];break;case"layer":data.layer=child[1];break}return data}extractMainPolygon(children){let polygonEntry=children.find(child=>Array.isArray(child)&&child[0]==="polygon");return polygonEntry?this.extractPointsFromPolygonEntry(polygonEntry):[]}extractFilledPolygons(children){let filledPolygonEntries=children.filter(child=>Array.isArray(child)&&child[0]==="filled_polygon"),polygons=[];for(let entry of filledPolygonEntries){let points=this.extractPointsFromPolygonEntry(entry);points.length>0&&polygons.push(points)}return polygons}extractPointsFromPolygonEntry(polygonEntry){let points=[],ptsEntry=polygonEntry.find(child=>Array.isArray(child)&&child[0]==="pts");if(!ptsEntry)return[];for(let i3=1;i3<ptsEntry.length;i3++){let item=ptsEntry[i3];if(Array.isArray(item)&&item[0]==="xy"&&item.length>=3){let x4=item[1],y4=item[2];typeof x4=="number"&&typeof y4=="number"&&points.push({x:x4,y:y4})}}return points}},InitializePcbContextStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb)return this.finished=!0,!1;let center2=this.calculateBoardCenter();return this.ctx.k2cMatPcb=compose(scale(1,-1),translate(-center2.x,-center2.y)),this.ctx.netNumToName=new Map,this.ctx.netNumToSourceNetId=new Map,this.ctx.netNumToSourcePortIds=new Map,this.ctx.footprintUuidToComponentId=new Map,this.ctx.footprintUuidToSourceComponentId=new Map,this.finished=!0,!1}calculateBoardCenter(){if(!this.ctx.kicadPcb)return{x:0,y:0};let lines=this.ctx.kicadPcb.graphicLines||[],lineArray=Array.isArray(lines)?lines:[lines],arcArray=getGraphicArcs(this.ctx.kicadPcb),circleArray=getGraphicCircles(this.ctx.kicadPcb),curveArray=getGraphicCurves(this.ctx.kicadPcb),xs3=[],ys3=[];for(let line2 of lineArray){if(!getGraphicLayerNames(line2).join(" ").includes("Edge.Cuts"))continue;let{start,end}=getLineStartEnd(line2);xs3.push(start.x,end.x),ys3.push(start.y,end.y)}for(let arc2 of arcArray){if(!getGraphicLayerNames(arc2).join(" ").includes("Edge.Cuts"))continue;let{start,mid,end}=getArcStartMidEnd(arc2);for(let point7 of approximateArcPoints(start,mid,end,{segmentLength:.25,minSegments:16}))xs3.push(point7.x),ys3.push(point7.y)}for(let circle2 of circleArray){if(!getGraphicLayerNames(circle2).join(" ").includes("Edge.Cuts"))continue;let{center:center2,end}=getCircleCenterEnd(circle2);for(let point7 of approximateCirclePoints(center2,end,{segmentLength:.25,minSegments:16}))xs3.push(point7.x),ys3.push(point7.y)}for(let curve of curveArray){if(!getGraphicLayerNames(curve).join(" ").includes("Edge.Cuts"))continue;let points=getCurvePoints(curve);if(points)for(let point7 of approximateCubicBezierPoints(points.start,points.control1,points.control2,points.end,{segmentLength:.25,minSegments:16}))xs3.push(point7.x),ys3.push(point7.y)}if(xs3.length===0||ys3.length===0)return{x:0,y:0};let minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{x:(minX+maxX)/2,y:(minY+maxY)/2}}};function rotationToDirection(rotation5){let normalized=(rotation5%360+360)%360;return normalized>=315||normalized<45?"up":normalized>=45&&normalized<135?"right":normalized>=135&&normalized<225?"down":"left"}function inferSymbolName({libId,reference,rotation:rotation5}){let lower=libId.toLowerCase(),direction2=rotationToDirection(rotation5);if(lower.includes(":r_")||lower.includes(":r")&&reference.startsWith("R"))return`boxresistor_${direction2}`;if(lower.includes(":c_")||lower.includes(":c")&&reference.startsWith("C"))return lower.includes("polarized")||lower.includes("_pol")?`capacitor_${direction2}`:`capacitor_${direction2}`;if(lower.includes(":l_")||lower.includes(":l")&&reference.startsWith("L"))return`inductor_${direction2}`;if(lower.includes(":d_")||lower.includes("diode")||reference.startsWith("D"))return lower.includes("led")?`led_${direction2}`:lower.includes("schottky")?`schottky_diode_${direction2}`:lower.includes("zener")?`zener_diode_${direction2}`:`diode_${direction2}`;if(lower.includes(":q_")||reference.startsWith("Q"))return lower.includes("npn")?`npn_bipolar_transistor_${direction2}`:lower.includes("pnp")?`pnp_bipolar_transistor_${direction2}`:lower.includes("_n_")||lower.includes("nmos")?`n_channel_mosfet_transistor_${direction2}`:lower.includes("_p_")||lower.includes("pmos")?`p_channel_mosfet_transistor_${direction2}`:`npn_bipolar_transistor_${direction2}`;lower.includes("gnd")||lower.includes("ground")||lower.includes("vcc")||lower.includes("vdd")||lower.includes("power")}var CollectLibrarySymbolsStage=class extends ConverterStage{constructor(){super(...arguments);__publicField(this,"processedSymbols",new Set)}step(){if(!this.ctx.kicadSch||!this.ctx.k2cMatSch)return this.finished=!0,!1;let symbols=this.ctx.kicadSch.symbols||[];for(let symbol of symbols){let uuid=symbol.uuid;!uuid||this.processedSymbols.has(uuid)||(this.processSymbol(symbol),this.processedSymbols.add(uuid))}return this.finished=!0,!1}processSymbol(symbol){if(!this.ctx.k2cMatSch)return;let reference=this.getProperty(symbol,"Reference")||"U?",value=this.getProperty(symbol,"Value")||"",libId=symbol.libraryId||"",at3=symbol.at,kicadPos={x:at3?.x??0,y:at3?.y??0},cjPos=applyToPoint(this.ctx.k2cMatSch,kicadPos),rotation5=at3?.angle??0,ftype=this.inferFtype(libId,reference),sourceComponentId=`${libId}_source`;this.ctx.db.source_component.list().find(sc2=>sc2.source_component_id===sourceComponentId)||this.ctx.db.source_component.insert({name:libId||reference,ftype,manufacturer_part_number:value||void 0});let uuid=symbol.uuid;if(!uuid)return;let symbolName=inferSymbolName({libId,reference,rotation:rotation5}),componentId=this.ctx.db.schematic_component.insert({source_component_id:sourceComponentId,center:{x:cjPos.x,y:cjPos.y},size:this.estimateSize(symbol),...symbolName?{symbol_name:symbolName}:{}}).schematic_component_id;this.ctx.symbolUuidToComponentId?.set(uuid,componentId),this.createPorts(symbol,componentId),this.ctx.stats&&(this.ctx.stats.components=(this.ctx.stats.components||0)+1)}getProperty(symbol,propName){return(symbol.properties||[]).find(p4=>p4.key===propName)?.value}inferFtype(libId,reference){let lower=libId.toLowerCase();return lower.includes(":r_")||reference.startsWith("R")?"simple_resistor":lower.includes(":c_")||reference.startsWith("C")?"simple_capacitor":lower.includes(":l_")||reference.startsWith("L")?"simple_inductor":lower.includes(":d_")||reference.startsWith("D")?"simple_diode":lower.includes(":led")||reference.startsWith("LED")?"simple_led":lower.includes(":q_")||reference.startsWith("Q")?"simple_transistor":"simple_chip"}estimateSize(symbol){return{width:1,height:1}}createPorts(symbol,componentId){let libId=symbol.libraryId,libSymbol=this.ctx.kicadSch?.libSymbols?.symbols?.find(ls3=>ls3.libraryId===libId);if(!libSymbol)return;let allPins=[];if(libSymbol.pins&&Array.isArray(libSymbol.pins)&&libSymbol.pins.length>0?allPins.push(...libSymbol.pins):libSymbol.pins&&!Array.isArray(libSymbol.pins)&&allPins.push(libSymbol.pins),libSymbol.subSymbols&&Array.isArray(libSymbol.subSymbols))for(let subSymbol of libSymbol.subSymbols)subSymbol.pins&&Array.isArray(subSymbol.pins)&&subSymbol.pins.length>0?allPins.push(...subSymbol.pins):subSymbol.pins&&!Array.isArray(subSymbol.pins)&&allPins.push(subSymbol.pins);if(allPins.length===0)return;let componentRotation=symbol.at?.angle??0;for(let pin of allPins){let pinAt=pin._sxAt;if(!pinAt)continue;let rotRad=componentRotation*Math.PI/180,cosR=Math.cos(rotRad),sinR=Math.sin(rotRad),rotatedPinPos={x:pinAt.x*cosR-pinAt.y*sinR,y:pinAt.x*sinR+pinAt.y*cosR},scaleFactor=Math.abs(this.ctx.k2cMatSch?.a||1/15),relativePos={x:rotatedPinPos.x*scaleFactor,y:-rotatedPinPos.y*scaleFactor};this.ctx.db.schematic_port.insert({schematic_component_id:componentId,center:relativePos,facing_direction:this.inferPinDirection(pin,componentRotation),pin_number:pin._sxNumber?.value??pin.pinNumber??void 0})}}inferPinDirection(pin,componentRotation){let totalAngle=(pin.at?.angle??0)+componentRotation;return rotationToDirection(totalAngle)}},CollectSchematicTracesStage=class extends ConverterStage{step(){if(!this.ctx.kicadSch||!this.ctx.k2cMatSch)return this.finished=!0,!1;let wires=this.ctx.kicadSch.wires||[],wireArray=Array.isArray(wires)?wires:[wires];for(let wire of wireArray)this.processWire(wire);let junctions=this.ctx.kicadSch.junctions||[],junctionArray=Array.isArray(junctions)?junctions:[junctions];for(let junction of junctionArray)this.processJunction(junction);return this.finished=!0,!1}processWire(wire){if(!this.ctx.k2cMatSch||!wire.pts)return;let pts=Array.isArray(wire.pts.xy)?wire.pts.xy:[wire.pts.xy];if(pts.length<2)return;let edges=[];for(let i3=0;i3<pts.length-1;i3++){let from=applyToPoint(this.ctx.k2cMatSch,{x:pts[i3].x,y:pts[i3].y}),to3=applyToPoint(this.ctx.k2cMatSch,{x:pts[i3+1].x,y:pts[i3+1].y});edges.push({from,to:to3})}this.ctx.db.schematic_trace.insert({edges}),this.ctx.stats&&(this.ctx.stats.traces=(this.ctx.stats.traces||0)+1)}processJunction(junction){if(!this.ctx.k2cMatSch||!junction.at)return;let pos=applyToPoint(this.ctx.k2cMatSch,{x:junction.at.x,y:junction.at.y});this.ctx.db.schematic_trace.insert({edges:[],junctions:[pos]})}},InitializeSchematicContextStage=class extends ConverterStage{step(){if(!this.ctx.kicadSch)return this.finished=!0,!1;let KICAD_CENTER_X=105,KICAD_CENTER_Y=148.5,kicadCenterX=KICAD_CENTER_X,kicadCenterY=KICAD_CENTER_Y,cjCenterX=0,cjCenterY=0;return this.ctx.k2cMatSch=compose(translate(cjCenterX,cjCenterY),scale(1/15,-1/15),translate(-kicadCenterX,-kicadCenterY)),this.ctx.symbolUuidToComponentId=new Map,this.ctx.warnings=this.ctx.warnings||[],this.ctx.stats=this.ctx.stats||{},this.finished=!0,!1}},KicadToCircuitJsonConverter=class{constructor(){__publicField(this,"fsMap",{});__publicField(this,"ctx");__publicField(this,"currentStageIndex",0);__publicField(this,"pipeline")}get currentStage(){return this.pipeline?.[this.currentStageIndex]}addFile(filePath,content){this.fsMap[filePath]=content}_findFileWithExtension(extension){let filesWithExtension=Object.keys(this.fsMap).filter(key=>key.endsWith(extension));if(filesWithExtension.length>1)throw new Error(`Expected 0 or 1 file with extension ${extension}, got ${filesWithExtension.length}. Files: ${filesWithExtension.join(", ")}`);return filesWithExtension[0]??null}initializePipeline(){let pcbFile=this._findFileWithExtension(".kicad_pcb"),schFile=this._findFileWithExtension(".kicad_sch");this.ctx={db:cju_default([]),kicadPcb:pcbFile?parseKicadPcb(this.fsMap[pcbFile]):void 0,kicadSch:schFile?parseKicadSch(this.fsMap[schFile]):void 0,warnings:[],stats:{}},this.pipeline=[],this.ctx.kicadSch&&this.pipeline.push(new InitializeSchematicContextStage(this.ctx),new CollectLibrarySymbolsStage(this.ctx),new CollectSchematicTracesStage(this.ctx)),this.ctx.kicadPcb&&this.pipeline.push(new InitializePcbContextStage(this.ctx),new CollectNetsStage(this.ctx),new CollectFootprintsStage(this.ctx),new CollectSourceTracesStage(this.ctx),new CollectTracesStage(this.ctx),new CollectViasStage(this.ctx),new CollectZonesStage(this.ctx),new CollectGraphicsStage(this.ctx))}step(){return this.pipeline||this.initializePipeline(),this.currentStage?((!this.currentStage.step()||this.currentStage.finished)&&this.currentStageIndex++,this.currentStageIndex<(this.pipeline?.length||0)):!1}runUntilFinished(){this.pipeline||this.initializePipeline();for(let stage of this.pipeline||[])stage.runUntilFinished()}getOutput(){this.ctx||(this.initializePipeline(),this.runUntilFinished());let elements=[],tableNames=["source_component","source_port","source_net","source_trace","schematic_component","schematic_port","schematic_trace","schematic_net_label","pcb_component","pcb_port","pcb_smtpad","pcb_plated_hole","pcb_hole","pcb_trace","pcb_via","pcb_copper_pour","pcb_board","pcb_copper_text","pcb_silkscreen_text","pcb_silkscreen_path","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_fabrication_note_rect","pcb_courtyard_rect","pcb_courtyard_outline","pcb_courtyard_circle"];for(let tableName of tableNames){let table=this.ctx.db[tableName];if(table&&typeof table.list=="function"){let items=table.list();items&&Array.isArray(items)&&elements.push(...items)}}return elements}getOutputString(){return JSON.stringify(this.getOutput(),null,2)}getWarnings(){return this.ctx?.warnings||[]}getStats(){return this.ctx?.stats||{}}};var React=__toESM(require_react(),1),KICAD_FOOTPRINT_CACHE_URL="https://kicad-mod-cache.tscircuit.com",ngspiceEngineCache=null,loadKicadPcbStaticFile=async fileContent=>{let kicadPcbContent=typeof fileContent=="string"?fileContent:new TextDecoder().decode(fileContent);if(kicadPcbContent==="__STATIC_ASSET__"||kicadPcbContent.startsWith("blob:"))throw new Error(".kicad_pcb imports require local file contents. Static asset URLs are not supported.");let converter=new KicadToCircuitJsonConverter;converter.addFile("imported.kicad_pcb",kicadPcbContent),converter.runUntilFinished();let circuitJson=converter.getOutput(),boardContentCircuitJson=circuitJson.filter(elm=>elm.type!=="pcb_board");return{__esModule:!0,default:circuitJson,Board:props=>React.createElement("board",{...props,circuitJson}),boardContentCircuitJson,circuitJson}},getPlatformConfig=(overrides={},options={})=>{let partsEngine2=overrides.partsEngine??jlcPartsEngine;return!overrides.partsEngine&&options.easyEdaProxyConfig&&(partsEngine2=new JlcPcbPartsEngine({platformFetch:overrides.platformFetch,easyEdaProxyConfig:options.easyEdaProxyConfig})),{localCacheEngine:overrides.localCacheEngine,partsEngine:partsEngine2,autorouterMap:{krt:{createAutorouter:createKiCadRoutingToolsAutorouter({gridStep:.1,clearance:.2,maxIterations:3e5})},...overrides.autorouterMap},spiceEngineMap:{ngspice:{simulate:async spice=>{if(!ngspiceEngineCache){let createNgspiceSpiceEngine=await dynamicallyLoadDependencyWithCdnBackup("@tscircuit/ngspice-spice-engine").catch(error2=>{throw new Error("Could not load ngspice engine from local node_modules or CDN fallback.",{cause:error2})});createNgspiceSpiceEngine&&(ngspiceEngineCache=await createNgspiceSpiceEngine())}if(!ngspiceEngineCache)throw new Error("Could not load ngspice engine from local node_modules or CDN fallback.");return ngspiceEngineCache.simulate(spice)}}},footprintLibraryMap:{kicad:async footprintName=>{let baseUrl=`${KICAD_FOOTPRINT_CACHE_URL}/${footprintName}`,circuitJsonUrl=`${baseUrl}.circuit.json`,res2=await fetch(circuitJsonUrl);if(!res2.ok){let bodyPreview=(await res2.text()).slice(0,200);throw new Error(`Failed to load KiCad footprint "${footprintName}" from ${circuitJsonUrl} (HTTP ${res2.status}). ${bodyPreview}`)}let raw;try{raw=await res2.json()}catch{throw new Error(`Failed to parse KiCad footprint JSON for "${footprintName}" from ${circuitJsonUrl}`)}let filtered=Array.isArray(raw)?raw.filter(el3=>el3?.type==="pcb_silkscreen_text"?el3?.text==="REF**":!0):[raw],wrlUrl=`${baseUrl}.wrl`,stepUrl=`${baseUrl}.step`;return{footprintCircuitJson:filtered,cadModel:{wrlUrl,stepUrl,modelUnitToMmScale:2.54}}}},footprintFileParserMap:{kicad_mod:{loadFromUrl:async url2=>{let kicadContent=await fetch(url2).then(res2=>res2.text()),kicadJson=await parseKicadModToCircuitJson(kicadContent);return{footprintCircuitJson:Array.isArray(kicadJson)?kicadJson:[kicadJson]}}}},staticFileLoaderMap:{kicad_pcb:loadKicadPcbStaticFile,...overrides.staticFileLoaderMap}}};var tslib_es6_exports={};__export(tslib_es6_exports,{__addDisposableResource:()=>__addDisposableResource,__assign:()=>__assign,__asyncDelegator:()=>__asyncDelegator,__asyncGenerator:()=>__asyncGenerator,__asyncValues:()=>__asyncValues,__await:()=>__await,__awaiter:()=>__awaiter,__classPrivateFieldGet:()=>__classPrivateFieldGet,__classPrivateFieldIn:()=>__classPrivateFieldIn,__classPrivateFieldSet:()=>__classPrivateFieldSet,__createBinding:()=>__createBinding,__decorate:()=>__decorate,__disposeResources:()=>__disposeResources,__esDecorate:()=>__esDecorate,__exportStar:()=>__exportStar,__extends:()=>__extends,__generator:()=>__generator,__importDefault:()=>__importDefault,__importStar:()=>__importStar,__makeTemplateObject:()=>__makeTemplateObject,__metadata:()=>__metadata,__param:()=>__param,__propKey:()=>__propKey,__read:()=>__read,__rest:()=>__rest,__rewriteRelativeImportExtension:()=>__rewriteRelativeImportExtension,__runInitializers:()=>__runInitializers,__setFunctionName:()=>__setFunctionName,__spread:()=>__spread,__spreadArray:()=>__spreadArray,__spreadArrays:()=>__spreadArrays,__values:()=>__values,default:()=>tslib_es6_default});var extendStatics=function(d4,b3){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d5,b4){d5.__proto__=b4}||function(d5,b4){for(var p4 in b4)Object.prototype.hasOwnProperty.call(b4,p4)&&(d5[p4]=b4[p4])},extendStatics(d4,b3)};function __extends(d4,b3){if(typeof b3!="function"&&b3!==null)throw new TypeError("Class extends value "+String(b3)+" is not a constructor or null");extendStatics(d4,b3);function __2(){this.constructor=d4}d4.prototype=b3===null?Object.create(b3):(__2.prototype=b3.prototype,new __2)}var __assign=function(){return __assign=Object.assign||function(t52){for(var s3,i3=1,n4=arguments.length;i3<n4;i3++){s3=arguments[i3];for(var p4 in s3)Object.prototype.hasOwnProperty.call(s3,p4)&&(t52[p4]=s3[p4])}return t52},__assign.apply(this,arguments)};function __rest(s3,e5){var t52={};for(var p4 in s3)Object.prototype.hasOwnProperty.call(s3,p4)&&e5.indexOf(p4)<0&&(t52[p4]=s3[p4]);if(s3!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i3=0,p4=Object.getOwnPropertySymbols(s3);i3<p4.length;i3++)e5.indexOf(p4[i3])<0&&Object.prototype.propertyIsEnumerable.call(s3,p4[i3])&&(t52[p4[i3]]=s3[p4[i3]]);return t52}function __decorate(decorators,target,key,desc){var c4=arguments.length,r5=c4<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d4;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r5=Reflect.decorate(decorators,target,key,desc);else for(var i3=decorators.length-1;i3>=0;i3--)(d4=decorators[i3])&&(r5=(c4<3?d4(r5):c4>3?d4(target,key,r5):d4(target,key))||r5);return c4>3&&r5&&Object.defineProperty(target,key,r5),r5}function __param(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}}function __esDecorate(ctor,descriptorIn,decorators,contextIn,initializers,extraInitializers){function accept(f3){if(f3!==void 0&&typeof f3!="function")throw new TypeError("Function expected");return f3}for(var kind=contextIn.kind,key=kind==="getter"?"get":kind==="setter"?"set":"value",target=!descriptorIn&&ctor?contextIn.static?ctor:ctor.prototype:null,descriptor=descriptorIn||(target?Object.getOwnPropertyDescriptor(target,contextIn.name):{}),_4,done=!1,i3=decorators.length-1;i3>=0;i3--){var context={};for(var p4 in contextIn)context[p4]=p4==="access"?{}:contextIn[p4];for(var p4 in contextIn.access)context.access[p4]=contextIn.access[p4];context.addInitializer=function(f3){if(done)throw new TypeError("Cannot add initializers after decoration has completed");extraInitializers.push(accept(f3||null))};var result=(0,decorators[i3])(kind==="accessor"?{get:descriptor.get,set:descriptor.set}:descriptor[key],context);if(kind==="accessor"){if(result===void 0)continue;if(result===null||typeof result!="object")throw new TypeError("Object expected");(_4=accept(result.get))&&(descriptor.get=_4),(_4=accept(result.set))&&(descriptor.set=_4),(_4=accept(result.init))&&initializers.unshift(_4)}else(_4=accept(result))&&(kind==="field"?initializers.unshift(_4):descriptor[key]=_4)}target&&Object.defineProperty(target,contextIn.name,descriptor),done=!0}function __runInitializers(thisArg,initializers,value){for(var useValue=arguments.length>2,i3=0;i3<initializers.length;i3++)value=useValue?initializers[i3].call(thisArg,value):initializers[i3].call(thisArg);return useValue?value:void 0}function __propKey(x4){return typeof x4=="symbol"?x4:"".concat(x4)}function __setFunctionName(f3,name,prefix){return typeof name=="symbol"&&(name=name.description?"[".concat(name.description,"]"):""),Object.defineProperty(f3,"name",{configurable:!0,value:prefix?"".concat(prefix," ",name):name})}function __metadata(metadataKey,metadataValue){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(metadataKey,metadataValue)}function __awaiter(thisArg,_arguments,P4,generator){function adopt(value){return value instanceof P4?value:new P4(function(resolve){resolve(value)})}return new(P4||(P4=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e5){reject(e5)}}function rejected(value){try{step(generator.throw(value))}catch(e5){reject(e5)}}function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}function __generator(thisArg,body){var _4={label:0,sent:function(){if(t52[0]&1)throw t52[1];return t52[1]},trys:[],ops:[]},f3,y4,t52,g6=Object.create((typeof Iterator=="function"?Iterator:Object).prototype);return g6.next=verb(0),g6.throw=verb(1),g6.return=verb(2),typeof Symbol=="function"&&(g6[Symbol.iterator]=function(){return this}),g6;function verb(n4){return function(v4){return step([n4,v4])}}function step(op3){if(f3)throw new TypeError("Generator is already executing.");for(;g6&&(g6=0,op3[0]&&(_4=0)),_4;)try{if(f3=1,y4&&(t52=op3[0]&2?y4.return:op3[0]?y4.throw||((t52=y4.return)&&t52.call(y4),0):y4.next)&&!(t52=t52.call(y4,op3[1])).done)return t52;switch(y4=0,t52&&(op3=[op3[0]&2,t52.value]),op3[0]){case 0:case 1:t52=op3;break;case 4:return _4.label++,{value:op3[1],done:!1};case 5:_4.label++,y4=op3[1],op3=[0];continue;case 7:op3=_4.ops.pop(),_4.trys.pop();continue;default:if(t52=_4.trys,!(t52=t52.length>0&&t52[t52.length-1])&&(op3[0]===6||op3[0]===2)){_4=0;continue}if(op3[0]===3&&(!t52||op3[1]>t52[0]&&op3[1]<t52[3])){_4.label=op3[1];break}if(op3[0]===6&&_4.label<t52[1]){_4.label=t52[1],t52=op3;break}if(t52&&_4.label<t52[2]){_4.label=t52[2],_4.ops.push(op3);break}t52[2]&&_4.ops.pop(),_4.trys.pop();continue}op3=body.call(thisArg,_4)}catch(e5){op3=[6,e5],y4=0}finally{f3=t52=0}if(op3[0]&5)throw op3[1];return{value:op3[0]?op3[1]:void 0,done:!0}}}var __createBinding=Object.create?(function(o4,m4,k4,k22){k22===void 0&&(k22=k4);var desc=Object.getOwnPropertyDescriptor(m4,k4);(!desc||("get"in desc?!m4.__esModule:desc.writable||desc.configurable))&&(desc={enumerable:!0,get:function(){return m4[k4]}}),Object.defineProperty(o4,k22,desc)}):(function(o4,m4,k4,k22){k22===void 0&&(k22=k4),o4[k22]=m4[k4]});function __exportStar(m4,o4){for(var p4 in m4)p4!=="default"&&!Object.prototype.hasOwnProperty.call(o4,p4)&&__createBinding(o4,m4,p4)}function __values(o4){var s3=typeof Symbol=="function"&&Symbol.iterator,m4=s3&&o4[s3],i3=0;if(m4)return m4.call(o4);if(o4&&typeof o4.length=="number")return{next:function(){return o4&&i3>=o4.length&&(o4=void 0),{value:o4&&o4[i3++],done:!o4}}};throw new TypeError(s3?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(o4,n4){var m4=typeof Symbol=="function"&&o4[Symbol.iterator];if(!m4)return o4;var i3=m4.call(o4),r5,ar3=[],e5;try{for(;(n4===void 0||n4-- >0)&&!(r5=i3.next()).done;)ar3.push(r5.value)}catch(error2){e5={error:error2}}finally{try{r5&&!r5.done&&(m4=i3.return)&&m4.call(i3)}finally{if(e5)throw e5.error}}return ar3}function __spread(){for(var ar3=[],i3=0;i3<arguments.length;i3++)ar3=ar3.concat(__read(arguments[i3]));return ar3}function __spreadArrays(){for(var s3=0,i3=0,il3=arguments.length;i3<il3;i3++)s3+=arguments[i3].length;for(var r5=Array(s3),k4=0,i3=0;i3<il3;i3++)for(var a3=arguments[i3],j4=0,jl3=a3.length;j4<jl3;j4++,k4++)r5[k4]=a3[j4];return r5}function __spreadArray(to3,from,pack2){if(pack2||arguments.length===2)for(var i3=0,l4=from.length,ar3;i3<l4;i3++)(ar3||!(i3 in from))&&(ar3||(ar3=Array.prototype.slice.call(from,0,i3)),ar3[i3]=from[i3]);return to3.concat(ar3||Array.prototype.slice.call(from))}function __await(v4){return this instanceof __await?(this.v=v4,this):new __await(v4)}function __asyncGenerator(thisArg,_arguments,generator){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var g6=generator.apply(thisArg,_arguments||[]),i3,q4=[];return i3=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),verb("next"),verb("throw"),verb("return",awaitReturn),i3[Symbol.asyncIterator]=function(){return this},i3;function awaitReturn(f3){return function(v4){return Promise.resolve(v4).then(f3,reject)}}function verb(n4,f3){g6[n4]&&(i3[n4]=function(v4){return new Promise(function(a3,b3){q4.push([n4,v4,a3,b3])>1||resume(n4,v4)})},f3&&(i3[n4]=f3(i3[n4])))}function resume(n4,v4){try{step(g6[n4](v4))}catch(e5){settle(q4[0][3],e5)}}function step(r5){r5.value instanceof __await?Promise.resolve(r5.value.v).then(fulfill,reject):settle(q4[0][2],r5)}function fulfill(value){resume("next",value)}function reject(value){resume("throw",value)}function settle(f3,v4){f3(v4),q4.shift(),q4.length&&resume(q4[0][0],q4[0][1])}}function __asyncDelegator(o4){var i3,p4;return i3={},verb("next"),verb("throw",function(e5){throw e5}),verb("return"),i3[Symbol.iterator]=function(){return this},i3;function verb(n4,f3){i3[n4]=o4[n4]?function(v4){return(p4=!p4)?{value:__await(o4[n4](v4)),done:!1}:f3?f3(v4):v4}:f3}}function __asyncValues(o4){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var m4=o4[Symbol.asyncIterator],i3;return m4?m4.call(o4):(o4=typeof __values=="function"?__values(o4):o4[Symbol.iterator](),i3={},verb("next"),verb("throw"),verb("return"),i3[Symbol.asyncIterator]=function(){return this},i3);function verb(n4){i3[n4]=o4[n4]&&function(v4){return new Promise(function(resolve,reject){v4=o4[n4](v4),settle(resolve,reject,v4.done,v4.value)})}}function settle(resolve,reject,d4,v4){Promise.resolve(v4).then(function(v5){resolve({value:v5,done:d4})},reject)}}function __makeTemplateObject(cooked,raw){return Object.defineProperty?Object.defineProperty(cooked,"raw",{value:raw}):cooked.raw=raw,cooked}var __setModuleDefault=Object.create?(function(o4,v4){Object.defineProperty(o4,"default",{enumerable:!0,value:v4})}):function(o4,v4){o4.default=v4},ownKeys=function(o4){return ownKeys=Object.getOwnPropertyNames||function(o6){var ar3=[];for(var k4 in o6)Object.prototype.hasOwnProperty.call(o6,k4)&&(ar3[ar3.length]=k4);return ar3},ownKeys(o4)};function __importStar(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k4=ownKeys(mod),i3=0;i3<k4.length;i3++)k4[i3]!=="default"&&__createBinding(result,mod,k4[i3]);return __setModuleDefault(result,mod),result}function __importDefault(mod){return mod&&mod.__esModule?mod:{default:mod}}function __classPrivateFieldGet(receiver,state2,kind,f3){if(kind==="a"&&!f3)throw new TypeError("Private accessor was defined without a getter");if(typeof state2=="function"?receiver!==state2||!f3:!state2.has(receiver))throw new TypeError("Cannot read private member from an object whose class did not declare it");return kind==="m"?f3:kind==="a"?f3.call(receiver):f3?f3.value:state2.get(receiver)}function __classPrivateFieldSet(receiver,state2,value,kind,f3){if(kind==="m")throw new TypeError("Private method is not writable");if(kind==="a"&&!f3)throw new TypeError("Private accessor was defined without a setter");if(typeof state2=="function"?receiver!==state2||!f3:!state2.has(receiver))throw new TypeError("Cannot write private member to an object whose class did not declare it");return kind==="a"?f3.call(receiver,value):f3?f3.value=value:state2.set(receiver,value),value}function __classPrivateFieldIn(state2,receiver){if(receiver===null||typeof receiver!="object"&&typeof receiver!="function")throw new TypeError("Cannot use 'in' operator on non-object");return typeof state2=="function"?receiver===state2:state2.has(receiver)}function __addDisposableResource(env,value,async){if(value!=null){if(typeof value!="object"&&typeof value!="function")throw new TypeError("Object expected.");var dispose,inner;if(async){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");dispose=value[Symbol.asyncDispose]}if(dispose===void 0){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");dispose=value[Symbol.dispose],async&&(inner=dispose)}if(typeof dispose!="function")throw new TypeError("Object not disposable.");inner&&(dispose=function(){try{inner.call(this)}catch(e5){return Promise.reject(e5)}}),env.stack.push({value,dispose,async})}else async&&env.stack.push({async:!0});return value}var _SuppressedError=typeof SuppressedError=="function"?SuppressedError:function(error2,suppressed,message){var e5=new Error(message);return e5.name="SuppressedError",e5.error=error2,e5.suppressed=suppressed,e5};function __disposeResources(env){function fail(e5){env.error=env.hasError?new _SuppressedError(e5,env.error,"An error was suppressed during disposal."):e5,env.hasError=!0}var r5,s3=0;function next2(){for(;r5=env.stack.pop();)try{if(!r5.async&&s3===1)return s3=0,env.stack.push(r5),Promise.resolve().then(next2);if(r5.dispose){var result=r5.dispose.call(r5.value);if(r5.async)return s3|=2,Promise.resolve(result).then(next2,function(e5){return fail(e5),next2()})}else s3|=1}catch(e5){fail(e5)}if(s3===1)return env.hasError?Promise.reject(env.error):Promise.resolve();if(env.hasError)throw env.error}return next2()}function __rewriteRelativeImportExtension(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m4,tsx,d4,ext,cm3){return tsx?preserveJsx?".jsx":".js":d4&&(!ext||!cm3)?m4:d4+ext+"."+cm3.toLowerCase()+"js"}):path}var tslib_es6_default={__extends,__assign,__rest,__decorate,__param,__esDecorate,__runInitializers,__propKey,__setFunctionName,__metadata,__awaiter,__generator,__createBinding,__exportStar,__values,__read,__spread,__spreadArrays,__spreadArray,__await,__asyncGenerator,__asyncDelegator,__asyncValues,__makeTemplateObject,__importStar,__importDefault,__classPrivateFieldGet,__classPrivateFieldSet,__classPrivateFieldIn,__addDisposableResource,__disposeResources,__rewriteRelativeImportExtension};var import_debug22=__toESM(require_browser(),1),debug12=(0,import_debug22.default)("tsci:eval:execution-context");function createExecutionContext(webWorkerConfiguration,opts={}){globalThis.React=React3;let basePlatform=opts.platform||getPlatformConfig({},{easyEdaProxyConfig:webWorkerConfiguration.easyEdaProxyConfig}),platform=opts.projectConfig?{...basePlatform,...opts.projectConfig}:basePlatform;platform.partsEngineDisabled&&(platform.partsEngine=void 0);let circuit=new RootCircuit({platform});opts.name&&(circuit.name=opts.name),opts.debugNamespace&&circuit.enableDebug(opts.debugNamespace);let logs=[];return{fsMap:{},entrypoint:"",logger:{info:message=>{logs.push({msg:message})},getLogs:()=>logs,stringifyLogs:()=>logs.map(log=>log.msg).join(`
|
|
772
|
+
`)}},__publicField(_a413,"token","via"),_a413);SxClass.register(Via2);var _a414,KicadPcb=(_a414=class extends SxClass{constructor(params={}){super();__publicField(this,"token","kicad_pcb");__publicField(this,"_sxVersion");__publicField(this,"_sxGenerator");__publicField(this,"_sxGeneratorVersion");__publicField(this,"_sxGeneral");__publicField(this,"_sxPaper");__publicField(this,"_sxTitleBlock");__publicField(this,"_sxLayers");__publicField(this,"_sxSetup");__publicField(this,"_properties",[]);__publicField(this,"_nets",[]);__publicField(this,"_footprints",[]);__publicField(this,"_images",[]);__publicField(this,"_segments",[]);__publicField(this,"_arcs",[]);__publicField(this,"_grArcs",[]);__publicField(this,"_grCircles",[]);__publicField(this,"_grCurves",[]);__publicField(this,"_grLines",[]);__publicField(this,"_grTexts",[]);__publicField(this,"_grPolys",[]);__publicField(this,"_grRects",[]);__publicField(this,"_vias",[]);__publicField(this,"_zones",[]);__publicField(this,"_sxEmbeddedFonts");__publicField(this,"_sxEmbeddedFiles");__publicField(this,"_otherChildren",[]);params.version!==void 0&&(this.version=params.version),params.generator!==void 0&&(this.generator=params.generator),params.generatorVersion!==void 0&&(this.generatorVersion=params.generatorVersion),params.general!==void 0&&(this.general=params.general),params.paper!==void 0&&(this.paper=params.paper),params.titleBlock!==void 0&&(this.titleBlock=params.titleBlock),params.layers!==void 0&&(this.layers=params.layers),params.setup!==void 0&&(this.setup=params.setup),params.properties!==void 0&&(this.properties=params.properties),params.nets!==void 0&&(this.nets=params.nets),params.footprints!==void 0&&(this.footprints=params.footprints),params.images!==void 0&&(this.images=params.images),params.segments!==void 0&&(this.segments=params.segments),params.arcs!==void 0&&(this.arcs=params.arcs),params.graphicArcs!==void 0&&(this.graphicArcs=params.graphicArcs),params.graphicCircles!==void 0&&(this.graphicCircles=params.graphicCircles),params.graphicCurves!==void 0&&(this.graphicCurves=params.graphicCurves),params.graphicLines!==void 0&&(this.graphicLines=params.graphicLines),params.graphicTexts!==void 0&&(this.graphicTexts=params.graphicTexts),params.graphicPolys!==void 0&&(this.graphicPolys=params.graphicPolys),params.graphicRects!==void 0&&(this.graphicRects=params.graphicRects),params.vias!==void 0&&(this.vias=params.vias),params.zones!==void 0&&(this.zones=params.zones),params.embeddedFonts!==void 0&&(this.embeddedFonts=params.embeddedFonts),params.embeddedFiles!==void 0&&(this.embeddedFiles=params.embeddedFiles),params.otherChildren!==void 0&&(this.otherChildren=params.otherChildren)}static fromSexprPrimitives(primitiveSexprs){let pcb=new _a414;for(let primitive of primitiveSexprs){if(!Array.isArray(primitive)||primitive.length===0)throw new Error(`kicad_pcb encountered unsupported primitive child: ${JSON.stringify(primitive)}`);let parsed=SxClass.parsePrimitiveSexpr(primitive,{parentToken:_a414.token});if(!(parsed instanceof SxClass))throw new Error(`kicad_pcb expected SxClass child, received ${JSON.stringify(primitive)}`);pcb.consumeChild(parsed)}return pcb}consumeChild(child){if(child instanceof PcbVersion){this._sxVersion=child;return}if(child instanceof PcbGenerator){this._sxGenerator=child;return}if(child instanceof PcbGeneratorVersion){this._sxGeneratorVersion=child;return}if(child instanceof PcbGeneral){this._sxGeneral=child;return}if(child instanceof Paper){this._sxPaper=child;return}if(child instanceof TitleBlock){this._sxTitleBlock=child;return}if(child instanceof PcbLayers){this._sxLayers=child;return}if(child instanceof Setup){this._sxSetup=child;return}if(child instanceof Property){this._properties.push(child);return}if(child instanceof PcbNet){this._nets.push(child);return}if(child instanceof Footprint2){this._footprints.push(child);return}if(child instanceof Image){this._images.push(child);return}if(child instanceof Segment3){this._segments.push(child);return}if(child instanceof PcbArc){this._arcs.push(child);return}if(child instanceof GrArc){this._grArcs.push(child);return}if(child instanceof GrCircle){this._grCircles.push(child);return}if(child instanceof GrCurve){this._grCurves.push(child);return}if(child instanceof GrLine){this._grLines.push(child);return}if(child instanceof GrText){this._grTexts.push(child);return}if(child instanceof GrPoly){this._grPolys.push(child);return}if(child instanceof GrRect){this._grRects.push(child);return}if(child instanceof Via2){this._vias.push(child);return}if(child instanceof Zone){this._zones.push(child);return}if(child instanceof EmbeddedFonts){this._sxEmbeddedFonts=child;return}if(child instanceof EmbeddedFiles){this._sxEmbeddedFiles=child;return}this._otherChildren.push(child)}get version(){return this._sxVersion?.value}set version(value){this._sxVersion=value===void 0?void 0:new PcbVersion(value)}get generator(){return this._sxGenerator?.value}set generator(value){this._sxGenerator=value===void 0?void 0:new PcbGenerator(value)}get generatorVersion(){return this._sxGeneratorVersion?.value}set generatorVersion(value){this._sxGeneratorVersion=value===void 0?void 0:new PcbGeneratorVersion(value)}get general(){return this._sxGeneral}set general(value){this._sxGeneral=value}get paper(){return this._sxPaper}set paper(value){this._sxPaper=value}get titleBlock(){return this._sxTitleBlock}set titleBlock(value){this._sxTitleBlock=value}get layers(){return this._sxLayers}set layers(value){this._sxLayers=value}get setup(){return this._sxSetup}set setup(value){this._sxSetup=value}get properties(){return[...this._properties]}set properties(value){this._properties=[...value]}get nets(){return[...this._nets]}set nets(value){this._nets=[...value]}get footprints(){return[...this._footprints]}set footprints(value){this._footprints=[...value]}get images(){return[...this._images]}set images(value){this._images=[...value]}get segments(){return[...this._segments]}set segments(value){this._segments=[...value]}get arcs(){return[...this._arcs]}set arcs(value){this._arcs=[...value]}get graphicArcs(){return[...this._grArcs]}set graphicArcs(value){this._grArcs=[...value]}get graphicCircles(){return[...this._grCircles]}set graphicCircles(value){this._grCircles=[...value]}get graphicCurves(){return[...this._grCurves]}set graphicCurves(value){this._grCurves=[...value]}get graphicLines(){return[...this._grLines]}set graphicLines(value){this._grLines=[...value]}get graphicTexts(){return[...this._grTexts]}set graphicTexts(value){this._grTexts=[...value]}get graphicPolys(){return[...this._grPolys]}set graphicPolys(value){this._grPolys=[...value]}get graphicRects(){return[...this._grRects]}set graphicRects(value){this._grRects=[...value]}get vias(){return[...this._vias]}set vias(value){this._vias=[...value]}get zones(){return[...this._zones]}set zones(value){this._zones=[...value]}get embeddedFonts(){return this._sxEmbeddedFonts}set embeddedFonts(value){this._sxEmbeddedFonts=value}get embeddedFiles(){return this._sxEmbeddedFiles}set embeddedFiles(value){this._sxEmbeddedFiles=value}get otherChildren(){return[...this._otherChildren]}set otherChildren(value){this._otherChildren=[...value]}getChildren(){let children=[];return this._sxVersion&&children.push(this._sxVersion),this._sxGenerator&&children.push(this._sxGenerator),this._sxGeneratorVersion&&children.push(this._sxGeneratorVersion),this._sxGeneral&&children.push(this._sxGeneral),this._sxPaper&&children.push(this._sxPaper),this._sxTitleBlock&&children.push(this._sxTitleBlock),this._sxLayers&&children.push(this._sxLayers),this._sxSetup&&children.push(this._sxSetup),children.push(...this._properties),children.push(...this._nets),children.push(...this._footprints),children.push(...this._images),children.push(...this._segments),children.push(...this._arcs),children.push(...this._grArcs),children.push(...this._grCircles),children.push(...this._grCurves),children.push(...this._grLines),children.push(...this._grTexts),children.push(...this._grPolys),children.push(...this._grRects),children.push(...this._vias),children.push(...this._zones),this._sxEmbeddedFonts&&children.push(this._sxEmbeddedFonts),this._sxEmbeddedFiles&&children.push(this._sxEmbeddedFiles),children.push(...this._otherChildren),children}},__publicField(_a414,"token","kicad_pcb"),_a414);SxClass.register(KicadPcb);var parseKicadSexpr=sexpr=>SxClass.parse(sexpr),parseKicadSch=sexpr=>{let[root]=parseKicadSexpr(sexpr);if(!(root instanceof KicadSch))throw new Error(`Expected KicadSch root, got ${root?.constructor.name??"undefined"}`);return root},parseKicadPcb=sexpr=>{let[root]=parseKicadSexpr(sexpr);if(!(root instanceof KicadPcb))throw new Error(`Expected KicadPcb root, got ${root?.constructor.name??"undefined"}`);return root};init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();var ConverterStage=class{constructor(ctx){__publicField(this,"ctx");__publicField(this,"MAX_ITERATIONS",100);__publicField(this,"iterationCount",0);__publicField(this,"finished",!1);this.ctx=ctx}runUntilFinished(){for(this.iterationCount=0;!this.finished&&this.iterationCount<this.MAX_ITERATIONS;)this.step()||(this.finished=!0),this.iterationCount++;this.iterationCount>=this.MAX_ITERATIONS&&(this.ctx.warnings=this.ctx.warnings||[],this.ctx.warnings.push(`Stage ${this.constructor.name} exceeded maximum iterations (${this.MAX_ITERATIONS})`),this.finished=!0)}},INNER_COPPER_LAYER_REGEX=/^In([1-6])\.Cu$/;function dedupeLayerRefs(layers){return[...new Set(layers)]}function extractKicadLayerNames(layer){return layer?typeof layer=="string"?[layer]:Array.isArray(layer)?layer.filter(name=>typeof name=="string"):[...layer.names||[],...layer._names||[],...layer._layers||[],...layer.name?[layer.name]:[],...layer._name?[layer._name]:[]].filter(name=>typeof name=="string"):[]}function mapKicadLayerToPcbRenderLayer(layer){let layerNames=extractKicadLayerNames(layer);for(let layerName of layerNames){let copperLayer=mapKicadLayerNameToLayerRef(layerName);if(copperLayer)return`${copperLayer}_copper`;if(layerName.includes("Edge.Cuts"))return"edge_cuts";let side=mapKicadLayerToVisibleLayer(layerName);if(layerName.includes("CrtYd"))return`${side}_courtyard`;if(layerName.includes("Fab"))return`${side}_fabrication_note`;if(layerName.includes("SilkS"))return`${side}_silkscreen`}}function isPcbAnnotationRenderLayer(renderLayer){return renderLayer?.endsWith("_silkscreen")||renderLayer?.endsWith("_fabrication_note")||renderLayer?.endsWith("_courtyard")||!1}function isPcbTextRenderLayer(renderLayer){return renderLayer?.endsWith("_silkscreen")||renderLayer?.endsWith("_fabrication_note")||renderLayer?.endsWith("_copper")||!1}function mapKicadLayerNameToLayerRef(layerName){if(layerName==="F.Cu")return"top";if(layerName==="B.Cu")return"bottom";let innerLayerMatch=layerName.match(INNER_COPPER_LAYER_REGEX);if(innerLayerMatch)return`inner${innerLayerMatch[1]}`}function mapKicadLayerToLayerRef(layer){let layerNames=extractKicadLayerNames(layer);for(let layerName of layerNames){let mappedLayer=mapKicadLayerNameToLayerRef(layerName);if(mappedLayer)return mappedLayer}let layerLabel=layerNames.join(" ");return layerLabel.includes("B.")||layerLabel.includes("Back")||layerLabel.includes("Bottom")?"bottom":"top"}function mapKicadLayerToVisibleLayer(layer){return mapKicadLayerToLayerRef(layer)==="bottom"?"bottom":"top"}function getPcbCopperLayerRefs(kicadPcb){let copperLayers=(Array.isArray(kicadPcb?.layers?._definitions)?(kicadPcb?.layers)._definitions:[]).map(definition=>mapKicadLayerNameToLayerRef(definition?._name)).filter(layer=>!!layer);return copperLayers.length>0?dedupeLayerRefs(copperLayers):["top","bottom"]}function getLayerRefsFromLayers(layers,kicadPcb){let layerNames=extractKicadLayerNames(layers),mappedLayers=[];for(let layerName of layerNames){if(layerName==="*.Cu"){mappedLayers.push(...getPcbCopperLayerRefs(kicadPcb));continue}let mappedLayer=mapKicadLayerNameToLayerRef(layerName);mappedLayer&&mappedLayers.push(mappedLayer)}return dedupeLayerRefs(mappedLayers)}function expandCopperLayerSpan(layers,kicadPcb){if(layers.length<=1)return layers;let copperStack=getPcbCopperLayerRefs(kicadPcb),startIndex=copperStack.indexOf(layers[0]),endIndex=copperStack.indexOf(layers[layers.length-1]);if(startIndex===-1||endIndex===-1)return dedupeLayerRefs(layers);let[fromIndex,toIndex]=startIndex<=endIndex?[startIndex,endIndex]:[endIndex,startIndex];return copperStack.slice(fromIndex,toIndex+1)}function getCopperSpanLayerRefsFromLayers(layers,kicadPcb){return expandCopperLayerSpan(getLayerRefsFromLayers(layers,kicadPcb),kicadPcb)}function getComponentLayer(footprint){return mapKicadLayerToVisibleLayer(footprint.layer)}function determineLayerFromLayers(layers){return mapKicadLayerToLayerRef(extractKicadLayerNames(layers))}function mapTextLayer(kicadLayer){return mapKicadLayerToVisibleLayer(kicadLayer)}function insertFootprintRoute(options){let{ctx,componentId,layer,renderLayer,route,strokeWidth}=options;if(renderLayer.endsWith("_silkscreen")){ctx.db.pcb_silkscreen_path.insert({pcb_component_id:componentId,layer,route,stroke_width:strokeWidth});return}if(renderLayer.endsWith("_fabrication_note")){ctx.db.pcb_fabrication_note_path.insert({pcb_component_id:componentId,layer,route,stroke_width:strokeWidth});return}ctx.db.pcb_courtyard_outline.insert({pcb_component_id:componentId,layer,outline:route})}function rotatePoint5(x4,y4,rotationDeg){let rotationRad=rotationDeg*Math.PI/180;return{x:x4*Math.cos(rotationRad)-y4*Math.sin(rotationRad),y:x4*Math.sin(rotationRad)+y4*Math.cos(rotationRad)}}function processFootprintGraphics(ctx,footprint,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let lines=footprint.fpLines||[],lineArray=Array.isArray(lines)?lines:lines?[lines]:[];for(let line2 of lineArray)createFootprintLine(ctx,line2,componentId,kicadComponentPos,componentRotation);let rects=footprint.fpRects||[],rectArray=Array.isArray(rects)?rects:rects?[rects]:[];for(let rect of rectArray)createFootprintRect(ctx,rect,componentId,kicadComponentPos,componentRotation);let circles=footprint.fpCircles||[],circleArray=Array.isArray(circles)?circles:circles?[circles]:[];for(let circle2 of circleArray)createFootprintCircle(ctx,circle2,componentId,kicadComponentPos,componentRotation);let arcs=footprint.fpArcs||[],arcArray=Array.isArray(arcs)?arcs:arcs?[arcs]:[];for(let arc2 of arcArray)createFootprintArc(ctx,arc2,componentId,kicadComponentPos,componentRotation);let polys=footprint.fpPolys||[],polyArray=Array.isArray(polys)?polys:polys?[polys]:[];for(let poly of polyArray)createFootprintPoly(ctx,poly,componentId,kicadComponentPos,componentRotation)}function createFootprintLine(ctx,line2,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let renderLayer=mapKicadLayerToPcbRenderLayer(line2.layer);if(!isPcbAnnotationRenderLayer(renderLayer))return;let start=line2.start||{x:0,y:0},end=line2.end||{x:0,y:0},rotatedStart=rotatePoint5(start.x,start.y,-componentRotation),rotatedEnd=rotatePoint5(end.x,end.y,-componentRotation),startKicadPos={x:kicadComponentPos.x+rotatedStart.x,y:kicadComponentPos.y+rotatedStart.y},endKicadPos={x:kicadComponentPos.x+rotatedEnd.x,y:kicadComponentPos.y+rotatedEnd.y},startPos=applyToPoint(ctx.k2cMatPcb,startKicadPos),endPos=applyToPoint(ctx.k2cMatPcb,endKicadPos),layer=mapTextLayer(line2.layer),strokeWidth=line2.stroke?.width||line2.width||.12;insertFootprintRoute({ctx,componentId,layer,renderLayer,route:[startPos,endPos],strokeWidth})}function createFootprintRect(ctx,rect,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let renderLayer=mapKicadLayerToPcbRenderLayer(rect.layer);if(!isPcbAnnotationRenderLayer(renderLayer))return;let start=rect.start||{x:0,y:0},end=rect.end||{x:0,y:0},center2={x:(start.x+end.x)/2,y:(start.y+end.y)/2},rotatedCenter=rotatePoint5(center2.x,center2.y,-componentRotation),centerKicadPos={x:kicadComponentPos.x+rotatedCenter.x,y:kicadComponentPos.y+rotatedCenter.y},centerPos=applyToPoint(ctx.k2cMatPcb,centerKicadPos),layer=mapTextLayer(rect.layer),width=Math.abs(end.x-start.x),height=Math.abs(end.y-start.y),strokeWidth=rect.stroke?.width||rect.width||.12;if(renderLayer.endsWith("_courtyard")){ctx.db.pcb_courtyard_rect.insert({pcb_component_id:componentId,center:centerPos,width,height,layer,ccw_rotation:-componentRotation});return}if(renderLayer.endsWith("_fabrication_note")){ctx.db.pcb_fabrication_note_rect.insert({pcb_component_id:componentId,center:centerPos,width,height,layer,stroke_width:strokeWidth,is_filled:rect.fill?.filled===!0,has_stroke:!0});return}let route=[{x:start.x,y:start.y},{x:end.x,y:start.y},{x:end.x,y:end.y},{x:start.x,y:end.y},{x:start.x,y:start.y}].map(point7=>{let rotated=rotatePoint5(point7.x,point7.y,-componentRotation),kicadPos={x:kicadComponentPos.x+rotated.x,y:kicadComponentPos.y+rotated.y};return applyToPoint(ctx.k2cMatPcb,kicadPos)});insertFootprintRoute({ctx,componentId,layer,renderLayer,route,strokeWidth})}function createFootprintCircle(ctx,circle2,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let renderLayer=mapKicadLayerToPcbRenderLayer(circle2.layer);if(!isPcbAnnotationRenderLayer(renderLayer))return;let center2=circle2.center||{x:0,y:0},end=circle2.end||{x:0,y:0},radius=Math.sqrt((end.x-center2.x)**2+(end.y-center2.y)**2),rotatedCenter=rotatePoint5(center2.x,center2.y,-componentRotation),centerKicadPos={x:kicadComponentPos.x+rotatedCenter.x,y:kicadComponentPos.y+rotatedCenter.y},centerPos=applyToPoint(ctx.k2cMatPcb,centerKicadPos),layer=mapTextLayer(circle2.layer),strokeWidth=circle2.stroke?.width||circle2.width||.12;if(renderLayer.endsWith("_courtyard")){ctx.db.pcb_courtyard_circle.insert({pcb_component_id:componentId,center:centerPos,radius,layer});return}let numPoints=16,circleRoute=[];for(let i3=0;i3<=numPoints;i3++){let angle=i3/numPoints*2*Math.PI,x4=centerPos.x+radius*Math.cos(angle),y4=centerPos.y+radius*Math.sin(angle);circleRoute.push({x:x4,y:y4})}insertFootprintRoute({ctx,componentId,layer,renderLayer,route:circleRoute,strokeWidth})}function calculateArcCenter(p12,p22,p32){let ax3=p12.x-p22.x,ay3=p12.y-p22.y,bx3=p22.x-p32.x,by3=p22.y-p32.y,denom=2*(ax3*by3-ay3*bx3);if(Math.abs(denom)<1e-10)return null;let d12=p12.x*p12.x+p12.y*p12.y-p22.x*p22.x-p22.y*p22.y,d22=p22.x*p22.x+p22.y*p22.y-p32.x*p32.x-p32.y*p32.y,cx3=(d12*by3-d22*ay3)/denom,cy3=(ax3*d22-bx3*d12)/denom,radius=Math.sqrt((p12.x-cx3)**2+(p12.y-cy3)**2);return{center:{x:cx3,y:cy3},radius}}function createFootprintArc(ctx,arc2,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let renderLayer=mapKicadLayerToPcbRenderLayer(arc2.layer);if(!isPcbAnnotationRenderLayer(renderLayer))return;let start=arc2.start||{x:0,y:0},mid=arc2.mid||{x:0,y:0},end=arc2.end||{x:0,y:0},rotatedStart=rotatePoint5(start.x,start.y,-componentRotation),rotatedMid=rotatePoint5(mid.x,mid.y,-componentRotation),rotatedEnd=rotatePoint5(end.x,end.y,-componentRotation),startKicadPos={x:kicadComponentPos.x+rotatedStart.x,y:kicadComponentPos.y+rotatedStart.y},midKicadPos={x:kicadComponentPos.x+rotatedMid.x,y:kicadComponentPos.y+rotatedMid.y},endKicadPos={x:kicadComponentPos.x+rotatedEnd.x,y:kicadComponentPos.y+rotatedEnd.y},layer=mapTextLayer(arc2.layer),strokeWidth=arc2.stroke?.width||arc2.width||.12,arcInfo=calculateArcCenter(startKicadPos,midKicadPos,endKicadPos);if(!arcInfo){let startPos=applyToPoint(ctx.k2cMatPcb,startKicadPos),endPos=applyToPoint(ctx.k2cMatPcb,endKicadPos);insertFootprintRoute({ctx,componentId,layer,renderLayer,route:[startPos,endPos],strokeWidth});return}let{center:center2,radius}=arcInfo,startAngle=Math.atan2(startKicadPos.y-center2.y,startKicadPos.x-center2.x),midAngle=Math.atan2(midKicadPos.y-center2.y,midKicadPos.x-center2.x),sweepAngle=Math.atan2(endKicadPos.y-center2.y,endKicadPos.x-center2.x)-startAngle,midSweep=midAngle-startAngle;for(;sweepAngle>Math.PI;)sweepAngle-=2*Math.PI;for(;sweepAngle<-Math.PI;)sweepAngle+=2*Math.PI;for(;midSweep>Math.PI;)midSweep-=2*Math.PI;for(;midSweep<-Math.PI;)midSweep+=2*Math.PI;let isCCW=sweepAngle>0;isCCW&&midSweep>0&&midSweep<sweepAngle||!isCCW&&midSweep<0&&midSweep>sweepAngle||(sweepAngle=sweepAngle>0?sweepAngle-2*Math.PI:sweepAngle+2*Math.PI);let arcLength2=Math.abs(radius*sweepAngle),numSegments=Math.max(2,Math.ceil(arcLength2/.1)),arcRoute=[];for(let i3=0;i3<=numSegments;i3++){let t52=i3/numSegments,angle=startAngle+sweepAngle*t52,kicadPoint={x:center2.x+radius*Math.cos(angle),y:center2.y+radius*Math.sin(angle)},cjPoint=applyToPoint(ctx.k2cMatPcb,kicadPoint);arcRoute.push(cjPoint)}insertFootprintRoute({ctx,componentId,layer,renderLayer,route:arcRoute,strokeWidth})}function createFootprintPoly(ctx,poly,componentId,kicadComponentPos,componentCcwRotationDegrees){if(!ctx.k2cMatPcb)return;let renderLayer=mapKicadLayerToPcbRenderLayer(poly.layer);if(!isPcbAnnotationRenderLayer(renderLayer))return;let ptArray=poly.points?.points||[];if(ptArray.length===0)return;let layer=mapTextLayer(poly.layer),strokeWidth=poly.stroke?.width||poly.width||.12,transformedPts=ptArray.map(p4=>{let x4=p4.x??p4.xy?.x??0,y4=p4.y??p4.xy?.y??0,rotated=rotatePoint5(x4,y4,-componentCcwRotationDegrees),kicadPos={x:kicadComponentPos.x+rotated.x,y:kicadComponentPos.y+rotated.y};return applyToPoint(ctx.k2cMatPcb,kicadPos)});if(renderLayer.endsWith("_courtyard")){ctx.db.pcb_courtyard_outline.insert({pcb_component_id:componentId,layer,outline:transformedPts});return}insertFootprintRoute({ctx,componentId,layer,renderLayer,route:transformedPts,strokeWidth})}function createPcbPort({ctx,componentId,padInfo}){if(!padInfo.layers||padInfo.layers.length===0)return;let sourcePortId=`${componentId}_port_${padInfo.padNumber}`;return ctx.db.pcb_port.insert({pcb_component_id:componentId,source_port_id:sourcePortId,x:padInfo.position.x,y:padInfo.position.y,layers:padInfo.layers}).pcb_port_id}function processPads(ctx,footprint,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let pads=footprint.fpPads||[],padArray=Array.isArray(pads)?pads:[pads];for(let pad2 of padArray)processPad({ctx,pad:pad2,componentId,kicadComponentPos,componentRotation})}function processPad({ctx,pad:pad2,componentId,kicadComponentPos,componentRotation}){if(!ctx.k2cMatPcb)return;let padAt=pad2.at||{x:0,y:0,angle:0},padType=pad2.padType||pad2.type||"thru_hole",padShape=pad2.shape||"circle",rotationRad=-componentRotation*Math.PI/180,rotatedPadX=padAt.x*Math.cos(rotationRad)-padAt.y*Math.sin(rotationRad),rotatedPadY=padAt.x*Math.sin(rotationRad)+padAt.y*Math.cos(rotationRad),padKicadPos={x:kicadComponentPos.x+rotatedPadX,y:kicadComponentPos.y+rotatedPadY},globalPos=applyToPoint(ctx.k2cMatPcb,padKicadPos),sizeX=1,sizeY=1;pad2.size&&(Array.isArray(pad2.size)?(sizeX=pad2.size[0]||1,sizeY=pad2.size[1]||1):typeof pad2.size=="object"&&(sizeX=pad2.size._width||pad2.size.x||1,sizeY=pad2.size._height||pad2.size.y||1));let size3={x:sizeX,y:sizeY},drill=pad2.drill,mappedCopperLayers=padType==="thru_hole"?getCopperSpanLayerRefsFromLayers(pad2.layers||[],ctx.kicadPcb):getLayerRefsFromLayers(pad2.layers||[],ctx.kicadPcb),copperLayers=mappedCopperLayers.length>0?mappedCopperLayers:padType==="thru_hole"?getPcbCopperLayerRefs(ctx.kicadPcb):[],totalCcwRotationDegrees=padAt.angle||0,padNumber=pad2.number?.toString(),pcbPortId,sourcePortId;if(padNumber){let padLayers=padType==="smd"?copperLayers.slice(0,1):padType==="thru_hole"?copperLayers:[];pcbPortId=createPcbPort({ctx,componentId,padInfo:{padNumber,padType,layers:padLayers,position:globalPos}}),pcbPortId&&(sourcePortId=`${componentId}_port_${padNumber}`)}if(padType==="smd"){if(copperLayers.length===0)return;createSmdPad({ctx,pad:pad2,componentId,pos:globalPos,size:size3,shape:padShape,pcbPortId,sourcePortId,padKicadPos,totalCcwRotationDegrees})}else padType==="np_thru_hole"?createNpthHole(ctx,pad2,componentId,globalPos,drill):createPlatedHole(ctx,pad2,componentId,globalPos,size3,drill,padShape,copperLayers,totalCcwRotationDegrees,pcbPortId,sourcePortId)}function createSmdPad({ctx,pad:pad2,componentId,pos,size:size3,shape,pcbPortId,sourcePortId:_sourcePortId,padKicadPos,totalCcwRotationDegrees=0}){let layers=pad2.layers||[],layer=determineLayerFromLayers(layers);if(shape==="custom"){let primitives=pad2._sxPrimitives?._graphics||pad2.primitives||[],primitivesArray=Array.isArray(primitives)?primitives:[primitives],primitivesProcessed=0;for(let primitive of primitivesArray){if(primitive.token==="gr_poly"){let grPoly=primitive.gr_poly||primitive,rawPts=[],ptsContainer=grPoly._sxPts||grPoly.points||grPoly.pts,contours=grPoly._contours||grPoly.contours;if(ptsContainer)Array.isArray(ptsContainer)?rawPts=ptsContainer:Array.isArray(ptsContainer.points)?rawPts=ptsContainer.points:Array.isArray(ptsContainer.pts)&&(rawPts=ptsContainer.pts);else if(Array.isArray(contours))for(let contour of contours){let contourPts=contour.points||contour.pts||[];rawPts.push(...Array.isArray(contourPts)?contourPts:[contourPts])}let points=[];for(let pt3 of rawPts){let x4=pt3.x??pt3.xy?.x,y4=pt3.y??pt3.xy?.y;if(x4!==void 0&&y4!==void 0){let rotated=rotatePoint5(x4,y4,totalCcwRotationDegrees),kicadPos={x:padKicadPos.x+rotated.x,y:padKicadPos.y+rotated.y};points.push(applyToPoint(ctx.k2cMatPcb,kicadPos))}}if(points.length>0){let smtpad2={type:"pcb_smtpad",shape:"polygon",pcb_component_id:componentId,pcb_port_id:pcbPortId,pcb_smtpad_id:"pcb_smtpad_id",layer,port_hints:[pad2.number.toString()],points};ctx.db.pcb_smtpad.insert(smtpad2),primitivesProcessed++}}if(primitive.token==="gr_circle"){let grCircle=primitive.gr_circle||primitive,center2=grCircle.center||grCircle._sxCenter||{x:0,y:0},end=grCircle.end||grCircle._sxEnd||{x:0,y:0},centerlineRadius=Math.sqrt((end.x-center2.x)**2+(end.y-center2.y)**2),strokeWidth=grCircle.stroke?.width||grCircle.width||grCircle._sxWidth?.value||0,radius=(grCircle.fill?.value||grCircle.fill||grCircle._sxFill?.value)==="no"&&strokeWidth>0?centerlineRadius+strokeWidth/2:centerlineRadius,rotatedCenter=rotatePoint5(center2.x,center2.y,totalCcwRotationDegrees),kicadCenterPos={x:padKicadPos.x+rotatedCenter.x,y:padKicadPos.y+rotatedCenter.y},globalCenter=applyToPoint(ctx.k2cMatPcb,kicadCenterPos),smtpad2={type:"pcb_smtpad",shape:"circle",pcb_component_id:componentId,pcb_port_id:pcbPortId,pcb_smtpad_id:"pcb_smtpad_id",layer,port_hints:[pad2.number.toString()],x:globalCenter.x,y:globalCenter.y,width:radius*2,height:radius*2,radius};ctx.db.pcb_smtpad.insert(smtpad2),primitivesProcessed++}}if(primitivesProcessed>0){ctx.stats&&(ctx.stats.pads=(ctx.stats.pads||0)+primitivesProcessed);return}}let ccwRotationDegrees=pad2.at?.angle;if(shape==="circle"){let smtpad2={type:"pcb_smtpad",pcb_component_id:componentId,pcb_smtpad_id:"pcb_smtpad_id",x:pos.x,y:pos.y,width:size3.x,height:size3.y,layer,pcb_port_id:pcbPortId,port_hints:[pad2.number?.toString()],shape:"circle",radius:Math.max(size3.x,size3.y)/2};ctx.db.pcb_smtpad.insert(smtpad2)}else if(shape==="rect"||shape==="roundrect"){let roundrectRatio=pad2._sxRoundrectRatio?.value??pad2.roundrect_rratio,cornerRadius;shape==="roundrect"&&roundrectRatio!==void 0&&(cornerRadius=Math.min(size3.x,size3.y)*roundrectRatio/2);let normalizedCcwRotation=normalizeRotationDegrees(ccwRotationDegrees),rightAngleTurns=getRightAngleTurns(normalizedCcwRotation);if(rightAngleTurns===null&&normalizedCcwRotation!==0){let rotatedsmtpad={type:"pcb_smtpad",pcb_component_id:componentId,x:pos.x,y:pos.y,width:size3.x,height:size3.y,layer,pcb_port_id:pcbPortId,port_hints:[pad2.number.toString()],shape:"rotated_rect",ccw_rotation:normalizedCcwRotation,corner_radius:cornerRadius};ctx.db.pcb_smtpad.insert(rotatedsmtpad);return}let shouldSwapDimensions=rightAngleTurns!==null&&Math.abs(rightAngleTurns)%2===1,smtpad2={type:"pcb_smtpad",pcb_component_id:componentId,x:pos.x,y:pos.y,width:shouldSwapDimensions?size3.y:size3.x,height:shouldSwapDimensions?size3.x:size3.y,layer,pcb_port_id:pcbPortId,port_hints:[pad2.number.toString()],shape:"rect",corner_radius:cornerRadius};ctx.db.pcb_smtpad.insert(smtpad2)}else ctx.db.pcb_smtpad.insert({type:"pcb_smtpad",pcb_component_id:componentId,x:pos.x,y:pos.y,width:size3.x,height:size3.y,layer,pcb_port_id:pcbPortId,port_hints:[pad2.number?.toString()],shape:"rect"});ctx.stats&&(ctx.stats.pads=(ctx.stats.pads||0)+1)}function normalizeRotationDegrees(rotationDegrees){if(!rotationDegrees)return 0;let normalized=rotationDegrees%360;return normalized<0?normalized+360:normalized}function getRightAngleTurns(rotationDegrees){let quarterTurns=rotationDegrees/90;return Math.abs(quarterTurns-Math.round(quarterTurns))>1e-9?null:Math.round(quarterTurns)}function createPlatedHole(ctx,pad2,componentId,pos,size3,drill,shape,layers,_rotation=0,pcbPortId,_sourcePortId=void 0){let drillX=typeof drill=="object"?drill?.x||drill?._width||drill?.diameter||.8:drill||.8,drillY=typeof drill=="object"?drill?.y||drill?._height||drill?.diameter||drillX:drill||.8,holeDiameter=Math.max(drillX,drillY),drillIsOval=typeof drill=="object"&&drillX!==void 0&&drillY!==void 0&&drillX!==drillY,outerWidth=size3.x,outerHeight=size3.y;if(shape==="circle"){let platedHole={type:"pcb_plated_hole",shape:"circle",pcb_component_id:componentId,pcb_port_id:pcbPortId,x:pos.x,y:pos.y,port_hints:[pad2.number?.toString()],hole_diameter:holeDiameter,outer_diameter:Math.max(outerWidth,outerHeight),layers};ctx.db.pcb_plated_hole.insert(platedHole)}else if(shape==="oval"){let platedHole={type:"pcb_plated_hole",shape:"pill",pcb_component_id:componentId,pcb_port_id:pcbPortId,x:pos.x,y:pos.y,port_hints:[pad2.number?.toString()],hole_width:drillY,hole_height:drillX,outer_width:outerWidth,outer_height:outerHeight,ccw_rotation:pad2.at?.angle||0,layers};ctx.db.pcb_plated_hole.insert(platedHole)}else if(shape==="rect"||shape==="square"||shape==="roundrect"){let normalizedCcwRotationDegrees=normalizeRotationDegrees(pad2.at?.angle);if(drillIsOval)if(normalizedCcwRotationDegrees===0){let platedHole={type:"pcb_plated_hole",shape:"pill_hole_with_rect_pad",pcb_component_id:componentId,pcb_port_id:pcbPortId,x:pos.x,y:pos.y,port_hints:[pad2.number?.toString()],hole_shape:"pill",pad_shape:"rect",hole_width:drillY,hole_height:drillX,rect_pad_width:outerWidth,rect_pad_height:outerHeight,hole_offset_x:0,hole_offset_y:0,layers};if(shape==="roundrect"){let roundrectRatio=pad2._sxRoundrectRatio?.value??pad2.roundrect_rratio;if(roundrectRatio!==void 0){let minDimension=Math.min(outerWidth,outerHeight);platedHole.rect_border_radius=minDimension*roundrectRatio/2}}ctx.db.pcb_plated_hole.insert(platedHole)}else{let platedHole={type:"pcb_plated_hole",shape:"rotated_pill_hole_with_rect_pad",pcb_component_id:componentId,pcb_port_id:pcbPortId,x:pos.x,y:pos.y,port_hints:[pad2.number?.toString()],hole_shape:"rotated_pill",pad_shape:"rect",hole_width:drillY,hole_height:drillX,hole_ccw_rotation:normalizedCcwRotationDegrees,rect_ccw_rotation:normalizedCcwRotationDegrees,rect_pad_width:outerWidth,rect_pad_height:outerHeight,hole_offset_x:0,hole_offset_y:0,layers};if(shape==="roundrect"){let roundrectRatio=pad2._sxRoundrectRatio?.value??pad2.roundrect_rratio;if(roundrectRatio!==void 0){let minDimension=Math.min(outerWidth,outerHeight);platedHole.rect_border_radius=minDimension*roundrectRatio/2}}ctx.db.pcb_plated_hole.insert(platedHole)}else{let platedHole={type:"pcb_plated_hole",shape:"circular_hole_with_rect_pad",pcb_component_id:componentId,pcb_port_id:pcbPortId,pcb_plated_hole_id:"pcb_plated_hole_id",x:pos.x,y:pos.y,port_hints:[pad2.number?.toString()],hole_shape:"circle",pad_shape:"rect",hole_diameter:holeDiameter,rect_ccw_rotation:pad2.at?.angle||0,rect_pad_width:outerWidth,rect_pad_height:outerHeight,hole_offset_x:0,hole_offset_y:0,layers};if(shape==="roundrect"){let roundrectRatio=pad2._sxRoundrectRatio?.value??pad2.roundrect_rratio;if(roundrectRatio!==void 0){let minDimension=Math.min(outerWidth,outerHeight);platedHole.rect_border_radius=minDimension*roundrectRatio/2}}ctx.db.pcb_plated_hole.insert(platedHole)}}ctx.stats&&(ctx.stats.pads=(ctx.stats.pads||0)+1)}function createNpthHole(ctx,_pad,componentId,pos,drill){let holeDiameter=drill?.diameter||drill||1,hole={type:"pcb_hole",hole_shape:"circle",pcb_component_id:componentId,x:pos.x,y:pos.y,hole_diameter:holeDiameter};ctx.db.pcb_hole.insert(hole)}function getTextValue(footprint,type){let texts=footprint.fpTexts||[];return(Array.isArray(texts)?texts:[texts]).find(t52=>t52.type===type)?.text}function getPropertyValue(footprint,propertyName){let properties=footprint.properties||[];return(Array.isArray(properties)?properties:[properties]).find(p4=>p4.key===propertyName)?.value}function substituteKicadVariables(text,footprint){let result=text,reference=getPropertyValue(footprint,"Reference")||getTextValue(footprint,"reference")||"?",value=getPropertyValue(footprint,"Value")||getTextValue(footprint,"value")||"";return result=result.replace(/\$\{REFERENCE\}/g,reference),result=result.replace(/\$\{VALUE\}/g,value),result}function mapKicadJustifyToAnchorAlignment(justify){if(!justify)return"center";let horizontal=justify.horizontal||"center",vertical=justify.vertical||"center";if(vertical==="top"){if(horizontal==="left")return"top_left";if(horizontal==="center")return"top_center";if(horizontal==="right")return"top_right"}if(vertical==="center"){if(horizontal==="left")return"center_left";if(horizontal==="center")return"center";if(horizontal==="right")return"center_right"}if(vertical==="bottom"){if(horizontal==="left")return"bottom_left";if(horizontal==="center")return"bottom_center";if(horizontal==="right")return"bottom_right"}return"center"}function processFootprintText(ctx,footprint,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;processFootprintProperties(ctx,footprint,componentId,kicadComponentPos,componentRotation);let texts=footprint.fpTexts||[],textArray=Array.isArray(texts)?texts:[texts];for(let text of textArray){let renderLayer=mapKicadLayerToPcbRenderLayer(text.layer);if(!isPcbTextRenderLayer(renderLayer))continue;let textElement={text:text.text,at:text._sxPosition||text.at,layer:text.layer,effects:text._sxEffects||text.effects,_sxEffects:text._sxEffects};createGraphicText(ctx,textElement,renderLayer,componentId,kicadComponentPos,componentRotation,footprint)}}function processFootprintProperties(ctx,footprint,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let properties=footprint.properties||[],propertyArray=Array.isArray(properties)?properties:[properties];for(let property of propertyArray){if(!property.layer)continue;let renderLayer=mapKicadLayerToPcbRenderLayer(property.layer),isPropertyHidden=property.hidden;if(!isPcbTextRenderLayer(renderLayer)||isPropertyHidden)continue;let textElement={text:property.value,at:property._sxAt,layer:property.layer,effects:property._sxEffects||property.effects,_sxEffects:property._sxEffects};createGraphicText(ctx,textElement,renderLayer,componentId,kicadComponentPos,componentRotation,footprint)}}function createGraphicText(ctx,text,renderLayer,componentId,kicadComponentPos,componentRotation,footprint){if(!ctx.k2cMatPcb)return;let at3=text.at,textLocalX=at3?.x??0,textLocalY=at3?.y??0,rotationRad=-componentRotation*Math.PI/180,rotatedTextX=textLocalX*Math.cos(rotationRad)-textLocalY*Math.sin(rotationRad),rotatedTextY=textLocalX*Math.sin(rotationRad)+textLocalY*Math.cos(rotationRad),textKicadPos={x:kicadComponentPos.x+rotatedTextX,y:kicadComponentPos.y+rotatedTextY},pos=applyToPoint(ctx.k2cMatPcb,textKicadPos),layer=mapTextLayer(text.layer),processedText=substituteKicadVariables(text.text||"",footprint),kicadFontSize=text._sxEffects?._sxFont?._sxSize?._height||text.effects?.font?.size?.y||1,justify=text._sxEffects?._sxJustify||text.effects?.justify,anchorAlignment=mapKicadJustifyToAnchorAlignment(justify);if(renderLayer.endsWith("_silkscreen")){ctx.db.pcb_silkscreen_text.insert({pcb_component_id:componentId,font:"tscircuit2024",font_size:kicadFontSize*1.5,text:processedText,anchor_position:pos,anchor_alignment:anchorAlignment,layer});return}if(renderLayer.endsWith("_fabrication_note")){ctx.db.pcb_fabrication_note_text.insert({pcb_component_id:componentId,font:"tscircuit2024",font_size:kicadFontSize*1.5,text:processedText,anchor_position:pos,anchor_alignment:anchorAlignment,layer});return}renderLayer.endsWith("_copper")&&ctx.db.pcb_copper_text.insert({pcb_component_id:componentId,font:"tscircuit2024",font_size:kicadFontSize*1.5,text:processedText,anchor_position:pos,anchor_alignment:anchorAlignment,layer})}function inferComponentType(reference){if(!reference)return"simple_chip";switch(reference.match(/^([A-Z]+)/)?.[1]){case"R":return"simple_resistor";case"C":return"simple_capacitor";case"L":return"simple_inductor";case"D":return"simple_diode";case"LED":return"simple_diode";case"Q":return"simple_transistor";case"U":case"IC":return"simple_chip";case"J":case"P":return"simple_chip";default:return"simple_chip"}}function inferTransistorTypeFromFootprint(footprint,value){let lowerValue=(value||"").toLowerCase();if(lowerValue.includes("pnp"))return"pnp";if(lowerValue.includes("npn"))return"npn";let lowerLibId=(footprint.libraryId||"").toLowerCase();return lowerLibId.includes("pnp")?"pnp":(lowerLibId.includes("npn"),"npn")}function getFootprintProperties(footprint){let properties=footprint.properties||[];return Array.isArray(properties)?properties:[properties]}function getFootprintPropertyName(property){return property?.key}function getFootprintPropertyValue(property){return property?.value}function findFootprintProperty(footprint,propertyNames){let names=Array.isArray(propertyNames)?propertyNames:[propertyNames];return getFootprintProperties(footprint).find(property=>names.includes(getFootprintPropertyName(property)??""))}function findFootprintPropertyValue(footprint,propertyNames){let property=findFootprintProperty(footprint,propertyNames);return getFootprintPropertyValue(property)}function parseSupplierPartNumbers(value){if(!value)return;let partNumbers=value.split(/[,;]/).map(partNumber=>partNumber.trim()).filter(Boolean);return partNumbers.length>0?partNumbers:void 0}function processFootprint(ctx,footprint){if(!ctx.k2cMatPcb)return;let position4=footprint.position,kicadPos={x:position4?.x??0,y:position4?.y??0},cjPos=applyToPoint(ctx.k2cMatPcb,kicadPos),rotation5=position4?.angle??0,uuid=footprint.uuid?.value||footprint.tstamp?.value;if(!uuid)return;let refdes=getFootprintReference(footprint),value=getFootprintValue(footprint),jlcpcbPartNumbers=getJlcpcbPartNumbers(footprint),ftype=inferComponentType(refdes),sourceComponentData={name:refdes||"U",ftype};if(ftype==="simple_transistor"&&(sourceComponentData.transistor_type=inferTransistorTypeFromFootprint(footprint,value)),jlcpcbPartNumbers&&(sourceComponentData.supplier_part_numbers={jlcpcb:jlcpcbPartNumbers}),value){let sanitizedValue=value.replace(/,/g,".");switch(ftype){case"simple_resistor":sourceComponentData.resistance=sanitizedValue;break;case"simple_capacitor":sourceComponentData.capacitance=sanitizedValue;break;case"simple_inductor":sourceComponentData.inductance=sanitizedValue;break}}let sourceComponentId=ctx.db.source_component.insert(sourceComponentData).source_component_id,componentId=ctx.db.pcb_component.insert({center:{x:cjPos.x,y:cjPos.y},layer:getComponentLayer(footprint),rotation:-rotation5,width:0,height:0,source_component_id:sourceComponentId}).pcb_component_id;ctx.footprintUuidToComponentId?.set(uuid,componentId),ctx.footprintUuidToSourceComponentId?.set(uuid,sourceComponentId),processPads(ctx,footprint,componentId,kicadPos,rotation5),processFootprintText(ctx,footprint,componentId,kicadPos,rotation5),processFootprintGraphics(ctx,footprint,componentId,kicadPos,rotation5),ctx.stats&&(ctx.stats.components=(ctx.stats.components||0)+1)}function getFootprintReference(footprint){let propertyValue=findFootprintPropertyValue(footprint,"Reference");if(propertyValue)return propertyValue;let textItems=footprint.fpTexts||[],textArray=Array.isArray(textItems)?textItems:[textItems];for(let text of textArray)if(text.type==="reference")return text.text}function getFootprintValue(footprint){let propertyValue=findFootprintPropertyValue(footprint,"Value");if(propertyValue)return propertyValue;let textItems=footprint.fpTexts||[],textArray=Array.isArray(textItems)?textItems:[textItems];for(let text of textArray)if(text.type==="value")return text.text}function getJlcpcbPartNumbers(footprint){return parseSupplierPartNumbers(findFootprintPropertyValue(footprint,["JLCPCB Part #","Supplier Part Number"]))}var CollectFootprintsStage=class extends ConverterStage{constructor(){super(...arguments);__publicField(this,"processedFootprints",new Set)}step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb)return this.finished=!0,!1;let footprints=this.ctx.kicadPcb.footprints||[],footprintArray=Array.isArray(footprints)?footprints:[footprints];for(let footprint of footprintArray){let uuid=footprint.uuid?.value||footprint.tstamp?.value;uuid&&(this.processedFootprints.has(uuid)||(processFootprint(this.ctx,footprint),this.processedFootprints.add(uuid)))}return this.finished=!0,!1}},FULL_TURN=Math.PI*2;function normalizeToArray(value){return value?Array.isArray(value)?value:[value]:[]}function getLayerNames(layer){return layer?typeof layer=="string"?[layer]:layer.names||[]:[]}function getGraphicLayerNames(graphic){return getLayerNames(graphic?.layer)}function getPcbPoint(point7){return{x:point7?.x??0,y:point7?.y??0}}function getLineStartEnd(line2){return{start:getPcbPoint(line2.start),end:getPcbPoint(line2.end)}}function getArcStartMidEnd(arc2){return{start:getPcbPoint(arc2.start),mid:getPcbPoint(arc2.mid),end:getPcbPoint(arc2.end)}}function getCircleCenterEnd(circle2){return{center:getPcbPoint(circle2.center),end:getPcbPoint(circle2.end)}}function getGraphicArcs(kicadPcb){return normalizeToArray(kicadPcb.graphicArcs)}function getGraphicCircles(kicadPcb){return normalizeToArray(kicadPcb.graphicCircles)}function getGraphicCurves(kicadPcb){return normalizeToArray(kicadPcb.graphicCurves)}function getTopLevelCopperArcs(kicadPcb){return normalizeToArray(kicadPcb.arcs)}function approximateArcPoints(start,mid,end,options){let geometry=getArcGeometry(start,mid,end);if(!geometry)return[start,end];let segmentLength=options?.segmentLength??.25,minSegments=options?.minSegments??8,arcLength2=Math.abs(geometry.radius*geometry.sweepAngle),numSegments=Math.max(2,minSegments,Math.ceil(arcLength2/segmentLength)),points=[];for(let i3=0;i3<=numSegments;i3++){let t52=i3/numSegments,angle=geometry.startAngle+geometry.sweepAngle*t52;points.push({x:geometry.center.x+geometry.radius*Math.cos(angle),y:geometry.center.y+geometry.radius*Math.sin(angle)})}return points}function getCurvePoints(curve){let xyPoints=(curve.points?.points??[]).filter(point7=>point7.token==="xy").map(point7=>getPcbPoint(point7));return xyPoints.length<4?null:{start:xyPoints[0],control1:xyPoints[1],control2:xyPoints[2],end:xyPoints[3]}}function approximateCubicBezierPoints(start,control1,control2,end,options){let segmentLength=options?.segmentLength??.25,minSegments=options?.minSegments??8,controlPolygonLength=getDistance4(start,control1)+getDistance4(control1,control2)+getDistance4(control2,end),numSegments=Math.max(2,minSegments,Math.ceil(controlPolygonLength/segmentLength)),points=[];for(let i3=0;i3<=numSegments;i3++){let t52=i3/numSegments,omt=1-t52;points.push({x:omt**3*start.x+3*omt**2*t52*control1.x+3*omt*t52**2*control2.x+t52**3*end.x,y:omt**3*start.y+3*omt**2*t52*control1.y+3*omt*t52**2*control2.y+t52**3*end.y})}return points}function approximateCirclePoints(center2,end,options){let radius=getDistance4(center2,end);if(radius<=0)return[center2];let segmentLength=options?.segmentLength??.25,minSegments=options?.minSegments??16,circumference=FULL_TURN*radius,numSegments=Math.max(8,minSegments,Math.ceil(circumference/segmentLength)),startAngle=Math.atan2(end.y-center2.y,end.x-center2.x),points=[];for(let i3=0;i3<=numSegments;i3++){let t52=i3/numSegments,angle=startAngle+FULL_TURN*t52;points.push({x:center2.x+radius*Math.cos(angle),y:center2.y+radius*Math.sin(angle)})}return points}function getArcGeometry(start,mid,end){let circle2=calculateArcCenter2(start,mid,end);if(!circle2)return null;let startAngle=Math.atan2(start.y-circle2.center.y,start.x-circle2.center.x),midAngle=Math.atan2(mid.y-circle2.center.y,mid.x-circle2.center.x),endAngle=Math.atan2(end.y-circle2.center.y,end.x-circle2.center.x),sweepAngle=normalizeSignedAngle(endAngle-startAngle),midSweep=normalizeSignedAngle(midAngle-startAngle),isCounterClockwise=sweepAngle>0;return isCounterClockwise&&midSweep>0&&midSweep<sweepAngle||!isCounterClockwise&&midSweep<0&&midSweep>sweepAngle||(sweepAngle=sweepAngle>0?sweepAngle-FULL_TURN:sweepAngle+FULL_TURN),{center:circle2.center,radius:circle2.radius,startAngle,sweepAngle}}function normalizeSignedAngle(angle){for(;angle<=-Math.PI;)angle+=FULL_TURN;for(;angle>Math.PI;)angle-=FULL_TURN;return angle}function calculateArcCenter2(p12,p22,p32){let ax3=p12.x,ay3=p12.y,bx3=p22.x,by3=p22.y,cx3=p32.x,cy3=p32.y,determinant=2*(ax3*(by3-cy3)+bx3*(cy3-ay3)+cx3*(ay3-by3));if(Math.abs(determinant)<1e-10)return null;let ux3=((ax3*ax3+ay3*ay3)*(by3-cy3)+(bx3*bx3+by3*by3)*(cy3-ay3)+(cx3*cx3+cy3*cy3)*(ay3-by3))/determinant,uy3=((ax3*ax3+ay3*ay3)*(cx3-bx3)+(bx3*bx3+by3*by3)*(ax3-cx3)+(cx3*cx3+cy3*cy3)*(bx3-ax3))/determinant;return{center:{x:ux3,y:uy3},radius:Math.sqrt((ax3-ux3)**2+(ay3-uy3)**2)}}function getDistance4(a3,b3){return Math.hypot(b3.x-a3.x,b3.y-a3.y)}var CollectGraphicsStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb)return this.finished=!0,!1;let lines=this.ctx.kicadPcb.graphicLines||[],lineArray=Array.isArray(lines)?lines:[lines],arcArray=getGraphicArcs(this.ctx.kicadPcb),circleArray=getGraphicCircles(this.ctx.kicadPcb),curveArray=getGraphicCurves(this.ctx.kicadPcb),edgeCutPrimitives=[];for(let line2 of lineArray){let layerStr=getGraphicLayerNames(line2).join(" ");if(layerStr.includes("Edge.Cuts")){let{start,end}=getLineStartEnd(line2);edgeCutPrimitives.push({type:"line",start,end})}else if(layerStr.includes("SilkS")||layerStr.includes("Fab")||layerStr.includes("CrtYd")){let renderLayer=mapKicadLayerToPcbRenderLayer(line2.layer);renderLayer&&this.createGraphicPath(line2,renderLayer)}}for(let arc2 of arcArray){let layerStr=getGraphicLayerNames(arc2).join(" ");if(layerStr.includes("Edge.Cuts")){let{start,mid,end}=getArcStartMidEnd(arc2);edgeCutPrimitives.push({type:"arc",start,mid,end})}else if(layerStr.includes("SilkS")||layerStr.includes("Fab")||layerStr.includes("CrtYd")){let renderLayer=mapKicadLayerToPcbRenderLayer(arc2.layer);renderLayer&&this.createGraphicArc(arc2,renderLayer)}}for(let circle2 of circleArray){if(!getGraphicLayerNames(circle2).join(" ").includes("Edge.Cuts"))continue;let{center:center2,end}=getCircleCenterEnd(circle2);edgeCutPrimitives.push({type:"circle",center:center2,start:end,end})}for(let curve of curveArray){if(!getGraphicLayerNames(curve).join(" ").includes("Edge.Cuts"))continue;let points=getCurvePoints(curve);points&&edgeCutPrimitives.push({type:"curve",start:points.start,control1:points.control1,control2:points.control2,end:points.end})}edgeCutPrimitives.length>0&&this.createBoardOutline(edgeCutPrimitives);let grRects=this.ctx.kicadPcb.graphicRects||[];for(let rect of grRects)this.processRectangle(rect);let grPolys=this.ctx.kicadPcb.graphicPolys||[],polyArray=Array.isArray(grPolys)?grPolys:[grPolys];for(let poly of polyArray)this.processPolygon(poly);let texts=this.ctx.kicadPcb.graphicTexts||[],textArray=Array.isArray(texts)?texts:[texts];for(let text of textArray){let renderLayer=mapKicadLayerToPcbRenderLayer(text.layer);renderLayer&&this.createGraphicText(text,renderLayer)}return this.finished=!0,!1}createBoardOutline(primitives){if(!this.ctx.k2cMatPcb)return;let orderedSegments=[],remainingSegments=[...primitives];if(remainingSegments.length>0)for(orderedSegments.push(remainingSegments.shift());remainingSegments.length>0;){let lastEnd=orderedSegments[orderedSegments.length-1].end,foundIndex=remainingSegments.findIndex(seg=>this.pointsEqualKicad(seg.start,lastEnd));if(foundIndex===-1&&(foundIndex=remainingSegments.findIndex(seg=>this.pointsEqualKicad(seg.end,lastEnd)),foundIndex!==-1)){let seg=remainingSegments[foundIndex];orderedSegments.push(seg.type==="arc"?{type:"arc",start:seg.end,mid:seg.mid,end:seg.start}:seg.type==="circle"?{type:"circle",center:seg.center,start:seg.end,end:seg.start}:seg.type==="curve"?{type:"curve",start:seg.end,control1:seg.control2,control2:seg.control1,end:seg.start}:{type:"line",start:seg.end,end:seg.start}),remainingSegments.splice(foundIndex,1);continue}foundIndex!==-1?orderedSegments.push(remainingSegments.splice(foundIndex,1)[0]):orderedSegments.push(remainingSegments.shift())}let points=[];for(let segment2 of orderedSegments){let kicadPoints;segment2.type==="arc"?kicadPoints=approximateArcPoints(segment2.start,segment2.mid,segment2.end,{segmentLength:.25,minSegments:16}):segment2.type==="circle"?kicadPoints=approximateCirclePoints(segment2.center,segment2.end,{segmentLength:.25,minSegments:16}):segment2.type==="curve"?kicadPoints=approximateCubicBezierPoints(segment2.start,segment2.control1,segment2.control2,segment2.end,{segmentLength:.25,minSegments:16}):kicadPoints=[segment2.start,segment2.end];for(let kicadPoint of kicadPoints){let point7=applyToPoint(this.ctx.k2cMatPcb,kicadPoint),lastPoint=points[points.length-1];(!lastPoint||!this.pointsEqual(lastPoint,point7))&&points.push(point7)}}let existingBoard=this.ctx.db.pcb_board.list()[0];existingBoard?(existingBoard.outline=points,existingBoard.width=this.calculateWidth(points),existingBoard.height=this.calculateHeight(points)):this.ctx.db.pcb_board.insert({outline:points,width:this.calculateWidth(points),height:this.calculateHeight(points)})}createGraphicPath(line2,renderLayer){if(!this.ctx.k2cMatPcb)return;let{start,end}=getLineStartEnd(line2),startPos=applyToPoint(this.ctx.k2cMatPcb,start),endPos=applyToPoint(this.ctx.k2cMatPcb,end),layer=mapKicadLayerToVisibleLayer(line2.layer),strokeWidth=line2.width||.15;this.insertRouteGraphic({layer,renderLayer,pcbComponentId:"",route:[startPos,endPos],strokeWidth})}createGraphicArc(arc2,renderLayer){if(!this.ctx.k2cMatPcb)return;let{start,mid,end}=getArcStartMidEnd(arc2),route=approximateArcPoints(start,mid,end,{segmentLength:.1,minSegments:8}).map(point7=>applyToPoint(this.ctx.k2cMatPcb,point7)),layer=mapKicadLayerToVisibleLayer(arc2.layer),strokeWidth=arc2.stroke?.width??arc2._sxStroke?._sxWidth?.value??arc2.width??.15;this.insertRouteGraphic({layer,renderLayer,pcbComponentId:"",route,strokeWidth})}insertRouteGraphic(options){let{layer,renderLayer,pcbComponentId,route,strokeWidth}=options;if(renderLayer.endsWith("_silkscreen")){this.ctx.db.pcb_silkscreen_path.insert({pcb_component_id:pcbComponentId,layer,route,stroke_width:strokeWidth});return}if(renderLayer.endsWith("_fabrication_note")){this.ctx.db.pcb_fabrication_note_path.insert({pcb_component_id:pcbComponentId,layer,route,stroke_width:strokeWidth});return}this.ctx.db.pcb_courtyard_outline.insert({pcb_component_id:pcbComponentId,layer,outline:route})}processRectangle(rect){if(!this.ctx.k2cMatPcb)return;let start={x:rect._sxStart?._x??0,y:rect._sxStart?._y??0},end={x:rect._sxEnd?._x??0,y:rect._sxEnd?._y??0},renderLayer=mapKicadLayerToPcbRenderLayer(rect._sxLayer),isFilled=rect._sxFill&&(rect._sxFill.isFilled===!0||String(rect._sxFill).includes("fill yes")),isCopperLayer=renderLayer?.endsWith("_copper"),centerKicad={x:(start.x+end.x)/2,y:(start.y+end.y)/2},widthKicad=Math.abs(end.x-start.x),heightKicad=Math.abs(end.y-start.y),centerCJ=applyToPoint(this.ctx.k2cMatPcb,centerKicad);if(isFilled&&isCopperLayer){let layer2=mapKicadLayerToLayerRef(rect._sxLayer);this.ctx.db.pcb_smtpad.insert({pcb_component_id:"",x:centerCJ.x,y:centerCJ.y,width:widthKicad,height:heightKicad,layer:layer2,shape:"rect",port_hints:[]}),this.ctx.stats&&(this.ctx.stats.pads=(this.ctx.stats.pads||0)+1);return}let layer=mapKicadLayerToVisibleLayer(rect._sxLayer),strokeWidth=rect.stroke?.width??rect._sxStroke?._sxWidth?.value??rect.width??.15;if(renderLayer?.endsWith("_fabrication_note")){this.ctx.db.pcb_fabrication_note_rect.insert({pcb_component_id:"",center:centerCJ,width:widthKicad,height:heightKicad,layer,stroke_width:strokeWidth,is_filled:isFilled,has_stroke:!0});return}renderLayer?.endsWith("_courtyard")&&this.ctx.db.pcb_courtyard_rect.insert({pcb_component_id:"",center:centerCJ,width:widthKicad,height:heightKicad,layer})}createGraphicText(text,renderLayer){if(!this.ctx.k2cMatPcb)return;let at3=text.at||text._sxPosition,pos=applyToPoint(this.ctx.k2cMatPcb,{x:at3?.x??0,y:at3?.y??0}),layer=mapKicadLayerToVisibleLayer(text.layer),fontSize=(text._sxEffects?._sxFont?._sxSize?._height||text.effects?.font?.size?.y||1)*1.5,textValue=text.text||text._text||"",justify=text._sxEffects?._sxJustify||text.effects?.justify,anchorAlignment=mapKicadJustifyToAnchorAlignment(justify);if(renderLayer.endsWith("_silkscreen")){this.ctx.db.pcb_silkscreen_text.insert({pcb_component_id:"",text:textValue,anchor_position:pos,anchor_alignment:anchorAlignment,layer,font_size:fontSize,font:"tscircuit2024"});return}if(renderLayer.endsWith("_fabrication_note")){this.ctx.db.pcb_fabrication_note_text.insert({pcb_component_id:"",text:textValue,anchor_position:pos,anchor_alignment:anchorAlignment,layer,font_size:fontSize,font:"tscircuit2024"});return}renderLayer.endsWith("_copper")&&this.ctx.db.pcb_copper_text.insert({pcb_component_id:"",text:textValue,anchor_position:pos,anchor_alignment:anchorAlignment,layer,font_size:fontSize,font:"tscircuit2024"})}pointsEqual(p12,p22){return Math.abs(p12.x-p22.x)<.001&&Math.abs(p12.y-p22.y)<.001}pointsEqualKicad(p12,p22){return Math.abs(p12.x-p22.x)<.001&&Math.abs(p12.y-p22.y)<.001}calculateWidth(points){if(points.length===0)return 0;let xs3=points.map(p4=>p4.x);return Math.max(...xs3)-Math.min(...xs3)}calculateHeight(points){if(points.length===0)return 0;let ys3=points.map(p4=>p4.y);return Math.max(...ys3)-Math.min(...ys3)}processPolygon(poly){if(!this.ctx.k2cMatPcb)return;let renderLayer=mapKicadLayerToPcbRenderLayer(poly._sxLayer),isFilled=poly._sxFill?.filled===!0,isCopperLayer=renderLayer?.endsWith("_copper");if(!isFilled&&!renderLayer?.endsWith("_courtyard"))return;let ptsData=poly._sxPts?.points||[],points=[];for(let pt3 of ptsData)if(pt3.token==="xy")points.push({x:pt3.x,y:pt3.y});else if(pt3.token==="arc"){let arcPoints=approximateArcPoints({x:pt3._sxStart?._x,y:pt3._sxStart?._y},{x:pt3._sxMid?._x,y:pt3._sxMid?._y},{x:pt3._sxEnd?._x,y:pt3._sxEnd?._y});points.push(...arcPoints)}if(points.length<3)return;let transformedPoints=points.map(pt3=>applyToPoint(this.ctx.k2cMatPcb,pt3));if(isFilled&&isCopperLayer){let layer=mapKicadLayerToLayerRef(poly._sxLayer);this.ctx.db.pcb_smtpad.insert({pcb_component_id:"",shape:"polygon",points:transformedPoints,layer,port_hints:[]}),this.ctx.stats&&(this.ctx.stats.pads=(this.ctx.stats.pads||0)+1);return}if(renderLayer?.endsWith("_courtyard")){let layer=mapKicadLayerToVisibleLayer(poly._sxLayer);this.ctx.db.pcb_courtyard_outline.insert({pcb_component_id:"",layer,outline:transformedPoints})}}};function sanitizeCircuitJsonNetName(rawName,fallbackName){let name=(rawName?.trim()||fallbackName).replace(/\+/g,"_P").replace(/-/g,"_").replace(/[^A-Za-z0-9_]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||fallbackName;return/^\d/.test(name)?`net_${name}`:name}var CollectNetsStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let nets=this.ctx.kicadPcb.nets||[],netArray=Array.isArray(nets)?nets:[nets],usedNetNames=new Set;for(let net of netArray){let netNum=net._id??net.number??net.ordinal??0,rawNetName=net._name??net.name,sanitizedNetName=sanitizeCircuitJsonNetName(rawNetName,`Net_${netNum}`),netName=usedNetNames.has(sanitizedNetName)?`${sanitizedNetName}_${netNum}`:sanitizedNetName;usedNetNames.add(netName),this.ctx.netNumToName.set(netNum,netName)}return this.ctx.netNumToName.has(0)||this.ctx.netNumToName.set(0,""),this.finished=!0,!1}},CollectSourceTracesStage=class extends ConverterStage{constructor(){super(...arguments);__publicField(this,"processedNets",new Set)}step(){if(!this.ctx.kicadPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let netToPads=new Map,footprints=this.ctx.kicadPcb.footprints||[],footprintArray=Array.isArray(footprints)?footprints:[footprints];for(let footprint of footprintArray)this.processFootprintPads(footprint,netToPads);this.collectNetsFromCopper(netToPads);for(let[netNum,pads]of netToPads.entries())this.processedNets.has(netNum)||(this.ctx.netNumToSourcePortIds?.set(netNum,pads.map(p4=>p4.sourcePortId)),this.createSourceNet(netNum),this.processedNets.add(netNum));return this.finished=!0,!1}collectNetsFromCopper(netToPads){if(!this.ctx.kicadPcb)return;let segments=this.ctx.kicadPcb.segments||[],segmentArray=Array.isArray(segments)?segments:[segments];for(let segment2 of segmentArray){let netNum=this.getSegmentNet(segment2);netNum&&(netToPads.has(netNum)||netToPads.set(netNum,[]))}let arcArray=getTopLevelCopperArcs(this.ctx.kicadPcb);for(let arc2 of arcArray){let netNum=this.getSegmentNet(arc2);netNum&&(netToPads.has(netNum)||netToPads.set(netNum,[]))}}getSegmentNet(segment2){let net=segment2?.net;return net?typeof net=="number"?net:typeof net=="object"?net._id??net.number??net.ordinal??null:null:null}processFootprintPads(footprint,netToPads){let footprintUuid=footprint.uuid?.value||footprint.tstamp?.value;if(!footprintUuid)return;let componentId=this.ctx.footprintUuidToComponentId?.get(footprintUuid);if(!componentId)return;let pads=footprint.fpPads||[],padArray=Array.isArray(pads)?pads:[pads];for(let pad2 of padArray){let padNumber=pad2.number?.toString();if(!padNumber)continue;let netNum=this.getPadNet(pad2);if(netNum==null||netNum===0)continue;let sourcePortId=this.getOrCreateSourcePort(componentId,padNumber,footprint);netToPads.has(netNum)||netToPads.set(netNum,[]),netToPads.get(netNum).push({componentId,padNumber,sourcePortId})}}getPadNet(pad2){let net=pad2._sxNet||pad2.net;return net?typeof net=="number"?net:typeof net=="object"?net._id??net.number??net.ordinal??null:null:null}getOrCreateSourcePort(componentId,padNumber,footprint){let sourcePortId=`${componentId}_port_${padNumber}`;if(!this.ctx.db.source_port.list().find(sp3=>sp3.source_port_id===sourcePortId)){let footprintUuid=footprint.uuid?.value||footprint.tstamp?.value,sourceComponentId=footprintUuid&&this.ctx.footprintUuidToSourceComponentId?this.ctx.footprintUuidToSourceComponentId.get(footprintUuid):void 0;this.ctx.db.source_port.insert({source_port_id:sourcePortId,source_component_id:sourceComponentId||componentId,name:this.getSourcePortName(padNumber),pin_number:this.getSourcePortPinNumber(padNumber)})}return sourcePortId}getSourcePortName(padNumber){return/^\d+$/.test(padNumber)?`pin${Number(padNumber)}`:padNumber}getSourcePortPinNumber(padNumber){return/^\d+$/.test(padNumber)?Number(padNumber):padNumber}createSourceNet(netNum){let netName=this.ctx.netNumToName?.get(netNum)||`Net-${netNum}`,sourceNet=this.ctx.db.source_net.insert({name:netName,member_source_group_ids:[]});this.ctx.netNumToSourceNetId?.set(netNum,sourceNet.source_net_id),this.ctx.stats&&(this.ctx.stats.traces=(this.ctx.stats.traces||0)+1)}},CollectTracesStage=class extends ConverterStage{constructor(){super(...arguments);__publicField(this,"PORT_MATCH_TOLERANCE",.001);__publicField(this,"POINT_KEY_PRECISION",1e6)}step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb||!this.ctx.netNumToName||!this.ctx.netNumToSourceNetId)return this.finished=!0,!1;let segments=this.ctx.kicadPcb.segments||[],segmentArray=Array.isArray(segments)?segments:[segments],arcArray=getTopLevelCopperArcs(this.ctx.kicadPcb),primitives=[];for(let segment2 of segmentArray){let primitive=this.getTracePrimitiveFromSegment(segment2);primitive&&primitives.push(primitive)}for(let arc2 of arcArray){let primitive=this.getTracePrimitiveFromArc(arc2);primitive&&primitives.push(primitive)}let vias=this.ctx.kicadPcb.vias||[],viaArray=Array.isArray(vias)?vias:[vias];for(let via of viaArray){let primitive=this.getTracePrimitiveFromVia(via);primitive&&primitives.push(primitive)}return this.annotatePrimitivesWithConnectedSourcePorts(primitives),this.createTracesFromPrimitives(primitives),this.finished=!0,!1}getTracePrimitiveFromSegment(segment2){if(!this.ctx.k2cMatPcb)return;let start=segment2.start||{x:0,y:0},end=segment2.end||{x:0,y:0},width=segment2.width||.2,layer=segment2.layer,layerStr=getLayerNames(layer).join(" "),mappedLayer=mapKicadLayerToLayerRef(layerStr),netNum=this.getSegmentNet(segment2),startPoint={x:start.x,y:start.y},endPoint={x:end.x,y:end.y};if(!this.pointsMatch(startPoint,endPoint))return{primitiveType:"wire",start:startPoint,end:endPoint,points:[startPoint,endPoint],width,layer:mappedLayer,netNum}}getTracePrimitiveFromArc(arc2){if(!this.ctx.k2cMatPcb)return;let{start,mid,end}=getArcStartMidEnd(arc2),width=arc2.width??arc2._sxWidth?.value??.2,layerStr=getLayerNames(arc2.layer).join(" "),mappedLayer=mapKicadLayerToLayerRef(layerStr),netNum=this.getSegmentNet(arc2),points=approximateArcPoints(start,mid,end,{segmentLength:Math.max(width,.1),minSegments:8}),startPoint=points[0],endPoint=points[points.length-1];if(!(!startPoint||!endPoint||this.pointsMatch(startPoint,endPoint)))return{primitiveType:"wire",start:startPoint,end:endPoint,points,width,layer:mappedLayer,netNum}}getTracePrimitiveFromVia(via){let netNum=this.getSegmentNet(via);if(netNum===null)return;let at3=via.at||{x:0,y:0},point7={x:at3.x,y:at3.y},viaLayers=via.layers?getCopperSpanLayerRefsFromLayers(via.layers,this.ctx.kicadPcb):[],layers=viaLayers.length>0?viaLayers:getPcbCopperLayerRefs(this.ctx.kicadPcb),fromLayer=layers[0],toLayer=layers[layers.length-1];if(!(!fromLayer||!toLayer||fromLayer===toLayer))return{primitiveType:"via",start:point7,end:point7,points:[point7],fromLayer,toLayer,outerDiameter:via.size||.8,holeDiameter:via.drill||.4,netNum}}createTracesFromPrimitives(primitives){let groupedPrimitives=new Map;for(let primitive of primitives){let key=this.getPrimitiveGroupKey(primitive),group=groupedPrimitives.get(key)??[];group.push(primitive),groupedPrimitives.set(key,group)}for(let group of groupedPrimitives.values())this.createTracesFromPrimitiveGroup(group)}createTracesFromPrimitiveGroup(primitives){let graph=this.createTraceGraph(primitives),visitedEdgeIds=new Set,isTerminal=nodeKey=>this.isTerminalNode(nodeKey,graph);for(let nodeKey of graph.adjacency.keys())if(isTerminal(nodeKey))for(let edgeId of graph.adjacency.get(nodeKey)??[]){if(visitedEdgeIds.has(edgeId))continue;let path=this.walkTracePath(nodeKey,edgeId,graph,visitedEdgeIds);this.insertTracePath(path)}for(let edge of graph.edges){if(visitedEdgeIds.has(edge.id))continue;let path=this.walkTracePath(edge.startKey,edge.id,graph,visitedEdgeIds);this.insertTracePath(path)}}createTraceGraph(primitives){let edges=[],adjacency=new Map;for(let primitive of primitives){let id2=edges.length,startLayer=primitive.primitiveType==="via"?primitive.fromLayer:primitive.layer,endLayer=primitive.primitiveType==="via"?primitive.toLayer:primitive.layer,startKey=this.getTraceGraphNodeKey(primitive.start,startLayer),endKey=this.getTraceGraphNodeKey(primitive.end,endLayer),edge={...primitive,id:id2,startKey,endKey};edges.push(edge);for(let nodeKey of[startKey,endKey]){let edgeIds=adjacency.get(nodeKey)??[];edgeIds.push(id2),adjacency.set(nodeKey,edgeIds)}}return{edges,adjacency}}walkTracePath(startNodeKey,firstEdgeId,graph,visitedEdgeIds){let path=[],currentNodeKey=startNodeKey,edgeId=firstEdgeId;for(;!visitedEdgeIds.has(edgeId);){let edge=graph.edges[edgeId];if(!edge)break;let reversed=edge.endKey===currentNodeKey;if(path.push({edge,reversed}),visitedEdgeIds.add(edgeId),currentNodeKey=reversed?edge.startKey:edge.endKey,this.isTerminalNode(currentNodeKey,graph))break;let nextEdgeId=(graph.adjacency.get(currentNodeKey)??[]).find(candidateEdgeId=>candidateEdgeId!==edgeId&&!visitedEdgeIds.has(candidateEdgeId));if(nextEdgeId===void 0)break;edgeId=nextEdgeId}return path}insertTracePath(path){if(!this.ctx.k2cMatPcb||!this.ctx.netNumToSourceNetId||path.length===0)return;let routePoints=this.getPathRoutePoints(path);if(routePoints.length<2)return;let firstNode=this.getTraceGraphNodeFromKey(this.getOrientedTraceEdgeStartKey(path[0])),lastNode=this.getTraceGraphNodeFromKey(this.getOrientedTraceEdgeEndKey(path[path.length-1])),netNum=path[0].edge.netNum,sourceNetId=netNum!==null?this.ctx.netNumToSourceNetId.get(netNum)??void 0:void 0,startPoint=applyToPoint(this.ctx.k2cMatPcb,firstNode.point),lastPoint=applyToPoint(this.ctx.k2cMatPcb,lastNode.point),startPcbPortId=this.findPortAtPosition(startPoint,firstNode.layer),endPcbPortId=this.findPortAtPosition(lastPoint,lastNode.layer),connectedSourcePortIds=this.getConnectedSourcePortIds([startPcbPortId,endPcbPortId]),traceConnectedSourcePortIds=this.getTraceConnectedSourcePortIds(path),inferredSourcePortIds=this.getSourcePortIdsForTrace({netNum,connectedSourcePortIds,traceConnectedSourcePortIds}),sourceTraceId=sourceNetId?this.createSourceTraceForPath({sourceNetId,connectedSourcePortIds:inferredSourcePortIds,netNum}):void 0,firstWireIndex=routePoints.findIndex(point7=>point7.routeType==="wire"),lastWireIndex=routePoints.findLastIndex(point7=>point7.routeType==="wire");if(firstWireIndex===-1)return;let route=routePoints.map((point7,index)=>point7.routeType==="via"?{route_type:"via",x:point7.x,y:point7.y,from_layer:point7.fromLayer,to_layer:point7.toLayer,...point7.outerDiameter?{outer_diameter:point7.outerDiameter}:{},...point7.holeDiameter?{hole_diameter:point7.holeDiameter}:{}}:{route_type:"wire",x:point7.x,y:point7.y,width:point7.width,layer:point7.layer,...index===firstWireIndex&&startPcbPortId?{start_pcb_port_id:startPcbPortId}:{},...index===lastWireIndex&&endPcbPortId?{end_pcb_port_id:endPcbPortId}:{}});this.ctx.db.pcb_trace.insert({route,source_trace_id:sourceTraceId,pcb_port_id:void 0}),this.ctx.stats&&(this.ctx.stats.traces=(this.ctx.stats.traces||0)+1)}getPathRoutePoints(path){let routePoints=[],lastRawPoint,lastWireLayer;for(let{edge,reversed}of path){if(edge.primitiveType==="via"){let point7=edge.start,transformedPoint=applyToPoint(this.ctx.k2cMatPcb,point7);routePoints.push({routeType:"via",x:transformedPoint.x,y:transformedPoint.y,fromLayer:reversed?edge.toLayer:edge.fromLayer,toLayer:reversed?edge.fromLayer:edge.toLayer,outerDiameter:edge.outerDiameter,holeDiameter:edge.holeDiameter});continue}let edgePoints=reversed?[...edge.points].reverse():edge.points,layer=edge.layer,width=edge.width;for(let point7 of edgePoints){if(lastRawPoint&&lastWireLayer===layer&&this.pointsMatch(lastRawPoint,point7))continue;let transformedPoint=applyToPoint(this.ctx.k2cMatPcb,point7);routePoints.push({routeType:"wire",x:transformedPoint.x,y:transformedPoint.y,width,layer}),lastRawPoint=point7,lastWireLayer=layer}}return routePoints}isTerminalNode(nodeKey,graph){if((graph.adjacency.get(nodeKey)??[]).length!==2)return!0;let{point:point7,layer}=this.getTraceGraphNodeFromKey(nodeKey),transformedPoint=applyToPoint(this.ctx.k2cMatPcb,point7);return!!this.findPortAtPosition(transformedPoint,layer)}getPrimitiveGroupKey(primitive){return`${primitive.netNum??"no-net"}`}getPointKey(point7){let x4=Math.round(point7.x*this.POINT_KEY_PRECISION),y4=Math.round(point7.y*this.POINT_KEY_PRECISION);return`${x4},${y4}`}getPointFromKey(pointKey){let[x4,y4]=pointKey.split(",").map(Number);return{x:(x4??0)/this.POINT_KEY_PRECISION,y:(y4??0)/this.POINT_KEY_PRECISION}}getTraceGraphNodeKey(point7,layer){return`${layer}:${this.getPointKey(point7)}`}getTraceGraphNodeFromKey(nodeKey){let[layer,...pointKeyParts]=nodeKey.split(":");return{layer,point:this.getPointFromKey(pointKeyParts.join(":"))}}getOrientedTraceEdgeStartKey({edge,reversed}){return reversed?edge.endKey:edge.startKey}getOrientedTraceEdgeEndKey({edge,reversed}){return reversed?edge.startKey:edge.endKey}pointsMatch(a3,b3){return this.getPointKey(a3)===this.getPointKey(b3)}getPcbTraceNodeKey({netNum,layer,point:point7}){return`${netNum??"no-net"}:${layer}:${this.getPointKey(point7)}`}annotatePrimitivesWithConnectedSourcePorts(primitives){if(!this.ctx.k2cMatPcb||primitives.length===0)return;let nodes=new Map,adjacency=new Map,ensureNode=(netNum,layer,point7)=>{let key=this.getPcbTraceNodeKey({netNum,layer,point:point7});return nodes.has(key)||nodes.set(key,{key,point:point7,layer,netNum}),adjacency.has(key)||adjacency.set(key,new Set),key},connectNodes=(a3,b3)=>{adjacency.get(a3)?.add(b3),adjacency.get(b3)?.add(a3)};for(let primitive of primitives){if(primitive.primitiveType!=="wire")continue;let startKey=ensureNode(primitive.netNum,primitive.layer,primitive.start),endKey=ensureNode(primitive.netNum,primitive.layer,primitive.end);connectNodes(startKey,endKey)}let vias=this.ctx.kicadPcb?.vias||[],viaArray=Array.isArray(vias)?vias:[vias];for(let via of viaArray){let netNum=this.getSegmentNet(via);if(netNum===null)continue;let at3=via.at||{x:0,y:0},point7={x:at3.x,y:at3.y},viaLayers=via.layers?getCopperSpanLayerRefsFromLayers(via.layers,this.ctx.kicadPcb):[],viaNodeKeys=(viaLayers.length>0?viaLayers:getPcbCopperLayerRefs(this.ctx.kicadPcb)).map(layer=>ensureNode(netNum,layer,point7));for(let i3=1;i3<viaNodeKeys.length;i3++)connectNodes(viaNodeKeys[0],viaNodeKeys[i3])}let connectedSourcePortIdsByNodeKey=new Map,visited=new Set;for(let startNodeKey of nodes.keys()){if(visited.has(startNodeKey))continue;let traceNodeKeys=[],traceConnectedSourcePortIds=new Set,stack=[startNodeKey];for(visited.add(startNodeKey);stack.length>0;){let nodeKey=stack.pop(),node=nodes.get(nodeKey);if(!node)continue;traceNodeKeys.push(nodeKey);let transformedPoint=applyToPoint(this.ctx.k2cMatPcb,node.point),pcbPortId=this.findPortAtPosition(transformedPoint,node.layer),sourcePortId=this.getConnectedSourcePortIds([pcbPortId])[0];sourcePortId&&traceConnectedSourcePortIds.add(sourcePortId);for(let neighborNodeKey of adjacency.get(nodeKey)??[])visited.has(neighborNodeKey)||(visited.add(neighborNodeKey),stack.push(neighborNodeKey))}let sourcePortIds=[...traceConnectedSourcePortIds];for(let nodeKey of traceNodeKeys)connectedSourcePortIdsByNodeKey.set(nodeKey,sourcePortIds)}for(let primitive of primitives){if(primitive.primitiveType!=="wire")continue;let nodeKey=this.getPcbTraceNodeKey({netNum:primitive.netNum,layer:primitive.layer,point:primitive.start});primitive.connectedSourcePortIds=connectedSourcePortIdsByNodeKey.get(nodeKey)??[]}}getSegmentNet(segment2){let net=segment2?.net;return net?typeof net=="number"?net:typeof net=="object"?net._id??net.number??net.ordinal??null:null:null}findPortAtPosition(point7,layer){let ports=this.ctx.db.pcb_port.list();for(let port of ports){let layers=port.layers;if(!(layers?.length&&!layers.includes(layer))&&Math.abs((port.x??0)-point7.x)<=this.PORT_MATCH_TOLERANCE&&Math.abs((port.y??0)-point7.y)<=this.PORT_MATCH_TOLERANCE)return port.pcb_port_id}}getConnectedSourcePortIds(pcbPortIds){let connectedSourcePortIds=[];for(let pcbPortId of pcbPortIds){if(!pcbPortId)continue;let sourcePortId=this.ctx.db.pcb_port.get(pcbPortId)?.source_port_id;!sourcePortId||connectedSourcePortIds.includes(sourcePortId)||connectedSourcePortIds.push(sourcePortId)}return connectedSourcePortIds}getSourcePortIdsForTrace({netNum,connectedSourcePortIds,traceConnectedSourcePortIds}){if(netNum===null||connectedSourcePortIds.length>=2)return connectedSourcePortIds;let inferredSourcePortIds=[...connectedSourcePortIds];for(let sourcePortId of traceConnectedSourcePortIds)if(inferredSourcePortIds.includes(sourcePortId)||inferredSourcePortIds.push(sourcePortId),inferredSourcePortIds.length>=2)return inferredSourcePortIds.slice(0,2);let netSourcePortIds=this.ctx.netNumToSourcePortIds?.get(netNum)??[];for(let sourcePortId of netSourcePortIds)if(inferredSourcePortIds.includes(sourcePortId)||inferredSourcePortIds.push(sourcePortId),inferredSourcePortIds.length>=2)return inferredSourcePortIds.slice(0,2);return inferredSourcePortIds}getTraceConnectedSourcePortIds(path){let sourcePortIds=[];for(let{edge}of path)for(let sourcePortId of edge.connectedSourcePortIds??[])sourcePortIds.includes(sourcePortId)||sourcePortIds.push(sourcePortId);return sourcePortIds}createSourceTraceForPath({sourceNetId,connectedSourcePortIds,netNum}){let netName=netNum!==null?this.ctx.netNumToName?.get(netNum)??`Net-${netNum}`:void 0;return this.ctx.db.source_trace.insert({connected_source_port_ids:connectedSourcePortIds,connected_source_net_ids:[sourceNetId],display_name:netName}).source_trace_id}},CollectViasStage=class extends ConverterStage{constructor(){super(...arguments);__publicField(this,"POINT_KEY_PRECISION",1e6)}step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let vias=this.ctx.kicadPcb.vias||[],viaArray=Array.isArray(vias)?vias:[vias];for(let via of viaArray)this.processVia(via);return this.finished=!0,!1}processVia(via){if(!this.ctx.k2cMatPcb||!this.ctx.netNumToName)return;let at3=via.at||{x:0,y:0},pos=applyToPoint(this.ctx.k2cMatPcb,{x:at3.x,y:at3.y}),size3=via.size||.8,drill=via.drill||.4,mappedLayers=via.layers?getCopperSpanLayerRefsFromLayers(via.layers,this.ctx.kicadPcb):[],layers=mappedLayers.length>0?mappedLayers:getPcbCopperLayerRefs(this.ctx.kicadPcb);if(this.hasMatchingTraceRouteVia(pos,layers)){this.ctx.stats&&(this.ctx.stats.vias=(this.ctx.stats.vias||0)+1);return}this.ctx.db.pcb_via.insert({x:pos.x,y:pos.y,outer_diameter:size3,hole_diameter:drill,layers}),this.ctx.stats&&(this.ctx.stats.vias=(this.ctx.stats.vias||0)+1)}hasMatchingTraceRouteVia(point7,layers){let pointKey=this.getPointKey(point7),layerSet=new Set(layers);return this.ctx.db.pcb_trace.list().some(trace=>(trace.route??[]).some(routePoint=>routePoint.route_type==="via"&&this.getPointKey(routePoint)===pointKey&&layerSet.has(routePoint.from_layer)&&layerSet.has(routePoint.to_layer)))}getPointKey(point7){let x4=Math.round(point7.x*this.POINT_KEY_PRECISION),y4=Math.round(point7.y*this.POINT_KEY_PRECISION);return`${x4},${y4}`}},CollectZonesStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let zones=this.ctx.kicadPcb.zones||[],zoneArray=Array.isArray(zones)?zones:[zones];for(let zone of zoneArray)this.isZoneFilled(zone)&&this.createCopperPourFromZone(zone);return this.finished=!0,!1}isZoneFilled(zone){if(!zone._rawChildren||!Array.isArray(zone._rawChildren))return!1;let fillEntry=zone._rawChildren.find(child=>Array.isArray(child)&&child[0]==="fill");return fillEntry&&fillEntry[1]==="yes"?!0:zone._rawChildren.some(child=>Array.isArray(child)&&child[0]==="filled_polygon")}createCopperPourFromZone(zone){if(!this.ctx.k2cMatPcb||!this.ctx.netNumToName||!zone._rawChildren||!Array.isArray(zone._rawChildren))return;let zoneData=this.parseZoneData(zone._rawChildren),filledPolygons=this.extractFilledPolygons(zone._rawChildren);if(filledPolygons.length===0){let mainPolygon=this.extractMainPolygon(zone._rawChildren);mainPolygon.length>0&&filledPolygons.push(mainPolygon)}if(filledPolygons.length===0){this.ctx.warnings&&this.ctx.warnings.push(`Zone on layer ${zoneData.layer||"unknown"} has no valid polygon points`);return}let layer=mapKicadLayerToLayerRef(zoneData.layer),netNum=zoneData.net||0,netName=this.ctx.netNumToName.get(netNum)||zoneData.netName||"";for(let polygonPoints of filledPolygons){let transformedPoints=polygonPoints.map(point7=>applyToPoint(this.ctx.k2cMatPcb,{x:point7.x,y:point7.y}));this.ctx.db.pcb_copper_pour.insert({layer,net_name:netName,points:transformedPoints,shape:"polygon"}),this.ctx.stats&&(this.ctx.stats.copper_pours=(this.ctx.stats.copper_pours||0)+1)}}parseZoneData(children){let data={};for(let child of children)if(Array.isArray(child))switch(child[0]){case"net":data.net=child[1];break;case"net_name":data.netName=child[1];break;case"layer":data.layer=child[1];break}return data}extractMainPolygon(children){let polygonEntry=children.find(child=>Array.isArray(child)&&child[0]==="polygon");return polygonEntry?this.extractPointsFromPolygonEntry(polygonEntry):[]}extractFilledPolygons(children){let filledPolygonEntries=children.filter(child=>Array.isArray(child)&&child[0]==="filled_polygon"),polygons=[];for(let entry of filledPolygonEntries){let points=this.extractPointsFromPolygonEntry(entry);points.length>0&&polygons.push(points)}return polygons}extractPointsFromPolygonEntry(polygonEntry){let points=[],ptsEntry=polygonEntry.find(child=>Array.isArray(child)&&child[0]==="pts");if(!ptsEntry)return[];for(let i3=1;i3<ptsEntry.length;i3++){let item=ptsEntry[i3];if(Array.isArray(item)&&item[0]==="xy"&&item.length>=3){let x4=item[1],y4=item[2];typeof x4=="number"&&typeof y4=="number"&&points.push({x:x4,y:y4})}}return points}},InitializePcbContextStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb)return this.finished=!0,!1;let center2=this.calculateBoardCenter();return this.ctx.k2cMatPcb=compose(scale(1,-1),translate(-center2.x,-center2.y)),this.ctx.netNumToName=new Map,this.ctx.netNumToSourceNetId=new Map,this.ctx.netNumToSourcePortIds=new Map,this.ctx.footprintUuidToComponentId=new Map,this.ctx.footprintUuidToSourceComponentId=new Map,this.finished=!0,!1}calculateBoardCenter(){if(!this.ctx.kicadPcb)return{x:0,y:0};let lines=this.ctx.kicadPcb.graphicLines||[],lineArray=Array.isArray(lines)?lines:[lines],arcArray=getGraphicArcs(this.ctx.kicadPcb),circleArray=getGraphicCircles(this.ctx.kicadPcb),curveArray=getGraphicCurves(this.ctx.kicadPcb),xs3=[],ys3=[];for(let line2 of lineArray){if(!getGraphicLayerNames(line2).join(" ").includes("Edge.Cuts"))continue;let{start,end}=getLineStartEnd(line2);xs3.push(start.x,end.x),ys3.push(start.y,end.y)}for(let arc2 of arcArray){if(!getGraphicLayerNames(arc2).join(" ").includes("Edge.Cuts"))continue;let{start,mid,end}=getArcStartMidEnd(arc2);for(let point7 of approximateArcPoints(start,mid,end,{segmentLength:.25,minSegments:16}))xs3.push(point7.x),ys3.push(point7.y)}for(let circle2 of circleArray){if(!getGraphicLayerNames(circle2).join(" ").includes("Edge.Cuts"))continue;let{center:center2,end}=getCircleCenterEnd(circle2);for(let point7 of approximateCirclePoints(center2,end,{segmentLength:.25,minSegments:16}))xs3.push(point7.x),ys3.push(point7.y)}for(let curve of curveArray){if(!getGraphicLayerNames(curve).join(" ").includes("Edge.Cuts"))continue;let points=getCurvePoints(curve);if(points)for(let point7 of approximateCubicBezierPoints(points.start,points.control1,points.control2,points.end,{segmentLength:.25,minSegments:16}))xs3.push(point7.x),ys3.push(point7.y)}if(xs3.length===0||ys3.length===0)return{x:0,y:0};let minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{x:(minX+maxX)/2,y:(minY+maxY)/2}}};function rotationToDirection(rotation5){let normalized=(rotation5%360+360)%360;return normalized>=315||normalized<45?"up":normalized>=45&&normalized<135?"right":normalized>=135&&normalized<225?"down":"left"}function inferSymbolName({libId,reference,rotation:rotation5}){let lower=libId.toLowerCase(),direction2=rotationToDirection(rotation5);if(lower.includes(":r_")||lower.includes(":r")&&reference.startsWith("R"))return`boxresistor_${direction2}`;if(lower.includes(":c_")||lower.includes(":c")&&reference.startsWith("C"))return lower.includes("polarized")||lower.includes("_pol")?`capacitor_${direction2}`:`capacitor_${direction2}`;if(lower.includes(":l_")||lower.includes(":l")&&reference.startsWith("L"))return`inductor_${direction2}`;if(lower.includes(":d_")||lower.includes("diode")||reference.startsWith("D"))return lower.includes("led")?`led_${direction2}`:lower.includes("schottky")?`schottky_diode_${direction2}`:lower.includes("zener")?`zener_diode_${direction2}`:`diode_${direction2}`;if(lower.includes(":q_")||reference.startsWith("Q"))return lower.includes("npn")?`npn_bipolar_transistor_${direction2}`:lower.includes("pnp")?`pnp_bipolar_transistor_${direction2}`:lower.includes("_n_")||lower.includes("nmos")?`n_channel_mosfet_transistor_${direction2}`:lower.includes("_p_")||lower.includes("pmos")?`p_channel_mosfet_transistor_${direction2}`:`npn_bipolar_transistor_${direction2}`;lower.includes("gnd")||lower.includes("ground")||lower.includes("vcc")||lower.includes("vdd")||lower.includes("power")}var CollectLibrarySymbolsStage=class extends ConverterStage{constructor(){super(...arguments);__publicField(this,"processedSymbols",new Set)}step(){if(!this.ctx.kicadSch||!this.ctx.k2cMatSch)return this.finished=!0,!1;let symbols=this.ctx.kicadSch.symbols||[];for(let symbol of symbols){let uuid=symbol.uuid;!uuid||this.processedSymbols.has(uuid)||(this.processSymbol(symbol),this.processedSymbols.add(uuid))}return this.finished=!0,!1}processSymbol(symbol){if(!this.ctx.k2cMatSch)return;let reference=this.getProperty(symbol,"Reference")||"U?",value=this.getProperty(symbol,"Value")||"",libId=symbol.libraryId||"",at3=symbol.at,kicadPos={x:at3?.x??0,y:at3?.y??0},cjPos=applyToPoint(this.ctx.k2cMatSch,kicadPos),rotation5=at3?.angle??0,ftype=this.inferFtype(libId,reference),sourceComponentId=`${libId}_source`;this.ctx.db.source_component.list().find(sc2=>sc2.source_component_id===sourceComponentId)||this.ctx.db.source_component.insert({name:libId||reference,ftype,manufacturer_part_number:value||void 0});let uuid=symbol.uuid;if(!uuid)return;let symbolName=inferSymbolName({libId,reference,rotation:rotation5}),componentId=this.ctx.db.schematic_component.insert({source_component_id:sourceComponentId,center:{x:cjPos.x,y:cjPos.y},size:this.estimateSize(symbol),...symbolName?{symbol_name:symbolName}:{}}).schematic_component_id;this.ctx.symbolUuidToComponentId?.set(uuid,componentId),this.createPorts(symbol,componentId),this.ctx.stats&&(this.ctx.stats.components=(this.ctx.stats.components||0)+1)}getProperty(symbol,propName){return(symbol.properties||[]).find(p4=>p4.key===propName)?.value}inferFtype(libId,reference){let lower=libId.toLowerCase();return lower.includes(":r_")||reference.startsWith("R")?"simple_resistor":lower.includes(":c_")||reference.startsWith("C")?"simple_capacitor":lower.includes(":l_")||reference.startsWith("L")?"simple_inductor":lower.includes(":d_")||reference.startsWith("D")?"simple_diode":lower.includes(":led")||reference.startsWith("LED")?"simple_led":lower.includes(":q_")||reference.startsWith("Q")?"simple_transistor":"simple_chip"}estimateSize(symbol){return{width:1,height:1}}createPorts(symbol,componentId){let libId=symbol.libraryId,libSymbol=this.ctx.kicadSch?.libSymbols?.symbols?.find(ls3=>ls3.libraryId===libId);if(!libSymbol)return;let allPins=[];if(libSymbol.pins&&Array.isArray(libSymbol.pins)&&libSymbol.pins.length>0?allPins.push(...libSymbol.pins):libSymbol.pins&&!Array.isArray(libSymbol.pins)&&allPins.push(libSymbol.pins),libSymbol.subSymbols&&Array.isArray(libSymbol.subSymbols))for(let subSymbol of libSymbol.subSymbols)subSymbol.pins&&Array.isArray(subSymbol.pins)&&subSymbol.pins.length>0?allPins.push(...subSymbol.pins):subSymbol.pins&&!Array.isArray(subSymbol.pins)&&allPins.push(subSymbol.pins);if(allPins.length===0)return;let componentRotation=symbol.at?.angle??0;for(let pin of allPins){let pinAt=pin._sxAt;if(!pinAt)continue;let rotRad=componentRotation*Math.PI/180,cosR=Math.cos(rotRad),sinR=Math.sin(rotRad),rotatedPinPos={x:pinAt.x*cosR-pinAt.y*sinR,y:pinAt.x*sinR+pinAt.y*cosR},scaleFactor=Math.abs(this.ctx.k2cMatSch?.a||1/15),relativePos={x:rotatedPinPos.x*scaleFactor,y:-rotatedPinPos.y*scaleFactor};this.ctx.db.schematic_port.insert({schematic_component_id:componentId,center:relativePos,facing_direction:this.inferPinDirection(pin,componentRotation),pin_number:pin._sxNumber?.value??pin.pinNumber??void 0})}}inferPinDirection(pin,componentRotation){let totalAngle=(pin.at?.angle??0)+componentRotation;return rotationToDirection(totalAngle)}},CollectSchematicTracesStage=class extends ConverterStage{step(){if(!this.ctx.kicadSch||!this.ctx.k2cMatSch)return this.finished=!0,!1;let wires=this.ctx.kicadSch.wires||[],wireArray=Array.isArray(wires)?wires:[wires];for(let wire of wireArray)this.processWire(wire);let junctions=this.ctx.kicadSch.junctions||[],junctionArray=Array.isArray(junctions)?junctions:[junctions];for(let junction of junctionArray)this.processJunction(junction);return this.finished=!0,!1}processWire(wire){if(!this.ctx.k2cMatSch||!wire.pts)return;let pts=Array.isArray(wire.pts.xy)?wire.pts.xy:[wire.pts.xy];if(pts.length<2)return;let edges=[];for(let i3=0;i3<pts.length-1;i3++){let from=applyToPoint(this.ctx.k2cMatSch,{x:pts[i3].x,y:pts[i3].y}),to3=applyToPoint(this.ctx.k2cMatSch,{x:pts[i3+1].x,y:pts[i3+1].y});edges.push({from,to:to3})}this.ctx.db.schematic_trace.insert({edges}),this.ctx.stats&&(this.ctx.stats.traces=(this.ctx.stats.traces||0)+1)}processJunction(junction){if(!this.ctx.k2cMatSch||!junction.at)return;let pos=applyToPoint(this.ctx.k2cMatSch,{x:junction.at.x,y:junction.at.y});this.ctx.db.schematic_trace.insert({edges:[],junctions:[pos]})}},InitializeSchematicContextStage=class extends ConverterStage{step(){if(!this.ctx.kicadSch)return this.finished=!0,!1;let KICAD_CENTER_X=105,KICAD_CENTER_Y=148.5,kicadCenterX=KICAD_CENTER_X,kicadCenterY=KICAD_CENTER_Y,cjCenterX=0,cjCenterY=0;return this.ctx.k2cMatSch=compose(translate(cjCenterX,cjCenterY),scale(1/15,-1/15),translate(-kicadCenterX,-kicadCenterY)),this.ctx.symbolUuidToComponentId=new Map,this.ctx.warnings=this.ctx.warnings||[],this.ctx.stats=this.ctx.stats||{},this.finished=!0,!1}},KicadToCircuitJsonConverter=class{constructor(){__publicField(this,"fsMap",{});__publicField(this,"ctx");__publicField(this,"currentStageIndex",0);__publicField(this,"pipeline")}get currentStage(){return this.pipeline?.[this.currentStageIndex]}addFile(filePath,content){this.fsMap[filePath]=content}_findFileWithExtension(extension){let filesWithExtension=Object.keys(this.fsMap).filter(key=>key.endsWith(extension));if(filesWithExtension.length>1)throw new Error(`Expected 0 or 1 file with extension ${extension}, got ${filesWithExtension.length}. Files: ${filesWithExtension.join(", ")}`);return filesWithExtension[0]??null}initializePipeline(){let pcbFile=this._findFileWithExtension(".kicad_pcb"),schFile=this._findFileWithExtension(".kicad_sch");this.ctx={db:cju_default([]),kicadPcb:pcbFile?parseKicadPcb(this.fsMap[pcbFile]):void 0,kicadSch:schFile?parseKicadSch(this.fsMap[schFile]):void 0,warnings:[],stats:{}},this.pipeline=[],this.ctx.kicadSch&&this.pipeline.push(new InitializeSchematicContextStage(this.ctx),new CollectLibrarySymbolsStage(this.ctx),new CollectSchematicTracesStage(this.ctx)),this.ctx.kicadPcb&&this.pipeline.push(new InitializePcbContextStage(this.ctx),new CollectNetsStage(this.ctx),new CollectFootprintsStage(this.ctx),new CollectSourceTracesStage(this.ctx),new CollectTracesStage(this.ctx),new CollectViasStage(this.ctx),new CollectZonesStage(this.ctx),new CollectGraphicsStage(this.ctx))}step(){return this.pipeline||this.initializePipeline(),this.currentStage?((!this.currentStage.step()||this.currentStage.finished)&&this.currentStageIndex++,this.currentStageIndex<(this.pipeline?.length||0)):!1}runUntilFinished(){this.pipeline||this.initializePipeline();for(let stage of this.pipeline||[])stage.runUntilFinished()}getOutput(){this.ctx||(this.initializePipeline(),this.runUntilFinished());let elements=[],tableNames=["source_component","source_port","source_net","source_trace","schematic_component","schematic_port","schematic_trace","schematic_net_label","pcb_component","pcb_port","pcb_smtpad","pcb_plated_hole","pcb_hole","pcb_trace","pcb_via","pcb_copper_pour","pcb_board","pcb_copper_text","pcb_silkscreen_text","pcb_silkscreen_path","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_fabrication_note_rect","pcb_courtyard_rect","pcb_courtyard_outline","pcb_courtyard_circle"];for(let tableName of tableNames){let table=this.ctx.db[tableName];if(table&&typeof table.list=="function"){let items=table.list();items&&Array.isArray(items)&&elements.push(...items)}}return elements}getOutputString(){return JSON.stringify(this.getOutput(),null,2)}getWarnings(){return this.ctx?.warnings||[]}getStats(){return this.ctx?.stats||{}}};var React=__toESM(require_react(),1),KICAD_FOOTPRINT_CACHE_URL="https://kicad-mod-cache.tscircuit.com",ngspiceEngineCache=null,loadKicadPcbStaticFile=async fileContent=>{let kicadPcbContent=typeof fileContent=="string"?fileContent:new TextDecoder().decode(fileContent);if(kicadPcbContent==="__STATIC_ASSET__"||kicadPcbContent.startsWith("blob:"))throw new Error(".kicad_pcb imports require local file contents. Static asset URLs are not supported.");let converter=new KicadToCircuitJsonConverter;converter.addFile("imported.kicad_pcb",kicadPcbContent),converter.runUntilFinished();let circuitJson=converter.getOutput(),boardContentCircuitJson=circuitJson.filter(elm=>elm.type!=="pcb_board");return{__esModule:!0,default:circuitJson,Board:props=>React.createElement("board",{...props,circuitJson}),boardContentCircuitJson,circuitJson}},getPlatformConfig=(overrides={},options={})=>{let partsEngine2=overrides.partsEngine??jlcPartsEngine;return!overrides.partsEngine&&options.easyEdaProxyConfig&&(partsEngine2=new JlcPcbPartsEngine({platformFetch:overrides.platformFetch,easyEdaProxyConfig:options.easyEdaProxyConfig})),{localCacheEngine:overrides.localCacheEngine,partsEngine:partsEngine2,autorouterMap:{krt:{createAutorouter:createKiCadRoutingToolsAutorouter({gridStep:.1,clearance:.2,maxIterations:3e5})},...overrides.autorouterMap},spiceEngineMap:{ngspice:{simulate:async spice=>{if(!ngspiceEngineCache){let createNgspiceSpiceEngine=await dynamicallyLoadDependencyWithCdnBackup("@tscircuit/ngspice-spice-engine").catch(error2=>{throw new Error("Could not load ngspice engine from local node_modules or CDN fallback.",{cause:error2})});createNgspiceSpiceEngine&&(ngspiceEngineCache=await createNgspiceSpiceEngine())}if(!ngspiceEngineCache)throw new Error("Could not load ngspice engine from local node_modules or CDN fallback.");return ngspiceEngineCache.simulate(spice)}}},footprintLibraryMap:{kicad:async footprintName=>{let baseUrl=`${KICAD_FOOTPRINT_CACHE_URL}/${footprintName}`,circuitJsonUrl=`${baseUrl}.circuit.json`,res2=await fetch(circuitJsonUrl);if(!res2.ok){let bodyPreview=(await res2.text()).slice(0,200);throw new Error(`Failed to load KiCad footprint "${footprintName}" from ${circuitJsonUrl} (HTTP ${res2.status}). ${bodyPreview}`)}let raw;try{raw=await res2.json()}catch{throw new Error(`Failed to parse KiCad footprint JSON for "${footprintName}" from ${circuitJsonUrl}`)}let filtered=Array.isArray(raw)?raw.filter(el3=>el3?.type==="pcb_silkscreen_text"?el3?.text==="REF**":!0):[raw],wrlUrl=`${baseUrl}.wrl`,stepUrl=`${baseUrl}.step`;return{footprintCircuitJson:filtered,cadModel:{wrlUrl,stepUrl,modelUnitToMmScale:2.54}}}},footprintFileParserMap:{kicad_mod:{loadFromUrl:async url2=>{let kicadContent=await fetch(url2).then(res2=>res2.text()),kicadJson=await parseKicadModToCircuitJson(kicadContent);return{footprintCircuitJson:Array.isArray(kicadJson)?kicadJson:[kicadJson]}}}},staticFileLoaderMap:{kicad_pcb:loadKicadPcbStaticFile,...overrides.staticFileLoaderMap}}};var tslib_es6_exports={};__export(tslib_es6_exports,{__addDisposableResource:()=>__addDisposableResource,__assign:()=>__assign,__asyncDelegator:()=>__asyncDelegator,__asyncGenerator:()=>__asyncGenerator,__asyncValues:()=>__asyncValues,__await:()=>__await,__awaiter:()=>__awaiter,__classPrivateFieldGet:()=>__classPrivateFieldGet,__classPrivateFieldIn:()=>__classPrivateFieldIn,__classPrivateFieldSet:()=>__classPrivateFieldSet,__createBinding:()=>__createBinding,__decorate:()=>__decorate,__disposeResources:()=>__disposeResources,__esDecorate:()=>__esDecorate,__exportStar:()=>__exportStar,__extends:()=>__extends,__generator:()=>__generator,__importDefault:()=>__importDefault,__importStar:()=>__importStar,__makeTemplateObject:()=>__makeTemplateObject,__metadata:()=>__metadata,__param:()=>__param,__propKey:()=>__propKey,__read:()=>__read,__rest:()=>__rest,__rewriteRelativeImportExtension:()=>__rewriteRelativeImportExtension,__runInitializers:()=>__runInitializers,__setFunctionName:()=>__setFunctionName,__spread:()=>__spread,__spreadArray:()=>__spreadArray,__spreadArrays:()=>__spreadArrays,__values:()=>__values,default:()=>tslib_es6_default});var extendStatics=function(d4,b3){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d5,b4){d5.__proto__=b4}||function(d5,b4){for(var p4 in b4)Object.prototype.hasOwnProperty.call(b4,p4)&&(d5[p4]=b4[p4])},extendStatics(d4,b3)};function __extends(d4,b3){if(typeof b3!="function"&&b3!==null)throw new TypeError("Class extends value "+String(b3)+" is not a constructor or null");extendStatics(d4,b3);function __2(){this.constructor=d4}d4.prototype=b3===null?Object.create(b3):(__2.prototype=b3.prototype,new __2)}var __assign=function(){return __assign=Object.assign||function(t52){for(var s3,i3=1,n4=arguments.length;i3<n4;i3++){s3=arguments[i3];for(var p4 in s3)Object.prototype.hasOwnProperty.call(s3,p4)&&(t52[p4]=s3[p4])}return t52},__assign.apply(this,arguments)};function __rest(s3,e5){var t52={};for(var p4 in s3)Object.prototype.hasOwnProperty.call(s3,p4)&&e5.indexOf(p4)<0&&(t52[p4]=s3[p4]);if(s3!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i3=0,p4=Object.getOwnPropertySymbols(s3);i3<p4.length;i3++)e5.indexOf(p4[i3])<0&&Object.prototype.propertyIsEnumerable.call(s3,p4[i3])&&(t52[p4[i3]]=s3[p4[i3]]);return t52}function __decorate(decorators,target,key,desc){var c4=arguments.length,r5=c4<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d4;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r5=Reflect.decorate(decorators,target,key,desc);else for(var i3=decorators.length-1;i3>=0;i3--)(d4=decorators[i3])&&(r5=(c4<3?d4(r5):c4>3?d4(target,key,r5):d4(target,key))||r5);return c4>3&&r5&&Object.defineProperty(target,key,r5),r5}function __param(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}}function __esDecorate(ctor,descriptorIn,decorators,contextIn,initializers,extraInitializers){function accept(f3){if(f3!==void 0&&typeof f3!="function")throw new TypeError("Function expected");return f3}for(var kind=contextIn.kind,key=kind==="getter"?"get":kind==="setter"?"set":"value",target=!descriptorIn&&ctor?contextIn.static?ctor:ctor.prototype:null,descriptor=descriptorIn||(target?Object.getOwnPropertyDescriptor(target,contextIn.name):{}),_4,done=!1,i3=decorators.length-1;i3>=0;i3--){var context={};for(var p4 in contextIn)context[p4]=p4==="access"?{}:contextIn[p4];for(var p4 in contextIn.access)context.access[p4]=contextIn.access[p4];context.addInitializer=function(f3){if(done)throw new TypeError("Cannot add initializers after decoration has completed");extraInitializers.push(accept(f3||null))};var result=(0,decorators[i3])(kind==="accessor"?{get:descriptor.get,set:descriptor.set}:descriptor[key],context);if(kind==="accessor"){if(result===void 0)continue;if(result===null||typeof result!="object")throw new TypeError("Object expected");(_4=accept(result.get))&&(descriptor.get=_4),(_4=accept(result.set))&&(descriptor.set=_4),(_4=accept(result.init))&&initializers.unshift(_4)}else(_4=accept(result))&&(kind==="field"?initializers.unshift(_4):descriptor[key]=_4)}target&&Object.defineProperty(target,contextIn.name,descriptor),done=!0}function __runInitializers(thisArg,initializers,value){for(var useValue=arguments.length>2,i3=0;i3<initializers.length;i3++)value=useValue?initializers[i3].call(thisArg,value):initializers[i3].call(thisArg);return useValue?value:void 0}function __propKey(x4){return typeof x4=="symbol"?x4:"".concat(x4)}function __setFunctionName(f3,name,prefix){return typeof name=="symbol"&&(name=name.description?"[".concat(name.description,"]"):""),Object.defineProperty(f3,"name",{configurable:!0,value:prefix?"".concat(prefix," ",name):name})}function __metadata(metadataKey,metadataValue){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(metadataKey,metadataValue)}function __awaiter(thisArg,_arguments,P4,generator){function adopt(value){return value instanceof P4?value:new P4(function(resolve){resolve(value)})}return new(P4||(P4=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e5){reject(e5)}}function rejected(value){try{step(generator.throw(value))}catch(e5){reject(e5)}}function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}function __generator(thisArg,body){var _4={label:0,sent:function(){if(t52[0]&1)throw t52[1];return t52[1]},trys:[],ops:[]},f3,y4,t52,g6=Object.create((typeof Iterator=="function"?Iterator:Object).prototype);return g6.next=verb(0),g6.throw=verb(1),g6.return=verb(2),typeof Symbol=="function"&&(g6[Symbol.iterator]=function(){return this}),g6;function verb(n4){return function(v4){return step([n4,v4])}}function step(op3){if(f3)throw new TypeError("Generator is already executing.");for(;g6&&(g6=0,op3[0]&&(_4=0)),_4;)try{if(f3=1,y4&&(t52=op3[0]&2?y4.return:op3[0]?y4.throw||((t52=y4.return)&&t52.call(y4),0):y4.next)&&!(t52=t52.call(y4,op3[1])).done)return t52;switch(y4=0,t52&&(op3=[op3[0]&2,t52.value]),op3[0]){case 0:case 1:t52=op3;break;case 4:return _4.label++,{value:op3[1],done:!1};case 5:_4.label++,y4=op3[1],op3=[0];continue;case 7:op3=_4.ops.pop(),_4.trys.pop();continue;default:if(t52=_4.trys,!(t52=t52.length>0&&t52[t52.length-1])&&(op3[0]===6||op3[0]===2)){_4=0;continue}if(op3[0]===3&&(!t52||op3[1]>t52[0]&&op3[1]<t52[3])){_4.label=op3[1];break}if(op3[0]===6&&_4.label<t52[1]){_4.label=t52[1],t52=op3;break}if(t52&&_4.label<t52[2]){_4.label=t52[2],_4.ops.push(op3);break}t52[2]&&_4.ops.pop(),_4.trys.pop();continue}op3=body.call(thisArg,_4)}catch(e5){op3=[6,e5],y4=0}finally{f3=t52=0}if(op3[0]&5)throw op3[1];return{value:op3[0]?op3[1]:void 0,done:!0}}}var __createBinding=Object.create?(function(o4,m4,k4,k22){k22===void 0&&(k22=k4);var desc=Object.getOwnPropertyDescriptor(m4,k4);(!desc||("get"in desc?!m4.__esModule:desc.writable||desc.configurable))&&(desc={enumerable:!0,get:function(){return m4[k4]}}),Object.defineProperty(o4,k22,desc)}):(function(o4,m4,k4,k22){k22===void 0&&(k22=k4),o4[k22]=m4[k4]});function __exportStar(m4,o4){for(var p4 in m4)p4!=="default"&&!Object.prototype.hasOwnProperty.call(o4,p4)&&__createBinding(o4,m4,p4)}function __values(o4){var s3=typeof Symbol=="function"&&Symbol.iterator,m4=s3&&o4[s3],i3=0;if(m4)return m4.call(o4);if(o4&&typeof o4.length=="number")return{next:function(){return o4&&i3>=o4.length&&(o4=void 0),{value:o4&&o4[i3++],done:!o4}}};throw new TypeError(s3?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(o4,n4){var m4=typeof Symbol=="function"&&o4[Symbol.iterator];if(!m4)return o4;var i3=m4.call(o4),r5,ar3=[],e5;try{for(;(n4===void 0||n4-- >0)&&!(r5=i3.next()).done;)ar3.push(r5.value)}catch(error2){e5={error:error2}}finally{try{r5&&!r5.done&&(m4=i3.return)&&m4.call(i3)}finally{if(e5)throw e5.error}}return ar3}function __spread(){for(var ar3=[],i3=0;i3<arguments.length;i3++)ar3=ar3.concat(__read(arguments[i3]));return ar3}function __spreadArrays(){for(var s3=0,i3=0,il3=arguments.length;i3<il3;i3++)s3+=arguments[i3].length;for(var r5=Array(s3),k4=0,i3=0;i3<il3;i3++)for(var a3=arguments[i3],j4=0,jl3=a3.length;j4<jl3;j4++,k4++)r5[k4]=a3[j4];return r5}function __spreadArray(to3,from,pack2){if(pack2||arguments.length===2)for(var i3=0,l4=from.length,ar3;i3<l4;i3++)(ar3||!(i3 in from))&&(ar3||(ar3=Array.prototype.slice.call(from,0,i3)),ar3[i3]=from[i3]);return to3.concat(ar3||Array.prototype.slice.call(from))}function __await(v4){return this instanceof __await?(this.v=v4,this):new __await(v4)}function __asyncGenerator(thisArg,_arguments,generator){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var g6=generator.apply(thisArg,_arguments||[]),i3,q4=[];return i3=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),verb("next"),verb("throw"),verb("return",awaitReturn),i3[Symbol.asyncIterator]=function(){return this},i3;function awaitReturn(f3){return function(v4){return Promise.resolve(v4).then(f3,reject)}}function verb(n4,f3){g6[n4]&&(i3[n4]=function(v4){return new Promise(function(a3,b3){q4.push([n4,v4,a3,b3])>1||resume(n4,v4)})},f3&&(i3[n4]=f3(i3[n4])))}function resume(n4,v4){try{step(g6[n4](v4))}catch(e5){settle(q4[0][3],e5)}}function step(r5){r5.value instanceof __await?Promise.resolve(r5.value.v).then(fulfill,reject):settle(q4[0][2],r5)}function fulfill(value){resume("next",value)}function reject(value){resume("throw",value)}function settle(f3,v4){f3(v4),q4.shift(),q4.length&&resume(q4[0][0],q4[0][1])}}function __asyncDelegator(o4){var i3,p4;return i3={},verb("next"),verb("throw",function(e5){throw e5}),verb("return"),i3[Symbol.iterator]=function(){return this},i3;function verb(n4,f3){i3[n4]=o4[n4]?function(v4){return(p4=!p4)?{value:__await(o4[n4](v4)),done:!1}:f3?f3(v4):v4}:f3}}function __asyncValues(o4){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var m4=o4[Symbol.asyncIterator],i3;return m4?m4.call(o4):(o4=typeof __values=="function"?__values(o4):o4[Symbol.iterator](),i3={},verb("next"),verb("throw"),verb("return"),i3[Symbol.asyncIterator]=function(){return this},i3);function verb(n4){i3[n4]=o4[n4]&&function(v4){return new Promise(function(resolve,reject){v4=o4[n4](v4),settle(resolve,reject,v4.done,v4.value)})}}function settle(resolve,reject,d4,v4){Promise.resolve(v4).then(function(v5){resolve({value:v5,done:d4})},reject)}}function __makeTemplateObject(cooked,raw){return Object.defineProperty?Object.defineProperty(cooked,"raw",{value:raw}):cooked.raw=raw,cooked}var __setModuleDefault=Object.create?(function(o4,v4){Object.defineProperty(o4,"default",{enumerable:!0,value:v4})}):function(o4,v4){o4.default=v4},ownKeys=function(o4){return ownKeys=Object.getOwnPropertyNames||function(o6){var ar3=[];for(var k4 in o6)Object.prototype.hasOwnProperty.call(o6,k4)&&(ar3[ar3.length]=k4);return ar3},ownKeys(o4)};function __importStar(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k4=ownKeys(mod),i3=0;i3<k4.length;i3++)k4[i3]!=="default"&&__createBinding(result,mod,k4[i3]);return __setModuleDefault(result,mod),result}function __importDefault(mod){return mod&&mod.__esModule?mod:{default:mod}}function __classPrivateFieldGet(receiver,state2,kind,f3){if(kind==="a"&&!f3)throw new TypeError("Private accessor was defined without a getter");if(typeof state2=="function"?receiver!==state2||!f3:!state2.has(receiver))throw new TypeError("Cannot read private member from an object whose class did not declare it");return kind==="m"?f3:kind==="a"?f3.call(receiver):f3?f3.value:state2.get(receiver)}function __classPrivateFieldSet(receiver,state2,value,kind,f3){if(kind==="m")throw new TypeError("Private method is not writable");if(kind==="a"&&!f3)throw new TypeError("Private accessor was defined without a setter");if(typeof state2=="function"?receiver!==state2||!f3:!state2.has(receiver))throw new TypeError("Cannot write private member to an object whose class did not declare it");return kind==="a"?f3.call(receiver,value):f3?f3.value=value:state2.set(receiver,value),value}function __classPrivateFieldIn(state2,receiver){if(receiver===null||typeof receiver!="object"&&typeof receiver!="function")throw new TypeError("Cannot use 'in' operator on non-object");return typeof state2=="function"?receiver===state2:state2.has(receiver)}function __addDisposableResource(env,value,async){if(value!=null){if(typeof value!="object"&&typeof value!="function")throw new TypeError("Object expected.");var dispose,inner;if(async){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");dispose=value[Symbol.asyncDispose]}if(dispose===void 0){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");dispose=value[Symbol.dispose],async&&(inner=dispose)}if(typeof dispose!="function")throw new TypeError("Object not disposable.");inner&&(dispose=function(){try{inner.call(this)}catch(e5){return Promise.reject(e5)}}),env.stack.push({value,dispose,async})}else async&&env.stack.push({async:!0});return value}var _SuppressedError=typeof SuppressedError=="function"?SuppressedError:function(error2,suppressed,message){var e5=new Error(message);return e5.name="SuppressedError",e5.error=error2,e5.suppressed=suppressed,e5};function __disposeResources(env){function fail(e5){env.error=env.hasError?new _SuppressedError(e5,env.error,"An error was suppressed during disposal."):e5,env.hasError=!0}var r5,s3=0;function next2(){for(;r5=env.stack.pop();)try{if(!r5.async&&s3===1)return s3=0,env.stack.push(r5),Promise.resolve().then(next2);if(r5.dispose){var result=r5.dispose.call(r5.value);if(r5.async)return s3|=2,Promise.resolve(result).then(next2,function(e5){return fail(e5),next2()})}else s3|=1}catch(e5){fail(e5)}if(s3===1)return env.hasError?Promise.reject(env.error):Promise.resolve();if(env.hasError)throw env.error}return next2()}function __rewriteRelativeImportExtension(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m4,tsx,d4,ext,cm3){return tsx?preserveJsx?".jsx":".js":d4&&(!ext||!cm3)?m4:d4+ext+"."+cm3.toLowerCase()+"js"}):path}var tslib_es6_default={__extends,__assign,__rest,__decorate,__param,__esDecorate,__runInitializers,__propKey,__setFunctionName,__metadata,__awaiter,__generator,__createBinding,__exportStar,__values,__read,__spread,__spreadArrays,__spreadArray,__await,__asyncGenerator,__asyncDelegator,__asyncValues,__makeTemplateObject,__importStar,__importDefault,__classPrivateFieldGet,__classPrivateFieldSet,__classPrivateFieldIn,__addDisposableResource,__disposeResources,__rewriteRelativeImportExtension};var import_debug22=__toESM(require_browser(),1),debug12=(0,import_debug22.default)("tsci:eval:execution-context");function createExecutionContext(webWorkerConfiguration,opts={}){globalThis.React=React3;let basePlatform=opts.platform||getPlatformConfig({},{easyEdaProxyConfig:webWorkerConfiguration.easyEdaProxyConfig}),platform=opts.projectConfig?{...basePlatform,...opts.projectConfig}:basePlatform;platform.partsEngineDisabled&&(platform.partsEngine=void 0);let circuit=new RootCircuit({platform});opts.name&&(circuit.name=opts.name),opts.debugNamespace&&circuit.enableDebug(opts.debugNamespace);let logs=[];return{fsMap:{},entrypoint:"",logger:{info:message=>{logs.push({msg:message})},getLogs:()=>logs,stringifyLogs:()=>logs.map(log=>log.msg).join(`
|
|
773
773
|
`)},preSuppliedImports:{"@tscircuit/core":dist_exports4,tscircuit:dist_exports4,"@tscircuit/math-utils":dist_exports2,"@tscircuit/mm":dist_exports5,react:React3,"react/jsx-runtime":ReactJsxRuntime,debug:import_debug22.default,tslib:tslib_es6_exports,"@tscircuit/props":{}},circuit,tsConfig:null,importStack:[],currentlyImporting:new Set,...webWorkerConfiguration}}function normalizeFilePath(filePath){let normFilePath=filePath;return normFilePath=normFilePath.replace(/\\/g,"/"),normFilePath=normFilePath.trim(),normFilePath.startsWith("./")&&(normFilePath=normFilePath.slice(2)),normFilePath.startsWith("/")&&(normFilePath=normFilePath.slice(1)),normFilePath}function normalizeFsMap(fsMap){let normalizedFsMap={};for(let[fsPath,fileContent]of Object.entries(fsMap))normalizedFsMap[normalizeFilePath(fsPath)]=fileContent;return normalizedFsMap}function dirname(path){if(!path)return".";let cleanPath=path.replace(/\\/g,"/").replace(/\/+$/,"");return cleanPath.indexOf("/")===-1?".":cleanPath.substring(0,cleanPath.lastIndexOf("/"))||"/"}function resolveRelativePath(importPath,cwd){if(importPath.startsWith("../")){let parentDir=dirname(cwd);return resolveRelativePath(importPath.slice(3),parentDir)}return importPath.startsWith("./")?resolveRelativePath(importPath.slice(2),cwd):importPath.startsWith("/")?importPath.slice(1):`${cwd}/${importPath}`}function getTsConfig(fsMapOrAllFilePaths){if(Array.isArray(fsMapOrAllFilePaths))return null;let tsconfigContent=fsMapOrAllFilePaths["tsconfig.json"];if(!tsconfigContent)return null;try{let sanitizedContent=tsconfigContent.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g,"");return JSON.parse(sanitizedContent)}catch(e5){throw new Error(`Failed to parse tsconfig.json: ${e5.message}`)}}function resolveWithTsconfigPaths(opts){let{importPath,normalizedFilePathMap,extensions,tsConfig,tsconfigDir}=opts,paths=tsConfig?.compilerOptions?.paths;if(!paths)return null;let baseUrl=tsConfig?.compilerOptions?.baseUrl||".",tryResolveCandidate=candidate=>{let normalizedCandidate=normalizeFilePath(candidate);if(normalizedFilePathMap.has(normalizedCandidate))return normalizedFilePathMap.get(normalizedCandidate);for(let ext of extensions){let withExt=`${normalizedCandidate}.${ext}`;if(normalizedFilePathMap.has(withExt))return normalizedFilePathMap.get(withExt)}return null};for(let[alias,targets]of Object.entries(paths))if(alias.includes("*")){let[prefix,suffix]=alias.split("*");if(!importPath.startsWith(prefix)||!importPath.endsWith(suffix||""))continue;let starMatch=importPath.slice(prefix.length,importPath.length-(suffix?suffix.length:0));for(let target of targets){let replaced=target.replace("*",starMatch),candidate=baseUrl&&!replaced.startsWith("./")&&!replaced.startsWith("/")?`${baseUrl}/${replaced}`:replaced,resolved=tryResolveCandidate(candidate);if(resolved)return resolved}}else{if(importPath!==alias)continue;for(let target of targets){let candidate=baseUrl&&!target.startsWith("./")&&!target.startsWith("/")?`${baseUrl}/${target}`:target,resolved=tryResolveCandidate(candidate);if(resolved)return resolved}}let resolvedPathFromBaseUrl=resolveWithBaseUrl({importPath,normalizedFilePathMap,extensions,tsConfig,tsconfigDir});return resolvedPathFromBaseUrl||null}function resolveWithBaseUrl(opts){let{importPath,normalizedFilePathMap,extensions,tsConfig,tsconfigDir}=opts,baseUrl=tsConfig?.compilerOptions?.baseUrl;if(!baseUrl)return null;let filePathToResolve=`${tsconfigDir||"."}/${baseUrl}/${importPath}`;filePathToResolve=filePathToResolve.replace(/\/+/g,"/"),filePathToResolve=filePathToResolve.replace(/\/\.\//g,"/");let normalizedFilePath=normalizeFilePath(filePathToResolve);if(normalizedFilePathMap.has(normalizedFilePath))return normalizedFilePathMap.get(normalizedFilePath);for(let ext of extensions){let withExt=`${normalizedFilePath}.${ext}`;if(normalizedFilePathMap.has(withExt))return normalizedFilePathMap.get(withExt)}return null}function matchesTsconfigPathPattern(importPath,tsConfig){let paths=tsConfig?.compilerOptions?.paths;if(!paths)return!1;for(let[alias]of Object.entries(paths))if(alias.includes("*")){let[prefix,suffix]=alias.split("*");if(importPath.startsWith(prefix)&&importPath.endsWith(suffix||""))return!0}else if(importPath===alias)return!0;return!1}var FILE_EXTENSIONS=["tsx","ts","json","js","jsx","obj","gltf","glb","stl","step","stp"],resolveFilePath=(unknownFilePath,fsMapOrAllFilePaths,cwd,opts={})=>{let tsConfig=opts.tsConfig??null,isRelativeImport=unknownFilePath.startsWith("./")||unknownFilePath.startsWith("../"),hasBaseUrl=!!tsConfig?.compilerOptions?.baseUrl,resolvedPath=cwd&&(isRelativeImport||!hasBaseUrl)?resolveRelativePath(unknownFilePath,cwd):unknownFilePath,filePaths=new Set(Array.isArray(fsMapOrAllFilePaths)?fsMapOrAllFilePaths:Object.keys(fsMapOrAllFilePaths));if(filePaths.has(resolvedPath))return resolvedPath;let normalizedFilePathMap=new Map;for(let filePath of filePaths)normalizedFilePathMap.set(normalizeFilePath(filePath),filePath);let normalizedResolvedPath=normalizeFilePath(resolvedPath);if(isRelativeImport||!hasBaseUrl){if(normalizedFilePathMap.has(normalizedResolvedPath))return normalizedFilePathMap.get(normalizedResolvedPath);for(let ext of FILE_EXTENSIONS){let possibleFilePath=`${normalizedResolvedPath}.${ext}`;if(normalizedFilePathMap.has(possibleFilePath))return normalizedFilePathMap.get(possibleFilePath)}}if(!isRelativeImport){let resolvedPathFromPaths=resolveWithTsconfigPaths({importPath:unknownFilePath,normalizedFilePathMap,extensions:FILE_EXTENSIONS,tsConfig,tsconfigDir:opts.tsconfigDir});if(resolvedPathFromPaths)return resolvedPathFromPaths;let resolvedPathFromBaseUrl=resolveWithBaseUrl({importPath:unknownFilePath,normalizedFilePathMap,extensions:FILE_EXTENSIONS,tsConfig,tsconfigDir:opts.tsconfigDir});if(resolvedPathFromBaseUrl)return resolvedPathFromBaseUrl}if(!isRelativeImport&&!hasBaseUrl){let normalizedUnknownFilePath=normalizeFilePath(unknownFilePath);if(normalizedFilePathMap.has(normalizedUnknownFilePath))return normalizedFilePathMap.get(normalizedUnknownFilePath);for(let ext of FILE_EXTENSIONS){let possibleFilePath=`${normalizedUnknownFilePath}.${ext}`;if(normalizedFilePathMap.has(possibleFilePath))return normalizedFilePathMap.get(possibleFilePath)}}return null},resolveFilePathOrThrow=(unknownFilePath,fsMapOrAllFilePaths,cwd,opts={})=>{let resolvedFilePath=resolveFilePath(unknownFilePath,fsMapOrAllFilePaths,cwd,opts);if(!resolvedFilePath)throw new Error(`File not found "${unknownFilePath}", available paths:
|
|
774
774
|
|
|
775
775
|
${Object.keys(fsMapOrAllFilePaths).join(", ")}`);return resolvedFilePath};var stripComments=code=>{let out="",i3=0,inSingle=!1,inDouble=!1,inTemplate=!1;for(;i3<code.length;){let ch3=code[i3],next2=code[i3+1];if(!inDouble&&!inTemplate&&ch3==="'"&&code[i3-1]!=="\\"){inSingle=!inSingle,out+=ch3,i3++;continue}if(!inSingle&&!inTemplate&&ch3==='"'&&code[i3-1]!=="\\"){inDouble=!inDouble,out+=ch3,i3++;continue}if(!inSingle&&!inDouble&&ch3==="`"&&code[i3-1]!=="\\"){inTemplate=!inTemplate,out+=ch3,i3++;continue}if(!inSingle&&!inDouble&&!inTemplate){if(ch3==="/"&&next2==="/"){for(out+=" ",i3+=2;i3<code.length&&code[i3]!==`
|