@tscircuit/eval 0.0.524 → 0.0.525
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
|
@@ -250,7 +250,7 @@ ${r.stack}`),i.complete=!0,"root"in this&&this.root&&this.root.emit("asyncEffect
|
|
|
250
250
|
`||a==="\r"){i++;continue}if(r(a)||a==="."&&i+1<n.length&&r(n[i+1])){let c=i;for(i++;i<n.length;){let d=n[i];if(r(d)||d===".")i++;else break}let l=n.slice(c,i),u=Number(l);if(Number.isNaN(u))throw new Error(`Invalid number: "${l}"`);let p=i;for(;i<n.length&&/[A-Za-z]/.test(n[i]);)i++;if(i>p){let d=n.slice(p,i),_=e[d];if(_==null)throw new Error(`Unknown unit: "${d}"`);u*=_}t.push({type:"number",value:u});continue}if(s(a)){let c=i;for(i++;i<n.length&&o(n[i]);)i++;let l=n.slice(c,i);t.push({type:"identifier",value:l});continue}if(a==="("||a===")"){t.push({type:"paren",value:a}),i++;continue}if(a==="+"||a==="-"||a==="*"||a==="/"){t.push({type:"operator",value:a}),i++;continue}throw new Error(`Unexpected character "${a}" in expression "${n}"`)}return t}function yLt(n,e){let t=0,i=()=>n[t],r=()=>n[t++],s=()=>{let u=i();if(!u)throw new Error("Unexpected end of expression");if(u.type==="number")return r(),u.value;if(u.type==="identifier"){r();let p=e[u.value];if(p==null)throw new Error(`Unknown variable: "${u.value}"`);return p}if(u.type==="paren"&&u.value==="("){r();let p=c(),d=i();if(!d||d.type!=="paren"||d.value!==")")throw new Error('Expected ")"');return r(),p}throw new Error(`Unexpected token "${u.value}"`)},o=()=>{let u=i();if(u&&u.type==="operator"&&(u.value==="+"||u.value==="-")){r();let p=o();return u.value==="+"?p:-p}return s()},a=()=>{let u=o();for(;;){let p=i();if(!p||p.type!=="operator"||p.value!=="*"&&p.value!=="/")break;r();let d=o();p.value==="*"?u*=d:u/=d}return u},c=()=>{let u=a();for(;;){let p=i();if(!p||p.type!=="operator"||p.value!=="+"&&p.value!=="-")break;r();let d=a();p.value==="+"?u+=d:u-=d}return u},l=c();if(t<n.length){let u=n.slice(t).map(p=>"value"in p?p.value:"?").join(" ");throw new Error(`Unexpected tokens at end of expression: ${u}`)}return l}var C9={isTag:n=>!0,getParent:n=>n.parent,getChildren:n=>n.children,getName:n=>n.lowercaseComponentName,getAttributeValue:(n,e)=>{if(e==="class"&&"getNameAndAliases"in n)return n.getNameAndAliases().join(" ");if(e==="name"&&n._parsedProps?.name)return n._parsedProps.name;if(n._parsedProps&&e in n._parsedProps){let i=n._parsedProps[e];return typeof i=="string"?i:i!=null?String(i):null}if(e in n){let i=n[e];return typeof i=="string"?i:i!=null?String(i):null}let t=n._attributeLowerToCamelNameMap;if(t){let i=t[e];if(i&&i in n){let r=n[i];return typeof r=="string"?r:r!=null?String(r):null}}return null},hasAttrib:(n,e)=>{if(e==="class")return!!n._parsedProps?.name;if(n._parsedProps&&e in n._parsedProps||e in n)return!0;let t=n._attributeLowerToCamelNameMap;if(t){let i=t[e];if(i&&i in n)return!0}return!1},getSiblings:n=>n.parent?n.parent.children:[],prevElementSibling:n=>{if(!n.parent)return null;let e=n.parent.children,t=e.indexOf(n);return t>0?e[t-1]:null},getText:()=>"",removeSubsets:n=>n.filter((e,t)=>!n.some((i,r)=>t!==r&&i!==e&&i.getDescendants().includes(e))),existsOne:(n,e)=>e.some(n),findAll:(n,e)=>{let t=[],i=r=>{n(r)&&t.push(r);for(let s of r.children)i(s)};for(let r of e)i(r);return t},findOne:(n,e)=>{for(let t of e){if(n(t))return t;let i=t.children;if(i.length>0){let r=C9.findOne(n,i);if(r)return r}}return null},equals:(n,e)=>n._renderId===e._renderId,isHovered:n=>!1,isVisited:n=>!1,isActive:n=>!1},gLt={...C9,getChildren:n=>n.children.filter(e=>!e.isSubcircuit)},Bet={...C9,getChildren:n=>n.children.filter(e=>e.isSubcircuit)},xLt=(n,e)=>{let t=n.split("net.")[1]?.split(/[ >]/)[0]??n;return`Net names cannot contain "+" or "-" (component "${e?.componentName??"Unknown component"}" received "${t}" via "${n}"). Try using underscores instead, e.g. VCC_P`},Yet=(n,e)=>{if(/net\.[^\s>]*\./.test(n))throw new Error('Net names cannot contain a period, try using "sel.net..." to autocomplete with conventional net names, e.g. V3_3');if(/net\.[^\s>]*[+-]/.test(n))throw new Error(xLt(n,e));if(/net\.[0-9]/.test(n)){let t=n.match(/net\.([^ >]+)/),i=t?t[1]:"";throw new Error(`Net name "${i}" cannot start with a number, try using a prefix like "VBUS1"`)}return n.replace(/ pin(?=[\d.])/g," port").replace(/ subcircuit\./g," group[isSubcircuit=true]").replace(/([^ ])\>([^ ])/g,"$1 > $2").replace(/(^|[ >])(?!pin\.)(?!port\.)(?!net\.)([A-Z][A-Za-z0-9_-]*)\.([A-Za-z0-9_-]+)/g,(t,i,r,s)=>{let o=/^\d+$/.test(s)?`pin${s}`:s;return`${i}.${r} > .${o}`}).trim()},h9={adapter:gLt,cacheResults:!0},Me=class extends M9{constructor(e){super(e);f(this,"parent",null);f(this,"children");f(this,"childrenPendingRemoval");f(this,"props");f(this,"_parsedProps");f(this,"externallyAddedAliases");f(this,"isPrimitiveContainer",!1);f(this,"canHaveTextChildren",!1);f(this,"source_group_id",null);f(this,"source_component_id",null);f(this,"schematic_component_id",null);f(this,"pcb_component_id",null);f(this,"cad_component_id",null);f(this,"fallbackUnassignedName");f(this,"_cachedSelectAllQueries",new Map);f(this,"_cachedSelectOneQueries",new Map);this.children=[],this.childrenPendingRemoval=[],this.props=e??{},this.externallyAddedAliases=[];let i=("partial"in this.config.zodProps?this.config.zodProps.partial({name:!0}):this.config.zodProps).safeParse(e??{});if(i.success)this._parsedProps=i.data;else throw new hLt(this.lowercaseComponentName,this.props,i.error.format())}get config(){return{componentName:"",zodProps:h.object({}).passthrough()}}get componentName(){return this.config.componentName}getInheritedProperty(e){let t=this;for(;t;){if(t._parsedProps&&e in t._parsedProps)return t._parsedProps[e];t=t.parent}if(this.root?.platform&&e in this.root.platform)return this.root.platform[e]}getInheritedMergedProperty(e){let t=this.parent?.getInheritedMergedProperty?.(e),i=this._parsedProps?.[e];return{...t,...i}}get lowercaseComponentName(){return this.componentName.toLowerCase()}get isSubcircuit(){return!!this.props.subcircuit||this.lowercaseComponentName==="group"&&this?.parent?.isRoot}get isGroup(){return this.lowercaseComponentName==="group"}get name(){return this._parsedProps.name??this.fallbackUnassignedName}setProps(e){let t=this.config.zodProps.parse({...this.props,...e}),i=this.props;this.props=t,this._parsedProps=this.config.zodProps.parse(e),this.onPropsChange({oldProps:i,newProps:t,changedProps:Object.keys(e)}),this.parent?.onChildChanged?.(this)}_getPcbRotationBeforeLayout(){let{pcbRotation:e}=this.props;return typeof e=="string"?parseFloat(e):e??null}getResolvedPcbPositionProp(){return{pcbX:this._resolvePcbCoordinate(this._parsedProps.pcbX,"pcbX"),pcbY:this._resolvePcbCoordinate(this._parsedProps.pcbY,"pcbY")}}_resolvePcbCoordinate(e,t,i={}){if(e==null)return 0;if(typeof e=="number")return e;if(typeof e!="string")throw new Error(`Invalid ${t} value for ${this.componentName}: ${String(e)}`);let r=i.allowBoardVariables??this._isNormalComponent===!0,s=e.includes("board."),o={};if(r){let a=this._getBoard(),c=a?._getBoardCalcVariables()??{};if(s&&!a)throw new Error(`Cannot resolve ${t} for ${this.componentName}: no board found for board.* variables`);if(s&&a&&Object.keys(c).length===0)throw new Error("Cannot do calculations based on board size when the board is auto-sized");Object.assign(o,c)}try{return fLt(e,{knownVariables:o})}catch(a){let c=a instanceof Error?a.message:String(a);throw new Error(`Invalid ${t} value for ${this.componentName}: ${c}`)}}computePcbPropsTransform(){let e=this._getPcbRotationBeforeLayout()??0,{pcbX:t,pcbY:i}=this.getResolvedPcbPositionProp();return ri(kn(t,i),Oo(e*Math.PI/180))}_computePcbGlobalTransformBeforeLayout(){let e=this.getSubcircuit()._getPcbManualPlacementForComponent(this);if(e&&this.props.pcbX===void 0&&this.props.pcbY===void 0){let t=this._getPcbRotationBeforeLayout()??0;return ri(this.parent?._computePcbGlobalTransformBeforeLayout()??Pr(),ri(kn(e.x,e.y),Oo(t*Math.PI/180)))}if(this.isPcbPrimitive){let t=this.getPrimitiveContainer();if(t&&t._parsedProps.layer==="bottom")return ri(this.parent?._computePcbGlobalTransformBeforeLayout()??Pr(),ZB(),this.computePcbPropsTransform())}return ri(this.parent?._computePcbGlobalTransformBeforeLayout()??Pr(),this.computePcbPropsTransform())}getPrimitiveContainer(){return this.isPrimitiveContainer?this:this.parent?.getPrimitiveContainer?.()??null}getParentNormalComponent(){let e=this.parent;for(;e;){if(e.isPrimitiveContainer&&e.doInitialPcbComponentRender)return e;e=e.parent}return null}_getPcbCircuitJsonBounds(){return{center:{x:0,y:0},bounds:{left:0,top:0,right:0,bottom:0},width:0,height:0}}_getPcbPrimitiveFlippedHelpers(){let e=this.getPrimitiveContainer(),t=e?e._parsedProps.layer==="bottom":!1;return{isFlipped:t,maybeFlipLayer:r=>t?r==="top"?"bottom":"top":r}}_setPositionFromLayout(e){throw new Error(`_setPositionFromLayout not implemented for ${this.componentName}`)}computeSchematicPropsTransform(){let{_parsedProps:e}=this;return ri(kn(e.schX??0,e.schY??0))}computeSchematicGlobalTransform(){let e=this._getSchematicGlobalManualPlacementTransform(this);return e||ri(this.parent?.computeSchematicGlobalTransform?.()??Pr(),this.computeSchematicPropsTransform())}_getSchematicSymbolName(){let{_parsedProps:e}=this,t=this.config.schematicSymbolName,i={horizontal:0,pos_left:0,neg_right:0,pos_right:180,neg_left:180,pos_top:270,neg_bottom:90,vertical:270,pos_bottom:90,neg_top:90},r=e.schOrientation!==void 0?i[e.schOrientation]:e.schRotation;if(r===void 0&&(r=0),r=r%360,r<0&&(r+=360),e.schRotation!==void 0&&r%90!==0)throw new Error(`Schematic rotation ${e.schRotation} is not supported for ${this.componentName}`);let s=`${t}_horz`,o=`${t}_vert`,a=`${t}_up`,c=`${t}_down`,l=`${t}_left`,u=`${t}_right`;if(u in gi&&r===0)return u;if(a in gi&&r===90)return a;if(l in gi&&r===180)return l;if(c in gi&&r===270)return c;if(s in gi&&(r===0||r===180))return s;if(o in gi&&(r===90||r===270))return o;if(t in gi)return t}_getSchematicSymbolNameOrThrow(){let e=this._getSchematicSymbolName();if(!e)throw new Error(`No schematic symbol found (given: "${this.config.schematicSymbolName}")`);return e}getSchematicSymbol(){let e=this._getSchematicSymbolName();return e?gi[e]??null:null}_getPcbManualPlacementForComponent(e){if(!this.isSubcircuit)return null;let t=this.props.manualEdits;if(!t)return null;let i=t?.pcb_placements;if(!i)return null;for(let r of i)if(p9(e,r.selector)||e.props.name===r.selector)return De(this._computePcbGlobalTransformBeforeLayout(),r.center);return null}_getSchematicManualPlacementForComponent(e){if(!this.isSubcircuit)return null;let t=this.props.manualEdits;if(!t)return null;let i=t.schematic_placements;if(!i)return null;for(let r of i)if(p9(e,r.selector)||e.props.name===r.selector)return De(this.computeSchematicGlobalTransform(),r.center);return null}_getSchematicGlobalManualPlacementTransform(e){let t=this.getSubcircuit()?._parsedProps.manualEdits;if(!t)return null;for(let i of t.schematic_placements??[])if((p9(e,i.selector)||e.props.name===i.selector)&&i.relative_to==="group_center")return ri(this.parent?._computePcbGlobalTransformBeforeLayout()??Pr(),kn(i.center.x,i.center.y));return null}_getGlobalPcbPositionBeforeLayout(){return De(this._computePcbGlobalTransformBeforeLayout(),{x:0,y:0})}_getGlobalSchematicPositionBeforeLayout(){return De(this.computeSchematicGlobalTransform(),{x:0,y:0})}_getBoard(){let e=this;for(;e;){let t=e;if(t.componentName==="Board")return t;e=e.parent??null}return this.root?._getBoard()}get root(){return this.parent?.root??null}onAddToParent(e){this.parent=e}onPropsChange(e){}onChildChanged(e){this.parent?.onChildChanged?.(e)}add(e){let t=e.__text;if(typeof t=="string"){if(this.canHaveTextChildren||t.trim()==="")return;throw new Error(`Invalid JSX Element: Expected a React component but received text "${t}"`)}if(Object.keys(e).length!==0){if(this.lowercaseComponentName==="board"&&e.lowercaseComponentName==="board")throw new Error("Nested boards are not supported");if(e.lowercaseComponentName==="panel")throw new Error("<panel> must be a root-level element");if(!e.onAddToParent)throw new Error(`Invalid JSX Element: Expected a React component but received "${JSON.stringify(e)}"`);e.onAddToParent(this),e.parent=this,this.children.push(e)}}addAll(e){for(let t of e)this.add(t)}remove(e){this.children=this.children.filter(t=>t!==e),this.childrenPendingRemoval.push(e),e.shouldBeRemoved=!0}getSubcircuitSelector(){let e=this.name,t=e?`${this.lowercaseComponentName}.${e}`:this.lowercaseComponentName;return!this.parent||this.parent.isSubcircuit?t:`${this.parent.getSubcircuitSelector()} > ${t}`}getFullPathSelector(){let e=this.name,t=e?`${this.lowercaseComponentName}.${e}`:this.lowercaseComponentName,i=this.parent?.getFullPathSelector?.();return i?`${i} > ${t}`:t}getNameAndAliases(){return[this.name,...this._parsedProps.portHints??[]].filter(Boolean)}isMatchingNameOrAlias(e){return this.getNameAndAliases().includes(e)}isMatchingAnyOf(e){return this.getNameAndAliases().some(t=>e.map(i=>i.toString()).includes(t))}getPcbSize(){throw new Error(`getPcbSize not implemented for ${this.componentName}`)}doesSelectorMatch(e){let t=[this.componentName,this.lowercaseComponentName],i=[this.name].filter(Boolean),r=e.trim().split(/\> /)[0],s=r[0];return r.length>1?!1:!!(e==="*"||e[0]==="#"&&e.slice(1)===this.props.id||e[0]==="."&&i.includes(e.slice(1))||/^[a-zA-Z0-9_]/.test(s)&&t.includes(s))}getSubcircuit(){if(this.isSubcircuit)return this;let e=this.parent?.getSubcircuit?.();if(!e)throw new Error("Component is not inside an opaque group (no board?)");return e}getGroup(){return this.isGroup?this:this.parent?.getGroup?.()??null}doInitialAssignNameToUnnamedComponents(){this._parsedProps.name||(this.fallbackUnassignedName=this.getSubcircuit().getNextAvailableName(this))}doInitialOptimizeSelectorCache(){if(!this.isSubcircuit)return;let e=this.selectAll("port");for(let t of e){let r=(t.getParentNormalComponent?.()??t.parent)?.getNameAndAliases(),s=t.getNameAndAliases();if(r)for(let o of r)for(let a of s){let c=[`.${o} > .${a}`,`.${o} .${a}`];for(let l of c){let u=this._cachedSelectAllQueries.get(l);u?u.push(t):this._cachedSelectAllQueries.set(l,[t])}}}for(let[t,i]of this._cachedSelectAllQueries.entries())i.length===1&&this._cachedSelectOneQueries.set(t,i[0])}selectAll(e){if(this._cachedSelectAllQueries.has(e))return this._cachedSelectAllQueries.get(e);let t=Yet(e,this),i=i4(t,this,h9);if(i.length>0)return this._cachedSelectAllQueries.set(e,i),i;let[r,...s]=t.split(" "),o=dw(r,this,{adapter:Bet});if(!o)return[];let a=o.selectAll(s.join(" "));return this._cachedSelectAllQueries.set(e,a),a}selectOne(e,t){if(this._cachedSelectOneQueries.has(e))return this._cachedSelectOneQueries.get(e);let i=Yet(e,this);t?.port&&(t.type="port");let r=null;if(t?.type&&(r=i4(i,this,h9).find(l=>l.lowercaseComponentName===t.type)),r??(r=dw(i,this,h9)),r)return this._cachedSelectOneQueries.set(e,r),r;let[s,...o]=i.split(" "),a=dw(s,this,{adapter:Bet});return a?(r=a.selectOne(o.join(" "),t),this._cachedSelectOneQueries.set(e,r),r):null}getAvailablePcbLayers(){if(this.isPcbPrimitive){let{maybeFlipLayer:e}=this._getPcbPrimitiveFlippedHelpers();return"layer"in this._parsedProps||this.componentName==="SmtPad"?[e(this._parsedProps.layer??"top")]:"layers"in this._parsedProps?this._parsedProps.layers:this.componentName==="PlatedHole"?[...this.root?._getBoard()?.allLayers??["top","bottom"]]:[]}return[]}getDescendants(){let e=[];for(let t of this.children)e.push(t),e.push(...t.getDescendants());return e}getSelectableDescendants(){let e=[];for(let t of this.children)t.isSubcircuit?e.push(t):(e.push(t),e.push(...t.getSelectableDescendants()));return e}_getPinCount(){return 0}_getSchematicBoxDimensions(){return null}_getSchematicBoxComponentDimensions(){if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox)return null;let{_parsedProps:e}=this;return{schWidth:e.schWidth,schHeight:e.schHeight}}renderError(e){if(typeof e=="string")return super.renderError(e);switch(e.type){case"pcb_placement_error":this.root?.db.pcb_placement_error.insert(e);break;case"pcb_via_clearance_error":this.root?.db.pcb_via_clearance_error.insert(e);break;case"pcb_trace_error":this.root?.db.pcb_trace_error.insert(e);break;case"pcb_manual_edit_conflict_warning":this.root?.db.pcb_manual_edit_conflict_warning.insert(e);break;default:this.root?.db.pcb_placement_error.insert(e)}}getString(){let{lowercaseComponentName:e,_parsedProps:t,parent:i}=this;return t?.pinNumber!==void 0&&i?.props?.name&&t?.name?`<${e}#${this._renderId}(pin:${t.pinNumber} .${i?.props.name}>.${t.name}) />`:i?.props?.name&&t?.name?`<${e}#${this._renderId}(.${i?.props.name}>.${t?.name}) />`:t?.from&&t?.to?`<${e}#${this._renderId}(from:${t.from} to:${t?.to}) />`:t?.name?`<${e}#${this._renderId} name=".${t?.name}" />`:t?.portHints?`<${e}#${this._renderId}(${t.portHints.map(r=>`.${r}`).join(", ")}) />`:`<${e}#${this._renderId} />`}get[Symbol.toStringTag](){return this.getString()}[Symbol.for("nodejs.util.inspect.custom")](){return this.getString()}},bLt=class extends Me{constructor(n,e){super(n);let t=(i,r)=>{if(typeof i=="number")return i;if(typeof i=="string")try{return this._resolvePcbCoordinate(i,r,{allowBoardVariables:!1})}catch{return 0}return 0};this._parsedProps={...n,error:e,type:n.type||"unknown",component_name:n.name,error_type:"source_failed_to_create_component_error",message:e instanceof Error?e.message:String(e),pcbX:t(n.pcbX,"pcbX"),pcbY:t(n.pcbY,"pcbY"),schX:n.schX,schY:n.schY}}get config(){return{componentName:"ErrorPlaceholder",zodProps:h.object({}).passthrough()}}doInitialSourceRender(){if(this.root?.db){let n=this._getGlobalPcbPositionBeforeLayout(),e=this._getGlobalSchematicPositionBeforeLayout();this.root.db.source_failed_to_create_component_error.insert({component_name:this._parsedProps.component_name,error_type:"source_failed_to_create_component_error",message:`Could not create ${this._parsedProps.componentType??"component"}${this._parsedProps.name?` "${this._parsedProps.name}"`:""}. ${this._parsedProps.error?.formattedError?._errors?.join("; ")||this._parsedProps.message}`,pcb_center:n,schematic_center:e})}}};function vLt(n,e){return new bLt(n,e)}function wLt(n,e){let t=n;return t.__tsci={...e},n}var SLt={supportsMutation:!0,createInstance(n,e){let t=aP[n];if(!t)throw Object.keys(aP).length===0?new Error("No components registered in catalogue, did you forget to import lib/register-catalogue in your test file?"):new Error(`Unsupported component type "${n}". No element with this name is registered in the @tscircuit/core catalogue. Check for typos or see https://docs.tscircuit.com/category/built-in-elements for a list of valid components. To add your own component, see docs/CREATING_NEW_COMPONENTS.md`);try{return wLt(new t(e),{})}catch(i){return vLt({...e,componentType:n},i)}},createTextInstance(n){return{__text:n}},appendInitialChild(n,e){n.add(e)},appendChild(n,e){n.add(e)},appendChildToContainer(n,e){n.add(e)},finalizeInitialChildren(){return!1},prepareUpdate(){return null},shouldSetTextContent(){return!1},getRootHostContext(){return{}},getChildHostContext(){return{}},prepareForCommit(){return null},resetAfterCommit(){},commitMount(){},commitUpdate(){},removeChild(){},clearContainer(){},supportsPersistence:!1,getPublicInstance(n){return n},preparePortalMount(n){throw new Error("Function not implemented.")},scheduleTimeout(n,e){throw new Error("Function not implemented.")},cancelTimeout(n){throw new Error("Function not implemented.")},noTimeout:void 0,isPrimaryRenderer:!1,getInstanceFromNode(n){throw new Error("Function not implemented.")},beforeActiveInstanceBlur(){throw new Error("Function not implemented.")},afterActiveInstanceBlur(){throw new Error("Function not implemented.")},prepareScopeUpdate:(n,e)=>{throw new Error("Function not implemented.")},getInstanceFromScope:n=>{throw new Error("Function not implemented.")},detachDeletedInstance:n=>{throw new Error("Function not implemented.")},getCurrentEventPriority:()=>iP.DefaultEventPriority,getCurrentUpdatePriority:()=>iP.DefaultEventPriority,resolveUpdatePriority:()=>iP.DefaultEventPriority,setCurrentUpdatePriority:()=>{},maySuspendCommit:()=>!1,supportsHydration:!1},QS=(0,vnt.default)(SLt),knt=n=>{let e={children:[],props:{name:"$root"},add(s){s.parent=this,this.children.push(s)},computePcbGlobalTransform(){return Pr()}},t=[],i=QS.createContainer(e,0,null,!1,null,"tsci",s=>{console.log("Error in createContainer"),console.error(s),t.push(s)},null);if(QS.updateContainerSync(n,i,null,()=>{}),QS.flushSyncWork(),t.length>0)throw t[0];let r=QS.getPublicRootInstance(i);return r||e.children[0]},W1=(n,e)=>{if(typeof n=="number")return n;if(n.startsWith("pin"))return Number(n.slice(3));if(!e)throw new Error(`No pin labels provided and pin number or label is not a number: "${n}"`);for(let t in e)if((Array.isArray(e[t])?e[t]:[e[t]]).includes(n))return Number(t.replace("pin",""));throw new Error(`No pin labels provided and pin number or label is not a number: "${n}"`)},PLt=(n,e)=>{if(!n)return;let t={},i={};for(let[r,s]of Object.entries(n)){let o=W1(r,e);i[o]={...i[o],...s}}for(let[r,s]of Object.entries(i)){let o=`pin${r}`;t[o]={bottom_margin:s.bottomMargin,left_margin:s.leftMargin,right_margin:s.rightMargin,top_margin:s.topMargin}}return t},kLt=n=>{if(n){if("leftSide"in n||"rightSide"in n||"topSide"in n||"bottomSide"in n)return{left_side:n.leftSide,right_side:n.rightSide,top_side:n.topSide,bottom_side:n.bottomSide};if("leftPinCount"in n||"rightPinCount"in n||"topPinCount"in n||"bottomPinCount"in n)return{left_size:n.leftPinCount,right_size:n.rightPinCount,top_size:n.topPinCount,bottom_size:n.bottomPinCount};if("leftSize"in n||"rightSize"in n||"topSize"in n||"bottomSize"in n)return{left_size:n.leftSize,right_size:n.rightSize,top_size:n.topSize,bottom_size:n.bottomSize}}};function Tnt(n){let e=[];for(let t=0;t<n.length-1;t++)e.push([n[t],n[t+1]]);return e}var TLt=h.object({name:h.string().refine(n=>!/[+-]/.test(n),n=>({message:`Net names cannot contain "+" or "-" (component "Net" received "${n}"). Try using underscores instead, e.g. VCC_P`}))}),I9=class extends Me{constructor(){super(...arguments);f(this,"source_net_id");f(this,"subcircuit_connectivity_map_key",null)}get config(){return{componentName:"Net",zodProps:TLt}}getPortSelector(){return`net.${this.props.name}`}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=t.name.startsWith("GND"),r=t.name.startsWith("V"),s=e.source_net.insert({name:t.name,member_source_group_ids:[],is_ground:i,is_power:r,is_positive_voltage_source:r});this.source_net_id=s.source_net_id}doInitialSourceParentAttachment(){let e=this.getSubcircuit();if(!e)return;let{db:t}=this.root;t.source_net.update(this.source_net_id,{subcircuit_id:e.subcircuit_id})}getAllConnectedPorts(){let e=this.getSubcircuit().selectAll("port"),t=[];for(let i of e){let r=i._getDirectlyConnectedTraces();for(let s of r)if(s._isExplicitlyConnectedToNet(this)){t.push(i);break}}return t}_getAllDirectlyConnectedTraces(){let e=this.getSubcircuit().selectAll("trace"),t=[];for(let i of e)i._isExplicitlyConnectedToNet(this)&&t.push(i);return t}doInitialPcbRouteNetIslands(){if(this.root?.pcbDisabled||this.getSubcircuit()._parsedProps.routingDisabled||this.getSubcircuit()._getAutorouterConfig().groupMode!=="sequential-trace")return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getAllDirectlyConnectedTraces().filter(o=>(o._portsRoutedOnPcb?.length??0)>0),r=[];for(let o of i){let a=o._portsRoutedOnPcb,c=r.find(l=>a.some(u=>l.ports.includes(u)));if(!c){r.push({ports:[...a],traces:[o]});continue}c.traces.push(o),c.ports.push(...a)}if(r.length===0)return;let s=Tnt(r);for(let[o,a]of s){let c=o.ports.map(S=>S._getGlobalPcbPositionBeforeLayout()),l=a.ports.map(S=>S._getGlobalPcbPositionBeforeLayout()),u=1/0,p=[-1,-1];for(let S=0;S<c.length;S++){let P=c[S];for(let T=0;T<l.length;T++){let k=l[T],N=Math.sqrt((P.x-k.x)**2+(P.y-k.y)**2);N<u&&(u=N,p=[S,T])}}let d=o.ports[p[0]],_=a.ports[p[1]],g=e.toArray().filter(S=>S.type==="pcb_smtpad"||S.type==="pcb_trace"||S.type==="pcb_plated_hole"||S.type==="pcb_hole"||S.type==="source_port"||S.type==="pcb_port"),{solution:x}=zW(g.concat([{type:"source_trace",source_trace_id:"__net_trace_tmp",connected_source_port_ids:[d.source_port_id,_.source_port_id]}])),v=x[0];if(!v){this.renderError({pcb_trace_error_id:"",pcb_trace_id:"__net_trace_tmp",pcb_component_ids:[d.pcb_component_id,_.pcb_component_id].filter(Boolean),pcb_port_ids:[d.pcb_port_id,_.pcb_port_id].filter(Boolean),type:"pcb_trace_error",error_type:"pcb_trace_error",message:`Failed to route net islands for "${this.getString()}"`,source_trace_id:"__net_trace_tmp"});return}e.pcb_trace.insert(v)}}renderError(e){if(typeof e=="string")return super.renderError(e);this.root?.db.pcb_trace_error.insert(e)}},hP=(n,e)=>{for(let t of e)if(typeof t=="string"&&t.startsWith("net.")){if(/net\.[^\s>]*\./.test(t))throw new Error('Net names cannot contain a period, try using "sel.net..." to autocomplete with conventional net names, e.g. V3_3');if(/net\.[^\s>]*[+-]/.test(t)){let r=t.split("net.")[1],s=`Net names cannot contain "+" or "-" (component "${n.componentName}" received "${r}" via "${t}"). Try using underscores instead, e.g. VCC_P`;throw new Error(s)}if(/net\.[0-9]/.test(t)){let r=t.split("net.")[1];throw new Error(`Net name "${r}" cannot start with a number, try using a prefix like "VBUS1"`)}let i=n.getSubcircuit();if(!i.selectOne(t)){let r=new I9({name:t.split("net.")[1]});i.add(r)}}},V1=class extends Me{constructor(){super(...arguments);f(this,"pcb_smtpad_id",null);f(this,"matchedPort",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SmtPad",zodProps:hH}}getPcbSize(){let{_parsedProps:e}=this;if(e.shape==="circle")return{width:e.radius*2,height:e.radius*2};if(e.shape==="rect")return{width:e.width,height:e.height};if(e.shape==="rotated_rect"){let i=(e.ccwRotation??0)*Math.PI/180,r=Math.cos(i),s=Math.sin(i),o=Math.abs(e.width*r)+Math.abs(e.height*s),a=Math.abs(e.width*s)+Math.abs(e.height*r);return{width:o,height:a}}if(e.shape==="polygon"){let t=e.points,i=t.map(l=>l.x),r=t.map(l=>l.y),s=Math.min(...i),o=Math.max(...i),a=Math.min(...r),c=Math.max(...r);return{width:o-s,height:c-a}}if(e.shape==="pill")return{width:e.width,height:e.height};throw new Error(`getPcbSize for shape "${e.shape}" not implemented for ${this.componentName}`)}doInitialPortMatching(){let e=this.getPrimitiveContainer()?.selectAll("port");if(this.props.portHints){for(let t of e)if(t.isMatchingAnyOf(this.props.portHints)){this.matchedPort=t,t.registerMatch(this);return}}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=t.coveredWithSolderMask??!1,r=!i,s=t.solderMaskMargin,o=this.getSubcircuit(),a=this._getGlobalPcbPositionBeforeLayout(),c=this._computePcbGlobalTransformBeforeLayout(),p=(io(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360,d=.01,_=Math.abs(p)<d||Math.abs(p-180)<d||Math.abs(p-360)<d,g=Math.abs(p-90)<d||Math.abs(p-270)<d,x=Math.abs(p-360)<d?0:p,v=x,{maybeFlipLayer:S,isFlipped:P}=this._getPcbPrimitiveFlippedHelpers();P&&(x=(360-x+360)%360);let T=t.portHints?.map(E=>E.toString())??[],k=null,N=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id;if(t.shape==="circle")k=e.pcb_smtpad.insert({pcb_component_id:N,pcb_port_id:this.matchedPort?.pcb_port_id,layer:S(t.layer??"top"),shape:"circle",radius:t.radius,port_hints:T,is_covered_with_solder_mask:i,soldermask_margin:s,x:a.x,y:a.y,subcircuit_id:o?.subcircuit_id??void 0}),r&&e.pcb_solder_paste.insert({layer:k.layer,shape:"circle",radius:k.radius*.7,x:k.x,y:k.y,pcb_component_id:k.pcb_component_id,pcb_smtpad_id:k.pcb_smtpad_id,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});else if(t.shape==="rect")!_&&!g?k=e.pcb_smtpad.insert({pcb_component_id:N,pcb_port_id:this.matchedPort?.pcb_port_id,layer:S(t.layer??"top"),shape:"rotated_rect",width:t.width,height:t.height,corner_radius:t.cornerRadius??void 0,x:a.x,y:a.y,ccw_rotation:x,port_hints:T,is_covered_with_solder_mask:i,soldermask_margin:s,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):k=e.pcb_smtpad.insert({pcb_component_id:N,pcb_port_id:this.matchedPort?.pcb_port_id,layer:S(t.layer??"top"),shape:"rect",width:g?t.height:t.width,height:g?t.width:t.height,corner_radius:t.cornerRadius??void 0,port_hints:T,is_covered_with_solder_mask:i,soldermask_margin:s,x:a.x,y:a.y,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),r&&(k.shape==="rect"?e.pcb_solder_paste.insert({layer:S(t.layer??"top"),shape:"rect",width:k.width*.7,height:k.height*.7,x:k.x,y:k.y,pcb_component_id:k.pcb_component_id,pcb_smtpad_id:k.pcb_smtpad_id,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):k.shape==="rotated_rect"&&e.pcb_solder_paste.insert({layer:S(t.layer??"top"),shape:"rotated_rect",width:k.width*.7,height:k.height*.7,x:k.x,y:k.y,ccw_rotation:k.ccw_rotation,pcb_component_id:k.pcb_component_id,pcb_smtpad_id:k.pcb_smtpad_id,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}));else if(t.shape==="rotated_rect"){let E=t.ccwRotation??0,C=(v+E+360)%360,M=P?(360-C+360)%360:C;k=e.pcb_smtpad.insert({pcb_component_id:N,pcb_port_id:this.matchedPort?.pcb_port_id,layer:S(t.layer??"top"),shape:"rotated_rect",width:t.width,height:t.height,corner_radius:t.cornerRadius??void 0,x:a.x,y:a.y,ccw_rotation:M,port_hints:T,is_covered_with_solder_mask:i,soldermask_margin:s,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),r&&e.pcb_solder_paste.insert({layer:S(t.layer??"top"),shape:"rotated_rect",width:k.width*.7,height:k.height*.7,x:a.x,y:a.y,ccw_rotation:M,pcb_component_id:N,pcb_smtpad_id:k.pcb_smtpad_id,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(t.shape==="polygon"){let E=t.points.map(C=>{let M=De(c,{x:V.parse(C.x),y:V.parse(C.y)});return{x:M.x,y:M.y}});k=e.pcb_smtpad.insert({pcb_component_id:N,pcb_port_id:this.matchedPort?.pcb_port_id,layer:S(t.layer??"top"),shape:"polygon",points:E,port_hints:T,is_covered_with_solder_mask:i,soldermask_margin:s,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else t.shape==="pill"&&(k=e.pcb_smtpad.insert({pcb_component_id:N,pcb_port_id:this.matchedPort?.pcb_port_id,layer:S(t.layer??"top"),shape:"pill",x:a.x,y:a.y,radius:t.radius,height:t.height,width:t.width,port_hints:T,is_covered_with_solder_mask:i,soldermask_margin:s,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}));k&&(this.pcb_smtpad_id=k.pcb_smtpad_id)}doInitialPcbPortAttachment(){if(this.root?.pcbDisabled)return;let{db:e}=this.root;e.pcb_smtpad.update(this.pcb_smtpad_id,{pcb_port_id:this.matchedPort?.pcb_port_id})}_getPcbCircuitJsonBounds(){let{db:e}=this.root,t=e.pcb_smtpad.get(this.pcb_smtpad_id);if(t.shape==="rect")return{center:{x:t.x,y:t.y},bounds:{left:t.x-t.width/2,top:t.y+t.height/2,right:t.x+t.width/2,bottom:t.y-t.height/2},width:t.width,height:t.height};if(t.shape==="rotated_rect"){let i=t.ccw_rotation*Math.PI/180,r=Math.cos(i),s=Math.sin(i),o=t.width/2,a=t.height/2,c=Math.abs(o*r)+Math.abs(a*s),l=Math.abs(o*s)+Math.abs(a*r);return{center:{x:t.x,y:t.y},bounds:{left:t.x-c,right:t.x+c,top:t.y-l,bottom:t.y+l},width:c*2,height:l*2}}if(t.shape==="circle")return{center:{x:t.x,y:t.y},bounds:{left:t.x-t.radius,top:t.y-t.radius,right:t.x+t.radius,bottom:t.y+t.radius},width:t.radius*2,height:t.radius*2};if(t.shape==="polygon"){let i=t.points,r=i.map(u=>u.x),s=i.map(u=>u.y),o=Math.min(...r),a=Math.max(...r),c=Math.min(...s),l=Math.max(...s);return{center:{x:(o+a)/2,y:(c+l)/2},bounds:{left:o,top:l,right:a,bottom:c},width:a-o,height:l-c}}if(t.shape==="pill"){let i=t.width/2,r=t.height/2;return{center:{x:t.x,y:t.y},bounds:{left:t.x-i,top:t.y-r,right:t.x+i,bottom:t.y+r},width:t.width,height:t.height}}throw new Error(`circuitJson bounds calculation not implemented for shape "${t.shape}"`)}_setPositionFromLayout(e){let{db:t}=this.root;t.pcb_smtpad.update(this.pcb_smtpad_id,{x:e.x,y:e.y});let i=t.pcb_solder_paste.list().find(r=>r.pcb_smtpad_id===this.pcb_smtpad_id);i&&t.pcb_solder_paste.update(i.pcb_solder_paste_id,{x:e.x,y:e.y}),this.matchedPort?._setPositionFromLayout(e)}},N9=class extends Me{constructor(){super(...arguments);f(this,"pcb_silkscreen_path_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenPath",zodProps:tq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{maybeFlipLayer:i}=this._getPcbPrimitiveFlippedHelpers(),r=i(t.layer??"top");if(r!=="top"&&r!=="bottom")throw new Error(`Invalid layer "${r}" for SilkscreenPath. Must be "top" or "bottom".`);let s=this._computePcbGlobalTransformBeforeLayout(),o=this.getSubcircuit(),a=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,c=e.pcb_silkscreen_path.insert({pcb_component_id:a,layer:r,route:t.route.map(l=>{let u=De(s,{x:l.x,y:l.y});return{...l,x:u.x,y:u.y}}),stroke_width:t.strokeWidth??.1,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_path_id=c.pcb_silkscreen_path_id}_setPositionFromLayout(e){let{db:t}=this.root,{_parsedProps:i}=this,r=t.pcb_silkscreen_path.get(this.pcb_silkscreen_path_id);if(!r)return;let s=0,o=0;for(let u of r.route)s+=u.x,o+=u.y;s/=r.route.length,o/=r.route.length;let a=e.x-s,c=e.y-o,l=r.route.map(u=>({...u,x:u.x+a,y:u.y+c}));t.pcb_silkscreen_path.update(this.pcb_silkscreen_path_id,{route:l})}getPcbSize(){let{_parsedProps:e}=this;if(!e.route||e.route.length===0)return{width:0,height:0};let t=1/0,i=-1/0,r=1/0,s=-1/0;for(let o of e.route)t=Math.min(t,o.x),i=Math.max(i,o.x),r=Math.min(r,o.y),s=Math.max(s,o.y);return{width:i-t,height:s-r}}},ELt=h.object({route:h.array(nb),source_trace_id:h.string().optional()}),A9=class extends Me{constructor(){super(...arguments);f(this,"pcb_trace_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbTrace",zodProps:ELt}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this.getPrimitiveContainer(),r=this.getSubcircuit(),{maybeFlipLayer:s}=this._getPcbPrimitiveFlippedHelpers(),o=this._computePcbGlobalTransformBeforeLayout(),a=t.route.map(l=>{let{x:u,y:p,...d}=l,_=De(o,{x:u,y:p});return l.route_type==="wire"&&l.layer?{..._,...d,layer:s(l.layer)}:{..._,...d}}),c=e.pcb_trace.insert({pcb_component_id:i.pcb_component_id,source_trace_id:t.source_trace_id,route:a,subcircuit_id:r?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_trace_id=c.pcb_trace_id}getPcbSize(){let{_parsedProps:e}=this;if(!e.route||e.route.length===0)return{width:0,height:0};let t=1/0,i=-1/0,r=1/0,s=-1/0;for(let o of e.route)t=Math.min(t,o.x),i=Math.max(i,o.x),r=Math.min(r,o.y),s=Math.max(s,o.y),o.route_type==="wire"&&(t=Math.min(t,o.x-o.width/2),i=Math.max(i,o.x+o.width/2),r=Math.min(r,o.y-o.width/2),s=Math.max(s,o.y+o.width/2));return t===1/0||i===-1/0||r===1/0||s===-1/0?{width:0,height:0}:{width:i-t,height:s-r}}},Ld=class extends Me{constructor(){super(...arguments);f(this,"pcb_plated_hole_id",null);f(this,"matchedPort",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PlatedHole",zodProps:nH}}getAvailablePcbLayers(){return["top","inner1","inner2","bottom"]}getPcbSize(){let{_parsedProps:e}=this;if(e.shape==="circle")return{width:e.outerDiameter,height:e.outerDiameter};if(e.shape==="oval"||e.shape==="pill")return{width:e.outerWidth,height:e.outerHeight};if(e.shape==="circular_hole_with_rect_pad")return{width:e.rectPadWidth,height:e.rectPadHeight};if(e.shape==="pill_hole_with_rect_pad")return{width:e.rectPadWidth,height:e.rectPadHeight};if(e.shape==="hole_with_polygon_pad"){if(!e.padOutline||e.padOutline.length===0)throw new Error("padOutline is required for hole_with_polygon_pad shape");let t=e.padOutline.map(c=>typeof c.x=="number"?c.x:parseFloat(String(c.x))),i=e.padOutline.map(c=>typeof c.y=="number"?c.y:parseFloat(String(c.y))),r=Math.min(...t),s=Math.max(...t),o=Math.min(...i),a=Math.max(...i);return{width:s-r,height:a-o}}throw new Error(`getPcbSize for shape "${e.shape}" not implemented for ${this.componentName}`)}_getPcbCircuitJsonBounds(){let{db:e}=this.root,t=e.pcb_plated_hole.get(this.pcb_plated_hole_id),i=this.getPcbSize();return{center:{x:t.x,y:t.y},bounds:{left:t.x-i.width/2,top:t.y+i.height/2,right:t.x+i.width/2,bottom:t.y-i.height/2},width:i.width,height:i.height}}_setPositionFromLayout(e){let{db:t}=this.root;t.pcb_plated_hole.update(this.pcb_plated_hole_id,{x:e.x,y:e.y}),this.matchedPort?._setPositionFromLayout(e)}doInitialPortMatching(){let e=this.getPrimitiveContainer()?.selectAll("port");if(this.props.portHints){for(let t of e)if(t.isMatchingAnyOf(this.props.portHints)){this.matchedPort=t,t.registerMatch(this);return}}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalPcbPositionBeforeLayout(),r=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,s=this.getSubcircuit(),o=t.solderMaskMargin,a=t.coveredWithSolderMask??!1;if(t.shape==="circle"){let c=e.pcb_plated_hole.insert({pcb_component_id:r,pcb_port_id:this.matchedPort?.pcb_port_id,outer_diameter:t.outerDiameter,hole_diameter:t.holeDiameter,shape:"circle",port_hints:this.getNameAndAliases(),x:i.x,y:i.y,layers:["top","bottom"],soldermask_margin:o,is_covered_with_solder_mask:a,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=c.pcb_plated_hole_id,e.pcb_solder_paste.insert({layer:"top",shape:"circle",radius:t.outerDiameter/2,x:i.x,y:i.y,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),e.pcb_solder_paste.insert({layer:"bottom",shape:"circle",radius:t.outerDiameter/2,x:i.x,y:i.y,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(t.shape==="pill"&&t.rectPad){let c=e.pcb_plated_hole.insert({pcb_component_id:r,pcb_port_id:this.matchedPort?.pcb_port_id,outer_width:t.outerWidth,outer_height:t.outerHeight,hole_width:t.holeWidth,hole_height:t.holeHeight,shape:"rotated_pill_hole_with_rect_pad",type:"pcb_plated_hole",port_hints:this.getNameAndAliases(),pcb_plated_hole_id:this.pcb_plated_hole_id,x:i.x,y:i.y,layers:["top","bottom"],soldermask_margin:o,is_covered_with_solder_mask:a,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,hole_shape:"rotated_pill",pad_shape:"rect",hole_ccw_rotation:t.pcbRotation??0,rect_ccw_rotation:t.pcbRotation??0,rect_pad_width:t.outerWidth,rect_pad_height:t.outerHeight,hole_offset_x:t.holeOffsetX,hole_offset_y:t.holeOffsetY});this.pcb_plated_hole_id=c.pcb_plated_hole_id}else if(t.shape==="pill"||t.shape==="oval"){let c=e.pcb_plated_hole.insert({pcb_component_id:r,pcb_port_id:this.matchedPort?.pcb_port_id,outer_width:t.outerWidth,outer_height:t.outerHeight,hole_width:t.holeWidth,hole_height:t.holeHeight,shape:t.shape,port_hints:this.getNameAndAliases(),x:i.x,y:i.y,layers:["top","bottom"],soldermask_margin:o,is_covered_with_solder_mask:a,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,ccw_rotation:t.pcbRotation??0});this.pcb_plated_hole_id=c.pcb_plated_hole_id,e.pcb_solder_paste.insert({layer:"top",shape:t.shape,width:t.outerWidth,height:t.outerHeight,x:i.x,y:i.y,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),e.pcb_solder_paste.insert({layer:"bottom",shape:t.shape,width:t.outerWidth,height:t.outerHeight,x:i.x,y:i.y,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(t.shape==="circular_hole_with_rect_pad"){let c=e.pcb_plated_hole.insert({pcb_component_id:r,pcb_port_id:this.matchedPort?.pcb_port_id,hole_diameter:t.holeDiameter,rect_pad_width:t.rectPadWidth,rect_pad_height:t.rectPadHeight,shape:"circular_hole_with_rect_pad",port_hints:this.getNameAndAliases(),x:i.x,y:i.y,layers:["top","bottom"],soldermask_margin:o,is_covered_with_solder_mask:a,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,hole_offset_x:t.holeOffsetX,hole_offset_y:t.holeOffsetY,rect_border_radius:t.rectBorderRadius??0});this.pcb_plated_hole_id=c.pcb_plated_hole_id}else if(t.shape==="pill_hole_with_rect_pad"){let c=e.pcb_plated_hole.insert({pcb_component_id:r,pcb_port_id:this.matchedPort?.pcb_port_id,hole_width:t.holeWidth,hole_height:t.holeHeight,rect_pad_width:t.rectPadWidth,rect_pad_height:t.rectPadHeight,hole_offset_x:t.holeOffsetX,hole_offset_y:t.holeOffsetY,shape:"pill_hole_with_rect_pad",port_hints:this.getNameAndAliases(),x:i.x,y:i.y,layers:["top","bottom"],soldermask_margin:o,is_covered_with_solder_mask:a,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=c.pcb_plated_hole_id}else if(t.shape==="hole_with_polygon_pad"){let c=(t.padOutline||[]).map(u=>{let p=typeof u.x=="number"?u.x:parseFloat(String(u.x)),d=typeof u.y=="number"?u.y:parseFloat(String(u.y));return{x:p,y:d}}),l=e.pcb_plated_hole.insert({pcb_component_id:r,pcb_port_id:this.matchedPort?.pcb_port_id,shape:"hole_with_polygon_pad",hole_shape:t.holeShape||"circle",hole_diameter:t.holeDiameter,hole_width:t.holeWidth,hole_height:t.holeHeight,pad_outline:c,hole_offset_x:typeof t.holeOffsetX=="number"?t.holeOffsetX:parseFloat(String(t.holeOffsetX||0)),hole_offset_y:typeof t.holeOffsetY=="number"?t.holeOffsetY:parseFloat(String(t.holeOffsetY||0)),port_hints:this.getNameAndAliases(),x:i.x,y:i.y,layers:["top","bottom"],soldermask_margin:o,is_covered_with_solder_mask:a,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=l.pcb_plated_hole_id}}doInitialPcbPortAttachment(){if(this.root?.pcbDisabled)return;let{db:e}=this.root;e.pcb_plated_hole.update(this.pcb_plated_hole_id,{pcb_port_id:this.matchedPort?.pcb_port_id})}},cP=class extends Me{constructor(){super(...arguments);f(this,"pcb_keepout_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Keepout",zodProps:$H}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let e=this.getSubcircuit(),{db:t}=this.root,{_parsedProps:i}=this,r=this._getGlobalPcbPositionBeforeLayout(),s=io(this._computePcbGlobalTransformBeforeLayout()),o=Math.abs(s.rotation.angle*(180/Math.PI)-90)%180<.01,a=null;i.shape==="circle"?a=t.pcb_keepout.insert({layers:["top"],shape:"circle",radius:i.radius,center:{x:r.x,y:r.y},subcircuit_id:e?.subcircuit_id??void 0,pcb_group_id:e?.getGroup()?.pcb_group_id??void 0}):i.shape==="rect"&&(a=t.pcb_keepout.insert({layers:["top"],shape:"rect",...o?{width:i.height,height:i.width}:{width:i.width,height:i.height},center:{x:r.x,y:r.y},subcircuit_id:e?.subcircuit_id??void 0,pcb_group_id:e?.getGroup()?.pcb_group_id??void 0})),a&&(this.pcb_keepout_id=a.pcb_keepout_id)}},W_=class extends Me{constructor(){super(...arguments);f(this,"pcb_hole_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Hole",zodProps:dH}}getPcbSize(){let{_parsedProps:e}=this,t=e.shape==="pill",i=e.shape==="rect";return t?{width:e.width,height:e.height}:i?{width:e.width,height:e.height}:{width:e.diameter,height:e.diameter}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this.getSubcircuit(),r=this._getGlobalPcbPositionBeforeLayout(),s=t.solderMaskMargin,o=t.coveredWithSolderMask??!1;if(t.shape==="pill")if(t.pcbRotation&&t.pcbRotation!==0){let a=e.pcb_hole.insert({type:"pcb_hole",hole_shape:"rotated_pill",hole_width:t.width,hole_height:t.height,x:r.x,y:r.y,ccw_rotation:t.pcbRotation,soldermask_margin:s,is_covered_with_solder_mask:o,subcircuit_id:i?.subcircuit_id??void 0,pcb_group_id:i?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=a.pcb_hole_id}else{let a=e.pcb_hole.insert({type:"pcb_hole",hole_shape:"pill",hole_width:t.width,hole_height:t.height,x:r.x,y:r.y,soldermask_margin:s,is_covered_with_solder_mask:o,subcircuit_id:i?.subcircuit_id??void 0,pcb_group_id:i?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=a.pcb_hole_id}else if(t.shape==="rect"){let a=e.pcb_hole.insert({type:"pcb_hole",hole_shape:"rect",hole_width:t.width,hole_height:t.height,x:r.x,y:r.y,soldermask_margin:s,is_covered_with_solder_mask:o,subcircuit_id:i?.subcircuit_id??void 0,pcb_group_id:i?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=a.pcb_hole_id}else{let a=e.pcb_hole.insert({type:"pcb_hole",hole_shape:"circle",hole_diameter:t.diameter,x:r.x,y:r.y,soldermask_margin:s,is_covered_with_solder_mask:o,subcircuit_id:i?.subcircuit_id??void 0,pcb_group_id:i?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=a.pcb_hole_id}}_getPcbCircuitJsonBounds(){let{db:e}=this.root,t=e.pcb_hole.get(this.pcb_hole_id),i=this.getPcbSize();return{center:{x:t.x,y:t.y},bounds:{left:t.x-i.width/2,top:t.y-i.height/2,right:t.x+i.width/2,bottom:t.y+i.height/2},width:i.width,height:i.height}}_setPositionFromLayout(e){let{db:t}=this.root;t.pcb_hole.update(this.pcb_hole_id,{x:e.x,y:e.y})}};function dP(n){return n.replace(/\\n/g,`
|
|
251
251
|
`)}var fP=class extends Me{constructor(){super(...arguments);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenText",zodProps:QH}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this.getPrimitiveContainer(),r=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer:s,isFlipped:o}=this._getPcbPrimitiveFlippedHelpers(),a=this.getSubcircuit(),c=0;if(t.pcbRotation!==void 0&&t.pcbRotation!==0)c=t.pcbRotation;else{let d=this._computePcbGlobalTransformBeforeLayout();c=io(d).rotation.angle*180/Math.PI}o&&(c=(c+180)%360);let l=new Set(t.layers);t.layer&&l.add(t.layer);let u=l.size>0?Array.from(l):["top"],p=t.fontSize??this.getInheritedProperty("pcbStyle")?.silkscreenFontSize??1;for(let d of u)e.pcb_silkscreen_text.insert({anchor_alignment:t.anchorAlignment,anchor_position:{x:r.x,y:r.y},font:t.font??"tscircuit2024",font_size:p,layer:s(d),text:dP(t.text??""),ccw_rotation:c,pcb_component_id:i.pcb_component_id,subcircuit_id:a?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}getPcbSize(){let{_parsedProps:e}=this,t=e.fontSize??this.getInheritedProperty("pcbStyle")?.silkscreenFontSize??1,r=(e.text??"").length*t,s=t;return{width:r*t,height:s*t}}},G1=class extends Me{constructor(){super(...arguments);f(this,"pcb_cutout_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Cutout",zodProps:pH}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this.getSubcircuit(),r=this.getGroup()?.pcb_group_id??void 0,s=this._getGlobalPcbPositionBeforeLayout(),a=this.getPrimitiveContainer()?._parsedProps.pcbRotation??0,c;if(t.shape==="rect"){let l=typeof a=="string"?parseInt(a.replace("deg",""),10):a,u=Math.abs(l%180)===90,p={shape:"rect",center:s,width:u?t.height:t.width,height:u?t.width:t.height,subcircuit_id:i?.subcircuit_id??void 0,pcb_group_id:r};c=e.pcb_cutout.insert(p)}else if(t.shape==="circle"){let l={shape:"circle",center:s,radius:t.radius,subcircuit_id:i?.subcircuit_id??void 0,pcb_group_id:r};c=e.pcb_cutout.insert(l)}else if(t.shape==="polygon"){let l=this._computePcbGlobalTransformBeforeLayout(),p={shape:"polygon",points:t.points.map(d=>De(l,d)),subcircuit_id:i?.subcircuit_id??void 0,pcb_group_id:r};c=e.pcb_cutout.insert(p)}c&&(this.pcb_cutout_id=c.pcb_cutout_id)}getPcbSize(){let{_parsedProps:e}=this;if(e.shape==="rect")return{width:e.width,height:e.height};if(e.shape==="circle")return{width:e.radius*2,height:e.radius*2};if(e.shape==="polygon"){if(e.points.length===0)return{width:0,height:0};let t=1/0,i=-1/0,r=1/0,s=-1/0;for(let o of e.points)t=Math.min(t,o.x),i=Math.max(i,o.x),r=Math.min(r,o.y),s=Math.max(s,o.y);return{width:i-t,height:s-r}}return{width:0,height:0}}_getPcbCircuitJsonBounds(){if(!this.pcb_cutout_id)return super._getPcbCircuitJsonBounds();let{db:e}=this.root,t=e.pcb_cutout.get(this.pcb_cutout_id);if(!t)return super._getPcbCircuitJsonBounds();if(t.shape==="rect")return{center:t.center,bounds:{left:t.center.x-t.width/2,top:t.center.y+t.height/2,right:t.center.x+t.width/2,bottom:t.center.y-t.height/2},width:t.width,height:t.height};if(t.shape==="circle")return{center:t.center,bounds:{left:t.center.x-t.radius,top:t.center.y+t.radius,right:t.center.x+t.radius,bottom:t.center.y-t.radius},width:t.radius*2,height:t.radius*2};if(t.shape==="polygon"){if(t.points.length===0)return super._getPcbCircuitJsonBounds();let i=1/0,r=-1/0,s=1/0,o=-1/0;for(let a of t.points)i=Math.min(i,a.x),r=Math.max(r,a.x),s=Math.min(s,a.y),o=Math.max(o,a.y);return{center:{x:(i+r)/2,y:(s+o)/2},bounds:{left:i,top:o,right:r,bottom:s},width:r-i,height:o-s}}return super._getPcbCircuitJsonBounds()}_setPositionFromLayout(e){if(!this.pcb_cutout_id)return;let{db:t}=this.root,i=t.pcb_cutout.get(this.pcb_cutout_id);if(i){if(i.shape==="rect"||i.shape==="circle")t.pcb_cutout.update(this.pcb_cutout_id,{...i,center:e});else if(i.shape==="polygon"){let r=this._getPcbCircuitJsonBounds().center,s=e.x-r.x,o=e.y-r.y,a=i.points.map(c=>({x:c.x+s,y:c.y+o}));t.pcb_cutout.update(this.pcb_cutout_id,{...i,points:a})}}}},MLt=({elm:n,pinLabels:e,layer:t,readableRotation:i,anchorAlignment:r})=>{let s=n.text.replace(/[{}]/g,"").toLowerCase(),o=s;if(Array.isArray(e)){let a=parseInt(s.replace(/[^\d]/g,""),10)-1;o=String(e[a]??s)}else typeof e=="object"&&(o=String(e[s]??s));return new fP({anchorAlignment:r||"center",text:o??s,layer:t||"top",fontSize:n.font_size+.2,pcbX:isNaN(n.anchor_position.x)?0:n.anchor_position.x,pcbY:n.anchor_position.y,pcbRotation:i??0})},CLt=(n,e)=>{let t=parseInt(n||"0",10),i;return e!=null?i=e-t:i=t,(i%360+360)%360},H_=({componentName:n,componentRotation:e,footprinterString:t,pinLabels:i,pcbPinLabels:r},s)=>{let o=[];for(let a of s)if(a.type==="pcb_smtpad"&&a.shape==="rect")o.push(new V1({pcbX:a.x,pcbY:a.y,layer:a.layer,shape:"rect",height:a.height,width:a.width,portHints:a.port_hints,rectBorderRadius:a.rect_border_radius}));else if(a.type==="pcb_smtpad"&&a.shape==="circle")o.push(new V1({pcbX:a.x,pcbY:a.y,layer:a.layer,shape:"circle",radius:a.radius,portHints:a.port_hints}));else if(a.type==="pcb_smtpad"&&a.shape==="pill")o.push(new V1({shape:"pill",height:a.height,width:a.width,radius:a.radius,portHints:a.port_hints,pcbX:a.x,pcbY:a.y,layer:a.layer}));else if(a.type==="pcb_silkscreen_path")o.push(new N9({layer:a.layer,route:a.route,strokeWidth:a.stroke_width}));else if(a.type==="pcb_plated_hole")a.shape==="circle"?o.push(new Ld({pcbX:a.x,pcbY:a.y,shape:"circle",holeDiameter:a.hole_diameter,outerDiameter:a.outer_diameter,portHints:a.port_hints})):a.shape==="circular_hole_with_rect_pad"?o.push(new Ld({pcbX:a.x,pcbY:a.y,shape:"circular_hole_with_rect_pad",holeDiameter:a.hole_diameter,rectPadHeight:a.rect_pad_height,rectPadWidth:a.rect_pad_width,portHints:a.port_hints,rectBorderRadius:a.rect_border_radius,holeOffsetX:a.hole_offset_x,holeOffsetY:a.hole_offset_y})):a.shape==="pill"||a.shape==="oval"?o.push(new Ld({pcbX:a.x,pcbY:a.y,shape:a.shape,holeWidth:a.hole_width,holeHeight:a.hole_height,outerWidth:a.outer_width,outerHeight:a.outer_height,portHints:a.port_hints})):a.shape==="pill_hole_with_rect_pad"?o.push(new Ld({pcbX:a.x,pcbY:a.y,shape:"pill_hole_with_rect_pad",holeShape:"pill",padShape:"rect",holeWidth:a.hole_width,holeHeight:a.hole_height,rectPadWidth:a.rect_pad_width,rectPadHeight:a.rect_pad_height,portHints:a.port_hints,holeOffsetX:a.hole_offset_x,holeOffsetY:a.hole_offset_y})):a.shape==="hole_with_polygon_pad"&&o.push(new Ld({pcbX:a.x,pcbY:a.y,shape:"hole_with_polygon_pad",holeShape:a.hole_shape||"circle",holeDiameter:a.hole_diameter,holeWidth:a.hole_width,holeHeight:a.hole_height,padOutline:a.pad_outline||[],holeOffsetX:a.hole_offset_x,holeOffsetY:a.hole_offset_y,portHints:a.port_hints}));else if(a.type==="pcb_keepout"&&a.shape==="circle")o.push(new cP({pcbX:a.center.x,pcbY:a.center.y,shape:"circle",radius:a.radius}));else if(a.type==="pcb_keepout"&&a.shape==="rect")o.push(new cP({pcbX:a.center.x,pcbY:a.center.y,shape:"rect",width:a.width,height:a.height}));else if(a.type==="pcb_hole"&&a.hole_shape==="circle")o.push(new W_({pcbX:a.x,pcbY:a.y,diameter:a.hole_diameter}));else if(a.type==="pcb_hole"&&a.hole_shape==="rect")o.push(new W_({pcbX:a.x,pcbY:a.y,shape:"rect",width:a.hole_width,height:a.hole_height}));else if(a.type==="pcb_hole"&&a.hole_shape==="pill")o.push(new W_({pcbX:a.x,pcbY:a.y,shape:"pill",width:a.hole_width,height:a.hole_height}));else if(a.type==="pcb_hole"&&a.hole_shape==="rotated_pill")o.push(new W_({pcbX:a.x,pcbY:a.y,shape:"pill",width:a.hole_width,height:a.hole_height,pcbRotation:a.ccw_rotation}));else if(a.type==="pcb_cutout")a.shape==="rect"?o.push(new G1({pcbX:a.center.x,pcbY:a.center.y,shape:"rect",width:a.width,height:a.height})):a.shape==="circle"?o.push(new G1({pcbX:a.center.x,pcbY:a.center.y,shape:"circle",radius:a.radius})):a.shape==="polygon"&&o.push(new G1({shape:"polygon",points:a.points}));else if(a.type==="pcb_silkscreen_text"){let c=CLt(e,a.ccw_rotation);t?.includes("pinrow")&&a.text.includes("PIN")?o.push(MLt({elm:a,pinLabels:r??i??{},layer:a.layer,readableRotation:c,anchorAlignment:a.anchor_alignment})):o.push(new fP({anchorAlignment:a.anchor_alignment||"center",text:n||a.text,fontSize:a.font_size+.2,pcbX:Number.isNaN(a.anchor_position.x)?0:a.anchor_position.x,pcbY:a.anchor_position.y,pcbRotation:c??0}))}else a.type==="pcb_trace"&&o.push(new A9({route:a.route}));return o};function mP(n){let e=1/0,t=1/0,i=-1/0,r=-1/0,s=!1;for(let c of n)if(c.isPcbPrimitive&&!c.componentName.startsWith("Silkscreen")){let{x:l,y:u}=c._getGlobalPcbPositionBeforeLayout(),{width:p,height:d}=c.getPcbSize();e=Math.min(e,l-p/2),t=Math.min(t,u-d/2),i=Math.max(i,l+p/2),r=Math.max(r,u+d/2),s=!0}else if(c.children.length>0){let l=mP(c.children);(l.width>0||l.height>0)&&(e=Math.min(e,l.minX),t=Math.min(t,l.minY),i=Math.max(i,l.maxX),r=Math.max(r,l.maxY),s=!0)}if(!s)return{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0};let o=i-e,a=r-t;return o<0&&(o=0),a<0&&(a=0),{minX:e,minY:t,maxX:i,maxY:r,width:o,height:a}}function Xet(n){let e=n%360;return e<0?e+360:e}function ILt(n,e,t,i){return i==="counterclockwise"?t>=e?n>=e&&n<=t:n>=e||n<=t:t<=e?n<=e&&n>=t:n<=e||n>=t}function NLt(n){let e=n.center,t=n.radius,i=n.start_angle_degrees,r=n.end_angle_degrees,s=n.direction??"counterclockwise";if(!e||typeof e.x!="number"||typeof e.y!="number"||typeof t!="number"||typeof i!="number"||typeof r!="number")return null;let o=Xet(i),a=Xet(r),c=new Set([o,a]),l=[0,90,180,270];for(let g of l)ILt(g,o,a,s)&&c.add(g);let u=1/0,p=1/0,d=-1/0,_=-1/0;for(let g of c){let x=g*Math.PI/180,v=e.x+t*Math.cos(x),S=e.y+t*Math.sin(x);u=Math.min(u,v),d=Math.max(d,v),p=Math.min(p,S),_=Math.max(_,S)}return!Number.isFinite(u)||!Number.isFinite(p)?null:{minX:u,maxX:d,minY:p,maxY:_}}function Ent(n){let e=1/0,t=1/0,i=-1/0,r=-1/0;for(let s of n){let o,a,c,l;if(s.type==="schematic_component")o=s.center?.x,a=s.center?.y,c=s.size?.width,l=s.size?.height;else if(s.type==="schematic_box")o=s.x,a=s.y,c=s.width,l=s.height;else if(s.type==="schematic_port")o=s.center?.x,a=s.center?.y,c=.2,l=.2;else if(s.type==="schematic_text")o=s.position?.x,a=s.position?.y,c=(s.text?.length??0)*.1,l=.2;else if(s.type==="schematic_line"){let u=s.x1??0,p=s.y1??0,d=s.x2??0,_=s.y2??0;o=(u+d)/2,a=(p+_)/2,c=Math.abs(d-u),l=Math.abs(_-p)}else if(s.type==="schematic_rect")o=s.center?.x,a=s.center?.y,c=s.width,l=s.height;else if(s.type==="schematic_circle"){o=s.center?.x,a=s.center?.y;let u=s.radius;typeof u=="number"&&(c=u*2,l=u*2)}else if(s.type==="schematic_arc"){let u=NLt(s);u&&(e=Math.min(e,u.minX),i=Math.max(i,u.maxX),t=Math.min(t,u.minY),r=Math.max(r,u.maxY));continue}typeof o=="number"&&typeof a=="number"&&typeof c=="number"&&typeof l=="number"&&(e=Math.min(e,o-c/2),i=Math.max(i,o+c/2),t=Math.min(t,a-l/2),r=Math.max(r,a+l/2))}return{minX:e,maxX:i,minY:t,maxY:r}}function ALt(n,e){let t=e.x-n.x,i=e.y-n.y;return Math.abs(t)>Math.abs(i)?t>=0?"right":"left":i>=0?"up":"down"}var Uet=n=>{if(n.length<=1)return!0;let e=n.map(s=>{let o=s._getPcbCircuitJsonBounds();return{left:o.bounds.left,right:o.bounds.right,top:o.bounds.top,bottom:o.bounds.bottom}}),t=Array(e.length).fill(!1).map(()=>Array(e.length).fill(!1));for(let s=0;s<e.length;s++)for(let o=s+1;o<e.length;o++){let a=e[s],c=e[o];t[s][o]=t[o][s]=!(a.right<c.left||a.left>c.right||a.bottom>c.top||a.top<c.bottom)}let i=new Set,r=s=>{i.add(s);for(let o=0;o<e.length;o++)t[s][o]&&!i.has(o)&&r(o)};return r(0),i.size===e.length},Vet=n=>{if(n.length===0)throw new Error("Cannot get center of empty PCB primitives array");let e=n.map(r=>r._getPcbCircuitJsonBounds().center).filter(Boolean),t=e.reduce((r,s)=>r+s.x,0),i=e.reduce((r,s)=>r+s.y,0);return{x:t/e.length,y:i/e.length}},RLt=h.object({name:h.string().optional(),pinNumber:h.number().optional(),aliases:h.array(h.string()).optional(),layer:h.string().optional(),layers:h.array(h.string()).optional(),schX:h.number().optional(),schY:h.number().optional(),direction:h.enum(["up","down","left","right"]).optional(),connectsTo:h.union([h.string(),h.array(h.string())]).optional()}),Wi=class extends Me{constructor(e,t={}){if(!e.name&&e.pinNumber!==void 0&&(e.name=`pin${e.pinNumber}`),!e.name)throw new Error("Port must have a name or a pinNumber");super(e);f(this,"source_port_id",null);f(this,"pcb_port_id",null);f(this,"schematic_port_id",null);f(this,"schematicSymbolPortDef",null);f(this,"matchedComponents");f(this,"facingDirection",null);f(this,"originDescription",null);t.originDescription&&(this.originDescription=t.originDescription),this.matchedComponents=[]}get config(){return{componentName:"Port",zodProps:RLt}}isGroupPort(){return this.parent?.componentName==="Group"}isComponentPort(){return!this.isGroupPort()}_getConnectedPortsFromConnectsTo(){let{_parsedProps:e}=this,t=e.connectsTo;if(!t)return[];let i=[],r=Array.isArray(t)?t:[t];for(let s of r){let o=this.getSubcircuit().selectOne(s,{type:"port"});o&&i.push(o)}return i}_isBoardPinoutFromAttributes(){let e=this.parent;if(e?._parsedProps?.pinAttributes){let t=e._parsedProps.pinAttributes;for(let i of this.getNameAndAliases())if(t[i]?.includeInBoardPinout)return!0}}_getGlobalPcbPositionBeforeLayout(){let e=this.matchedComponents.find(i=>i.isPcbPrimitive),t=this.parent;if(t&&!t.props.footprint)throw new Error(`${t.componentName} "${t.props.name}" does not have a footprint. Add a footprint prop, e.g. <${t.componentName.toLowerCase()} footprint="..." />`);if(!e)throw new Error(`Port ${this} has no matching PCB primitives. This often means the footprint's pads lack matching port hints.`);return e?._getGlobalPcbPositionBeforeLayout()??{x:0,y:0}}_getPcbCircuitJsonBounds(){if(!this.pcb_port_id)return super._getPcbCircuitJsonBounds();let{db:e}=this.root,t=e.pcb_port.get(this.pcb_port_id);return{center:{x:t.x,y:t.y},bounds:{left:0,top:0,right:0,bottom:0},width:0,height:0}}_getGlobalPcbPositionAfterLayout(){return this._getPcbCircuitJsonBounds().center}_getPortsInternallyConnectedToThisPort(){let e=this.parent;if(!e||!e._getInternallyConnectedPins)return[];let t=e._getInternallyConnectedPins();for(let i of t)if(i.some(r=>r===this))return i;return[]}_hasSchematicPort(){let{schX:e,schY:t}=this._parsedProps;if(e!==void 0&&t!==void 0)return!0;let i=this.getParentNormalComponent();if(i?.getSchematicSymbol())return!!(this.schematicSymbolPortDef||this._getPortsInternallyConnectedToThisPort().some(a=>a.schematicSymbolPortDef));let s=i?._getSchematicBoxDimensions();return!!(s&&this.props.pinNumber!==void 0&&s.getPortPositionByPinNumber(this.props.pinNumber))}_getGlobalSchematicPositionBeforeLayout(){let{schX:e,schY:t}=this._parsedProps;if(e!==void 0&&t!==void 0)return{x:e,y:t};let i=this.getParentNormalComponent(),r=i?.getSchematicSymbol();if(r){let o=this.schematicSymbolPortDef;if(!o&&(o=this._getPortsInternallyConnectedToThisPort().find(c=>c.schematicSymbolPortDef)?.schematicSymbolPortDef??null,!o))throw new Error(`Couldn't find schematicSymbolPortDef for port ${this.getString()}, searched internally connected ports and none had a schematicSymbolPortDef. Why are we trying to get the schematic position of this port?`);let a=ri(i.computeSchematicGlobalTransform(),kn(-r.center.x,-r.center.y));return De(a,o)}let s=i?._getSchematicBoxDimensions();if(s&&this.props.pinNumber!==void 0){let o=s.getPortPositionByPinNumber(this.props.pinNumber);if(!o)throw new Error(`Couldn't find position for schematic_port for port ${this.getString()} inside of the schematic box`);return De(i.computeSchematicGlobalTransform(),o)}throw new Error(`Couldn't find position for schematic_port for port ${this.getString()}`)}_getGlobalSchematicPositionAfterLayout(){let{db:e}=this.root;if(!this.schematic_port_id)throw new Error(`Can't get schematic port position after layout for "${this.getString()}", no schematic_port_id`);let t=e.schematic_port.get(this.schematic_port_id);if(!t)throw new Error(`Schematic port not found when trying to get post-layout position: ${this.schematic_port_id}`);return t.center}registerMatch(e){this.matchedComponents.push(e)}getNameAndAliases(){let{_parsedProps:e}=this;return Array.from(new Set([...e.name?[e.name]:[],...e.aliases??[],...typeof e.pinNumber=="number"?[`pin${e.pinNumber}`,e.pinNumber.toString()]:[],...this.externallyAddedAliases??[]]))}_getMatchingPinAttributes(){let e=this.parent?._parsedProps?.pinAttributes;if(!e)return[];let t=[];for(let i of this.getNameAndAliases()){let r=e[i];r&&t.push(r)}return t}_shouldIncludeInBoardPinout(){return this._getMatchingPinAttributes().some(e=>e.includeInBoardPinout===!0)}isMatchingPort(e){return this.isMatchingAnyOf(e.getNameAndAliases())}getPortSelector(){return`.${(this.getParentNormalComponent()??this.parent)?.props.name} > port.${this.props.name}`}getAvailablePcbLayers(){let{layer:e,layers:t}=this._parsedProps;return t||(e?[e]:Array.from(new Set(this.matchedComponents.flatMap(i=>i.getAvailablePcbLayers()))))}_getDirectlyConnectedTraces(){return this.getSubcircuit().selectAll("trace").filter(i=>!i._couldNotFindPort).filter(i=>i._isExplicitlyConnectedToPort(this))}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=this.getNameAndAliases(),r=this.getParentNormalComponent(),o=(this.parent?.source_component_id?this.parent:r)?.source_component_id??null,a=this._getMatchingPinAttributes(),c={};for(let u of a)u.mustBeConnected!==void 0&&(c.must_be_connected=u.mustBeConnected);let l=e.source_port.insert({name:t.name,pin_number:t.pinNumber,port_hints:i,source_component_id:o,subcircuit_id:this.getSubcircuit()?.subcircuit_id,...c});this.source_port_id=l.source_port_id}doInitialSourceParentAttachment(){let{db:e}=this.root,t=this.getParentNormalComponent(),i=this.parent?.source_component_id?this.parent:t;if(this.isGroupPort()){e.source_port.update(this.source_port_id,{source_component_id:null,subcircuit_id:this.getSubcircuit()?.subcircuit_id});return}if(!i?.source_component_id)throw new Error(`${this.getString()} has no parent source component (parent: ${this.parent?.getString()})`);e.source_port.update(this.source_port_id,{source_component_id:i.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id}),this.source_component_id=i.source_component_id}doInitialPcbPortRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{matchedComponents:t}=this;if(this.isGroupPort()){let a=this._getConnectedPortsFromConnectsTo();if(a.length===0)return;let c=a[0];if(!c.pcb_port_id)return;let l=e.pcb_port.get(c.pcb_port_id),u={x:l.x,y:l.y},p=this.getSubcircuit(),d=e.pcb_port.insert({pcb_component_id:void 0,layers:c.getAvailablePcbLayers(),subcircuit_id:p?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...u,source_port_id:this.source_port_id,is_board_pinout:!1});this.pcb_port_id=d.pcb_port_id;return}let i=this.getParentNormalComponent(),r=this.parent?.pcb_component_id?this.parent:i;if(!r?.pcb_component_id)throw new Error(`${this.getString()} has no parent pcb component, cannot render pcb_port (parent: ${this.parent?.getString()}, parentNormalComponent: ${i?.getString()})`);let s=t.filter(a=>a.isPcbPrimitive);if(s.length===0)return;let o=null;if(s.length===1&&(o=s[0]._getPcbCircuitJsonBounds().center),s.length>1){if(!Uet(s))throw new Error(`${this.getString()} has multiple non-overlapping pcb matches, unclear how to place pcb_port: ${s.map(a=>a.getString()).join(", ")}. (Note: tscircuit core does not currently allow you to specify internally connected pcb primitives with the same port hints, try giving them different port hints and specifying they are connected externally- or file an issue)`);o=Vet(s)}if(o){let a=this.getSubcircuit(),c=this._shouldIncludeInBoardPinout(),l=e.pcb_port.insert({pcb_component_id:r.pcb_component_id,layers:this.getAvailablePcbLayers(),subcircuit_id:a?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...c?{is_board_pinout:!0}:{},...o,source_port_id:this.source_port_id,is_board_pinout:this._isBoardPinoutFromAttributes()});this.pcb_port_id=l.pcb_port_id}else{let a=s[0];throw new Error(`${a.getString()} does not have a center or _getGlobalPcbPositionBeforeLayout method (needed for pcb_port placement)`)}}updatePcbPortRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root;if(this.pcb_port_id)return;if(this.isGroupPort()){let l=this._getConnectedPortsFromConnectsTo();if(l.length===0)return;let u=l[0];if(!u.pcb_port_id)return;let p=e.pcb_port.get(u.pcb_port_id),d={x:p.x,y:p.y},_=this.getSubcircuit(),g=e.pcb_port.insert({pcb_component_id:void 0,layers:u.getAvailablePcbLayers(),subcircuit_id:_?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...d,source_port_id:this.source_port_id,is_board_pinout:!1});this.pcb_port_id=g.pcb_port_id;return}let t=this.matchedComponents.filter(l=>l.isPcbPrimitive);if(t.length===0)return;let i=null;if(t.length===1&&(i=t[0]._getPcbCircuitJsonBounds().center),t.length>1)try{Uet(t)&&(i=Vet(t))}catch{}if(!i)return;let r=this.getParentNormalComponent(),s=this.parent?.pcb_component_id?this.parent:r,o=this.getSubcircuit(),a=this._shouldIncludeInBoardPinout(),c=e.pcb_port.insert({pcb_component_id:s?.pcb_component_id,layers:this.getAvailablePcbLayers(),subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...a?{is_board_pinout:!0}:{},...i,source_port_id:this.source_port_id,is_board_pinout:this._isBoardPinoutFromAttributes()});this.pcb_port_id=c.pcb_port_id}_getBestDisplayPinLabel(){let{db:e}=this.root,t=e.source_port.get(this.source_port_id),i=[];for(let o of t?.port_hints??[])o.match(/^(pin)?\d+$/)||o.match(/^(left|right)/)&&!t?.name.match(/^(left|right)/)||i.push(o);if(this.getParentNormalComponent()?.props?.showPinAliases&&i.length>0)return i.join("/");if(i.length>0)return i[0]}doInitialSchematicPortRender(){let{db:e}=this.root,{_parsedProps:t}=this,{schX:i,schY:r}=t,s=i!==void 0&&r!==void 0?this.getParentNormalComponent():this.getPrimitiveContainer();if(!s||!this._hasSchematicPort())return;let o=s._getGlobalSchematicPositionBeforeLayout(),a=this._getGlobalSchematicPositionBeforeLayout(),c=null,l=s._getSchematicBoxDimensions();l&&t.pinNumber!==void 0&&(c=l.getPortPositionByPinNumber(t.pinNumber)),this.getSubcircuit().props._schDebugObjectsEnabled&&e.schematic_debug_object.insert({shape:"rect",center:a,size:{width:.1,height:.1},label:"obstacle"}),c?.side?this.facingDirection={left:"left",right:"right",top:"up",bottom:"down"}[c.side]:this.facingDirection=ALt(o,a);let u=this._getBestDisplayPinLabel(),d={type:"schematic_port",schematic_component_id:this.getParentNormalComponent()?.schematic_component_id,center:a,source_port_id:this.source_port_id,facing_direction:this.facingDirection,distance_from_component_edge:.4,side_of_component:c?.side,pin_number:t.pinNumber,true_ccw_index:c?.trueIndex,display_pin_label:u,is_connected:!1};for(let g of this._getMatchingPinAttributes())g.requiresPower&&(d.has_input_arrow=!0),g.providesPower&&(d.has_output_arrow=!0);let _=e.schematic_port.insert(d);this.schematic_port_id=_.schematic_port_id}_getSubcircuitConnectivityKey(){return this.root?.db.source_port.get(this.source_port_id)?.subcircuit_connectivity_map_key}_setPositionFromLayout(e){let{db:t}=this.root;this.pcb_port_id&&t.pcb_port.update(this.pcb_port_id,{x:e.x,y:e.y})}_hasMatchedPcbPrimitive(){return this.matchedComponents.some(e=>e.isPcbPrimitive)}_getNetLabelText(){return`${this.parent?.props.name}_${this.props.name}`}},Mnt=n=>{let e=n.find(t=>/^(pin)?\d+$/.test(t));return e?Number.parseInt(e.replace(/^pin/,"")):null};function B1(n,e){let t=Mnt(n);if(!t)return null;let r=[...n.filter(s=>s.toString()!==t.toString()&&s!==`pin${t}`),...e?.additionalAliases?.[`pin${t}`]??[]];return new Wi({pinNumber:t,aliases:r})}var OLt=n=>{for(let e of["leftSide","rightSide","topSide","bottomSide"])if(e in n&&typeof n[e]=="number")throw new Error(`A number was specified for "${e}", you probably meant to use "size" not "side"`);return"leftSide"in n||"rightSide"in n||"topSide"in n||"bottomSide"in n},LLt=n=>{if(OLt(n))return{leftSize:n.leftSide?.pins.length??0,rightSize:n.rightSide?.pins.length??0,topSize:n.topSide?.pins.length??0,bottomSize:n.bottomSide?.pins.length??0};let{leftSize:e=0,rightSize:t=0,topSize:i=0,bottomSize:r=0}=n;return{leftSize:e,rightSize:t,topSize:i,bottomSize:r}},tP=.4;function Cnt(n){let e=n;return e.leftSide!==void 0||e.rightSide!==void 0||e.topSide!==void 0||e.bottomSide!==void 0}var FLt=n=>{let e=n.portDistanceFromEdge??.4,t=n.schPortArrangement?LLt(n.schPortArrangement):null,i={left:0,right:0,top:0,bottom:0},r=n.pinCount??null;if(r===null)if(t)r=t.leftSize+t.rightSize+t.topSize;else throw new Error("Could not determine pin count for the schematic box");if(r&&!t){let g=Math.floor(r/2);t={leftSize:r-g,rightSize:g,topSize:0,bottomSize:0}}t||(t={leftSize:0,rightSize:0,topSize:0,bottomSize:0});let s=({side:g,sideIndex:x,truePinIndex:v})=>{if(!n.schPortArrangement||!Cnt(n.schPortArrangement))return v+1;let S={left:"top-to-bottom",bottom:"left-to-right",right:"bottom-to-top",top:"right-to-left"}[g],P=n.schPortArrangement?.[`${g}Side`]?.direction??S,T=n.schPortArrangement?.[`${g}Side`]?.pins,k=x;return P!==S&&(k=T.length-x-1),W1(T[k],n.pinLabels)},o=[],a=0,c=0;for(let g=0;g<t.leftSize;g++){let x=s({side:"left",sideIndex:g,truePinIndex:c}),v=n.numericSchPinStyle?.[`pin${x}`]??n.numericSchPinStyle?.[x];v?.topMargin&&(a+=v.topMargin),o.push({trueIndex:c,pinNumber:x,side:"left",distanceFromOrthogonalEdge:a}),v?.bottomMargin&&(a+=v.bottomMargin),g===t.leftSize-1?i.left=a:a+=n.schPinSpacing,c++}a=0;for(let g=0;g<t.bottomSize;g++){let x=s({side:"bottom",sideIndex:g,truePinIndex:c}),v=n.numericSchPinStyle?.[`pin${x}`]??n.numericSchPinStyle?.[x];v?.leftMargin&&(a+=v.leftMargin),o.push({trueIndex:c,pinNumber:x,side:"bottom",distanceFromOrthogonalEdge:a}),v?.rightMargin&&(a+=v.rightMargin),g===t.bottomSize-1?i.bottom=a:a+=n.schPinSpacing,c++}a=0;for(let g=0;g<t.rightSize;g++){let x=s({side:"right",sideIndex:g,truePinIndex:c}),v=n.numericSchPinStyle?.[`pin${x}`]??n.numericSchPinStyle?.[x];v?.bottomMargin&&(a+=v.bottomMargin),o.push({trueIndex:c,pinNumber:x,side:"right",distanceFromOrthogonalEdge:a}),v?.topMargin&&(a+=v.topMargin),g===t.rightSize-1?i.right=a:a+=n.schPinSpacing,c++}a=0;for(let g=0;g<t.topSize;g++){let x=s({side:"top",sideIndex:g,truePinIndex:c}),v=n.numericSchPinStyle?.[`pin${x}`]??n.numericSchPinStyle?.[x];v?.rightMargin&&(a+=v.rightMargin),o.push({trueIndex:c,pinNumber:x,side:"top",distanceFromOrthogonalEdge:a}),v?.leftMargin&&(a+=v.leftMargin),g===t.topSize-1?i.top=a:a+=n.schPinSpacing,c++}let l=n.schWidth;if(l===void 0){l=Math.max(i.top+tP,i.bottom+tP),n.pinLabels&&o.filter(P=>P.side==="left"||P.side==="right").some(P=>n.pinLabels?.[`pin${P.pinNumber}`]||n.pinLabels?.[P.pinNumber])&&(l=Math.max(l,.5));let g=n.pinLabels?Math.max(...Object.values(n.pinLabels).map(v=>v.length*.1)):0,x=g>0?1.1:0;l=Math.max(l,g+x)}let u=n.schHeight;u||(u=Math.max(i.left+tP,i.right+tP));let p={left:{x:-l/2-e,y:i.left/2},bottom:{x:-i.bottom/2,y:-u/2-e},right:{x:l/2+e,y:-i.right/2},top:{x:i.top/2,y:u/2+e}},d={left:{x:0,y:-1},right:{x:0,y:1},top:{x:-1,y:0},bottom:{x:1,y:0}},_=o.map(g=>{let{distanceFromOrthogonalEdge:x,side:v}=g,S=p[v],P=d[v];return{x:S.x+x*P.x,y:S.y+x*P.y,...g}});return{getPortPositionByPinNumber(g){let x=_.find(v=>v.pinNumber.toString()===g.toString());return x||null},getSize(){return{width:l,height:u}},getSizeIncludingPins(){return{width:l+(t.leftSize||t.rightSize?.4:0),height:u+(t.topSize||t.bottomSize?.4:0)}},pinCount:r}},$Lt=(0,Int.default)("tscircuit:core:footprint"),Nnt=class extends Me{get config(){return{componentName:"Footprint",zodProps:mH}}doInitialPcbFootprintLayout(){if(this.root?.pcbDisabled)return;let n=this.children.filter(p=>p.componentName==="Constraint");if(n.length===0)return;let{isFlipped:e}=this._getPcbPrimitiveFlippedHelpers(),t=p=>e&&"left"in p&&"right"in p?{...p,left:p.right,right:p.left}:p,i=n.flatMap(p=>p._getAllReferencedComponents().componentsWithSelectors).map(({component:p,selector:d,componentSelector:_,edge:g})=>({component:p,selector:d,componentSelector:_,edge:g,bounds:p._getPcbCircuitJsonBounds()}));if(i.some(p=>p.edge))throw new Error("edge constraints not implemented yet for footprint layout, contributions welcome!");function r(p){return i.find(({selector:d})=>d===p)}let s=new o_,o={};function a(p){return p in o||(o[p]=new Oa(p),s.addEditVariable(o[p],On.weak)),o[p]}for(let{selector:p,bounds:d}of i){let _=a(`${p}_x`),g=a(`${p}_y`);s.suggestValue(_,d.center.x),s.suggestValue(g,d.center.y)}for(let p of n){let d=p._parsedProps;if("xDist"in d){let{xDist:_,left:g,right:x,edgeToEdge:v,centerToCenter:S}=t(d),P=a(`${g}_x`),T=a(`${x}_x`),k=r(g)?.bounds,N=r(x)?.bounds;if(S){let E=new Dn(T,[-1,P]);s.addConstraint(new Ti(E,ai.Eq,d.xDist,On.required))}else if(v){let E=new Dn(T,-N.width/2,[-1,P],-k.width/2);s.addConstraint(new Ti(E,ai.Eq,d.xDist,On.required))}}else if("yDist"in d){let{yDist:_,top:g,bottom:x,edgeToEdge:v,centerToCenter:S}=d,P=a(`${g}_y`),T=a(`${x}_y`),k=r(g)?.bounds,N=r(x)?.bounds;if(S){let E=new Dn(P,[-1,T]);s.addConstraint(new Ti(E,ai.Eq,d.yDist,On.required))}else if(v){let E=new Dn(P,k.height/2,[-1,T],-N.height/2);s.addConstraint(new Ti(E,ai.Eq,d.yDist,On.required))}}else if("sameY"in d){let{for:_}=d;if(_.length<2)continue;let g=_.map(v=>a(`${v}_y`)),x=new Dn(...g.slice(1));s.addConstraint(new Ti(x,ai.Eq,g[0],On.required))}else if("sameX"in d){let{for:_}=d;if(_.length<2)continue;let g=_.map(v=>a(`${v}_x`)),x=new Dn(...g.slice(1));s.addConstraint(new Ti(x,ai.Eq,g[0],On.required))}}s.updateVariables(),$Lt.enabled&&(console.log("Solution to layout constraints:"),console.table(Object.entries(o).map(([p,d])=>({var:p,val:d.value()}))));let c={left:1/0,right:-1/0,top:-1/0,bottom:1/0};for(let{selector:p,bounds:{width:d,height:_}}of i){let g=a(`${p}_x`),x=a(`${p}_y`),v=g.value()-d/2,S=g.value()+d/2,P=x.value()+_/2,T=x.value()-_/2;c.left=Math.min(c.left,v),c.right=Math.max(c.right,S),c.top=Math.max(c.top,P),c.bottom=Math.min(c.bottom,T)}let l={x:-(c.right+c.left)/2,y:-(c.top+c.bottom)/2},u=this.getPrimitiveContainer()._getGlobalPcbPositionBeforeLayout();l.x+=u.x,l.y+=u.y;for(let{component:p,selector:d}of i){let _=a(`${d}_x`),g=a(`${d}_y`);p._setPositionFromLayout({x:_.value()+l.x,y:g.value()+l.y})}}},Ant=n=>{if(!n)return null;let t=n.split("?")[0].split("#")[0],i=t.split("/").pop()??t;return i.includes(".")?i.split(".").pop()?.toLowerCase()??null:null},zLt=(n,e)=>{let t=n.replace(/\/+$/,""),i=e.replace(/^\/+/,"");return`${t}/${i}`},Rnt=(n,e)=>{if(!e||!n.startsWith("/"))return n;try{let t=new URL(e);return t.pathname!=="/"&&n.startsWith(t.pathname)?new URL(n,t.origin).toString():zLt(e,n)}catch{return n}},d9=h.union([h.number(),h.string()]),Get=h.object({x:d9,y:d9,z:d9}),Ont=class extends Me{get config(){return{componentName:"CadModel",zodProps:jH}}doInitialCadModelRender(){let n=this._findParentWithPcbComponent();if(!n||!n.pcb_component_id)return;let{db:e}=this.root,{boardThickness:t=0}=this.root?._getBoard()??{},i=n._getPcbCircuitJsonBounds(),r=e.pcb_component.get(n.pcb_component_id),s=this._parsedProps;if(!s||typeof s.modelUrl!="string"&&typeof s.stepUrl!="string")return;let o=n._computePcbGlobalTransformBeforeLayout(),c=io(o).rotation.angle*180/Math.PI,l=Get.parse({x:0,y:0,z:0});if(typeof s.rotationOffset=="number")l.z=Number(s.rotationOffset);else if(typeof s.rotationOffset=="object"){let P=Get.parse(s.rotationOffset);l.x=Number(P.x),l.y=Number(P.y),l.z=Number(P.z)}let{pcbX:u,pcbY:p}=this.getResolvedPcbPositionProp(),d=Sw.parse({x:u,y:p,z:s.pcbZ??0,...typeof s.positionOffset=="object"?s.positionOffset:{}}),_=s.zOffsetFromSurface!==void 0?V.parse(s.zOffsetFromSurface):0,g=n.props.layer==="bottom"?"bottom":"top",x=s.modelUrl?Ant(s.modelUrl):void 0,v={};if(x==="stl"?v.model_stl_url=this._addCachebustToModelUrl(s.modelUrl):x==="obj"?v.model_obj_url=this._addCachebustToModelUrl(s.modelUrl):x==="gltf"?v.model_gltf_url=this._addCachebustToModelUrl(s.modelUrl):x==="glb"?v.model_glb_url=this._addCachebustToModelUrl(s.modelUrl):x==="step"||x==="stp"?v.model_step_url=this._addCachebustToModelUrl(s.modelUrl):x==="wrl"||x==="vrml"?v.model_wrl_url=this._addCachebustToModelUrl(s.modelUrl):v.model_stl_url=this._addCachebustToModelUrl(s.modelUrl),s.stepUrl){let P=this._addCachebustToModelUrl(s.stepUrl);P&&(v.model_step_url=P)}let S=e.cad_component.insert({position:{x:i.center.x+Number(d.x),y:i.center.y+Number(d.y),z:(g==="bottom"?-t/2:t/2)+(g==="bottom"?-_:_)+Number(d.z)},rotation:{x:Number(l.x),y:(g==="top"?0:180)+Number(l.y),z:g==="bottom"?-(c+Number(l.z))+180:c+Number(l.z)},pcb_component_id:n.pcb_component_id,source_component_id:n.source_component_id,model_unit_to_mm_scale_factor:typeof s.modelUnitToMmScale=="number"?s.modelUnitToMmScale:void 0,show_as_translucent_model:n._parsedProps.showAsTranslucentModel,...v});this.cad_component_id=S.cad_component_id}_findParentWithPcbComponent(){let n=this.parent;for(;n&&!n.pcb_component_id;)n=n.parent;return n}_addCachebustToModelUrl(n){if(!n)return n;let e=this.root?.platform?.projectBaseUrl,t=Rnt(n,e);if(!t.includes("modelcdn.tscircuit.com"))return t;let i=this.root?.getClientOrigin()??"";return`${t}${t.includes("?")?"&":"?"}cachebust_origin=${encodeURIComponent(i)}`}},Lnt=class extends Me{constructor(){super(...arguments);f(this,"isPrimitiveContainer",!0)}get config(){return{componentName:"CadAssembly",zodProps:DH}}},DLt=(n,e)=>{if(!n)return;let t={};for(let[i,r]of Object.entries(n)){let s=W1(i,e),o={leftMargin:r.marginLeft??r.leftMargin,rightMargin:r.marginRight??r.rightMargin,topMargin:r.marginTop??r.topMargin,bottomMargin:r.marginBottom??r.bottomMargin};t[`pin${s}`]={...t[`pin${s}`],...o}}return t},Wet=class{constructor({input:n}){f(this,"input");this.input=n}solveAndMapToTraces(){let n=[];for(let e of this.input.connections){if(e.pointsToConnect.length!==2)continue;let[t,i]=e.pointsToConnect,r={type:"pcb_trace",pcb_trace_id:"",connection_name:e.name,route:[{route_type:"wire",x:t.x,y:t.y,layer:"top",width:.1},{route_type:"wire",x:i.x,y:i.y,layer:"top",width:.1}]};n.push(r)}return n}},jLt=n=>{let e=Math.min(...n.map(s=>s.center.x)),t=Math.max(...n.map(s=>s.center.x)),i=Math.min(...n.map(s=>s.center.y)),r=Math.max(...n.map(s=>s.center.y));return{minX:e,maxX:t,minY:i,maxY:r}},Het=["top","bottom","inner1","inner2"],rP=(n,e=[])=>{let t=[];if(e.length===0){let a=n[0].layers;for(let c of a)t.push(...rP(n.slice(1),[c]));return t}if(n.length===0)return[];let i=n[0],r=i.via||i.optional_via,s=e[e.length-1];if(n.length===1){let a=i;return a.layers&&r?a.layers.map(c=>({layer_path:[...e,c]})):a.layers?.includes(s)?[{layer_path:[...e,s]}]:[]}if(!r)return i.layers&&!i.layers.includes(s)?[]:rP(n.slice(1),e.concat([s]));let o=(i.optional_via?Het:Het.filter(a=>a!==s)).filter(a=>!i.layers||i.layers?.includes(a));for(let a of o)t.push(...rP(n.slice(1),e.concat(a)));return t};function qet(n){let e={x:n.to.x-n.from.x,y:n.to.y-n.from.y},t=Math.abs(e.x),i=Math.abs(e.y);return t>i?e.x>0?"right":"left":e.y>0?"down":"up"}function Y_(n,e){return Math.hypot(n.x-e.x,n.y-e.y)}var BLt=n=>{if(n.length===1)return n[0];if(n.some(c=>c.length===0))throw new Error("Cannot merge routes with zero length");let e=[],t=n[0][0],i=n[0][n[0].length-1],r=n[1][0],s=n[1][n[1].length-1],o=Math.min(Y_(t,r),Y_(t,s)),a=Math.min(Y_(i,r),Y_(i,s));o<a?e.push(...n[0].reverse()):e.push(...n[0]);for(let c=1;c<n.length;c++){let l=e[e.length-1],u=n[c],p=u[0],d=u[u.length-1],_=Y_(l,p),g=Y_(l,d);_<g?e.push(...u):e.push(...u.reverse())}for(let c=1;c<e.length-1;c++){let l=e[c-1],u=e[c];l.route_type==="wire"&&u.route_type==="wire"&&l.layer!==u.layer&&e.splice(c,0,{x:l.x,y:l.y,from_layer:l.layer,to_layer:u.layer,route_type:"via"})}return e},YLt=(n,e)=>{let t="_getGlobalPcbPositionBeforeLayout"in n?n._getGlobalPcbPositionBeforeLayout():n,i="_getGlobalPcbPositionBeforeLayout"in e?e._getGlobalPcbPositionBeforeLayout():e;return Math.sqrt((t.x-i.x)**2+(t.y-i.y)**2)};function XLt(n,e){if(e.length===0)throw new Error("No candidates given to getClosest method");let t=e[0],i=1/0;for(let r of e){let s=YLt(n,r);s<i&&(t=r,i=s)}return t}var ULt=(n,e)=>{let t=0;t+=n.length??0,t+=e.filter(i=>i.is_crossing).length;for(let i=1;i<e.length;i++){let r=e[i-1],s=e[i],o=Math.abs(r.from.x-r.to.x)<.01,a=Math.abs(s.from.x-s.to.x)<.01;o!==a&&t++}return t},H1=n=>({up:"bottom",down:"top",left:"right",right:"left"})[n]??null,x9=({firstEdge:n,firstEdgePort:e,firstDominantDirection:t,lastEdge:i,lastEdgePort:r,lastDominantDirection:s})=>{if(n&&e)return x9({lastEdge:{from:n.to,to:n.from},lastEdgePort:e,lastDominantDirection:t}).reverse().map(a=>({from:a.to,to:a.from}));let o=[];if(i&&r){let a={x:i.to.x,y:i.to.y};s==="left"||s==="right"?(a.x=r.position.x,o.push({from:i.to,to:{...a}}),o.push({from:a,to:{...r.position}})):(a.y=r.position.y,o.push({from:i.to,to:{...a}}),o.push({from:a,to:{...r.position}}))}return o=o.filter(a=>zi(a.from,a.to)>.01),o};function VLt(n){try{return[n(),null]}catch(e){return[null,e]}}var GLt=(n,{db:e})=>{let t=n.map(i=>{let r=e.source_port.get(i.source_port_id);if(!r?.source_component_id)return null;let s=e.source_component.get(r.source_component_id);return s?.ftype==="simple_capacitor"?s.max_decoupling_trace_length:null}).filter(i=>i!==null);if(t.length!==0)return Math.min(...t)};function WLt({ports:n,nets:e}){if(n.length>=2)return`${n[0]?.selector} to ${n[1]?.selector}`;if(n.length===1&&e.length===1)return`${n[0]?.selector} to net.${e[0]._parsedProps.name}`}var HLt=(n,{db:e})=>{let t=e.pcb_board.list()[0];if(t.outline){let c=t.outline,l=(u,p)=>{let d=!1;for(let _=0,g=p.length-1;_<p.length;g=_++){let x=p[_].x,v=p[_].y,S=p[g].x,P=p[g].y;v>u.y!=P>u.y&&u.x<(S-x)*(u.y-v)/(P-v)+x&&(d=!d)}return d};return n.some(u=>!l(u,c))}let i=t.width,r=t.height,s=t.center.x,o=t.center.y;return n.some(c=>c.x<s-i/2||c.y<o-r/2||c.x>s+i/2||c.y>o+r/2)},Zet=(n,e)=>Math.abs(n-e)<1e-4,qLt=(n,e,{viaDiameter:t=.5}={})=>{let i=[];for(let r=0;r<n.length-1;r++){let[s,o]=[n[r],n[r+1]],a=r-1>=0?n[r-1]:null,c=Zet(s.y,o.y),l=Zet(s.x,o.x);if(!c&&!l)throw new Error(`getObstaclesFromTrace currently only supports horizontal and vertical traces (not diagonals) Conflicting trace: ${e}, start: (${s.x}, ${s.y}), end: (${o.x}, ${o.y})`);let u={type:"rect",layers:[s.layer],center:{x:(s.x+o.x)/2,y:(s.y+o.y)/2},width:c?Math.abs(s.x-o.x):.1,height:l?Math.abs(s.y-o.y):.1,connectedTo:[e]};if(i.push(u),a&&a.layer===s.layer&&s.layer!==o.layer){let p={type:"rect",layers:[s.layer,o.layer],center:{x:s.x,y:s.y},connectedTo:[e],width:t,height:t};i.push(p)}}return i};function ZLt(n,e=4){let{center:t,width:i,height:r,rotation:s}=n,o=[],a=s*Math.PI/180,c=Math.cos(a),l=Math.sin(a),u=(s%360+360)%360;if(r<=i?u>=45&&u<135||u>=225&&u<315:u>=135&&u<225||u>=315||u<45){let d=i/e;for(let _=0;_<e;_++){let g=(_-e/2+.5)*d,x=-g*c,v=-g*l,S=d*1.1,P=Math.abs(r*c)+Math.abs(d*l);o.push({center:{x:t.x+x,y:t.y+v},width:S,height:P})}}else{let d=r/e;for(let _=0;_<e;_++){let g=(_-e/2+.5)*d,x=-g*l,v=g*c,S=Math.abs(i*c)+Math.abs(d*l),P=d*1.1;o.push({center:{x:t.x+x,y:t.y+v},width:S,height:P})}}return o}function KLt(n,e={}){if(n.length<3)return[];let{rectHeight:t=.1}=e,i=[],r=n.map(a=>a.y),s=Math.min(...r),o=Math.max(...r);for(let a=s;a<o;a+=t){let c=a+t/2,l=[];for(let u=0;u<n.length;u++){let p=n[u],d=n[(u+1)%n.length];if(p.y<=c&&d.y>c||d.y<=c&&p.y>c){let _=(c-p.y)*(d.x-p.x)/(d.y-p.y)+p.x;l.push(_)}}l.sort((u,p)=>u-p);for(let u=0;u<l.length;u+=2)if(u+1<l.length){let p=l[u],_=l[u+1]-p;_>1e-6&&i.push({center:{x:p+_/2,y:c},width:_,height:t})}}return i}function JLt(n,e={}){let{center:t,radius:i}=n,{rectHeight:r=.1}=e,s=[],o=Math.ceil(i*2/r);for(let a=0;a<o;a++){let c=t.y-i+(a+.5)*r,l=c-t.y,u=Math.sqrt(i*i-l*l);u>0&&s.push({center:{x:t.x,y:c},width:u*2,height:r})}return s}var Zo=["top","inner1","inner2","bottom"],Fnt=(n,e)=>{let t=r=>e?r.concat(r.map(s=>e?.getNetConnectedToId(s)).filter(Boolean)):r,i=[];for(let r of n)if(r.type==="pcb_smtpad"){if(r.shape==="circle")i.push({type:"oval",layers:[r.layer],center:{x:r.x,y:r.y},width:r.radius*2,height:r.radius*2,connectedTo:t([r.pcb_smtpad_id])});else if(r.shape==="rect")i.push({type:"rect",layers:[r.layer],center:{x:r.x,y:r.y},width:r.width,height:r.height,connectedTo:t([r.pcb_smtpad_id])});else if(r.shape==="rotated_rect"){let s={center:{x:r.x,y:r.y},width:r.width,height:r.height,rotation:r.ccw_rotation},o=ZLt(s);for(let a of o)i.push({type:"rect",layers:[r.layer],center:a.center,width:a.width,height:a.height,connectedTo:t([r.pcb_smtpad_id])})}}else if(r.type==="pcb_keepout")r.shape==="circle"?i.push({type:"oval",layers:r.layers,center:{x:r.center.x,y:r.center.y},width:r.radius*2,height:r.radius*2,connectedTo:[]}):r.shape==="rect"&&i.push({type:"rect",layers:r.layers,center:{x:r.center.x,y:r.center.y},width:r.width,height:r.height,connectedTo:[]});else if(r.type==="pcb_cutout"){if(r.shape==="rect")i.push({type:"rect",layers:Zo,center:{x:r.center.x,y:r.center.y},width:r.width,height:r.height,connectedTo:[]});else if(r.shape==="circle"){let s=JLt({center:r.center,radius:r.radius},{rectHeight:.6});for(let o of s)i.push({type:"rect",layers:Zo,center:o.center,width:o.width,height:o.height,connectedTo:[]})}else if(r.shape==="polygon"){let s=KLt(r.points,{rectHeight:.6});for(let o of s)i.push({type:"rect",layers:Zo,center:o.center,width:o.width,height:o.height,connectedTo:[]})}}else if(r.type==="pcb_hole")r.hole_shape==="oval"?i.push({type:"oval",center:{x:r.x,y:r.y},width:r.hole_width,height:r.hole_height,connectedTo:[]}):r.hole_shape==="rect"?i.push({type:"rect",layers:Zo,center:{x:r.x,y:r.y},width:r.hole_width,height:r.hole_height,connectedTo:[]}):r.hole_shape==="square"?i.push({type:"rect",layers:Zo,center:{x:r.x,y:r.y},width:r.hole_diameter,height:r.hole_diameter,connectedTo:[]}):(r.hole_shape==="round"||r.hole_shape==="circle")&&i.push({type:"rect",layers:Zo,center:{x:r.x,y:r.y},width:r.hole_diameter,height:r.hole_diameter,connectedTo:[]});else if(r.type==="pcb_plated_hole"){if(r.shape==="circle")i.push({type:"oval",layers:Zo,center:{x:r.x,y:r.y},width:r.outer_diameter,height:r.outer_diameter,connectedTo:t([r.pcb_plated_hole_id])});else if(r.shape==="circular_hole_with_rect_pad")i.push({type:"rect",layers:Zo,center:{x:r.x,y:r.y},width:r.rect_pad_width,height:r.rect_pad_height,connectedTo:t([r.pcb_plated_hole_id])});else if(r.shape==="oval"||r.shape==="pill")i.push({type:"oval",layers:Zo,center:{x:r.x,y:r.y},width:r.outer_width,height:r.outer_height,connectedTo:t([r.pcb_plated_hole_id])});else if(r.shape==="hole_with_polygon_pad"&&"pad_outline"in r&&r.pad_outline&&r.pad_outline.length>0){let s=r.pad_outline.map(_=>r.x+_.x),o=r.pad_outline.map(_=>r.y+_.y),a=Math.min(...s),c=Math.max(...s),l=Math.min(...o),u=Math.max(...o),p=(a+c)/2,d=(l+u)/2;i.push({type:"rect",layers:Zo,center:{x:p,y:d},width:c-a,height:u-l,connectedTo:t([r.pcb_plated_hole_id])})}}else if(r.type==="pcb_trace"){let s=qLt(r.route.map(o=>({x:o.x,y:o.y,layer:"layer"in o?o.layer:o.from_layer})),r.source_trace_id);i.push(...s)}else if(r.type==="pcb_via"){let s=!!(r.net_is_assignable??r.netIsAssignable);i.push({type:"rect",layers:r.layers,center:{x:r.x,y:r.y},connectedTo:[],width:r.outer_diameter,height:r.outer_diameter,netIsAssignable:s||void 0})}return i},wl=({anchor_position:n,anchor_side:e,text:t,font_size:i=.18})=>{let r=.1*(i/.18),s=t.length*r,o=i,a={...n};switch(e){case"right":a.x-=s/2;break;case"left":a.x+=s/2;break;case"top":a.y-=o/2;break;case"bottom":a.y+=o/2;break}return a},R9=({db:n,source_trace_id:e,sameNetOnly:t,differentNetOnly:i})=>{!t&&!i&&(i=!0);let r=n.source_trace.get(e),s=[];for(let o of n.schematic_trace.list()){if(o.source_trace_id===e)continue;let c=n.source_trace.get(o.source_trace_id)?.subcircuit_connectivity_map_key===r.subcircuit_connectivity_map_key;i&&c||t&&!c||s.push(o)}return s},QLt=({edges:n,otherEdges:e})=>{let t=[...n];for(let i=0;i<t.length;i++){if(i>2e3)throw new Error("Over 2000 iterations spent inside createSchematicTraceCrossingSegments, you have triggered an infinite loop, please report this!");let r=t[i],s=Math.abs(r.from.x-r.to.x)<.01?"vertical":r.from.y===r.to.y?"horizontal":"not-orthogonal";if(s==="not-orthogonal")continue;let o=[];for(let x of e){let v=x.from.x===x.to.x?"vertical":x.from.y===x.to.y?"horizontal":"not-orthogonal";if(v==="not-orthogonal"||s===v)continue;if(La([r.from,r.to],[x.from,x.to],{lineThickness:.01})){let P=s==="vertical"?r.from.x:x.from.x,T=s==="vertical"?x.from.y:r.from.y,k={x:P,y:T};o.push({otherEdge:x,crossingPoint:k,distanceFromEdgeFrom:zi(r.from,k)})}}if(o.length===0)continue;let a=o[0];for(let x of o)x.distanceFromEdgeFrom<a.distanceFromEdgeFrom&&(a=x);let c=a.crossingPoint,l=.075;if(c.x===r.from.x&&c.y===r.from.y)continue;let u=Rw(r.from,c),p={x:c.x-u.x*l/2,y:c.y-u.y*l/2},d={x:c.x+u.x*l/2,y:c.y+u.y*l/2},_=zi(d,r.to)<l,g=[{from:r.from,to:p},{from:p,to:d,is_crossing:!0},{from:d,to:r.to}];t.splice(i,1,...g),i+=g.length-2,_&&i++}return t},b9=.001,X_=(n,e)=>{let t=Math.min(e.from.x,e.to.x),i=Math.max(e.from.x,e.to.x),r=Math.min(e.from.y,e.to.y),s=Math.max(e.from.y,e.to.y);return n.x>=t&&n.x<=i&&n.y>=r&&n.y<=s},Ket=n=>{let e=Math.abs(n.from.x-n.to.x)<b9,t=Math.abs(n.from.y-n.to.y)<b9;return e?"vertical":t?"horizontal":"diagonal"},t7t=(n,e)=>{let t=Ket(n),i=Ket(e);if(t===i)return null;if(t==="vertical"&&i==="horizontal"||t==="horizontal"&&i==="vertical"){let p=t==="vertical"?n:e,d=t==="horizontal"?n:e,_=p.from.x,g=d.from.y,x={x:_,y:g};return X_(x,n)&&X_(x,e)?x:null}if(t==="vertical"||i==="vertical"){let p=t==="vertical"?n:e,d=t==="vertical"?e:n,_=p.from.x,g=(d.to.y-d.from.y)/(d.to.x-d.from.x),x=d.from.y-g*d.from.x,v=g*_+x,S={x:_,y:v};return X_(S,n)&&X_(S,e)?S:null}let r=(n.to.y-n.from.y)/(n.to.x-n.from.x),s=n.from.y-r*n.from.x,o=(e.to.y-e.from.y)/(e.to.x-e.from.x),a=e.from.y-o*e.from.x;if(Math.abs(r-o)<b9)return null;let c=(a-s)/(r-o),l=r*c+s,u={x:c,y:l};return X_(u,n)&&X_(u,e)?u:null},e7t=({edges:n,db:e,source_trace_id:t})=>{let i=R9({db:e,source_trace_id:t,sameNetOnly:!0}).flatMap(s=>s.edges),r=new Map;for(let s of n)for(let o of i){let a=t7t(s,o);if(a){let c=`${a.x.toFixed(6)},${a.y.toFixed(6)}`;r.has(c)||r.set(c,a)}}return Array.from(r.values())};function n7t(n,e={}){let{minX:t,maxX:i,minY:r,maxY:s}=n,o=e.padding??1;if(!isFinite(t)||!isFinite(i)||!isFinite(r)||!isFinite(s))return[];let a=t-o,c=i+o,l=s+o,u=r-o,p=.01;return[{type:"rect",layers:["top"],center:{x:(a+c)/2,y:l},width:c-a,height:p,connectedTo:[]},{type:"rect",layers:["top"],center:{x:(a+c)/2,y:u},width:c-a,height:p,connectedTo:[]},{type:"rect",layers:["top"],center:{x:a,y:(l+u)/2},width:p,height:l-u,connectedTo:[]},{type:"rect",layers:["top"],center:{x:c,y:(l+u)/2},width:p,height:l-u,connectedTo:[]}]}var i7t=n=>{let e=n.root.db,t=n._findConnectedPorts().ports??[],i=new Set(t.map(o=>o.schematic_port_id)),r=[];for(let o of e.toArray()){if(o.type==="schematic_component"){let a=!!o.symbol_name,c=o.size.width>o.size.height?"horz":"vert";r.push({type:"rect",layers:["top"],center:o.center,width:o.size.width+(a&&c==="horz"?-.5:0),height:o.size.height+(a&&c==="vert"?-.5:0),connectedTo:[]})}if(o.type==="schematic_port"){if(i.has(o.schematic_port_id))continue;let a=o.facing_direction?Ow(o.facing_direction):{x:0,y:0};r.push({type:"rect",layers:["top"],center:{x:o.center.x-a.x*.1,y:o.center.y-a.y*.1},width:.1+Math.abs(a.x)*.3,height:.1+Math.abs(a.y)*.3,connectedTo:[]})}o.type==="schematic_text"&&r.push({type:"rect",layers:["top"],center:o.position,width:(o.text?.length??0)*.1,height:.2,connectedTo:[]}),o.type==="schematic_box"&&r.push({type:"rect",layers:["top"],center:{x:o.x,y:o.y},width:o.width,height:o.height,connectedTo:[]})}let s=Ent(e.toArray());return r.push(...n7t(s,{padding:1})),r},r7t=({edges:n,db:e,source_trace_id:t})=>{let i=e.source_trace.get(t),r=R9({db:e,source_trace_id:t,differentNetOnly:!0}).flatMap(o=>o.edges),s=o=>{let{from:a,to:c}=o;return a.x===c.x?"vertical":"horizontal"};for(let o of n){let a=s(o),c=()=>r.find(u=>s(u)===a&&La([o.from,o.to],[u.from,u.to],{lineThickness:.05})),l=c();for(;l;)a==="horizontal"?(o.from.y+=.1,o.to.y+=.1):(o.from.x+=.1,o.to.x+=.1),l=c()}},v9=n=>{switch(n){case"up":return"y+";case"down":return"y-";case"left":return"x-";case"right":return"x+";default:}},s7t=Eq.version??"unknown",Y1=class extends Error{constructor(n){super(`${n} (capacity-autorouter@${s7t})`),this.name="AutorouterError"}},lP=class extends Error{constructor(n){super(n.message),this.errorData=n,this.name="TraceConnectionError"}},o7t=n=>{if(n.root?._featureMspSchematicTraceRouting||n._couldNotFindPort||n.root?.schematicDisabled)return;let{db:e}=n.root,{_parsedProps:t,parent:i}=n;if(!i)throw new Error("Trace has no parent");let r,s;try{let X=n._findConnectedPorts();r=X.allPortsFound,s=X.portsWithSelectors??[]}catch(X){if(X instanceof lP){e.source_trace_not_connected_error.insert({...X.errorData,error_type:"source_trace_not_connected_error"});return}throw X}let{netsWithSelectors:o}=n._findConnectedNets();if(!r)return;let c=s.map(X=>X.port.schematic_port_id).sort().join(","),l=n.root?._getBoard();if(l?._connectedSchematicPortPairs&&l._connectedSchematicPortPairs.has(c))return;let u={name:n.source_trace_id,pointsToConnect:[]},p=i7t(n),d=s.filter(({port:X})=>X.schematic_port_id!==null).map(({port:X})=>({port:X,position:X._getGlobalSchematicPositionAfterLayout(),schematic_port_id:X.schematic_port_id??void 0,facingDirection:X.facingDirection}));if(d.length===1&&o.length===1){let X=o[0].net,{port:W,position:J}=d[0],nt=n.getSubcircuit().selectAll("netlabel").find(et=>{let Q=et._parsedProps.connection??et._parsedProps.connectsTo;return Q?Array.isArray(Q)?Q.some(pt=>n.getSubcircuit().selectOne(pt,{port:!0})===W):n.getSubcircuit().selectOne(Q,{port:!0})===W:!1});if(!nt){let et=e.schematic_net_label.getWhere({source_trace_id:n.source_trace_id});et&&(nt=et)}if(nt){let et="_getGlobalSchematicPositionBeforeLayout"in nt?nt._getGlobalSchematicPositionBeforeLayout():nt.anchor_position,Q=[];J.x===et.x||J.y===et.y?Q.push({from:J,to:et}):(Q.push({from:J,to:{x:et.x,y:J.y}}),Q.push({from:{x:et.x,y:J.y},to:et}));let ht=e.schematic_trace.insert({source_trace_id:n.source_trace_id,edges:Q,junctions:[],subcircuit_connectivity_map_key:n.subcircuit_connectivity_map_key??void 0});n.schematic_trace_id=ht.schematic_trace_id;return}if(n.props.schDisplayLabel){let et=H1(W.facingDirection)??"bottom";e.schematic_net_label.insert({text:n.props.schDisplayLabel,source_net_id:X.source_net_id,anchor_position:J,center:wl({anchor_position:J,anchor_side:et,text:n.props.schDisplayLabel}),anchor_side:et});return}let ft=H1(W.facingDirection)??"bottom",G=e.schematic_net_label.insert({text:X._parsedProps.name,source_net_id:X.source_net_id,anchor_position:J,center:wl({anchor_position:J,anchor_side:ft,text:X._parsedProps.name}),anchor_side:ft});return}if(n.props.schDisplayLabel&&("from"in n.props&&"to"in n.props||"path"in n.props)){n._doInitialSchematicTraceRenderWithDisplayLabel();return}if(d.length<2)return;let x=(()=>{let X=[];for(let J=0;J<d.length-1;J++){let nt=d[J],ft=d[J+1],G=Qc({x:nt.position.x,y:nt.position.y,facingDirection:v9(nt.facingDirection)},{x:ft.position.x,y:ft.position.y,facingDirection:v9(ft.facingDirection)});for(let et=0;et<G.length-1;et++)X.push({from:G[et],to:G[et+1]})}let W=(J,nt)=>{let ft=nt.width/2,G=nt.height/2,et=nt.center.x-ft,Q=nt.center.x+ft,ht=nt.center.y-G,pt=nt.center.y+G,St=ot=>ot.x>=et&&ot.x<=Q&&ot.y>=ht&&ot.y<=pt;return St(J.from)||St(J.to)?!0:[[{x:et,y:ht},{x:Q,y:ht}],[{x:Q,y:ht},{x:Q,y:pt}],[{x:Q,y:pt},{x:et,y:pt}],[{x:et,y:pt},{x:et,y:ht}]].some(ot=>La([J.from,J.to],ot,{lineThickness:0}))};for(let J of X)for(let nt of p)if(W(J,nt))return null;return X})();x&&x.length===0&&(x=null),u.pointsToConnect=d.map(({position:X})=>({...X,layer:"top"}));let v=jLt(p),S=2,P={minTraceWidth:.1,obstacles:p,connections:[u],bounds:{minX:v.minX-S,maxX:v.maxX+S,minY:v.minY-S,maxY:v.maxY+S},layerCount:1},T=bw,k=!1;if(n.getSubcircuit().props._schDirectLineRoutingEnabled&&(T=Wet,k=!0),!x){let W=new T({input:P,MAX_ITERATIONS:100,OBSTACLE_MARGIN:.1,isRemovePathLoopsEnabled:!0,isShortenPathWithShortcutsEnabled:!0,marginsWithCosts:[{margin:1,enterCost:0,travelCostFactor:1},{margin:.3,enterCost:0,travelCostFactor:1},{margin:.2,enterCost:0,travelCostFactor:2},{margin:.1,enterCost:0,travelCostFactor:3}]}).solveAndMapToTraces();if(W.length===0){if(n._isSymbolToChipConnection()||n._isSymbolToSymbolConnection()||n._isChipToChipConnection()){n._doInitialSchematicTraceRenderWithDisplayLabel();return}W=new Wet({input:P}).solveAndMapToTraces(),k=!0}let[{route:J}]=W;x=[];for(let nt=0;nt<J.length-1;nt++)x.push({from:J[nt],to:J[nt+1]})}let N=n.source_trace_id,E=[];if(!k){r7t({edges:x,db:e,source_trace_id:N});let X=R9({db:e,source_trace_id:N,differentNetOnly:!0}).flatMap(W=>W.edges);x=QLt({edges:x,otherEdges:X}),E=e7t({edges:x,db:e,source_trace_id:n.source_trace_id})}if(!x||x.length===0)return;let C=x[x.length-1],M=d[d.length-1],A=qet(C);x.push(...x9({lastEdge:C,lastEdgePort:M,lastDominantDirection:A}));let R=x[0],B=d[0],D=qet(R);if(x.unshift(...x9({firstEdge:R,firstEdgePort:B,firstDominantDirection:D})),!n.source_trace_id)throw new Error("Missing source_trace_id for schematic trace insertion.");if(n.getSubcircuit()._parsedProps.schTraceAutoLabelEnabled&&ULt(E,x)>=5&&(n._isSymbolToChipConnection()||n._isSymbolToSymbolConnection()||n._isChipToChipConnection())){n._doInitialSchematicTraceRenderWithDisplayLabel();return}let U=e.schematic_trace.insert({source_trace_id:n.source_trace_id,edges:x,junctions:E,subcircuit_connectivity_map_key:n.subcircuit_connectivity_map_key??void 0});n.schematic_trace_id=U.schematic_trace_id;for(let{port:X}of s)X.schematic_port_id&&e.schematic_port.update(X.schematic_port_id,{is_connected:!0});l?._connectedSchematicPortPairs&&l._connectedSchematicPortPairs.add(c)};function w9(n){let e=0;for(let t=0;t<n.length;t++){let i=n[t];if(i.route_type==="wire"){let r=n[t+1];if(r){let s=r.x-i.x,o=r.y-i.y;e+=Math.sqrt(s*s+o*o)}}else i.route_type==="via"&&(e+=1.6)}return e}var a7t=.3,c7t=.6,Jet=(n,e)=>{if(n===void 0)return e;if(typeof n=="number")return n;let t=parseFloat(n);return Number.isFinite(t)?t:e},O9=n=>({holeDiameter:Jet(n?.viaHoleDiameter,a7t),padDiameter:Jet(n?.viaPadDiameter,c7t)}),l7t=(n,e)=>{let t=O9(e);return{holeDiameter:n.holeDiameter??t.holeDiameter,padDiameter:n.padDiameter??t.padDiameter}},eP=n=>({...n._getGlobalPcbPositionAfterLayout(),layers:n.getAvailablePcbLayers()}),u7t=!1;function p7t(n){if(n.root?.pcbDisabled)return;let{db:e}=n.root,{_parsedProps:t,parent:i}=n,r=n.getSubcircuit();if(!i)throw new Error("Trace has no parent");if(r._parsedProps.routingDisabled)return;let s=r._parsedProps.pcbRouteCache?.pcbTraces;if(s){let D=e.pcb_trace.insert({route:s.flatMap(U=>U.route),source_trace_id:n.source_trace_id,subcircuit_id:r?.subcircuit_id??void 0,pcb_group_id:n.getGroup()?.pcb_group_id??void 0});n.pcb_trace_id=D.pcb_trace_id;return}if(t.pcbPath&&t.pcbPath.length>0||t.pcbStraightLine||!r._shouldUseTraceByTraceRouting())return;let{allPortsFound:o,ports:a}=n._findConnectedPorts(),c=[];if(!o)return;let l=[];for(let D of a)D._hasMatchedPcbPrimitive()||l.push(D);if(l.length>0){e.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:n.source_trace_id,message:`Some ports did not have a matching PCB primitive (e.g. a pad or plated hole), this can happen if a footprint is missing. As a result, ${n} wasn't routed. Missing ports: ${l.map(D=>D.getString()).join(", ")}`,pcb_trace_id:n.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:l.map(D=>D.pcb_port_id).filter(Boolean)});return}let u=n._findConnectedNets().netsWithSelectors;if(a.length===0&&u.length===2){n.renderError("Trace connects two nets, we haven't implemented a way to route this yet");return}else if(a.length===1&&u.length===1){let D=a[0],X=u[0].net.getAllConnectedPorts().filter(J=>J!==D);if(X.length===0){console.log("Nothing to connect this port to, the net is empty. TODO should emit a warning!");return}let W=XLt(D,X);c.push(W),a.push(W)}else if(a.length>1&&u.length>=1){n.renderError("Trace has more than one port and one or more nets, we don't currently support this type of complex trace routing");return}let p=a.flatMap(D=>D.matchedComponents.filter(U=>U.componentName==="TraceHint")),d=(n._parsedProps.pcbRouteHints??[]).concat(p.flatMap(D=>D.getPcbRouteHints()));if(a.length>2){n.renderError(`Trace has more than two ports (${a.map(D=>D.getString()).join(", ")}), routing between more than two ports for a single trace is not implemented`);return}if(n.getSubcircuit().selectAll("trace").filter(D=>D.renderPhaseStates.PcbTraceRender.initialized).some(D=>D._portsRoutedOnPcb.length===a.length&&D._portsRoutedOnPcb.every(U=>a.includes(U))))return;let x=[];d.length===0?x=[eP(a[0]),eP(a[1])]:x=[eP(a[0]),...d,eP(a[1])];let v=rP(x);if(u7t&&v.length===0){n.renderError(`Could not find a common layer (using hints) for trace ${n.getString()}`);return}let S=nr(n.root.db.toArray()),[P,T]=VLt(()=>Fnt(n.root.db.toArray()));if(T){n.renderError({type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:n.pcb_trace_id,message:`Error getting obstacles for autorouting: ${T.message}`,source_trace_id:n.source_trace_id,center:{x:0,y:0},pcb_port_ids:a.map(D=>D.pcb_port_id),pcb_trace_id:n.pcb_trace_id,pcb_component_ids:[]});return}for(let D of P)if(D.connectedTo.length>0){let X=S.getNetConnectedToId(D.connectedTo[0]);X&&D.connectedTo.push(X)}let k=[];if(v.length===0)k=x;else{let D=v[0].layer_path;k=x.map((U,X)=>U.via?{...U,via_to_layer:D[X]}:{...U,layers:[D[X]]})}k[0].pcb_port_id=a[0].pcb_port_id,k[k.length-1].pcb_port_id=a[1].pcb_port_id;let N=[];for(let[D,U]of Tnt(k)){let X="via_to_layer"in D?D.via_to_layer:null,W=2,J="layers"in D&&D.layers.length===1?D.layers[0]:X??"top",nt="layers"in U&&U.layers.length===1?U.layers[0]:X??"top",ft="pcb_port_id"in D?D.pcb_port_id:null,G="pcb_port_id"in U?U.pcb_port_id:null,et=n._getExplicitTraceThickness()??n.getSubcircuit()._parsedProps.minTraceWidth??.16,Q=new bw({OBSTACLE_MARGIN:et*2,isRemovePathLoopsEnabled:!0,optimizeWithGoalBoxes:!!(ft&&G),connMap:S,input:{obstacles:P,minTraceWidth:et,connections:[{name:n.source_trace_id,pointsToConnect:[{...D,layer:J,pcb_port_id:ft},{...U,layer:nt,pcb_port_id:G}]}],layerCount:n.getSubcircuit()._getSubcircuitLayerCount(),bounds:{minX:Math.min(D.x,U.x)-W,maxX:Math.max(D.x,U.x)+W,minY:Math.min(D.y,U.y)-W,maxY:Math.max(D.y,U.y)+W}}}),ht=null;try{ht=Q.solveAndMapToTraces()}catch(Mt){n.renderError({type:"pcb_trace_error",pcb_trace_error_id:n.source_trace_id,error_type:"pcb_trace_error",message:`error solving route: ${Mt.message}`,source_trace_id:n.pcb_trace_id,center:{x:(D.x+U.x)/2,y:(D.y+U.y)/2},pcb_port_ids:a.map(ot=>ot.pcb_port_id),pcb_trace_id:n.pcb_trace_id,pcb_component_ids:a.map(ot=>ot.pcb_component_id)})}if(!ht)return;if(ht.length===0){n.renderError({type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:n.pcb_trace_id,message:`Could not find a route for ${n}`,source_trace_id:n.source_trace_id,center:{x:(D.x+U.x)/2,y:(D.y+U.y)/2},pcb_port_ids:a.map(Mt=>Mt.pcb_port_id),pcb_trace_id:n.pcb_trace_id,pcb_component_ids:a.map(Mt=>Mt.pcb_component_id)});return}let[pt]=ht;X&&(pt.route=pt.route.map(Mt=>(Mt.route_type==="wire"&&!Mt.layer&&(Mt.layer=X),Mt))),ft&&pt.route[0].route_type==="wire"&&(pt.route[0].start_pcb_port_id=ft);let St=pt.route[pt.route.length-1];G&&St.route_type==="wire"&&(St.end_pcb_port_id=G),N.push(pt.route)}let E=BLt(N),C=w9(E),M=n.getInheritedMergedProperty("pcbStyle"),{holeDiameter:A,padDiameter:R}=O9(M),B=e.pcb_trace.insert({route:E,source_trace_id:n.source_trace_id,subcircuit_id:n.getSubcircuit()?.subcircuit_id,trace_length:C});n._portsRoutedOnPcb=a,n.pcb_trace_id=B.pcb_trace_id;for(let D of E)D.route_type==="via"&&e.pcb_via.insert({pcb_trace_id:B.pcb_trace_id,x:D.x,y:D.y,hole_diameter:A,outer_diameter:R,layers:[D.from_layer,D.to_layer],from_layer:D.from_layer,to_layer:D.to_layer});n._insertErrorIfTraceIsOutsideBoard(E,a)}function Qet(n){let{lineStart:e,lineEnd:t,rectCenter:i,rectWidth:r,rectHeight:s}=n,o=i.x-r/2,a=i.x+r/2,c=i.y+s/2,l=i.y-s/2,u=t.x-e.x,p=t.y-e.y,d=[];if(u!==0){let _=(o-e.x)/u;if(_>=0&&_<=1){let g=e.y+_*p;g>=l&&g<=c&&d.push({x:o,y:g,t:_})}}if(u!==0){let _=(a-e.x)/u;if(_>=0&&_<=1){let g=e.y+_*p;g>=l&&g<=c&&d.push({x:a,y:g,t:_})}}if(p!==0){let _=(l-e.y)/p;if(_>=0&&_<=1){let g=e.x+_*u;g>=o&&g<=a&&d.push({x:g,y:l,t:_})}}if(p!==0){let _=(c-e.y)/p;if(_>=0&&_<=1){let g=e.x+_*u;g>=o&&g<=a&&d.push({x:g,y:c,t:_})}}return d.length===0?null:(d.sort((_,g)=>_.t-g.t),{x:d[0].x,y:d[0].y})}function tnt(n){let{lineStart:e,lineEnd:t,circleCenter:i,circleRadius:r}=n,s=e.x-i.x,o=e.y-i.y,a=t.x-i.x,c=t.y-i.y,l=a-s,u=c-o,p=l*l+u*u,d=2*(s*l+o*u),_=s*s+o*o-r*r,g=d*d-4*p*_;if(g<0)return null;let x=Math.sqrt(g),v=(-d-x)/(2*p),S=(-d+x)/(2*p),P=null;return v>=0&&v<=1?P=v:S>=0&&S<=1&&(P=S),P===null?null:{x:e.x+P*l,y:e.y+P*u}}function ent(n){let{traceStart:e,traceEnd:t,traceWidth:i,port:r}=n,s=r.matchedComponents.find(d=>d.isPcbPrimitive);if(!s)return t;let o=s._getPcbCircuitJsonBounds(),a=o.width,c=o.height,l=o.center,u=Math.min(a,c);if(i<=u/2)return t;let p=null;if(s.componentName==="SmtPad"){let d=s,_=d._parsedProps.shape;if(_==="circle"){let g=d._parsedProps.radius;p=tnt({lineStart:e,lineEnd:t,circleCenter:l,circleRadius:g})}else(_==="rect"||_==="rotated_rect"||_==="pill"||_==="polygon")&&(p=Qet({lineStart:e,lineEnd:t,rectCenter:l,rectWidth:a,rectHeight:c}))}else if(s.componentName==="PlatedHole"){let d=s;if(d._parsedProps.shape==="circle"){let g=d._parsedProps.outerDiameter;p=tnt({lineStart:e,lineEnd:t,circleCenter:l,circleRadius:g/2})}else p=Qet({lineStart:e,lineEnd:t,rectCenter:l,rectWidth:a,rectHeight:c})}return p??t}function h7t(n){if(n.root?.pcbDisabled)return;let{db:e}=n.root,{_parsedProps:t}=n,i=n.getSubcircuit(),r=t.pcbPath!==void 0,s=!!t.pcbStraightLine;if(!r&&!s)return;let{allPortsFound:o,ports:a,portsWithSelectors:c}=n._findConnectedPorts();if(!o)return;let l=[];for(let k of a)k._hasMatchedPcbPrimitive()||l.push(k);if(l.length>0){e.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:n.source_trace_id,message:`Some ports did not have a matching PCB primitive (e.g. a pad or plated hole), this can happen if a footprint is missing. As a result, ${n} wasn't routed. Missing ports: ${l.map(k=>k.getString()).join(", ")}`,pcb_trace_id:n.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:l.map(k=>k.pcb_port_id).filter(Boolean)});return}let u=n._getExplicitTraceThickness()??n.getSubcircuit()._parsedProps.minTraceWidth??.16;if(s&&!r){if(!a||a.length<2){n.renderError("pcbStraightLine requires exactly two connected ports");return}let[k,N]=a,E=k.getAvailablePcbLayers(),C=N.getAvailablePcbLayers(),A=E.find(nt=>C.includes(nt))??E[0]??C[0]??"top",R=k._getGlobalPcbPositionAfterLayout(),B=N._getGlobalPcbPositionAfterLayout(),D=ent({traceStart:B,traceEnd:R,traceWidth:u,port:k}),U=ent({traceStart:R,traceEnd:B,traceWidth:u,port:N}),X=[{route_type:"wire",x:D.x,y:D.y,width:u,layer:A,start_pcb_port_id:k.pcb_port_id},{route_type:"wire",x:U.x,y:U.y,width:u,layer:A,end_pcb_port_id:N.pcb_port_id}],W=w9(X),J=e.pcb_trace.insert({route:X,source_trace_id:n.source_trace_id,subcircuit_id:i?.subcircuit_id??void 0,pcb_group_id:n.getGroup()?.pcb_group_id??void 0,trace_length:W});n._portsRoutedOnPcb=a,n.pcb_trace_id=J.pcb_trace_id,n._insertErrorIfTraceIsOutsideBoard(X,a);return}if(!t.pcbPath)return;let p;t.pcbPathRelativeTo&&(p=c.find(k=>k.selector===t.pcbPathRelativeTo)?.port,p||(p=n.getSubcircuit().selectOne(t.pcbPathRelativeTo))),p||(p=a[0]);let d=a.find(k=>k!==p)??a[1],_=p.getAvailablePcbLayers()[0]||"top",g=p._getGlobalPcbPositionAfterLayout(),x=d._getGlobalPcbPositionAfterLayout(),v=[];v.push({route_type:"wire",x:g.x,y:g.y,width:u,layer:_,start_pcb_port_id:p.pcb_port_id});let S=p?._computePcbGlobalTransformBeforeLayout?.()||Pr();for(let k of t.pcbPath){let N,E=!1;if(typeof k=="string"){let M=n.getSubcircuit().selectOne(k,{type:"port"});if(!M){e.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:n.source_trace_id,message:`Could not resolve pcbPath selector "${k}" for ${n}`,pcb_trace_id:n.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:[]});continue}let A=M._getGlobalPcbPositionAfterLayout();N={x:A.x,y:A.y},E=!0}else N={x:k.x,y:k.y},E=!1;let C=E?N:De(S,N);v.push({route_type:"wire",x:C.x,y:C.y,width:u,layer:_})}v.push({route_type:"wire",x:x.x,y:x.y,width:u,layer:_,end_pcb_port_id:d.pcb_port_id});let P=w9(v),T=e.pcb_trace.insert({route:v,source_trace_id:n.source_trace_id,subcircuit_id:i?.subcircuit_id??void 0,pcb_group_id:n.getGroup()?.pcb_group_id??void 0,trace_length:P});n._portsRoutedOnPcb=a,n.pcb_trace_id=T.pcb_trace_id,n._insertErrorIfTraceIsOutsideBoard(v,a)}function d7t(n){if(n.root?.schematicDisabled)return;let{db:e}=n.root,{_parsedProps:t,parent:i}=n;if(!i)throw new Error("Trace has no parent");let{allPortsFound:r,portsWithSelectors:s}=n._findConnectedPorts();if(!r)return;let o=s.map(({port:k})=>({port:k,position:k._getGlobalSchematicPositionAfterLayout(),schematic_port_id:k.schematic_port_id,facingDirection:k.facingDirection}));if(o.length<2)throw new Error("Expected at least two ports in portsWithPosition.");let a,c,l=o[0].position,u=o[0].port;if("path"in n.props){if(n.props.path.length!==2)throw new Error("Invalid 'path': Must contain exactly two elements.");[a,c]=n.props.path}else{if(!("from"in n.props&&"to"in n.props))throw new Error("Missing 'from' or 'to' properties in props.");a=n.props.from,c=n.props.to}if(!u.source_port_id)throw new Error(`Missing source_port_id for the 'from' port (${a}).`);let p=o[1].position,d=o[1].port;if(!d.source_port_id)throw new Error(`Missing source_port_id for the 'to' port (${c}).`);let _=e.schematic_net_label.list().find(k=>k.source_net_id===u.source_port_id),g=e.schematic_net_label.list().find(k=>k.source_net_id===d.source_port_id),[x,v]=s.map(({port:k})=>k),P=x.parent?.config.shouldRenderAsSchematicBox?`${x?.parent?.props.name}_${x?.props.name}`:`${v?.parent?.props.name}_${v?.props.name}`,T=n.props.schDisplayLabel??P;if(_&&_.text!==T&&(_.text=`${T} / ${_.text}`),g&&g?.text!==T&&(g.text=`${T} / ${g.text}`),!g){let k=H1(d.facingDirection)??"bottom";e.schematic_net_label.insert({text:n.props.schDisplayLabel??P,source_net_id:d.source_port_id,anchor_position:p,center:wl({anchor_position:p,anchor_side:k,text:n.props.schDisplayLabel??P}),anchor_side:k})}if(!_){let k=H1(u.facingDirection)??"bottom";e.schematic_net_label.insert({text:n.props.schDisplayLabel??P,source_net_id:u.source_port_id,anchor_position:l,center:wl({anchor_position:l,anchor_side:k,text:n.props.schDisplayLabel??P}),anchor_side:k})}}function f7t(n){let{_parsedProps:e,parent:t}=n;if(!t)throw new Error("Trace has no parent");let r=n.getTracePortPathSelectors().map(s=>({selector:s,port:n.getSubcircuit().selectOne(s,{type:"port"})??null}));for(let{selector:s,port:o}of r)if(!o){let a,c,l=s.lastIndexOf(".");if(l!==-1&&l>s.lastIndexOf(" "))a=s.slice(0,l),c=s.slice(l+1);else{let k=s.match(/^(.*[ >])?([^ >]+)$/);a=k?.[1]?.trim()??"",c=k?.[2]??s}let u=a?n.getSubcircuit().selectOne(a):null;if(!u&&a&&!/[.#\[]/.test(a)&&(u=n.getSubcircuit().selectOne(`.${a}`)),!u){let k=a?`Could not find port for selector "${s}". Component "${a}" not found`:`Could not find port for selector "${s}"`,N=n.getSubcircuit(),E=N.getGroup();throw new lP({error_type:"source_trace_not_connected_error",message:k,subcircuit_id:N.subcircuit_id??void 0,source_group_id:E?.source_group_id??void 0,source_trace_id:n.source_trace_id??void 0,selectors_not_found:[s]})}let p=u.children.filter(k=>k.componentName==="Port"),d=c.includes(".")?c.split(".").pop()??"":c,_=p.flatMap(k=>k.getNameAndAliases()),g=_.some(k=>!/^(pin\d+|\d+)$/.test(k)),x=Array.from(new Set(_)).join(", "),v;p.length===0?v="It has no ports":g?v=`It has [${x}]`:v=`It has ${p.length} pins and no pinLabels (consider adding pinLabels)`;let S=`Could not find port for selector "${s}". Component "${u.props.name??a}" found, but does not have pin "${d}". ${v}`,P=n.getSubcircuit(),T=P.getGroup();throw new lP({error_type:"source_trace_not_connected_error",message:S,subcircuit_id:P.subcircuit_id??void 0,source_group_id:T?.source_group_id??void 0,source_trace_id:n.source_trace_id??void 0,selectors_not_found:[s]})}return r.some(s=>!s.port)?{allPortsFound:!1}:{allPortsFound:!0,portsWithSelectors:r,ports:r.map(({port:s})=>s)}}var zs=class extends Me{constructor(e){super(e);f(this,"source_trace_id",null);f(this,"pcb_trace_id",null);f(this,"schematic_trace_id",null);f(this,"_portsRoutedOnPcb");f(this,"subcircuit_connectivity_map_key",null);f(this,"_traceConnectionHash",null);f(this,"_couldNotFindPort");this._portsRoutedOnPcb=[]}_getExplicitTraceThickness(){return this._parsedProps.thickness??this._parsedProps.width}get config(){return{zodProps:fH,componentName:"Trace"}}_getTracePortOrNetSelectorListFromProps(){return"from"in this.props&&"to"in this.props?[typeof this.props.from=="string"?this.props.from:this.props.from.getPortSelector(),typeof this.props.to=="string"?this.props.to:this.props.to.getPortSelector()]:"path"in this.props?this.props.path.map(e=>typeof e=="string"?e:e.getPortSelector()):[]}getTracePortPathSelectors(){return this._getTracePortOrNetSelectorListFromProps().filter(e=>!e.includes("net."))}getTracePathNetSelectors(){return this._getTracePortOrNetSelectorListFromProps().filter(e=>e.includes("net."))}_findConnectedPorts(){return f7t(this)}_resolveNet(e){let t=this.getSubcircuit().selectOne(e,{type:"net"});if(t)return t;let i=e.match(/^net\.(.+)$/),r=i?i[1]:null;if(!r)return null;let s=this.root?._getBoard();return s?s.getDescendants().find(a=>a.componentName==="Net"&&a._parsedProps.name===r)||null:(this.renderError(`Could not find a <board> ancestor for ${this}, so net "${e}" cannot be resolved`),null)}_findConnectedNets(){let e=this.getTracePathNetSelectors().map(i=>({selector:i,net:this._resolveNet(i)})),t=e.filter(i=>!i.net);return t.length>0&&this.renderError(`Could not find net for selector "${t[0].selector}" inside ${this}`),{netsWithSelectors:e,nets:e.map(i=>i.net)}}_getAllTracesConnectedToSameNet(){let e=this.getSubcircuit().selectAll("trace"),t=this._findConnectedNets().nets,i=this._findConnectedPorts().ports??[];return e.filter(r=>{if(r===this)return!1;let s=r._findConnectedNets().nets,o=r._findConnectedPorts().ports??[];return s.some(a=>t.includes(a))||o.some(a=>i.includes(a))})}_isExplicitlyConnectedToPort(e){let{allPortsFound:t,portsWithSelectors:i}=this._findConnectedPorts();return t?i.map(s=>s.port).includes(e):!1}_isExplicitlyConnectedToNet(e){return this._findConnectedNets().nets.includes(e)}doInitialCreateNetsFromProps(){hP(this,this.getTracePathNetSelectors())}_computeTraceConnectionHash(){let{allPortsFound:e,ports:t}=this._findConnectedPorts();return!e||!t?null:[...t].sort((s,o)=>(s.pcb_port_id||"").localeCompare(o.pcb_port_id||"")).map(s=>s.pcb_port_id).join(",")}doInitialSourceTraceRender(){let{db:e}=this.root,{_parsedProps:t,parent:i}=this;if(!i){this.renderError("Trace has no parent");return}let r,s;try{let p=this._findConnectedPorts();r=p.allPortsFound,s=p.portsWithSelectors??[]}catch(p){if(p instanceof lP){e.source_trace_not_connected_error.insert({...p.errorData,error_type:"source_trace_not_connected_error"}),this._couldNotFindPort=!0;return}throw p}if(!r)return;this._traceConnectionHash=this._computeTraceConnectionHash();let a=e.source_trace.list().find(p=>p.subcircuit_connectivity_map_key===this.subcircuit_connectivity_map_key&&p.connected_source_port_ids.sort().join(",")===this._traceConnectionHash);if(a){this.source_trace_id=a.source_trace_id;return}let c=this._findConnectedNets().nets,l=WLt({ports:s,nets:c}),u=e.source_trace.insert({connected_source_port_ids:s.map(p=>p.port.source_port_id),connected_source_net_ids:c.map(p=>p.source_net_id),subcircuit_id:this.getSubcircuit()?.subcircuit_id,max_length:GLt(s.map(p=>p.port),{db:e})??t.maxLength,display_name:l,min_trace_thickness:this._getExplicitTraceThickness()});this.source_trace_id=u.source_trace_id}_insertErrorIfTraceIsOutsideBoard(e,t){let{db:i}=this.root;HLt(e,{db:i})&&i.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:this.source_trace_id,message:`Trace ${this.getString()} routed outside the board boundaries.`,pcb_trace_id:this.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:t.map(s=>s.pcb_port_id)})}doInitialPcbManualTraceRender(){h7t(this)}doInitialPcbTraceRender(){p7t(this)}_doInitialSchematicTraceRenderWithDisplayLabel(){d7t(this)}_isSymbolToChipConnection(){let{allPortsFound:e,ports:t}=this._findConnectedPorts();if(!e||t.length!==2)return!1;let[i,r]=t;if(!i?.parent||!r?.parent)return!1;let s=i.parent.config.shouldRenderAsSchematicBox,o=r.parent.config.shouldRenderAsSchematicBox;return s&&!o||!s&&o}_isSymbolToSymbolConnection(){let{allPortsFound:e,ports:t}=this._findConnectedPorts();if(!e||t.length!==2)return!1;let[i,r]=t;if(!i?.parent||!r?.parent)return!1;let s=!i.parent.config.shouldRenderAsSchematicBox,o=!r.parent.config.shouldRenderAsSchematicBox;return s&&o}_isChipToChipConnection(){let{allPortsFound:e,ports:t}=this._findConnectedPorts();if(!e||t.length!==2)return!1;let[i,r]=t;if(!i?.parent||!r?.parent)return!1;let s=i.parent.config.shouldRenderAsSchematicBox,o=r.parent.config.shouldRenderAsSchematicBox;return s&&o}doInitialSchematicTraceRender(){o7t(this)}},m7t=n=>{let{db:e}=n.root;if(n.pcb_component_id){let t=e.pcb_component.get(n.pcb_component_id);return t?{width:t.width,height:t.height}:null}if(n.pcb_group_id){let t=e.pcb_group.get(n.pcb_group_id);if(!t)return null;if(t.outline&&t.outline.length>0){let i=co(t.outline);return i?{width:i.maxX-i.minX,height:i.maxY-i.minY}:null}return{width:t.width??0,height:t.height??0}}return null},_7t=(n,e)=>{let{db:t}=n.root,i=t.toArray();if(n.pcb_component_id){Lw(i,n.pcb_component_id,e);return}if(n.source_group_id){Fw(i,n.source_group_id,e);return}throw new Error(`Cannot reposition component ${n.getString()}: no pcb_component_id or source_group_id`)},y7t=n=>{let{db:e}=n.root;if(!n.source_component_id)return;let t=n.selectAll("port"),i=e.source_trace.list(),r=new Set;for(let o of i)for(let a of o.connected_source_port_ids)r.add(a);let s=n._getInternallyConnectedPins();for(let o of s)if(o.some(a=>a.source_port_id&&r.has(a.source_port_id)))for(let a of o)a.source_port_id&&r.add(a.source_port_id);for(let o of t)o.source_port_id&&g7t(n,o)&&(r.has(o.source_port_id)||e.source_pin_missing_trace_warning.insert({message:`Port ${o.getNameAndAliases()[0]} on ${n.props.name} is missing a trace`,source_component_id:n.source_component_id,source_port_id:o.source_port_id,subcircuit_id:n.getSubcircuit().subcircuit_id??void 0,warning_type:"source_pin_missing_trace_warning"}))},g7t=(n,e)=>{if(n.config.componentName==="Chip"){let t=n.props.pinAttributes;if(!t)return!1;for(let i of e.getNameAndAliases()){let r=t[i];if(r?.requiresPower||r?.requiresGround||r?.requiresVoltage!==void 0)return!0}return!1}return!0};function x7t(n){let e=n.font_size,t=n.text.length*e*.6,i=e,r=n.anchor_alignment||"center",s=n.anchor_position.x,o=n.anchor_position.y;switch(r){case"top_left":s=n.anchor_position.x+t/2,o=n.anchor_position.y+i/2;break;case"top_center":s=n.anchor_position.x,o=n.anchor_position.y+i/2;break;case"top_right":s=n.anchor_position.x-t/2,o=n.anchor_position.y+i/2;break;case"center_left":s=n.anchor_position.x+t/2,o=n.anchor_position.y;break;case"center":s=n.anchor_position.x,o=n.anchor_position.y;break;case"center_right":s=n.anchor_position.x-t/2,o=n.anchor_position.y;break;case"bottom_left":s=n.anchor_position.x+t/2,o=n.anchor_position.y-i/2;break;case"bottom_center":s=n.anchor_position.x,o=n.anchor_position.y-i/2;break;case"bottom_right":s=n.anchor_position.x-t/2,o=n.anchor_position.y-i/2;break;default:s=n.anchor_position.x,o=n.anchor_position.y;break}return{x:s-t/2,y:o-i/2,width:t,height:i}}function b7t(n){if(!n._adjustSilkscreenTextAutomatically||n.root?.pcbDisabled||!n.pcb_component_id)return;let{db:e}=n.root,i=n._getPcbCircuitJsonBounds().center,r=e.pcb_silkscreen_text.list({pcb_component_id:n.pcb_component_id}).filter(c=>c.text===n.name);if(r.length===0)return;let a=n.getSubcircuit().selectAll("[_isNormalComponent=true]").filter(c=>c!==n&&c.pcb_component_id).map(c=>{let l=c._getPcbCircuitJsonBounds(),u={center:l.center,width:l.width,height:l.height};return so(u)});for(let c of r){let l=c.anchor_position,u=x7t(c),p={center:{x:u.x+u.width/2,y:u.y+u.height/2},width:u.width,height:u.height},d=so(p);if(!a.some(T=>Jc(d,T)))continue;let g=2*i.x-l.x,x=2*i.y-l.y,v={center:{x:g,y:x},width:u.width,height:u.height},S=so(v);a.some(T=>Jc(S,T))||e.pcb_silkscreen_text.update(c.pcb_silkscreen_text_id,{anchor_position:{x:g,y:x}})}}function v7t(n){if(!n)return{validPinLabels:n,invalidPinLabelsMessages:[]};let e={},t=[];for(let[i,r]of Object.entries(n)){let s=Array.isArray(r)?r.slice():[r],o=[];for(let a of s)w7t(i,a)?o.push(a):t.push(`Invalid pin label: ${i} = '${a}' - excluding from component. Please use a valid pin label.`);o.length>0&&(e[i]=Array.isArray(r)?o:o[0])}return{validPinLabels:Object.keys(e).length>0?e:void 0,invalidPinLabelsMessages:t}}function w7t(n,e){try{let t={name:"test",footprint:"test",pinLabels:{[n]:e}};return s_.safeParse(t).success}catch{return!1}}var q_=n=>n.startsWith("http://")||n.startsWith("https://"),P9=n=>{if(q_(n))return null;let e=n.indexOf(":");if(e<=0)return null;let t=n.slice(0,e),i=n.slice(e+1);return!t||!i?null:{footprintLib:t,footprintName:i}},k9=n=>n.startsWith("/"),S7t=(0,$nt.default)("tscircuit:core:resolveStaticFileImport");async function znt(n,e){if(!n)return n;let t=e?.resolveProjectStaticFileImportUrl;if(t&&n.startsWith("/"))try{let i=await t(n);if(i)return i}catch(i){S7t("failed to resolve static file via platform resolver",i)}return Rnt(n,e?.projectBaseUrl)}function P7t(n,e){let{footprint:t}=n.props;if(t??(t=n._getImpliedFootprintString?.()),!t)return;let{pcbRotation:i,pinLabels:r,pcbPinLabels:s}=n.props,o=Ant(String(t)),a=o?n.root?.platform?.footprintFileParserMap?.[o]:null;if(typeof t=="string"&&(q_(t)||k9(t))&&a){if(n._hasStartedFootprintUrlLoad)return;n._hasStartedFootprintUrlLoad=!0,e("load-footprint-from-platform-file-parser",async()=>{let c=q_(t)?t:await znt(t,n.root?.platform);try{let l=await a.loadFromUrl(c),u=H_({componentName:n.name,componentRotation:i,footprinterString:c,pinLabels:r,pcbPinLabels:s},l.footprintCircuitJson);n.addAll(u),n._markDirty("InitializePortsFromChildren")}catch(l){let u=n.root?.db;if(u&&n.source_component_id&&n.pcb_component_id){let p=n.getSubcircuit(),d=`${n.getString()} failed to load footprint "${c}": `+(l instanceof Error?l.message:String(l)),_=Fm.parse({type:"external_footprint_load_error",message:d,pcb_component_id:n.pcb_component_id,source_component_id:n.source_component_id,subcircuit_id:p.subcircuit_id??void 0,pcb_group_id:n.getGroup()?.pcb_group_id??void 0,footprinter_string:c});u.external_footprint_load_error.insert(_)}throw l}});return}if(typeof t=="string"&&q_(t)){if(n._hasStartedFootprintUrlLoad)return;n._hasStartedFootprintUrlLoad=!0;let c=t;e("load-footprint-url",async()=>{try{let l=await fetch(c);if(!l.ok)throw new Error(`Failed to fetch footprint: ${l.status}`);let u=await l.json(),p=H_({componentName:n.name,componentRotation:i,footprinterString:c,pinLabels:r,pcbPinLabels:s},u);n.addAll(p),n._markDirty("InitializePortsFromChildren")}catch(l){let u=n.root?.db;if(u&&n.source_component_id&&n.pcb_component_id){let p=n.getSubcircuit(),d=`${n.getString()} failed to load external footprint "${c}": `+(l instanceof Error?l.message:String(l)),_=Fm.parse({type:"external_footprint_load_error",message:d,pcb_component_id:n.pcb_component_id,source_component_id:n.source_component_id,subcircuit_id:p.subcircuit_id??void 0,pcb_group_id:n.getGroup()?.pcb_group_id??void 0,footprinter_string:c});u.external_footprint_load_error.insert(_)}throw l}});return}if(typeof t=="string"){let c=P9(t);if(!c||n._hasStartedFootprintUrlLoad)return;n._hasStartedFootprintUrlLoad=!0;let u=n.root?.platform?.footprintLibraryMap?.[c.footprintLib],p;if(typeof u=="function"&&(p=u),!p)return;let d=n.getInheritedMergedProperty("pcbStyle");e("load-lib-footprint",async()=>{try{let _=await p(c.footprintName,{resolvedPcbStyle:d}),g=null;if(Array.isArray(_)?g=_:Array.isArray(_.footprintCircuitJson)&&(g=_.footprintCircuitJson),!g)return;let x=H_({componentName:n.name,componentRotation:i,footprinterString:t,pinLabels:r,pcbPinLabels:s},g);n.addAll(x),!Array.isArray(_)&&_.cadModel&&(n._asyncFootprintCadModel=_.cadModel);for(let v of n.children)v.componentName==="Port"&&v._markDirty?.("PcbPortRender");n._markDirty("InitializePortsFromChildren")}catch(_){let g=n.root?.db;if(g&&n.source_component_id&&n.pcb_component_id){let x=n.getSubcircuit(),v=`${n.getString()} failed to load external footprint "${t}": `+(_ instanceof Error?_.message:String(_)),S=Fm.parse({type:"external_footprint_load_error",message:v,pcb_component_id:n.pcb_component_id,source_component_id:n.source_component_id,subcircuit_id:x.subcircuit_id??void 0,pcb_group_id:n.getGroup()?.pcb_group_id??void 0,footprinter_string:t});g.external_footprint_load_error.insert(S)}throw _}});return}if(!(0,S9.isValidElement)(t)&&t.componentName==="Footprint"&&n.add(t),Array.isArray(t)&&!(0,S9.isValidElement)(t)&&t.length>0){try{let c=H_({componentName:n.name,componentRotation:i,footprinterString:"",pinLabels:r,pcbPinLabels:s},t);n.addAll(c)}catch(c){let l=n.root?.db;if(l&&n.source_component_id&&n.pcb_component_id){let u=n.getSubcircuit(),p=`${n.getString()} failed to load json footprint: `+(c instanceof Error?c.message:String(c)),d=rb.parse({type:"circuit_json_footprint_load_error",message:p,pcb_component_id:n.pcb_component_id,source_component_id:n.source_component_id,subcircuit_id:u.subcircuit_id??void 0,pcb_group_id:n.getGroup()?.pcb_group_id??void 0});l.circuit_json_footprint_load_error.insert(d)}throw c}return}}function k7t(n){if(n.root?.pcbDisabled||!n.pcb_component_id)return;let{pcbX:e,pcbY:t}=n._parsedProps,i=n.props?.pcbPositionAnchor;if(!i||e===void 0&&t===void 0)return;let r=mP(n.children);if(r.width===0||r.height===0)return;let o={...{x:(r.minX+r.maxX)/2,y:(r.minY+r.maxY)/2}},a=null;if(new Set(["center","top_left","top_center","top_right","center_left","center_right","bottom_left","bottom_center","bottom_right"]).has(i)){let u={left:r.minX,right:r.maxX,top:r.minY,bottom:r.maxY};switch(i){case"center":a=o;break;case"top_left":a={x:u.left,y:u.top};break;case"top_center":a={x:o.x,y:u.top};break;case"top_right":a={x:u.right,y:u.top};break;case"center_left":a={x:u.left,y:o.y};break;case"center_right":a={x:u.right,y:o.y};break;case"bottom_left":a={x:u.left,y:u.bottom};break;case"bottom_center":a={x:o.x,y:u.bottom};break;case"bottom_right":a={x:u.right,y:u.bottom};break}}else try{let u=n.portMap[i];u&&(a=u._getGlobalPcbPositionBeforeLayout())}catch{}if(!a)return;let l={...o};e!==void 0&&(l.x+=e-a.x),t!==void 0&&(l.y+=t-a.y),(Math.abs(l.x-o.x)>1e-6||Math.abs(l.y-o.y)>1e-6)&&n._repositionOnPcb(l)}var T7t=(0,bnt.default)("tscircuit:core"),E7t=h.object({x:tn,y:tn,z:tn}),Bn=class extends Me{constructor(e){let t={...e},i=[];if(t.pinLabels&&!Array.isArray(t.pinLabels)){let{validPinLabels:r,invalidPinLabelsMessages:s}=v7t(t.pinLabels);t.pinLabels=r,i=s}super(t);f(this,"reactSubtrees",[]);f(this,"_impliedFootprint");f(this,"isPrimitiveContainer",!0);f(this,"_isNormalComponent",!0);f(this,"_attributeLowerToCamelNameMap",{_isnormalcomponent:"_isNormalComponent"});f(this,"_asyncSupplierPartNumbers");f(this,"_asyncFootprintCadModel");f(this,"_isCadModelChild");f(this,"pcb_missing_footprint_error_id");f(this,"_hasStartedFootprintUrlLoad",!1);f(this,"_invalidPinLabelMessages",[]);f(this,"_adjustSilkscreenTextAutomatically",!1);this._invalidPinLabelMessages=i,this._addChildrenFromStringFootprint(),this.initPorts()}get defaultInternallyConnectedPinNames(){return[]}get internallyConnectedPinNames(){return(this._parsedProps.internallyConnectedPins??this.defaultInternallyConnectedPinNames).map(t=>t.map(i=>typeof i=="number"?`pin${i}`:i))}doInitialSourceNameDuplicateComponentRemoval(){if(!this.name)return;let e=this.root;if(this.getSubcircuit().selectAll(`.${this.name}`).filter(r=>r!==this&&r._isNormalComponent&&r.renderPhaseStates?.SourceNameDuplicateComponentRemoval?.initialized).length>0){let r=this._getGlobalPcbPositionBeforeLayout(),s=this._getGlobalSchematicPositionBeforeLayout();e.db.source_failed_to_create_component_error.insert({component_name:this.name,error_type:"source_failed_to_create_component_error",message:`Cannot create component "${this.name}": A component with the same name already exists`,pcb_center:r,schematic_center:s}),this.shouldBeRemoved=!0;let o=[...this.children];for(let a of o)this.remove(a)}}initPorts(e={}){if(this.root?.schematicDisabled)return;let{config:t}=this,i=[],r=this._getSchematicPortArrangement();if(r&&!this._parsedProps.pinLabels){for(let l in r){let u=r[l].pins;if(Array.isArray(u))for(let p of u){let d=W1(p,this._parsedProps.pinLabels);i.push(new Wi({pinNumber:d,aliases:e.additionalAliases?.[`pin${d}`]??[]},{originDescription:`schPortArrangement:${l}`}))}}let a=["left","right","top","bottom"],c=1;for(let l of a){let u=r[`${l}Size`];for(let p=0;p<u;p++)i.push(new Wi({pinNumber:c++,aliases:e.additionalAliases?.[`pin${c}`]??[]},{originDescription:`schPortArrangement:${l}`}))}}let s=this._parsedProps.pinLabels;if(s)for(let[a,c]of Object.entries(s)){a=a.replace("pin","");let l=i.find(d=>d._parsedProps.pinNumber===Number(a)),u=Array.isArray(c)?c[0]:c,p=Array.isArray(c)?c.slice(1):[];l?(l.externallyAddedAliases.push(u,...p),l.props.name=u):(l=new Wi({pinNumber:parseInt(a),name:u,aliases:[...p,...e.additionalAliases?.[`pin${parseInt(a)}`]??[]]},{originDescription:`pinLabels:pin${a}`}),i.push(l))}if(t.schematicSymbolName&&!e.ignoreSymbolPorts){let a=gi[this._getSchematicSymbolNameOrThrow()];if(!a)return;for(let c of a.ports){let l=Mnt(c.labels);if(!l)continue;let u=i.find(p=>p._parsedProps.pinNumber===Number(l));if(u)u.schematicSymbolPortDef=c;else{let p=B1(c.labels.concat(e.additionalAliases?.[`pin${l}`]??[]));p&&(p.originDescription=`schematicSymbol:labels[0]:${c.labels[0]}`,p.schematicSymbolPortDef=c,i.push(p))}}this.addAll(i)}if(!this._getSchematicPortArrangement()){let a=this.getPortsFromFootprint(e);for(let c of a)i.some(l=>l.isMatchingAnyOf(c.getNameAndAliases()))||i.push(c)}let o=e.pinCount??this._getPinCount()??0;for(let a=1;a<=o;a++){if(i.find(l=>l._parsedProps.pinNumber===a))continue;if(!r){i.push(new Wi({pinNumber:a,aliases:e.additionalAliases?.[`pin${a}`]??[]}));continue}let c=[...r.leftSide?.pins??[],...r.rightSide?.pins??[],...r.topSide?.pins??[],...r.bottomSide?.pins??[]].map(l=>W1(l,this._parsedProps.pinLabels));["leftSize","rightSize","topSize","bottomSize","leftPinCount","rightPinCount","topPinCount","bottomPinCount"].some(l=>l in r)&&(c=Array.from({length:this._getPinCount()},(l,u)=>u+1)),c.includes(a)&&i.push(new Wi({pinNumber:a,aliases:e.additionalAliases?.[`pin${a}`]??[]},{originDescription:`notOtherwiseAddedButDeducedFromPinCount:${a}`}))}i.length>0&&this.addAll(i)}_getImpliedFootprintString(){return null}_addChildrenFromStringFootprint(){let{pcbRotation:e,pinLabels:t,pcbPinLabels:i}=this.props,{footprint:r}=this.props;if(r??(r=this._getImpliedFootprintString?.()),!!r&&typeof r=="string"){if(q_(r)||k9(r)||P9(r))return;let s=F3.string(r).soup(),o=H_({componentName:this.name??this.componentName,componentRotation:e,footprinterString:r,pinLabels:t,pcbPinLabels:i},s);this.addAll(o)}}get portMap(){return new Proxy({},{get:(e,t)=>{let i=this.children.find(r=>r.componentName==="Port"&&r.isMatchingNameOrAlias(t));if(!i)throw new Error(`There was an issue finding the port "${t.toString()}" inside of a ${this.componentName} component with name: "${this.props.name}". This is a bug in @tscircuit/core`);return i}})}getInstanceForReactElement(e){for(let t of this.reactSubtrees)if(t.element===e)return t.component;return null}doInitialSourceRender(){let e=this.config.sourceFtype;if(!e)return;let{db:t}=this.root,{_parsedProps:i}=this,r=t.source_component.insert({ftype:e,name:this.name,manufacturer_part_number:i.manufacturerPartNumber??i.mfn,supplier_part_numbers:i.supplierPartNumbers});this.source_component_id=r.source_component_id}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root;if(this._invalidPinLabelMessages?.length&&this.root?.db)for(let s of this._invalidPinLabelMessages){let o="pinLabels",a=s.match(/^Invalid pin label:\s*([^=]+)=\s*'([^']+)'/);a&&(o=`pinLabels['${a[2]}']`),this.root.db.source_property_ignored_warning.insert({source_component_id:this.source_component_id,property_name:o,message:s,error_type:"source_property_ignored_warning"})}let{schematicSymbolName:t}=this.config,{_parsedProps:i}=this;i.symbol&&(0,Wa.isValidElement)(i.symbol)?this._doInitialSchematicComponentRenderWithReactSymbol(i.symbol):t?this._doInitialSchematicComponentRenderWithSymbol():this._getSchematicBoxDimensions()&&this._doInitialSchematicComponentRenderWithSchematicBoxDimensions();let r=this.getSubcircuit()?._getSchematicManualPlacementForComponent(this);if(this.schematic_component_id&&(this.props.schX!==void 0||this.props.schY!==void 0)&&r){if(!this.schematic_component_id)return;let s=eb.parse({type:"schematic_manual_edit_conflict_warning",schematic_manual_edit_conflict_warning_id:`schematic_manual_edit_conflict_${this.source_component_id}`,message:`${this.getString()} has both manual placement and prop coordinates. schX and schY will be used. Remove schX/schY or clear the manual placement.`,schematic_component_id:this.schematic_component_id,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id});e.schematic_manual_edit_conflict_warning.insert(s)}}_getSchematicSymbolDisplayValue(){}_getInternallyConnectedPins(){if(this.internallyConnectedPinNames.length===0)return[];let e=[];for(let t of this.internallyConnectedPinNames){let i=[];for(let r of t)i.push(this.portMap[r]);e.push(i)}return e}_doInitialSchematicComponentRenderWithSymbol(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getSchematicSymbolNameOrThrow(),r=gi[i],s=this._getGlobalSchematicPositionBeforeLayout();if(r){let o=e.schematic_component.insert({center:s,size:r.size,source_component_id:this.source_component_id,is_box_with_pins:!0,symbol_name:i,symbol_display_value:this._getSchematicSymbolDisplayValue()});this.schematic_component_id=o.schematic_component_id}}_doInitialSchematicComponentRenderWithReactSymbol(e){if(this.root?.schematicDisabled)return;let{db:t}=this.root,i=this._getGlobalSchematicPositionBeforeLayout(),r=t.schematic_component.insert({center:i,size:{width:0,height:0},source_component_id:this.source_component_id,symbol_display_value:this._getSchematicSymbolDisplayValue(),is_box_with_pins:!1});this.schematic_component_id=r.schematic_component_id}_doInitialSchematicComponentRenderWithSchematicBoxDimensions(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getSchematicBoxDimensions(),r={};if(Array.isArray(t.pinLabels))t.pinLabels.forEach((_,g)=>{r[String(g+1)]=_});else for(let[_,g]of Object.entries(t.pinLabels??{}))r[_]=Array.isArray(g)?g[0]:g;let s=this._getGlobalSchematicPositionBeforeLayout(),o=this._getSchematicPortArrangement(),a=e.schematic_component.insert({center:s,rotation:t.schRotation??0,size:i.getSize(),port_arrangement:kLt(o),pin_spacing:t.schPinSpacing??.2,pin_styles:PLt(t.schPinStyle,t.pinLabels),port_labels:r,source_component_id:this.source_component_id}),c=o?.topSide!==void 0||o?.bottomSide!==void 0,l=i?.getSize().width,u=i?.getSize().height,p=e.schematic_text.insert({text:t.manufacturerPartNumber??"",schematic_component_id:a.schematic_component_id,anchor:"left",rotation:0,position:{x:c?s.x+(l??0)/2+.1:s.x-(l??0)/2,y:c?s.y+(u??0)/2+.35:s.y-(u??0)/2-.13},color:"#006464",font_size:.18}),d=e.schematic_text.insert({text:t.name??"",schematic_component_id:a.schematic_component_id,anchor:"left",rotation:0,position:{x:c?s.x+(l??0)/2+.1:s.x-(l??0)/2,y:c?s.y+(u??0)/2+.55:s.y+(u??0)/2+.13},color:"#006464",font_size:.18});this.schematic_component_id=a.schematic_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this.getSubcircuit(),r=t.layer??"top";if(r!=="top"&&r!=="bottom"){let p=$m.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${r}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:r,subcircuit_id:i.subcircuit_id??void 0});e.pcb_component_invalid_layer_error.insert(p)}let s=this._computePcbGlobalTransformBeforeLayout(),a=io(s).rotation.angle*180/Math.PI,c=e.pcb_component.insert({center:this._getGlobalPcbPositionBeforeLayout(),width:0,height:0,layer:r==="top"||r==="bottom"?r:"top",rotation:t.pcbRotation??a,source_component_id:this.source_component_id,subcircuit_id:i.subcircuit_id??void 0,do_not_place:t.doNotPlace??!1,obstructs_within_bounds:t.obstructsWithinBounds??!0});if(!(t.footprint??this._getImpliedFootprintString())&&!this.isGroup){let p=e.pcb_missing_footprint_error.insert({message:`No footprint found for component: ${this.getString()}`,source_component_id:`${this.source_component_id}`,error_type:"pcb_missing_footprint_error"});this.pcb_missing_footprint_error_id=p.pcb_missing_footprint_error_id}this.pcb_component_id=c.pcb_component_id;let u=this.getSubcircuit()._getPcbManualPlacementForComponent(this);if((this.props.pcbX!==void 0||this.props.pcbY!==void 0)&&u){let p=sb.parse({type:"pcb_manual_edit_conflict_warning",pcb_manual_edit_conflict_warning_id:`pcb_manual_edit_conflict_${this.source_component_id}`,message:`${this.getString()} has both manual placement and prop coordinates. pcbX and pcbY will be used. Remove pcbX/pcbY or clear the manual placement.`,pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,subcircuit_id:i.subcircuit_id??void 0});e.pcb_manual_edit_conflict_warning.insert(p)}}doInitialPcbComponentSizeCalculation(){if(this.root?.pcbDisabled||!this.pcb_component_id)return;let{db:e}=this.root,{_parsedProps:t}=this,i=mP(this.children);if(i.width===0||i.height===0)return;let r={x:(i.minX+i.maxX)/2,y:(i.minY+i.maxY)/2};e.pcb_component.update(this.pcb_component_id,{center:r,width:i.width,height:i.height})}updatePcbComponentSizeCalculation(){this.doInitialPcbComponentSizeCalculation()}doInitialSchematicComponentSizeCalculation(){if(this.root?.schematicDisabled||!this.schematic_component_id)return;let{db:e}=this.root;if(!e.schematic_component.get(this.schematic_component_id))return;let i=[],r=u=>{for(let p of u){if(p.isSchematicPrimitive&&p.componentName==="SchematicLine"){let d=e.schematic_line.get(p.schematic_line_id);d&&i.push(d)}if(p.isSchematicPrimitive&&p.componentName==="SchematicRect"){let d=e.schematic_rect.get(p.schematic_rect_id);d&&i.push(d)}if(p.isSchematicPrimitive&&p.componentName==="SchematicCircle"){let d=e.schematic_circle.get(p.schematic_circle_id);d&&i.push(d)}if(p.isSchematicPrimitive&&p.componentName==="SchematicArc"){let d=e.schematic_arc.get(p.schematic_arc_id);d&&i.push(d)}if(p.isSchematicPrimitive&&p.componentName==="SchematicText"){let d=e.schematic_text.get(p.schematic_text_id);d&&i.push(d)}p.children&&p.children.length>0&&r(p.children)}};if(r(this.children),i.length===0)return;let s=Ent(i),o=Math.abs(s.maxX-s.minX),a=Math.abs(s.maxY-s.minY);if(o===0&&a===0)return;let c=(s.minX+s.maxX)/2,l=(s.minY+s.maxY)/2;e.schematic_component.update(this.schematic_component_id,{center:{x:c,y:l},size:{width:o,height:a}})}updateSchematicComponentSizeCalculation(){this.doInitialSchematicComponentSizeCalculation()}doInitialPcbComponentAnchorAlignment(){k7t(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}_renderReactSubtree(e){let t=knt(e);return{element:e,component:t}}doInitialInitializePortsFromChildren(){this.initPorts()}doInitialReactSubtreesRender(){let e=this.props.footprint;(0,Wa.isValidElement)(e)&&(this.children.some(s=>s.componentName==="Footprint")||this.add(e));let t=this.props.symbol;(0,Wa.isValidElement)(t)&&(this.children.some(s=>s.componentName==="Symbol")||this.add(t));let i=this.props.cadModel;if((0,Wa.isValidElement)(i)){this._isCadModelChild=!0;let r=this.children.some(o=>o.componentName==="CadAssembly"),s=this.children.some(o=>o.componentName==="CadModel");!r&&!s&&this.add(i)}}doInitialPcbFootprintStringRender(){P7t(this,(e,t)=>this._queueAsyncEffect(e,t))}_hasExistingPortExactly(e){return this.children.filter(i=>i.componentName==="Port").some(i=>{let r=e.getNameAndAliases(),s=i.getNameAndAliases();return r.length===s.length&&r.every(o=>s.includes(o))})}add(e){let t;if((0,Wa.isValidElement)(e)){let i=this._renderReactSubtree(e);this.reactSubtrees.push(i),t=i.component}else t=e;if(t.componentName==="Port"){if(this._hasExistingPortExactly(t))return;let r=this.children.filter(s=>s.componentName==="Port").find(s=>s.isMatchingAnyOf(t.getNameAndAliases()));r&&T7t(`Similar ports added. Port 1: ${r}, Port 2: ${t}`)}super.add(t)}getPortsFromFootprint(e){let{footprint:t}=this.props;if((!t||(0,Wa.isValidElement)(t))&&(t=this.children.find(r=>r.componentName==="Footprint")),typeof t=="string"){if(q_(t))return[];if(k9(t))return[];if(P9(t))return[];let r=F3.string(t).soup(),s=[];for(let o of r)if("port_hints"in o&&o.port_hints){let a=B1(o.port_hints,e);if(!a)continue;a.originDescription=`footprint:string:${t}:port_hints[0]:${o.port_hints[0]}`,s.push(a)}return s}if(!(0,Wa.isValidElement)(t)&&t&&t.componentName==="Footprint"){let r=t,s=1,o=[];for(let a of r.children){if(!a.props.portHints)continue;let c=a.props.portHints;c.some(p=>p.startsWith("pin"))||(c=[...c,`pin${s}`]),s++;let u=B1(c);u&&(u.originDescription=`footprint:${t}`,o.push(u))}return o}let i=[];if(!t){for(let r of this.children)if(r.props.portHints&&r.isPcbPrimitive){let s=B1(r.props.portHints);s&&i.push(s)}}return i}getPortsFromSchematicSymbol(){if(this.root?.schematicDisabled)return[];let{config:e}=this;if(!e.schematicSymbolName)return[];let t=gi[e.schematicSymbolName];if(!t)return[];let i=[];for(let r of t.ports){let s=B1(r.labels);s&&(s.schematicSymbolPortDef=r,i.push(s))}return i}doInitialCreateNetsFromProps(){this._createNetsFromProps(this._getNetsFromConnectionsProp())}_getNetsFromConnectionsProp(){let{_parsedProps:e}=this,t=[];if(e.connections)for(let[i,r]of Object.entries(e.connections)){let s=Array.isArray(r)?r:[r];for(let o of s)t.push(String(o))}return t}_createNetsFromProps(e){hP(this,e)}_getPcbCircuitJsonBounds(){let{db:e}=this.root;if(!this.pcb_component_id)return super._getPcbCircuitJsonBounds();let t=e.pcb_component.get(this.pcb_component_id);return{center:{x:t.center.x,y:t.center.y},bounds:{left:t.center.x-t.width/2,top:t.center.y-t.height/2,right:t.center.x+t.width/2,bottom:t.center.y+t.height/2},width:t.width,height:t.height}}_getPinCountFromSchematicPortArrangement(){let e=this._getSchematicPortArrangement();if(!e)return 0;if(!Cnt(e))return(e.leftSize??e.leftPinCount??0)+(e.rightSize??e.rightPinCount??0)+(e.topSize??e.topPinCount??0)+(e.bottomSize??e.bottomPinCount??0);let{leftSide:i,rightSide:r,topSide:s,bottomSide:o}=e;return Math.max(...i?.pins??[],...r?.pins??[],...s?.pins??[],...o?.pins??[])}_getPinCount(){if(this._getSchematicPortArrangement())return this._getPinCountFromSchematicPortArrangement();let t=this.getPortsFromFootprint();if(t.length>0)return t.length;let{pinLabels:i}=this._parsedProps;if(i){if(Array.isArray(i))return i.length;let r=Object.keys(i).map(s=>s.startsWith("pin")?parseInt(s.slice(3)):parseInt(s)).filter(s=>!Number.isNaN(s));return r.length>0?Math.max(...r):Object.keys(i).length}return 0}_getSchematicPortArrangement(){return this._parsedProps.schPinArrangement??this._parsedProps.schPortArrangement}_getPinLabelsFromPorts(){let e=this.selectAll("port"),t={};for(let i of e){let r=i.props.pinNumber;if(r!==void 0){let s=i._getBestDisplayPinLabel();s&&(t[`pin${r}`]=s)}}return t}_getSchematicBoxDimensions(){if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox)return null;let{_parsedProps:e}=this,t=this._getPinCount(),i=e.schPinSpacing??.2,s={...this._getPinLabelsFromPorts(),...e.pinLabels};return FLt({schWidth:e.schWidth,schHeight:e.schHeight,schPinSpacing:i,numericSchPinStyle:DLt(e.schPinStyle,s),pinCount:t,schPortArrangement:this._getSchematicPortArrangement(),pinLabels:s})}getFootprinterString(){return typeof this._parsedProps.footprint=="string"?this._parsedProps.footprint:null}doInitialCadModelRender(){if(this._isCadModelChild||this.props.doNotPlace)return;let{db:e}=this.root,{boardThickness:t=0}=this.root?._getBoard()??{},i=this._parsedProps.cadModel,r=i===void 0?this._asyncFootprintCadModel:i,s=this.getFootprinterString()??this._getImpliedFootprintString();if(!this.pcb_component_id||!r&&!s||r===null)return;let o=this._getPcbCircuitJsonBounds();if(typeof r=="string")throw new Error("String cadModel not yet implemented");let a=E7t.parse({x:0,y:0,z:typeof r?.rotationOffset=="number"?r.rotationOffset:0,...typeof r?.rotationOffset=="object"?r.rotationOffset??{}:{}}),c=Uh.parse({x:0,y:0,z:0,...typeof r?.positionOffset=="object"?r.positionOffset:{}}),l=r&&typeof r=="object"&&"zOffsetFromSurface"in r&&r.zOffsetFromSurface!==void 0?V.parse(r.zOffsetFromSurface):0,u=this.props.layer==="bottom"?"bottom":"top",p=this._computePcbGlobalTransformBeforeLayout(),_=io(p).rotation.angle*180/Math.PI,g=u==="bottom",x=_+(a.z??0),v=hd(x),S=e.cad_component.insert({position:{x:o.center.x+c.x,y:o.center.y+c.y,z:(u==="bottom"?-t/2:t/2)+(u==="bottom"?-l:l)+c.z},rotation:{x:a.x,y:a.y+(g?180:0),z:hd(g?-v:v)},pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,model_stl_url:"stlUrl"in(r??{})?this._addCachebustToModelUrl(r.stlUrl):void 0,model_obj_url:"objUrl"in(r??{})?this._addCachebustToModelUrl(r.objUrl):void 0,model_mtl_url:"mtlUrl"in(r??{})?this._addCachebustToModelUrl(r.mtlUrl):void 0,model_gltf_url:"gltfUrl"in(r??{})?this._addCachebustToModelUrl(r.gltfUrl):void 0,model_glb_url:"glbUrl"in(r??{})?this._addCachebustToModelUrl(r.glbUrl):void 0,model_step_url:"stepUrl"in(r??{})?this._addCachebustToModelUrl(r.stepUrl):void 0,model_wrl_url:"wrlUrl"in(r??{})?this._addCachebustToModelUrl(r.wrlUrl):void 0,model_jscad:"jscad"in(r??{})?r.jscad:void 0,model_unit_to_mm_scale_factor:typeof r?.modelUnitToMmScale=="number"?r.modelUnitToMmScale:void 0,footprinter_string:typeof s=="string"&&!r?s:void 0,show_as_translucent_model:this._parsedProps.showAsTranslucentModel});this.cad_component_id=S.cad_component_id}_addCachebustToModelUrl(e){if(!e||!e.includes("modelcdn.tscircuit.com"))return e;let t=this.root?.getClientOrigin()??"";return`${e}${e.includes("?")?"&":"?"}cachebust_origin=${encodeURIComponent(t)}`}_getPartsEngineCacheKey(e,t){return JSON.stringify({ftype:e.ftype,name:e.name,manufacturer_part_number:e.manufacturer_part_number,footprinterString:t})}async _getSupplierPartNumbers(e,t,i){if(this.props.doNotPlace)return{};let r=this.root?.platform?.localCacheEngine,s=this._getPartsEngineCacheKey(t,i);if(r){let c=await r.getItem(s);if(c)try{return JSON.parse(c)}catch{}}let o=await Promise.resolve(e.findPart({sourceComponent:t,footprinterString:i}));if(typeof o=="string"){if(o.includes("<!DOCTYPE")||o.includes("<html"))throw new Error(`Failed to fetch supplier part numbers: Received HTML response instead of JSON. Response starts with: ${o.substring(0,100)}`);if(o==="Not found")return{};throw new Error(`Invalid supplier part numbers format: Expected object but got string: "${o}"`)}if(!o||Array.isArray(o)||typeof o!="object"){let c=o===null?"null":Array.isArray(o)?"array":typeof o;throw new Error(`Invalid supplier part numbers format: Expected object but got ${c}`)}let a=o;if(r)try{await r.setItem(s,JSON.stringify(a))}catch{}return a}doInitialPartsEngineRender(){if(this.props.doNotPlace)return;let e=this.getInheritedProperty("partsEngine");if(!e)return;let{db:t}=this.root,i=t.source_component.get(this.source_component_id);if(!i||i.supplier_part_numbers)return;let r;this.props.footprint&&typeof this.props.footprint=="string"&&(r=this.props.footprint);let s=this._getSupplierPartNumbers(e,i,r);if(!(s instanceof Promise)){t.source_component.update(this.source_component_id,{supplier_part_numbers:s});return}this._queueAsyncEffect("get-supplier-part-numbers",async()=>{await s.then(o=>{this._asyncSupplierPartNumbers=o,this._markDirty("PartsEngineRender")}).catch(o=>{this._asyncSupplierPartNumbers={};let a=Qx.parse({type:"unknown_error_finding_part",message:`Failed to fetch supplier part numbers for ${this.getString()}: ${o.message}`,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id});t.unknown_error_finding_part.insert(a),this._markDirty("PartsEngineRender")})})}updatePartsEngineRender(){if(this.props.doNotPlace)return;let{db:e}=this.root,t=e.source_component.get(this.source_component_id);if(t&&!t.supplier_part_numbers&&this._asyncSupplierPartNumbers){e.source_component.update(this.source_component_id,{supplier_part_numbers:this._asyncSupplierPartNumbers});return}}doInitialAssignFallbackProps(){let{_parsedProps:e}=this;e.connections&&!this.name&&(this.fallbackUnassignedName=this.getSubcircuit().getNextAvailableName(this))}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}_createTracesFromConnectionsProp(){let{_parsedProps:e}=this;if(e.connections)for(let[t,i]of Object.entries(e.connections)){let r=Array.isArray(i)?i:[i];for(let s of r)this.add(new zs({from:`.${this.name} > .${t}`,to:String(s)}))}}doInitialSourceDesignRuleChecks(){y7t(this)}_getMinimumFlexContainerSize(){return m7t(this)}_repositionOnPcb(e){return _7t(this,e)}doInitialSilkscreenOverlapAdjustment(){return b7t(this)}isRelativelyPositioned(){return this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0}},M7t=({boardAnchorPosition:n,boardAnchorAlignment:e,width:t,height:i})=>{let{x:r,y:s}=n,o=r,a=s;switch(e){case"top_left":o=r+t/2,a=s-i/2;break;case"top_right":o=r-t/2,a=s-i/2;break;case"bottom_left":o=r+t/2,a=s+i/2;break;case"bottom_right":o=r-t/2,a=s+i/2;break;case"top":o=r,a=s-i/2;break;case"bottom":o=r,a=s+i/2;break;case"left":o=r+t/2,a=s;break;case"right":o=r-t/2,a=s;break;case"center":default:break}return{x:o,y:a}},C7t=class{constructor(n,e={}){f(this,"input");f(this,"isRouting",!1);f(this,"solver");f(this,"eventHandlers",{complete:[],error:[],progress:[]});f(this,"cycleCount",0);f(this,"stepDelay");f(this,"timeoutId");this.input=n;let{capacityDepth:t,targetMinCapacity:i,stepDelay:r=0,useAssignableViaSolver:s=!1}=e,{AutoroutingPipelineSolver:o,AssignableViaAutoroutingPipelineSolver:a}=uN,c=s?a:o;this.solver=new c(n,{capacityDepth:t,targetMinCapacity:i,cacheProvider:null}),this.stepDelay=r}start(){this.isRouting||(this.isRouting=!0,this.cycleCount=0,this.runCycleAndQueueNextCycle())}runCycleAndQueueNextCycle(){if(this.isRouting)try{if(this.solver.solved||this.solver.failed){this.solver.failed?this.emitEvent({type:"error",error:new Y1(this.solver.error||"Routing failed")}):this.emitEvent({type:"complete",traces:this.solver.getOutputSimpleRouteJson().traces||[]}),this.isRouting=!1;return}let n=Date.now(),e=this.solver.iterations;for(;Date.now()-n<250&&!this.solver.failed&&!this.solver.solved;)this.solver.step();let t=(this.solver.iterations-e)/(Date.now()-n)*1e3;this.cycleCount++;let i=this.solver?.preview()||void 0,r=this.solver.progress;this.emitEvent({type:"progress",steps:this.cycleCount,iterationsPerSecond:t,progress:r,phase:this.solver.getCurrentPhase(),debugGraphics:i}),this.stepDelay>0?this.timeoutId=setTimeout(()=>this.runCycleAndQueueNextCycle(),this.stepDelay):this.timeoutId=setTimeout(()=>this.runCycleAndQueueNextCycle(),0)}catch(n){this.emitEvent({type:"error",error:n instanceof Error?new Y1(n.message):new Y1(String(n))}),this.isRouting=!1}}stop(){this.isRouting&&(this.isRouting=!1,this.timeoutId!==void 0&&(clearTimeout(this.timeoutId),this.timeoutId=void 0))}on(n,e){n==="complete"?this.eventHandlers.complete.push(e):n==="error"?this.eventHandlers.error.push(e):n==="progress"&&this.eventHandlers.progress.push(e)}emitEvent(n){if(n.type==="complete")for(let e of this.eventHandlers.complete)e(n);else if(n.type==="error")for(let e of this.eventHandlers.error)e(n);else if(n.type==="progress")for(let e of this.eventHandlers.progress)e(n)}solveSync(){if(this.solver.solve(),this.solver.failed)throw new Y1(this.solver.error||"Routing failed");return this.solver.getOutputSimpleRouteJson().traces||[]}},L9=class extends Me{constructor(){super(...arguments);f(this,"matchedPort",null)}get config(){return{componentName:"TraceHint",zodProps:rq}}doInitialPortMatching(){let{db:e}=this.root,{_parsedProps:t,parent:i}=this;if(!i)return;if(i.componentName==="Trace"){this.renderError(`Port inference inside trace is not yet supported (${this})`);return}if(!i)throw new Error("TraceHint has no parent");if(!t.for){this.renderError(`TraceHint has no for property (${this})`);return}let r=i.selectOne(t.for,{type:"port"});r||this.renderError(`${this} could not find port for selector "${t.for}"`),this.matchedPort=r,r.registerMatch(this)}getPcbRouteHints(){let{_parsedProps:e}=this,t=e.offset?[e.offset]:e.offsets;if(!t)return[];let i=this._computePcbGlobalTransformBeforeLayout();return t.map(r=>({...De(i,r),via:r.via,to_layer:r.to_layer,trace_width:r.trace_width}))}doInitialPcbTraceHintRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this;e.pcb_trace_hint.insert({pcb_component_id:this.matchedPort?.pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,route:this.getPcbRouteHints()})}},Dnt=({circuitJson:n,editEvents:e,manualEditsFile:t})=>{let i={...t,pcb_placements:[...t.pcb_placements??[]]};for(let r of e)if(r.edit_event_type==="edit_pcb_component_location"){let{pcb_component_id:s,new_center:o}=r,a=Ce(n).pcb_component.get(s);if(!a)continue;let c=Ce(n).source_component.get(a.source_component_id);if(!c)continue;let l=i.pcb_placements?.findIndex(p=>p.selector===c.name),u={selector:c.name,center:o,relative_to:"group_center"};l>=0?i.pcb_placements[l]=u:i.pcb_placements.push(u)}return i},jnt=({circuitJson:n,editEvents:e,manualEditsFile:t})=>{let i={...t,schematic_placements:[...t.schematic_placements??[]]};for(let r of e)if(r.edit_event_type==="edit_schematic_component_location"){let{schematic_component_id:s,new_center:o}=r,a=Ce(n).schematic_component.get(s);if(!a||!a.source_component_id)continue;let c=Ce(n).source_component.get(a.source_component_id);if(!c)continue;let l=i.schematic_placements?.findIndex(p=>p.selector===c.name),u={selector:c.name,center:o,relative_to:"group_center"};l>=0?i.schematic_placements[l]=u:i.schematic_placements.push(u)}return i},I7t=({circuitJson:n,editEvents:e,manualEditsFile:t})=>{let i=e.filter(o=>o.edit_event_type==="edit_schematic_component_location"),r=e.filter(o=>o.edit_event_type==="edit_pcb_component_location"),s=t;return i.length>0&&(s=jnt({circuitJson:n,editEvents:i,manualEditsFile:s})),r.length>0&&(s=Dnt({circuitJson:n,editEvents:r,manualEditsFile:s})),s},N7t=(n,e)=>{if(Ce(n).pcb_trace_hint.get(e.pcb_trace_hint_id))n=n.map(i=>i.pcb_trace_hint_id===e.pcb_trace_hint_id?{...i,route:e.route}:i);else{let i=Ce(n).pcb_port.get(e.pcb_port_id);n=n.filter(r=>!(r.type==="pcb_trace_hint"&&r.pcb_port_id===e.pcb_port_id)).concat([{type:"pcb_trace_hint",pcb_trace_hint_id:e.pcb_trace_hint_id,route:e.route,pcb_port_id:e.pcb_port_id,pcb_component_id:i?.pcb_component_id}])}return n},A7t=({circuitJson:n,editEvents:e})=>{n=JSON.parse(JSON.stringify(n));for(let t of e)if(t.edit_event_type==="edit_pcb_component_location"){let i=n.find(s=>s.type==="pcb_component"&&s.pcb_component_id===t.pcb_component_id);if((!i||i.center.x!==t.new_center.x||i.center.y!==t.new_center.y)&&t.original_center){let s=kn(t.new_center.x-t.original_center.x,t.new_center.y-t.original_center.y);n=n.map(o=>o.pcb_component_id!==t.pcb_component_id?o:L4(o,s))}}else t.edit_event_type==="edit_schematic_component_location"?n=n.map(i=>i.type==="schematic_component"&&i.schematic_component_id===t.schematic_component_id?{...i,center:t.new_center}:i):t.edit_event_type==="edit_pcb_trace_hint"&&(n=N7t(n,t));return n},Bnt=(n,e)=>{let t=n.source_group.list(),i=[],r=s=>{let o=t.filter(a=>a.parent_subcircuit_id===s);for(let a of o)a.subcircuit_id&&(i.push(a.subcircuit_id),r(a.subcircuit_id))};return r(e),i},T9=({db:n,circuitJson:e,subcircuit_id:t,minTraceWidth:i=.1})=>{if(!n&&e&&(n=Ce(e)),!n)throw new Error("db or circuitJson is required");let r=n.pcb_trace_hint.list(),s=t?new Set([t]):null;if(t){let C=Bnt(n,t);for(let M of C)s.add(M)}let o=(e??n.toArray()).filter(C=>!t||"subcircuit_id"in C&&s.has(C.subcircuit_id)),a=n.pcb_board.list()[0];n=Ce(o);let c=nr(o),l=Fnt([...n.pcb_component.list(),...n.pcb_smtpad.list(),...n.pcb_plated_hole.list(),...n.pcb_hole.list(),...n.pcb_via.list(),...n.pcb_cutout.list()].filter(C=>!t||s?.has(C.subcircuit_id)),c);for(let C of l){let M=C.connectedTo.flatMap(A=>c.getIdsConnectedToNet(A));C.connectedTo.push(...M)}let u=l.flatMap(C=>[{x:C.center.x-C.width/2,y:C.center.y-C.height/2},{x:C.center.x+C.width/2,y:C.center.y+C.height/2}]).concat(a?.outline??[]),p;if(a&&!a.outline?p={minX:a.center.x-a.width/2,maxX:a.center.x+a.width/2,minY:a.center.y-a.height/2,maxY:a.center.y+a.height/2}:p={minX:Math.min(...u.map(C=>C.x))-1,maxX:Math.max(...u.map(C=>C.x))+1,minY:Math.min(...u.map(C=>C.y))-1,maxY:Math.max(...u.map(C=>C.y))+1},t){let C=n.pcb_group.getWhere({subcircuit_id:t});if(C?.width&&C.height){let M={minX:C.center.x-C.width/2,maxX:C.center.x+C.width/2,minY:C.center.y-C.height/2,maxY:C.center.y+C.height/2};p={minX:Math.min(p.minX,M.minX),maxX:Math.max(p.maxX,M.maxX),minY:Math.min(p.minY,M.minY),maxY:Math.max(p.maxY,M.maxY)}}}let d=new Set(n.pcb_trace.list().map(C=>C.source_trace_id).filter(C=>!!C)),_=n.source_trace.list().filter(C=>!d.has(C.source_trace_id)).map(C=>{let M=C.connected_source_port_ids.map(W=>{let J=n.source_port.get(W),nt=n.pcb_port.getWhere({source_port_id:W});return{...J,...nt}});if(M.length<2)return null;let[A,R]=M;if(A.x===void 0||A.y===void 0)return console.error(`(source_port_id: ${A.source_port_id}) for trace ${C.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;if(R.x===void 0||R.y===void 0)return console.error(`(source_port_id: ${R.source_port_id}) for trace ${C.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;let B=A.layers?.[0]??"top",D=R.layers?.[0]??"top",U=r.filter(W=>W.pcb_port_id===A.pcb_port_id||W.pcb_port_id===R.pcb_port_id),X=[];for(let W of U){let nt=n.pcb_port.get(W.pcb_port_id)?.layers?.[0]??"top";for(let ft of W.route)X.push({x:ft.x,y:ft.y,layer:nt})}return{name:C.source_trace_id??c.getNetConnectedToId(C.source_trace_id)??"",source_trace_id:C.source_trace_id,width:C.min_trace_thickness,pointsToConnect:[{x:A.x,y:A.y,layer:B,pointId:A.pcb_port_id,pcb_port_id:A.pcb_port_id},...X,{x:R.x,y:R.y,layer:D,pointId:R.pcb_port_id,pcb_port_id:R.pcb_port_id}]}}).filter(C=>C!==null),g=new Map(_.map(C=>[C.source_trace_id,C])),x=n.source_net.list().filter(C=>!t||s?.has(C.subcircuit_id)),v=[];for(let C of x){let M=n.source_trace.list().filter(A=>A.connected_source_net_ids?.includes(C.source_net_id));v.push({name:C.source_net_id??c.getNetConnectedToId(C.source_net_id),pointsToConnect:M.flatMap(A=>n.pcb_port.list().filter(B=>A.connected_source_port_ids.includes(B.source_port_id)).map(B=>({x:B.x,y:B.y,layer:B.layers?.[0]??"top",pointId:B.pcb_port_id,pcb_port_id:B.pcb_port_id})))})}let S=n.pcb_breakout_point.list().filter(C=>!t||s?.has(C.subcircuit_id)),P=[],T=new Map;for(let C of S){let M={x:C.x,y:C.y,layer:"top"};if(C.source_trace_id){let A=g.get(C.source_trace_id)??T.get(C.source_trace_id);if(A)A.pointsToConnect.push(M);else{let R={name:C.source_trace_id,source_trace_id:C.source_trace_id,pointsToConnect:[M]};P.push(R),T.set(C.source_trace_id,R)}}else if(C.source_net_id){let A=v.find(R=>R.name===C.source_net_id);A?A.pointsToConnect.push(M):P.push({name:C.source_net_id,pointsToConnect:[M]})}else if(C.source_port_id){let A=n.pcb_port.getWhere({source_port_id:C.source_port_id});A&&P.push({name:C.source_port_id,source_trace_id:void 0,pointsToConnect:[{x:A.x,y:A.y,layer:A.layers?.[0]??"top",pointId:A.pcb_port_id,pcb_port_id:A.pcb_port_id},M]})}}let k=[..._,...v,...P],N=new Map;for(let C of k)for(let M of C.pointsToConnect)M.pointId&&N.set(M.pointId,C);let E=n.pcb_trace.list().filter(C=>!t||s?.has(C.subcircuit_id));for(let C of E){let M=new Set;for(let B of C.route)B.start_pcb_port_id&&M.add(B.start_pcb_port_id),B.end_pcb_port_id&&M.add(B.end_pcb_port_id);if(M.size<2)continue;let A=M.values().next().value;if(!A)continue;let R=N.get(A);R&&[...M].every(B=>N.get(B)===R)&&(R.externallyConnectedPointIds??(R.externallyConnectedPointIds=[]),R.externallyConnectedPointIds.push([...M]))}return{simpleRouteJson:{bounds:p,obstacles:l,connections:k,layerCount:a?.num_layers??2,minTraceWidth:i,outline:a?.outline?.map(C=>({...C}))},connMap:c}},R7t=n=>{let e={};if(!n)return e;for(let i of Ga)e[i]=0;let t=new Map;for(let i of n){let[,,r,s]=i.type.split(":");if(s==="start"){t.set(`${r}:${i.renderId}`,i);continue}if(s==="end"){let o=t.get(`${r}:${i.renderId}`);if(o){let a=i.createdAt-o.createdAt;e[r]=(e[r]||0)+a}}}return e},O7t=n=>{let e=n.map(c=>[...new Set(c)]),t=e.map(()=>[]),i=e.map(()=>null);for(let c=0;c<e.length;c++)for(let l of e[c])if(/^\d+$/.test(l)){i[c]=Number.parseInt(l);break}let r=0,s=new Set;for(let c=0;c<i.length;c++){let l=i[c];if(l===null||l<1)continue;if(!s.has(l)){s.add(l),t[c].push(`pin${l}`),r=Math.max(r,l);continue}let u=0;for(let p of t[c])p.startsWith(`pin${l}_alt`)&&u++;t[c].push(`pin${l}_alt${u+1}`)}for(let c=0;c<t.length;c++)t[c][0]?.includes("_alt")&&(r++,t[c].unshift(`pin${r}`));for(let c=0;c<t.length;c++)t[c].length===0&&(r++,t[c].push(`pin${r}`));let o={};for(let c of e)for(let l of c)/^\d+$/.test(l)||(o[l]=(o[l]??0)+1);let a={};for(let c=0;c<e.length;c++){let l=e[c];for(let u of l)/^\d+$/.test(u)||(o[u]===1?t[c].push(u):(a[u]=(a[u]??0)+1,t[c].push(`${u}${a[u]}`)))}return t};function F9({db:n,schematicComponentId:e,deltaX:t,deltaY:i}){let r=n.schematic_rect.list({schematic_component_id:e});for(let c of r)c.center.x+=t,c.center.y+=i;let s=n.schematic_line.list({schematic_component_id:e});for(let c of s)c.x1+=t,c.y1+=i,c.x2+=t,c.y2+=i;let o=n.schematic_circle.list({schematic_component_id:e});for(let c of o)c.center.x+=t,c.center.y+=i;let a=n.schematic_arc.list({schematic_component_id:e});for(let c of a)c.center.x+=t,c.center.y+=i}var nnt=(0,Ynt.default)("Group_doInitialSchematicLayoutMatchAdapt");function L7t(n){let{db:e}=n.root,t=zg(e.toArray(),{source_group_id:n.source_group_id}),i=pN(t);nnt.enabled&&global?.debugGraphics&&global.debugGraphics?.push(ll(i,{title:`floatingBpcGraph-${n.name}`}));let r=pN(t),s={boxes:r.boxes,pins:r.pins.map(c=>({...c,color:c.color.replace("not_connected","normal")}))},{result:o}=kJ([{variantName:"default",floatingGraph:r},{variantName:"noNotConnected",floatingGraph:s}],{singletonKeys:["vcc/2","gnd/2"],centerPinColors:["netlabel_center","component_center"],floatingBoxIdsWithMutablePinOffsets:new Set(r.boxes.filter(c=>r.pins.filter(p=>p.boxId===c.boxId).filter(p=>!p.color.includes("center")).length<=2).map(c=>c.boxId)),corpus:{}});nnt.enabled&&global?.debugGraphics&&global.debugGraphics?.push(ll(o,{title:`laidOutBpcGraph-${n.name}`}));let a=n._getGlobalSchematicPositionBeforeLayout();for(let c of o.boxes){if(!c.center)continue;let l=e.schematic_component.get(c.boxId);if(l){let p={x:c.center.x+a.x,y:c.center.y+a.y},d=e.schematic_port.list({schematic_component_id:l.schematic_component_id}),_=e.schematic_text.list({schematic_component_id:l.schematic_component_id}),g={x:p.x-l.center.x,y:p.y-l.center.y};for(let x of d)x.center.x+=g.x,x.center.y+=g.y;for(let x of _)x.position.x+=g.x,x.position.y+=g.y;F9({db:e,schematicComponentId:l.schematic_component_id,deltaX:g.x,deltaY:g.y}),l.center=p;continue}let u=e.schematic_net_label.get(c.boxId);if(u){let p=o.pins.find(_=>_.boxId===c.boxId&&_.color==="netlabel_center");if(!p)throw new Error(`No pin found for net label: ${c.boxId}`);let d={x:c.center.x+a.x,y:c.center.y+a.y};u.center=d,u.anchor_position={x:d.x+p.offset.x,y:d.y+p.offset.y};continue}console.error(`No schematic element found for box: ${c.boxId}. This is a bug in the matchAdapt binding with @tscircuit/core`)}}var be=(0,Xnt.default)("Group_doInitialSchematicLayoutMatchpack");function int(n){switch(n){case"up":return"y+";case"down":return"y-";case"left":return"x-";case"right":return"x+";default:return"y+"}}function rnt(n,e){let t=["right","up","left","down"],i=t.indexOf(n);if(i===-1)return n;let r=Math.round(e/90),s=(i+r)%4;return t[s<0?s+4:s]}function F7t(n,e,t){let i={chipMap:{},chipPinMap:{},netMap:{},pinStrongConnMap:{},netConnMap:{},chipGap:.6,decouplingCapsGap:.4,partitionGap:1.2};be(`[${t.name}] Processing ${n.childNodes.length} child nodes for input problem`),n.childNodes.forEach((s,o)=>{if(be(`[${t.name}] Processing child ${o}: nodeType=${s.nodeType}`),s.nodeType==="component"?be(`[${t.name}] - Component: ${s.sourceComponent?.name}`):s.nodeType==="group"&&be(`[${t.name}] - Group: ${s.sourceGroup?.name}`),s.nodeType==="component"&&s.sourceComponent){let a=s.sourceComponent.name||`chip_${o}`,c=e.schematic_component.getWhere({source_component_id:s.sourceComponent.source_component_id});if(!c)return;let l=t.children.find(P=>P.source_component_id===s.sourceComponent?.source_component_id),u=[0,90,180,270];l?._parsedProps?.schOrientation&&(u=[0]),l?._parsedProps?.schRotation!==void 0&&(u=[0]),l?._parsedProps?.facingDirection&&(u=[0]),l?._parsedProps?.schFacingDirection&&(u=[0]),l?.componentName==="Chip"&&(u=[0]);let p=l?._parsedProps?.schMarginLeft??l?._parsedProps?.schMarginX??0,d=l?._parsedProps?.schMarginRight??l?._parsedProps?.schMarginX??0,_=l?._parsedProps?.schMarginTop??l?._parsedProps?.schMarginY??0,g=l?._parsedProps?.schMarginBottom??l?._parsedProps?.schMarginY??0;l?.config.shouldRenderAsSchematicBox&&(_+=.4,g+=.4);let x=(d-p)/2,v=(_-g)/2;i.chipMap[a]={chipId:a,pins:[],size:{x:(c.size?.width||1)+p+d,y:(c.size?.height||1)+_+g},availableRotations:u};let S=e.schematic_port.list({schematic_component_id:c.schematic_component_id});for(let P of S){let T=e.source_port.get(P.source_port_id);if(!T)continue;let k=`${a}.${T.pin_number||T.name||P.schematic_port_id}`;i.chipMap[a].pins.push(k);let N=int(P.facing_direction);i.chipPinMap[k]={pinId:k,offset:{x:(P.center?.x||0)-(c.center.x||0)+x,y:(P.center?.y||0)-(c.center.y||0)+v},side:N}}}else if(s.nodeType==="group"&&s.sourceGroup){let a=s.sourceGroup.name||`group_${o}`;be(`[${t.name}] Processing nested group: ${a}`);let c=e.schematic_group?.getWhere?.({source_group_id:s.sourceGroup.source_group_id}),l=t.children.find(u=>u.source_group_id===s.sourceGroup?.source_group_id);if(be(`[${t.name}] Found schematic_group for ${a}:`,c),c){be(`[${t.name}] Treating group ${a} as composite chip`);let u=e.schematic_component.list({schematic_group_id:c.schematic_group_id});be(`[${t.name}] Group ${a} has ${u.length} components:`,u.map(A=>A.source_component_id));let p=1/0,d=-1/0,_=1/0,g=-1/0,x=!1;for(let A of u)if(A.center&&A.size){x=!0;let R=A.size.width/2,B=A.size.height/2;p=Math.min(p,A.center.x-R),d=Math.max(d,A.center.x+R),_=Math.min(_,A.center.y-B),g=Math.max(g,A.center.y+B)}let v=l?._parsedProps?.schMarginLeft??l?._parsedProps?.schMarginX??0,S=l?._parsedProps?.schMarginRight??l?._parsedProps?.schMarginX??0,P=l?._parsedProps?.schMarginTop??l?._parsedProps?.schMarginY??0,T=l?._parsedProps?.schMarginBottom??l?._parsedProps?.schMarginY??0,k=(S-v)/2,N=(P-T)/2,E=(x?d-p:2)+v+S,C=(x?g-_:2)+P+T;be(`[${t.name}] Group ${a} computed size: ${E} x ${C}`);let M=[];for(let A of u){let R=e.schematic_port.list({schematic_component_id:A.schematic_component_id});for(let B of R){let D=e.source_port.get(B.source_port_id);if(!D)continue;let U=`${a}.${D.pin_number||D.name||B.schematic_port_id}`;M.push(U);let X=c.center||{x:0,y:0},W=int(B.facing_direction);i.chipPinMap[U]={pinId:U,offset:{x:(B.center?.x||0)-X.x+k,y:(B.center?.y||0)-X.y+N},side:W}}}be(`[${t.name}] Group ${a} has ${M.length} pins:`,M),i.chipMap[a]={chipId:a,pins:M,size:{x:E,y:C}},be(`[${t.name}] Added group ${a} to chipMap`)}else be(`[${t.name}] Warning: No schematic_group found for group ${a}`)}}),be(`[${t.name}] Creating connections using connectivity keys`);let r=new Map;for(let[s,o]of Object.entries(i.chipMap))for(let a of o.pins){let c=a.split(".").pop(),l=n.childNodes.find(u=>u.nodeType==="component"&&u.sourceComponent?u.sourceComponent.name===s:u.nodeType==="group"&&u.sourceGroup?`group_${n.childNodes.indexOf(u)}`===s:!1);if(l?.nodeType==="group"&&l.sourceGroup){let u=e.schematic_group?.getWhere?.({source_group_id:l.sourceGroup.source_group_id});if(u){let p=e.schematic_component.list({schematic_group_id:u.schematic_group_id});for(let d of p){let _=e.source_port.list({source_component_id:d.source_component_id});for(let g of _){let x=g.pin_number||g.name;if(String(x)===String(c))if(g.subcircuit_connectivity_map_key){let v=g.subcircuit_connectivity_map_key;r.has(v)||r.set(v,[]),r.get(v).push(a),be(`[${t.name}] \u2713 Pin ${a} has connectivity key: ${v}`)}else be(`[${t.name}] Pin ${a} has no connectivity key`)}}}}else if(l?.nodeType==="component"&&l.sourceComponent){let u=e.source_port.list({source_component_id:l.sourceComponent.source_component_id});for(let p of u){let d=p.pin_number||p.name;if(String(d)===String(c)&&p.subcircuit_connectivity_map_key){let _=p.subcircuit_connectivity_map_key;r.has(_)||r.set(_,[]),r.get(_).push(a),be(`[${t.name}] Pin ${a} has connectivity key: ${_}`)}}}}be(`[${t.name}] Found ${r.size} connectivity groups:`,Array.from(r.entries()).map(([s,o])=>({key:s,pins:o})));for(let[s,o]of r)if(o.length>=2){let a=e.source_trace.list().filter(u=>u.subcircuit_connectivity_map_key===s),c=a.some(u=>u.connected_source_net_ids&&u.connected_source_net_ids.length>0),l=a.some(u=>u.connected_source_port_ids&&u.connected_source_port_ids.length>=2);if(be(`[${t.name}] Connectivity ${s}: hasNetConnections=${c}, hasDirectConnections=${l}`),l){for(let u of a)if(u.connected_source_port_ids&&u.connected_source_port_ids.length>=2){let p=[];for(let d of u.connected_source_port_ids)for(let _ of o){let g=_.split(".").pop(),x=e.source_port.get(d);if(x&&String(x.pin_number||x.name)===String(g)){let v=_.split(".")[0],S=n.childNodes.find(P=>P.nodeType==="component"&&P.sourceComponent?P.sourceComponent.name===v:P.nodeType==="group"&&P.sourceGroup?`group_${n.childNodes.indexOf(P)}`===v:!1);S?.nodeType==="component"&&S.sourceComponent&&e.source_port.list({source_component_id:S.sourceComponent.source_component_id}).some(T=>T.source_port_id===d)&&p.push(_)}}for(let d=0;d<p.length;d++)for(let _=d+1;_<p.length;_++){let g=p[d],x=p[_];i.pinStrongConnMap[`${g}-${x}`]=!0,i.pinStrongConnMap[`${x}-${g}`]=!0,be(`[${t.name}] Created strong connection: ${g} <-> ${x}`)}}}if(c){let u=e.source_net.getWhere({subcircuit_connectivity_map_key:s}),p=u?.is_ground??!1,d=u?.is_power??!1;i.netMap[s]={netId:s,isGround:p,isPositiveVoltageSource:d};for(let _ of o)i.netConnMap[`${_}-${s}`]=!0;be(`[${t.name}] Created net ${s} with ${o.length} pins:`,o)}}return i}function $7t(n){let{db:e}=n.root,t=l_(e.toArray(),{source_group_id:n.source_group_id});if(be(`[${n.name}] Starting matchpack layout with ${t.childNodes.length} children`),be(`[${n.name}] Tree structure:`,JSON.stringify(t,null,2)),t.childNodes.length<=1){be(`[${n.name}] Only ${t.childNodes.length} children, skipping layout`);return}be("Converting circuit tree to InputProblem...");let i=F7t(t,e,n);be.enabled&&n.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`matchpack-input-problem-${n.name}`,content:JSON.stringify(i,null,2)});let r=new RQ(i);if(be("Starting LayoutPipelineSolver..."),be.enabled&&global?.debugGraphics){let c=r.visualize();global.debugGraphics.push({...c,title:`matchpack-initial-${n.name}`})}if(r.solve(),be(`Solver completed in ${r.iterations} iterations`),be(`Solved: ${r.solved}, Failed: ${r.failed}`),r.failed)throw be(`Solver failed with error: ${r.error}`),new Error(`Matchpack layout solver failed: ${r.error}`);let s=r.getOutputLayout();if(be("OutputLayout:",JSON.stringify(s,null,2)),be("Solver completed successfully:",!r.failed),be.enabled&&global?.debugGraphics){let c=r.visualize();global.debugGraphics.push({...c,title:`matchpack-final-${n.name}`})}let o=r.checkForOverlaps(s);if(o.length>0){be(`Warning: Found ${o.length} overlapping components:`);for(let c of o)be(` ${c.chip1} overlaps ${c.chip2} (area: ${c.overlapArea})`)}let a=n._getGlobalSchematicPositionBeforeLayout();be(`Group offset: x=${a.x}, y=${a.y}`),be(`Applying layout results for ${Object.keys(s.chipPlacements).length} chip placements`);for(let[c,l]of Object.entries(s.chipPlacements)){be(`Processing placement for chip: ${c} at (${l.x}, ${l.y})`);let u=t.childNodes.find(d=>{if(d.nodeType==="component"&&d.sourceComponent){let _=d.sourceComponent.name===c;return be(` Checking component ${d.sourceComponent.name}: matches=${_}`),_}if(d.nodeType==="group"&&d.sourceGroup){let _=d.sourceGroup.name,g=`group_${t.childNodes.indexOf(d)}`,x=g===c;return be(` Checking group ${_} (expected chipId: ${g}): matches=${x}`),x}return!1});if(!u){be(`Warning: No tree node found for chip: ${c}`),be("Available tree nodes:",t.childNodes.map((d,_)=>({type:d.nodeType,name:d.nodeType==="component"?d.sourceComponent?.name:d.sourceGroup?.name,expectedChipId:d.nodeType==="group"?`group_${_}`:d.sourceComponent?.name})));continue}let p={x:l.x+a.x,y:l.y+a.y};if(u.nodeType==="component"&&u.sourceComponent){let d=e.schematic_component.getWhere({source_component_id:u.sourceComponent.source_component_id});if(d){be(`Moving component ${c} to (${p.x}, ${p.y})`);let _=e.schematic_port.list({schematic_component_id:d.schematic_component_id}),g=e.schematic_text.list({schematic_component_id:d.schematic_component_id}),x={x:p.x-d.center.x,y:p.y-d.center.y};for(let v of _)v.center.x+=x.x,v.center.y+=x.y;for(let v of g)v.position.x+=x.x,v.position.y+=x.y;if(F9({db:e,schematicComponentId:d.schematic_component_id,deltaX:x.x,deltaY:x.y}),d.center=p,l.ccwRotationDegrees!==0){be(`Component ${c} has rotation: ${l.ccwRotationDegrees}\xB0`);let v=l.ccwRotationDegrees*Math.PI/180,S=Math.cos(v),P=Math.sin(v);for(let T of _){let k=T.center.x-p.x,N=T.center.y-p.y,E=k*S-N*P,C=k*P+N*S;T.center.x=p.x+E,T.center.y=p.y+C;let M=T.facing_direction||"right";T.facing_direction=rnt(M,l.ccwRotationDegrees),T.side_of_component=(T.facing_direction==="up"?"top":T.facing_direction==="down"?"bottom":T.facing_direction)||T.side_of_component}for(let T of g){let k=T.position.x-p.x,N=T.position.y-p.y,E=k*S-N*P,C=k*P+N*S;T.position.x=p.x+E,T.position.y=p.y+C}if(d.symbol_name){let T=d.symbol_name.match(/_(right|left|up|down)$/);T&&(d.symbol_name=d.symbol_name.replace(T[0],`_${rnt(T[1],l.ccwRotationDegrees)}`))}}}}else if(u.nodeType==="group"&&u.sourceGroup){let d=e.schematic_group?.getWhere?.({source_group_id:u.sourceGroup.source_group_id});if(d){be(`Moving group ${c} to (${p.x}, ${p.y}) from (${d.center?.x}, ${d.center?.y})`);let _=e.schematic_component.list({schematic_group_id:d.schematic_group_id});be(`Group ${c} has ${_.length} components to move`);let g=d.center||{x:0,y:0},x={x:p.x-g.x,y:p.y-g.y};be(`Position delta for group ${c}: (${x.x}, ${x.y})`);for(let v of _)if(v.center){let S={...v.center};v.center.x+=x.x,v.center.y+=x.y,be(`Moved component ${v.source_component_id} from (${S.x}, ${S.y}) to (${v.center.x}, ${v.center.y})`);let P=e.schematic_port.list({schematic_component_id:v.schematic_component_id}),T=e.schematic_text.list({schematic_component_id:v.schematic_component_id});for(let k of P)k.center&&(k.center.x+=x.x,k.center.y+=x.y);for(let k of T)k.position&&(k.position.x+=x.x,k.position.y+=x.y)}d.center=p,be(`Updated group ${c} center to (${p.x}, ${p.y})`)}}}be("Matchpack layout completed successfully")}function z7t(n){if(!n.isSubcircuit)return;let{db:e}=n.root,t=n.selectAll("trace"),i=n.selectAll("via"),r=n.selectAll("net"),s=new e_({});s.addConnections(t.map(u=>{let p=e.source_trace.get(u.source_trace_id);return p?[p.source_trace_id,...p.connected_source_port_ids,...p.connected_source_net_ids]:null}).filter(u=>u!==null));let o=e.source_net.list().filter(u=>u.subcircuit_id===n.subcircuit_id);for(let u of o)s.addConnections([[u.source_net_id]]);let{name:a}=n._parsedProps;for(let u of t){if(!u.source_trace_id)continue;let p=s.getNetConnectedToId(u.source_trace_id);p&&(u.subcircuit_connectivity_map_key=`${a??`unnamedsubcircuit${n._renderId}`}_${p}`,e.source_trace.update(u.source_trace_id,{subcircuit_connectivity_map_key:u.subcircuit_connectivity_map_key}))}let c=new Set;for(let u of t){if(!u.source_trace_id)continue;let p=e.source_trace.get(u.source_trace_id);if(p)for(let d of p.connected_source_port_ids)c.add(d)}for(let u of c){let p=s.getNetConnectedToId(u);if(!p)continue;let d=`${a??`unnamedsubcircuit${n._renderId}`}_${p}`;e.source_port.update(u,{subcircuit_connectivity_map_key:d})}let l=new Set;for(let u of t){if(!u.source_trace_id)continue;let p=e.source_trace.get(u.source_trace_id);if(p)for(let d of p.connected_source_net_ids)l.add(d)}for(let u of o)l.add(u.source_net_id);for(let u of l){let p=s.getNetConnectedToId(u);if(!p)continue;let d=`${a??`unnamedsubcircuit${n._renderId}`}_${p}`;e.source_net.update(u,{subcircuit_connectivity_map_key:d});let _=r.find(g=>g.source_net_id===u);_&&(_.subcircuit_connectivity_map_key=d)}for(let u of i){let p=u._getConnectedNetOrTrace();p&&p.subcircuit_connectivity_map_key&&(u.subcircuit_connectivity_map_key=p.subcircuit_connectivity_map_key)}}function D7t(n){let{db:e}=n.root,t=n._parsedProps,i=n.children.filter(N=>{let E=N._parsedProps?.schX!==void 0||N._parsedProps?.schY!==void 0;return N.schematic_component_id&&!E});if(i.length===0)return;let r=0,s=0;for(let N of i){let E=e.schematic_component.get(N.schematic_component_id);E?.size&&(r=Math.max(r,E.size.width),s=Math.max(s,E.size.height))}r===0&&i.length>0&&(r=1),s===0&&i.length>0&&(s=1);let o=t.gridCols,a,c=t.gridGap,l=t.gridRowGap,u=t.gridColumnGap;t.schLayout?.grid&&(o=t.schLayout.grid.cols??o,a=t.schLayout.grid.rows,c=t.schLayout.gridGap??c,l=t.schLayout.gridRowGap??l,u=t.schLayout.gridColumnGap??u);let p,d;o!==void 0&&a!==void 0?(p=o,d=a):o!==void 0?(p=o,d=Math.ceil(i.length/p)):a!==void 0?(d=a,p=Math.ceil(i.length/d)):(p=Math.ceil(Math.sqrt(i.length)),d=Math.ceil(i.length/p)),p===0&&i.length>0&&(p=1),d===0&&i.length>0&&(d=i.length);let _,g,x=N=>{if(N!==void 0)return typeof N=="number"?N:j.parse(N)};if(l!==void 0||u!==void 0){let N=typeof c=="object"&&c!==null?c.x:c,E=typeof c=="object"&&c!==null?c.y:c;_=x(u??N)??1,g=x(l??E)??1}else if(typeof c=="number")_=c,g=c;else if(typeof c=="string"){let N=j.parse(c);_=N,g=N}else if(typeof c=="object"&&c!==null){let N=c.x,E=c.y;_=typeof N=="number"?N:j.parse(N??"0mm"),g=typeof E=="number"?E:j.parse(E??"0mm")}else _=1,g=1;let v=p*r+Math.max(0,p-1)*_,S=d*s+Math.max(0,d-1)*g,P=n._getGlobalSchematicPositionBeforeLayout(),T=P.x-v/2+r/2,k=P.y+S/2-s/2;for(let N=0;N<i.length;N++){let E=i[N];if(!E.schematic_component_id)continue;let C=Math.floor(N/p),M=N%p;if(C>=d||M>=p){console.warn(`Schematic grid layout: Child ${E.getString()} at index ${N} (row ${C}, col ${M}) exceeds specified grid dimensions (${d}x${p}). Skipping placement.`);continue}let A=T+M*(r+_),R=k-C*(s+g),B=e.schematic_component.get(E.schematic_component_id);if(B){let D=B.center,U={x:A,y:R};e.schematic_component.update(E.schematic_component_id,{center:U});let X=U.x-D.x,W=U.y-D.y,J=e.schematic_port.list({schematic_component_id:E.schematic_component_id});for(let ft of J)e.schematic_port.update(ft.schematic_port_id,{center:{x:ft.center.x+X,y:ft.center.y+W}});let nt=e.schematic_text.list({schematic_component_id:E.schematic_component_id});for(let ft of nt)e.schematic_text.update(ft.schematic_text_id,{position:{x:ft.position.x+X,y:ft.position.y+W}});F9({db:e,schematicComponentId:E.schematic_component_id,deltaX:X,deltaY:W})}}n.schematic_group_id&&e.schematic_group.update(n.schematic_group_id,{width:v,height:S,center:P})}var snt=(n,e)=>{let{sourceComponent:t,sourceGroup:i}=e;if(e.nodeType==="component"){let r=n.schematic_component.getWhere({source_component_id:t?.source_component_id});return r?.size?{width:r.size.width,height:r.size.height}:null}if(e.nodeType==="group"){let r=n.schematic_group.getWhere({source_group_id:i?.source_group_id});if(r?.width&&r?.height)return{width:r.width,height:r.height};let s=n.schematic_component.list({schematic_group_id:r?.schematic_group_id}),o=1/0,a=-1/0,c=1/0,l=-1/0;for(let d of s)if(d.center&&d.size){let _=d.size.width/2,g=d.size.height/2;o=Math.min(o,d.center.x-_),a=Math.max(a,d.center.x+_),c=Math.min(c,d.center.y-g),l=Math.max(l,d.center.y+g)}let u=a-o,p=l-c;return{width:u,height:p}}return null},j7t=n=>{let{db:e}=n.root,t=n._parsedProps,i=l_(e.toArray(),{source_group_id:n.source_group_id}),r=t.schJustifyContent??t.justifyContent,s=t.schAlignItems??t.alignItems,o=t.schFlexGap??t.schGap??t.gap,a=t.schFlexDirection??"row",c={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"space-between","space-between":"space-between","space-around":"space-around","space-evenly":"space-evenly",center:"center"}[r??"space-between"],l={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"stretch",center:"center"}[s??"center"];if(!c)throw new Error(`Invalid justifyContent value: "${r}"`);if(!l)throw new Error(`Invalid alignItems value: "${s}"`);let u=0,p=0;typeof o=="object"?(u=o.y??0,p=o.x??0):typeof o=="number"?(u=o,p=o):typeof o=="string"&&(u=j.parse(o),p=j.parse(o));let d,_=t.width??t.schWidth??void 0,g=t.height??t.schHeight??void 0;(_===void 0||g===void 0)&&(d=$w(i.childNodes.map(k=>snt(e,k)).filter(k=>k!==null),{alignItems:l,justifyContent:c,direction:a,rowGap:u,columnGap:p}),_=d.width,g=d.height);let v=new jS(_,g,{alignItems:l,justifyContent:c,direction:a,rowGap:u,columnGap:p});for(let k of i.childNodes){let N=snt(e,k);v.addChild({metadata:k,width:N?.width??0,height:N?.height??0,flexBasis:N?a==="row"?N.width:N.height:void 0})}v.build();let S={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,width:0,height:0};for(let k of v.children)S.minX=Math.min(S.minX,k.position.x),S.minY=Math.min(S.minY,k.position.y),S.maxX=Math.max(S.maxX,k.position.x+k.size.width),S.maxY=Math.max(S.maxY,k.position.y+k.size.height);S.width=S.maxX-S.minX,S.height=S.maxY-S.minY;let P={x:-(S.maxX+S.minX)/2,y:-(S.maxY+S.minY)/2},T=e.toArray();for(let k of v.children){let{sourceComponent:N,sourceGroup:E}=k.metadata;if(N){let C=e.schematic_component.getWhere({source_component_id:N.source_component_id});if(!C)continue;Fq(T,C.schematic_component_id,{x:k.position.x+k.size.width/2+P.x,y:k.position.y+k.size.height/2+P.y})}if(E){if(!e.schematic_group.getWhere({source_group_id:E.source_group_id}))continue;zq(T,E.source_group_id,{x:k.position.x+k.size.width/2+P.x,y:k.position.y+k.size.height/2+P.y})}}n.schematic_group_id&&e.schematic_group.update(n.schematic_group_id,{width:S.width,height:S.height})},f9=1;function B7t(n){let{db:e}=n.root,t=n._parsedProps,i=Y7t(n);if(i.length===0)return;let r=X7t({db:e,pcbChildren:i}),s=U7t(t),o=V7t({props:t,pcbChildren:i,childDimensions:r,gridConfig:s}),a=H7t({pcbChildren:i,childDimensions:r,gridLayout:o,gridConfig:s}),{itemCoordinates:c}=a.layout();q7t({db:e,group:n,pcbChildren:i,itemCoordinates:c,gridLayout:o}),Z7t({db:e,group:n,props:t,gridLayout:o})}function Y7t(n){return n.children.filter(e=>e.pcb_component_id||e.pcb_group_id)}function X7t(n){let{db:e,pcbChildren:t}=n,i=0,r=0;for(let s of t){let o=0,a=0;if(s.pcb_group_id){let c=e.pcb_group.get(s.pcb_group_id);o=c?.width??0,a=c?.height??0}else if(s.pcb_component_id){let c=e.pcb_component.get(s.pcb_component_id);o=c?.width??0,a=c?.height??0}i=Math.max(i,o),r=Math.max(r,a)}return{width:i,height:r}}function U7t(n){let e=n.pcbGridCols??n.gridCols??n.pcbLayout?.grid?.cols,t=n.pcbGridRows??n.pcbLayout?.grid?.rows,i=n.pcbGridTemplateColumns,r=n.pcbGridTemplateRows,s=p=>p===void 0?f9:typeof p=="number"?p:j.parse(p),o=n.pcbGridGap??n.gridGap??n.pcbLayout?.gridGap,a=n.pcbGridRowGap??n.gridRowGap??n.pcbLayout?.gridRowGap,c=n.pcbGridColumnGap??n.gridColumnGap??n.pcbLayout?.gridColumnGap,l=f9,u=f9;if(a!==void 0||c!==void 0){let p=typeof o=="object"?o?.x:o,d=typeof o=="object"?o?.y:o;l=s(c??p),u=s(a??d)}else if(typeof o=="object"&&o!==null)l=s(o.x),u=s(o.y);else{let p=s(o);l=p,u=p}return{cols:e,rows:t,gapX:l,gapY:u,templateColumns:i,templateRows:r}}function V7t(n){let{props:e,pcbChildren:t,childDimensions:i,gridConfig:r}=n;return e.pcbGridTemplateColumns||e.pcbGridTemplateRows?G7t({props:e,gridConfig:r,pcbChildren:t,childDimensions:i}):W7t({gridConfig:r,pcbChildren:t,childDimensions:i})}function G7t(n){let{props:e,gridConfig:t,pcbChildren:i,childDimensions:r}=n,s=e.pcbGridTemplateColumns??"",o=e.pcbGridTemplateRows??"",a=d=>{let _=d.match(/repeat\((\d+),/);return _?parseInt(_[1]):Math.ceil(Math.sqrt(i.length))},c=e.pcbGridTemplateColumns?a(s):Math.ceil(Math.sqrt(i.length)),l=e.pcbGridTemplateRows?a(o):Math.ceil(i.length/c),u=c*r.width+Math.max(0,c-1)*t.gapX,p=l*r.height+Math.max(0,l-1)*t.gapY;return{gridTemplateColumns:s,gridTemplateRows:o,containerWidth:u,containerHeight:p}}function W7t(n){let{gridConfig:e,pcbChildren:t,childDimensions:i}=n,r,s;e.cols!==void 0&&e.rows!==void 0?(r=e.cols,s=e.rows):e.cols!==void 0?(r=e.cols,s=Math.ceil(t.length/r)):e.rows!==void 0?(s=e.rows,r=Math.ceil(t.length/s)):(r=Math.ceil(Math.sqrt(t.length)),s=Math.ceil(t.length/r)),r=Math.max(1,r),s=Math.max(1,s);let o=r*i.width+Math.max(0,r-1)*e.gapX,a=s*i.height+Math.max(0,s-1)*e.gapY,c=`repeat(${r}, ${i.width}px)`,l=`repeat(${s}, ${i.height}px)`;return{gridTemplateColumns:c,gridTemplateRows:l,containerWidth:o,containerHeight:a}}function H7t(n){let{pcbChildren:e,childDimensions:t,gridLayout:i,gridConfig:r}=n,s=e.map((o,a)=>({key:o.getString()||`child-${a}`,contentWidth:t.width,contentHeight:t.height}));return new YQ({containerWidth:i.containerWidth,containerHeight:i.containerHeight,gridTemplateColumns:i.gridTemplateColumns,gridTemplateRows:i.gridTemplateRows,gap:[r.gapY,r.gapX],children:s})}function q7t(n){let{db:e,group:t,pcbChildren:i,itemCoordinates:r,gridLayout:s}=n,o=t._getGlobalPcbPositionBeforeLayout(),a=e.toArray();for(let c=0;c<i.length;c++){let l=i[c],u=l.getString()||`child-${c}`,p=r[u];if(!p){console.warn(`PCB grid layout: No coordinates found for child ${u}`);continue}let d=o.x-s.containerWidth/2+p.x+p.width/2,_=o.y+s.containerHeight/2-p.y-p.height/2;if(l.pcb_component_id)Lw(a,l.pcb_component_id,{x:d,y:_});else{let g=l;g.pcb_group_id&&g.source_group_id&&Fw(a,g.source_group_id,{x:d,y:_})}}}function Z7t(n){let{db:e,group:t,props:i,gridLayout:r}=n;if(t.pcb_group_id){let s=t._getGlobalPcbPositionBeforeLayout();e.pcb_group.update(t.pcb_group_id,{width:i.width??r.containerWidth,height:i.height??r.containerHeight,center:s})}}function K7t(n){let e={serverUrl:"https://registry-api.tscircuit.com",serverMode:"job",serverCacheEnabled:!0};if(typeof n=="object"&&!n.preset)return{local:!(n.serverUrl||n.serverMode||n.serverCacheEnabled),...e,...n};let t=typeof n=="object"?n.preset:n,i=typeof n=="object"?n:{};switch(typeof t=="string"?t.replace(/_/g,"-"):t){case"auto-local":return{local:!0,groupMode:"subcircuit"};case"sequential-trace":return{local:!0,groupMode:"sequential-trace"};case"subcircuit":return{local:!0,groupMode:"subcircuit"};case"auto-cloud":{let{preset:s,local:o,groupMode:a,...c}=i;return{local:!1,groupMode:"subcircuit",...e,...c}}case"laser-prefab":{let{preset:s,local:o,groupMode:a,...c}=i;return{local:!0,groupMode:"subcircuit",preset:"laser_prefab",...c}}default:return{local:!0,groupMode:"subcircuit"}}}var J7t=(n,e)=>{let t=n.children.filter(p=>p.componentName==="Constraint"&&p._parsedProps.pcb),i=new Map,r={},s=p=>(r[p]!==p&&(r[p]=s(r[p])),r[p]),o=(p,d)=>{let _=s(p),g=s(d);_!==g&&(r[g]=_)},a=p=>{p in r||(r[p]=p)},c=p=>{let d=p.startsWith(".")?p.slice(1):p;return n.children.find(g=>g.name===d)?.pcb_component_id??void 0};for(let p of t){let d=p._parsedProps;if("left"in d&&"right"in d){let _=c(d.left),g=c(d.right);_&&g&&(a(_),a(g),o(_,g))}else if("top"in d&&"bottom"in d){let _=c(d.top),g=c(d.bottom);_&&g&&(a(_),a(g),o(_,g))}else if("for"in d&&Array.isArray(d.for)){let _=d.for.map(g=>c(g)).filter(g=>!!g);for(let g of _)a(g);for(let g=1;g<_.length;g++)o(_[0],_[g])}}for(let p of Object.keys(r)){let d=s(p);i.has(d)||i.set(d,{componentIds:[],constraints:[]}),i.get(d).componentIds.push(p)}for(let p of t){let d=p._parsedProps,_;if("left"in d?_=c(d.left):"top"in d?_=c(d.top):"for"in d&&(_=c(d.for[0])),!_)continue;let g=s(_);i.get(g)?.constraints.push(p)}let l={},u=Object.fromEntries(e.components.map(p=>[p.componentId,p]));for(let[p,d]of i.entries()){if(d.componentIds.length<=1)continue;let _=new o_,g={},x=(A,R)=>{let B=`${A}_${R}`;return g[B]||(g[B]=new Oa(B)),g[B]},v=d.componentIds[0];_.addConstraint(new Ti(x(v,"x"),ai.Eq,0,On.required)),_.addConstraint(new Ti(x(v,"y"),ai.Eq,0,On.required));for(let A of d.constraints){let R=A._parsedProps;if("xDist"in R){let B=c(R.left),D=c(R.right);B&&D&&_.addConstraint(new Ti(new Dn(x(D,"x"),[-1,x(B,"x")]),ai.Eq,R.xDist,On.required))}else if("yDist"in R){let B=c(R.top),D=c(R.bottom);B&&D&&_.addConstraint(new Ti(new Dn(x(B,"y"),[-1,x(D,"y")]),ai.Eq,R.yDist,On.required))}else if("sameX"in R&&Array.isArray(R.for)){let B=R.for.map(D=>c(D)).filter(D=>!!D);if(B.length>1){let D=x(B[0],"x");for(let U=1;U<B.length;U++)_.addConstraint(new Ti(new Dn(x(B[U],"x"),[-1,D]),ai.Eq,0,On.required))}}else if("sameY"in R&&Array.isArray(R.for)){let B=R.for.map(D=>c(D)).filter(D=>!!D);if(B.length>1){let D=x(B[0],"y");for(let U=1;U<B.length;U++)_.addConstraint(new Ti(new Dn(x(B[U],"y"),[-1,D]),ai.Eq,0,On.required))}}}_.updateVariables();let S={};for(let A of d.componentIds)S[A]={x:x(A,"x").value(),y:x(A,"y").value()};let P=1/0,T=1/0,k=-1/0,N=-1/0;for(let A of d.componentIds){let R=u[A],B=S[A];if(R)for(let D of R.pads){let U=B.x+D.offset.x,X=B.y+D.offset.y;P=Math.min(P,U-D.size.x/2),k=Math.max(k,U+D.size.x/2),T=Math.min(T,X-D.size.y/2),N=Math.max(N,X+D.size.y/2)}}let E={x:(P+k)/2,y:(T+N)/2},C=[],M={};for(let A of d.componentIds){let R=u[A],B=S[A];if(R){M[A]={x:B.x-E.x,y:B.y-E.y};for(let D of R.pads)C.push({padId:D.padId,networkId:D.networkId,type:D.type,size:D.size,offset:{x:B.x+D.offset.x-E.x,y:B.y+D.offset.y-E.y}})}}e.components=e.components.filter(A=>!d.componentIds.includes(A.componentId)),e.components.push({componentId:d.componentIds[0],pads:C,availableRotationDegrees:[0]}),d.relativeCenters=M,l[d.componentIds[0]]=d}return l},ont=({db:n,pcbComponentId:e,rotationDegrees:t,layer:i})=>{if(t==null||!n?.cad_component?.list)return;let r=n.cad_component.getWhere({pcb_component_id:e});if(!r)return;let s=i?.toLowerCase?.()==="bottom"?-t:t,o=r.rotation?.z??0,a={...r.rotation??{x:0,y:0,z:0},z:hd(o+s)};n.cad_component.update(r.cad_component_id,{rotation:a}),r.rotation=a},X1=(n,e,t)=>{if(e===t)return!0;let i=n.source_group.get(e);return!i||!i.parent_source_group_id?!1:X1(n,i.parent_source_group_id,t)},Q7t=(n,e,t)=>{let{db:i}=n.root;for(let r of e.components){let{center:s,componentId:o,ccwRotationOffset:a,ccwRotationDegrees:c}=r,l=t[o];if(l){let v=c??a??0,S=v*Math.PI/180;for(let P of l.componentIds){let T=l.relativeCenters[P];if(!T)continue;let k={x:T.x*Math.cos(S)-T.y*Math.sin(S),y:T.x*Math.sin(S)+T.y*Math.cos(S)},N=i.pcb_component.get(P);if(!N)continue;let E=N.center,C=ri(n._computePcbGlobalTransformBeforeLayout(),kn(s.x+k.x,s.y+k.y),Oo(S),kn(-E.x,-E.y)),M=i.toArray().filter(A=>"pcb_component_id"in A&&A.pcb_component_id===P);tl(M,C),ont({db:i,pcbComponentId:P,rotationDegrees:v,layer:N.layer})}continue}let u=i.pcb_component.get(o);if(u){let v=n.source_group_id,P=i.source_component.get(u.source_component_id)?.source_group_id;if(P!==void 0&&!X1(i,P,v))continue;let T=u.center,k=c??a??0,N=ri(n._computePcbGlobalTransformBeforeLayout(),kn(s.x,s.y),Oo(k*Math.PI/180),kn(-T.x,-T.y)),E=i.toArray().filter(C=>"pcb_component_id"in C&&C.pcb_component_id===o);tl(E,N),ont({db:i,pcbComponentId:o,rotationDegrees:k,layer:u.layer});continue}let p=i.pcb_group.list().find(v=>v.source_group_id===o);if(!p)continue;let d=p.center,_=c??a??0,g=ri(n._computePcbGlobalTransformBeforeLayout(),kn(s.x,s.y),Oo(_*Math.PI/180),kn(-d.x,-d.y)),x=i.toArray().filter(v=>{if("source_group_id"in v&&v.source_group_id&&(v.source_group_id===o||X1(i,v.source_group_id,o)))return!0;if("source_component_id"in v&&v.source_component_id){let S=i.source_component.get(v.source_component_id);if(S?.source_group_id&&(S.source_group_id===o||X1(i,S.source_group_id,o)))return!0}if("pcb_component_id"in v&&v.pcb_component_id){let S=i.pcb_component.get(v.pcb_component_id);if(S?.source_component_id){let P=i.source_component.get(S.source_component_id);if(P?.source_group_id&&(P.source_group_id===o||X1(i,P.source_group_id,o)))return!0}}return!1});tl(x,g),i.pcb_group.update(p.pcb_group_id,{center:s})}};function tFt(n){switch(n.shape){case"rect":case"rotated_rect":case"pill":case"rotated_pill":return{width:n.width,height:n.height};case"circle":return{width:n.radius*2,height:n.radius*2};case"polygon":if(!n.points||n.points.length===0)return null;let e=n.points.map(a=>a.x),t=n.points.map(a=>a.y),i=Math.min(...e),r=Math.max(...e),s=Math.min(...t),o=Math.max(...t);return{width:r-i,height:o-s};default:return null}}function eFt(n){switch(n.shape){case"circular_hole_with_rect_pad":case"pill_hole_with_rect_pad":case"rotated_pill_hole_with_rect_pad":return{width:n.rect_pad_width,height:n.rect_pad_height};case"circle":return{width:n.outer_diameter,height:n.outer_diameter};case"oval":return{width:n.outer_width,height:n.outer_height};case"pill":return{width:n.outer_width,height:n.outer_height};case"hole_with_polygon_pad":if(!("pad_outline"in n)||!n.pad_outline||n.pad_outline.length===0)return null;let e=n.pad_outline.map(a=>a.x),t=n.pad_outline.map(a=>a.y),i=Math.min(...e),r=Math.max(...e),s=Math.min(...t),o=Math.max(...t);return{width:r-i,height:o-s};default:return null}}var nFt="1mm",ant=(0,Unt.default)("Group_doInitialPcbLayoutPack"),iFt=n=>{let{db:e}=n.root,{_parsedProps:t}=n,{packOrderStrategy:i,packPlacementStrategy:r,gap:s,pcbGap:o,pcbPackGap:a}=t,c=a??o??s,l=j.parse(c??nFt),u={},p=new Set,d=k=>{if(k?.pcb_component_id&&k?._parsedProps){let N=k._parsedProps,E=j.parse(N.pcbMarginLeft??N.pcbMarginX??0),C=j.parse(N.pcbMarginRight??N.pcbMarginX??0),M=j.parse(N.pcbMarginTop??N.pcbMarginY??0),A=j.parse(N.pcbMarginBottom??N.pcbMarginY??0);(E||C||M||A)&&(u[k.pcb_component_id]={left:E,right:C,top:M,bottom:A})}k?.children&&k.children.forEach(d)};d(n);let _=new Set;for(let k of n.children){let N=k;N._isNormalComponent&&N.isRelativelyPositioned?.()&&(N.pcb_component_id&&p.add(N.pcb_component_id),N.pcb_group_id&&_.add(N.pcb_group_id))}let g=e.toArray().filter(k=>k.type==="pcb_component"?!p.has(k.pcb_component_id):k.type==="pcb_group"?!_.has(k.pcb_group_id):!0),x=[];for(let k of p){let N=e.toArray().find(R=>R.type==="pcb_component"&&R.pcb_component_id===k);if(!N)continue;let E=N.center.x,C=N.center.y,M=e.toArray().filter(R=>R.type==="pcb_smtpad"&&R.pcb_component_id===k);for(let R of M){let B=tFt(R);if(!B||B.width===0||B.height===0)continue;let D,U;if(R.shape==="polygon"){let X=R.points.map(J=>J.x),W=R.points.map(J=>J.y);D=E+(Math.min(...X)+Math.max(...X))/2,U=C+(Math.min(...W)+Math.max(...W))/2}else D=E+R.x,U=C+R.y;x.push({obstacleId:R.pcb_smtpad_id,absoluteCenter:{x:D,y:U},width:B.width,height:B.height})}let A=e.toArray().filter(R=>R.type==="pcb_plated_hole"&&R.pcb_component_id===k);for(let R of A){let B=eFt(R);if(!B||B.width===0||B.height===0)continue;let D=E+R.x,U=C+R.y;x.push({obstacleId:R.pcb_plated_hole_id,absoluteCenter:{x:D,y:U},width:B.width,height:B.height})}}let v;if(t.width!==void 0&&t.height!==void 0){let k=j.parse(t.width),N=j.parse(t.height);v={minX:-k/2,maxX:k/2,minY:-N/2,maxY:N/2}}let S={...NQ(IQ(g,{source_group_id:n.source_group_id,shouldAddInnerObstacles:!0,chipMarginsMap:u})),orderStrategy:i??"largest_to_smallest",placementStrategy:r??"minimum_sum_squared_distance_to_network",minGap:l,obstacles:x,bounds:v},P=J7t(n,S);ant.enabled&&(n.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-circuitjson-${n.name}`,content:JSON.stringify(e.toArray())}),n.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-${n.name}`,content:S}));let T=$S(S);if(ant.enabled&&global?.debugGraphics){let k=vA(T);k.title=`packOutput-${n.name}`,global.debugGraphics?.push(k)}Q7t(n,T,P)},rFt=n=>{let{db:e}=n.root,{_parsedProps:t}=n,i=n.children.filter(N=>N.pcb_component_id||N.pcb_group_id);if(i.some(N=>{let E=N._parsedProps;return E?.pcbX!==void 0||E?.pcbY!==void 0}))return;let s=t.pcbJustifyContent??t.justifyContent,o=t.pcbAlignItems??t.alignItems,a=t.pcbFlexGap??t.pcbGap??t.gap,c=t.pcbFlexDirection??"row",l={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"space-between","space-between":"space-between","space-around":"space-around","space-evenly":"space-evenly",center:"center"}[s??"space-between"],u={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"stretch",center:"center"}[o??"center"];if(!l)throw new Error(`Invalid justifyContent value: "${s}"`);if(!u)throw new Error(`Invalid alignItems value: "${o}"`);let p=0,d=0;typeof a=="object"?(p=a.y??0,d=a.x??0):typeof a=="number"?(p=a,d=a):typeof a=="string"&&(p=j.parse(a),d=j.parse(a));let _,g=t.width??t.pcbWidth??void 0,x=t.height??t.pcbHeight??void 0;(g===void 0||x===void 0)&&(_=$w(i.map(N=>N._getMinimumFlexContainerSize()).filter(N=>N!==null),{alignItems:u,justifyContent:l,direction:c,rowGap:p,columnGap:d}),g=_.width,x=_.height);let S=new jS(g,x,{alignItems:u,justifyContent:l,direction:c,rowGap:p,columnGap:d});for(let N of i){let E=N._getMinimumFlexContainerSize();S.addChild({metadata:N,width:E?.width??0,height:E?.height??0,flexBasis:E?c==="row"?E.width:E.height:void 0})}S.build();let P={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,width:0,height:0};for(let N of S.children)P.minX=Math.min(P.minX,N.position.x),P.minY=Math.min(P.minY,N.position.y),P.maxX=Math.max(P.maxX,N.position.x+N.size.width),P.maxY=Math.max(P.maxY,N.position.y+N.size.height);P.width=P.maxX-P.minX,P.height=P.maxY-P.minY;let T=n._getGlobalPcbPositionBeforeLayout(),k={x:T.x-(P.maxX+P.minX)/2,y:T.y-(P.maxY+P.minY)/2};for(let N of S.children)N.metadata._repositionOnPcb({x:N.position.x+N.size.width/2+k.x,y:N.position.y+N.size.height/2+k.y});e.pcb_group.update(n.pcb_group_id,{width:P.width,height:P.height,center:T})};function sFt(n){let{db:e}=n.root,t=new Map,i=new Map,r=new Set,o=n.selectAll("trace").filter(R=>R._parsedProps?.schDisplayLabel),a=n.selectAll("group"),c=[n.schematic_group_id,...a.map(R=>R.schematic_group_id)],l=e.schematic_component.list().filter(R=>c.includes(R.schematic_group_id)),u=[],p=new Map,d=new Map;for(let R of l){let B=R.schematic_component_id,D=[],U=e.source_component.getWhere({source_component_id:R.source_component_id}),X=e.schematic_port.list({schematic_component_id:R.schematic_component_id});for(let W of X){let J=`${U?.name??R.schematic_component_id}.${W.pin_number}`;p.set(J,W.schematic_port_id),d.set(W.schematic_port_id,J)}for(let W of X){let J=d.get(W.schematic_port_id);D.push({pinId:J,x:W.center.x,y:W.center.y})}u.push({chipId:B,center:R.center,width:R.size.width,height:R.size.height,pins:D})}let _=new Set,g=new Map,x=new Map,v=new Map;for(let R of l){let B=e.schematic_port.list({schematic_component_id:R.schematic_component_id});for(let D of B)_.add(D.schematic_port_id),D.source_port_id&&(g.set(D.schematic_port_id,D.source_port_id),x.set(D.source_port_id,D.schematic_port_id))}let S=new Set;n.subcircuit_id&&S.add(n.subcircuit_id);for(let R of a)R.subcircuit_id&&S.add(R.subcircuit_id);let T=e.source_trace.list().filter(R=>{if(R.subcircuit_id===n.subcircuit_id)return!0;for(let B of R.connected_source_port_ids)if(x.has(B))return!0;return!1}).flatMap(R=>R.connected_source_net_ids);for(let R of T){let B=e.source_net.get(R);B?.subcircuit_id&&S.add(B.subcircuit_id)}let k=[],N=new Map;for(let R of e.source_trace.list()){if(R.subcircuit_id&&!S.has(R.subcircuit_id))continue;let B=(R.connected_source_port_ids??[]).map(D=>x.get(D)).filter(D=>!!D&&_.has(D));if(B.length>=2){let[D,U]=B.slice(0,2),X=[D,U].sort().join("::");if(!N.has(X)){N.set(X,R.source_trace_id);let W=R.display_name??R.source_trace_id;R.subcircuit_connectivity_map_key&&(r.add(R.subcircuit_connectivity_map_key),v.set(W,R.subcircuit_connectivity_map_key),i.set(R.subcircuit_connectivity_map_key,W)),k.push({pinIds:[D,U].map(J=>d.get(J)),netId:W})}}}let E=[];for(let R of e.source_net.list().filter(B=>!B.subcircuit_id||S.has(B.subcircuit_id)))R.subcircuit_connectivity_map_key&&(r.add(R.subcircuit_connectivity_map_key),t.set(R.subcircuit_connectivity_map_key,R));let C=new Map;for(let[R,B]of g){let D=e.source_port.get(B);if(!D?.subcircuit_connectivity_map_key)continue;let U=D.subcircuit_connectivity_map_key;r.add(U),C.has(U)||C.set(U,[]),C.get(U).push(R)}for(let[R,B]of C){let D=t.get(R);if(D&&B.length>=2){let U=String(D.name||D.source_net_id||R);v.set(U,R),i.set(R,U);let W=.1*(.18/.18),J=Number((String(U).length*W).toFixed(2));E.push({netId:U,pinIds:B.map(nt=>d.get(nt)),netLabelWidth:J})}}let M=(()=>{let R={},B=new Set(E.map(D=>D.netId));for(let D of e.source_net.list().filter(U=>!U.subcircuit_id||S.has(U.subcircuit_id)))D.name&&B.has(D.name)&&(D.is_ground||D.name.toLowerCase().startsWith("gnd")?R[D.name]=["y-"]:D.is_power||D.name.toLowerCase().startsWith("v")?R[D.name]=["y+"]:R[D.name]=["x-","x+"]);return R})();return{inputProblem:{chips:u,directConnections:k,netConnections:E,availableNetLabelOrientations:M,maxMspPairDistance:n._parsedProps.schMaxTraceDistance??2.4},pinIdToSchematicPortId:p,pairKeyToSourceTraceId:N,sckToSourceNet:t,sckToUserNetId:i,userNetIdToSck:v,allSourceAndSchematicPortIdsInScope:_,schPortIdToSourcePortId:g,displayLabelTraces:o,allScks:r}}var gr=1e-6;function cnt(n){let e=Math.abs(n.to.x-n.from.x),t=Math.abs(n.to.y-n.from.y);return e>=t}function uP(n,e){return Math.hypot(e.x-n.x,e.y-n.y)}function lnt(n,e,t){return{x:n.x+(e.x-n.x)*t,y:n.y+(e.y-n.y)*t}}function unt(n,e,t){let i=uP(n,e);if(i<gr)return 0;let r=((t.x-n.x)*(e.x-n.x)+(t.y-n.y)*(e.y-n.y))/((e.x-n.x)*(e.x-n.x)+(e.y-n.y)*(e.y-n.y));return Math.max(0,Math.min(1,r))*i}function nP(n,e,t,i){return n*i-e*t}function oFt(n,e,t,i){let r={x:e.x-n.x,y:e.y-n.y},s={x:i.x-t.x,y:i.y-t.y},o=nP(r.x,r.y,s.x,s.y),a={x:t.x-n.x,y:t.y-n.y},c=nP(a.x,a.y,r.x,r.y);if(Math.abs(o)<gr&&Math.abs(c)<gr||Math.abs(o)<gr&&Math.abs(c)>=gr)return null;let l=nP(a.x,a.y,s.x,s.y)/o,u=nP(a.x,a.y,r.x,r.y)/o;return l<-gr||l>1+gr||u<-gr||u>1+gr?null:{x:n.x+l*r.x,y:n.y+l*r.y}}function aFt(n,e=gr){if(n.length===0)return n;n.sort((r,s)=>r.start-s.start);let t=[],i={...n[0]};for(let r=1;r<n.length;r++){let s=n[r];s.start<=i.end+e?i.end=Math.max(i.end,s.end):(t.push(i),i={...s})}return t.push(i),t}function cFt(n,e,t){let i=uP(n.from,n.to);if(i<gr||e.length===0)return[n];let r=t/2,s=e.map(p=>({start:Math.max(0,p-r),end:Math.min(i,p+r)})).filter(p=>p.end-p.start>gr),o=aFt(s),a=[],c=0,l={x:n.to.x-n.from.x,y:n.to.y-n.from.y},u=(p,d,_)=>{if(d-p<=gr)return;let g=p/i,x=d/i;a.push({from:lnt(n.from,n.to,g),to:lnt(n.from,n.to,x),..._?{is_crossing:!0}:{}})};for(let p of o)p.start-c>gr&&u(c,p.start,!1),u(p.start,p.end,!0),c=p.end;return i-c>gr&&u(c,i,!1),a.length>0?a:[n]}function lFt(n,e={}){let t=e.crossSegmentLength??.075,i=e.tolerance??gr,r=new Map,s=c=>`${c.traceIdx}:${c.edgeIdx}`,o=c=>n[c.traceIdx].edges[c.edgeIdx];for(let c=0;c<n.length;c++){let l=n[c];for(let u=0;u<l.edges.length;u++){let p=l.edges[u];for(let d=c;d<n.length;d++){let _=n[d];for(let g=d===c?u+1:0;g<_.edges.length;g++){let x=_.edges[g],v=oFt(p.from,p.to,x.from,x.to);if(!v)continue;let S=uP(p.from,p.to),P=uP(x.from,x.to);if(S<i||P<i)continue;let T=unt(p.from,p.to,v),k=unt(x.from,x.to,v),N=T<=i||Math.abs(S-T)<=i||Number.isNaN(T),E=k<=i||Math.abs(P-k)<=i||Number.isNaN(k);if(!N&&!E){let C=cnt(p),M=cnt(x),A;if(C!==M)A=C;else{let D=Math.abs(p.to.x-p.from.x),U=Math.abs(p.to.y-p.from.y),X=Math.abs(x.to.x-x.from.x),W=Math.abs(x.to.y-x.from.y),J=D-U,nt=X-W;A=J===nt?!0:J>nt}let R=s({traceIdx:A?c:d,edgeIdx:A?u:g}),B=r.get(R)??[];B.push(A?T:k),r.set(R,B)}}}}}let a=n.map(c=>({source_trace_id:c.source_trace_id,edges:[]}));for(let c=0;c<n.length;c++){let l=n[c];for(let u=0;u<l.edges.length;u++){let p=s({traceIdx:c,edgeIdx:u}),d=r.get(p)??[];if(d.length===0){a[c].edges.push(l.edges[u]);continue}let _=Array.from(new Set(d.map(x=>Number(x.toFixed(6))))).sort((x,v)=>x-v),g=cFt(l.edges[u],_,t);a[c].edges.push(...g)}}return a}var Ko=1e-6;function pP(n,e,t=Ko){return Math.abs(n-e)<=t}function Z_(n,e,t=Ko){return pP(n.x,e.x,t)&&pP(n.y,e.y,t)}function pnt(n,e,t,i=Ko){let r=Math.min(e.x,t.x)-i,s=Math.max(e.x,t.x)+i,o=Math.min(e.y,t.y)-i,a=Math.max(e.y,t.y)+i;return n.x<r||n.x>s||n.y<o||n.y>a?!1:Math.abs((t.x-e.x)*(n.y-e.y)-(t.y-e.y)*(n.x-e.x))<=i}function hnt(n,e=Ko){let t=new Map;for(let i of n){let r=`${i.x.toFixed(6)},${i.y.toFixed(6)}`;t.has(r)||t.set(r,i)}return Array.from(t.values())}function dnt(n){return{x:n.to.x-n.from.x,y:n.to.y-n.from.y}}function m9(n,e,t=Ko){let i=dnt(n),r=dnt(e),s=Math.hypot(i.x,i.y),o=Math.hypot(r.x,r.y);if(s<t||o<t)return!0;let a=i.x*r.y-i.y*r.x;return Math.abs(a)<=t*s*o}function U1(n,e,t=Ko){return n.edges.filter(i=>Z_(i.from,e,t)||Z_(i.to,e,t))}function fnt(n,e,t=Ko){for(let i of n.edges){if(Z_(i.from,e,t))return i.from;if(Z_(i.to,e,t))return i.to}return null}function uFt(n,e,t=Ko){let i=Z_(n.from,e,t)||pP(n.from.x,e.x,t)&&pP(n.from.y,e.y,t)?n.to:n.from,r=i.x-e.x,s=i.y-e.y;return Math.abs(r)<t&&Math.abs(s)<t?null:Math.abs(r)>=Math.abs(s)?r>=0?"right":"left":s>=0?"up":"down"}function U_(n,e,t=Ko){let i=U1(n,e,t);if(i.length<2)return null;let r=i.map(p=>uFt(p,e,t)),s=r.includes("up"),o=r.includes("down"),a=r.includes("left"),c=r.includes("right"),l=s?"up":o?"down":null,u=c?"right":a?"left":null;return l&&u?`${l}-${u}`:null}function pFt(n,e={}){let t=e.tolerance??Ko,i={};for(let s of n)i[s.source_trace_id]=[];let r=n.map(s=>{let o=[];for(let a of s.edges)o.push(a.from,a.to);return hnt(o,t)});for(let s=0;s<n.length;s++){let o=n[s],a=r[s];for(let c=s+1;c<n.length;c++){let l=n[c],u=r[c];for(let p of a)for(let d of u)if(Z_(p,d,t)){let _=U1(o,p,t),g=U1(l,d,t),x=_.some(T=>g.some(k=>!m9(T,k,t))),v=U_(o,p,t),S=U_(l,d,t);x&&!(v!==null&&S!==null&&v===S)&&(i[o.source_trace_id].push(p),o.source_trace_id!==l.source_trace_id&&i[l.source_trace_id].push(d))}for(let p of a)for(let d of l.edges)if(pnt(p,d.from,d.to,t)){let g=U1(o,p,t).some(T=>!m9(T,d,t)),x=U_(o,p,t),v=fnt(l,p,t*1e3),S=v?U_(l,v,t):null;g&&!(x!==null&&S!==null&&x===S)&&(i[o.source_trace_id].push(p),o.source_trace_id!==l.source_trace_id&&i[l.source_trace_id].push(p))}for(let p of u)for(let d of o.edges)if(pnt(p,d.from,d.to,t)){let g=U1(l,p,t).some(T=>!m9(d,T,t)),x=U_(l,p,t),v=fnt(o,p,t*1e3),S=v?U_(o,v,t):null;g&&!(S!==null&&x!==null&&S===x)&&(i[l.source_trace_id].push(p),o.source_trace_id!==l.source_trace_id&&i[o.source_trace_id].push(p))}}}for(let s of Object.keys(i))i[s]=hnt(i[s],t);return i}var _9=(0,Gnt.default)("Group_doInitialSchematicTraceRender");function hFt(n){let{group:e,solver:t,pinIdToSchematicPortId:i,userNetIdToSck:r}=n,{db:s}=e.root,o=t.traceCleanupSolver?.getOutput().traces??t.traceLabelOverlapAvoidanceSolver?.getOutput().traces??t.schematicTraceLinesSolver?.solvedTracePaths,a=[];_9(`Traces inside SchematicTraceSolver output: ${(o??[]).length}`);for(let u of o??[]){let p=u?.tracePath;if(!Array.isArray(p)||p.length<2){_9(`Skipping trace ${u?.pinIds.join(",")} because it has less than 2 points`);continue}let d=[];for(let x=0;x<p.length-1;x++)d.push({from:{x:p[x].x,y:p[x].y},to:{x:p[x+1].x,y:p[x+1].y}});let _=null,g;if(Array.isArray(u?.pins)&&u.pins.length===2){let x=i.get(u.pins[0]?.pinId),v=i.get(u.pins[1]?.pinId);if(x&&v){for(let S of[x,v])s.schematic_port.get(S)&&s.schematic_port.update(S,{is_connected:!0});g=r.get(String(u.userNetId))}}_||(_=`solver_${u?.mspPairId}`,g=r.get(String(u.userNetId))),a.push({source_trace_id:_,edges:d,subcircuit_connectivity_map_key:g})}_9(`Applying ${a.length} traces from SchematicTraceSolver output`);let c=lFt(a.map(u=>({source_trace_id:u.source_trace_id,edges:u.edges}))),l=pFt(c);for(let u of c)s.schematic_trace.insert({source_trace_id:u.source_trace_id,edges:u.edges,junctions:l[u.source_trace_id]??[],subcircuit_connectivity_map_key:a.find(p=>p.source_trace_id===u.source_trace_id)?.subcircuit_connectivity_map_key})}var dFt=n=>{switch(n){case"x+":return"left";case"x-":return"right";case"y+":return"bottom";case"y-":return"top";case"left":return"right";case"top":return"bottom";case"right":return"left";case"bottom":return"top"}},fFt=n=>{for(let t of n){let i=t._getDirectlyConnectedTraces();for(let r of i){let s=r._parsedProps.schDisplayLabel;if(s)return{name:s,wasAssignedDisplayLabel:!0}}}return{name:n.map(t=>t._getNetLabelText()).join("/"),wasAssignedDisplayLabel:!1}},y9=(0,Wnt.default)("Group_doInitialSchematicTraceRender");function mFt(n){let{group:e,solver:t,sckToSourceNet:i,allScks:r,allSourceAndSchematicPortIdsInScope:s,schPortIdToSourcePortId:o,userNetIdToSck:a,pinIdToSchematicPortId:c,schematicPortIdsWithPreExistingNetLabels:l,schematicPortIdsWithRoutedTraces:u}=n,{db:p}=e.root,d=t.netLabelPlacementSolver?.netLabelPlacements??t.traceLabelOverlapAvoidanceSolver?.getOutput().netLabelPlacements??[],_=t.mspConnectionPairSolver.globalConnMap;for(let g of d){y9(`processing placement: ${g.netId}`);let x=_.getIdsConnectedToNet(g.globalConnNetId).find(R=>a.get(R)),v=a.get(x),S=g.anchorPoint,P=g.orientation,T=dFt(P),k=v?i.get(v):void 0,N=g.pinIds.map(R=>c.get(R));if(N.some(R=>l.has(R))){y9(`skipping net label placement for "${g.netId}" REASON:schematic port has pre-existing net label`);continue}if(k){let R=k.name,B=wl({anchor_position:S,anchor_side:T,text:R});p.schematic_net_label.insert({text:R,anchor_position:S,center:B,anchor_side:T,...k?.source_net_id?{source_net_id:k.source_net_id}:{}});continue}let E=e.selectAll("port").filter(R=>R._getSubcircuitConnectivityKey()===v),{name:C,wasAssignedDisplayLabel:M}=fFt(E);if(!M&&N.some(R=>u.has(R))){y9(`skipping net label placement for "${g.netId}" REASON:schematic port has routed traces and no display label`);continue}let A=wl({anchor_position:S,anchor_side:T,text:C});p.schematic_net_label.insert({text:C,anchor_position:S,center:A,anchor_side:T})}}var _Ft=({allSourceAndSchematicPortIdsInScope:n,group:e,schPortIdToSourcePortId:t,sckToSourceNet:i,pinIdToSchematicPortId:r,schematicPortIdsWithPreExistingNetLabels:s})=>{let{db:o}=e.root;for(let a of Array.from(n)){let c=o.schematic_port.get(a);if(!c||c.is_connected)continue;let l=t.get(a);if(!l)continue;let p=o.source_port.get(l)?.subcircuit_connectivity_map_key;if(!p)continue;let d=i.get(p);if(!d||o.schematic_net_label.list().some(S=>Math.abs(S.anchor_position.x-c.center.x)<.1&&Math.abs(S.anchor_position.y-c.center.y)<.1?d.source_net_id&&S.source_net_id?S.source_net_id===d.source_net_id:S.text===(d.name||p):!1))continue;let g=d.name||d.source_net_id||p,x=H1(c.facing_direction||"right")||"right",v=wl({anchor_position:c.center,anchor_side:x,text:g});o.schematic_net_label.insert({text:g,anchor_position:c.center,center:v,anchor_side:x,...d.source_net_id?{source_net_id:d.source_net_id}:{}})}},yFt=n=>{let e=new Set,t=n.selectAll("netlabel");for(let i of t){let r=i._getConnectedPorts();for(let s of r)s.schematic_port_id&&e.add(s.schematic_port_id)}return e},gFt=({solver:n,pinIdToSchematicPortId:e})=>{let t=n.schematicTraceLinesSolver.solvedTracePaths,i=new Set;for(let r of t)for(let s of r.pinIds){let o=e.get(s);o&&i.add(o)}return i},xFt=(0,Vnt.default)("Group_doInitialSchematicTraceRender"),bFt=n=>{if(!n.root?._featureMspSchematicTraceRouting||!n.isSubcircuit||n.root?.schematicDisabled)return;let{inputProblem:e,pinIdToSchematicPortId:t,pairKeyToSourceTraceId:i,sckToSourceNet:r,allSourceAndSchematicPortIdsInScope:s,schPortIdToSourcePortId:o,displayLabelTraces:a,allScks:c,userNetIdToSck:l}=sFt(n),u=yFt(n);xFt.enabled&&n.root?.emit("debug:logOutput",{type:"debug:logOutput",name:"group-trace-render-input-problem",content:JSON.stringify(e,null,2)});let p=new ott(e);p.solve();let d=gFt({solver:p,pinIdToSchematicPortId:t});hFt({group:n,solver:p,pinIdToSchematicPortId:t,userNetIdToSck:l}),mFt({group:n,solver:p,sckToSourceNet:r,allSourceAndSchematicPortIdsInScope:s,schPortIdToSourcePortId:o,pinIdToSchematicPortId:t,allScks:c,userNetIdToSck:l,schematicPortIdsWithPreExistingNetLabels:u,schematicPortIdsWithRoutedTraces:d}),_Ft({group:n,allSourceAndSchematicPortIdsInScope:s,schPortIdToSourcePortId:o,sckToSourceNet:r,pinIdToSchematicPortId:t,schematicPortIdsWithPreExistingNetLabels:u})},vFt=()=>({async simulate(n){let e="spice-experiment-1",{circuit:t,tran:i}=utt(n);return{simulationResultCircuitJson:ptt(i,t,e)}}}),mnt=["rgb(132, 0, 0)","rgb(194, 194, 0)","rgb(194, 0, 194)","rgb(194, 0, 0)","rgb(0, 132, 132)","rgb(0, 132, 0)","rgb(0, 0, 132)","rgb(132, 132, 132)","rgb(132, 0, 132)","rgb(194, 194, 194)","rgb(132, 0, 132)","rgb(132, 0, 0)","rgb(132, 132, 0)","rgb(194, 194, 194)","rgb(0, 0, 132)","rgb(0, 132, 0)"],sP=new Map,oP=0;function wFt(n){if(sP.has(n))return sP.get(n);let e=mnt[oP];return oP=(oP+1)%mnt.length,sP.set(n,e),e}function SFt(){sP.clear(),oP=0}var Va=(0,Hnt.default)("tscircuit:core:Group_doInitialSimulationSpiceEngineRender");function PFt(n){if(!n.isSubcircuit)return;let{root:e}=n;if(!e)return;let t=n.selectAll("analogsimulation");if(t.length===0)return;let i=n.selectAll("voltageprobe");SFt();let r={...e.platform?.spiceEngineMap};r.spicey||(r.spicey=vFt());let s=e.db.toArray(),o,a;try{a=ctt(s),o=a.toSpiceString(),Va(`Generated SPICE string:
|
|
252
252
|
${o}`)}catch(c){Va(`Failed to convert circuit JSON to SPICE: ${c}`);return}for(let c of t){let l=c._parsedProps.spiceEngine??"spicey",u=r[l];if(!u)throw new Error(`SPICE engine "${l}" not found in platform config. Available engines: ${JSON.stringify(Object.keys(r).filter(d=>d!=="spicey"))}`);let p=`spice-simulation-${l}-${c.source_component_id}`;Va(`Queueing simulation for spice engine: ${l} (id: ${p})`),n._queueAsyncEffect(p,async()=>{try{Va(`Running simulation with engine: ${l}`);let d=await u.simulate(o);Va(`Simulation completed, received ${d.simulationResultCircuitJson.length} elements`);let _=e.db.simulation_experiment.list()[0];if(!_){Va("No simulation experiment found, skipping result insertion");return}for(let g of d.simulationResultCircuitJson){if(g.type==="simulation_transient_voltage_graph"){g.simulation_experiment_id=_.simulation_experiment_id;let v=i.find(S=>S.finalProbeName===g.name);v&&(g.color=v.color)}let x=g.type;x&&e.db[x]?(e.db[x].insert(g),Va(`Inserted ${x} into database`)):(Va(`Warning: Unknown element type ${x}, adding to raw db`),e.db._addElement(g))}n._markDirty("SimulationSpiceEngineRender")}catch(d){Va(`Simulation failed for engine ${l}: ${d}`);let _=e.db.simulation_experiment.list()[0];e.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:_?.simulation_experiment_id,error_type:"simulation_unknown_experiment_error",message:d instanceof Error?d.message:String(d)})}})}}function kFt(n){if(n.root?.pcbDisabled||!n.pcb_group_id)return;let e=n._parsedProps?.pcbPositionAnchor;if(!e)return;let t=n._getGlobalPcbPositionBeforeLayout(),{pcbX:i,pcbY:r}=n._parsedProps;if(i===void 0&&r===void 0)return;let{db:s}=n.root,o=s.pcb_group.get(n.pcb_group_id);if(!o)return;let a=o.width,c=o.height,{center:l}=o;if(o.outline&&o.outline.length>0){let x=co(o.outline);x&&(a=x.maxX-x.minX,c=x.maxY-x.minY)}if(!a||!c)return;let u={left:l.x-a/2,right:l.x+a/2,top:l.y+c/2,bottom:l.y-c/2},p={...l},d=null;if(new Set(["center","top_left","top_center","top_right","center_left","center_right","bottom_left","bottom_center","bottom_right"]).has(e))switch(e){case"center":d=p;break;case"top_left":d={x:u.left,y:u.top};break;case"top_center":d={x:p.x,y:u.top};break;case"top_right":d={x:u.right,y:u.top};break;case"center_left":d={x:u.left,y:p.y};break;case"center_right":d={x:u.right,y:p.y};break;case"bottom_left":d={x:u.left,y:u.bottom};break;case"bottom_center":d={x:p.x,y:u.bottom};break;case"bottom_right":d={x:u.right,y:u.bottom};break}if(!d)return;let g={...p};t.x!==void 0&&(g.x+=t.x-d.x),t.y!==void 0&&(g.y+=t.y-d.y),(Math.abs(g.x-p.x)>1e-6||Math.abs(g.y-p.y)>1e-6)&&(n._repositionOnPcb(g),s.pcb_group.update(n.pcb_group_id,{center:g})),s.pcb_group.update(n.pcb_group_id,{anchor_position:t,anchor_alignment:e})}var Sl=class extends Bn{constructor(){super(...arguments);f(this,"pcb_group_id",null);f(this,"schematic_group_id",null);f(this,"subcircuit_id",null);f(this,"_hasStartedAsyncAutorouting",!1);f(this,"_asyncAutoroutingResult",null);f(this,"unnamedElementCounter",{})}get config(){return{zodProps:ZW,componentName:"Group"}}doInitialSourceGroupRender(){let{db:e}=this.root,t=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,i=e.source_group.insert({name:this.name,is_subcircuit:this.isSubcircuit,was_automatically_named:!t});this.source_group_id=i.source_group_id,this.isSubcircuit&&(this.subcircuit_id=`subcircuit_${i.source_group_id}`,e.source_group.update(i.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:e}=this.root;for(let t of this.children)e.source_component.update(t.source_component_id,{source_group_id:this.source_group_id})}doInitialSourceParentAttachment(){let{db:e}=this.root,t=this.parent?.getGroup?.();if(t?.source_group_id&&e.source_group.update(this.source_group_id,{parent_source_group_id:t.source_group_id}),!this.isSubcircuit)return;let i=this.parent?.getSubcircuit?.()?.subcircuit_id;i&&e.source_group.update(this.source_group_id,{parent_subcircuit_id:i})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=t,r=i.outline&&i.outline.length>0,s=r?i.outline.map(a=>({x:V.parse(a.x),y:V.parse(a.y)})):void 0,o=e.pcb_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id??this.getSubcircuit()?.subcircuit_id,name:this.name,center:this._getGlobalPcbPositionBeforeLayout(),...r?{outline:s}:{width:0,height:0},pcb_component_ids:[],source_group_id:this.source_group_id,autorouter_configuration:t.autorouter?{trace_clearance:t.autorouter.traceClearance}:void 0});this.pcb_group_id=o.pcb_group_id;for(let a of this.children)e.pcb_component.update(a.pcb_component_id,{pcb_group_id:o.pcb_group_id})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,t=this._parsedProps,i=t.outline&&t.outline.length>0;if(this.pcb_group_id){let r=this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0;if(i){let p=t.outline.map(v=>({x:V.parse(v.x),y:V.parse(v.y)})),d=co(p);if(!d)return;let _=(d.minX+d.maxX)/2,g=(d.minY+d.maxY)/2,x=r?e.pcb_group.get(this.pcb_group_id)?.center??{x:_,y:g}:{x:_,y:g};e.pcb_group.update(this.pcb_group_id,{center:x});return}let s=mP(this.children),o=s.width,a=s.height,c=(s.minX+s.maxX)/2,l=(s.minY+s.maxY)/2;if(this.isSubcircuit){let{padLeft:p,padRight:d,padTop:_,padBottom:g}=this._resolvePcbPadding();o+=p+d,a+=_+g,c+=(d-p)/2,l+=(_-g)/2}let u=r?e.pcb_group.get(this.pcb_group_id)?.center??{x:c,y:l}:{x:c,y:l};e.pcb_group.update(this.pcb_group_id,{width:Number(t.width??o),height:Number(t.height??a),center:u})}}getNextAvailableName(e){var t,i;return(t=this.unnamedElementCounter)[i=e.lowercaseComponentName]??(t[i]=1),`unnamed_${e.lowercaseComponentName}${this.unnamedElementCounter[e.lowercaseComponentName]++}`}_resolvePcbPadding(){let e=this._parsedProps,t=e.pcbLayout,i=p=>{let d=t?.[p],_=e[p];if(typeof d=="number")return d;if(typeof _=="number")return _},r=i("padding")??0,s=i("paddingX"),o=i("paddingY"),a=i("paddingLeft")??s??r,c=i("paddingRight")??s??r,l=i("paddingTop")??o??r,u=i("paddingBottom")??o??r;return{padLeft:a,padRight:c,padTop:l,padBottom:u}}doInitialCreateTraceHintsFromProps(){let{_parsedProps:e}=this,{db:t}=this.root,i=e;if(!this.isSubcircuit)return;let r=i.manualEdits?.manual_trace_hints;if(r)for(let s of r)this.add(new L9({for:s.pcb_port_selector,offsets:s.offsets}))}doInitialSourceAddConnectivityMapKey(){z7t(this)}_areChildSubcircuitsRouted(){let e=this.selectAll("group").filter(t=>t.isSubcircuit);for(let t of e)if(t._shouldRouteAsync()&&!t._asyncAutoroutingResult)return!1;return!0}_shouldRouteAsync(){let e=this._getAutorouterConfig();return e.groupMode==="sequential-trace"?!1:!!(e.local&&e.groupMode==="subcircuit"||!e.local)}_hasTracesToRoute(){let e=(0,V_.default)("tscircuit:core:_hasTracesToRoute"),t=this.selectAll("trace");return e(`[${this.getString()}] has ${t.length} traces to route`),t.length>0}async _runEffectMakeHttpAutoroutingRequest(){let{db:e}=this.root,t=(0,V_.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),i=this._parsedProps,r=this._getAutorouterConfig(),s=r.serverUrl,o=r.serverMode,a=(u,p)=>(t("fetching",u),p.headers&&(p.headers["Tscircuit-Core-Version"]=this.root?.getCoreVersion()),fetch(u,p)),c=this.root.db.toArray().filter(u=>u.type.startsWith("source_")||u.type.startsWith("pcb_"));if(o==="solve-endpoint"){if(this.props.autorouter?.inputFormat==="simplified"){let{autorouting_result:p}=await a(`${s}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:T9({db:e,minTraceWidth:this.props.autorouter?.minTraceWidth??.15,subcircuit_id:this.subcircuit_id}).simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(d=>d.json());this._asyncAutoroutingResult=p,this._markDirty("PcbTraceRender");return}let{autorouting_result:u}=await a(`${s}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_circuit_json:c,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(p=>p.json());this._asyncAutoroutingResult=u,this._markDirty("PcbTraceRender");return}let{autorouting_job:l}=await a(`${s}/autorouting/jobs/create`,{method:"POST",body:JSON.stringify({input_circuit_json:c,provider:"freerouting",autostart:!0,display_name:this.root?.name,subcircuit_id:this.subcircuit_id,server_cache_enabled:r.serverCacheEnabled}),headers:{"Content-Type":"application/json"}}).then(u=>u.json());for(;;){let{autorouting_job:u}=await a(`${s}/autorouting/jobs/get`,{method:"POST",body:JSON.stringify({autorouting_job_id:l.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(p=>p.json());if(u.is_finished){let{autorouting_job_output:p}=await a(`${s}/autorouting/jobs/get_output`,{method:"POST",body:JSON.stringify({autorouting_job_id:l.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(d=>d.json());this._asyncAutoroutingResult={output_pcb_traces:p.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(u.has_error){let p=new Y1(`Autorouting job failed: ${JSON.stringify(u.error)}`);throw e.pcb_autorouting_error.insert({pcb_error_id:l.autorouting_job_id,error_type:"pcb_autorouting_error",message:p.message}),p}await new Promise(p=>setTimeout(p,100))}}async _runLocalAutorouting(){let{db:e}=this.root,t=this._parsedProps,i=(0,V_.default)("tscircuit:core:_runLocalAutorouting");i(`[${this.getString()}] starting local autorouting`);let r=this._getAutorouterConfig(),s=this._isLaserPrefabAutorouter(r),{simpleRouteJson:o}=T9({db:e,minTraceWidth:this.props.autorouter?.minTraceWidth??.15,subcircuit_id:this.subcircuit_id});if(i.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:o}),i.enabled){let l=Zg(o);l.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(l)}this.root?.emit("autorouting:start",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),simpleRouteJson:o});let a;r.algorithmFn?a=await r.algorithmFn(o):a=new C7t(o,{capacityDepth:this.props.autorouter?.capacityDepth,targetMinCapacity:this.props.autorouter?.targetMinCapacity,useAssignableViaSolver:s});let c=new Promise((l,u)=>{a.on("complete",p=>{i(`[${this.getString()}] local autorouting complete`),l(p.traces)}),a.on("error",p=>{i(`[${this.getString()}] local autorouting error: ${p.error.message}`),u(p.error)})});a.on("progress",l=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...l})}),a.start();try{let l=await c;this._asyncAutoroutingResult={output_pcb_traces:l},this._markDirty("PcbTraceRender")}catch(l){let{db:u}=this.root;throw u.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message:l instanceof Error?l.message:String(l)}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message:l instanceof Error?l.message:String(l)},simpleRouteJson:o}),l}finally{a.stop()}}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("capacity-mesh-autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let e=(0,V_.default)("tscircuit:core:doInitialPcbTraceRender");if(this.isSubcircuit&&!this.root?.pcbDisabled&&!this.getInheritedProperty("routingDisabled")&&!this._shouldUseTraceByTraceRouting()){if(!this._areChildSubcircuitsRouted()){e(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}e(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),this._hasTracesToRoute()&&this._startAsyncAutorouting()}}doInitialSchematicTraceRender(){bFt(this)}updatePcbTraceRender(){let e=(0,V_.default)("tscircuit:core:updatePcbTraceRender");if(e(`[${this.getString()}] updating...`),!this.isSubcircuit)return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){this._areChildSubcircuitsRouted()&&(e(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting());return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db:t}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){e(`[${this.getString()}] updating PCB traces from simple route json (${this._asyncAutoroutingResult.output_simple_route_json.traces?.length} traces)`),this._updatePcbTraceRenderFromSimpleRouteJson();return}if(this._asyncAutoroutingResult.output_pcb_traces){e(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db:e}=this.root,{traces:t}=this._asyncAutoroutingResult.output_simple_route_json;if(t)for(let i of t){let r=e.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:i.route})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces:e}=this._asyncAutoroutingResult;if(!e)return;let{db:t}=this.root,i=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter:r,padDiameter:s}=O9(i);for(let o of e)if(o.type==="pcb_trace"){if(o.subcircuit_id=this.subcircuit_id,o.connection_name){let a=o.connection_name;o.source_trace_id=a}t.pcb_trace.insert(o)}for(let o of e)if(o.type!=="pcb_via"&&o.type==="pcb_trace")for(let a of o.route)a.route_type==="via"&&t.pcb_via.insert({pcb_trace_id:o.pcb_trace_id,x:a.x,y:a.y,hole_diameter:r,outer_diameter:s,layers:[a.from_layer,a.to_layer],from_layer:a.from_layer,to_layer:a.to_layer})}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=e.schematic_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id,name:this.name,center:this._getGlobalSchematicPositionBeforeLayout(),width:0,height:0,schematic_component_ids:[],source_group_id:this.source_group_id});this.schematic_group_id=i.schematic_group_id;for(let r of this.children)r.schematic_component_id&&e.schematic_component.update(r.schematic_component_id,{schematic_group_id:i.schematic_group_id})}_getSchematicLayoutMode(){let e=this._parsedProps;if(e.schLayout?.layoutMode==="none"||e.schLayout?.layoutMode==="relative")return"relative";if(e.schLayout?.matchAdapt)return"match-adapt";if(e.schLayout?.flex)return"flex";if(e.schLayout?.grid)return"grid";if(e.schMatchAdapt)return"match-adapt";if(e.schFlex)return"flex";if(e.schGrid)return"grid";if(e.matchAdapt)return"match-adapt";if(e.flex)return"flex";if(e.grid)return"grid";if(e.relative||e.schRelative)return"relative";let t=this.children.some(r=>{let s=r._parsedProps;return s?.schX!==void 0||s?.schY!==void 0}),i=(e.manualEdits?.schematic_placements?.length??0)>0;return!t&&!i?"match-adapt":"relative"}doInitialSchematicLayout(){let e=this._getSchematicLayoutMode();e==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),e==="grid"&&this._doInitialSchematicLayoutGrid(),e==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutMatchAdapt(){L7t(this)}_doInitialSchematicLayoutMatchpack(){$7t(this)}_doInitialSchematicLayoutGrid(){D7t(this)}_doInitialSchematicLayoutFlex(){j7t(this)}_getPcbLayoutMode(){let e=this._parsedProps;if(e.pcbRelative)return"none";if(e.pcbLayout?.matchAdapt)return"match-adapt";if(e.pcbLayout?.flex)return"flex";if(e.pcbLayout?.grid)return"grid";if(e.pcbLayout?.pack)return"pack";if(e.pcbFlex)return"flex";if(e.pcbGrid)return"grid";if(e.pcbPack||e.pack)return"pack";if(e.matchAdapt)return"match-adapt";if(e.flex)return"flex";if(e.grid)return"grid";let t=e.pcbX!==void 0||e.pcbY!==void 0,i=(e.manualEdits?.pcb_placements?.length??0)>0,r=this.children.reduce((s,o)=>{if(!o.pcb_component_id&&!o.pcb_group_id)return s;let a=o._parsedProps,c=a?.pcbX!==void 0||a?.pcbY!==void 0;return s+(c?0:1)},0);return!t&&!i&&r>1?"pack":"none"}doInitialPcbLayout(){let e=this._getPcbLayoutMode();e==="grid"?this._doInitialPcbLayoutGrid():e==="pack"?this._doInitialPcbLayoutPack():e==="flex"&&this._doInitialPcbLayoutFlex()}_doInitialPcbLayoutGrid(){B7t(this)}_doInitialPcbLayoutPack(){iFt(this)}_doInitialPcbLayoutFlex(){rFt(this)}_insertSchematicBorder(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,t=this._parsedProps;if(!t.border)return;let i=typeof t.schWidth=="number"?t.schWidth:void 0,r=typeof t.schHeight=="number"?t.schHeight:void 0,s=typeof t.schPadding=="number"?t.schPadding:0,o=typeof t.schPaddingLeft=="number"?t.schPaddingLeft:s,a=typeof t.schPaddingRight=="number"?t.schPaddingRight:s,c=typeof t.schPaddingTop=="number"?t.schPaddingTop:s,l=typeof t.schPaddingBottom=="number"?t.schPaddingBottom:s,u=this.schematic_group_id?e.schematic_group.get(this.schematic_group_id):null;if(u&&(i===void 0&&typeof u.width=="number"&&(i=u.width),r===void 0&&typeof u.height=="number"&&(r=u.height)),i===void 0||r===void 0)return;let p=u?.center??this._getGlobalSchematicPositionBeforeLayout(),d=p.x-i/2-o,_=p.y-r/2-l,g=i+o+a,x=r+c+l;e.schematic_box.insert({width:g,height:x,x:d,y:_,is_dashed:t.border?.dashed??!1})}_determineSideFromPosition(e,t){if(!e.center||!t.center)return"left";let i=e.center.x-t.center.x,r=e.center.y-t.center.y;return Math.abs(i)>Math.abs(r)?i>0?"right":"left":r>0?"bottom":"top"}_calculateSchematicBounds(e){if(e.length===0)return{minX:0,maxX:0,minY:0,maxY:0};let t=1/0,i=-1/0,r=1/0,s=-1/0;for(let a of e)t=Math.min(t,a.centerX),i=Math.max(i,a.centerX),r=Math.min(r,a.centerY),s=Math.max(s,a.centerY);let o=2;return{minX:t-o,maxX:i+o,minY:r-o,maxY:s+o}}_getAutorouterConfig(){let e=this._parsedProps.autorouter||this.getInheritedProperty("autorouter");return K7t(e)}_isLaserPrefabAutorouter(e=this._getAutorouterConfig()){let t=this.props.autorouter,i=r=>r?.replace(/-/g,"_")??r;return e.preset==="laser_prefab"?!0:typeof t=="string"?i(t)==="laser_prefab":typeof t=="object"&&t?i(t.preset)==="laser_prefab":!1}_getSubcircuitLayerCount(){let e=this.getInheritedProperty("layers");return typeof e=="number"?e:2}_shouldUseTraceByTraceRouting(){return this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:e}=this.root;if(this.isSubcircuit){let t=new Map;for(let i of this.children)if(!i.isSubcircuit&&i._parsedProps.name){let r=t.get(i._parsedProps.name)||[];r.push(i),t.set(i._parsedProps.name,r)}for(let[i,r]of t.entries())r.length>1&&e.pcb_trace_error.insert({error_type:"pcb_trace_error",message:`Multiple components found with name "${i}" in subcircuit "${this.name||"unnamed"}". Component names must be unique within a subcircuit.`,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:r.map(s=>s.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db:e}=this.root,t=e;for(let i of t.schematic_net_label.list()){let r=t.source_net.get(i.source_net_id),s=i.text||r?.name||"";if(i.anchor_side==="top"&&/^gnd/i.test(s)){t.schematic_net_label.update(i.schematic_net_label_id,{symbol_name:"rail_down"});continue}i.anchor_side==="bottom"&&/^v/i.test(s)&&t.schematic_net_label.update(i.schematic_net_label_id,{symbol_name:"rail_up"})}}doInitialSimulationSpiceEngineRender(){PFt(this)}doInitialPcbComponentAnchorAlignment(){kFt(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}_getMinimumFlexContainerSize(){return super._getMinimumFlexContainerSize()}_repositionOnPcb(e){return super._repositionOnPcb(e)}};function TFt(n,e){let{subcircuit:t}=e;if(t.lowercaseComponentName==="board"||t.parent?.lowercaseComponentName==="board")return;let i={name:"inflated_board"};n.width&&(i.width=n.width),n.height&&(i.height=n.height),n.center&&(i.pcbX=n.center.x,i.pcbY=n.center.y),n.outline&&(i.outline=n.outline),n.thickness&&(i.thickness=n.thickness),n.material&&(i.material=n.material);let r=new gP(i);return r.pcb_board_id=n.pcb_board_id,t.add(r),r}var EFt=new Proxy({},{get:(n,e)=>e}),Ha=EFt,_P="rgba(132, 0, 0)",yP=.12,$9=class extends Bn{constructor(){super(...arguments);f(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Capacitor",schematicSymbolName:this.props.polarized?"capacitor_polarized":this.props.symbolName??"capacitor",zodProps:cH,sourceFtype:Ha.simple_capacitor}}initPorts(){typeof this.props.footprint=="string"?super.initPorts({additionalAliases:{pin1:["anode","pos"],pin2:["cathode","neg"]}}):super.initPorts()}_getSchematicSymbolDisplayValue(){let e=this.props.capacitance,t=typeof e=="string"?e:`${bi(this._parsedProps.capacitance)}F`;return this._parsedProps.schShowRatings&&this._parsedProps.maxVoltageRating?`${t}/${bi(this._parsedProps.maxVoltageRating)}V`:t}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.decouplingFor,this.props.decouplingTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.decouplingFor&&this.props.decouplingTo&&(this.add(new zs({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.decouplingFor})),this.add(new zs({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.decouplingTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=e.source_component.insert({ftype:"simple_capacitor",name:this.name,manufacturer_part_number:t.manufacturerPartNumber??t.mfn,supplier_part_numbers:t.supplierPartNumbers,capacitance:t.capacitance,max_voltage_rating:t.maxVoltageRating,max_decoupling_trace_length:t.maxDecouplingTraceLength,display_capacitance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!t.polarized});this.source_component_id=i.source_component_id}},K_=(n,e)=>{let{injectionDb:t,normalComponent:i}=e;if(!i)return;let r=n.center||{x:0,y:0},s=n.rotation||0,o=$3(ri(kn(r.x,r.y),Oo(s*Math.PI/180))),a=t.toArray().filter(u=>"pcb_component_id"in u&&u.pcb_component_id===n.pcb_component_id),c=structuredClone(a);tl(c,o);let l=H_({componentName:i.name,componentRotation:"0deg"},c);i.addAll(l)};function MFt(n,e){let{injectionDb:t,subcircuit:i,groupsMap:r}=e,s=t.pcb_component.getWhere({source_component_id:n.source_component_id}),o=t.cad_component.getWhere({source_component_id:n.source_component_id}),a=new $9({name:n.name,capacitance:n.capacitance,layer:s?.layer,pcbX:s?.center?.x,pcbY:s?.center?.y,pcbRotation:s?.rotation,doNotPlace:s?.do_not_place,obstructsWithinBounds:s?.obstructs_within_bounds});s&&K_(s,{...e,normalComponent:a}),n.source_group_id&&r?.has(n.source_group_id)?r.get(n.source_group_id).add(a):i.add(a)}var q1=class extends Bn{constructor(e){super(e);f(this,"schematicBoxDimensions",null)}get config(){return{componentName:"Chip",zodProps:s_,shouldRenderAsSchematicBox:!0}}initPorts(e={}){super.initPorts(e);let{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp();if(t.externallyConnectedPins){let s=new Set;for(let[o,a]of t.externallyConnectedPins)s.add(o),s.add(a);for(let o of s)if(!this.children.find(c=>c instanceof Wi&&c.isMatchingAnyOf([o]))){let c=o.match(/^pin(\d+)$/);if(c){let l=parseInt(c[1]);this.add(new Wi({pinNumber:l,aliases:[o]}))}else this.add(new Wi({name:o,aliases:[o]}))}}}doInitialSchematicComponentRender(){let{_parsedProps:e}=this;e?.noSchematicRepresentation!==!0&&super.doInitialSchematicComponentRender()}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),s=e.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:t.manufacturerPartNumber,supplier_part_numbers:t.supplierPartNumbers});this.source_component_id=s.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),s=t.layer??"top";if(s!=="top"&&s!=="bottom"){let a=this.getSubcircuit(),c=$m.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${s}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:s,subcircuit_id:a.subcircuit_id??void 0});e.pcb_component_invalid_layer_error.insert(c)}let o=e.pcb_component.insert({center:{x:i,y:r},width:2,height:3,layer:s==="top"||s==="bottom"?s:"top",rotation:t.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:t.doNotPlace??!1,obstructs_within_bounds:t.obstructsWithinBounds??!0});this.pcb_component_id=o.pcb_component_id}doInitialCreateTracesFromProps(){let{_parsedProps:e}=this;if(e.externallyConnectedPins)for(let[t,i]of e.externallyConnectedPins)this.add(new zs({from:`${this.getSubcircuitSelector()} > port.${t}`,to:`${this.getSubcircuitSelector()} > port.${i}`}));this._createTracesFromConnectionsProp()}doInitialSimulationRender(){let{db:e}=this.root,{pinAttributes:t}=this.props;if(!t)return;let i=null,r=null,s,o=this.selectAll("port");for(let p of o)for(let d of p.getNameAndAliases())if(t[d]){let _=t[d];_.providesPower&&(i=p,s=_.providesVoltage),_.providesGround&&(r=p)}if(!i||!r||s===void 0)return;let a=e.source_port.get(i.source_port_id);if(!a?.subcircuit_connectivity_map_key)return;let c=e.source_port.get(r.source_port_id);if(!c?.subcircuit_connectivity_map_key)return;let l=e.source_net.getWhere({subcircuit_connectivity_map_key:a.subcircuit_connectivity_map_key}),u=e.source_net.getWhere({subcircuit_connectivity_map_key:c.subcircuit_connectivity_map_key});!l||!u||e.simulation_voltage_source.insert({type:"simulation_voltage_source",positive_source_port_id:i.source_port_id,positive_source_net_id:l.source_net_id,negative_source_port_id:r.source_port_id,negative_source_net_id:u.source_net_id,voltage:s})}},CFt=(n,e)=>{if(!n||n.length===0)return;let{injectionDb:t}=e,i=n.map(r=>r.map(s=>{let o=t.source_port.get(s);return o?o.pin_number!==void 0&&o.pin_number!==null?`pin${o.pin_number}`:o.name:null}).filter(s=>s!==null)).filter(r=>r.length>0);return i.length>0?i:void 0},IFt=(n,e)=>{let{injectionDb:t,subcircuit:i,groupsMap:r}=e,s=t.pcb_component.getWhere({source_component_id:n.source_component_id}),o=t.schematic_component.getWhere({source_component_id:n.source_component_id}),a=t.cad_component.getWhere({source_component_id:n.source_component_id}),c=CFt(n.internally_connected_source_port_ids,e),l=new q1({name:n.name,manufacturerPartNumber:n.manufacturer_part_number,supplierPartNumbers:n.supplier_part_numbers??void 0,pinLabels:o?.port_labels??void 0,schWidth:o?.size?.width,schHeight:o?.size?.height,schPinSpacing:o?.pin_spacing,schX:o?.center?.x,schY:o?.center?.y,layer:s?.layer,pcbX:s?.center?.x,pcbY:s?.center?.y,pcbRotation:s?.rotation,doNotPlace:s?.do_not_place,obstructsWithinBounds:s?.obstructs_within_bounds,internallyConnectedPins:c}),u=a?.footprinter_string??null;u&&(Object.assign(l.props,{footprint:u}),Object.assign(l._parsedProps,{footprint:u}),a||l._addChildrenFromStringFootprint?.()),s&&K_(s,{...e,normalComponent:l}),n.source_group_id&&r?.has(n.source_group_id)?r.get(n.source_group_id).add(l):i.add(l)},z9=class extends Bn{constructor(){super(...arguments);f(this,"pos",this.portMap.pin1);f(this,"anode",this.portMap.pin1);f(this,"neg",this.portMap.pin2);f(this,"cathode",this.portMap.pin2)}get config(){let e={schottky:"schottky_diode",avalanche:"avalanche_diode",zener:"zener_diode",photodiode:"photodiode"},t=this.props.schottky?"schottky":this.props.avalanche?"avalanche":this.props.zener?"zener":this.props.photo?"photodiode":null;return{schematicSymbolName:t?e[t]:this.props.symbolName??"diode",componentName:"Diode",zodProps:kH,sourceFtype:"simple_diode"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=e.source_component.insert({ftype:"simple_diode",name:this.name,manufacturer_part_number:t.manufacturerPartNumber??t.mfn,supplier_part_numbers:t.supplierPartNumbers,are_pins_interchangeable:!1});this.source_component_id=i.source_component_id}};function NFt(n,e){let{injectionDb:t,subcircuit:i,groupsMap:r}=e,s=t.pcb_component.getWhere({source_component_id:n.source_component_id}),o=t.cad_component.getWhere({source_component_id:n.source_component_id}),a=new z9({name:n.name,layer:s?.layer,pcbX:s?.center?.x,pcbY:s?.center?.y,pcbRotation:s?.rotation,doNotPlace:s?.do_not_place,obstructsWithinBounds:s?.obstructs_within_bounds});s&&K_(s,{...e,normalComponent:a}),n.source_group_id&&r?.has(n.source_group_id)?r.get(n.source_group_id).add(a):i.add(a)}function AFt(n,e){let{subcircuit:t,groupsMap:i}=e,r=new Sl({name:n.name??`inflated_group_${n.source_group_id}`});return r.source_group_id=n.source_group_id,i&&i.set(n.source_group_id,r),n.parent_source_group_id&&i?.has(n.parent_source_group_id)?i.get(n.parent_source_group_id).add(r):t.add(r),r}var D9=class extends Bn{constructor(){super(...arguments);f(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Inductor",schematicSymbolName:this.props.symbolName??"inductor",zodProps:PH,sourceFtype:Ha.simple_inductor}}_getSchematicSymbolDisplayValue(){return`${bi(this._parsedProps.inductance)}H`}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=e.source_component.insert({name:this.name,ftype:Ha.simple_inductor,inductance:t.inductance,supplier_part_numbers:t.supplierPartNumbers,are_pins_interchangeable:!0});this.source_component_id=i.source_component_id}};function RFt(n,e){let{injectionDb:t,subcircuit:i,groupsMap:r}=e,s=t.pcb_component.getWhere({source_component_id:n.source_component_id}),o=t.cad_component.getWhere({source_component_id:n.source_component_id}),a=new D9({name:n.name,inductance:n.inductance,layer:s?.layer,pcbX:s?.center?.x,pcbY:s?.center?.y,pcbRotation:s?.rotation,doNotPlace:s?.do_not_place,obstructsWithinBounds:s?.obstructs_within_bounds});s&&K_(s,{...e,normalComponent:a}),n.source_group_id&&r?.has(n.source_group_id)?r.get(n.source_group_id).add(a):i.add(a)}function OFt(n,e){let{injectionDb:t,subcircuit:i}=e;if(n.source_component_id!==null)return;let r=t.pcb_port.getWhere({source_port_id:n.source_port_id}),s=new Wi({name:n.name,pinNumber:n.pin_number});i.add(s),s.source_port_id=n.source_port_id;let o=i.root;if(o&&r){let{db:a}=o,c=a.pcb_port.insert({pcb_component_id:void 0,layers:r.layers,subcircuit_id:i.subcircuit_id??void 0,pcb_group_id:i.getGroup()?.pcb_group_id??void 0,x:r.x,y:r.y,source_port_id:n.source_port_id,is_board_pinout:!1});s.pcb_port_id=c.pcb_port_id}}var j9=class extends Bn{constructor(){super(...arguments);f(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Resistor",schematicSymbolName:this.props.symbolName??"boxresistor",zodProps:iH,sourceFtype:"simple_resistor"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return`${bi(this._parsedProps.resistance)}\u03A9`}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.pullupFor,this.props.pullupTo,this.props.pulldownFor,this.props.pulldownTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.pullupFor&&this.props.pullupTo&&(this.add(new zs({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new zs({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new zs({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new zs({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=e.source_component.insert({ftype:"simple_resistor",name:this.name,manufacturer_part_number:t.manufacturerPartNumber??t.mfn,supplier_part_numbers:t.supplierPartNumbers,resistance:t.resistance,display_resistance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!0});this.source_component_id=i.source_component_id}};function LFt(n,e){let{injectionDb:t,subcircuit:i,groupsMap:r}=e,s=t.pcb_component.getWhere({source_component_id:n.source_component_id}),o=t.cad_component.getWhere({source_component_id:n.source_component_id}),a=new j9({name:n.name,resistance:n.resistance,layer:s?.layer,pcbX:s?.center?.x,pcbY:s?.center?.y,pcbRotation:s?.rotation,doNotPlace:s?.do_not_place,obstructsWithinBounds:s?.obstructs_within_bounds});s&&K_(s,{...e,normalComponent:a}),n.source_group_id&&r?.has(n.source_group_id)?r.get(n.source_group_id).add(a):i.add(a)}var FFt=(n,e)=>{let{injectionDb:t,subcircuit:i,groupsMap:r}=e,s=[],o=n.source_group_id;for(;o&&o!==i.source_group_id;){let a=t.source_group.get(o),c=r?.get(o);if(!a||!c)break;let l=c.props.name??c.fallbackUnassignedName;s.unshift(`.${l}`),o=a.parent_source_group_id}return s.push(`.${n.name}`),s.join(" > ")};function $Ft(n,e){let{injectionDb:t,subcircuit:i}=e,r=[];for(let o of n.connected_source_port_ids){let a=t.source_port.get(o);if(!a)continue;let c;if(a.source_component_id){let l=t.source_component.get(a.source_component_id);l&&(c=`${FFt({name:l.name,source_group_id:l.source_group_id},e)} > .${a.name}`)}else c=`.${a.name}`;c&&r.push(c)}for(let o of n.connected_source_net_ids){let a=t.source_net.get(o);a&&r.push(`net.${a.name}`)}if(r.length<2)return;let s=new zs({path:r});s.source_trace_id=n.source_trace_id,i.add(s)}var B9=class extends Bn{constructor(){super(...arguments);f(this,"emitter",this.portMap.pin1);f(this,"collector",this.portMap.pin2);f(this,"base",this.portMap.pin3)}get config(){let e=this.props.type==="npn"?"npn_bipolar_transistor":"pnp_bipolar_transistor";return{componentName:"Transistor",schematicSymbolName:this.props.symbolName??e,zodProps:wH,sourceFtype:"simple_transistor",shouldRenderAsSchematicBox:!1}}initPorts(){let e={pin1:["collector","c"],pin2:["emitter","e"],pin3:["base","b"]};super.initPorts({pinCount:3,additionalAliases:e})}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=e.source_component.insert({ftype:"simple_transistor",name:this.name,transistor_type:t.type});this.source_component_id=i.source_component_id}};function zFt(n,e){let{injectionDb:t,subcircuit:i,groupsMap:r}=e,s=t.pcb_component.getWhere({source_component_id:n.source_component_id}),o=t.cad_component.getWhere({source_component_id:n.source_component_id}),a=new B9({name:n.name,type:n.transistor_type,layer:s?.layer,pcbX:s?.center?.x,pcbY:s?.center?.y,pcbRotation:s?.rotation,doNotPlace:s?.do_not_place,obstructsWithinBounds:s?.obstructs_within_bounds});s&&K_(s,{...e,normalComponent:a}),n.source_group_id&&r?.has(n.source_group_id)?r.get(n.source_group_id).add(a):i.add(a)}var qnt=(n,e,t)=>{if(!e)return;let i=Ke(e);if(e&&t?.length>0)throw new Error("Component cannot have both circuitJson and children");let s={injectionDb:i,subcircuit:n,groupsMap:new Map},o=i.source_group.list();for(let p of o)AFt(p,s);let a=i.pcb_board.list();for(let p of a)TFt(p,s);let c=i.source_component.list();for(let p of c)switch(p.ftype){case"simple_resistor":LFt(p,s);break;case"simple_capacitor":MFt(p,s);break;case"simple_inductor":RFt(p,s);break;case"simple_diode":NFt(p,s);break;case"simple_chip":IFt(p,s);break;case"simple_transistor":zFt(p,s);break;default:throw new Error(`No inflator implemented for source component ftype: "${p.ftype}"`)}let l=i.source_port.list();for(let p of l)OFt(p,s);let u=i.source_trace.list();for(let p of u)$Ft(p,s)},DFt=.01,_nt=(n,e,t)=>{let i=n/2,r=e/2,s=Math.min(t,i,r);if(s<DFt)return[{x:-i,y:-r},{x:i,y:-r},{x:i,y:r},{x:-i,y:r}];let a=Math.max(1,Math.ceil(Math.PI/2*s/.1)),c=Math.PI/2/a,l=[];l.push({x:-i+s,y:-r}),l.push({x:i-s,y:-r});for(let u=1;u<=a;u++){let p=-Math.PI/2+u*c;l.push({x:i-s+s*Math.cos(p),y:-r+s+s*Math.sin(p)})}l.push({x:i,y:r-s});for(let u=1;u<=a;u++){let p=0+u*c;l.push({x:i-s+s*Math.cos(p),y:r-s+s*Math.sin(p)})}l.push({x:-i+s,y:r});for(let u=1;u<=a;u++){let p=Math.PI/2+u*c;l.push({x:-i+s+s*Math.cos(p),y:r-s+s*Math.sin(p)})}l.push({x:-i,y:-r+s});for(let u=1;u<=a;u++){let p=Math.PI+u*c;l.push({x:-i+s+s*Math.cos(p),y:-r+s+s*Math.sin(p)})}return l},gP=class extends Sl{constructor(){super(...arguments);f(this,"pcb_board_id",null);f(this,"source_board_id",null);f(this,"_drcChecksComplete",!1);f(this,"_connectedSchematicPortPairs",new Set)}get isSubcircuit(){return!0}get isGroup(){return!0}get config(){return{componentName:"Board",zodProps:T4}}get boardThickness(){return this._parsedProps.thickness??1.4}get allLayers(){return(this._parsedProps.layers??2)===4?["top","bottom","inner1","inner2"]:["top","bottom"]}_getSubcircuitLayerCount(){return this._parsedProps.layers??2}_getBoardCalcVariables(){let{_parsedProps:e}=this;if((e.width==null||e.height==null)&&!e.outline)return{};let i=this.pcb_board_id?this.root?.db.pcb_board.get(this.pcb_board_id):null,r=i?.width??e.width,s=i?.height??e.height;if((r==null||s==null)&&e.outline?.length){let p=co(e.outline);p&&(r??(r=p.maxX-p.minX),s??(s=p.maxY-p.minY))}let{pcbX:o,pcbY:a}=this.getResolvedPcbPositionProp(),c=i?.center??{x:o+(e.outlineOffsetX??0),y:a+(e.outlineOffsetY??0)},l=r??0,u=s??0;return{"board.minx":c.x-l/2,"board.maxx":c.x+l/2,"board.miny":c.y-u/2,"board.maxy":c.y+u/2}}doInitialPcbBoardAutoSize(){if(this.root?.pcbDisabled||!this.pcb_board_id)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalPcbPositionBeforeLayout(),r=e.pcb_board.get(this.pcb_board_id);if(r?.width&&r?.height||r?.outline&&r.outline.length>0)return;let s=1/0,o=1/0,a=-1/0,c=-1/0,l=Bnt(e,this.subcircuit_id),u=new Set([this.subcircuit_id,...l]),p=e.pcb_component.list().filter(C=>C.subcircuit_id&&u.has(C.subcircuit_id)),d=e.pcb_group.list().filter(C=>C.subcircuit_id&&u.has(C.subcircuit_id)),_=!1,g=(C,M,A)=>{M===0||A===0||(_=!0,s=Math.min(s,C.x-M/2),o=Math.min(o,C.y-A/2),a=Math.max(a,C.x+M/2),c=Math.max(c,C.y+A/2))};for(let C of p)g(C.center,C.width,C.height);for(let C of d){let M=C.width??0,A=C.height??0;if(C.outline&&C.outline.length>0){let R=co(C.outline);R&&(M=R.maxX-R.minX,A=R.maxY-R.minY)}g(C.center,M,A)}if(t.boardAnchorPosition){let{x:C,y:M}=t.boardAnchorPosition;s=Math.min(s,C),o=Math.min(o,M),a=Math.max(a,C),c=Math.max(c,M)}let x=2,v=_?a-s+x*2:0,S=_?c-o+x*2:0,P={x:_?(s+a)/2+(t.outlineOffsetX??0):(t.outlineOffsetX??0)+i.x,y:_?(o+c)/2+(t.outlineOffsetY??0):(t.outlineOffsetY??0)+i.y},T=t.width??v,k=t.height??S,N=t.outline;!N&&t.borderRadius!=null&&T>0&&k>0&&(N=_nt(T,k,t.borderRadius));let E={width:T,height:k,center:P};N&&(E.outline=N.map(C=>({x:C.x+(t.outlineOffsetX??0),y:C.y+(t.outlineOffsetY??0)}))),e.pcb_board.update(this.pcb_board_id,E)}updatePcbBoardAutoSize(){this.doInitialPcbBoardAutoSize()}_addBoardInformationToSilkscreen(){let e=this.root?.platform;if(!e?.printBoardInformationToSilkscreen)return;let t=this.root.db.pcb_board.get(this.pcb_board_id);if(!t)return;let i=[];if(e.projectName&&i.push(e.projectName),e.version&&i.push(`v${e.version}`),e.url&&i.push(e.url),i.length===0)return;let r=i.join(`
|
|
253
|
-
`),a={x:t.center.x+t.width/2-.25,y:t.center.y-t.height/2+1};this.root.db.pcb_silkscreen_text.insert({pcb_component_id:this.pcb_board_id,layer:"top",font:"tscircuit2024",font_size:.45,text:r,ccw_rotation:0,anchor_alignment:"bottom_right",anchor_position:a})}doInitialSourceRender(){super.doInitialSourceRender();let{db:e}=this.root,t=e.source_board.insert({source_group_id:this.source_group_id,title:this.props.title||this.props.name});this.source_board_id=t.source_board_id}doInitialInflateSubcircuitCircuitJson(){let{circuitJson:e,children:t}=this._parsedProps;qnt(this,e,t)}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,r=t.circuitJson?.find(_=>_.type==="pcb_board"),s=t.width??r?.width??0,o=t.height??r?.height??0,a=this._getGlobalPcbPositionBeforeLayout(),c={x:a.x+(t.outlineOffsetX??0),y:a.y+(t.outlineOffsetY??0)},{boardAnchorPosition:l,boardAnchorAlignment:u}=t;if(l&&(c=M7t({boardAnchorPosition:l,boardAnchorAlignment:u??"center",width:s,height:o})),t.outline){let _=t.outline.map(T=>T.x),g=t.outline.map(T=>T.y),x=Math.min(..._),v=Math.max(..._),S=Math.min(...g),P=Math.max(...g);s=v-x,o=P-S,c={x:(x+v)/2+(t.outlineOffsetX??0),y:(S+P)/2+(t.outlineOffsetY??0)}}let p=t.outline;!p&&t.borderRadius!=null&&s>0&&o>0&&(p=_nt(s,o,t.borderRadius));let d=e.pcb_board.insert({center:c,thickness:this.boardThickness,num_layers:this.allLayers.length,width:s,height:o,outline:p?.map(_=>({x:_.x+(t.outlineOffsetX??0),y:_.y+(t.outlineOffsetY??0)})),material:t.material});this.pcb_board_id=d.pcb_board_id,this._addBoardInformationToSilkscreen()}removePcbComponentRender(){let{db:e}=this.root;this.pcb_board_id&&(e.pcb_board.delete(this.pcb_board_id),this.pcb_board_id=null)}doInitialPcbDesignRuleChecks(){this.root?.pcbDisabled||this.getInheritedProperty("routingDisabled")||super.doInitialPcbDesignRuleChecks()}updatePcbDesignRuleChecks(){if(this.root?.pcbDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:e}=this.root;if(!this._areChildSubcircuitsRouted()||this._drcChecksComplete)return;this._drcChecksComplete=!0;let t=mtt(e.toArray());for(let u of t)e.pcb_trace_error.insert(u);let i=ftt(e.toArray());for(let u of i)e.pcb_port_not_connected_error.insert(u);let r=gtt(e.toArray());for(let u of r)e.pcb_component_outside_board_error.insert(u);let s=vtt(e.toArray());for(let u of s)e.pcb_trace_error.insert(u);let o=btt(e.toArray());for(let u of o)e.pcb_via_clearance_error.insert(u);let a=xtt(e.toArray());for(let u of a)e.pcb_via_clearance_error.insert(u);let c=wtt(e.toArray());for(let u of c)e.pcb_footprint_overlap_error.insert(u);let l=Stt(e.toArray());for(let u of l)e.source_pin_must_be_connected_error.insert(u)}_emitRenderLifecycleEvent(e,t){super._emitRenderLifecycleEvent(e,t),t==="start"&&this.root?.emit("board:renderPhaseStarted",{renderId:this._renderId,phase:e})}},ynt=5,jFt=5,gnt=2;function BFt(n,e){let t=n.center.x-n.width/2,i=n.center.x+n.width/2,r=n.center.y-n.height/2,s=n.center.y+n.height/2,o=e.center.x-e.width/2,a=e.center.x+e.width/2,c=e.center.y-e.height/2,l=e.center.y+e.height/2;return!(i<=o||t>=a||s<=c||r>=l)}function YFt(n,e,t){let i=t.center.x-t.width/2,r=t.center.x+t.width/2,s=t.center.y-t.height/2,o=t.center.y+t.height/2,a=Math.max(i,Math.min(n.x,r)),c=Math.max(s,Math.min(n.y,o)),l=n.x-a,u=n.y-c;return l*l+u*u<=e*e}function XFt({board:n,edge:e,otherBoards:t,options:i}){let r=[];if(!n.width||!n.height)return r;let s=n.center.x-n.width/2,o=n.center.x+n.width/2,a=n.center.y-n.height/2,c=n.center.y+n.height/2,l,u,p;e==="top"||e==="bottom"?(l=n.width,u=!0,p=e==="top"?c:a):(l=n.height,u=!1,p=e==="right"?o:s);let d=i.tabLength,_=i.boardGap;if(i.mouseBites){let P=i.tabWidth*.45,T=P*.1,k=Math.max(2,Math.ceil(i.tabLength/2));_=(k*P+(k-1)*T)*1.1}let g=Math.floor((l-_)/(d+_));if(g<1&&l>=d&&(g=1),g===0)return r;let x=_,v=-l/2,S=l/2;for(let P=0;P<g;P++){let T=v+x+P*(d+x)+d/2,k=P===0,N=P===g-1,E=k||N,C=T-d/2,M=T+d/2;if(E&&(k&&(C=v),N&&(M=S)),C=Math.max(C,v),M=Math.min(M,S),E&&(k&&(C-=i.tabWidth),N&&(M+=i.tabWidth)),M<=C)continue;let A=(C+M)/2,R=M-C,B=e==="top"||e==="right"?i.tabWidth/2:-i.tabWidth/2,D=u?{x:n.center.x+A,y:p+B}:{x:p+B,y:n.center.y+A},U=u?R:i.tabWidth,X=u?i.tabWidth:R,W={center:D,width:U,height:X,boardId:`${n.center.x}_${n.center.y}`},J=!1;for(let nt of t){if(!nt.width||!nt.height)continue;let ft={center:nt.center,width:nt.width,height:nt.height};if(BFt(W,ft)){J=!0;break}}J&&!E||r.push(W)}return r}function UFt({board:n,edge:e,edgeTabs:t,allBoards:i,options:r}){let s=[];if(t.length===0||!n.width||!n.height)return s;let o=n.center.x-n.width/2,a=n.center.x+n.width/2,c=n.center.y-n.height/2,l=n.center.y+n.height/2,u=e==="top"||e==="bottom",p=r.tabWidth*.45,d=p*.1,_=Math.max(2,Math.ceil(r.tabLength/2)),g,x=p/2;e==="top"?g=l:e==="bottom"?g=c:e==="right"?g=a:g=o;let v=[...t].sort((S,P)=>u?S.center.x-P.center.x:S.center.y-P.center.y);for(let S=0;S<v.length-1;S++){let P=v[S],T=v[S+1],k,N;u?(k=P.center.x+P.width/2,N=T.center.x-T.width/2):(k=P.center.y+P.height/2,N=T.center.y-T.height/2);let E=N-k,C=_*p,M=(_-1)*d;if(E<C+M)continue;let A=(k+N)/2;for(let R=0;R<_;R++){let B=(R-(_-1)/2)*(p+d),D=u?{x:A+B,y:g}:{x:g,y:A+B},U=p/2,X=!1;for(let W of i){if(!W.width||!W.height)continue;let J={center:W.center,width:W.width,height:W.height};if(YFt(D,U,J)){X=!0;break}}X||s.push(D)}}return s}function VFt(n,e){let t=[],i=[];for(let a=0;a<n.length;a++){let c=n[a],l=n.filter((u,p)=>p!==a);for(let u of["top","bottom","left","right"]){let p=XFt({board:c,edge:u,otherBoards:l,options:e});if(t.push(...p),e.mouseBites){let d=UFt({board:c,edge:u,edgeTabs:p,allBoards:l,options:e});i.push(...d)}}}let r=t.map((a,c)=>{let l=Math.min(a.width,a.height);return{type:"pcb_cutout",pcb_cutout_id:`panel_tab_${c}`,shape:"rect",center:a.center,width:a.width,height:a.height,corner_radius:l/2}}),s=e.tabWidth*.45,o=i.map((a,c)=>({type:"pcb_hole",pcb_hole_id:`panel_mouse_bite_${c}`,hole_shape:"circle",hole_diameter:s,x:a.x,y:a.y}));return{tabCutouts:r,mouseBiteHoles:o}}var Znt=class extends Sl{constructor(){super(...arguments);f(this,"pcb_panel_id",null);f(this,"_tabsAndMouseBitesGenerated",!1)}get config(){return{componentName:"Panel",zodProps:KW}}get isGroup(){return!0}get isSubcircuit(){return!0}add(e){if(e.lowercaseComponentName!=="board")throw new Error("<panel> can only contain <board> elements");super.add(e)}doInitialPanelLayout(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,t=this.children.filter(a=>a instanceof gP),i=t.some(a=>a.props.pcbX!==void 0||a.props.pcbY!==void 0),r=t.filter(a=>a.props.pcbX===void 0&&a.props.pcbY===void 0);if(r.length>0&&!i){let a=this._parsedProps.tabWidth??gnt,c=this._parsedProps.boardGap??a,l=Math.ceil(Math.sqrt(r.length)),u=Math.ceil(r.length/l),p=Array(l).fill(0),d=Array(u).fill(0);r.forEach((D,U)=>{let X=U%l,W=Math.floor(U/l),J=e.pcb_board.get(D.pcb_board_id);!J||J.width===void 0||J.height===void 0||(p[X]=Math.max(p[X],J.width),d[W]=Math.max(d[W],J.height))});let _=p.reduce((D,U)=>D+U,0)+(l>1?(l-1)*c:0),g=d.reduce((D,U)=>D+U,0)+(u>1?(u-1)*c:0),x=-_/2,S=[-g/2];for(let D=0;D<u-1;D++)S.push(S[D]+d[D]+c);let P=[x];for(let D=0;D<l-1;D++)P.push(P[D]+p[D]+c);let T=this._getGlobalPcbPositionBeforeLayout();r.forEach((D,U)=>{let X=U%l,W=Math.floor(U/l),J=e.pcb_board.get(D.pcb_board_id);if(!J||!J.width||!J.height)return;let nt=P[X]+p[X]/2,ft=S[W]+d[W]/2,G=T.x+nt,et=T.y+ft;D._repositionOnPcb({x:G,y:et}),e.pcb_board.update(D.pcb_board_id,{center:{x:G,y:et}})});let k=t.map(D=>D.pcb_board_id).filter(D=>!!D),N=e.pcb_board.list().filter(D=>k.includes(D.pcb_board_id)),E=1/0,C=1/0,M=-1/0,A=-1/0;for(let D of N){if(D.width===void 0||D.height===void 0||!isFinite(D.width)||!isFinite(D.height))continue;let U=D.center.x-D.width/2,X=D.center.x+D.width/2,W=D.center.y-D.height/2,J=D.center.y+D.height/2;E=Math.min(E,U),M=Math.max(M,X),C=Math.min(C,W),A=Math.max(A,J)}let R=this._parsedProps.width!==void 0,B=this._parsedProps.height!==void 0;if(R&&B)e.pcb_panel.update(this.pcb_panel_id,{width:V.parse(this._parsedProps.width),height:V.parse(this._parsedProps.height)});else if(isFinite(E)){let D=M-E,U=A-C;e.pcb_panel.update(this.pcb_panel_id,{width:R?V.parse(this._parsedProps.width):D+2*ynt,height:B?V.parse(this._parsedProps.height):U+2*ynt})}}if(this._tabsAndMouseBitesGenerated)return;let s=this._parsedProps;if((s.panelizationMethod??"tab-routing")!=="none"){let a=t.map(_=>_.pcb_board_id).filter(_=>!!_),c=e.pcb_board.list().filter(_=>a.includes(_.pcb_board_id));if(c.length===0)return;let l=s.tabWidth??gnt,u=s.boardGap??l,{tabCutouts:p,mouseBiteHoles:d}=VFt(c,{boardGap:u,tabWidth:l,tabLength:s.tabLength??jFt,mouseBites:s.mouseBites??!0});for(let _ of p)e.pcb_cutout.insert(_);for(let _ of d)e.pcb_hole.insert(_)}this._tabsAndMouseBitesGenerated=!0}runRenderCycle(){if(!this.children.some(e=>e.componentName==="Board"))throw new Error("<panel> must contain at least one <board>");super.runRenderCycle()}doInitialPcbComponentRender(){if(super.doInitialPcbComponentRender(),this.root?.pcbDisabled)return;let{db:e}=this.root,t=this._parsedProps,i=e.pcb_panel.insert({width:t.width!==void 0?V.parse(t.width):0,height:t.height!==void 0?V.parse(t.height):0,center:this._getGlobalPcbPositionBeforeLayout(),covered_with_solder_mask:!(t.noSolderMask??!1)});this.pcb_panel_id=i.pcb_panel_id}updatePcbComponentRender(){if(this.root?.pcbDisabled||!this.pcb_panel_id)return;let{db:e}=this.root,t=this._parsedProps,i=e.pcb_panel.get(this.pcb_panel_id);e.pcb_panel.update(this.pcb_panel_id,{width:t.width!==void 0?V.parse(t.width):i?.width,height:t.height!==void 0?V.parse(t.height):i?.height,center:this._getGlobalPcbPositionBeforeLayout(),covered_with_solder_mask:!(t.noSolderMask??!1)})}removePcbComponentRender(){this.pcb_panel_id&&(this.root?.db.pcb_panel.delete(this.pcb_panel_id),this.pcb_panel_id=null)}},Knt=class extends q1{constructor(n){super(n)}get config(){return{...super.config,componentName:"Pinout",zodProps:JW}}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=n.source_component.insert({ftype:"simple_pinout",name:this.name,manufacturer_part_number:e.manufacturerPartNumber,supplier_part_numbers:e.supplierPartNumbers});this.source_component_id=t.source_component_id}},Jnt=class extends Bn{get config(){return{componentName:"fuse",schematicSymbolName:this.props.symbolName??"fuse",zodProps:eH,sourceFtype:Ha.simple_fuse}}_getSchematicSymbolDisplayValue(){let n=this._parsedProps.currentRating,e=this._parsedProps.voltageRating,t=typeof n=="string"?parseFloat(n):n,i=typeof e=="string"?parseFloat(e):e;return`${bi(t)}A / ${bi(i)}V`}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=typeof e.currentRating=="string"?parseFloat(e.currentRating):e.currentRating,i=typeof e.voltageRating=="string"?parseFloat(e.voltageRating):e.voltageRating,r=n.source_component.insert({name:this.name,ftype:Ha.simple_fuse,current_rating_amps:t,voltage_rating_volts:i,display_current_rating:`${bi(t)}A`,display_voltage_rating:`${bi(i)}V`});this.source_component_id=r.source_component_id}},Qnt=class extends Bn{constructor(){super(...arguments);f(this,"schematicDimensions",null)}get config(){return{schematicSymbolName:void 0,componentName:"Jumper",zodProps:E4,shouldRenderAsSchematicBox:!0}}_getSchematicPortArrangement(){let e=super._getSchematicPortArrangement();if(e&&Object.keys(e).length>0)return e;let t=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:this.getPortsFromFootprint().length),i=this._parsedProps.schDirection??"right";return{leftSize:i==="left"?t:0,rightSize:i==="right"?t:0}}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),s=e.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:t.manufacturerPartNumber,supplier_part_numbers:t.supplierPartNumbers,are_pins_interchangeable:!0});this.source_component_id=s.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),s=e.pcb_component.insert({center:{x:i,y:r},width:2,height:3,layer:t.layer??"top",rotation:t.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:t.doNotPlace??!1,obstructs_within_bounds:t.obstructsWithinBounds??!0});this.pcb_component_id=s.pcb_component_id}doInitialPcbTraceRender(){let{db:e}=this.root,t=e.pcb_port.list({pcb_component_id:this.pcb_component_id}),i={};for(let o=0;o<t.length;o++){let a=t[o],c=e.source_port.get(a.source_port_id),l="";if(typeof c?.pin_number=="number")l=c.pin_number.toString();else if(Array.isArray(c?.port_hints)){let u=c.port_hints.find(p=>/^(pin)?\d+$/.test(p));u&&(/^pin\d+$/.test(u)?l=u.replace(/^pin/,""):l=u)}i[l]=a.pcb_port_id}let r=e.pcb_trace.list({pcb_component_id:this.pcb_component_id}),s=o=>{if(o&&typeof o=="string"&&o.startsWith("{PIN")){let a=o.replace("{PIN","").replace("}","");return i[a]||o}return o};for(let o of r)if(o.route)for(let a of o.route)a.route_type==="wire"&&(a.start_pcb_port_id=s(a.start_pcb_port_id),a.end_pcb_port_id=s(a.end_pcb_port_id))}},GFt={"0603":"0603","0805":"0805",1206:"1206"},tit=class extends Bn{get config(){return{componentName:"Interconnect",zodProps:tH,shouldRenderAsSchematicBox:!0,sourceFtype:"interconnect"}}_getImpliedFootprintString(){let{standard:n}=this._parsedProps;return n?GFt[n]??null:null}doInitialSourceRender(){let{db:n}=this.root,e=n.source_component.insert({ftype:"interconnect",name:this.name,are_pins_interchangeable:!0});this.source_component_id=e.source_component_id}},eit=class extends Bn{constructor(){super(...arguments);f(this,"schematicDimensions",null)}_getPinNumberFromBridgedPinName(e){return this.selectOne(`port.${e}`,{type:"port"})?._parsedProps.pinNumber??null}get defaultInternallyConnectedPinNames(){if(this._parsedProps.bridged){let e=this.children.filter(t=>t.componentName==="Port").map(t=>t.name);return e.length>0?[e]:[]}return this._parsedProps.bridgedPins??[]}get config(){let e=this._parsedProps??this.props,t=e.pinCount;if(e.pinCount==null&&!e.footprint&&(t=2),e.pinCount==null){let s=(e.bridgedPins??[]).flat().map(l=>this._getPinNumberFromBridgedPinName(l)).filter(l=>l!==null),o=s.length>0?Math.max(...s):0,a=e.pinLabels?Object.keys(e.pinLabels).length:0,c=Math.max(o,a);(c===2||c===3)&&(t=c),t==null&&e.footprint&&[2,3].includes(this.getPortsFromFootprint().length)&&(t=this.getPortsFromFootprint().length)}let i="";t?i+=`solderjumper${t}`:i="solderjumper";let r=[];return Array.isArray(e.bridgedPins)&&e.bridgedPins.length>0?r=Array.from(new Set(e.bridgedPins.flat().map(s=>this._getPinNumberFromBridgedPinName(s)).filter(s=>s!==null))).sort((s,o)=>s-o):e.bridged&&t&&(r=Array.from({length:t},(s,o)=>o+1)),r.length>0&&(i+=`_bridged${r.join("")}`),{schematicSymbolName:e.symbolName??i,componentName:"SolderJumper",zodProps:QW,shouldRenderAsSchematicBox:!0}}_getSchematicPortArrangement(){let e=super._getSchematicPortArrangement();if(e&&Object.keys(e).length>0)return e;let t=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:this.getPortsFromFootprint().length);t==null&&!this._parsedProps.footprint&&(t=2);let i=this._parsedProps.schDirection??"right";return{leftSize:i==="left"?t:0,rightSize:i==="right"?t:0}}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),s=e.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:t.manufacturerPartNumber,supplier_part_numbers:t.supplierPartNumbers,are_pins_interchangeable:!0});this.source_component_id=s.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),s=e.pcb_component.insert({center:{x:i,y:r},width:2,height:3,layer:t.layer??"top",rotation:t.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:t.doNotPlace??!1,obstructs_within_bounds:t.obstructsWithinBounds??!0});this.pcb_component_id=s.pcb_component_id}doInitialPcbTraceRender(){let{db:e}=this.root,t=e.pcb_port.list({pcb_component_id:this.pcb_component_id}),i={};for(let o=0;o<t.length;o++){let a=t[o],c=e.source_port.get(a.source_port_id),l="";if(typeof c?.pin_number=="number")l=c.pin_number.toString();else if(Array.isArray(c?.port_hints)){let u=c.port_hints.find(p=>/^(pin)?\d+$/.test(p));u&&(/^pin\d+$/.test(u)?l=u.replace(/^pin/,""):l=u)}i[l]=a.pcb_port_id}let r=e.pcb_trace.list({pcb_component_id:this.pcb_component_id}),s=o=>{if(o&&typeof o=="string"&&o.startsWith("{PIN")){let a=o.replace("{PIN","").replace("}","");return i[a]||o}return o};for(let o of r)if(o.route)for(let a of o.route)a.route_type==="wire"&&(a.start_pcb_port_id=s(a.start_pcb_port_id),a.end_pcb_port_id=s(a.end_pcb_port_id))}},nit=class extends Bn{constructor(){super(...arguments);f(this,"pos",this.portMap.pin1);f(this,"anode",this.portMap.pin1);f(this,"neg",this.portMap.pin2);f(this,"cathode",this.portMap.pin2)}get config(){let e={laser:"laser_diode"},t=this.props.laser?"laser":null;return{schematicSymbolName:t?e[t]:this.props.symbolName??"led",componentName:"Led",zodProps:EH,sourceFtype:"simple_led"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return this._parsedProps.schDisplayValue||this._parsedProps.color||void 0}getFootprinterString(){let e=super.getFootprinterString();return e&&this.props.color?`${e}_color(${this.props.color})`:e}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=e.source_component.insert({ftype:"simple_led",name:this.name,wave_length:t.wavelength,color:t.color,symbol_display_value:this._getSchematicSymbolDisplayValue(),manufacturer_part_number:t.manufacturerPartNumber??t.mfn,supplier_part_numbers:t.supplierPartNumbers,are_pins_interchangeable:!1});this.source_component_id=i.source_component_id}},iit=class extends Bn{constructor(){super(...arguments);f(this,"pos",this.portMap.pin1);f(this,"positive",this.portMap.pin1);f(this,"neg",this.portMap.pin2);f(this,"negative",this.portMap.pin2)}get config(){return{schematicSymbolName:this.props.symbolName??"power_factor_meter_horz",componentName:"PowerSource",zodProps:BH,sourceFtype:"simple_power_source"}}initPorts(){this.add(new Wi({name:"pin1",pinNumber:1,aliases:["positive","pos"]})),this.add(new Wi({name:"pin2",pinNumber:2,aliases:["negative","neg"]}))}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=e.source_component.insert({ftype:"simple_power_source",name:this.name,voltage:t.voltage,supplier_part_numbers:t.supplierPartNumbers,are_pins_interchangeable:!1});this.source_component_id=i.source_component_id}},rit=class extends Bn{constructor(){super(...arguments);f(this,"terminal1",this.portMap.terminal1);f(this,"terminal2",this.portMap.terminal2)}get config(){return{componentName:"VoltageSource",schematicSymbolName:this.props.waveShape==="square"?"square_wave":"ac_voltmeter",zodProps:YH,sourceFtype:"simple_voltage_source"}}runRenderPhaseForChildren(e){if(!e.startsWith("Pcb"))for(let t of this.children)t.runRenderPhaseForChildren(e),t.runRenderPhase(e)}doInitialPcbComponentRender(){}initPorts(){super.initPorts({additionalAliases:{pin1:["terminal1"],pin2:["terminal2"]}})}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=e.source_component.insert({ftype:"simple_voltage_source",name:this.name,voltage:t.voltage,frequency:t.frequency,peak_to_peak_voltage:t.peakToPeakVoltage,wave_shape:t.waveShape,phase:t.phase,duty_cycle:t.dutyCycle,supplier_part_numbers:t.supplierPartNumbers,are_pins_interchangeable:!0});this.source_component_id=i.source_component_id}doInitialSimulationRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=this.portMap.terminal1,r=this.portMap.terminal2;e.simulation_voltage_source.insert({type:"simulation_voltage_source",is_dc_source:!1,terminal1_source_port_id:i.source_port_id,terminal2_source_port_id:r.source_port_id,voltage:t.voltage,frequency:t.frequency,peak_to_peak_voltage:t.peakToPeakVoltage,wave_shape:t.waveShape,phase:t.phase,duty_cycle:t.dutyCycle})}},WFt=["leftedge","rightedge","topedge","bottomedge","center"],sit=class extends Me{get config(){return{componentName:"Constraint",zodProps:uH}}constructor(n){if(super(n),("xdist"in n||"ydist"in n)&&!("edgeToEdge"in n)&&!("centerToCenter"in n))throw new Error(`edgeToEdge, centerToCenter must be set for xDist or yDist for ${this}`);if("for"in n&&n.for.length<2)throw new Error(`"for" must have at least two selectors for ${this}`)}_getAllReferencedComponents(){let n=[],e=this.getPrimitiveContainer();function t(i){let r=i.split(" ").pop(),s=WFt.includes(r)?r:void 0,o=s?i.replace(` ${s}`,""):i,a=e.selectOne(o,{pcbPrimitive:!0});a&&n.push({selector:i,component:a,componentSelector:o,edge:s})}for(let i of["left","right","top","bottom"])i in this._parsedProps&&t(this._parsedProps[i]);if("for"in this._parsedProps)for(let i of this._parsedProps.for)t(i);return{componentsWithSelectors:n}}},oit=class extends Me{constructor(){super(...arguments);f(this,"fabrication_note_rect_id",null)}get config(){return{componentName:"FabricationNoteRect",zodProps:NH}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),{maybeFlipLayer:s}=this._getPcbPrimitiveFlippedHelpers(),o=s(t.layer??"top");if(o!=="top"&&o!=="bottom")throw new Error(`Invalid layer "${o}" for FabricationNoteRect. Must be "top" or "bottom".`);let a=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,c=this.getSubcircuit(),l=t.hasStroke??(t.strokeWidth!==void 0&&t.strokeWidth!==null),u=e.pcb_fabrication_note_rect.insert({pcb_component_id:a,layer:o,color:t.color,center:{x:i,y:r},width:t.width,height:t.height,stroke_width:t.strokeWidth??1,is_filled:t.isFilled??!1,has_stroke:l,is_stroke_dashed:t.isStrokeDashed??!1,subcircuit_id:c?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,corner_radius:t.cornerRadius??void 0});this.fabrication_note_rect_id=u.pcb_fabrication_note_rect_id}getPcbSize(){let{_parsedProps:e}=this;return{width:e.width,height:e.height}}},ait=class extends Me{constructor(){super(...arguments);f(this,"fabrication_note_path_id",null)}get config(){return{componentName:"FabricationNotePath",zodProps:AH}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,t=this.getSubcircuit(),{_parsedProps:i}=this,r=i.layer??"top";if(r!=="top"&&r!=="bottom")throw new Error(`Invalid layer "${r}" for SilkscreenPath. Must be "top" or "bottom".`);let s=this._computePcbGlobalTransformBeforeLayout(),o=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,a=e.pcb_fabrication_note_path.insert({pcb_component_id:o,layer:r,color:i.color,route:i.route.map(c=>{let l=De(s,{x:c.x,y:c.y});return{...c,x:l.x,y:l.y}}),stroke_width:i.strokeWidth??.1,subcircuit_id:t?.subcircuit_id??void 0});this.fabrication_note_path_id=a.pcb_fabrication_note_path_id}},cit=class extends Me{get config(){return{componentName:"FabricationNoteText",zodProps:IH}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:n}=this.root,{_parsedProps:e}=this,{pcbX:t,pcbY:i}=this.getResolvedPcbPositionProp(),r=this.getPrimitiveContainer(),s=this.getSubcircuit();n.pcb_fabrication_note_text.insert({anchor_alignment:e.anchorAlignment,anchor_position:{x:t,y:i},font:e.font??"tscircuit2024",font_size:e.fontSize??1,layer:"top",color:e.color,text:dP(e.text??""),pcb_component_id:r.pcb_component_id,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}},lit=class extends Me{constructor(){super(...arguments);f(this,"fabrication_note_dimension_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteDimension",zodProps:RH}}_resolvePoint(e,t){if(typeof e=="string"){let s=this.getSubcircuit().selectOne(e);return s?s._getGlobalPcbPositionBeforeLayout():(this.renderError(`FabricationNoteDimension could not find selector "${e}"`),De(t,{x:0,y:0}))}let i=typeof e.x=="string"?parseFloat(e.x):e.x,r=typeof e.y=="string"?parseFloat(e.y):e.y;return De(t,{x:i,y:r})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._computePcbGlobalTransformBeforeLayout(),r=this._resolvePoint(t.from,i),s=this._resolvePoint(t.to,i),o=this.getSubcircuit(),a=this.getGroup(),{maybeFlipLayer:c}=this._getPcbPrimitiveFlippedHelpers(),l=c(t.layer??"top");if(l!=="top"&&l!=="bottom")throw new Error(`Invalid layer "${l}" for FabricationNoteDimension. Must be "top" or "bottom".`);let u=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,p=t.text??this._formatDistanceText({from:r,to:s,units:t.units??"mm"}),d=e.pcb_fabrication_note_dimension.insert({pcb_component_id:u,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:a?.pcb_group_id??void 0,layer:l,from:r,to:s,text:p,offset:t.offset,font:t.font??"tscircuit2024",font_size:t.fontSize??1,color:t.color,arrow_size:t.arrowSize??1});this.fabrication_note_dimension_id=d.pcb_fabrication_note_dimension_id}getPcbSize(){let e=this._computePcbGlobalTransformBeforeLayout(),t=this._resolvePoint(this._parsedProps.from,e),i=this._resolvePoint(this._parsedProps.to,e);return{width:Math.abs(i.x-t.x),height:Math.abs(i.y-t.y)}}_formatDistanceText({from:e,to:t,units:i}){let r=t.x-e.x,s=t.y-e.y,o=Math.sqrt(r*r+s*s),a=i==="in"?o/25.4:o,c=Math.round(a);if(Math.abs(a-c)<1e-9)return`${c}${i}`;let u=i==="in"?3:2;return`${i==="in"?Number(a.toFixed(u)).toString():a.toFixed(u)}${i}`}},uit=class extends Me{constructor(){super(...arguments);f(this,"pcb_note_line_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteLine",zodProps:cq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this.getSubcircuit(),r=this.getGroup(),s=this._computePcbGlobalTransformBeforeLayout(),o=De(s,{x:t.x1,y:t.y1}),a=De(s,{x:t.x2,y:t.y2}),c=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,l=e.pcb_note_line.insert({pcb_component_id:c,subcircuit_id:i?.subcircuit_id??void 0,pcb_group_id:r?.pcb_group_id??void 0,x1:o.x,y1:o.y,x2:a.x,y2:a.y,stroke_width:t.strokeWidth??.1,color:t.color,is_dashed:t.isDashed});this.pcb_note_line_id=l.pcb_note_line_id}getPcbSize(){let{_parsedProps:e}=this;return{width:Math.abs(e.x2-e.x1),height:Math.abs(e.y2-e.y1)}}},pit=class extends Me{constructor(){super(...arguments);f(this,"pcb_note_rect_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteRect",zodProps:oq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._computePcbGlobalTransformBeforeLayout(),r=De(i,{x:0,y:0}),s=this.getSubcircuit(),o=this.getGroup(),a=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,c=e.pcb_note_rect.insert({pcb_component_id:a,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:o?.pcb_group_id??void 0,center:r,width:t.width,height:t.height,stroke_width:t.strokeWidth??.1,is_filled:t.isFilled??!1,has_stroke:t.hasStroke??!0,is_stroke_dashed:t.isStrokeDashed??!1,color:t.color,corner_radius:t.cornerRadius??void 0});this.pcb_note_rect_id=c.pcb_note_rect_id}getPcbSize(){let{_parsedProps:e}=this,t=typeof e.width=="string"?parseFloat(e.width):e.width,i=typeof e.height=="string"?parseFloat(e.height):e.height;return{width:t,height:i}}},hit=class extends Me{constructor(){super(...arguments);f(this,"pcb_note_text_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteText",zodProps:sq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._computePcbGlobalTransformBeforeLayout(),r=De(i,{x:0,y:0}),s=this.getSubcircuit(),o=this.getGroup(),a=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,c=e.pcb_note_text.insert({pcb_component_id:a,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:o?.pcb_group_id??void 0,font:t.font??"tscircuit2024",font_size:t.fontSize??1,text:dP(t.text),anchor_position:r,anchor_alignment:t.anchorAlignment??"center",color:t.color});this.pcb_note_text_id=c.pcb_note_text_id}getPcbSize(){let{_parsedProps:e}=this,t=typeof e.fontSize=="string"?parseFloat(e.fontSize):e.fontSize??1,i=t*.6;return{width:e.text.length*i,height:t}}},dit=class extends Me{constructor(){super(...arguments);f(this,"pcb_note_path_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNotePath",zodProps:aq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._computePcbGlobalTransformBeforeLayout(),r=this.getSubcircuit(),s=this.getGroup(),o=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,a=t.route.map(l=>{let{x:u,y:p,...d}=l,_=typeof u=="string"?parseFloat(u):u,g=typeof p=="string"?parseFloat(p):p,x=De(i,{x:_,y:g});return{...d,x:x.x,y:x.y}}),c=e.pcb_note_path.insert({pcb_component_id:o,subcircuit_id:r?.subcircuit_id??void 0,pcb_group_id:s?.pcb_group_id??void 0,route:a,stroke_width:t.strokeWidth??.1,color:t.color});this.pcb_note_path_id=c.pcb_note_path_id}getPcbSize(){let{_parsedProps:e}=this;if(e.route.length===0)return{width:0,height:0};let t=e.route.map(c=>typeof c.x=="string"?parseFloat(c.x):c.x),i=e.route.map(c=>typeof c.y=="string"?parseFloat(c.y):c.y),r=Math.min(...t),s=Math.max(...t),o=Math.min(...i),a=Math.max(...i);return{width:s-r,height:a-o}}},fit=class extends Me{constructor(){super(...arguments);f(this,"pcb_note_dimension_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteDimension",zodProps:lq}}_resolvePoint(e,t){if(typeof e=="string"){let s=this.getSubcircuit().selectOne(`.${e}`);return s?s._getGlobalPcbPositionBeforeLayout():(this.renderError(`PcbNoteDimension could not find selector "${e}"`),De(t,{x:0,y:0}))}let i=typeof e.x=="string"?parseFloat(e.x):e.x,r=typeof e.y=="string"?parseFloat(e.y):e.y;return De(t,{x:i,y:r})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._computePcbGlobalTransformBeforeLayout(),r=this._resolvePoint(t.from,i),s=this._resolvePoint(t.to,i),o=this.getSubcircuit(),a=this.getGroup(),c=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,l=t.text??this._formatDistanceText({from:r,to:s,units:t.units??"mm"}),u=e.pcb_note_dimension.insert({pcb_component_id:c,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:a?.pcb_group_id??void 0,from:r,to:s,text:l,font:t.font??"tscircuit2024",font_size:t.fontSize??1,color:t.color,arrow_size:t.arrowSize??1});this.pcb_note_dimension_id=u.pcb_note_dimension_id}getPcbSize(){let e=this._computePcbGlobalTransformBeforeLayout(),t=this._resolvePoint(this._parsedProps.from,e),i=this._resolvePoint(this._parsedProps.to,e);return{width:Math.abs(i.x-t.x),height:Math.abs(i.y-t.y)}}_formatDistanceText({from:e,to:t,units:i}){let r=t.x-e.x,s=t.y-e.y,o=Math.sqrt(r*r+s*s),a=i==="in"?o/25.4:o,c=Math.round(a);if(Math.abs(a-c)<1e-9)return`${c}${i}`;let u=i==="in"?3:2;return`${i==="in"?Number(a.toFixed(u)).toString():a.toFixed(u)}${i}`}},mit=class extends Sl{constructor(n){super({...n,subcircuit:!0})}doInitialInflateSubcircuitCircuitJson(){let{circuitJson:n,children:e}=this._parsedProps;qnt(this,n,e)}},_it=class extends Sl{constructor(n){super({...n,subcircuit:!0})}doInitialPcbPrimitiveRender(){if(super.doInitialPcbPrimitiveRender(),this.root?.pcbDisabled)return;let{db:n}=this.root,e=this._parsedProps;if(!this.pcb_group_id)return;let t=n.pcb_group.get(this.pcb_group_id),i=e.paddingLeft??e.padding??0,r=e.paddingRight??e.padding??0,s=e.paddingTop??e.padding??0,o=e.paddingBottom??e.padding??0;n.pcb_group.update(this.pcb_group_id,{width:(t.width??0)+i+r,height:(t.height??0)+s+o,center:{x:t.center.x+(r-i)/2,y:t.center.y+(s-o)/2}})}},yit=class extends Me{constructor(){super(...arguments);f(this,"pcb_breakout_point_id",null);f(this,"matchedPort",null);f(this,"matchedNet",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"BreakoutPoint",zodProps:FH}}_matchConnection(){let{connection:e}=this._parsedProps,t=this.getSubcircuit();t&&(this.matchedPort=t.selectOne(e,{type:"port"}),this.matchedPort||(this.matchedNet=t.selectOne(e,{type:"net"})),!this.matchedPort&&!this.matchedNet&&this.renderError(`Could not find connection target "${e}"`))}_getSourceTraceIdForPort(e){let{db:t}=this.root;return t.source_trace.list().find(r=>r.connected_source_port_ids.includes(e.source_port_id))?.source_trace_id}_getSourceNetIdForPort(e){let{db:t}=this.root;return t.source_trace.list().find(r=>r.connected_source_port_ids.includes(e.source_port_id))?.connected_source_net_ids[0]}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root;this._matchConnection();let{pcbX:t,pcbY:i}=this.getResolvedPcbPositionProp(),r=this.parent?.getGroup(),s=this.getSubcircuit();if(!r||!r.pcb_group_id)return;let o=e.pcb_breakout_point.insert({pcb_group_id:r.pcb_group_id,subcircuit_id:s?.subcircuit_id??void 0,source_port_id:this.matchedPort?.source_port_id??void 0,source_trace_id:this.matchedPort?this._getSourceTraceIdForPort(this.matchedPort):void 0,source_net_id:this.matchedNet?this.matchedNet.source_net_id:this.matchedPort?this._getSourceNetIdForPort(this.matchedPort):void 0,x:t,y:i});this.pcb_breakout_point_id=o.pcb_breakout_point_id}_getPcbCircuitJsonBounds(){let{pcbX:e,pcbY:t}=this.getResolvedPcbPositionProp();return{center:{x:e,y:t},bounds:{left:e,top:t,right:e,bottom:t},width:0,height:0}}_setPositionFromLayout(e){let{db:t}=this.root;this.pcb_breakout_point_id&&t.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:e.x,y:e.y})}getPcbSize(){return{width:0,height:0}}},git=class extends Me{constructor(){super(...arguments);f(this,"source_net_label_id")}get config(){return{componentName:"NetLabel",zodProps:xH}}_getAnchorSide(){let{_parsedProps:e}=this;if(e.anchorSide)return e.anchorSide;if(!this._resolveConnectsTo())return"right";let i=this._getGlobalSchematicPositionBeforeLayout(),r=this._getConnectedPorts();if(r.length===0)return"right";let s=r[0]._getGlobalSchematicPositionBeforeLayout(),o=s.x-i.x,a=s.y-i.y;if(Math.abs(o)>Math.abs(a)){if(o>0)return"right";if(o<0)return"left"}else{if(a>0)return"top";if(a<0)return"bottom"}return"right"}_getConnectedPorts(){let e=this._resolveConnectsTo();if(!e)return[];let t=[];for(let i of e){let r=this.getSubcircuit().selectOne(i);r&&t.push(r)}return t}computeSchematicPropsTransform(){let{_parsedProps:e}=this;if(e.schX===void 0&&e.schY===void 0){let t=this._getConnectedPorts();if(t.length>0){let i=t[0]._getGlobalSchematicPositionBeforeLayout(),r=De(this.parent?.computeSchematicGlobalTransform?.()??Pr(),{x:0,y:0});return kn(i.x-r.x,i.y-r.y)}}return super.computeSchematicPropsTransform()}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalSchematicPositionBeforeLayout(),r=this.getSubcircuit().selectOne(`net.${this._getNetName()}`),s=t.anchorSide??"right",o=wl({anchor_position:i,anchor_side:s,text:t.net}),a=e.schematic_net_label.insert({text:t.net,source_net_id:r.source_net_id,anchor_position:i,center:o,anchor_side:this._getAnchorSide()});this.source_net_label_id=a.source_net_id}_resolveConnectsTo(){let{_parsedProps:e}=this,t=e.connectsTo??e.connection;if(Array.isArray(t))return t;if(typeof t=="string")return[t]}_getNetName(){let{_parsedProps:e}=this;return e.net}doInitialCreateNetsFromProps(){let{_parsedProps:e}=this;e.net&&hP(this,[`net.${e.net}`])}doInitialCreateTracesFromNetLabels(){if(this.root?.schematicDisabled)return;let e=this._resolveConnectsTo();if(e)for(let t of e)this.add(new zs({from:t,to:`net.${this._getNetName()}`}))}doInitialSchematicTraceRender(){if(!this.root?._featureMspSchematicTraceRouting||this.root?.schematicDisabled)return;let{db:e}=this.root,t=this._resolveConnectsTo();if(!t||t.length===0)return;let i=this._getGlobalSchematicPositionBeforeLayout(),r=this._getAnchorSide(),o={left:"x-",right:"x+",top:"y+",bottom:"y-"}[r],a=this.getSubcircuit().selectOne(`net.${this._getNetName()}`);for(let c of t){let l=this.getSubcircuit().selectOne(c,{type:"port"});if(!l||!l.schematic_port_id)continue;let u=!1;if(a?.source_net_id){let S=e.source_trace.list().find(P=>P.connected_source_net_ids?.includes(a.source_net_id)&&P.connected_source_port_ids?.includes(l.source_port_id??""));if(S&&(u=e.schematic_trace.list().some(P=>P.source_trace_id===S.source_trace_id)),u)continue}let p=l._getGlobalSchematicPositionAfterLayout(),d=v9(l.facingDirection??"right")??"x+",_=Qc({x:p.x,y:p.y,facingDirection:d},{x:i.x,y:i.y,facingDirection:o});if(!Array.isArray(_)||_.length<2)continue;let g=[];for(let S=0;S<_.length-1;S++)g.push({from:{x:_[S].x,y:_[S].y},to:{x:_[S+1].x,y:_[S+1].y}});let x,v;if(a?.source_net_id&&l.source_port_id){let S=e.source_trace.list().find(P=>P.connected_source_net_ids?.includes(a.source_net_id)&&P.connected_source_port_ids?.includes(l.source_port_id));x=S?.source_trace_id,v=S?.subcircuit_connectivity_map_key||e.source_net.get(a.source_net_id)?.subcircuit_connectivity_map_key}e.schematic_trace.insert({source_trace_id:x,edges:g,junctions:[],subcircuit_connectivity_map_key:v}),e.schematic_port.update(l.schematic_port_id,{is_connected:!0})}}},xit=class extends Me{constructor(){super(...arguments);f(this,"pcb_silkscreen_circle_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenCircle",zodProps:iq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),{maybeFlipLayer:s}=this._getPcbPrimitiveFlippedHelpers(),o=s(t.layer??"top");if(o!=="top"&&o!=="bottom")throw new Error(`Invalid layer "${o}" for SilkscreenCircle. Must be "top" or "bottom".`);let a=this._computePcbGlobalTransformBeforeLayout(),c=this.getSubcircuit(),l=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,u=e.pcb_silkscreen_circle.insert({pcb_component_id:l,layer:o,center:{x:i,y:r},radius:t.radius,subcircuit_id:c?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,stroke_width:t.strokeWidth??.1});this.pcb_silkscreen_circle_id=u.pcb_silkscreen_circle_id}getPcbSize(){let{_parsedProps:e}=this,t=e.radius*2;return{width:t,height:t}}},bit=class extends Me{constructor(){super(...arguments);f(this,"pcb_silkscreen_rect_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenRect",zodProps:nq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{maybeFlipLayer:i}=this._getPcbPrimitiveFlippedHelpers(),r=i(t.layer??"top");if(r!=="top"&&r!=="bottom")throw new Error(`Invalid layer "${r}" for SilkscreenRect. Must be "top" or "bottom".`);let s=this.getSubcircuit(),{pcbX:o,pcbY:a}=this.getResolvedPcbPositionProp(),c=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,l=e.pcb_silkscreen_rect.insert({pcb_component_id:c,layer:r,center:{x:o,y:a},width:t.width,height:t.height,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this?.getGroup()?.pcb_group_id??void 0,stroke_width:t.strokeWidth??.1,is_filled:t.filled??!1,corner_radius:t.cornerRadius??void 0});this.pcb_silkscreen_rect_id=l.pcb_silkscreen_rect_id}getPcbSize(){let{_parsedProps:e}=this;return{width:e.width,height:e.height}}},vit=class extends Me{constructor(){super(...arguments);f(this,"pcb_silkscreen_line_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenLine",zodProps:eq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{maybeFlipLayer:i}=this._getPcbPrimitiveFlippedHelpers(),r=i(t.layer??"top");if(r!=="top"&&r!=="bottom")throw new Error(`Invalid layer "${r}" for SilkscreenLine. Must be "top" or "bottom".`);let s=this.getSubcircuit(),o=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,a=e.pcb_silkscreen_line.insert({pcb_component_id:o,layer:r,x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2,stroke_width:t.strokeWidth??.1,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:s?.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_line_id=a.pcb_silkscreen_line_id}getPcbSize(){let{_parsedProps:e}=this,t=Math.abs(e.x2-e.x1),i=Math.abs(e.y2-e.y1);return{width:t,height:i}}},wit=class extends Me{constructor(e){super(e);f(this,"pcb_via_id",null);f(this,"matchedPort",null);f(this,"isPcbPrimitive",!0);f(this,"source_manually_placed_via_id",null);f(this,"subcircuit_connectivity_map_key",null);let t=this._getLayers();this._parsedProps.layers=t,this.initPorts()}get config(){return{componentName:"Via",zodProps:OH}}getAvailablePcbLayers(){return["top","inner1","inner2","bottom"]}_getResolvedViaDiameters(e){return l7t({holeDiameter:this._parsedProps.holeDiameter,padDiameter:this._parsedProps.outerDiameter},e)}getPcbSize(){let e=this.getInheritedMergedProperty("pcbStyle"),{padDiameter:t}=this._getResolvedViaDiameters(e);return{width:t,height:t}}_getPcbCircuitJsonBounds(){let{db:e}=this.root,t=e.pcb_via.get(this.pcb_via_id),i=this.getPcbSize();return{center:{x:t.x,y:t.y},bounds:{left:t.x-i.width/2,top:t.y-i.height/2,right:t.x+i.width/2,bottom:t.y+i.height/2},width:i.width,height:i.height}}_setPositionFromLayout(e){let{db:t}=this.root;t.pcb_via.update(this.pcb_via_id,{x:e.x,y:e.y})}_getLayers(){let{fromLayer:e="top",toLayer:t="bottom"}=this._parsedProps;return e===t?[e]:[e,t]}initPorts(){let e=this._parsedProps.layers;for(let i of e){let r=new Wi({name:i,layer:i});r.registerMatch(this),this.add(r)}let t=new Wi({name:"pin1"});t.registerMatch(this),this.add(t)}_getConnectedNetOrTrace(){let e=this._parsedProps.connectsTo;if(!e)return null;let t=this.getSubcircuit(),i=Array.isArray(e)?e:[e];for(let r of i)if(r.startsWith("net.")){let s=t.selectOne(r,{type:"net"});if(s)return s}return null}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,t=this.getInheritedMergedProperty("pcbStyle"),{padDiameter:i}=this._getResolvedViaDiameters(t),r=this._getGlobalPcbPositionBeforeLayout(),s=this.getSubcircuit(),o=e.pcb_component.insert({center:r,width:i,height:i,layer:this._parsedProps.fromLayer??"top",rotation:0,source_component_id:this.source_component_id,subcircuit_id:s?.subcircuit_id??void 0,obstructs_within_bounds:!0});this.pcb_component_id=o.pcb_component_id}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=this.getGroup(),r=this.getSubcircuit(),s=e.source_manually_placed_via.insert({source_group_id:i?.source_group_id,source_net_id:t.net??"",subcircuit_id:r?.subcircuit_id??void 0});this.source_component_id=s.source_manually_placed_via_id}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,t=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter:i,padDiameter:r}=this._getResolvedViaDiameters(t),s=this._getGlobalPcbPositionBeforeLayout(),o=this.getSubcircuit(),a=e.pcb_via.insert({x:s.x,y:s.y,hole_diameter:i,outer_diameter:r,layers:["bottom","top"],from_layer:this._parsedProps.fromLayer||"bottom",to_layer:this._parsedProps.toLayer||"top",subcircuit_id:o?.subcircuit_id??void 0,subcircuit_connectivity_map_key:this.subcircuit_connectivity_map_key??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,net_is_assignable:this._parsedProps.netIsAssignable??void 0});this.pcb_via_id=a.pcb_via_id}},Sit=class extends Me{constructor(){super(...arguments);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CopperPour",zodProps:zH}}getPcbSize(){return{width:0,height:0}}doInitialCreateNetsFromProps(){let{_parsedProps:e}=this;hP(this,[e.connectsTo])}doInitialPcbCopperPourRender(){this.root?.pcbDisabled||this._queueAsyncEffect("PcbCopperPourRender",async()=>{let{db:e}=this.root,{_parsedProps:t}=this,i=this.getSubcircuit().selectOne(t.connectsTo);if(!i||!i.source_net_id){this.renderError(`Net "${t.connectsTo}" not found for copper pour`);return}let r=this.getSubcircuit(),s=e.toArray().filter(p=>p.type==="source_net"&&p.name===i.name)[0]||"",o=t.clearance??.2,a=Ttt(e.toArray(),{layer:t.layer,pour_connectivity_key:s.subcircuit_connectivity_map_key||"",pad_margin:t.padMargin??o,trace_margin:t.traceMargin??o,board_edge_margin:t.boardEdgeMargin??o,cutout_margin:t.cutoutMargin??o}),c=new ktt(a),{brep_shapes:l}=c.getOutput(),u=t.coveredWithSolderMask??!1;for(let p of l)e.pcb_copper_pour.insert({shape:"brep",layer:t.layer,brep_shape:p,source_net_id:i.source_net_id,subcircuit_id:r?.subcircuit_id??void 0,covered_with_solder_mask:u})})}},Pit=class extends Bn{get config(){return{componentName:"Battery",schematicSymbolName:this.props.symbolName??"battery",zodProps:yH,sourceFtype:"simple_power_source"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=n.source_component.insert({name:this.name,ftype:"simple_power_source",capacity:e.capacity,supplier_part_numbers:e.supplierPartNumbers,are_pins_interchangeable:!1});this.source_component_id=t.source_component_id}},kit=class extends Bn{_getPcbRotationBeforeLayout(){let n=this.props.pcbOrientation==="vertical"?-90:0;return(super._getPcbRotationBeforeLayout()??0)+n}get config(){return{componentName:"PinHeader",zodProps:gH,shouldRenderAsSchematicBox:!0}}_getImpliedFootprintString(){let n=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:0),e=this._parsedProps.holeDiameter,t=this._parsedProps.platedDiameter,i=this._parsedProps.pitch,r=this._parsedProps.showSilkscreenPinLabels,s=this._parsedProps.doubleRow?2:1;if(n>0){let o;if(i)!e&&!t?o=`pinrow${n}_p${i}`:o=`pinrow${n}_p${i}_id${e}_od${t}`;else if(!e&&!t)o=`pinrow${n}`;else return null;return r!==!0&&(o+="_nopinlabels"),s>1&&(o+=`_rows${s}`),o}return null}initPorts(){let n=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:1);for(let e=1;e<=n;e++){let t=Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels[e-1]:this._parsedProps.pinLabels?.[`pin${e}`];if(t){let i=Array.isArray(t)?t[0]:t,r=Array.isArray(t)?t.slice(1):[];this.add(new Wi({pinNumber:e,name:i,aliases:[`pin${e}`,...r]}))}else this.add(new Wi({pinNumber:e,name:`pin${e}`}))}}_getSchematicPortArrangement(){let n=this._parsedProps.pinCount??1,e=this._parsedProps.schFacingDirection??this._parsedProps.facingDirection??"right",t=this._parsedProps.schPinArrangement;return e==="left"?{leftSide:{direction:t?.leftSide?.direction??"top-to-bottom",pins:t?.leftSide?.pins??Array.from({length:n},(i,r)=>`pin${r+1}`)}}:{rightSide:{direction:t?.rightSide?.direction??"top-to-bottom",pins:t?.rightSide?.pins??Array.from({length:n},(i,r)=>`pin${r+1}`)}}}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=n.source_component.insert({ftype:"simple_pin_header",name:this.name,supplier_part_numbers:e.supplierPartNumbers,pin_count:e.pinCount,gender:e.gender,are_pins_interchangeable:!0});this.source_component_id=t.source_component_id}};function HFt(n){switch(n){case"two_ground_pins":return"crystal_4pin";case"ground_pin":return"resonator";case"no_ground":return"crystal";default:return"crystal"}}var Tit=class extends Bn{get config(){return{componentName:"Resonator",schematicSymbolName:this.props.symbolName??HFt(this.props.pinVariant),zodProps:aH,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=e.pinVariant||"no_ground",i=n.source_component.insert({ftype:"simple_resonator",name:this.name,frequency:e.frequency,load_capacitance:e.loadCapacitance,supplier_part_numbers:e.supplierPartNumbers,pin_variant:t,are_pins_interchangeable:t==="no_ground"||t==="ground_pin"});this.source_component_id=i.source_component_id}_getSchematicSymbolDisplayValue(){let n=`${bi(this._parsedProps.frequency)}Hz`;return this._parsedProps.loadCapacitance?`${n} / ${bi(this._parsedProps.loadCapacitance)}F`:n}};function qFt(n){switch(n){case"three_pin":return"potentiometer3";case"two_pin":return"potentiometer2";default:return"potentiometer2"}}var Eit=class extends Bn{get config(){return{componentName:"Potentiometer",schematicSymbolName:this.props.symbolName??qFt(this.props.pinVariant),zodProps:sH,shouldRenderAsSchematicBox:!1}}_getSchematicSymbolDisplayValue(){return`${bi(this._parsedProps.maxResistance)}\u03A9`}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=e.pinVariant||"two_pin",i=n.source_component.insert({ftype:"simple_potentiometer",name:this.name,max_resistance:e.maxResistance,pin_variant:t,are_pins_interchangeable:t==="two_pin"});this.source_component_id=i.source_component_id}},Mit=class extends Bn{get config(){return{componentName:"PushButton",schematicSymbolName:this.props.symbolName??"push_button_normally_open_momentary",zodProps:bH,sourceFtype:Ha.simple_push_button}}get defaultInternallyConnectedPinNames(){return[]}initPorts(){super.initPorts({pinCount:2,ignoreSymbolPorts:!0});let n=gi[this._getSchematicSymbolNameOrThrow()],e=n.ports.find(l=>l.labels.includes("1")),t=n.ports.find(l=>l.labels.includes("2")),i=this.selectAll("port"),r=i.find(l=>l.props.pinNumber===1),s=i.find(l=>l.props.pinNumber===2),o=i.find(l=>l.props.pinNumber===3),a=i.find(l=>l.props.pinNumber===4),{internallyConnectedPins:c}=this._parsedProps;r.schematicSymbolPortDef=e,(!c||c.length===0)&&(s.schematicSymbolPortDef=t);for(let[l,u]of[[2,s],[3,o],[4,a]]){let p=c?.find(([_,g])=>_===`pin${l}`||g===`pin${l}`);if(!p){u.schematicSymbolPortDef=t;break}(p?.[0]===`pin${l}`?p[1]:p?.[0])!=="pin1"&&(u.schematicSymbolPortDef=t)}}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=n.source_component.insert({name:this.name,ftype:Ha.simple_push_button,supplier_part_numbers:e.supplierPartNumbers,are_pins_interchangeable:!0});this.source_component_id=t.source_component_id}},Cit=class extends Bn{get config(){return{schematicSymbolName:this.props.symbolName??(this.props.pinVariant==="four_pin"?"crystal_4pin":"crystal"),componentName:"Crystal",zodProps:oH,sourceFtype:"simple_crystal"}}initPorts(){let n=this.props.pinVariant==="four_pin"?{pin1:["left1","1"],pin2:["top1","2","gnd1"],pin3:["right1","3"],pin4:["bottom1","4","gnd2"]}:{pin1:["pos","left"],pin2:["neg","right"]};super.initPorts({additionalAliases:n})}_getSchematicSymbolDisplayValue(){let n=`${bi(this._parsedProps.frequency)}Hz`;return this._parsedProps.loadCapacitance?`${n} / ${bi(this._parsedProps.loadCapacitance)}F`:n}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=n.source_component.insert({name:this.name,ftype:"simple_crystal",frequency:e.frequency,load_capacitance:e.loadCapacitance,pin_variant:e.pinVariant||"two_pin",are_pins_interchangeable:(e.pinVariant||"two_pin")==="two_pin"});this.source_component_id=t.source_component_id}},Iit=class extends Bn{get config(){let n=this.props.mosfetMode==="depletion"?"d":"e",t=`${this.props.channelType}_channel_${n}_mosfet_transistor`;return{componentName:"Mosfet",schematicSymbolName:this.props.symbolName??t,zodProps:SH,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=n.source_component.insert({ftype:"simple_mosfet",name:this.name,mosfet_mode:e.mosfetMode,channel_type:e.channelType});this.source_component_id=t.source_component_id}};function ZFt(n){return n.simSwitchFrequency!==void 0||n.simCloseAt!==void 0||n.simOpenAt!==void 0||n.simStartClosed!==void 0||n.simStartOpen!==void 0}var Nit=class extends Bn{_getSwitchType(){let n=this._parsedProps;return n?n.dpdt?"dpdt":n.spst?"spst":n.spdt?"spdt":n.dpst?"dpst":n.type??"spst":"spst"}get config(){let n=this._getSwitchType(),e=this._parsedProps?.isNormallyClosed??!1,t={spst:e?"spst_normally_closed_switch":"spst_switch",spdt:e?"spdt_normally_closed_switch":"spdt_switch",dpst:e?"dpst_normally_closed_switch":"dpst_switch",dpdt:e?"dpdt_normally_closed_switch":"dpdt_switch"};return{componentName:"Switch",schematicSymbolName:this.props.symbolName??t[n],zodProps:CH,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:n}=this.root,e=this._parsedProps??{},t=n.source_component.insert({ftype:"simple_switch",name:this.name,are_pins_interchangeable:this._getSwitchType()==="spst"});this.source_component_id=t.source_component_id}doInitialSimulationRender(){let{_parsedProps:n}=this;if(!ZFt(n))return;let{db:e}=this.root,t={type:"simulation_switch",source_component_id:this.source_component_id||""};n.simSwitchFrequency!==void 0&&(t.switching_frequency=zr.parse(n.simSwitchFrequency)),n.simCloseAt!==void 0&&(t.closes_at=hr.parse(n.simCloseAt)),n.simOpenAt!==void 0&&(t.opens_at=hr.parse(n.simOpenAt)),n.simStartOpen!==void 0&&(t.starts_closed=!n.simStartOpen),n.simStartClosed!==void 0&&(t.starts_closed=n.simStartClosed),e.simulation_switch.insert(t)}},g9={HOLE_DIAMETER:.5,SMT_CIRCLE_DIAMETER:1.2,SMT_RECT_SIZE:2},Ait=class extends Bn{get config(){return{componentName:"TestPoint",schematicSymbolName:this.props.symbolName??"testpoint",zodProps:LH,sourceFtype:Ha.simple_test_point}}_getPropsWithDefaults(){let{padShape:n,holeDiameter:e,footprintVariant:t,padDiameter:i,width:r,height:s}=this._parsedProps;return!t&&e&&(t="through_hole"),t??(t="through_hole"),n??(n="circle"),t==="pad"?n==="circle"?i??(i=g9.SMT_CIRCLE_DIAMETER):n==="rect"&&(r??(r=g9.SMT_RECT_SIZE),s??(s=r)):t==="through_hole"&&(e??(e=g9.HOLE_DIAMETER)),{padShape:n,holeDiameter:e,footprintVariant:t,padDiameter:i,width:r,height:s}}_getImpliedFootprintString(){let{padShape:n,holeDiameter:e,footprintVariant:t,padDiameter:i,width:r,height:s}=this._getPropsWithDefaults();if(t==="through_hole")return`platedhole_d${e}`;if(t==="pad"){if(n==="circle")return`smtpad_circle_d${i}`;if(n==="rect")return`smtpad_rect_w${r}_h${s}`}throw new Error(`Footprint variant "${t}" with pad shape "${n}" not implemented`)}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,{padShape:t,holeDiameter:i,footprintVariant:r,padDiameter:s,width:o,height:a}=this._getPropsWithDefaults(),c=n.source_component.insert({ftype:Ha.simple_test_point,name:this.name,supplier_part_numbers:e.supplierPartNumbers,footprint_variant:r,pad_shape:t,pad_diameter:s,hole_diameter:i,width:o,height:a,are_pins_interchangeable:!0});this.source_component_id=c.source_component_id}},Rit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicText",zodProps:qH}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalSchematicPositionBeforeLayout();e.schematic_text.insert({anchor:t.anchor??"center",text:dP(t.text),font_size:t.fontSize,color:t.color||"#000000",position:{x:i.x,y:i.y},rotation:t.schRotation??0})}},Oit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0);f(this,"schematic_line_id")}get config(){return{componentName:"SchematicLine",zodProps:HH}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalSchematicPositionBeforeLayout(),r=this.getPrimitiveContainer()?.parent?.schematic_component_id,s=e.schematic_line.insert({schematic_component_id:r,x1:t.x1+i.x,y1:t.y1+i.y,x2:t.x2+i.x,y2:t.y2+i.y,stroke_width:t.strokeWidth??yP,color:t.color??_P,is_dashed:!1,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_line_id=s.schematic_line_id}},Lit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0);f(this,"schematic_rect_id")}get config(){return{componentName:"SchematicRect",zodProps:WH}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalSchematicPositionBeforeLayout(),r=this.getPrimitiveContainer()?.parent?.schematic_component_id,s=e.schematic_rect.insert({center:{x:i.x,y:i.y},width:t.width,height:t.height,stroke_width:t.strokeWidth??yP,color:t.color??_P,is_filled:t.isFilled,schematic_component_id:r,is_dashed:t.isDashed,rotation:t.rotation??0,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_rect_id=s.schematic_rect_id}},Fit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0);f(this,"schematic_arc_id")}get config(){return{componentName:"SchematicArc",zodProps:UH}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalSchematicPositionBeforeLayout(),r=this.getPrimitiveContainer()?.parent?.schematic_component_id,s=e.schematic_arc.insert({schematic_component_id:r,center:{x:t.center.x+i.x,y:t.center.y+i.y},radius:t.radius,start_angle_degrees:t.startAngleDegrees,end_angle_degrees:t.endAngleDegrees,direction:t.direction,stroke_width:t.strokeWidth??yP,color:t.color??_P,is_dashed:t.isDashed,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_arc_id=s.schematic_arc_id}},$it=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0);f(this,"schematic_circle_id")}get config(){return{componentName:"SchematicCircle",zodProps:GH}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalSchematicPositionBeforeLayout(),r=this.getPrimitiveContainer()?.parent?.schematic_component_id,s=e.schematic_circle.insert({schematic_component_id:r,center:{x:t.center.x+i.x,y:t.center.y+i.y},radius:t.radius,stroke_width:t.strokeWidth??yP,color:t.color??_P,is_filled:t.isFilled,fill_color:t.fillColor,is_dashed:t.isDashed,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_circle_id=s.schematic_circle_id}};function KFt({anchor:n,x:e,y:t,width:i,height:r,isInside:s}){switch(n){case"top_left":return{x:e,y:t+r,textAnchor:s?"top_left":"bottom_left"};case"top_center":return{x:e+i/2,y:t+r,textAnchor:s?"top_center":"bottom_center"};case"top_right":return{x:e+i,y:t+r,textAnchor:s?"top_right":"bottom_right"};case"center_left":return{x:e,y:t+r/2,textAnchor:s?"center_left":"center_right"};case"center":return{x:e+i/2,y:t+r/2,textAnchor:"center"};case"center_right":return{x:e+i,y:t+r/2,textAnchor:s?"center_right":"center_left"};case"bottom_left":return{x:e,y:t,textAnchor:s?"bottom_left":"top_left"};case"bottom_center":return{x:e+i/2,y:t,textAnchor:s?"bottom_center":"top_center"};case"bottom_right":return{x:e+i,y:t,textAnchor:s?"bottom_right":"top_right"};default:return{x:e+i/2,y:t+r,textAnchor:"center"}}}var zit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicBox",zodProps:VH,shouldRenderAsSchematicBox:!0}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=.6,r=typeof t.padding=="number"?t.padding:0,s=typeof t.paddingTop=="number"?t.paddingTop:r,o=typeof t.paddingBottom=="number"?t.paddingBottom:r,a=typeof t.paddingLeft=="number"?t.paddingLeft:r,c=typeof t.paddingRight=="number"?t.paddingRight:r,l=t.overlay&&t.overlay.length>0,u=typeof t.width=="number"&&typeof t.height=="number",p,d,_,g,x,v;if(l){let P=t.overlay.map(Q=>({selector:Q,port:this.getSubcircuit().selectOne(Q,{type:"port"})})).filter(({port:Q})=>Q!=null).map(({port:Q})=>({position:Q._getGlobalSchematicPositionAfterLayout()}));if(P.length===0)return;let T=P.map(Q=>Q.position.x),k=P.map(Q=>Q.position.y),N=Math.min(...T),E=Math.max(...T),C=Math.min(...k),M=Math.max(...k),A=E-N,R=M-C,B=A===0?i:0,D=R===0?i:0,U=a+B/2,X=c+B/2,W=s+D/2,J=o+D/2,nt=N-U,ft=E+X,G=C-J,et=M+W;p=ft-nt,d=et-G,_=nt+(t.schX??0),g=G+(t.schY??0),x=_+p/2,v=g+d/2}else if(u){p=t.width,d=t.height;let S=this._getGlobalSchematicPositionBeforeLayout();x=S.x,v=S.y,_=x-p/2,g=v-d/2}else return;if(e.schematic_box.insert({height:d,width:p,x:_,y:g,is_dashed:t.strokeStyle==="dashed"}),t.title){let S=t.titleInside,P=.1,T=t.titleAlignment,k=KFt({anchor:T,x:_,y:g,width:p,height:d,isInside:S}),N,E,C=k.textAnchor;S?(N=T.includes("top")?-P:T.includes("bottom")?P:0,E=T.includes("left")?P:T.includes("right")?-P:0):(N=T.includes("top")?P:T.includes("bottom")?-P:0,E=T.includes("center_left")?-P:T.includes("center_right")?P:0);let M=k.x+E,A=k.y+N;e.schematic_text.insert({anchor:C,text:t.title,font_size:t.titleFontSize??.18,color:t.titleColor??"#000000",position:{x:M,y:A},rotation:0})}}},Dit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0);f(this,"schematic_table_id",null)}get config(){return{componentName:"SchematicTable",zodProps:ZH}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this.children.filter(d=>d.componentName==="SchematicRow");if(i.length===0)return;let r=[],s=0;for(let d of i){let _=d.children.filter(g=>g.componentName==="SchematicCell");s=Math.max(s,_.length)}for(let d=0;d<i.length;d++)r[d]=[];for(let d=0;d<i.length;d++){let g=i[d].children.filter(v=>v.componentName==="SchematicCell"),x=0;for(let v=0;v<g.length;v++){for(;r[d][x];)x++;let S=g[v],P=S._parsedProps.colSpan??1,T=S._parsedProps.rowSpan??1;for(let k=0;k<T;k++)for(let N=0;N<P;N++)r[d+k]||(r[d+k]=[]),r[d+k][x+N]=S;x+=P}}s=Math.max(0,...r.map(d=>d.length));let o=i.map((d,_)=>d._parsedProps.height??1),a=Array.from({length:s},(d,_)=>{let g=0;for(let x=0;x<i.length;x++){let v=r[x]?.[_];if(v){let S=v._parsedProps.text??v._parsedProps.children,P=v._parsedProps.width??(S?.length??2)*.5;P>g&&(g=P)}}return g||10}),c=this._getGlobalSchematicPositionBeforeLayout(),l=e.schematic_table.insert({anchor_position:c,column_widths:a,row_heights:o,cell_padding:t.cellPadding,border_width:t.borderWidth,anchor:t.anchor,subcircuit_id:this.getSubcircuit()?.subcircuit_id||"",schematic_component_id:this.parent?.schematic_component_id||""});this.schematic_table_id=l.schematic_table_id;let u=new Set,p=0;for(let d=0;d<i.length;d++){let _=0;for(let g=0;g<s;g++){let x=r[d]?.[g];if(x&&!u.has(x)){u.add(x);let v=x._parsedProps,S=v.rowSpan??1,P=v.colSpan??1,T=0;for(let N=0;N<P;N++)T+=a[g+N];let k=0;for(let N=0;N<S;N++)k+=o[d+N];e.schematic_table_cell.insert({schematic_table_id:this.schematic_table_id,start_row_index:d,end_row_index:d+S-1,start_column_index:g,end_column_index:g+P-1,text:v.text??v.children,center:{x:c.x+_+T/2,y:c.y-p-k/2},width:T,height:k,horizontal_align:v.horizontalAlign,vertical_align:v.verticalAlign,font_size:v.fontSize??t.fontSize,subcircuit_id:this.getSubcircuit()?.subcircuit_id||""})}a[g]&&(_+=a[g])}p+=o[d]}}},jit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicRow",zodProps:KH}}},Bit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0);f(this,"canHaveTextChildren",!0)}get config(){return{componentName:"SchematicCell",zodProps:JH}}},Yit=class extends Me{constructor(){super(...arguments);f(this,"isPrimitiveContainer",!0)}get config(){return{componentName:"Symbol",zodProps:_H}}},Xit=class extends Me{get config(){return{componentName:"AnalogSimulation",zodProps:vH}}doInitialSimulationRender(){let{db:n}=this.root,{duration:e,timePerStep:t}=this._parsedProps,i=e||10,r=t||.01;n.simulation_experiment.insert({name:"spice_transient_analysis",experiment_type:"spice_transient_analysis",end_time_ms:i,time_per_step:r})}},Uit=class extends Me{constructor(){super(...arguments);f(this,"simulation_voltage_probe_id",null);f(this,"schematic_voltage_probe_id",null);f(this,"finalProbeName",null);f(this,"color",null)}get config(){return{componentName:"VoltageProbe",zodProps:XH}}doInitialSimulationRender(){let{db:e}=this.root,{connectsTo:t,name:i,referenceTo:r,color:s}=this._parsedProps,o=this.getSubcircuit();if(!o){this.renderError("VoltageProbe must be inside a subcircuit");return}let a=Array.isArray(t)?t:[t];if(a.length!==1){this.renderError("VoltageProbe must connect to exactly one port or net");return}let c=a[0],l=o.selectOne(c,{type:"port"}),u=l?null:o.selectOne(c,{type:"net"});if(u&&u.componentName!=="Net"){this.renderError(`VoltageProbe connection target "${c}" resolved to a non-net component "${u.componentName}".`);return}if(!l&&!u){this.renderError(`VoltageProbe could not find connection target "${c}"`);return}let p=l?.source_port_id??u?.source_net_id;if(!p){this.renderError("Could not identify connected source for VoltageProbe");return}let d=null,_=null;if(r){let v=Array.isArray(r)?r:[r];if(v.length!==1){this.renderError("VoltageProbe must reference exactly one port or net");return}let S=v[0];if(d=o.selectOne(S,{type:"port"}),_=d?null:o.selectOne(S,{type:"net"}),_&&_.componentName!=="Net"){this.renderError(`VoltageProbe reference target "${S}" resolved to a non-net component "${_.componentName}".`);return}if(!d&&!_){this.renderError(`VoltageProbe could not find reference target "${S}"`);return}}this.color=s??wFt(p);let g=i;g||(g=a[0].split(" > ").map(v=>v.replace(/^\./,"")).join(".")),this.finalProbeName=g??null;let{simulation_voltage_probe_id:x}=e.simulation_voltage_probe.insert({name:g,signal_input_source_port_id:l?.source_port_id??void 0,signal_input_source_net_id:u?.source_net_id??void 0,reference_input_source_port_id:d?.source_port_id??void 0,reference_input_source_net_id:_?.source_net_id??void 0,subcircuit_id:o.subcircuit_id||void 0,color:this.color});this.simulation_voltage_probe_id=x}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{connectsTo:t,name:i}=this._parsedProps,r=this.getSubcircuit();if(!r)return;let s=Array.isArray(t)?t:[t];if(s.length!==1)return;let o=s[0],a=r.selectOne(o,{type:"port"});if(!a||!a.schematic_port_id)return;let c=a._getGlobalSchematicPositionAfterLayout(),l=null;for(let d of e.schematic_trace.list()){for(let _ of d.edges)if(Math.abs(_.from.x-c.x)<1e-6&&Math.abs(_.from.y-c.y)<1e-6||Math.abs(_.to.x-c.x)<1e-6&&Math.abs(_.to.y-c.y)<1e-6){l=d.schematic_trace_id;break}if(l)break}if(!l)return;let u=this.finalProbeName,p=e.schematic_voltage_probe.insert({name:u,position:c,schematic_trace_id:l,subcircuit_id:r.subcircuit_id||void 0,color:this.color??void 0});this.schematic_voltage_probe_id=p.schematic_voltage_probe_id}},JFt={name:"@tscircuit/core",type:"module",version:"0.0.901",types:"dist/index.d.ts",main:"dist/index.js",module:"dist/index.js",exports:{".":{import:"./dist/index.js",types:"./dist/index.d.ts"}},files:["dist"],repository:{type:"git",url:"https://github.com/tscircuit/core"},scripts:{build:"tsup-node index.ts --format esm --dts",format:"biome format . --write","measure-bundle":"howfat -r table .","pkg-pr-new-release":"bunx pkg-pr-new publish --comment=off --peerDeps","smoke-test:dist":"bun run scripts/smoke-tests/test-dist-simple-circuit.tsx","build:benchmarking":"bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist","build:benchmarking:watch":`chokidar "./{benchmarking,lib}/**/*.{ts,tsx}" -c 'bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist'`,"start:benchmarking":'concurrently "bun run build:benchmarking:watch" "live-server ./benchmarking-dist"',"generate-test-plan":"bun run scripts/generate-test-plan.ts"},devDependencies:{"@biomejs/biome":"^1.8.3","@resvg/resvg-js":"^2.6.2","@tscircuit/capacity-autorouter":"^0.0.140","@tscircuit/checks":"^0.0.87","@tscircuit/circuit-json-util":"^0.0.73","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.14","@tscircuit/footprinter":"^0.0.236","@tscircuit/import-snippet":"^0.0.4","@tscircuit/infgrid-ijump-astar":"^0.0.33","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.16","@tscircuit/math-utils":"^0.0.29","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.4","@tscircuit/props":"^0.0.424","@tscircuit/schematic-autolayout":"^0.0.6","@tscircuit/schematic-match-adapt":"^0.0.16","@tscircuit/schematic-trace-solver":"^v0.0.45","@tscircuit/solver-utils":"^0.0.3","@types/bun":"^1.2.16","@types/debug":"^4.1.12","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@types/react-reconciler":"^0.28.9","bpc-graph":"^0.0.57","bun-match-svg":"0.0.12","calculate-elbow":"^0.0.12","chokidar-cli":"^3.0.0","circuit-json":"^0.0.325","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.22","circuit-json-to-gltf":"^0.0.31","circuit-json-to-simple-3d":"^0.0.9","circuit-json-to-spice":"^0.0.27","circuit-to-svg":"^0.0.284",concurrently:"^9.1.2","connectivity-map":"^1.0.0",debug:"^4.3.6","eecircuit-engine":"^1.5.6",flatbush:"^4.5.0","graphics-debug":"^0.0.60",howfat:"^0.3.8","live-server":"^1.2.2","looks-same":"^9.0.1",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"^0.0.16",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.202",spicey:"^0.0.14","ts-expect":"^1.3.0",tsup:"^8.2.4"},peerDependencies:{"@tscircuit/capacity-autorouter":"*","@tscircuit/checks":"*","@tscircuit/circuit-json-util":"*","@tscircuit/footprinter":"*","@tscircuit/infgrid-ijump-astar":"*","@tscircuit/math-utils":"*","@tscircuit/props":"*","@tscircuit/schematic-autolayout":"*","@tscircuit/schematic-match-adapt":"*","circuit-json-to-bpc":"*","bpc-graph":"*","@tscircuit/matchpack":"*","circuit-json":"*","circuit-json-to-connectivity-map":"*","schematic-symbols":"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-packing":"0.0.62","css-select":"5.1.0","format-si-unit":"^0.0.3",nanoid:"^5.0.7","performance-now":"^2.1.0","react-reconciler":"^0.32.0","transformation-matrix":"^2.16.1",zod:"^3.25.67"}},J_=class{constructor({platform:n,projectUrl:e}={}){f(this,"firstChild",null);f(this,"children");f(this,"db");f(this,"root",null);f(this,"isRoot",!0);f(this,"_schematicDisabledOverride");f(this,"pcbDisabled",!1);f(this,"pcbRoutingDisabled",!1);f(this,"_featureMspSchematicTraceRouting",!0);f(this,"name");f(this,"platform");f(this,"projectUrl");f(this,"_hasRenderedAtleastOnce",!1);f(this,"_eventListeners",{});this.children=[],this.db=Ce([]),this.root=this,this.platform=n,this.projectUrl=e,this.pcbDisabled=n?.pcbDisabled??!1}get schematicDisabled(){return this._schematicDisabledOverride!==void 0?this._schematicDisabledOverride:this._getBoard()?._parsedProps?.schematicDisabled??!1}set schematicDisabled(n){this._schematicDisabledOverride=n}add(n){let e;(0,Vit.isValidElement)(n)?e=knt(n):e=n,this.children.push(e)}setPlatform(n){this.platform={...this.platform,...n}}_getBoard(){let n=this.children.find(e=>e.componentName==="Board");if(n)return n}_guessRootComponent(){if(this.firstChild)return;if(this.children.length===0)throw new Error("Not able to guess root component: RootCircuit has no children (use circuit.add(...))");let n=this.children.filter(t=>t.lowercaseComponentName==="panel");if(n.length>1)throw new Error("Only one <panel> is allowed per circuit");if(n.length===1){if(this.children.length!==1)throw new Error("<panel> must be the root element of the circuit");this.firstChild=n[0];return}if(this.children.length===1&&this.children[0].isGroup){this.firstChild=this.children[0];return}let e=new Sl({subcircuit:!0});e.parent=this,e.addAll(this.children),this.children=[e],this.firstChild=e}render(){this.firstChild||this._guessRootComponent();let{firstChild:n,db:e}=this;if(!n)throw new Error("RootCircuit has no root component");n.parent=this,n.runRenderCycle(),this._hasRenderedAtleastOnce=!0}async renderUntilSettled(){for(this.db.source_project_metadata.list()?.[0]||this.db.source_project_metadata.insert({software_used_string:`@tscircuit/core@${this.getCoreVersion()}`,...this.projectUrl?{project_url:this.projectUrl}:{}}),this.render();this._hasIncompleteAsyncEffects();)await new Promise(e=>setTimeout(e,100)),this.render();this.emit("renderComplete")}_hasIncompleteAsyncEffects(){return this.children.some(n=>n._hasIncompleteAsyncEffects())}getCircuitJson(){return this._hasRenderedAtleastOnce||this.render(),this.db.toArray()}toJson(){return this.getCircuitJson()}async getSvg(n){let e=await Promise.resolve().then(()=>(jet(),Det)).catch(t=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
|
|
253
|
+
`),a={x:t.center.x+t.width/2-.25,y:t.center.y-t.height/2+1};this.root.db.pcb_silkscreen_text.insert({pcb_component_id:this.pcb_board_id,layer:"top",font:"tscircuit2024",font_size:.45,text:r,ccw_rotation:0,anchor_alignment:"bottom_right",anchor_position:a})}doInitialSourceRender(){super.doInitialSourceRender();let{db:e}=this.root,t=e.source_board.insert({source_group_id:this.source_group_id,title:this.props.title||this.props.name});this.source_board_id=t.source_board_id}doInitialInflateSubcircuitCircuitJson(){let{circuitJson:e,children:t}=this._parsedProps;qnt(this,e,t)}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,r=t.circuitJson?.find(_=>_.type==="pcb_board"),s=t.width??r?.width??0,o=t.height??r?.height??0,a=this._getGlobalPcbPositionBeforeLayout(),c={x:a.x+(t.outlineOffsetX??0),y:a.y+(t.outlineOffsetY??0)},{boardAnchorPosition:l,boardAnchorAlignment:u}=t;if(l&&(c=M7t({boardAnchorPosition:l,boardAnchorAlignment:u??"center",width:s,height:o})),t.outline){let _=t.outline.map(T=>T.x),g=t.outline.map(T=>T.y),x=Math.min(..._),v=Math.max(..._),S=Math.min(...g),P=Math.max(...g);s=v-x,o=P-S,c={x:(x+v)/2+(t.outlineOffsetX??0),y:(S+P)/2+(t.outlineOffsetY??0)}}let p=t.outline;!p&&t.borderRadius!=null&&s>0&&o>0&&(p=_nt(s,o,t.borderRadius));let d=e.pcb_board.insert({center:c,thickness:this.boardThickness,num_layers:this.allLayers.length,width:s,height:o,outline:p?.map(_=>({x:_.x+(t.outlineOffsetX??0),y:_.y+(t.outlineOffsetY??0)})),material:t.material});this.pcb_board_id=d.pcb_board_id,this._addBoardInformationToSilkscreen()}removePcbComponentRender(){let{db:e}=this.root;this.pcb_board_id&&(e.pcb_board.delete(this.pcb_board_id),this.pcb_board_id=null)}doInitialPcbDesignRuleChecks(){this.root?.pcbDisabled||this.getInheritedProperty("routingDisabled")||super.doInitialPcbDesignRuleChecks()}updatePcbDesignRuleChecks(){if(this.root?.pcbDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:e}=this.root;if(!this._areChildSubcircuitsRouted()||this._drcChecksComplete)return;this._drcChecksComplete=!0;let t=mtt(e.toArray());for(let u of t)e.pcb_trace_error.insert(u);let i=ftt(e.toArray());for(let u of i)e.pcb_port_not_connected_error.insert(u);let r=gtt(e.toArray());for(let u of r)e.pcb_component_outside_board_error.insert(u);let s=vtt(e.toArray());for(let u of s)e.pcb_trace_error.insert(u);let o=btt(e.toArray());for(let u of o)e.pcb_via_clearance_error.insert(u);let a=xtt(e.toArray());for(let u of a)e.pcb_via_clearance_error.insert(u);let c=wtt(e.toArray());for(let u of c)e.pcb_footprint_overlap_error.insert(u);let l=Stt(e.toArray());for(let u of l)e.source_pin_must_be_connected_error.insert(u)}_emitRenderLifecycleEvent(e,t){super._emitRenderLifecycleEvent(e,t),t==="start"&&this.root?.emit("board:renderPhaseStarted",{renderId:this._renderId,phase:e})}},ynt=5,jFt=5,gnt=2;function BFt(n,e){let t=n.center.x-n.width/2,i=n.center.x+n.width/2,r=n.center.y-n.height/2,s=n.center.y+n.height/2,o=e.center.x-e.width/2,a=e.center.x+e.width/2,c=e.center.y-e.height/2,l=e.center.y+e.height/2;return!(i<=o||t>=a||s<=c||r>=l)}function YFt(n,e,t){let i=t.center.x-t.width/2,r=t.center.x+t.width/2,s=t.center.y-t.height/2,o=t.center.y+t.height/2,a=Math.max(i,Math.min(n.x,r)),c=Math.max(s,Math.min(n.y,o)),l=n.x-a,u=n.y-c;return l*l+u*u<=e*e}function XFt({board:n,edge:e,otherBoards:t,options:i}){let r=[];if(!n.width||!n.height)return r;let s=n.center.x-n.width/2,o=n.center.x+n.width/2,a=n.center.y-n.height/2,c=n.center.y+n.height/2,l,u,p;e==="top"||e==="bottom"?(l=n.width,u=!0,p=e==="top"?c:a):(l=n.height,u=!1,p=e==="right"?o:s);let d=i.tabLength,_=i.boardGap;if(i.mouseBites){let P=i.tabWidth*.45,T=P*.1,k=Math.max(2,Math.ceil(i.tabLength/2));_=(k*P+(k-1)*T)*1.1}let g=Math.floor((l-_)/(d+_));if(g<1&&l>=d&&(g=1),g===0)return r;let x=_,v=-l/2,S=l/2;for(let P=0;P<g;P++){let T=v+x+P*(d+x)+d/2,k=P===0,N=P===g-1,E=k||N,C=T-d/2,M=T+d/2;if(E&&(k&&(C=v),N&&(M=S)),C=Math.max(C,v),M=Math.min(M,S),E&&(k&&(C-=i.tabWidth),N&&(M+=i.tabWidth)),M<=C)continue;let A=(C+M)/2,R=M-C,B=e==="top"||e==="right"?i.tabWidth/2:-i.tabWidth/2,D=u?{x:n.center.x+A,y:p+B}:{x:p+B,y:n.center.y+A},U=u?R:i.tabWidth,X=u?i.tabWidth:R,W={center:D,width:U,height:X,boardId:`${n.center.x}_${n.center.y}`},J=!1;for(let nt of t){if(!nt.width||!nt.height)continue;let ft={center:nt.center,width:nt.width,height:nt.height};if(BFt(W,ft)){J=!0;break}}J&&!E||r.push(W)}return r}function UFt({board:n,edge:e,edgeTabs:t,allBoards:i,options:r}){let s=[];if(t.length===0||!n.width||!n.height)return s;let o=n.center.x-n.width/2,a=n.center.x+n.width/2,c=n.center.y-n.height/2,l=n.center.y+n.height/2,u=e==="top"||e==="bottom",p=r.tabWidth*.45,d=p*.1,_=Math.max(2,Math.ceil(r.tabLength/2)),g,x=p/2;e==="top"?g=l:e==="bottom"?g=c:e==="right"?g=a:g=o;let v=[...t].sort((S,P)=>u?S.center.x-P.center.x:S.center.y-P.center.y);for(let S=0;S<v.length-1;S++){let P=v[S],T=v[S+1],k,N;u?(k=P.center.x+P.width/2,N=T.center.x-T.width/2):(k=P.center.y+P.height/2,N=T.center.y-T.height/2);let E=N-k,C=_*p,M=(_-1)*d;if(E<C+M)continue;let A=(k+N)/2;for(let R=0;R<_;R++){let B=(R-(_-1)/2)*(p+d),D=u?{x:A+B,y:g}:{x:g,y:A+B},U=p/2,X=!1;for(let W of i){if(!W.width||!W.height)continue;let J={center:W.center,width:W.width,height:W.height};if(YFt(D,U,J)){X=!0;break}}X||s.push(D)}}return s}function VFt(n,e){let t=[],i=[];for(let a=0;a<n.length;a++){let c=n[a],l=n.filter((u,p)=>p!==a);for(let u of["top","bottom","left","right"]){let p=XFt({board:c,edge:u,otherBoards:l,options:e});if(t.push(...p),e.mouseBites){let d=UFt({board:c,edge:u,edgeTabs:p,allBoards:l,options:e});i.push(...d)}}}let r=t.map((a,c)=>{let l=Math.min(a.width,a.height);return{type:"pcb_cutout",pcb_cutout_id:`panel_tab_${c}`,shape:"rect",center:a.center,width:a.width,height:a.height,corner_radius:l/2}}),s=e.tabWidth*.45,o=i.map((a,c)=>({type:"pcb_hole",pcb_hole_id:`panel_mouse_bite_${c}`,hole_shape:"circle",hole_diameter:s,x:a.x,y:a.y}));return{tabCutouts:r,mouseBiteHoles:o}}var Znt=class extends Sl{constructor(){super(...arguments);f(this,"pcb_panel_id",null);f(this,"_tabsAndMouseBitesGenerated",!1)}get config(){return{componentName:"Panel",zodProps:KW}}get isGroup(){return!0}get isSubcircuit(){return!0}add(e){if(e.lowercaseComponentName!=="board")throw new Error("<panel> can only contain <board> elements");super.add(e)}doInitialPanelLayout(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,t=this.children.filter(a=>a instanceof gP),i=t.some(a=>a.props.pcbX!==void 0||a.props.pcbY!==void 0),r=t.filter(a=>a.props.pcbX===void 0&&a.props.pcbY===void 0);if(r.length>0&&!i){let a=this._parsedProps.tabWidth??gnt,c=this._parsedProps.boardGap??a,l=Math.ceil(Math.sqrt(r.length)),u=Math.ceil(r.length/l),p=Array(l).fill(0),d=Array(u).fill(0);r.forEach((D,U)=>{let X=U%l,W=Math.floor(U/l),J=e.pcb_board.get(D.pcb_board_id);!J||J.width===void 0||J.height===void 0||(p[X]=Math.max(p[X],J.width),d[W]=Math.max(d[W],J.height))});let _=p.reduce((D,U)=>D+U,0)+(l>1?(l-1)*c:0),g=d.reduce((D,U)=>D+U,0)+(u>1?(u-1)*c:0),x=-_/2,S=[-g/2];for(let D=0;D<u-1;D++)S.push(S[D]+d[D]+c);let P=[x];for(let D=0;D<l-1;D++)P.push(P[D]+p[D]+c);let T=this._getGlobalPcbPositionBeforeLayout();r.forEach((D,U)=>{let X=U%l,W=Math.floor(U/l),J=e.pcb_board.get(D.pcb_board_id);if(!J||!J.width||!J.height)return;let nt=P[X]+p[X]/2,ft=S[W]+d[W]/2,G=T.x+nt,et=T.y+ft;D._repositionOnPcb({x:G,y:et}),e.pcb_board.update(D.pcb_board_id,{center:{x:G,y:et}})});let k=t.map(D=>D.pcb_board_id).filter(D=>!!D),N=e.pcb_board.list().filter(D=>k.includes(D.pcb_board_id)),E=1/0,C=1/0,M=-1/0,A=-1/0;for(let D of N){if(D.width===void 0||D.height===void 0||!isFinite(D.width)||!isFinite(D.height))continue;let U=D.center.x-D.width/2,X=D.center.x+D.width/2,W=D.center.y-D.height/2,J=D.center.y+D.height/2;E=Math.min(E,U),M=Math.max(M,X),C=Math.min(C,W),A=Math.max(A,J)}let R=this._parsedProps.width!==void 0,B=this._parsedProps.height!==void 0;if(R&&B)e.pcb_panel.update(this.pcb_panel_id,{width:V.parse(this._parsedProps.width),height:V.parse(this._parsedProps.height)});else if(isFinite(E)){let D=M-E,U=A-C;e.pcb_panel.update(this.pcb_panel_id,{width:R?V.parse(this._parsedProps.width):D+2*ynt,height:B?V.parse(this._parsedProps.height):U+2*ynt})}}if(this._tabsAndMouseBitesGenerated)return;let s=this._parsedProps;if((s.panelizationMethod??"none")!=="none"){let a=t.map(_=>_.pcb_board_id).filter(_=>!!_),c=e.pcb_board.list().filter(_=>a.includes(_.pcb_board_id));if(c.length===0)return;let l=s.tabWidth??gnt,u=s.boardGap??l,{tabCutouts:p,mouseBiteHoles:d}=VFt(c,{boardGap:u,tabWidth:l,tabLength:s.tabLength??jFt,mouseBites:s.mouseBites??!0});for(let _ of p)e.pcb_cutout.insert(_);for(let _ of d)e.pcb_hole.insert(_)}this._tabsAndMouseBitesGenerated=!0}runRenderCycle(){if(!this.children.some(e=>e.componentName==="Board"))throw new Error("<panel> must contain at least one <board>");super.runRenderCycle()}doInitialPcbComponentRender(){if(super.doInitialPcbComponentRender(),this.root?.pcbDisabled)return;let{db:e}=this.root,t=this._parsedProps,i=e.pcb_panel.insert({width:t.width!==void 0?V.parse(t.width):0,height:t.height!==void 0?V.parse(t.height):0,center:this._getGlobalPcbPositionBeforeLayout(),covered_with_solder_mask:!(t.noSolderMask??!1)});this.pcb_panel_id=i.pcb_panel_id}updatePcbComponentRender(){if(this.root?.pcbDisabled||!this.pcb_panel_id)return;let{db:e}=this.root,t=this._parsedProps,i=e.pcb_panel.get(this.pcb_panel_id);e.pcb_panel.update(this.pcb_panel_id,{width:t.width!==void 0?V.parse(t.width):i?.width,height:t.height!==void 0?V.parse(t.height):i?.height,center:this._getGlobalPcbPositionBeforeLayout(),covered_with_solder_mask:!(t.noSolderMask??!1)})}removePcbComponentRender(){this.pcb_panel_id&&(this.root?.db.pcb_panel.delete(this.pcb_panel_id),this.pcb_panel_id=null)}},Knt=class extends q1{constructor(n){super(n)}get config(){return{...super.config,componentName:"Pinout",zodProps:JW}}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=n.source_component.insert({ftype:"simple_pinout",name:this.name,manufacturer_part_number:e.manufacturerPartNumber,supplier_part_numbers:e.supplierPartNumbers});this.source_component_id=t.source_component_id}},Jnt=class extends Bn{get config(){return{componentName:"fuse",schematicSymbolName:this.props.symbolName??"fuse",zodProps:eH,sourceFtype:Ha.simple_fuse}}_getSchematicSymbolDisplayValue(){let n=this._parsedProps.currentRating,e=this._parsedProps.voltageRating,t=typeof n=="string"?parseFloat(n):n,i=typeof e=="string"?parseFloat(e):e;return`${bi(t)}A / ${bi(i)}V`}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=typeof e.currentRating=="string"?parseFloat(e.currentRating):e.currentRating,i=typeof e.voltageRating=="string"?parseFloat(e.voltageRating):e.voltageRating,r=n.source_component.insert({name:this.name,ftype:Ha.simple_fuse,current_rating_amps:t,voltage_rating_volts:i,display_current_rating:`${bi(t)}A`,display_voltage_rating:`${bi(i)}V`});this.source_component_id=r.source_component_id}},Qnt=class extends Bn{constructor(){super(...arguments);f(this,"schematicDimensions",null)}get config(){return{schematicSymbolName:void 0,componentName:"Jumper",zodProps:E4,shouldRenderAsSchematicBox:!0}}_getSchematicPortArrangement(){let e=super._getSchematicPortArrangement();if(e&&Object.keys(e).length>0)return e;let t=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:this.getPortsFromFootprint().length),i=this._parsedProps.schDirection??"right";return{leftSize:i==="left"?t:0,rightSize:i==="right"?t:0}}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),s=e.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:t.manufacturerPartNumber,supplier_part_numbers:t.supplierPartNumbers,are_pins_interchangeable:!0});this.source_component_id=s.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),s=e.pcb_component.insert({center:{x:i,y:r},width:2,height:3,layer:t.layer??"top",rotation:t.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:t.doNotPlace??!1,obstructs_within_bounds:t.obstructsWithinBounds??!0});this.pcb_component_id=s.pcb_component_id}doInitialPcbTraceRender(){let{db:e}=this.root,t=e.pcb_port.list({pcb_component_id:this.pcb_component_id}),i={};for(let o=0;o<t.length;o++){let a=t[o],c=e.source_port.get(a.source_port_id),l="";if(typeof c?.pin_number=="number")l=c.pin_number.toString();else if(Array.isArray(c?.port_hints)){let u=c.port_hints.find(p=>/^(pin)?\d+$/.test(p));u&&(/^pin\d+$/.test(u)?l=u.replace(/^pin/,""):l=u)}i[l]=a.pcb_port_id}let r=e.pcb_trace.list({pcb_component_id:this.pcb_component_id}),s=o=>{if(o&&typeof o=="string"&&o.startsWith("{PIN")){let a=o.replace("{PIN","").replace("}","");return i[a]||o}return o};for(let o of r)if(o.route)for(let a of o.route)a.route_type==="wire"&&(a.start_pcb_port_id=s(a.start_pcb_port_id),a.end_pcb_port_id=s(a.end_pcb_port_id))}},GFt={"0603":"0603","0805":"0805",1206:"1206"},tit=class extends Bn{get config(){return{componentName:"Interconnect",zodProps:tH,shouldRenderAsSchematicBox:!0,sourceFtype:"interconnect"}}_getImpliedFootprintString(){let{standard:n}=this._parsedProps;return n?GFt[n]??null:null}doInitialSourceRender(){let{db:n}=this.root,e=n.source_component.insert({ftype:"interconnect",name:this.name,are_pins_interchangeable:!0});this.source_component_id=e.source_component_id}},eit=class extends Bn{constructor(){super(...arguments);f(this,"schematicDimensions",null)}_getPinNumberFromBridgedPinName(e){return this.selectOne(`port.${e}`,{type:"port"})?._parsedProps.pinNumber??null}get defaultInternallyConnectedPinNames(){if(this._parsedProps.bridged){let e=this.children.filter(t=>t.componentName==="Port").map(t=>t.name);return e.length>0?[e]:[]}return this._parsedProps.bridgedPins??[]}get config(){let e=this._parsedProps??this.props,t=e.pinCount;if(e.pinCount==null&&!e.footprint&&(t=2),e.pinCount==null){let s=(e.bridgedPins??[]).flat().map(l=>this._getPinNumberFromBridgedPinName(l)).filter(l=>l!==null),o=s.length>0?Math.max(...s):0,a=e.pinLabels?Object.keys(e.pinLabels).length:0,c=Math.max(o,a);(c===2||c===3)&&(t=c),t==null&&e.footprint&&[2,3].includes(this.getPortsFromFootprint().length)&&(t=this.getPortsFromFootprint().length)}let i="";t?i+=`solderjumper${t}`:i="solderjumper";let r=[];return Array.isArray(e.bridgedPins)&&e.bridgedPins.length>0?r=Array.from(new Set(e.bridgedPins.flat().map(s=>this._getPinNumberFromBridgedPinName(s)).filter(s=>s!==null))).sort((s,o)=>s-o):e.bridged&&t&&(r=Array.from({length:t},(s,o)=>o+1)),r.length>0&&(i+=`_bridged${r.join("")}`),{schematicSymbolName:e.symbolName??i,componentName:"SolderJumper",zodProps:QW,shouldRenderAsSchematicBox:!0}}_getSchematicPortArrangement(){let e=super._getSchematicPortArrangement();if(e&&Object.keys(e).length>0)return e;let t=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:this.getPortsFromFootprint().length);t==null&&!this._parsedProps.footprint&&(t=2);let i=this._parsedProps.schDirection??"right";return{leftSize:i==="left"?t:0,rightSize:i==="right"?t:0}}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),s=e.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:t.manufacturerPartNumber,supplier_part_numbers:t.supplierPartNumbers,are_pins_interchangeable:!0});this.source_component_id=s.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),s=e.pcb_component.insert({center:{x:i,y:r},width:2,height:3,layer:t.layer??"top",rotation:t.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:t.doNotPlace??!1,obstructs_within_bounds:t.obstructsWithinBounds??!0});this.pcb_component_id=s.pcb_component_id}doInitialPcbTraceRender(){let{db:e}=this.root,t=e.pcb_port.list({pcb_component_id:this.pcb_component_id}),i={};for(let o=0;o<t.length;o++){let a=t[o],c=e.source_port.get(a.source_port_id),l="";if(typeof c?.pin_number=="number")l=c.pin_number.toString();else if(Array.isArray(c?.port_hints)){let u=c.port_hints.find(p=>/^(pin)?\d+$/.test(p));u&&(/^pin\d+$/.test(u)?l=u.replace(/^pin/,""):l=u)}i[l]=a.pcb_port_id}let r=e.pcb_trace.list({pcb_component_id:this.pcb_component_id}),s=o=>{if(o&&typeof o=="string"&&o.startsWith("{PIN")){let a=o.replace("{PIN","").replace("}","");return i[a]||o}return o};for(let o of r)if(o.route)for(let a of o.route)a.route_type==="wire"&&(a.start_pcb_port_id=s(a.start_pcb_port_id),a.end_pcb_port_id=s(a.end_pcb_port_id))}},nit=class extends Bn{constructor(){super(...arguments);f(this,"pos",this.portMap.pin1);f(this,"anode",this.portMap.pin1);f(this,"neg",this.portMap.pin2);f(this,"cathode",this.portMap.pin2)}get config(){let e={laser:"laser_diode"},t=this.props.laser?"laser":null;return{schematicSymbolName:t?e[t]:this.props.symbolName??"led",componentName:"Led",zodProps:EH,sourceFtype:"simple_led"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return this._parsedProps.schDisplayValue||this._parsedProps.color||void 0}getFootprinterString(){let e=super.getFootprinterString();return e&&this.props.color?`${e}_color(${this.props.color})`:e}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=e.source_component.insert({ftype:"simple_led",name:this.name,wave_length:t.wavelength,color:t.color,symbol_display_value:this._getSchematicSymbolDisplayValue(),manufacturer_part_number:t.manufacturerPartNumber??t.mfn,supplier_part_numbers:t.supplierPartNumbers,are_pins_interchangeable:!1});this.source_component_id=i.source_component_id}},iit=class extends Bn{constructor(){super(...arguments);f(this,"pos",this.portMap.pin1);f(this,"positive",this.portMap.pin1);f(this,"neg",this.portMap.pin2);f(this,"negative",this.portMap.pin2)}get config(){return{schematicSymbolName:this.props.symbolName??"power_factor_meter_horz",componentName:"PowerSource",zodProps:BH,sourceFtype:"simple_power_source"}}initPorts(){this.add(new Wi({name:"pin1",pinNumber:1,aliases:["positive","pos"]})),this.add(new Wi({name:"pin2",pinNumber:2,aliases:["negative","neg"]}))}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=e.source_component.insert({ftype:"simple_power_source",name:this.name,voltage:t.voltage,supplier_part_numbers:t.supplierPartNumbers,are_pins_interchangeable:!1});this.source_component_id=i.source_component_id}},rit=class extends Bn{constructor(){super(...arguments);f(this,"terminal1",this.portMap.terminal1);f(this,"terminal2",this.portMap.terminal2)}get config(){return{componentName:"VoltageSource",schematicSymbolName:this.props.waveShape==="square"?"square_wave":"ac_voltmeter",zodProps:YH,sourceFtype:"simple_voltage_source"}}runRenderPhaseForChildren(e){if(!e.startsWith("Pcb"))for(let t of this.children)t.runRenderPhaseForChildren(e),t.runRenderPhase(e)}doInitialPcbComponentRender(){}initPorts(){super.initPorts({additionalAliases:{pin1:["terminal1"],pin2:["terminal2"]}})}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=e.source_component.insert({ftype:"simple_voltage_source",name:this.name,voltage:t.voltage,frequency:t.frequency,peak_to_peak_voltage:t.peakToPeakVoltage,wave_shape:t.waveShape,phase:t.phase,duty_cycle:t.dutyCycle,supplier_part_numbers:t.supplierPartNumbers,are_pins_interchangeable:!0});this.source_component_id=i.source_component_id}doInitialSimulationRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=this.portMap.terminal1,r=this.portMap.terminal2;e.simulation_voltage_source.insert({type:"simulation_voltage_source",is_dc_source:!1,terminal1_source_port_id:i.source_port_id,terminal2_source_port_id:r.source_port_id,voltage:t.voltage,frequency:t.frequency,peak_to_peak_voltage:t.peakToPeakVoltage,wave_shape:t.waveShape,phase:t.phase,duty_cycle:t.dutyCycle})}},WFt=["leftedge","rightedge","topedge","bottomedge","center"],sit=class extends Me{get config(){return{componentName:"Constraint",zodProps:uH}}constructor(n){if(super(n),("xdist"in n||"ydist"in n)&&!("edgeToEdge"in n)&&!("centerToCenter"in n))throw new Error(`edgeToEdge, centerToCenter must be set for xDist or yDist for ${this}`);if("for"in n&&n.for.length<2)throw new Error(`"for" must have at least two selectors for ${this}`)}_getAllReferencedComponents(){let n=[],e=this.getPrimitiveContainer();function t(i){let r=i.split(" ").pop(),s=WFt.includes(r)?r:void 0,o=s?i.replace(` ${s}`,""):i,a=e.selectOne(o,{pcbPrimitive:!0});a&&n.push({selector:i,component:a,componentSelector:o,edge:s})}for(let i of["left","right","top","bottom"])i in this._parsedProps&&t(this._parsedProps[i]);if("for"in this._parsedProps)for(let i of this._parsedProps.for)t(i);return{componentsWithSelectors:n}}},oit=class extends Me{constructor(){super(...arguments);f(this,"fabrication_note_rect_id",null)}get config(){return{componentName:"FabricationNoteRect",zodProps:NH}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),{maybeFlipLayer:s}=this._getPcbPrimitiveFlippedHelpers(),o=s(t.layer??"top");if(o!=="top"&&o!=="bottom")throw new Error(`Invalid layer "${o}" for FabricationNoteRect. Must be "top" or "bottom".`);let a=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,c=this.getSubcircuit(),l=t.hasStroke??(t.strokeWidth!==void 0&&t.strokeWidth!==null),u=e.pcb_fabrication_note_rect.insert({pcb_component_id:a,layer:o,color:t.color,center:{x:i,y:r},width:t.width,height:t.height,stroke_width:t.strokeWidth??1,is_filled:t.isFilled??!1,has_stroke:l,is_stroke_dashed:t.isStrokeDashed??!1,subcircuit_id:c?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,corner_radius:t.cornerRadius??void 0});this.fabrication_note_rect_id=u.pcb_fabrication_note_rect_id}getPcbSize(){let{_parsedProps:e}=this;return{width:e.width,height:e.height}}},ait=class extends Me{constructor(){super(...arguments);f(this,"fabrication_note_path_id",null)}get config(){return{componentName:"FabricationNotePath",zodProps:AH}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,t=this.getSubcircuit(),{_parsedProps:i}=this,r=i.layer??"top";if(r!=="top"&&r!=="bottom")throw new Error(`Invalid layer "${r}" for SilkscreenPath. Must be "top" or "bottom".`);let s=this._computePcbGlobalTransformBeforeLayout(),o=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,a=e.pcb_fabrication_note_path.insert({pcb_component_id:o,layer:r,color:i.color,route:i.route.map(c=>{let l=De(s,{x:c.x,y:c.y});return{...c,x:l.x,y:l.y}}),stroke_width:i.strokeWidth??.1,subcircuit_id:t?.subcircuit_id??void 0});this.fabrication_note_path_id=a.pcb_fabrication_note_path_id}},cit=class extends Me{get config(){return{componentName:"FabricationNoteText",zodProps:IH}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:n}=this.root,{_parsedProps:e}=this,{pcbX:t,pcbY:i}=this.getResolvedPcbPositionProp(),r=this.getPrimitiveContainer(),s=this.getSubcircuit();n.pcb_fabrication_note_text.insert({anchor_alignment:e.anchorAlignment,anchor_position:{x:t,y:i},font:e.font??"tscircuit2024",font_size:e.fontSize??1,layer:"top",color:e.color,text:dP(e.text??""),pcb_component_id:r.pcb_component_id,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}},lit=class extends Me{constructor(){super(...arguments);f(this,"fabrication_note_dimension_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteDimension",zodProps:RH}}_resolvePoint(e,t){if(typeof e=="string"){let s=this.getSubcircuit().selectOne(e);return s?s._getGlobalPcbPositionBeforeLayout():(this.renderError(`FabricationNoteDimension could not find selector "${e}"`),De(t,{x:0,y:0}))}let i=typeof e.x=="string"?parseFloat(e.x):e.x,r=typeof e.y=="string"?parseFloat(e.y):e.y;return De(t,{x:i,y:r})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._computePcbGlobalTransformBeforeLayout(),r=this._resolvePoint(t.from,i),s=this._resolvePoint(t.to,i),o=this.getSubcircuit(),a=this.getGroup(),{maybeFlipLayer:c}=this._getPcbPrimitiveFlippedHelpers(),l=c(t.layer??"top");if(l!=="top"&&l!=="bottom")throw new Error(`Invalid layer "${l}" for FabricationNoteDimension. Must be "top" or "bottom".`);let u=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,p=t.text??this._formatDistanceText({from:r,to:s,units:t.units??"mm"}),d=e.pcb_fabrication_note_dimension.insert({pcb_component_id:u,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:a?.pcb_group_id??void 0,layer:l,from:r,to:s,text:p,offset:t.offset,font:t.font??"tscircuit2024",font_size:t.fontSize??1,color:t.color,arrow_size:t.arrowSize??1});this.fabrication_note_dimension_id=d.pcb_fabrication_note_dimension_id}getPcbSize(){let e=this._computePcbGlobalTransformBeforeLayout(),t=this._resolvePoint(this._parsedProps.from,e),i=this._resolvePoint(this._parsedProps.to,e);return{width:Math.abs(i.x-t.x),height:Math.abs(i.y-t.y)}}_formatDistanceText({from:e,to:t,units:i}){let r=t.x-e.x,s=t.y-e.y,o=Math.sqrt(r*r+s*s),a=i==="in"?o/25.4:o,c=Math.round(a);if(Math.abs(a-c)<1e-9)return`${c}${i}`;let u=i==="in"?3:2;return`${i==="in"?Number(a.toFixed(u)).toString():a.toFixed(u)}${i}`}},uit=class extends Me{constructor(){super(...arguments);f(this,"pcb_note_line_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteLine",zodProps:cq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this.getSubcircuit(),r=this.getGroup(),s=this._computePcbGlobalTransformBeforeLayout(),o=De(s,{x:t.x1,y:t.y1}),a=De(s,{x:t.x2,y:t.y2}),c=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,l=e.pcb_note_line.insert({pcb_component_id:c,subcircuit_id:i?.subcircuit_id??void 0,pcb_group_id:r?.pcb_group_id??void 0,x1:o.x,y1:o.y,x2:a.x,y2:a.y,stroke_width:t.strokeWidth??.1,color:t.color,is_dashed:t.isDashed});this.pcb_note_line_id=l.pcb_note_line_id}getPcbSize(){let{_parsedProps:e}=this;return{width:Math.abs(e.x2-e.x1),height:Math.abs(e.y2-e.y1)}}},pit=class extends Me{constructor(){super(...arguments);f(this,"pcb_note_rect_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteRect",zodProps:oq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._computePcbGlobalTransformBeforeLayout(),r=De(i,{x:0,y:0}),s=this.getSubcircuit(),o=this.getGroup(),a=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,c=e.pcb_note_rect.insert({pcb_component_id:a,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:o?.pcb_group_id??void 0,center:r,width:t.width,height:t.height,stroke_width:t.strokeWidth??.1,is_filled:t.isFilled??!1,has_stroke:t.hasStroke??!0,is_stroke_dashed:t.isStrokeDashed??!1,color:t.color,corner_radius:t.cornerRadius??void 0});this.pcb_note_rect_id=c.pcb_note_rect_id}getPcbSize(){let{_parsedProps:e}=this,t=typeof e.width=="string"?parseFloat(e.width):e.width,i=typeof e.height=="string"?parseFloat(e.height):e.height;return{width:t,height:i}}},hit=class extends Me{constructor(){super(...arguments);f(this,"pcb_note_text_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteText",zodProps:sq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._computePcbGlobalTransformBeforeLayout(),r=De(i,{x:0,y:0}),s=this.getSubcircuit(),o=this.getGroup(),a=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,c=e.pcb_note_text.insert({pcb_component_id:a,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:o?.pcb_group_id??void 0,font:t.font??"tscircuit2024",font_size:t.fontSize??1,text:dP(t.text),anchor_position:r,anchor_alignment:t.anchorAlignment??"center",color:t.color});this.pcb_note_text_id=c.pcb_note_text_id}getPcbSize(){let{_parsedProps:e}=this,t=typeof e.fontSize=="string"?parseFloat(e.fontSize):e.fontSize??1,i=t*.6;return{width:e.text.length*i,height:t}}},dit=class extends Me{constructor(){super(...arguments);f(this,"pcb_note_path_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNotePath",zodProps:aq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._computePcbGlobalTransformBeforeLayout(),r=this.getSubcircuit(),s=this.getGroup(),o=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,a=t.route.map(l=>{let{x:u,y:p,...d}=l,_=typeof u=="string"?parseFloat(u):u,g=typeof p=="string"?parseFloat(p):p,x=De(i,{x:_,y:g});return{...d,x:x.x,y:x.y}}),c=e.pcb_note_path.insert({pcb_component_id:o,subcircuit_id:r?.subcircuit_id??void 0,pcb_group_id:s?.pcb_group_id??void 0,route:a,stroke_width:t.strokeWidth??.1,color:t.color});this.pcb_note_path_id=c.pcb_note_path_id}getPcbSize(){let{_parsedProps:e}=this;if(e.route.length===0)return{width:0,height:0};let t=e.route.map(c=>typeof c.x=="string"?parseFloat(c.x):c.x),i=e.route.map(c=>typeof c.y=="string"?parseFloat(c.y):c.y),r=Math.min(...t),s=Math.max(...t),o=Math.min(...i),a=Math.max(...i);return{width:s-r,height:a-o}}},fit=class extends Me{constructor(){super(...arguments);f(this,"pcb_note_dimension_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteDimension",zodProps:lq}}_resolvePoint(e,t){if(typeof e=="string"){let s=this.getSubcircuit().selectOne(`.${e}`);return s?s._getGlobalPcbPositionBeforeLayout():(this.renderError(`PcbNoteDimension could not find selector "${e}"`),De(t,{x:0,y:0}))}let i=typeof e.x=="string"?parseFloat(e.x):e.x,r=typeof e.y=="string"?parseFloat(e.y):e.y;return De(t,{x:i,y:r})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._computePcbGlobalTransformBeforeLayout(),r=this._resolvePoint(t.from,i),s=this._resolvePoint(t.to,i),o=this.getSubcircuit(),a=this.getGroup(),c=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,l=t.text??this._formatDistanceText({from:r,to:s,units:t.units??"mm"}),u=e.pcb_note_dimension.insert({pcb_component_id:c,subcircuit_id:o?.subcircuit_id??void 0,pcb_group_id:a?.pcb_group_id??void 0,from:r,to:s,text:l,font:t.font??"tscircuit2024",font_size:t.fontSize??1,color:t.color,arrow_size:t.arrowSize??1});this.pcb_note_dimension_id=u.pcb_note_dimension_id}getPcbSize(){let e=this._computePcbGlobalTransformBeforeLayout(),t=this._resolvePoint(this._parsedProps.from,e),i=this._resolvePoint(this._parsedProps.to,e);return{width:Math.abs(i.x-t.x),height:Math.abs(i.y-t.y)}}_formatDistanceText({from:e,to:t,units:i}){let r=t.x-e.x,s=t.y-e.y,o=Math.sqrt(r*r+s*s),a=i==="in"?o/25.4:o,c=Math.round(a);if(Math.abs(a-c)<1e-9)return`${c}${i}`;let u=i==="in"?3:2;return`${i==="in"?Number(a.toFixed(u)).toString():a.toFixed(u)}${i}`}},mit=class extends Sl{constructor(n){super({...n,subcircuit:!0})}doInitialInflateSubcircuitCircuitJson(){let{circuitJson:n,children:e}=this._parsedProps;qnt(this,n,e)}},_it=class extends Sl{constructor(n){super({...n,subcircuit:!0})}doInitialPcbPrimitiveRender(){if(super.doInitialPcbPrimitiveRender(),this.root?.pcbDisabled)return;let{db:n}=this.root,e=this._parsedProps;if(!this.pcb_group_id)return;let t=n.pcb_group.get(this.pcb_group_id),i=e.paddingLeft??e.padding??0,r=e.paddingRight??e.padding??0,s=e.paddingTop??e.padding??0,o=e.paddingBottom??e.padding??0;n.pcb_group.update(this.pcb_group_id,{width:(t.width??0)+i+r,height:(t.height??0)+s+o,center:{x:t.center.x+(r-i)/2,y:t.center.y+(s-o)/2}})}},yit=class extends Me{constructor(){super(...arguments);f(this,"pcb_breakout_point_id",null);f(this,"matchedPort",null);f(this,"matchedNet",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"BreakoutPoint",zodProps:FH}}_matchConnection(){let{connection:e}=this._parsedProps,t=this.getSubcircuit();t&&(this.matchedPort=t.selectOne(e,{type:"port"}),this.matchedPort||(this.matchedNet=t.selectOne(e,{type:"net"})),!this.matchedPort&&!this.matchedNet&&this.renderError(`Could not find connection target "${e}"`))}_getSourceTraceIdForPort(e){let{db:t}=this.root;return t.source_trace.list().find(r=>r.connected_source_port_ids.includes(e.source_port_id))?.source_trace_id}_getSourceNetIdForPort(e){let{db:t}=this.root;return t.source_trace.list().find(r=>r.connected_source_port_ids.includes(e.source_port_id))?.connected_source_net_ids[0]}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root;this._matchConnection();let{pcbX:t,pcbY:i}=this.getResolvedPcbPositionProp(),r=this.parent?.getGroup(),s=this.getSubcircuit();if(!r||!r.pcb_group_id)return;let o=e.pcb_breakout_point.insert({pcb_group_id:r.pcb_group_id,subcircuit_id:s?.subcircuit_id??void 0,source_port_id:this.matchedPort?.source_port_id??void 0,source_trace_id:this.matchedPort?this._getSourceTraceIdForPort(this.matchedPort):void 0,source_net_id:this.matchedNet?this.matchedNet.source_net_id:this.matchedPort?this._getSourceNetIdForPort(this.matchedPort):void 0,x:t,y:i});this.pcb_breakout_point_id=o.pcb_breakout_point_id}_getPcbCircuitJsonBounds(){let{pcbX:e,pcbY:t}=this.getResolvedPcbPositionProp();return{center:{x:e,y:t},bounds:{left:e,top:t,right:e,bottom:t},width:0,height:0}}_setPositionFromLayout(e){let{db:t}=this.root;this.pcb_breakout_point_id&&t.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:e.x,y:e.y})}getPcbSize(){return{width:0,height:0}}},git=class extends Me{constructor(){super(...arguments);f(this,"source_net_label_id")}get config(){return{componentName:"NetLabel",zodProps:xH}}_getAnchorSide(){let{_parsedProps:e}=this;if(e.anchorSide)return e.anchorSide;if(!this._resolveConnectsTo())return"right";let i=this._getGlobalSchematicPositionBeforeLayout(),r=this._getConnectedPorts();if(r.length===0)return"right";let s=r[0]._getGlobalSchematicPositionBeforeLayout(),o=s.x-i.x,a=s.y-i.y;if(Math.abs(o)>Math.abs(a)){if(o>0)return"right";if(o<0)return"left"}else{if(a>0)return"top";if(a<0)return"bottom"}return"right"}_getConnectedPorts(){let e=this._resolveConnectsTo();if(!e)return[];let t=[];for(let i of e){let r=this.getSubcircuit().selectOne(i);r&&t.push(r)}return t}computeSchematicPropsTransform(){let{_parsedProps:e}=this;if(e.schX===void 0&&e.schY===void 0){let t=this._getConnectedPorts();if(t.length>0){let i=t[0]._getGlobalSchematicPositionBeforeLayout(),r=De(this.parent?.computeSchematicGlobalTransform?.()??Pr(),{x:0,y:0});return kn(i.x-r.x,i.y-r.y)}}return super.computeSchematicPropsTransform()}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalSchematicPositionBeforeLayout(),r=this.getSubcircuit().selectOne(`net.${this._getNetName()}`),s=t.anchorSide??"right",o=wl({anchor_position:i,anchor_side:s,text:t.net}),a=e.schematic_net_label.insert({text:t.net,source_net_id:r.source_net_id,anchor_position:i,center:o,anchor_side:this._getAnchorSide()});this.source_net_label_id=a.source_net_id}_resolveConnectsTo(){let{_parsedProps:e}=this,t=e.connectsTo??e.connection;if(Array.isArray(t))return t;if(typeof t=="string")return[t]}_getNetName(){let{_parsedProps:e}=this;return e.net}doInitialCreateNetsFromProps(){let{_parsedProps:e}=this;e.net&&hP(this,[`net.${e.net}`])}doInitialCreateTracesFromNetLabels(){if(this.root?.schematicDisabled)return;let e=this._resolveConnectsTo();if(e)for(let t of e)this.add(new zs({from:t,to:`net.${this._getNetName()}`}))}doInitialSchematicTraceRender(){if(!this.root?._featureMspSchematicTraceRouting||this.root?.schematicDisabled)return;let{db:e}=this.root,t=this._resolveConnectsTo();if(!t||t.length===0)return;let i=this._getGlobalSchematicPositionBeforeLayout(),r=this._getAnchorSide(),o={left:"x-",right:"x+",top:"y+",bottom:"y-"}[r],a=this.getSubcircuit().selectOne(`net.${this._getNetName()}`);for(let c of t){let l=this.getSubcircuit().selectOne(c,{type:"port"});if(!l||!l.schematic_port_id)continue;let u=!1;if(a?.source_net_id){let S=e.source_trace.list().find(P=>P.connected_source_net_ids?.includes(a.source_net_id)&&P.connected_source_port_ids?.includes(l.source_port_id??""));if(S&&(u=e.schematic_trace.list().some(P=>P.source_trace_id===S.source_trace_id)),u)continue}let p=l._getGlobalSchematicPositionAfterLayout(),d=v9(l.facingDirection??"right")??"x+",_=Qc({x:p.x,y:p.y,facingDirection:d},{x:i.x,y:i.y,facingDirection:o});if(!Array.isArray(_)||_.length<2)continue;let g=[];for(let S=0;S<_.length-1;S++)g.push({from:{x:_[S].x,y:_[S].y},to:{x:_[S+1].x,y:_[S+1].y}});let x,v;if(a?.source_net_id&&l.source_port_id){let S=e.source_trace.list().find(P=>P.connected_source_net_ids?.includes(a.source_net_id)&&P.connected_source_port_ids?.includes(l.source_port_id));x=S?.source_trace_id,v=S?.subcircuit_connectivity_map_key||e.source_net.get(a.source_net_id)?.subcircuit_connectivity_map_key}e.schematic_trace.insert({source_trace_id:x,edges:g,junctions:[],subcircuit_connectivity_map_key:v}),e.schematic_port.update(l.schematic_port_id,{is_connected:!0})}}},xit=class extends Me{constructor(){super(...arguments);f(this,"pcb_silkscreen_circle_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenCircle",zodProps:iq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{pcbX:i,pcbY:r}=this.getResolvedPcbPositionProp(),{maybeFlipLayer:s}=this._getPcbPrimitiveFlippedHelpers(),o=s(t.layer??"top");if(o!=="top"&&o!=="bottom")throw new Error(`Invalid layer "${o}" for SilkscreenCircle. Must be "top" or "bottom".`);let a=this._computePcbGlobalTransformBeforeLayout(),c=this.getSubcircuit(),l=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,u=e.pcb_silkscreen_circle.insert({pcb_component_id:l,layer:o,center:{x:i,y:r},radius:t.radius,subcircuit_id:c?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,stroke_width:t.strokeWidth??.1});this.pcb_silkscreen_circle_id=u.pcb_silkscreen_circle_id}getPcbSize(){let{_parsedProps:e}=this,t=e.radius*2;return{width:t,height:t}}},bit=class extends Me{constructor(){super(...arguments);f(this,"pcb_silkscreen_rect_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenRect",zodProps:nq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{maybeFlipLayer:i}=this._getPcbPrimitiveFlippedHelpers(),r=i(t.layer??"top");if(r!=="top"&&r!=="bottom")throw new Error(`Invalid layer "${r}" for SilkscreenRect. Must be "top" or "bottom".`);let s=this.getSubcircuit(),{pcbX:o,pcbY:a}=this.getResolvedPcbPositionProp(),c=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,l=e.pcb_silkscreen_rect.insert({pcb_component_id:c,layer:r,center:{x:o,y:a},width:t.width,height:t.height,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:this?.getGroup()?.pcb_group_id??void 0,stroke_width:t.strokeWidth??.1,is_filled:t.filled??!1,corner_radius:t.cornerRadius??void 0});this.pcb_silkscreen_rect_id=l.pcb_silkscreen_rect_id}getPcbSize(){let{_parsedProps:e}=this;return{width:e.width,height:e.height}}},vit=class extends Me{constructor(){super(...arguments);f(this,"pcb_silkscreen_line_id",null);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenLine",zodProps:eq}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,{maybeFlipLayer:i}=this._getPcbPrimitiveFlippedHelpers(),r=i(t.layer??"top");if(r!=="top"&&r!=="bottom")throw new Error(`Invalid layer "${r}" for SilkscreenLine. Must be "top" or "bottom".`);let s=this.getSubcircuit(),o=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,a=e.pcb_silkscreen_line.insert({pcb_component_id:o,layer:r,x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2,stroke_width:t.strokeWidth??.1,subcircuit_id:s?.subcircuit_id??void 0,pcb_group_id:s?.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_line_id=a.pcb_silkscreen_line_id}getPcbSize(){let{_parsedProps:e}=this,t=Math.abs(e.x2-e.x1),i=Math.abs(e.y2-e.y1);return{width:t,height:i}}},wit=class extends Me{constructor(e){super(e);f(this,"pcb_via_id",null);f(this,"matchedPort",null);f(this,"isPcbPrimitive",!0);f(this,"source_manually_placed_via_id",null);f(this,"subcircuit_connectivity_map_key",null);let t=this._getLayers();this._parsedProps.layers=t,this.initPorts()}get config(){return{componentName:"Via",zodProps:OH}}getAvailablePcbLayers(){return["top","inner1","inner2","bottom"]}_getResolvedViaDiameters(e){return l7t({holeDiameter:this._parsedProps.holeDiameter,padDiameter:this._parsedProps.outerDiameter},e)}getPcbSize(){let e=this.getInheritedMergedProperty("pcbStyle"),{padDiameter:t}=this._getResolvedViaDiameters(e);return{width:t,height:t}}_getPcbCircuitJsonBounds(){let{db:e}=this.root,t=e.pcb_via.get(this.pcb_via_id),i=this.getPcbSize();return{center:{x:t.x,y:t.y},bounds:{left:t.x-i.width/2,top:t.y-i.height/2,right:t.x+i.width/2,bottom:t.y+i.height/2},width:i.width,height:i.height}}_setPositionFromLayout(e){let{db:t}=this.root;t.pcb_via.update(this.pcb_via_id,{x:e.x,y:e.y})}_getLayers(){let{fromLayer:e="top",toLayer:t="bottom"}=this._parsedProps;return e===t?[e]:[e,t]}initPorts(){let e=this._parsedProps.layers;for(let i of e){let r=new Wi({name:i,layer:i});r.registerMatch(this),this.add(r)}let t=new Wi({name:"pin1"});t.registerMatch(this),this.add(t)}_getConnectedNetOrTrace(){let e=this._parsedProps.connectsTo;if(!e)return null;let t=this.getSubcircuit(),i=Array.isArray(e)?e:[e];for(let r of i)if(r.startsWith("net.")){let s=t.selectOne(r,{type:"net"});if(s)return s}return null}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,t=this.getInheritedMergedProperty("pcbStyle"),{padDiameter:i}=this._getResolvedViaDiameters(t),r=this._getGlobalPcbPositionBeforeLayout(),s=this.getSubcircuit(),o=e.pcb_component.insert({center:r,width:i,height:i,layer:this._parsedProps.fromLayer??"top",rotation:0,source_component_id:this.source_component_id,subcircuit_id:s?.subcircuit_id??void 0,obstructs_within_bounds:!0});this.pcb_component_id=o.pcb_component_id}doInitialSourceRender(){let{db:e}=this.root,{_parsedProps:t}=this,i=this.getGroup(),r=this.getSubcircuit(),s=e.source_manually_placed_via.insert({source_group_id:i?.source_group_id,source_net_id:t.net??"",subcircuit_id:r?.subcircuit_id??void 0});this.source_component_id=s.source_manually_placed_via_id}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:e}=this.root,t=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter:i,padDiameter:r}=this._getResolvedViaDiameters(t),s=this._getGlobalPcbPositionBeforeLayout(),o=this.getSubcircuit(),a=e.pcb_via.insert({x:s.x,y:s.y,hole_diameter:i,outer_diameter:r,layers:["bottom","top"],from_layer:this._parsedProps.fromLayer||"bottom",to_layer:this._parsedProps.toLayer||"top",subcircuit_id:o?.subcircuit_id??void 0,subcircuit_connectivity_map_key:this.subcircuit_connectivity_map_key??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,net_is_assignable:this._parsedProps.netIsAssignable??void 0});this.pcb_via_id=a.pcb_via_id}},Sit=class extends Me{constructor(){super(...arguments);f(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CopperPour",zodProps:zH}}getPcbSize(){return{width:0,height:0}}doInitialCreateNetsFromProps(){let{_parsedProps:e}=this;hP(this,[e.connectsTo])}doInitialPcbCopperPourRender(){this.root?.pcbDisabled||this._queueAsyncEffect("PcbCopperPourRender",async()=>{let{db:e}=this.root,{_parsedProps:t}=this,i=this.getSubcircuit().selectOne(t.connectsTo);if(!i||!i.source_net_id){this.renderError(`Net "${t.connectsTo}" not found for copper pour`);return}let r=this.getSubcircuit(),s=e.toArray().filter(p=>p.type==="source_net"&&p.name===i.name)[0]||"",o=t.clearance??.2,a=Ttt(e.toArray(),{layer:t.layer,pour_connectivity_key:s.subcircuit_connectivity_map_key||"",pad_margin:t.padMargin??o,trace_margin:t.traceMargin??o,board_edge_margin:t.boardEdgeMargin??o,cutout_margin:t.cutoutMargin??o}),c=new ktt(a),{brep_shapes:l}=c.getOutput(),u=t.coveredWithSolderMask??!1;for(let p of l)e.pcb_copper_pour.insert({shape:"brep",layer:t.layer,brep_shape:p,source_net_id:i.source_net_id,subcircuit_id:r?.subcircuit_id??void 0,covered_with_solder_mask:u})})}},Pit=class extends Bn{get config(){return{componentName:"Battery",schematicSymbolName:this.props.symbolName??"battery",zodProps:yH,sourceFtype:"simple_power_source"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=n.source_component.insert({name:this.name,ftype:"simple_power_source",capacity:e.capacity,supplier_part_numbers:e.supplierPartNumbers,are_pins_interchangeable:!1});this.source_component_id=t.source_component_id}},kit=class extends Bn{_getPcbRotationBeforeLayout(){let n=this.props.pcbOrientation==="vertical"?-90:0;return(super._getPcbRotationBeforeLayout()??0)+n}get config(){return{componentName:"PinHeader",zodProps:gH,shouldRenderAsSchematicBox:!0}}_getImpliedFootprintString(){let n=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:0),e=this._parsedProps.holeDiameter,t=this._parsedProps.platedDiameter,i=this._parsedProps.pitch,r=this._parsedProps.showSilkscreenPinLabels,s=this._parsedProps.doubleRow?2:1;if(n>0){let o;if(i)!e&&!t?o=`pinrow${n}_p${i}`:o=`pinrow${n}_p${i}_id${e}_od${t}`;else if(!e&&!t)o=`pinrow${n}`;else return null;return r!==!0&&(o+="_nopinlabels"),s>1&&(o+=`_rows${s}`),o}return null}initPorts(){let n=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:1);for(let e=1;e<=n;e++){let t=Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels[e-1]:this._parsedProps.pinLabels?.[`pin${e}`];if(t){let i=Array.isArray(t)?t[0]:t,r=Array.isArray(t)?t.slice(1):[];this.add(new Wi({pinNumber:e,name:i,aliases:[`pin${e}`,...r]}))}else this.add(new Wi({pinNumber:e,name:`pin${e}`}))}}_getSchematicPortArrangement(){let n=this._parsedProps.pinCount??1,e=this._parsedProps.schFacingDirection??this._parsedProps.facingDirection??"right",t=this._parsedProps.schPinArrangement;return e==="left"?{leftSide:{direction:t?.leftSide?.direction??"top-to-bottom",pins:t?.leftSide?.pins??Array.from({length:n},(i,r)=>`pin${r+1}`)}}:{rightSide:{direction:t?.rightSide?.direction??"top-to-bottom",pins:t?.rightSide?.pins??Array.from({length:n},(i,r)=>`pin${r+1}`)}}}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=n.source_component.insert({ftype:"simple_pin_header",name:this.name,supplier_part_numbers:e.supplierPartNumbers,pin_count:e.pinCount,gender:e.gender,are_pins_interchangeable:!0});this.source_component_id=t.source_component_id}};function HFt(n){switch(n){case"two_ground_pins":return"crystal_4pin";case"ground_pin":return"resonator";case"no_ground":return"crystal";default:return"crystal"}}var Tit=class extends Bn{get config(){return{componentName:"Resonator",schematicSymbolName:this.props.symbolName??HFt(this.props.pinVariant),zodProps:aH,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=e.pinVariant||"no_ground",i=n.source_component.insert({ftype:"simple_resonator",name:this.name,frequency:e.frequency,load_capacitance:e.loadCapacitance,supplier_part_numbers:e.supplierPartNumbers,pin_variant:t,are_pins_interchangeable:t==="no_ground"||t==="ground_pin"});this.source_component_id=i.source_component_id}_getSchematicSymbolDisplayValue(){let n=`${bi(this._parsedProps.frequency)}Hz`;return this._parsedProps.loadCapacitance?`${n} / ${bi(this._parsedProps.loadCapacitance)}F`:n}};function qFt(n){switch(n){case"three_pin":return"potentiometer3";case"two_pin":return"potentiometer2";default:return"potentiometer2"}}var Eit=class extends Bn{get config(){return{componentName:"Potentiometer",schematicSymbolName:this.props.symbolName??qFt(this.props.pinVariant),zodProps:sH,shouldRenderAsSchematicBox:!1}}_getSchematicSymbolDisplayValue(){return`${bi(this._parsedProps.maxResistance)}\u03A9`}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=e.pinVariant||"two_pin",i=n.source_component.insert({ftype:"simple_potentiometer",name:this.name,max_resistance:e.maxResistance,pin_variant:t,are_pins_interchangeable:t==="two_pin"});this.source_component_id=i.source_component_id}},Mit=class extends Bn{get config(){return{componentName:"PushButton",schematicSymbolName:this.props.symbolName??"push_button_normally_open_momentary",zodProps:bH,sourceFtype:Ha.simple_push_button}}get defaultInternallyConnectedPinNames(){return[]}initPorts(){super.initPorts({pinCount:2,ignoreSymbolPorts:!0});let n=gi[this._getSchematicSymbolNameOrThrow()],e=n.ports.find(l=>l.labels.includes("1")),t=n.ports.find(l=>l.labels.includes("2")),i=this.selectAll("port"),r=i.find(l=>l.props.pinNumber===1),s=i.find(l=>l.props.pinNumber===2),o=i.find(l=>l.props.pinNumber===3),a=i.find(l=>l.props.pinNumber===4),{internallyConnectedPins:c}=this._parsedProps;r.schematicSymbolPortDef=e,(!c||c.length===0)&&(s.schematicSymbolPortDef=t);for(let[l,u]of[[2,s],[3,o],[4,a]]){let p=c?.find(([_,g])=>_===`pin${l}`||g===`pin${l}`);if(!p){u.schematicSymbolPortDef=t;break}(p?.[0]===`pin${l}`?p[1]:p?.[0])!=="pin1"&&(u.schematicSymbolPortDef=t)}}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=n.source_component.insert({name:this.name,ftype:Ha.simple_push_button,supplier_part_numbers:e.supplierPartNumbers,are_pins_interchangeable:!0});this.source_component_id=t.source_component_id}},Cit=class extends Bn{get config(){return{schematicSymbolName:this.props.symbolName??(this.props.pinVariant==="four_pin"?"crystal_4pin":"crystal"),componentName:"Crystal",zodProps:oH,sourceFtype:"simple_crystal"}}initPorts(){let n=this.props.pinVariant==="four_pin"?{pin1:["left1","1"],pin2:["top1","2","gnd1"],pin3:["right1","3"],pin4:["bottom1","4","gnd2"]}:{pin1:["pos","left"],pin2:["neg","right"]};super.initPorts({additionalAliases:n})}_getSchematicSymbolDisplayValue(){let n=`${bi(this._parsedProps.frequency)}Hz`;return this._parsedProps.loadCapacitance?`${n} / ${bi(this._parsedProps.loadCapacitance)}F`:n}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=n.source_component.insert({name:this.name,ftype:"simple_crystal",frequency:e.frequency,load_capacitance:e.loadCapacitance,pin_variant:e.pinVariant||"two_pin",are_pins_interchangeable:(e.pinVariant||"two_pin")==="two_pin"});this.source_component_id=t.source_component_id}},Iit=class extends Bn{get config(){let n=this.props.mosfetMode==="depletion"?"d":"e",t=`${this.props.channelType}_channel_${n}_mosfet_transistor`;return{componentName:"Mosfet",schematicSymbolName:this.props.symbolName??t,zodProps:SH,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,t=n.source_component.insert({ftype:"simple_mosfet",name:this.name,mosfet_mode:e.mosfetMode,channel_type:e.channelType});this.source_component_id=t.source_component_id}};function ZFt(n){return n.simSwitchFrequency!==void 0||n.simCloseAt!==void 0||n.simOpenAt!==void 0||n.simStartClosed!==void 0||n.simStartOpen!==void 0}var Nit=class extends Bn{_getSwitchType(){let n=this._parsedProps;return n?n.dpdt?"dpdt":n.spst?"spst":n.spdt?"spdt":n.dpst?"dpst":n.type??"spst":"spst"}get config(){let n=this._getSwitchType(),e=this._parsedProps?.isNormallyClosed??!1,t={spst:e?"spst_normally_closed_switch":"spst_switch",spdt:e?"spdt_normally_closed_switch":"spdt_switch",dpst:e?"dpst_normally_closed_switch":"dpst_switch",dpdt:e?"dpdt_normally_closed_switch":"dpdt_switch"};return{componentName:"Switch",schematicSymbolName:this.props.symbolName??t[n],zodProps:CH,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:n}=this.root,e=this._parsedProps??{},t=n.source_component.insert({ftype:"simple_switch",name:this.name,are_pins_interchangeable:this._getSwitchType()==="spst"});this.source_component_id=t.source_component_id}doInitialSimulationRender(){let{_parsedProps:n}=this;if(!ZFt(n))return;let{db:e}=this.root,t={type:"simulation_switch",source_component_id:this.source_component_id||""};n.simSwitchFrequency!==void 0&&(t.switching_frequency=zr.parse(n.simSwitchFrequency)),n.simCloseAt!==void 0&&(t.closes_at=hr.parse(n.simCloseAt)),n.simOpenAt!==void 0&&(t.opens_at=hr.parse(n.simOpenAt)),n.simStartOpen!==void 0&&(t.starts_closed=!n.simStartOpen),n.simStartClosed!==void 0&&(t.starts_closed=n.simStartClosed),e.simulation_switch.insert(t)}},g9={HOLE_DIAMETER:.5,SMT_CIRCLE_DIAMETER:1.2,SMT_RECT_SIZE:2},Ait=class extends Bn{get config(){return{componentName:"TestPoint",schematicSymbolName:this.props.symbolName??"testpoint",zodProps:LH,sourceFtype:Ha.simple_test_point}}_getPropsWithDefaults(){let{padShape:n,holeDiameter:e,footprintVariant:t,padDiameter:i,width:r,height:s}=this._parsedProps;return!t&&e&&(t="through_hole"),t??(t="through_hole"),n??(n="circle"),t==="pad"?n==="circle"?i??(i=g9.SMT_CIRCLE_DIAMETER):n==="rect"&&(r??(r=g9.SMT_RECT_SIZE),s??(s=r)):t==="through_hole"&&(e??(e=g9.HOLE_DIAMETER)),{padShape:n,holeDiameter:e,footprintVariant:t,padDiameter:i,width:r,height:s}}_getImpliedFootprintString(){let{padShape:n,holeDiameter:e,footprintVariant:t,padDiameter:i,width:r,height:s}=this._getPropsWithDefaults();if(t==="through_hole")return`platedhole_d${e}`;if(t==="pad"){if(n==="circle")return`smtpad_circle_d${i}`;if(n==="rect")return`smtpad_rect_w${r}_h${s}`}throw new Error(`Footprint variant "${t}" with pad shape "${n}" not implemented`)}doInitialSourceRender(){let{db:n}=this.root,{_parsedProps:e}=this,{padShape:t,holeDiameter:i,footprintVariant:r,padDiameter:s,width:o,height:a}=this._getPropsWithDefaults(),c=n.source_component.insert({ftype:Ha.simple_test_point,name:this.name,supplier_part_numbers:e.supplierPartNumbers,footprint_variant:r,pad_shape:t,pad_diameter:s,hole_diameter:i,width:o,height:a,are_pins_interchangeable:!0});this.source_component_id=c.source_component_id}},Rit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicText",zodProps:qH}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalSchematicPositionBeforeLayout();e.schematic_text.insert({anchor:t.anchor??"center",text:dP(t.text),font_size:t.fontSize,color:t.color||"#000000",position:{x:i.x,y:i.y},rotation:t.schRotation??0})}},Oit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0);f(this,"schematic_line_id")}get config(){return{componentName:"SchematicLine",zodProps:HH}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalSchematicPositionBeforeLayout(),r=this.getPrimitiveContainer()?.parent?.schematic_component_id,s=e.schematic_line.insert({schematic_component_id:r,x1:t.x1+i.x,y1:t.y1+i.y,x2:t.x2+i.x,y2:t.y2+i.y,stroke_width:t.strokeWidth??yP,color:t.color??_P,is_dashed:!1,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_line_id=s.schematic_line_id}},Lit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0);f(this,"schematic_rect_id")}get config(){return{componentName:"SchematicRect",zodProps:WH}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalSchematicPositionBeforeLayout(),r=this.getPrimitiveContainer()?.parent?.schematic_component_id,s=e.schematic_rect.insert({center:{x:i.x,y:i.y},width:t.width,height:t.height,stroke_width:t.strokeWidth??yP,color:t.color??_P,is_filled:t.isFilled,schematic_component_id:r,is_dashed:t.isDashed,rotation:t.rotation??0,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_rect_id=s.schematic_rect_id}},Fit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0);f(this,"schematic_arc_id")}get config(){return{componentName:"SchematicArc",zodProps:UH}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalSchematicPositionBeforeLayout(),r=this.getPrimitiveContainer()?.parent?.schematic_component_id,s=e.schematic_arc.insert({schematic_component_id:r,center:{x:t.center.x+i.x,y:t.center.y+i.y},radius:t.radius,start_angle_degrees:t.startAngleDegrees,end_angle_degrees:t.endAngleDegrees,direction:t.direction,stroke_width:t.strokeWidth??yP,color:t.color??_P,is_dashed:t.isDashed,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_arc_id=s.schematic_arc_id}},$it=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0);f(this,"schematic_circle_id")}get config(){return{componentName:"SchematicCircle",zodProps:GH}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this._getGlobalSchematicPositionBeforeLayout(),r=this.getPrimitiveContainer()?.parent?.schematic_component_id,s=e.schematic_circle.insert({schematic_component_id:r,center:{x:t.center.x+i.x,y:t.center.y+i.y},radius:t.radius,stroke_width:t.strokeWidth??yP,color:t.color??_P,is_filled:t.isFilled,fill_color:t.fillColor,is_dashed:t.isDashed,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_circle_id=s.schematic_circle_id}};function KFt({anchor:n,x:e,y:t,width:i,height:r,isInside:s}){switch(n){case"top_left":return{x:e,y:t+r,textAnchor:s?"top_left":"bottom_left"};case"top_center":return{x:e+i/2,y:t+r,textAnchor:s?"top_center":"bottom_center"};case"top_right":return{x:e+i,y:t+r,textAnchor:s?"top_right":"bottom_right"};case"center_left":return{x:e,y:t+r/2,textAnchor:s?"center_left":"center_right"};case"center":return{x:e+i/2,y:t+r/2,textAnchor:"center"};case"center_right":return{x:e+i,y:t+r/2,textAnchor:s?"center_right":"center_left"};case"bottom_left":return{x:e,y:t,textAnchor:s?"bottom_left":"top_left"};case"bottom_center":return{x:e+i/2,y:t,textAnchor:s?"bottom_center":"top_center"};case"bottom_right":return{x:e+i,y:t,textAnchor:s?"bottom_right":"top_right"};default:return{x:e+i/2,y:t+r,textAnchor:"center"}}}var zit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicBox",zodProps:VH,shouldRenderAsSchematicBox:!0}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=.6,r=typeof t.padding=="number"?t.padding:0,s=typeof t.paddingTop=="number"?t.paddingTop:r,o=typeof t.paddingBottom=="number"?t.paddingBottom:r,a=typeof t.paddingLeft=="number"?t.paddingLeft:r,c=typeof t.paddingRight=="number"?t.paddingRight:r,l=t.overlay&&t.overlay.length>0,u=typeof t.width=="number"&&typeof t.height=="number",p,d,_,g,x,v;if(l){let P=t.overlay.map(Q=>({selector:Q,port:this.getSubcircuit().selectOne(Q,{type:"port"})})).filter(({port:Q})=>Q!=null).map(({port:Q})=>({position:Q._getGlobalSchematicPositionAfterLayout()}));if(P.length===0)return;let T=P.map(Q=>Q.position.x),k=P.map(Q=>Q.position.y),N=Math.min(...T),E=Math.max(...T),C=Math.min(...k),M=Math.max(...k),A=E-N,R=M-C,B=A===0?i:0,D=R===0?i:0,U=a+B/2,X=c+B/2,W=s+D/2,J=o+D/2,nt=N-U,ft=E+X,G=C-J,et=M+W;p=ft-nt,d=et-G,_=nt+(t.schX??0),g=G+(t.schY??0),x=_+p/2,v=g+d/2}else if(u){p=t.width,d=t.height;let S=this._getGlobalSchematicPositionBeforeLayout();x=S.x,v=S.y,_=x-p/2,g=v-d/2}else return;if(e.schematic_box.insert({height:d,width:p,x:_,y:g,is_dashed:t.strokeStyle==="dashed"}),t.title){let S=t.titleInside,P=.1,T=t.titleAlignment,k=KFt({anchor:T,x:_,y:g,width:p,height:d,isInside:S}),N,E,C=k.textAnchor;S?(N=T.includes("top")?-P:T.includes("bottom")?P:0,E=T.includes("left")?P:T.includes("right")?-P:0):(N=T.includes("top")?P:T.includes("bottom")?-P:0,E=T.includes("center_left")?-P:T.includes("center_right")?P:0);let M=k.x+E,A=k.y+N;e.schematic_text.insert({anchor:C,text:t.title,font_size:t.titleFontSize??.18,color:t.titleColor??"#000000",position:{x:M,y:A},rotation:0})}}},Dit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0);f(this,"schematic_table_id",null)}get config(){return{componentName:"SchematicTable",zodProps:ZH}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{_parsedProps:t}=this,i=this.children.filter(d=>d.componentName==="SchematicRow");if(i.length===0)return;let r=[],s=0;for(let d of i){let _=d.children.filter(g=>g.componentName==="SchematicCell");s=Math.max(s,_.length)}for(let d=0;d<i.length;d++)r[d]=[];for(let d=0;d<i.length;d++){let g=i[d].children.filter(v=>v.componentName==="SchematicCell"),x=0;for(let v=0;v<g.length;v++){for(;r[d][x];)x++;let S=g[v],P=S._parsedProps.colSpan??1,T=S._parsedProps.rowSpan??1;for(let k=0;k<T;k++)for(let N=0;N<P;N++)r[d+k]||(r[d+k]=[]),r[d+k][x+N]=S;x+=P}}s=Math.max(0,...r.map(d=>d.length));let o=i.map((d,_)=>d._parsedProps.height??1),a=Array.from({length:s},(d,_)=>{let g=0;for(let x=0;x<i.length;x++){let v=r[x]?.[_];if(v){let S=v._parsedProps.text??v._parsedProps.children,P=v._parsedProps.width??(S?.length??2)*.5;P>g&&(g=P)}}return g||10}),c=this._getGlobalSchematicPositionBeforeLayout(),l=e.schematic_table.insert({anchor_position:c,column_widths:a,row_heights:o,cell_padding:t.cellPadding,border_width:t.borderWidth,anchor:t.anchor,subcircuit_id:this.getSubcircuit()?.subcircuit_id||"",schematic_component_id:this.parent?.schematic_component_id||""});this.schematic_table_id=l.schematic_table_id;let u=new Set,p=0;for(let d=0;d<i.length;d++){let _=0;for(let g=0;g<s;g++){let x=r[d]?.[g];if(x&&!u.has(x)){u.add(x);let v=x._parsedProps,S=v.rowSpan??1,P=v.colSpan??1,T=0;for(let N=0;N<P;N++)T+=a[g+N];let k=0;for(let N=0;N<S;N++)k+=o[d+N];e.schematic_table_cell.insert({schematic_table_id:this.schematic_table_id,start_row_index:d,end_row_index:d+S-1,start_column_index:g,end_column_index:g+P-1,text:v.text??v.children,center:{x:c.x+_+T/2,y:c.y-p-k/2},width:T,height:k,horizontal_align:v.horizontalAlign,vertical_align:v.verticalAlign,font_size:v.fontSize??t.fontSize,subcircuit_id:this.getSubcircuit()?.subcircuit_id||""})}a[g]&&(_+=a[g])}p+=o[d]}}},jit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicRow",zodProps:KH}}},Bit=class extends Me{constructor(){super(...arguments);f(this,"isSchematicPrimitive",!0);f(this,"canHaveTextChildren",!0)}get config(){return{componentName:"SchematicCell",zodProps:JH}}},Yit=class extends Me{constructor(){super(...arguments);f(this,"isPrimitiveContainer",!0)}get config(){return{componentName:"Symbol",zodProps:_H}}},Xit=class extends Me{get config(){return{componentName:"AnalogSimulation",zodProps:vH}}doInitialSimulationRender(){let{db:n}=this.root,{duration:e,timePerStep:t}=this._parsedProps,i=e||10,r=t||.01;n.simulation_experiment.insert({name:"spice_transient_analysis",experiment_type:"spice_transient_analysis",end_time_ms:i,time_per_step:r})}},Uit=class extends Me{constructor(){super(...arguments);f(this,"simulation_voltage_probe_id",null);f(this,"schematic_voltage_probe_id",null);f(this,"finalProbeName",null);f(this,"color",null)}get config(){return{componentName:"VoltageProbe",zodProps:XH}}doInitialSimulationRender(){let{db:e}=this.root,{connectsTo:t,name:i,referenceTo:r,color:s}=this._parsedProps,o=this.getSubcircuit();if(!o){this.renderError("VoltageProbe must be inside a subcircuit");return}let a=Array.isArray(t)?t:[t];if(a.length!==1){this.renderError("VoltageProbe must connect to exactly one port or net");return}let c=a[0],l=o.selectOne(c,{type:"port"}),u=l?null:o.selectOne(c,{type:"net"});if(u&&u.componentName!=="Net"){this.renderError(`VoltageProbe connection target "${c}" resolved to a non-net component "${u.componentName}".`);return}if(!l&&!u){this.renderError(`VoltageProbe could not find connection target "${c}"`);return}let p=l?.source_port_id??u?.source_net_id;if(!p){this.renderError("Could not identify connected source for VoltageProbe");return}let d=null,_=null;if(r){let v=Array.isArray(r)?r:[r];if(v.length!==1){this.renderError("VoltageProbe must reference exactly one port or net");return}let S=v[0];if(d=o.selectOne(S,{type:"port"}),_=d?null:o.selectOne(S,{type:"net"}),_&&_.componentName!=="Net"){this.renderError(`VoltageProbe reference target "${S}" resolved to a non-net component "${_.componentName}".`);return}if(!d&&!_){this.renderError(`VoltageProbe could not find reference target "${S}"`);return}}this.color=s??wFt(p);let g=i;g||(g=a[0].split(" > ").map(v=>v.replace(/^\./,"")).join(".")),this.finalProbeName=g??null;let{simulation_voltage_probe_id:x}=e.simulation_voltage_probe.insert({name:g,signal_input_source_port_id:l?.source_port_id??void 0,signal_input_source_net_id:u?.source_net_id??void 0,reference_input_source_port_id:d?.source_port_id??void 0,reference_input_source_net_id:_?.source_net_id??void 0,subcircuit_id:o.subcircuit_id||void 0,color:this.color});this.simulation_voltage_probe_id=x}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled)return;let{db:e}=this.root,{connectsTo:t,name:i}=this._parsedProps,r=this.getSubcircuit();if(!r)return;let s=Array.isArray(t)?t:[t];if(s.length!==1)return;let o=s[0],a=r.selectOne(o,{type:"port"});if(!a||!a.schematic_port_id)return;let c=a._getGlobalSchematicPositionAfterLayout(),l=null;for(let d of e.schematic_trace.list()){for(let _ of d.edges)if(Math.abs(_.from.x-c.x)<1e-6&&Math.abs(_.from.y-c.y)<1e-6||Math.abs(_.to.x-c.x)<1e-6&&Math.abs(_.to.y-c.y)<1e-6){l=d.schematic_trace_id;break}if(l)break}if(!l)return;let u=this.finalProbeName,p=e.schematic_voltage_probe.insert({name:u,position:c,schematic_trace_id:l,subcircuit_id:r.subcircuit_id||void 0,color:this.color??void 0});this.schematic_voltage_probe_id=p.schematic_voltage_probe_id}},JFt={name:"@tscircuit/core",type:"module",version:"0.0.902",types:"dist/index.d.ts",main:"dist/index.js",module:"dist/index.js",exports:{".":{import:"./dist/index.js",types:"./dist/index.d.ts"}},files:["dist"],repository:{type:"git",url:"https://github.com/tscircuit/core"},scripts:{build:"tsup-node index.ts --format esm --dts",format:"biome format . --write","measure-bundle":"howfat -r table .","pkg-pr-new-release":"bunx pkg-pr-new publish --comment=off --peerDeps","smoke-test:dist":"bun run scripts/smoke-tests/test-dist-simple-circuit.tsx","build:benchmarking":"bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist","build:benchmarking:watch":`chokidar "./{benchmarking,lib}/**/*.{ts,tsx}" -c 'bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist'`,"start:benchmarking":'concurrently "bun run build:benchmarking:watch" "live-server ./benchmarking-dist"',"generate-test-plan":"bun run scripts/generate-test-plan.ts"},devDependencies:{"@biomejs/biome":"^1.8.3","@resvg/resvg-js":"^2.6.2","@tscircuit/capacity-autorouter":"^0.0.140","@tscircuit/checks":"^0.0.87","@tscircuit/circuit-json-util":"^0.0.73","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.14","@tscircuit/footprinter":"^0.0.236","@tscircuit/import-snippet":"^0.0.4","@tscircuit/infgrid-ijump-astar":"^0.0.33","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.16","@tscircuit/math-utils":"^0.0.29","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.4","@tscircuit/props":"^0.0.424","@tscircuit/schematic-autolayout":"^0.0.6","@tscircuit/schematic-match-adapt":"^0.0.16","@tscircuit/schematic-trace-solver":"^v0.0.45","@tscircuit/solver-utils":"^0.0.3","@types/bun":"^1.2.16","@types/debug":"^4.1.12","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@types/react-reconciler":"^0.28.9","bpc-graph":"^0.0.57","bun-match-svg":"0.0.12","calculate-elbow":"^0.0.12","chokidar-cli":"^3.0.0","circuit-json":"^0.0.325","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.22","circuit-json-to-gltf":"^0.0.31","circuit-json-to-simple-3d":"^0.0.9","circuit-json-to-spice":"^0.0.27","circuit-to-svg":"^0.0.284",concurrently:"^9.1.2","connectivity-map":"^1.0.0",debug:"^4.3.6","eecircuit-engine":"^1.5.6",flatbush:"^4.5.0","graphics-debug":"^0.0.60",howfat:"^0.3.8","live-server":"^1.2.2","looks-same":"^9.0.1",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"^0.0.16",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.202",spicey:"^0.0.14","ts-expect":"^1.3.0",tsup:"^8.2.4"},peerDependencies:{"@tscircuit/capacity-autorouter":"*","@tscircuit/checks":"*","@tscircuit/circuit-json-util":"*","@tscircuit/footprinter":"*","@tscircuit/infgrid-ijump-astar":"*","@tscircuit/math-utils":"*","@tscircuit/props":"*","@tscircuit/schematic-autolayout":"*","@tscircuit/schematic-match-adapt":"*","circuit-json-to-bpc":"*","bpc-graph":"*","@tscircuit/matchpack":"*","circuit-json":"*","circuit-json-to-connectivity-map":"*","schematic-symbols":"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-packing":"0.0.62","css-select":"5.1.0","format-si-unit":"^0.0.3",nanoid:"^5.0.7","performance-now":"^2.1.0","react-reconciler":"^0.32.0","transformation-matrix":"^2.16.1",zod:"^3.25.67"}},J_=class{constructor({platform:n,projectUrl:e}={}){f(this,"firstChild",null);f(this,"children");f(this,"db");f(this,"root",null);f(this,"isRoot",!0);f(this,"_schematicDisabledOverride");f(this,"pcbDisabled",!1);f(this,"pcbRoutingDisabled",!1);f(this,"_featureMspSchematicTraceRouting",!0);f(this,"name");f(this,"platform");f(this,"projectUrl");f(this,"_hasRenderedAtleastOnce",!1);f(this,"_eventListeners",{});this.children=[],this.db=Ce([]),this.root=this,this.platform=n,this.projectUrl=e,this.pcbDisabled=n?.pcbDisabled??!1}get schematicDisabled(){return this._schematicDisabledOverride!==void 0?this._schematicDisabledOverride:this._getBoard()?._parsedProps?.schematicDisabled??!1}set schematicDisabled(n){this._schematicDisabledOverride=n}add(n){let e;(0,Vit.isValidElement)(n)?e=knt(n):e=n,this.children.push(e)}setPlatform(n){this.platform={...this.platform,...n}}_getBoard(){let n=this.children.find(e=>e.componentName==="Board");if(n)return n}_guessRootComponent(){if(this.firstChild)return;if(this.children.length===0)throw new Error("Not able to guess root component: RootCircuit has no children (use circuit.add(...))");let n=this.children.filter(t=>t.lowercaseComponentName==="panel");if(n.length>1)throw new Error("Only one <panel> is allowed per circuit");if(n.length===1){if(this.children.length!==1)throw new Error("<panel> must be the root element of the circuit");this.firstChild=n[0];return}if(this.children.length===1&&this.children[0].isGroup){this.firstChild=this.children[0];return}let e=new Sl({subcircuit:!0});e.parent=this,e.addAll(this.children),this.children=[e],this.firstChild=e}render(){this.firstChild||this._guessRootComponent();let{firstChild:n,db:e}=this;if(!n)throw new Error("RootCircuit has no root component");n.parent=this,n.runRenderCycle(),this._hasRenderedAtleastOnce=!0}async renderUntilSettled(){for(this.db.source_project_metadata.list()?.[0]||this.db.source_project_metadata.insert({software_used_string:`@tscircuit/core@${this.getCoreVersion()}`,...this.projectUrl?{project_url:this.projectUrl}:{}}),this.render();this._hasIncompleteAsyncEffects();)await new Promise(e=>setTimeout(e,100)),this.render();this.emit("renderComplete")}_hasIncompleteAsyncEffects(){return this.children.some(n=>n._hasIncompleteAsyncEffects())}getCircuitJson(){return this._hasRenderedAtleastOnce||this.render(),this.db.toArray()}toJson(){return this.getCircuitJson()}async getSvg(n){let e=await Promise.resolve().then(()=>(jet(),Det)).catch(t=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
|
|
254
254
|
|
|
255
255
|
"${t.message}"`)});if(n.view==="pcb")return e.convertCircuitJsonToPcbSvg(this.getCircuitJson());if(n.view==="schematic")return e.convertCircuitJsonToSchematicSvg(this.getCircuitJson());throw new Error(`Invalid view: ${n.view}`)}getCoreVersion(){let[n,e,t]=JFt.version.split(".").map(Number);return`${n}.${e}.${t+1}`}async preview(n){let e=typeof n=="object"?n:{previewName:n};throw new Error("project.preview is not yet implemented")}computeSchematicGlobalTransform(){return Pr()}_computePcbGlobalTransformBeforeLayout(){return Pr()}selectAll(n){return this._guessRootComponent(),this.firstChild?.selectAll(n)??[]}selectOne(n,e){return this._guessRootComponent(),this.firstChild?.selectOne(n,e)??null}emit(n,...e){if(this._eventListeners[n])for(let t of this._eventListeners[n])t(...e)}on(n,e){this._eventListeners[n]||(this._eventListeners[n]=[]),this._eventListeners[n].push(e)}removeListener(n,e){this._eventListeners[n]&&(this._eventListeners[n]=this._eventListeners[n].filter(t=>t!==e))}enableDebug(n){typeof n=="string"?E9.default.enable(n):(n===null||n===!1)&&E9.default.disable()}getClientOrigin(){return typeof window<"u"&&window.location?window.location.origin:typeof self<"u"&&self.location?self.location.origin:""}},QFt=J_,t$t=J_,e$t=n=>{let[e,t]=G_.default.useState(!0),[i,r]=G_.default.useState(null),[s,o]=G_.default.useState(),[a,c]=G_.default.useState();return G_.default.useEffect(()=>{t(!0),r(null),n&&setTimeout(()=>{try{let l=new J_;l.add(n),o(l),c(l.toJson())}catch(l){r(l)}t(!1)},1)},[n]),{isLoading:e,error:i,circuit:s,circuitJson:a}},Q_=(n,e)=>(t,i)=>{let r=[];Array.isArray(e)?r.push(...e.flat()):typeof e=="object"&&r.push(...Object.values(e).flat(),...Object.keys(e));let s=o=>{if(o?.name&&o.name!==t)throw new Error(`Component name mismatch. Hook name: ${t}, Component prop name: ${o.name}`);let a={...i,...o,name:t},c=[];for(let l of r)if(a[l]){let u=`.${t} > .${l}`,p=a[l];c.push({from:u,to:p}),delete a[l]}return(0,Fd.jsxs)(Fd.Fragment,{children:[(0,Fd.jsx)(n,{...a}),c.map((l,u)=>(0,Fd.jsx)("trace",{...l},u))]})};for(let o of r)s[o]=`.${t} > .${o}`;return s},n$t=Q_(n=>(0,Git.jsx)("capacitor",{...n}),lH),i$t=n=>Q_(e=>(0,Wit.jsx)("chip",{pinLabels:n,...e}),n),r$t=Q_(n=>(0,Hit.jsx)("diode",{...n}),TH),s$t=Q_(n=>(0,qit.jsx)("led",{...n}),MH),o$t=Q_(n=>(0,Zit.jsx)("resistor",{...n}),rH),a$t=new Proxy(n=>new Proxy({},{get:(e,t)=>`.${n} > .${t}`}),{get:(n,e)=>{let t=(...i)=>{let r=i[0];return new Proxy({},{get:(s,o)=>`.${e} > .${o}`})};return new Proxy(t,{get:(i,r)=>e==="net"?`net.${r}`:e==="subcircuit"?new Proxy({},{get:(s,o)=>new Proxy({},{get:(a,c)=>`subcircuit.${r} > .${o} > .${c}`})}):`.${e} > .${r}`,apply:(i,r,s)=>e==="net"?new Proxy({},{get:(o,a)=>`net.${a}`}):new Proxy({},{get:(o,a)=>{let c=`.${e} > .${a}`;return["U","J","CN"].some(u=>e.startsWith(u))?c:new Proxy(new String(c),{get:(u,p)=>typeof p=="symbol"||p==="toString"?()=>c:`.${e} > .${a} > .${p}`})}})})}});Pnt(xnt);Pnt({Bug:q1});var Urt=Vt(Js(),1),z$t=Vt(_l(),1);var Jit=n=>{let e=n.match(/:[RC]_(\d{4})_/);if(e||(e=n.match(/:(SOIC-\d+|SOT-\d+|SOD-\d+|SSOP-\d+|TSSOP-\d+|QFP-\d+|QFN-\d+)/),e))return e[1]};var Y9=n=>n.includes("cap")?n.replace(/cap/g,""):n;var Qit=n=>{if(n){if(n.startsWith("kicad:")){let e=Jit(n);return e?Y9(e):n}return Y9(n)}};var X9=new Map,Er=async(n,e)=>{let t=new URLSearchParams({...e,json:"true"}).toString();if(X9.has(t))return X9.get(t);let r=await(await fetch(`https://jlcsearch.tscircuit.com/${n}/list?${t}`)).json();return X9.set(t,r),r},Mr=n=>n?[...n].sort((e,t)=>Number(t.is_basic??!1)-Number(e.is_basic??!1)):[],trt={findPart:async({sourceComponent:n,footprinterString:e})=>{let t=Qit(e);if(n.type==="source_component"&&n.ftype==="simple_resistor"){let{resistors:i}=await Er("resistors",{resistance:n.resistance,package:t});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_capacitor"){let{capacitors:i}=await Er("capacitors",{capacitance:n.capacitance,package:t});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_pin_header"){let i;e?.includes("_p")&&(i=Number(e.split("_p")[1]));let{headers:r}=await Er("headers",i?{pitch:i,num_pins:n.pin_count,gender:n.gender}:{num_pins:n.pin_count,gender:n.gender});return{jlcpcb:Mr(r).map(s=>`C${s.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_potentiometer"){let{potentiometers:i}=await Er("potentiometers",{resistance:n.max_resistance,package:t});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_diode"){let{diodes:i}=await Er("diodes",{package:t});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_chip"){let{chips:i}=await Er("chips",{package:t});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_transistor"){let{transistors:i}=await Er("transistors",{package:t,transistor_type:n.transistor_type});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_power_source"){let{power_sources:i}=await Er("power_sources",{voltage:n.voltage,package:t});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_inductor"){let{inductors:i}=await Er("inductors",{inductance:n.inductance,package:t});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_crystal"){let{crystals:i}=await Er("crystals",{frequency:n.frequency,load_capacitance:n.load_capacitance,package:t});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_mosfet"){let{mosfets:i}=await Er("mosfets",{package:t,mosfet_mode:n.mosfet_mode,channel_type:n.channel_type});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_resonator"){let{resonators:i}=await Er("resonators",{frequency:n.frequency,package:t});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_switch"){let{switches:i}=await Er("switches",{switch_type:n.type,package:t});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_led"){let{leds:i}=await Er("leds",{package:t});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}else if(n.type==="source_component"&&n.ftype==="simple_fuse"){let{fuses:i}=await Er("fuses",{package:t});return{jlcpcb:Mr(i).map(r=>`C${r.lcsc}`).slice(0,3)}}return{}}};var srt=Vt(ert(),1);tt();var urt=Vt(In(),1),prt=Vt(In(),1),vi=h.tuple([h.coerce.number(),h.coerce.number()]),y$t=h.tuple([h.number(),h.number(),h.number()]),PP=h.union([vi,y$t]),g$t=h.object({kind:h.literal("arc"),start:vi,mid:vi,end:vi}),x$t=h.union([vi,g$t]),ort=h.object({at:PP,size:vi,layer:h.string(),layers:h.array(h.string()),roundrect_rratio:h.number(),uuid:h.string()}).partial(),b$t=h.object({key:h.string(),val:h.string(),attributes:ort}),vP=h.object({oval:h.boolean().default(!1),width:h.number().optional(),height:h.number().optional(),offset:vi.optional()}),art=h.object({name:h.string(),pad_type:h.enum(["thru_hole","smd","np_thru_hole","connect"]),pad_shape:h.enum(["roundrect","circle","rect","oval","trapezoid","custom"]),at:PP,drill:h.union([h.number(),h.array(h.any()),vP]).transform(n=>typeof n=="number"?{oval:!1,width:n,height:n}:"oval"in n?n:n.length===2?{oval:!1,width:Number.parseFloat(n[0]),height:Number.parseFloat(n[0]),offset:vi.parse(n[1].slice(1))}:n.length===3||n.length===4?{oval:n[0]==="oval",width:Number.parseFloat(n[1]),height:Number.parseFloat(n[2]),offset:n[3]?vi.parse(n[3].slice(1)):void 0}:n).pipe(vP),size:h.union([h.array(h.number()).length(2).transform(([n,e])=>({width:n,height:e})),h.object({width:h.number(),height:h.number()})]),layers:h.array(h.string()).optional(),roundrect_rratio:h.number().optional(),uuid:h.string().optional()}),crt=h.object({name:h.string(),pad_type:h.enum(["thru_hole","smd","np_thru_hole","connect"]),pad_shape:h.enum(["roundrect","circle","rect","oval","trapezoid","custom"]),at:PP,size:vi,drill:h.union([h.number(),h.array(h.any()),vP]).transform(n=>typeof n=="number"?{oval:!1,width:n,height:n}:"oval"in n?n:n.length===2?{oval:!1,width:Number.parseFloat(n[0]),height:Number.parseFloat(n[0]),offset:vi.parse(n[1].slice(1))}:n.length===3||n.length===4?{oval:n[0]==="oval",width:Number.parseFloat(n[1]),height:Number.parseFloat(n[2]),offset:n[3]?vi.parse(n[3].slice(1)):void 0}:n).pipe(vP).optional(),layers:h.array(h.string()).optional(),roundrect_rratio:h.number().optional(),chamfer_ratio:h.number().optional(),solder_paste_margin:h.number().optional(),solder_paste_margin_ratio:h.number().optional(),clearance:h.number().optional(),zone_connection:h.union([h.literal(0).describe("Pad is not connect to zone"),h.literal(1).describe("Pad is connected to zone using thermal relief"),h.literal(2).describe("Pad is connected to zone using solid fill")]).optional(),thermal_width:h.number().optional(),thermal_gap:h.number().optional(),uuid:h.string().optional()}),lrt=h.object({font:h.object({size:vi,thickness:h.number().optional()})}).partial(),v$t=h.object({fp_text_type:h.literal("user"),text:h.string(),at:PP,layer:h.string(),uuid:h.string().optional(),effects:lrt.partial()}),w$t=h.object({start:vi,mid:vi,end:vi,stroke:h.object({width:h.number(),type:h.string()}),layer:h.string(),uuid:h.string().optional()}),S$t=h.object({center:vi,end:vi,stroke:h.object({width:h.number(),type:h.string()}),fill:h.string().optional(),layer:h.string(),uuid:h.string().optional()}),P$t=h.object({pts:h.array(x$t),stroke:h.object({width:h.number(),type:h.string()}).optional(),width:h.number().optional(),layer:h.string(),uuid:h.string().optional(),fill:h.string().optional()}).transform(n=>({...n,width:void 0,stroke:n.stroke??{width:n.width}})),k$t=h.object({start:vi,end:vi,stroke:h.object({width:h.number(),type:h.string()}).optional(),width:h.number().optional(),layer:h.string(),uuid:h.string().optional()}).transform(n=>({...n,width:void 0,stroke:n.stroke??{width:n.width}})),nrt=h.object({footprint_name:h.string(),version:h.string().optional(),generator:h.string().optional(),generator_version:h.string().optional(),layer:h.string(),descr:h.string().default(""),tags:h.array(h.string()).optional(),properties:h.array(b$t),fp_lines:h.array(k$t),fp_texts:h.array(v$t),fp_arcs:h.array(w$t),fp_circles:h.array(S$t).optional(),fp_polys:h.array(P$t).optional(),pads:h.array(crt),holes:h.array(art).optional()}),wP=(n,e)=>{if(e==="effects"&&Array.isArray(n)){let t={};for(let i of n)if(i[0]==="font"){let r={};for(let s of i.slice(1))s.length===2?r[s[0].valueOf()]=Number.parseFloat(s[1].valueOf()):r[s[0].valueOf()]=s.slice(1).map(o=>Number.parseFloat(o.valueOf()));t.font=r}return lrt.parse(t)}if(e==="pts")return n.map(t=>{let i=t[0]?.valueOf?.()??t[0];if(i==="xy")return t.slice(1).map(r=>Number.parseFloat(r.valueOf()));if(i==="arc"){let r={kind:"arc"};for(let s of t.slice(1)){let o=s[0].valueOf();r[o]=s.slice(1).map(a=>Number.parseFloat(a.valueOf()))}return r}return t});if(e==="stroke"){let t={};for(let i of n){let r=i[0].valueOf();t[r]=wP(i.slice(1),r)}return t}return e==="at"||e==="size"||e==="start"||e==="mid"||e==="end"?(Array.isArray(n)?n:[n]).map(i=>i?.valueOf?.()??i).filter(i=>typeof i=="number"||typeof i=="string"&&/^[-+]?\d*\.?\d+(e[-+]?\d+)?$/i.test(i)).map(i=>typeof i=="number"?i:Number.parseFloat(i)):e==="tags"?n.map(t=>t.valueOf()):e==="generator_version"||e==="version"?n[0].valueOf():n.length===2?n.valueOf():e==="uuid"?Array.isArray(n)?n[0].valueOf():n.valueOf():/^[\d\.]+$/.test(n)&&!Number.isNaN(Number.parseFloat(n))?Number.parseFloat(n):Array.isArray(n)&&n.length===1?n[0].valueOf():Array.isArray(n)?n.map(t=>t.valueOf()):n},Ye=(n,e)=>{for(let t of n)if(Array.isArray(t)&&t[0]===e)return wP(t.slice(1),e)},U9=(0,urt.default)("kicad-mod-converter"),T$t=n=>{let e=(0,srt.default)(n),t=e[1].valueOf(),i={},r=Object.entries(nrt.shape).filter(([T,k])=>k._def.typeName==="ZodString"||T==="tags").map(([T])=>T);for(let T of e.slice(2)){if(!r.includes(T[0]))continue;let k=T[0].valueOf(),N=wP(T.slice(1),k);i[k]=N}let s=e.slice(2).filter(T=>T[0]==="property").map(T=>{let k=T[1].valueOf(),N=T[2].valueOf(),E=ort.parse(T.slice(3).reduce((C,M)=>{let A=M[0].valueOf();return C[A]=wP(M.slice(1),A),C},{}));return{key:k,val:N,attributes:E}}),o=e.slice(2).filter(T=>T[0]==="pad"),a=[];for(let T of o){let k=Ye(T,"at"),N=Ye(T,"size"),E=Ye(T,"drill"),C=Ye(T,"layers");if(Array.isArray(C)?C=C.map(B=>B.valueOf()):typeof C=="string"?C=[C]:C||(C=[]),!C.includes("F.Cu")){U9(`Skipping pad without F.Cu layer: layers=${C.join(", ")}`);continue}let M=Ye(T,"roundrect_rratio"),A=Ye(T,"uuid"),R={name:T[1].valueOf(),pad_type:T[2].valueOf(),pad_shape:T[3].valueOf(),at:k,drill:E,size:N,layers:C,roundrect_rratio:M,uuid:A};U9(`attempting to parse pad: ${JSON.stringify(R,null," ")}`),a.push(crt.parse(R))}let c=e.slice(2).filter(T=>T[0]==="fp_text"),l=[];for(let T of c){let k=T[2].valueOf(),N=Ye(T,"at"),E=Ye(T,"layer"),C=Ye(T,"uuid"),M=Ye(T,"effects");l.push({fp_text_type:"user",text:k,at:N,layer:E,uuid:C,effects:M})}let u=[],p=e.slice(2).filter(T=>T[0]==="fp_line");for(let T of p){let k=Ye(T,"start"),N=Ye(T,"end"),E=Ye(T,"stroke"),C=Ye(T,"layer"),M=Ye(T,"uuid");u.push({start:k,end:N,stroke:E,layer:C,uuid:M})}let d=[],_=e.slice(2).filter(T=>T[0]==="fp_arc");for(let T of _){let k=Ye(T,"start"),N=Ye(T,"mid"),E=Ye(T,"end"),C=Ye(T,"stroke"),M=Ye(T,"layer"),A=Ye(T,"uuid");!k||!E||!N||!C||!M||d.push({start:k,mid:N,end:E,stroke:C,layer:M,uuid:A})}let g=[],x=e.slice(2).filter(T=>T[0]==="fp_circle");for(let T of x){let k=Ye(T,"center"),N=Ye(T,"end"),E=Ye(T,"stroke"),C=Ye(T,"fill"),M=Ye(T,"layer"),A=Ye(T,"uuid");!k||!N||!E||!M||g.push({center:k,end:N,stroke:E,fill:C,layer:M,uuid:A})}let v=[],S=e.slice(2).filter(T=>T[0]==="fp_poly");for(let T of S){let k=Ye(T,"pts"),N=Ye(T,"stroke"),E=Ye(T,"width"),C=Ye(T,"layer"),M=Ye(T,"uuid"),A=Ye(T,"fill"),R=N;!R&&typeof E=="number"?R={width:E,type:"solid"}:R&&typeof R=="object"&&typeof E=="number"&&R.width===void 0&&(R={...R,width:E}),v.push({pts:k,stroke:R,layer:C,uuid:M,fill:A})}let P=[];for(let T of e.slice(2)){if(T[0]!=="pad"||T[2]?.valueOf?.()!=="thru_hole")continue;let k=T[1]?.valueOf?.(),N=T[2]?.valueOf?.(),E=T[3]?.valueOf?.(),C=Ye(T,"at"),M=Ye(T,"drill"),A=Ye(T,"size");Array.isArray(A)&&(A[0]==="size"&&(A=A.slice(1)),A={width:Number(A[0]),height:Number(A[1])});let R=Ye(T,"uuid"),B=Ye(T,"roundrect_rratio"),D=Ye(T,"layers");Array.isArray(D)?D=D.map(X=>X.valueOf()):typeof D=="string"?D=[D]:D||(D=[]);let U={name:k,pad_type:N,pad_shape:E,at:C,drill:M,size:A,layers:D,roundrect_rratio:B,uuid:R};U9(`attempting to parse holes: ${JSON.stringify(U,null,2)}`),P.push(art.parse(U))}return nrt.parse({footprint_name:t,...i,properties:s,fp_lines:u,fp_texts:l,fp_arcs:d,fp_circles:g,pads:a,holes:P,fp_polys:v})},Z1=Math.PI*2,irt=n=>{let e=n%Z1;return e<0&&(e+=Z1),e},SP=(n,e)=>{let t=irt(n),r=irt(e)-t;return r<0&&(r+=Z1),r};function hrt(n,e,t){let i={x:(n.x+e.x)/2,y:(n.y+e.y)/2},r={x:(e.x+t.x)/2,y:(e.y+t.y)/2},s=-(n.x-e.x)/(n.y-e.y),o=-(e.x-t.x)/(e.y-t.y),a=(i.y-r.y+o*r.x-s*i.x)/(o-s),c=i.y+s*(a-i.x);return{x:a,y:c}}function drt(n,e){return Math.sqrt((n.x-e.x)**2+(n.y-e.y)**2)}function ey(n,e){return Math.atan2(e.y-n.y,e.x-n.x)}var H9=(n,e,t)=>{let i=hrt(n,e,t),r=drt(i,n),s=ey(i,n),o=ey(i,e),a=ey(i,t),c=SP(s,o),l=SP(s,a),u=l;return c>l&&(u=l-Z1),Math.abs(r*u)};function q9(n,e,t,i){let r=hrt(n,e,t),s=drt(r,n),o=ey(r,n),a=ey(r,e),c=ey(r,t),l=SP(o,a),u=SP(o,c),p=u;l>u&&(p=u-Z1);let d=[];for(let _=0;_<=i;_++){let g=o+_/i*p,x=r.x+s*Math.cos(g),v=r.y+s*Math.sin(g);d.push({x,y:v})}return d}var Pl=n=>Array.isArray(n)?{x:n[0],y:n[1]}:n,V9=(n,e,t=1e-4)=>Math.abs(n.x-e.x)<t&&Math.abs(n.y-e.y)<t,E$t=n=>{let e=[],t=new Set;for(let i=0;i<n.length;i++){if(t.has(i))continue;let r=[n[i]];t.add(i);let s=n[i].end,o=!0;for(;o;){if(o=!1,r.length>1&&V9(s,r[0].start)){e.push(r);break}for(let a=0;a<n.length;a++)if(!t.has(a)){if(V9(s,n[a].start)){r.push(n[a]),t.add(a),s=n[a].end,o=!0;break}else if(V9(s,n[a].end)){n[a].type==="arc"?r.push({...n[a],reversed:!0}):r.push({...n[a],start:n[a].end,end:n[a].start}),t.add(a),s=n[a].start,o=!0;break}}if(!o){for(let a=r.length-1;a>=0;a--){let c=n.indexOf(r[a]);c!==-1&&t.delete(c)}break}}}return e},M$t=n=>{let e=[];for(let t of n)if(t.type==="line")e.push(t.start);else if(t.type==="arc"&&t.mid){let i=H9(t.start,t.mid,t.end),r=Math.max(3,Math.ceil(i)),s=q9(t.start,t.mid,t.end,r);t.reversed&&(s=s.reverse()),e.push(...s.slice(0,-1))}return e};function C$t(n){if(!Array.isArray(n))return null;let e=n.find(o=>o.layer?.toLowerCase()==="f.silks"&&(o.text?.includes("${REFERENCE}")||o.fp_text_type?.toLowerCase()==="reference"||o.text?.match(/^R\d+|C\d+|U\d+/))),t=e||n.find(o=>o.layer?.toLowerCase()==="f.fab"&&(o.text?.includes("${REFERENCE}")||o.fp_text_type?.toLowerCase()==="reference")),i=e||t;if(!i?.effects?.font?.size)return null;let[r,s]=i.effects.font.size;return s??r??1}var I$t=n=>n*Math.PI/180,G9=(n,e,t)=>{let i=I$t(t),r=Math.cos(i),s=Math.sin(i);return{x:n*r-e*s,y:n*s+e*r}},N$t=n=>{let e=[...new Map(n.map(u=>[`${u.x},${u.y}`,u])).values()];if(e.length!==4)return null;let t=e.map(u=>u.x),i=e.map(u=>u.y),r=[...new Set(t)],s=[...new Set(i)];if(r.length!==2||s.length!==2)return null;let[o,a]=r.sort((u,p)=>u-p),[c,l]=s.sort((u,p)=>u-p);return o===void 0||a===void 0||c===void 0||l===void 0?null:{x:(o+a)/2,y:(c+l)/2,width:a-o,height:l-c}},A$t=n=>{if(!n)return!1;let e=n.toLowerCase();return e!=="no"&&e!=="none"&&e!=="outline"},W9=n=>n&&Array.isArray(n)&&n.length>=3&&typeof n[2]=="number"?n[2]:0,Gr=n=>{let e=(n%360+360)%360;return e===90||e===270},$d=n=>{if(n!=null)return`${n}`},rrt=n=>{let e=$d(n),t=e!==void 0?Number(e):NaN;return Number.isFinite(t)?t:void 0},ty=(0,prt.default)("kicad-mod-converter"),Ds=n=>{switch(n.toLowerCase()){case"f.cu":case"f.fab":case"f.silks":case"edge.cuts":return"top";case"b.cu":case"b.fab":case"b.silks":return"bottom"}},R$t=async n=>{let{fp_lines:e,fp_texts:t,fp_arcs:i,fp_circles:r,pads:s,properties:o,holes:a,fp_polys:c}=n,l=[];l.push({type:"source_component",source_component_id:"source_component_0",supplier_part_numbers:{}}),l.push({type:"schematic_component",schematic_component_id:"schematic_component_0",source_component_id:"source_component_0",center:{x:0,y:0},rotation:0,size:{width:0,height:0}});let u=new Set,p=new Map;for(let G of s){let et=$d(G.name);if(et){u.add(et);let Q=rrt(G.name);Q!==void 0&&p.set(et,Q)}}if(a)for(let G of a){let et=$d(G.name);if(et){u.add(et);let Q=rrt(G.name);Q!==void 0&&p.set(et,Q)}}let d=0,_=new Map;for(let G of u){let et=`source_port_${d++}`;_.set(G,et);let Q=p.get(G);l.push({type:"source_port",source_port_id:et,source_component_id:"source_component_0",name:G,port_hints:[G],pin_number:Q,pin_label:Q!==void 0?`pin${Q}`:void 0}),l.push({type:"schematic_port",schematic_port_id:`schematic_port_${d++}`,source_port_id:et,schematic_component_id:"schematic_component_0",center:{x:0,y:0}})}let g=Number.POSITIVE_INFINITY,x=Number.NEGATIVE_INFINITY,v=Number.POSITIVE_INFINITY,S=Number.NEGATIVE_INFINITY;for(let G of s){let et=G.at[0],Q=-G.at[1],ht=G.size[0],pt=G.size[1];g=Math.min(g,et-ht/2),x=Math.max(x,et+ht/2),v=Math.min(v,Q-pt/2),S=Math.max(S,Q+pt/2)}let P="pcb_component_0";l.push({type:"pcb_component",source_component_id:"source_component_0",pcb_component_id:P,layer:"top",center:{x:0,y:0},rotation:0,width:Number.isFinite(g)?x-g:0,height:Number.isFinite(v)?S-v:0});let T=0,k=new Map;for(let G of u){let et=`pcb_port_${T++}`,Q=_.get(G);k.set(G,et);let ht=0,pt=0,St=["top","bottom"],Mt=s.find(ot=>$d(ot.name)===G);if(Mt)ht=Mt.at[0],pt=-Mt.at[1],St=Mt.layers?Mt.layers.map(ot=>Ds(ot)).filter(Boolean):["top","bottom"];else if(a){let ot=a.find(Y=>$d(Y.name)===G);ot&&(ht=ot.at[0],pt=-ot.at[1],St=ot.layers?ot.layers.map(Y=>Ds(Y)).filter(Boolean):["top","bottom"])}l.push({type:"pcb_port",pcb_port_id:et,source_port_id:Q,pcb_component_id:P,x:ht,y:pt,layers:St})}let N=0,E=0,C=0;for(let G of s){let et=$d(G.name),Q=et?p.get(et):void 0;if(G.pad_type==="smd"){let ht=W9(G.at),pt=Gr(ht)?G.size[1]:G.size[0],St=Gr(ht)?G.size[0]:G.size[1],Mt=et?k.get(et):void 0,ot=Q!==void 0?`pin${Q}`:void 0;l.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${N++}`,shape:"rect",x:G.at[0],y:-G.at[1],width:pt,height:St,layer:Ds(G.layers?.[0]??"F.Cu"),pcb_component_id:P,port_hints:ot?[ot]:et?[et]:[],pcb_port_id:Mt,pin_number:Q,pin_label:ot})}else if(G.pad_type==="thru_hole"){if(G.pad_shape==="rect"){let ht=W9(G.at),pt=Gr(ht)?G.size[1]:G.size[0],St=Gr(ht)?G.size[0]:G.size[1],Mt=G.drill?.offset?.[0]??0,ot=G.drill?.offset?.[1]??0,Y=G9(Mt,ot,ht),H=et?k.get(et):void 0,it=Q!==void 0?`pin${Q}`:void 0;l.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${E++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:G.at[0],y:-G.at[1],hole_offset_x:-Y.x,hole_offset_y:-Y.y,hole_diameter:G.drill?.width,rect_pad_width:pt,rect_pad_height:St,layers:["top","bottom"],pcb_component_id:P,port_hints:it?[it]:et?[et]:[],pcb_port_id:H,pin_number:Q,pin_label:it})}else if(G.pad_shape==="circle"){let ht=et?k.get(et):void 0,pt=Q!==void 0?`pin${Q}`:void 0;l.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${E++}`,shape:"circle",x:G.at[0],y:-G.at[1],outer_diameter:G.size[0],hole_diameter:G.drill?.width,layers:["top","bottom"],pcb_component_id:P,port_hints:pt?[pt]:et?[et]:[],pcb_port_id:ht,pin_number:Q,pin_label:pt})}else if(G.pad_shape==="oval"){let ht=et?k.get(et):void 0,pt=Q!==void 0?`pin${Q}`:void 0;l.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${E++}`,shape:"pill",x:G.at[0],y:-G.at[1],outer_width:G.size[0],outer_height:G.size[1],hole_width:G.drill?.width,hole_height:G.drill?.height,layers:["top","bottom"],pcb_component_id:P,port_hints:pt?[pt]:et?[et]:[],pcb_port_id:ht,pin_number:Q,pin_label:pt})}}else G.pad_type==="np_thru_hole"&&l.push({type:"pcb_hole",pcb_hole_id:`pcb_hole_${C++}`,x:G.at[0],y:-G.at[1],hole_diameter:G.drill?.width,pcb_component_id:P})}if(a)for(let G of a){let et=$d(G.name),Q=et?p.get(et):void 0,ht=G.layers?.some(at=>at.endsWith(".Cu")||at==="*.Cu"),pt=W9(G.at),St=G.drill?.offset?.[0]??0,Mt=G.drill?.offset?.[1]??0,ot=G9(St,Mt,pt),Y=G.at[0]+ot.x,H=-(G.at[1]+ot.y),it=G.drill?.width??0,ut=G.size?.width??it,yt=G.roundrect_rratio??0,Z=yt>0?Math.min(Gr(pt)?G.size?.height??ut:G.size?.width??ut,Gr(pt)?G.size?.width??ut:G.size?.height??ut)/2*yt:0;if(ht)if(G.pad_shape==="rect"){let at=et?k.get(et):void 0;l.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${E++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:G.at[0],y:-G.at[1],hole_offset_x:-ot.x,hole_offset_y:-ot.y,hole_diameter:it,rect_pad_width:Gr(pt)?G.size?.height??ut:G.size?.width??ut,rect_pad_height:Gr(pt)?G.size?.width??ut:G.size?.height??ut,rect_border_radius:Z,port_hints:Q!==void 0?[`pin${Q}`]:et?[et]:[],layers:["top","bottom"],pcb_component_id:P,pcb_port_id:at,pin_number:Q,pin_label:Q!==void 0?`pin${Q}`:void 0})}else if(G.pad_shape==="oval"){let at=et?k.get(et):void 0;l.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${E++}`,shape:"pill",x:Y,y:H,outer_width:Gr(pt)?G.size?.height??ut:G.size?.width??ut,outer_height:Gr(pt)?G.size?.width??ut:G.size?.height??ut,hole_width:Gr(pt)?G.drill?.height??it:G.drill?.width??it,hole_height:Gr(pt)?G.drill?.width??it:G.drill?.height??it,port_hints:Q!==void 0?[`pin${Q}`]:et?[et]:[],layers:["top","bottom"],pcb_component_id:P,pcb_port_id:at,pin_number:Q,pin_label:Q!==void 0?`pin${Q}`:void 0})}else if(G.pad_shape==="roundrect"){let at=et?k.get(et):void 0,Et=G.drill?.offset?.[0]??0,Ft=G.drill?.offset?.[1]??0,Ot=G9(Et,Ft,pt),Ie=Gr(pt)?G.size?.height??ut:G.size?.width??ut,Se=Gr(pt)?G.size?.width??ut:G.size?.height??ut;l.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${E++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:Y,y:H,hole_offset_x:-Ot.x,hole_offset_y:Ot.y,hole_diameter:it,rect_pad_width:Ie,rect_pad_height:Se,rect_border_radius:Z,port_hints:Q!==void 0?[`pin${Q}`]:et?[et]:[],layers:["top","bottom"],pcb_component_id:P,pcb_port_id:at,pin_number:Q,pin_label:Q!==void 0?`pin${Q}`:void 0})}else{let at=et?k.get(et):void 0;l.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${E++}`,shape:"circle",x:Y,y:H,outer_diameter:ut,hole_diameter:it,port_hints:Q!==void 0?[`pin${Q}`]:et?[et]:[],layers:["top","bottom"],pcb_component_id:P,pcb_port_id:at,pin_number:Q,pin_label:Q!==void 0?`pin${Q}`:void 0})}else l.push({type:"pcb_hole",pcb_hole_id:`pcb_hole_${C++}`,x:Y,y:H,hole_diameter:ut,hole_shape:"circle",pcb_component_id:P})}let M=[];for(let G of e)G.layer.toLowerCase()==="edge.cuts"&&M.push({type:"line",start:{x:G.start[0],y:G.start[1]},end:{x:G.end[0],y:G.end[1]},strokeWidth:G.stroke.width});for(let G of i)G.layer.toLowerCase()==="edge.cuts"&&M.push({type:"arc",start:{x:G.start[0],y:G.start[1]},mid:{x:G.mid[0],y:G.mid[1]},end:{x:G.end[0],y:G.end[1]},strokeWidth:G.stroke.width});let A=E$t(M),R=0;for(let G of A){let et=M$t(G);et.length>=3&&l.push({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_${R++}`,shape:"polygon",points:et.map(Q=>({x:Q.x,y:-Q.y})),pcb_component_id:P})}let B=0,D=0,U=0,X=0;for(let G of e){let et=[{x:G.start[0],y:-G.start[1]},{x:G.end[0],y:-G.end[1]}],Q=G.layer.toLowerCase();Q==="f.cu"?l.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${B++}`,pcb_component_id:P,layer:Ds(G.layer),route:et,thickness:G.stroke.width}):Q==="f.silks"?l.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${D++}`,pcb_component_id:P,layer:"top",route:et,stroke_width:G.stroke.width}):Q==="edge.cuts"?ty("Skipping Edge.Cuts fp_line (converted to pcb_cutout)",G.layer):Q==="f.fab"?l.push({type:"pcb_fabrication_note_path",fabrication_note_path_id:`fabrication_note_path_${U++}`,pcb_component_id:P,layer:"top",route:et,stroke_width:G.stroke.width,port_hints:[]}):Q.startsWith("user.")?l.push({type:"pcb_note_line",pcb_note_line_id:`pcb_note_line_${X++}`,pcb_component_id:P,x1:G.start[0],y1:-G.start[1],x2:G.end[0],y2:-G.end[1],stroke_width:G.stroke.width}):ty("Unhandled layer for fp_line",G.layer)}if(c)for(let G of c){let et=[],Q=ot=>{!Number.isFinite(ot.x)||!Number.isFinite(ot.y)||et.push(ot)};for(let ot of G.pts){if(Array.isArray(ot)){Q({x:ot[0],y:-ot[1]});continue}if(ot&&typeof ot=="object"&&"kind"in ot){if(ot.kind==="arc"){let Y=Pl(ot.start),H=Pl(ot.mid),it=Pl(ot.end),ut=H9(Y,H,it),yt=Math.max(8,Math.ceil(ut)),Z=Math.max(2,Math.ceil(ut/.1)),at=q9(Y,H,it,Z).map(Et=>({x:Et.x,y:-Et.y}));for(let Et of at)Q(Et)}continue}}let ht=et,St=ht.length>2&&ht[0].x===ht[ht.length-1].x&&ht[0].y===ht[ht.length-1].y?ht.slice(0,-1):ht;if(ht.length===0)continue;let Mt=G.stroke?.width??0;if(G.layer.endsWith(".Cu")){let ot=N$t(St);ot?l.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${N++}`,shape:"rect",x:ot.x,y:ot.y,width:ot.width,height:ot.height,layer:Ds(G.layer),pcb_component_id:P}):A$t(G.fill)?St.length>=3?l.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${N++}`,shape:"polygon",points:St,layer:Ds(G.layer),pcb_component_id:P}):St.length>=2&&l.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${B++}`,pcb_component_id:P,layer:Ds(G.layer),route:St,thickness:Mt}):St.length>=2&&l.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${B++}`,pcb_component_id:P,layer:Ds(G.layer),route:St,thickness:Mt})}else G.layer.endsWith(".SilkS")?l.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${D++}`,pcb_component_id:P,layer:Ds(G.layer),route:ht,stroke_width:Mt}):G.layer.endsWith(".Fab")?l.push({type:"pcb_fabrication_note_path",fabrication_note_path_id:`fabrication_note_path_${U++}`,pcb_component_id:P,layer:Ds(G.layer),route:St,stroke_width:Mt,port_hints:[]}):ty("Unhandled layer for fp_poly",G.layer)}let W=0;for(let G of i){let et=G.layer.toLowerCase();if(et==="edge.cuts"){ty("Skipping Edge.Cuts fp_arc (converted to pcb_cutout)",G.layer);continue}let Q=Pl(G.start),ht=Pl(G.mid),pt=Pl(G.end),St=H9(Q,ht,pt),Mt=q9(Q,ht,pt,Math.ceil(St));if(et.startsWith("user.")){l.push({type:"pcb_note_path",pcb_note_path_id:`pcb_note_path_${W++}`,pcb_component_id:P,route:Mt.map(Y=>({x:Y.x,y:-Y.y})),stroke_width:G.stroke.width});continue}let ot=Ds(G.layer);if(!ot){ty("Unable to convert layer for fp_arc",G.layer);continue}l.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${D++}`,layer:ot,pcb_component_id:P,route:Mt.map(Y=>({x:Y.x,y:-Y.y})),stroke_width:G.stroke.width})}if(r)for(let G of r){let et=G.layer.toLowerCase(),Q=Pl(G.center),ht=Pl(G.end),pt=Math.sqrt((ht.x-Q.x)**2+(ht.y-Q.y)**2),St=Math.max(16,Math.ceil(2*Math.PI*pt)),Mt=[];for(let ot=0;ot<=St;ot++){let Y=ot/St*2*Math.PI;Mt.push({x:Q.x+pt*Math.cos(Y),y:Q.y+pt*Math.sin(Y)})}et.startsWith("user.")&&l.push({type:"pcb_note_path",pcb_note_path_id:`pcb_note_path_${W++}`,pcb_component_id:P,route:Mt.map(ot=>({x:ot.x,y:-ot.y})),stroke_width:G.stroke.width})}for(let G of t){let et=Ds(G.layer);G.layer.endsWith(".SilkS")?l.push({type:"pcb_silkscreen_text",layer:et,font:"tscircuit2024",font_size:G.effects?.font?.size[0]??1,pcb_component_id:P,anchor_position:{x:G.at[0],y:-G.at[1]},anchor_alignment:"center",text:G.text}):G.layer.endsWith(".Fab")?l.push({type:"pcb_fabrication_note_text",layer:et,font:"tscircuit2024",font_size:G.effects?.font?.size[0]??1,pcb_component_id:P,anchor_position:{x:G.at[0],y:-G.at[1]},anchor_alignment:"center",text:G.text}):ty("Unhandled layer for fp_text",G.layer)}let J=o.find(G=>G.key==="Reference"),nt=o.find(G=>G.key==="Value"),ft=[J,nt].filter(G=>G&&!!G.val);for(let G of ft){let et=G.attributes.at;if(!et)continue;let ht=G.attributes.layer?.toLowerCase()?.endsWith(".fab"),pt=C$t(t);l.push({type:ht?"pcb_fabrication_note_text":"pcb_silkscreen_text",layer:"top",font:"tscircuit2024",font_size:pt,pcb_component_id:P,anchor_position:{x:et[0],y:-et[1]},anchor_alignment:"center",text:G.val})}return l},frt=async n=>{let e=T$t(n);return await R$t(e)};var mrt=async n=>{try{return(await import(n)).default}catch{console.log(`Failed to load ${n} locally, trying CDN fallback...`);try{let t=await fetch(`https://cdn.jsdelivr.net/npm/${n}/+esm`);if(!t.ok)throw new Error(`Failed to fetch ${n} from CDN: ${t.statusText}`);let i=await t.text(),r=new Blob([i],{type:"application/javascript"}),s=URL.createObjectURL(r);try{let{default:o}=await import(s);return o}finally{URL.revokeObjectURL(s)}}catch(t){throw console.error(`CDN fallback for ${n} also failed:`,t),t}}};var O$t="https://kicad-mod-cache.tscircuit.com",kP=null,_rt=()=>({partsEngine:trt,spiceEngineMap:{ngspice:{simulate:async n=>{if(!kP){let e=await mrt("@tscircuit/ngspice-spice-engine").catch(t=>{throw new Error("Could not load ngspice engine from local node_modules or CDN fallback.",{cause:t})});e&&(kP=await e())}if(!kP)throw new Error("Could not load ngspice engine from local node_modules or CDN fallback.");return kP.simulate(n)}}},footprintLibraryMap:{kicad:async n=>{let e=`${O$t}/${n}`,t=`${e}.circuit.json`,r=await(await fetch(t)).json(),s=Array.isArray(r)?r.filter(a=>a?.type==="pcb_silkscreen_text"?a?.text==="REF**":!0):r,o=`${e}.wrl`;return{footprintCircuitJson:s,cadModel:{wrlUrl:o,modelUnitToMmScale:2.54}}}},footprintFileParserMap:{kicad_mod:{loadFromUrl:async n=>{let e=await fetch(n).then(i=>i.text()),t=await frt(e);return{footprintCircuitJson:Array.isArray(t)?t:[t]}}}}});var Q9={};$c(Q9,{__addDisposableResource:()=>Brt,__assign:()=>TP,__asyncDelegator:()=>Rrt,__asyncGenerator:()=>Art,__asyncValues:()=>Ort,__await:()=>ny,__awaiter:()=>Trt,__classPrivateFieldGet:()=>zrt,__classPrivateFieldIn:()=>jrt,__classPrivateFieldSet:()=>Drt,__createBinding:()=>MP,__decorate:()=>xrt,__disposeResources:()=>Yrt,__esDecorate:()=>vrt,__exportStar:()=>Mrt,__extends:()=>yrt,__generator:()=>Ert,__importDefault:()=>$rt,__importStar:()=>Frt,__makeTemplateObject:()=>Lrt,__metadata:()=>krt,__param:()=>brt,__propKey:()=>Srt,__read:()=>J9,__rest:()=>grt,__rewriteRelativeImportExtension:()=>Xrt,__runInitializers:()=>wrt,__setFunctionName:()=>Prt,__spread:()=>Crt,__spreadArray:()=>Nrt,__spreadArrays:()=>Irt,__values:()=>EP,default:()=>$$t});var Z9=function(n,e){return Z9=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,i){t.__proto__=i}||function(t,i){for(var r in i)Object.prototype.hasOwnProperty.call(i,r)&&(t[r]=i[r])},Z9(n,e)};function yrt(n,e){if(typeof e!="function"&&e!==null)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");Z9(n,e);function t(){this.constructor=n}n.prototype=e===null?Object.create(e):(t.prototype=e.prototype,new t)}var TP=function(){return TP=Object.assign||function(e){for(var t,i=1,r=arguments.length;i<r;i++){t=arguments[i];for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&(e[s]=t[s])}return e},TP.apply(this,arguments)};function grt(n,e){var t={};for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&e.indexOf(i)<0&&(t[i]=n[i]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,i=Object.getOwnPropertySymbols(n);r<i.length;r++)e.indexOf(i[r])<0&&Object.prototype.propertyIsEnumerable.call(n,i[r])&&(t[i[r]]=n[i[r]]);return t}function xrt(n,e,t,i){var r=arguments.length,s=r<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,i);else for(var a=n.length-1;a>=0;a--)(o=n[a])&&(s=(r<3?o(s):r>3?o(e,t,s):o(e,t))||s);return r>3&&s&&Object.defineProperty(e,t,s),s}function brt(n,e){return function(t,i){e(t,i,n)}}function vrt(n,e,t,i,r,s){function o(S){if(S!==void 0&&typeof S!="function")throw new TypeError("Function expected");return S}for(var a=i.kind,c=a==="getter"?"get":a==="setter"?"set":"value",l=!e&&n?i.static?n:n.prototype:null,u=e||(l?Object.getOwnPropertyDescriptor(l,i.name):{}),p,d=!1,_=t.length-1;_>=0;_--){var g={};for(var x in i)g[x]=x==="access"?{}:i[x];for(var x in i.access)g.access[x]=i.access[x];g.addInitializer=function(S){if(d)throw new TypeError("Cannot add initializers after decoration has completed");s.push(o(S||null))};var v=(0,t[_])(a==="accessor"?{get:u.get,set:u.set}:u[c],g);if(a==="accessor"){if(v===void 0)continue;if(v===null||typeof v!="object")throw new TypeError("Object expected");(p=o(v.get))&&(u.get=p),(p=o(v.set))&&(u.set=p),(p=o(v.init))&&r.unshift(p)}else(p=o(v))&&(a==="field"?r.unshift(p):u[c]=p)}l&&Object.defineProperty(l,i.name,u),d=!0}function wrt(n,e,t){for(var i=arguments.length>2,r=0;r<e.length;r++)t=i?e[r].call(n,t):e[r].call(n);return i?t:void 0}function Srt(n){return typeof n=="symbol"?n:"".concat(n)}function Prt(n,e,t){return typeof e=="symbol"&&(e=e.description?"[".concat(e.description,"]"):""),Object.defineProperty(n,"name",{configurable:!0,value:t?"".concat(t," ",e):e})}function krt(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}function Trt(n,e,t,i){function r(s){return s instanceof t?s:new t(function(o){o(s)})}return new(t||(t=Promise))(function(s,o){function a(u){try{l(i.next(u))}catch(p){o(p)}}function c(u){try{l(i.throw(u))}catch(p){o(p)}}function l(u){u.done?s(u.value):r(u.value).then(a,c)}l((i=i.apply(n,e||[])).next())})}function Ert(n,e){var t={label:0,sent:function(){if(s[0]&1)throw s[1];return s[1]},trys:[],ops:[]},i,r,s,o=Object.create((typeof Iterator=="function"?Iterator:Object).prototype);return o.next=a(0),o.throw=a(1),o.return=a(2),typeof Symbol=="function"&&(o[Symbol.iterator]=function(){return this}),o;function a(l){return function(u){return c([l,u])}}function c(l){if(i)throw new TypeError("Generator is already executing.");for(;o&&(o=0,l[0]&&(t=0)),t;)try{if(i=1,r&&(s=l[0]&2?r.return:l[0]?r.throw||((s=r.return)&&s.call(r),0):r.next)&&!(s=s.call(r,l[1])).done)return s;switch(r=0,s&&(l=[l[0]&2,s.value]),l[0]){case 0:case 1:s=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,r=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(s=t.trys,!(s=s.length>0&&s[s.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!s||l[1]>s[0]&&l[1]<s[3])){t.label=l[1];break}if(l[0]===6&&t.label<s[1]){t.label=s[1],s=l;break}if(s&&t.label<s[2]){t.label=s[2],t.ops.push(l);break}s[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(n,t)}catch(u){l=[6,u],r=0}finally{i=s=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}var MP=Object.create?(function(n,e,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(e,t);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(n,i,r)}):(function(n,e,t,i){i===void 0&&(i=t),n[i]=e[t]});function Mrt(n,e){for(var t in n)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&MP(e,n,t)}function EP(n){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&n[e],i=0;if(t)return t.call(n);if(n&&typeof n.length=="number")return{next:function(){return n&&i>=n.length&&(n=void 0),{value:n&&n[i++],done:!n}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function J9(n,e){var t=typeof Symbol=="function"&&n[Symbol.iterator];if(!t)return n;var i=t.call(n),r,s=[],o;try{for(;(e===void 0||e-- >0)&&!(r=i.next()).done;)s.push(r.value)}catch(a){o={error:a}}finally{try{r&&!r.done&&(t=i.return)&&t.call(i)}finally{if(o)throw o.error}}return s}function Crt(){for(var n=[],e=0;e<arguments.length;e++)n=n.concat(J9(arguments[e]));return n}function Irt(){for(var n=0,e=0,t=arguments.length;e<t;e++)n+=arguments[e].length;for(var i=Array(n),r=0,e=0;e<t;e++)for(var s=arguments[e],o=0,a=s.length;o<a;o++,r++)i[r]=s[o];return i}function Nrt(n,e,t){if(t||arguments.length===2)for(var i=0,r=e.length,s;i<r;i++)(s||!(i in e))&&(s||(s=Array.prototype.slice.call(e,0,i)),s[i]=e[i]);return n.concat(s||Array.prototype.slice.call(e))}function ny(n){return this instanceof ny?(this.v=n,this):new ny(n)}function Art(n,e,t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i=t.apply(n,e||[]),r,s=[];return r=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),a("next"),a("throw"),a("return",o),r[Symbol.asyncIterator]=function(){return this},r;function o(_){return function(g){return Promise.resolve(g).then(_,p)}}function a(_,g){i[_]&&(r[_]=function(x){return new Promise(function(v,S){s.push([_,x,v,S])>1||c(_,x)})},g&&(r[_]=g(r[_])))}function c(_,g){try{l(i[_](g))}catch(x){d(s[0][3],x)}}function l(_){_.value instanceof ny?Promise.resolve(_.value.v).then(u,p):d(s[0][2],_)}function u(_){c("next",_)}function p(_){c("throw",_)}function d(_,g){_(g),s.shift(),s.length&&c(s[0][0],s[0][1])}}function Rrt(n){var e,t;return e={},i("next"),i("throw",function(r){throw r}),i("return"),e[Symbol.iterator]=function(){return this},e;function i(r,s){e[r]=n[r]?function(o){return(t=!t)?{value:ny(n[r](o)),done:!1}:s?s(o):o}:s}}function Ort(n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e=n[Symbol.asyncIterator],t;return e?e.call(n):(n=typeof EP=="function"?EP(n):n[Symbol.iterator](),t={},i("next"),i("throw"),i("return"),t[Symbol.asyncIterator]=function(){return this},t);function i(s){t[s]=n[s]&&function(o){return new Promise(function(a,c){o=n[s](o),r(a,c,o.done,o.value)})}}function r(s,o,a,c){Promise.resolve(c).then(function(l){s({value:l,done:a})},o)}}function Lrt(n,e){return Object.defineProperty?Object.defineProperty(n,"raw",{value:e}):n.raw=e,n}var L$t=Object.create?(function(n,e){Object.defineProperty(n,"default",{enumerable:!0,value:e})}):function(n,e){n.default=e},K9=function(n){return K9=Object.getOwnPropertyNames||function(e){var t=[];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[t.length]=i);return t},K9(n)};function Frt(n){if(n&&n.__esModule)return n;var e={};if(n!=null)for(var t=K9(n),i=0;i<t.length;i++)t[i]!=="default"&&MP(e,n,t[i]);return L$t(e,n),e}function $rt(n){return n&&n.__esModule?n:{default:n}}function zrt(n,e,t,i){if(t==="a"&&!i)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?n!==e||!i:!e.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?i:t==="a"?i.call(n):i?i.value:e.get(n)}function Drt(n,e,t,i,r){if(i==="m")throw new TypeError("Private method is not writable");if(i==="a"&&!r)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?n!==e||!r:!e.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return i==="a"?r.call(n,t):r?r.value=t:e.set(n,t),t}function jrt(n,e){if(e===null||typeof e!="object"&&typeof e!="function")throw new TypeError("Cannot use 'in' operator on non-object");return typeof n=="function"?e===n:n.has(e)}function Brt(n,e,t){if(e!=null){if(typeof e!="object"&&typeof e!="function")throw new TypeError("Object expected.");var i,r;if(t){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");i=e[Symbol.asyncDispose]}if(i===void 0){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");i=e[Symbol.dispose],t&&(r=i)}if(typeof i!="function")throw new TypeError("Object not disposable.");r&&(i=function(){try{r.call(this)}catch(s){return Promise.reject(s)}}),n.stack.push({value:e,dispose:i,async:t})}else t&&n.stack.push({async:!0});return e}var F$t=typeof SuppressedError=="function"?SuppressedError:function(n,e,t){var i=new Error(t);return i.name="SuppressedError",i.error=n,i.suppressed=e,i};function Yrt(n){function e(s){n.error=n.hasError?new F$t(s,n.error,"An error was suppressed during disposal."):s,n.hasError=!0}var t,i=0;function r(){for(;t=n.stack.pop();)try{if(!t.async&&i===1)return i=0,n.stack.push(t),Promise.resolve().then(r);if(t.dispose){var s=t.dispose.call(t.value);if(t.async)return i|=2,Promise.resolve(s).then(r,function(o){return e(o),r()})}else i|=1}catch(o){e(o)}if(i===1)return n.hasError?Promise.reject(n.error):Promise.resolve();if(n.hasError)throw n.error}return r()}function Xrt(n,e){return typeof n=="string"&&/^\.\.?\//.test(n)?n.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(t,i,r,s,o){return i?e?".jsx":".js":r&&(!s||!o)?t:r+s+"."+o.toLowerCase()+"js"}):n}var $$t={__extends:yrt,__assign:TP,__rest:grt,__decorate:xrt,__param:brt,__esDecorate:vrt,__runInitializers:wrt,__propKey:Srt,__setFunctionName:Prt,__metadata:krt,__awaiter:Trt,__generator:Ert,__createBinding:MP,__exportStar:Mrt,__values:EP,__read:J9,__spread:Crt,__spreadArrays:Irt,__spreadArray:Nrt,__await:ny,__asyncGenerator:Art,__asyncDelegator:Rrt,__asyncValues:Ort,__makeTemplateObject:Lrt,__importStar:Frt,__importDefault:$rt,__classPrivateFieldGet:zrt,__classPrivateFieldSet:Drt,__classPrivateFieldIn:jrt,__addDisposableResource:Brt,__disposeResources:Yrt,__rewriteRelativeImportExtension:Xrt};var t6=Vt(In(),1),Zbe=(0,t6.default)("tsci:eval:execution-context");function K1(n,e={}){globalThis.React=Urt;let t=e.platform||_rt(),i=e.projectConfig?{...t,...e.projectConfig}:t;i.partsEngineDisabled&&(i.partsEngine=void 0);let r=new J_({platform:i});e.name&&(r.name=e.name),e.debugNamespace&&r.enableDebug(e.debugNamespace);let s=[];return{fsMap:{},entrypoint:"",logger:{info:o=>{s.push({msg:o})},getLogs:()=>s,stringifyLogs:()=>s.map(o=>o.msg).join(`
|
|
256
256
|
`)},preSuppliedImports:{"@tscircuit/core":xP,tscircuit:xP,"@tscircuit/math-utils":R4,react:Urt,"react/jsx-runtime":z$t,debug:t6.default,tslib:Q9,"@tscircuit/props":{}},circuit:r,tsConfig:null,importStack:[],currentlyImporting:new Set,...n}}function kl(n){let e=n;return e=e.replace(/\\/g,"/"),e=e.trim(),e.startsWith("./")&&(e=e.slice(2)),e.startsWith("/")&&(e=e.slice(1)),e}function Vrt(n){let e={};for(let[t,i]of Object.entries(n))e[kl(t)]=i;return e}function js(n){if(!n)return".";let t=n.replace(/\\/g,"/").replace(/\/+$/,"");return t.indexOf("/")===-1?".":t.substring(0,t.lastIndexOf("/"))||"/"}function CP(n,e){if(n.startsWith("../")){let t=js(e);return CP(n.slice(3),t)}return n.startsWith("./")?CP(n.slice(2),e):n.startsWith("/")?n.slice(1):`${e}/${n}`}function J1(n){if(Array.isArray(n))return null;let e=n["tsconfig.json"];if(!e)return null;try{let t=e.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g,"");return JSON.parse(t)}catch(t){throw new Error(`Failed to parse tsconfig.json: ${t.message}`)}}function Grt(n){let{importPath:e,normalizedFilePathMap:t,extensions:i,tsConfig:r,tsconfigDir:s}=n,o=r?.compilerOptions?.paths;if(!o)return null;let a=r?.compilerOptions?.baseUrl||".",c=u=>{let p=kl(u);if(t.has(p))return t.get(p);for(let d of i){let _=`${p}.${d}`;if(t.has(_))return t.get(_)}return null};for(let[u,p]of Object.entries(o))if(u.includes("*")){let[_,g]=u.split("*");if(!e.startsWith(_)||!e.endsWith(g||""))continue;let x=e.slice(_.length,e.length-(g?g.length:0));for(let v of p){let S=v.replace("*",x),P=a&&!S.startsWith("./")&&!S.startsWith("/")?`${a}/${S}`:S,T=c(P);if(T)return T}}else{if(e!==u)continue;for(let _ of p){let g=a&&!_.startsWith("./")&&!_.startsWith("/")?`${a}/${_}`:_,x=c(g);if(x)return x}}let l=e6({importPath:e,normalizedFilePathMap:t,extensions:i,tsConfig:r,tsconfigDir:s});return l||null}function e6(n){let{importPath:e,normalizedFilePathMap:t,extensions:i,tsConfig:r,tsconfigDir:s}=n,o=r?.compilerOptions?.baseUrl;if(!o)return null;let c=`${s||"."}/${o}/${e}`;c=c.replace(/\/+/g,"/"),c=c.replace(/\/\.\//g,"/");let l=kl(c);if(t.has(l))return t.get(l);for(let u of i){let p=`${l}.${u}`;if(t.has(p))return t.get(p)}return null}function Wrt(n,e){let t=e?.compilerOptions?.paths;if(!t)return!1;for(let[i]of Object.entries(t))if(i.includes("*")){let[s,o]=i.split("*");if(n.startsWith(s)&&n.endsWith(o||""))return!0}else if(n===i)return!0;return!1}var IP=["tsx","ts","json","js","jsx","obj","gltf","glb","stl","step","stp"],Q1=(n,e,t,i={})=>{let r=i.tsConfig??null,s=n.startsWith("./")||n.startsWith("../"),o=!!r?.compilerOptions?.baseUrl,a=t&&(s||!o)?CP(n,t):n,c=new Set(Array.isArray(e)?e:Object.keys(e));if(c.has(a))return a;let l=new Map;for(let p of c)l.set(kl(p),p);let u=kl(a);if(s||!o){if(l.has(u))return l.get(u);for(let p of IP){let d=`${u}.${p}`;if(l.has(d))return l.get(d)}}if(!s){let p=Grt({importPath:n,normalizedFilePathMap:l,extensions:IP,tsConfig:r,tsconfigDir:i.tsconfigDir});if(p)return p;let d=e6({importPath:n,normalizedFilePathMap:l,extensions:IP,tsConfig:r,tsconfigDir:i.tsconfigDir});if(d)return d}if(!s&&!o){let p=kl(n);if(l.has(p))return l.get(p);for(let d of IP){let _=`${p}.${d}`;if(l.has(_))return l.get(_)}}return null},NP=(n,e,t,i={})=>{let r=Q1(n,e,t,i);if(!r)throw new Error(`File not found "${n}", available paths:
|