@tscircuit/eval 0.0.844 → 0.0.845

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.
@@ -707,7 +707,7 @@ ${spiceString}`)}catch(error2){debug10(`Failed to convert circuit JSON to SPICE:
707
707
  `+filler+` |
708
708
  `+offset_s.line+" | "+line2+`
709
709
  `+filler+" | "+peg$padEnd3("",s3.column-1," ")+peg$padEnd3("",hatLen,"^")}else str+=`
710
- at `+loc}return str};peg$SyntaxError3.buildMessage=function(expected,found){var DESCRIBE_EXPECTATION_FNS={literal:function(expectation){return'"'+literalEscape(expectation.text)+'"'},class:function(expectation){var escapedParts=expectation.parts.map(function(part){return Array.isArray(part)?classEscape(part[0])+"-"+classEscape(part[1]):classEscape(part)});return"["+(expectation.inverted?"^":"")+escapedParts.join("")+"]"},any:function(){return"any character"},end:function(){return"end of input"},other:function(expectation){return expectation.description}};function hex(ch3){return ch3.charCodeAt(0).toString(16).toUpperCase()}function literalEscape(s3){return s3.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch3){return"\\x0"+hex(ch3)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch3){return"\\x"+hex(ch3)})}function classEscape(s3){return s3.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch3){return"\\x0"+hex(ch3)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch3){return"\\x"+hex(ch3)})}function describeExpectation(expectation){return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation)}function describeExpected(expected2){var descriptions=expected2.map(describeExpectation),i3,j4;if(descriptions.sort(),descriptions.length>0){for(i3=1,j4=1;i3<descriptions.length;i3++)descriptions[i3-1]!==descriptions[i3]&&(descriptions[j4]=descriptions[i3],j4++);descriptions.length=j4}switch(descriptions.length){case 1:return descriptions[0];case 2:return descriptions[0]+" or "+descriptions[1];default:return descriptions.slice(0,-1).join(", ")+", or "+descriptions[descriptions.length-1]}}function describeFound(found2){return found2?'"'+literalEscape(found2)+'"':"end of input"}return"Expected "+describeExpected(expected)+" but "+describeFound(found)+" found."};function decomposeTSR3(matrix2,flipX=!1,flipY2=!1){flipX?flipY2?matrix2=compose4(matrix2,scale4(-1,-1)):matrix2=compose4(matrix2,scale4(1,-1)):flipY2&&(matrix2=compose4(matrix2,scale4(-1,1)));let a3=matrix2.a,b3=matrix2.b,c4=matrix2.c,d4=matrix2.d,scaleX,scaleY,rotation22;if(a3!==0||c4!==0){let hypotAc=Math.hypot(a3,c4);scaleX=hypotAc,scaleY=(a3*d4-b3*c4)/hypotAc;let acos=Math.acos(a3/hypotAc);rotation22=c4>0?-acos:acos}else if(b3!==0||d4!==0){let hypotBd=Math.hypot(b3,d4);scaleX=(a3*d4-b3*c4)/hypotBd,scaleY=hypotBd;let acos=Math.acos(b3/hypotBd);rotation22=Math.PI/2+(d4>0?-acos:acos)}else scaleX=0,scaleY=0,rotation22=0;return flipY2&&(scaleX=-scaleX),flipX&&(scaleY=-scaleY),{translate:{tx:matrix2.e,ty:matrix2.f},scale:{sx:scaleX,sy:scaleY},rotation:{angle:rotation22}}}function connect2(map,a3,b3){if(!a3||!b3)return;let setA=map.get(a3);setA||(setA=new Set,map.set(a3,setA)),setA.add(b3);let setB=map.get(b3);setB||(setB=new Set,map.set(b3,setB)),setB.add(a3)}function buildSubtree2(soup,opts){if(!opts.subcircuit_id&&!opts.source_group_id)return[...soup];let effectiveOpts=opts;if(opts.subcircuit_id){let subcircuitIds=new Set([opts.subcircuit_id]),groupChildren=new Map,groupSubcircuit=new Map;for(let elm of soup)if(elm.type==="source_group"){let groupId=elm.source_group_id,subcircuitId=elm.subcircuit_id;subcircuitId&&groupSubcircuit.set(groupId,subcircuitId);let parentId=elm.parent_source_group_id;parentId&&(groupChildren.has(parentId)||groupChildren.set(parentId,[]),groupChildren.get(parentId).push(groupId))}let rootGroupId;for(let[groupId,subcircuitId]of groupSubcircuit)if(subcircuitId===opts.subcircuit_id){rootGroupId=groupId;break}if(rootGroupId){let collectChildSubcircuits=groupId=>{let children=groupChildren.get(groupId)||[];for(let childId of children){let childSubcircuit=groupSubcircuit.get(childId);childSubcircuit&&subcircuitIds.add(childSubcircuit),collectChildSubcircuits(childId)}};collectChildSubcircuits(rootGroupId),effectiveOpts={...opts,subcircuit_ids:Array.from(subcircuitIds)}}}let idMap=new Map;for(let elm of soup){let idKey=`${elm.type}_id`,idVal=elm[idKey];typeof idVal=="string"&&idMap.set(idVal,elm)}let adj=new Map;for(let elm of soup){let entries=Object.entries(elm);for(let[key,val]of entries)if(key!=="parent_source_group_id"){if(key.endsWith("_id")&&typeof val=="string"){let other=idMap.get(val);connect2(adj,elm,other)}else if(key.endsWith("_ids")&&Array.isArray(val)){for(let v4 of val)if(typeof v4=="string"){let other=idMap.get(v4);connect2(adj,elm,other)}}}}let queue=[],included=new Set;for(let elm of soup){let shouldInclude=!1;(effectiveOpts.subcircuit_id&&"subcircuit_id"in elm&&elm.subcircuit_id===effectiveOpts.subcircuit_id||effectiveOpts.subcircuit_ids&&"subcircuit_id"in elm&&elm.subcircuit_id&&effectiveOpts.subcircuit_ids.includes(elm.subcircuit_id)||effectiveOpts.source_group_id&&"source_group_id"in elm&&elm.source_group_id===effectiveOpts.source_group_id||effectiveOpts.source_group_id&&"member_source_group_ids"in elm&&Array.isArray(elm.member_source_group_ids)&&elm.member_source_group_ids.includes(effectiveOpts.source_group_id))&&(shouldInclude=!0),shouldInclude&&(queue.push(elm),included.add(elm))}for(;queue.length>0;){let elm=queue.shift(),neighbors=adj.get(elm);if(neighbors)for(let n4 of neighbors)included.has(n4)||(included.add(n4),queue.push(n4))}return soup.filter(e5=>included.has(e5))}var cju2=(circuitJsonInput,options={})=>{let circuitJson=circuitJsonInput,internalStore=circuitJson._internal_store;if(!internalStore){internalStore={counts:{},editCount:0},circuitJson._internal_store=internalStore;for(let elm of circuitJson){let type=elm.type,idVal=elm[`${type}_id`];if(!idVal)continue;let idNum=Number.parseInt(idVal.split("_").pop());Number.isNaN(idNum)||(internalStore.counts[type]=Math.max(internalStore.counts[type]??0,idNum))}}let su22=new Proxy({},{get:(proxy_target,prop)=>{if(prop==="toArray")return()=>(circuitJson.editCount=internalStore.editCount,circuitJson);if(prop==="editCount")return internalStore.editCount;if(prop==="subtree")return opts=>cju2(buildSubtree2(circuitJson,opts),options);if(prop==="insert")return elm=>{var _a463;let component_type2=elm.type;if(!component_type2)throw new Error("insert requires an element with a type");(_a463=internalStore.counts)[component_type2]??(_a463[component_type2]=-1),internalStore.counts[component_type2]++;let index=internalStore.counts[component_type2],newElm={...elm,type:component_type2,[`${component_type2}_id`]:`${component_type2}_${index}`};return options.validateInserts&&(dist_exports6[component_type2]??any_soup_element2).parse(newElm),circuitJson.push(newElm),internalStore.editCount++,newElm};if(prop==="insertAll")return elms=>elms.map(elm=>su22.insert(elm));let component_type=prop;return{get:id2=>circuitJson.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2),getUsing:using=>{let keys=Object.keys(using);if(keys.length!==1)throw new Error("getUsing requires exactly one key, e.g. { pcb_component_id }");let join_key=keys[0],join_type=join_key.replace("_id",""),joiner=circuitJson.find(e5=>e5.type===join_type&&e5[join_key]===using[join_key]);return joiner?circuitJson.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===joiner[`${component_type}_id`]):null},getWhere:where=>{let keys=Object.keys(where);return circuitJson.find(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))},list:where=>{let keys=where?Object.keys(where):[];return circuitJson.filter(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))},insert:elm=>{var _a463;(_a463=internalStore.counts)[component_type]??(_a463[component_type]=-1),internalStore.counts[component_type]++;let index=internalStore.counts[component_type],newElm={type:component_type,[`${component_type}_id`]:`${component_type}_${index}`,...elm};return options.validateInserts&&(dist_exports6[component_type]??any_soup_element2).parse(newElm),circuitJson.push(newElm),internalStore.editCount++,newElm},delete:id2=>{let elm=circuitJson.find(e5=>e5[`${component_type}_id`]===id2);elm&&(circuitJson.splice(circuitJson.indexOf(elm),1),internalStore.editCount++)},update:(id2,newProps)=>{let elm=circuitJson.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2);return elm?(Object.assign(elm,newProps),internalStore.editCount++,elm):null},select:selector=>{if(component_type==="source_component")return circuitJson.find(e5=>e5.type==="source_component"&&e5.name===selector.replace(/\./g,""));if(component_type==="pcb_port"||component_type==="source_port"||component_type==="schematic_port"){let[component_name,port_selector]=selector.replace(/\./g,"").split(/[\s\>]+/),source_component=circuitJson.find(e5=>e5.type==="source_component"&&e5.name===component_name);if(!source_component)return null;let source_port22=circuitJson.find(e5=>e5.type==="source_port"&&e5.source_component_id===source_component.source_component_id&&(e5.name===port_selector||(e5.port_hints??[]).includes(port_selector)));if(!source_port22)return null;if(component_type==="source_port")return source_port22;if(component_type==="pcb_port")return circuitJson.find(e5=>e5.type==="pcb_port"&&e5.source_port_id===source_port22.source_port_id);if(component_type==="schematic_port")return circuitJson.find(e5=>e5.type==="schematic_port"&&e5.source_port_id===source_port22.source_port_id)}}}}});return su22};cju2.unparsed=cju2;function createIdKey2(element){let type=element.type;return`${type}:${element[`${type}_id`]}`}var cjuIndexed2=(soup,options={})=>{let internalStore=soup._internal_store_indexed;if(!internalStore){internalStore={counts:{},editCount:0,indexes:{}};for(let elm of soup){let type=elm.type,idVal=elm[`${type}_id`];if(!idVal)continue;let idNum=Number.parseInt(idVal.split("_").pop()||"");Number.isNaN(idNum)||(internalStore.counts[type]=Math.max(internalStore.counts[type]??0,idNum))}let indexConfig=options.indexConfig||{},indexes=internalStore.indexes;if(indexConfig.byId&&(indexes.byId=new Map),indexConfig.byType&&(indexes.byType=new Map),indexConfig.byRelation&&(indexes.byRelation=new Map),indexConfig.bySubcircuit&&(indexes.bySubcircuit=new Map),indexConfig.byCustomField&&indexConfig.byCustomField.length>0){indexes.byCustomField=new Map;for(let field of indexConfig.byCustomField)indexes.byCustomField.set(field,new Map)}for(let element of soup){if(indexConfig.byId){let idKey=createIdKey2(element);indexes.byId.set(idKey,element)}if(indexConfig.byType){let elementsOfType=indexes.byType.get(element.type)||[];elementsOfType.push(element),indexes.byType.set(element.type,elementsOfType)}if(indexConfig.byRelation){let elementEntries=Object.entries(element);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${element.type}_id`&&typeof value=="string"){let relationTypeMap=indexes.byRelation.get(key)||new Map,relatedElements=relationTypeMap.get(value)||[];relatedElements.push(element),relationTypeMap.set(value,relatedElements),indexes.byRelation.set(key,relationTypeMap)}}if(indexConfig.bySubcircuit&&"subcircuit_id"in element){let subcircuitId=element.subcircuit_id;if(subcircuitId&&typeof subcircuitId=="string"){let subcircuitElements=indexes.bySubcircuit.get(subcircuitId)||[];subcircuitElements.push(element),indexes.bySubcircuit.set(subcircuitId,subcircuitElements)}}if(indexConfig.byCustomField&&indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in element){let fieldValue=element[field];if(fieldValue!==void 0&&(typeof fieldValue=="string"||typeof fieldValue=="number")){let fieldValueStr=String(fieldValue),fieldMap=indexes.byCustomField.get(field),elementsWithFieldValue=fieldMap.get(fieldValueStr)||[];elementsWithFieldValue.push(element),fieldMap.set(fieldValueStr,elementsWithFieldValue)}}}}soup._internal_store_indexed=internalStore}return new Proxy({},{get:(proxy_target,prop)=>{if(prop==="toArray")return()=>(soup.editCount=internalStore.editCount,soup);if(prop==="editCount")return internalStore.editCount;let component_type=prop;return{get:id2=>{let indexConfig=options.indexConfig||{};return indexConfig.byId&&internalStore.indexes.byId?internalStore.indexes.byId.get(`${component_type}:${id2}`)||null:indexConfig.byType&&internalStore.indexes.byType?(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===id2)||null:soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2)||null},getUsing:using=>{let indexConfig=options.indexConfig||{},keys=Object.keys(using);if(keys.length!==1)throw new Error("getUsing requires exactly one key, e.g. { pcb_component_id }");let join_key=keys[0],join_type=join_key.replace("_id","");if(indexConfig.byRelation&&internalStore.indexes.byRelation){let relationMap=internalStore.indexes.byRelation.get(join_key);if(relationMap){let joiner2=(relationMap.get(using[join_key])||[]).find(e5=>e5.type===join_type);if(!joiner2)return null;let joinerId=joiner2[`${component_type}_id`];return indexConfig.byId&&internalStore.indexes.byId?internalStore.indexes.byId.get(`${component_type}:${joinerId}`)||null:indexConfig.byType&&internalStore.indexes.byType?(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===joinerId)||null:soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===joinerId)||null}}let joiner=soup.find(e5=>e5.type===join_type&&e5[join_key]===using[join_key]);return joiner&&soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===joiner[`${component_type}_id`])||null},getWhere:where=>{let indexConfig=options.indexConfig||{},keys=Object.keys(where);if(keys.length===1&&indexConfig.byCustomField&&internalStore.indexes.byCustomField){let field=keys[0],fieldMap=internalStore.indexes.byCustomField.get(field);if(fieldMap){let fieldValue=String(where[field]);return(fieldMap.get(fieldValue)||[]).find(e5=>e5.type===component_type)||null}}if("subcircuit_id"in where&&indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit){let subcircuitId=where.subcircuit_id;return(internalStore.indexes.bySubcircuit.get(subcircuitId)||[]).find(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))||null}return indexConfig.byType&&internalStore.indexes.byType?(internalStore.indexes.byType.get(component_type)||[]).find(e5=>keys.every(key=>e5[key]===where[key]))||null:soup.find(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))||null},list:where=>{let indexConfig=options.indexConfig||{},keys=where?Object.keys(where):[];if(keys.length===0&&indexConfig.byType&&internalStore.indexes.byType)return internalStore.indexes.byType.get(component_type)||[];if(keys.length===1&&keys[0]==="subcircuit_id"&&indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit){let subcircuitId=where.subcircuit_id;return(internalStore.indexes.bySubcircuit.get(subcircuitId)||[]).filter(e5=>e5.type===component_type)}let elementsToFilter;return indexConfig.byType&&internalStore.indexes.byType?elementsToFilter=internalStore.indexes.byType.get(component_type)||[]:elementsToFilter=soup.filter(e5=>e5.type===component_type),keys.length>0?elementsToFilter.filter(e5=>keys.every(key=>e5[key]===where[key])):elementsToFilter},insert:elm=>{var _a463;(_a463=internalStore.counts)[component_type]??(_a463[component_type]=-1),internalStore.counts[component_type]++;let index=internalStore.counts[component_type],newElm={type:component_type,[`${component_type}_id`]:`${component_type}_${index}`,...elm};options.validateInserts&&(dist_exports6[component_type]??any_soup_element2).parse(newElm),soup.push(newElm),internalStore.editCount++;let indexConfig=options.indexConfig||{};if(indexConfig.byId&&internalStore.indexes.byId){let idKey=createIdKey2(newElm);internalStore.indexes.byId.set(idKey,newElm)}if(indexConfig.byType&&internalStore.indexes.byType){let elementsOfType=internalStore.indexes.byType.get(component_type)||[];elementsOfType.push(newElm),internalStore.indexes.byType.set(component_type,elementsOfType)}if(indexConfig.byRelation&&internalStore.indexes.byRelation){let elementEntries=Object.entries(newElm);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${newElm.type}_id`&&typeof value=="string"){let relationTypeMap=internalStore.indexes.byRelation.get(key)||new Map,relatedElements=relationTypeMap.get(value)||[];relatedElements.push(newElm),relationTypeMap.set(value,relatedElements),internalStore.indexes.byRelation.set(key,relationTypeMap)}}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in newElm){let subcircuitId=newElm.subcircuit_id;if(subcircuitId&&typeof subcircuitId=="string"){let subcircuitElements=internalStore.indexes.bySubcircuit.get(subcircuitId)||[];subcircuitElements.push(newElm),internalStore.indexes.bySubcircuit.set(subcircuitId,subcircuitElements)}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in newElm){let fieldValue=newElm[field];if(fieldValue!==void 0&&(typeof fieldValue=="string"||typeof fieldValue=="number")){let fieldValueStr=String(fieldValue),fieldMap=internalStore.indexes.byCustomField.get(field),elementsWithFieldValue=fieldMap.get(fieldValueStr)||[];elementsWithFieldValue.push(newElm),fieldMap.set(fieldValueStr,elementsWithFieldValue)}}}return newElm},delete:id2=>{let indexConfig=options.indexConfig||{},elm;if(indexConfig.byId&&internalStore.indexes.byId?elm=internalStore.indexes.byId.get(`${component_type}:${id2}`):indexConfig.byType&&internalStore.indexes.byType?elm=(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===id2):elm=soup.find(e5=>e5[`${component_type}_id`]===id2),!elm)return;let elmIndex=soup.indexOf(elm);if(elmIndex>=0&&(soup.splice(elmIndex,1),internalStore.editCount++),indexConfig.byId&&internalStore.indexes.byId){let idKey=createIdKey2(elm);internalStore.indexes.byId.delete(idKey)}if(indexConfig.byType&&internalStore.indexes.byType){let filteredElements=(internalStore.indexes.byType.get(component_type)||[]).filter(e5=>e5[`${component_type}_id`]!==id2);internalStore.indexes.byType.set(component_type,filteredElements)}if(indexConfig.byRelation&&internalStore.indexes.byRelation)for(let[relationKey,relationMap]of internalStore.indexes.byRelation.entries())for(let[relationValue,elements]of relationMap.entries()){let updatedElements=elements.filter(e5=>e5!==elm);updatedElements.length===0?relationMap.delete(relationValue):relationMap.set(relationValue,updatedElements)}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in elm){let subcircuitId=elm.subcircuit_id;if(subcircuitId){let updatedElements=(internalStore.indexes.bySubcircuit.get(subcircuitId)||[]).filter(e5=>e5!==elm);updatedElements.length===0?internalStore.indexes.bySubcircuit.delete(subcircuitId):internalStore.indexes.bySubcircuit.set(subcircuitId,updatedElements)}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField)for(let fieldMap of internalStore.indexes.byCustomField.values())for(let[fieldValue,elements]of fieldMap.entries()){let updatedElements=elements.filter(e5=>e5!==elm);updatedElements.length===0?fieldMap.delete(fieldValue):fieldMap.set(fieldValue,updatedElements)}},update:(id2,newProps)=>{let indexConfig=options.indexConfig||{},elm;if(indexConfig.byId&&internalStore.indexes.byId?elm=internalStore.indexes.byId.get(`${component_type}:${id2}`):indexConfig.byType&&internalStore.indexes.byType?elm=(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===id2):elm=soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2),!elm)return null;if(indexConfig.byRelation&&internalStore.indexes.byRelation){let elementEntries=Object.entries(elm);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${elm.type}_id`&&typeof value=="string"&&key in newProps&&newProps[key]!==value){let relationTypeMap=internalStore.indexes.byRelation.get(key);if(relationTypeMap){let updatedElements=(relationTypeMap.get(value)||[]).filter(e5=>e5!==elm);updatedElements.length===0?relationTypeMap.delete(value):relationTypeMap.set(value,updatedElements)}}}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in elm&&"subcircuit_id"in newProps){let oldSubcircuitId=elm.subcircuit_id,newSubcircuitId=newProps.subcircuit_id;if(oldSubcircuitId!==newSubcircuitId){let updatedElements=(internalStore.indexes.bySubcircuit.get(oldSubcircuitId)||[]).filter(e5=>e5!==elm);updatedElements.length===0?internalStore.indexes.bySubcircuit.delete(oldSubcircuitId):internalStore.indexes.bySubcircuit.set(oldSubcircuitId,updatedElements)}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in elm&&field in newProps&&elm[field]!==newProps[field]){let fieldMap=internalStore.indexes.byCustomField.get(field);if(fieldMap){let oldValue=String(elm[field]),updatedElements=(fieldMap.get(oldValue)||[]).filter(e5=>e5!==elm);updatedElements.length===0?fieldMap.delete(oldValue):fieldMap.set(oldValue,updatedElements)}}}if(Object.assign(elm,newProps),internalStore.editCount++,indexConfig.byRelation&&internalStore.indexes.byRelation){let elementEntries=Object.entries(elm);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${elm.type}_id`&&typeof value=="string"&&key in newProps){let relationTypeMap=internalStore.indexes.byRelation.get(key)||new Map,relatedElements=relationTypeMap.get(value)||[];relatedElements.includes(elm)||(relatedElements.push(elm),relationTypeMap.set(value,relatedElements),internalStore.indexes.byRelation.set(key,relationTypeMap))}}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in elm&&"subcircuit_id"in newProps){let subcircuitId=elm.subcircuit_id;if(subcircuitId&&typeof subcircuitId=="string"){let subcircuitElements=internalStore.indexes.bySubcircuit.get(subcircuitId)||[];subcircuitElements.includes(elm)||(subcircuitElements.push(elm),internalStore.indexes.bySubcircuit.set(subcircuitId,subcircuitElements))}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in elm&&field in newProps){let fieldValue=elm[field];if(fieldValue!==void 0&&(typeof fieldValue=="string"||typeof fieldValue=="number")){let fieldValueStr=String(fieldValue),fieldMap=internalStore.indexes.byCustomField.get(field),elementsWithFieldValue=fieldMap.get(fieldValueStr)||[];elementsWithFieldValue.includes(elm)||(elementsWithFieldValue.push(elm),fieldMap.set(fieldValueStr,elementsWithFieldValue))}}}return elm},select:selector=>{if(component_type==="source_component")return soup.find(e5=>e5.type==="source_component"&&e5.name===selector.replace(/\./g,""))||null;if(component_type==="pcb_port"||component_type==="source_port"||component_type==="schematic_port"){let[component_name,port_selector]=selector.replace(/\./g,"").split(/[\s\>]+/),source_component=soup.find(e5=>e5.type==="source_component"&&e5.name===component_name);if(!source_component)return null;let source_port22=soup.find(e5=>e5.type==="source_port"&&e5.source_component_id===source_component.source_component_id&&(e5.name===port_selector||(e5.port_hints??[]).includes(port_selector)));if(!source_port22)return null;if(component_type==="source_port")return source_port22;if(component_type==="pcb_port")return soup.find(e5=>e5.type==="pcb_port"&&e5.source_port_id===source_port22.source_port_id)||null;if(component_type==="schematic_port")return soup.find(e5=>e5.type==="schematic_port"&&e5.source_port_id===source_port22.source_port_id)||null}return null}}}})};cjuIndexed2.unparsed=cjuIndexed2;var transformPCBElement2=(elm,matrix2)=>{let tsr=decomposeTSR3(matrix2),flipPadWidthHeight=Math.round(tsr.rotation.angle/(Math.PI/2))%2===1;if(elm.type==="pcb_plated_hole"||elm.type==="pcb_hole"||elm.type==="pcb_via"||elm.type==="pcb_smtpad"||elm.type==="pcb_port"){let{x:x4,y:y4}=applyToPoint4(matrix2,{x:Number(elm.x),y:Number(elm.y)});elm.x=x4,elm.y=y4,elm.type==="pcb_smtpad"&&elm.shape==="polygon"&&Array.isArray(elm.points)&&(elm.points=elm.points.map(point23=>{let tp3=applyToPoint4(matrix2,{x:point23.x,y:point23.y});return{x:tp3.x,y:tp3.y}}))}else if(elm.type==="pcb_keepout"||elm.type==="pcb_board")elm.center=applyToPoint4(matrix2,elm.center);else if(elm.type==="pcb_silkscreen_text"||elm.type==="pcb_fabrication_note_text"||elm.type==="pcb_note_text")elm.anchor_position=applyToPoint4(matrix2,elm.anchor_position);else if(elm.type==="pcb_silkscreen_circle"||elm.type==="pcb_silkscreen_rect"||elm.type==="pcb_note_rect"||elm.type==="pcb_courtyard_rect"||elm.type==="pcb_courtyard_circle")elm.center=applyToPoint4(matrix2,elm.center);else if(elm.type==="pcb_component")elm.center=applyToPoint4(matrix2,elm.center),elm.rotation=elm.rotation+tsr.rotation.angle/Math.PI*180,elm.rotation=elm.rotation%360,flipPadWidthHeight&&([elm.width,elm.height]=[elm.height,elm.width]);else if(elm.type==="pcb_courtyard_outline")elm.outline=elm.outline.map(p4=>{let tp3=applyToPoint4(matrix2,p4);return p4.x=tp3.x,p4.y=tp3.y,p4});else if(elm.type==="pcb_courtyard_polygon")elm.points=elm.points.map(p4=>{let tp3=applyToPoint4(matrix2,p4);return p4.x=tp3.x,p4.y=tp3.y,p4});else if(elm.type==="pcb_silkscreen_path"||elm.type==="pcb_trace"||elm.type==="pcb_fabrication_note_path"||elm.type==="pcb_note_path")elm.route=elm.route.map(rp3=>{let tp3=applyToPoint4(matrix2,rp3);return rp3.x=tp3.x,rp3.y=tp3.y,rp3});else if(elm.type==="pcb_silkscreen_line"||elm.type==="pcb_note_line"){let p12={x:elm.x1,y:elm.y1},p22={x:elm.x2,y:elm.y2},p1t=applyToPoint4(matrix2,p12),p2t=applyToPoint4(matrix2,p22);elm.x1=p1t.x,elm.y1=p1t.y,elm.x2=p2t.x,elm.y2=p2t.y}else if(elm.type==="cad_component"){let newPos=applyToPoint4(matrix2,{x:elm.position.x,y:elm.position.y});elm.position.x=newPos.x,elm.position.y=newPos.y}return elm},transformPCBElements2=(elms,matrix2)=>{let tsr=decomposeTSR3(matrix2),quarterTurns=Math.round(tsr.rotation.angle/(Math.PI/2)),flipPadWidthHeight=Math.abs(quarterTurns)%2===1,transformedElms=elms.map(elm=>transformPCBElement2(elm,matrix2));return flipPadWidthHeight&&(transformedElms=transformedElms.map(elm=>(elm.type==="pcb_smtpad"&&elm.shape==="rect"&&([elm.width,elm.height]=[elm.height,elm.width]),elm))),transformedElms};function stringHash3(str){let hash=0;if(str.length==0)return hash;for(var i3=0;i3<str.length;i3++){var char=str.charCodeAt(i3);hash=(hash<<5)-hash+char,hash=hash&hash}return Math.abs(hash)}var nice_color_palettes2=[["#69d2e7","#a7dbd8","#e0e4cc","#f38630","#fa6900"],["#fe4365","#fc9d9a","#f9cdad","#c8c8a9","#83af9b"],["#ecd078","#d95b43","#c02942","#542437","#53777a"],["#556270","#4ecdc4","#c7f464","#ff6b6b","#c44d58"],["#774f38","#e08e79","#f1d4af","#ece5ce","#c5e0dc"],["#e8ddcb","#cdb380","#036564","#033649","#031634"],["#490a3d","#bd1550","#e97f02","#f8ca00","#8a9b0f"],["#594f4f","#547980","#45ada8","#9de0ad","#e5fcc2"],["#00a0b0","#6a4a3c","#cc333f","#eb6841","#edc951"],["#e94e77","#d68189","#c6a49a","#c6e5d9","#f4ead5"],["#3fb8af","#7fc7af","#dad8a7","#ff9e9d","#ff3d7f"],["#d9ceb2","#948c75","#d5ded9","#7a6a53","#99b2b7"],["#ffffff","#cbe86b","#f2e9e1","#1c140d","#cbe86b"],["#efffcd","#dce9be","#555152","#2e2633","#99173c"],["#343838","#005f6b","#008c9e","#00b4cc","#00dffc"],["#413e4a","#73626e","#b38184","#f0b49e","#f7e4be"],["#ff4e50","#fc913a","#f9d423","#ede574","#e1f5c4"],["#99b898","#fecea8","#ff847c","#e84a5f","#2a363b"],["#655643","#80bca3","#f6f7bd","#e6ac27","#bf4d28"],["#00a8c6","#40c0cb","#f9f2e7","#aee239","#8fbe00"],["#351330","#424254","#64908a","#e8caa4","#cc2a41"],["#554236","#f77825","#d3ce3d","#f1efa5","#60b99a"],["#5d4157","#838689","#a8caba","#cad7b2","#ebe3aa"],["#8c2318","#5e8c6a","#88a65e","#bfb35a","#f2c45a"],["#fad089","#ff9c5b","#f5634a","#ed303c","#3b8183"],["#ff4242","#f4fad2","#d4ee5e","#e1edb9","#f0f2eb"],["#f8b195","#f67280","#c06c84","#6c5b7b","#355c7d"],["#d1e751","#ffffff","#000000","#4dbce9","#26ade4"],["#1b676b","#519548","#88c425","#bef202","#eafde6"],["#5e412f","#fcebb6","#78c0a8","#f07818","#f0a830"],["#bcbdac","#cfbe27","#f27435","#f02475","#3b2d38"],["#452632","#91204d","#e4844a","#e8bf56","#e2f7ce"],["#eee6ab","#c5bc8e","#696758","#45484b","#36393b"],["#f0d8a8","#3d1c00","#86b8b1","#f2d694","#fa2a00"],["#2a044a","#0b2e59","#0d6759","#7ab317","#a0c55f"],["#f04155","#ff823a","#f2f26f","#fff7bd","#95cfb7"],["#b9d7d9","#668284","#2a2829","#493736","#7b3b3b"],["#bbbb88","#ccc68d","#eedd99","#eec290","#eeaa88"],["#b3cc57","#ecf081","#ffbe40","#ef746f","#ab3e5b"],["#a3a948","#edb92e","#f85931","#ce1836","#009989"],["#300030","#480048","#601848","#c04848","#f07241"],["#67917a","#170409","#b8af03","#ccbf82","#e33258"],["#aab3ab","#c4cbb7","#ebefc9","#eee0b7","#e8caaf"],["#e8d5b7","#0e2430","#fc3a51","#f5b349","#e8d5b9"],["#ab526b","#bca297","#c5ceae","#f0e2a4","#f4ebc3"],["#607848","#789048","#c0d860","#f0f0d8","#604848"],["#b6d8c0","#c8d9bf","#dadabd","#ecdbbc","#fedcba"],["#a8e6ce","#dcedc2","#ffd3b5","#ffaaa6","#ff8c94"],["#3e4147","#fffedf","#dfba69","#5a2e2e","#2a2c31"],["#fc354c","#29221f","#13747d","#0abfbc","#fcf7c5"],["#cc0c39","#e6781e","#c8cf02","#f8fcc1","#1693a7"],["#1c2130","#028f76","#b3e099","#ffeaad","#d14334"],["#a7c5bd","#e5ddcb","#eb7b59","#cf4647","#524656"],["#dad6ca","#1bb0ce","#4f8699","#6a5e72","#563444"],["#5c323e","#a82743","#e15e32","#c0d23e","#e5f04c"],["#edebe6","#d6e1c7","#94c7b6","#403b33","#d3643b"],["#fdf1cc","#c6d6b8","#987f69","#e3ad40","#fcd036"],["#230f2b","#f21d41","#ebebbc","#bce3c5","#82b3ae"],["#b9d3b0","#81bda4","#b28774","#f88f79","#f6aa93"],["#3a111c","#574951","#83988e","#bcdea5","#e6f9bc"],["#5e3929","#cd8c52","#b7d1a3","#dee8be","#fcf7d3"],["#1c0113","#6b0103","#a30006","#c21a01","#f03c02"],["#000000","#9f111b","#b11623","#292c37","#cccccc"],["#382f32","#ffeaf2","#fcd9e5","#fbc5d8","#f1396d"],["#e3dfba","#c8d6bf","#93ccc6","#6cbdb5","#1a1f1e"],["#f6f6f6","#e8e8e8","#333333","#990100","#b90504"],["#1b325f","#9cc4e4","#e9f2f9","#3a89c9","#f26c4f"],["#a1dbb2","#fee5ad","#faca66","#f7a541","#f45d4c"],["#c1b398","#605951","#fbeec2","#61a6ab","#accec0"],["#5e9fa3","#dcd1b4","#fab87f","#f87e7b","#b05574"],["#951f2b","#f5f4d7","#e0dfb1","#a5a36c","#535233"],["#8dccad","#988864","#fea6a2","#f9d6ac","#ffe9af"],["#2d2d29","#215a6d","#3ca2a2","#92c7a3","#dfece6"],["#413d3d","#040004","#c8ff00","#fa023c","#4b000f"],["#eff3cd","#b2d5ba","#61ada0","#248f8d","#605063"],["#ffefd3","#fffee4","#d0ecea","#9fd6d2","#8b7a5e"],["#cfffdd","#b4dec1","#5c5863","#a85163","#ff1f4c"],["#9dc9ac","#fffec7","#f56218","#ff9d2e","#919167"],["#4e395d","#827085","#8ebe94","#ccfc8e","#dc5b3e"],["#a8a7a7","#cc527a","#e8175d","#474747","#363636"],["#f8edd1","#d88a8a","#474843","#9d9d93","#c5cfc6"],["#046d8b","#309292","#2fb8ac","#93a42a","#ecbe13"],["#f38a8a","#55443d","#a0cab5","#cde9ca","#f1edd0"],["#a70267","#f10c49","#fb6b41","#f6d86b","#339194"],["#ff003c","#ff8a00","#fabe28","#88c100","#00c176"],["#ffedbf","#f7803c","#f54828","#2e0d23","#f8e4c1"],["#4e4d4a","#353432","#94ba65","#2790b0","#2b4e72"],["#0ca5b0","#4e3f30","#fefeeb","#f8f4e4","#a5b3aa"],["#4d3b3b","#de6262","#ffb88c","#ffd0b3","#f5e0d3"],["#fffbb7","#a6f6af","#66b6ab","#5b7c8d","#4f2958"],["#edf6ee","#d1c089","#b3204d","#412e28","#151101"],["#9d7e79","#ccac95","#9a947c","#748b83","#5b756c"],["#fcfef5","#e9ffe1","#cdcfb7","#d6e6c3","#fafbe3"],["#9cddc8","#bfd8ad","#ddd9ab","#f7af63","#633d2e"],["#30261c","#403831","#36544f","#1f5f61","#0b8185"],["#aaff00","#ffaa00","#ff00aa","#aa00ff","#00aaff"],["#d1313d","#e5625c","#f9bf76","#8eb2c5","#615375"],["#ffe181","#eee9e5","#fad3b2","#ffba7f","#ff9c97"],["#73c8a9","#dee1b6","#e1b866","#bd5532","#373b44"],["#805841","#dcf7f3","#fffcdd","#ffd8d8","#f5a2a2"]],getDebugLayoutObject2=lo3=>{let{x:x4,y:y4,width,height}={...lo3,...lo3.size,...lo3.center,...lo3.position};if(lo3.x1!==void 0&&lo3.x2!==void 0&&lo3.y1!==void 0&&lo3.y2!==void 0&&(x4=(lo3.x1+lo3.x2)/2,y4=(lo3.y1+lo3.y2)/2,width=Math.abs(lo3.x1-lo3.x2),height=Math.abs(lo3.y1-lo3.y2)),lo3.points&&Array.isArray(lo3.points)&&lo3.points.length>0){let xCoords=lo3.points.map(point23=>point23.x),yCoords=lo3.points.map(point23=>point23.y),minX=Math.min(...xCoords),maxX=Math.max(...xCoords),minY=Math.min(...yCoords),maxY=Math.max(...yCoords);x4=(minX+maxX)/2,y4=(minY+maxY)/2,width=maxX-minX,height=maxY-minY}let title=lo3.text||lo3.name||lo3.source?.text||lo3.source?.name||"?",content=lo3;return x4===void 0||y4===void 0?null:(width===void 0&&"outer_diameter"in lo3&&(width=lo3.outer_diameter,height=lo3.outer_diameter),(width===void 0||height===void 0)&&(width=.1,height=.1),{x:x4,y:y4,width,height,title,content,bg_color:nice_color_palettes2[stringHash3(lo3.type||title)%nice_color_palettes2.length]?.[4]??"#f00"})},isTruthy2=value=>!!value,findBoundsAndCenter2=elements=>{let debugObjects=elements.filter(elm=>elm.type.startsWith("pcb_")||elm.type.startsWith("schematic_")).concat(elements.filter(elm=>elm.type==="pcb_trace"||elm.type==="schematic_trace").flatMap(elm=>elm.route)).map(elm=>getDebugLayoutObject2(elm)).filter(isTruthy2);if(debugObjects.length===0)return{center:{x:0,y:0},width:0,height:0};let minX=debugObjects[0].x-debugObjects[0].width/2,maxX=debugObjects[0].x+debugObjects[0].width/2,minY=debugObjects[0].y-debugObjects[0].height/2,maxY=debugObjects[0].y+debugObjects[0].height/2;for(let obj of debugObjects.slice(1))minX=Math.min(minX,obj.x-obj.width/2),maxX=Math.max(maxX,obj.x+obj.width/2),minY=Math.min(minY,obj.y-obj.height/2),maxY=Math.max(maxY,obj.y+obj.height/2);let width=maxX-minX,height=maxY-minY;return{center:{x:minX+width/2,y:minY+height/2},width,height}},unitToMm3={in:25.4,inch:25.4,mil:.0254,mm:1,m:1e3,cm:10,ft:304.8,feet:304.8},mmNumberFormatter2=new Intl.NumberFormat("en-US",{useGrouping:!1,notation:"standard",maximumFractionDigits:12}),mm5=n4=>{let unit=typeof n4=="number"?"mm":n4.replace(/^[^a-zA-Z]+/g,"").toLowerCase();unit||(unit="mm");let val=typeof n4=="number"?n4:Number.parseFloat(n4.split(unit)[0]);if(unit in unitToMm3)return val*unitToMm3[unit];throw new Error(`Unsupported unit: ${unit}`)},mil2mm2=mil=>typeof mil=="number"?mm5(`${mil}mil`):mil.match(/^\d+$/)?mm5(`${mil}mil`):mm5(mil);function generateArcFromSweep(startX,startY,endX,endY,radius,largeArcFlag,sweepFlag){let start={x:startX,y:startY},end={x:endX,y:endY},midX=(startX+endX)/2,midY=(startY+endY)/2,dx3=endX-startX,dy3=endY-startY,distance32=Math.sqrt(dx3*dx3+dy3*dy3);if(distance32===0||radius<distance32/2)return[start,end];let h6=Math.sqrt(radius*radius-distance32*distance32/4),angle=Math.atan2(dy3,dx3),centerX=midX+h6*Math.sin(angle)*(sweepFlag?-1:1),centerY=midY-h6*Math.cos(angle)*(sweepFlag?-1:1),startAngle=Math.atan2(startY-centerY,startX-centerX),endAngle=Math.atan2(endY-centerY,endX-centerX);sweepFlag&&endAngle>startAngle?endAngle-=2*Math.PI:!sweepFlag&&endAngle<startAngle&&(endAngle+=2*Math.PI),(!largeArcFlag&&Math.abs(endAngle-startAngle)>Math.PI||largeArcFlag&&Math.abs(endAngle-startAngle)<Math.PI)&&(endAngle>startAngle?endAngle-=2*Math.PI:endAngle+=2*Math.PI);let numPoints=Math.max(2,Math.ceil(Math.abs(endAngle-startAngle)*radius)),path=[];for(let i3=0;i3<=numPoints;i3++){let t52=i3/numPoints,angle2=startAngle+t52*(endAngle-startAngle),x4=centerX+radius*Math.cos(angle2),y4=centerY+radius*Math.sin(angle2);path.push({x:x4,y:y4})}return path}var mil10ToMm=value=>value*10*.0254,getBoundsCenter2=bounds=>({x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2}),getBoundsFromPoints2=points=>{if(points.length===0)return null;let minX=points[0].x,minY=points[0].y,maxX=points[0].x,maxY=points[0].y;for(let i3=1;i3<points.length;i3++){let point23=points[i3];point23.x<minX&&(minX=point23.x),point23.y<minY&&(minY=point23.y),point23.x>maxX&&(maxX=point23.x),point23.y>maxY&&(maxY=point23.y)}return{minX,minY,maxX,maxY}},getCadSvgNode=easyEdaJson=>{let svgNode=easyEdaJson.packageDetail.dataStr.shape.find(shape=>shape.type==="SVGNODE"&&shape.svgData.attrs?.uuid);return svgNode?.type==="SVGNODE"?svgNode:null},isSvgChildNodeWithAttrs=childNode=>typeof childNode=="object"&&childNode!==null,getXyBoundsFromModelBounds=bounds=>({minX:bounds.min.x,minY:bounds.min.y,maxX:bounds.max.x,maxY:bounds.max.y}),rotateScenePoint=(point23,rotationDeg)=>{switch(rotationDeg){case 0:return point23;case 90:return{x:point23.y,y:-point23.x};case 180:return{x:-point23.x,y:-point23.y};case 270:return{x:-point23.y,y:point23.x}}},getEasyEdaModelOriginOnBoardMm=({svgNode,footprintCenterMm})=>{let points=[];for(let childNode of svgNode.svgData.childNodes??[]){if(!isSvgChildNodeWithAttrs(childNode))continue;let rawPoints=childNode.attrs?.points;if(!rawPoints)continue;let values=String(rawPoints).trim().split(/\s+/).map(Number);for(let i3=0;i3+1<values.length;i3+=2){let x4=values[i3],y4=values[i3+1];Number.isFinite(x4)&&Number.isFinite(y4)&&points.push({x:mil10ToMm(x4),y:mil10ToMm(y4)})}}let modelOriginMm=null;if(points.length>0){let bounds=getBoundsFromPoints2(points);modelOriginMm=bounds?getBoundsCenter2(bounds):null}else{let[originX,originY]=String(svgNode.svgData.attrs?.c_origin??"0,0").split(",").map(value=>Number(value.trim()));Number.isFinite(originX)&&Number.isFinite(originY)&&(modelOriginMm={x:mil10ToMm(originX),y:mil10ToMm(originY)})}return modelOriginMm?{x:modelOriginMm.x-footprintCenterMm.x,y:footprintCenterMm.y-modelOriginMm.y}:null},snapZero=value=>Math.abs(value)<1e-6?0:value,normalizePoint=point23=>({x:snapZero(point23.x),y:snapZero(point23.y)}),getCadModelOffsetMmFromBounds=(easyEdaJson,bounds,{footprintBoundsCenterMm}={})=>{let svgNode=getCadSvgNode(easyEdaJson);if(!svgNode||!bounds)return null;let[,,rotationZRaw]=String(svgNode.svgData.attrs?.c_rotation??"0,0,0").split(",").map(value=>Number(value.trim())),rotationDeg=(rotationZRaw%360+360)%360;if(![0,90,180,270].includes(rotationDeg))return null;let modelCenter=getBoundsCenter2(getXyBoundsFromModelBounds(bounds)),footprintCenter=easyEdaJson.packageDetail.dataStr.head,footprintCenterMm=footprintBoundsCenterMm??{x:mil10ToMm(footprintCenter.x),y:mil10ToMm(footprintCenter.y)},targetOriginOnBoardMm=getEasyEdaModelOriginOnBoardMm({svgNode,footprintCenterMm});if(!targetOriginOnBoardMm)return null;let targetOriginInModelFrame=rotateScenePoint(targetOriginOnBoardMm,rotationDeg);return normalizePoint({x:modelCenter.x-targetOriginInModelFrame.x,y:modelCenter.y-targetOriginInModelFrame.y})},normalizePinLabels2=inputPinLabels=>{let uniqueInputPinLabels=inputPinLabels.map(labels=>[...new Set(labels)]),result=uniqueInputPinLabels.map(()=>[]),desiredNumbers=uniqueInputPinLabels.map(()=>null);for(let i3=0;i3<uniqueInputPinLabels.length;i3++)for(let label of uniqueInputPinLabels[i3])if(/^\d+$/.test(label)){desiredNumbers[i3]=Number.parseInt(label);break}let highestPinNumber=0,acceptedDesiredNumbers=new Set;for(let i3=0;i3<desiredNumbers.length;i3++){let desiredNumber=desiredNumbers[i3];if(desiredNumber===null||desiredNumber<1)continue;if(!acceptedDesiredNumbers.has(desiredNumber)){acceptedDesiredNumbers.add(desiredNumber),result[i3].push(`pin${desiredNumber}`),highestPinNumber=Math.max(highestPinNumber,desiredNumber);continue}let existingAltCount=0;for(let label of result[i3])label.startsWith(`pin${desiredNumber}_alt`)&&(existingAltCount+=1);result[i3].push(`pin${desiredNumber}_alt${existingAltCount+1}`)}for(let i3=0;i3<result.length;i3++)result[i3][0]?.includes("_alt")&&(highestPinNumber+=1,result[i3].unshift(`pin${highestPinNumber}`));for(let i3=0;i3<result.length;i3++)result[i3].length===0&&(highestPinNumber+=1,result[i3].push(`pin${highestPinNumber}`));let totalLabelCounts={};for(let inputLabels of uniqueInputPinLabels)for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]=(totalLabelCounts[label]??0)+1);let incrementalLabelCounts={};for(let i3=0;i3<uniqueInputPinLabels.length;i3++)for(let label of uniqueInputPinLabels[i3])/^\d+$/.test(label)||(totalLabelCounts[label]===1?result[i3].push(label):(incrementalLabelCounts[label]=(incrementalLabelCounts[label]??0)+1,result[i3].push(`${label}${incrementalLabelCounts[label]}`)));return result},normalizeSymbolName=name=>{let trimmedName=name.trim();return trimmedName==="+"?"_POS":trimmedName==="-"?"_NEG":trimmedName},DEFAULT_PCB_THICKNESS_MM=1.6,EASYEDA_STEP_MODEL_URL="https://modules.easyeda.com/qAxj6KHrDKw4blvCG8QJPs7Y",EASYEDA_OBJ_MODEL_URL="https://modules.easyeda.com/3dmodel",TSCIRCUIT_MODEL_CDN_URL="https://modelcdn.tscircuit.com/easyeda_models",milx10=mil10=>typeof mil10=="number"||mil10.match(/^\d+$/)?mil2mm2(mil10)*10:mil2mm2(mil10),parseCadOffsetsFromSvgNode=svgNode=>{let attrs=svgNode?.svgData?.attrs??{},[cx3,cy3]=String(attrs.c_origin??"0,0").split(",").map(s3=>Number(s3.trim())),zStr=attrs.z??0,z_mm=typeof zStr=="string"&&/[a-z]/i.test(zStr)?mm5(zStr):mm5(`${Number(zStr)||0}mil`);return{position:{x:mil10ToMm(Number.isNaN(cx3)?0:cx3),y:mil10ToMm(Number.isNaN(cy3)?0:cy3),z:z_mm},rotation:(()=>{let[rx3,ry3,rz2]=(attrs.c_rotation??"0,0,0").split(",").map(Number);return{x:rx3||0,y:ry3||0,z:rz2||0}})()}},readModelHeightMm=raw=>{if(raw==null)return 3.5;let n4=Number(raw);if(!Number.isFinite(n4))return 3.5;let mmFromMil10=mil10ToMm(n4),mmFromMil=mm5(`${n4}mil`),upper=12,lower=.1,chosen=Math.max(mmFromMil10,mmFromMil);return(chosen>upper||chosen<lower)&&(chosen=3.5),chosen},handleSilkscreenPath=(track,index)=>pcb_silkscreen_path2.parse({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${index+1}`,pcb_component_id:"pcb_component_1",layer:"top",route:track.points.map(point23=>({x:milx10(point23.x),y:milx10(point23.y)})),stroke_width:mil10ToMm(track.width)}),isCourtyardLayer=layer=>layer===13||layer===14||layer===15,handleSilkscreenArc=(arc2,index)=>{let arcPath=generateArcFromSweep(arc2.start.x,arc2.start.y,arc2.end.x,arc2.end.y,arc2.radiusX,arc2.largeArc,arc2.sweepDirection==="CW");return pcb_silkscreen_path2.parse({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_arc_${index+1}`,pcb_component_id:"pcb_component_1",layer:"top",route:arcPath.map(p4=>({x:milx10(p4.x),y:milx10(p4.y)})),stroke_width:mil10ToMm(arc2.width)})},handleHole=(hole,index)=>pcb_hole2.parse({type:"pcb_hole",x:milx10(hole.center.x),y:milx10(hole.center.y),hole_diameter:milx10(hole.radius)*2,hole_shape:"circle",pcb_hole_id:`pcb_hole_${index+1}`}),handleHoleCutout=(hole,index)=>pcb_cutout2.parse({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_from_hole_${index+1}`,shape:"circle",center:{x:milx10(hole.center.x),y:milx10(hole.center.y)},radius:milx10(hole.radius)}),handleVia=(via,index)=>pcb_via2.parse({type:"pcb_via",pcb_via_id:`pcb_via_${index+1}`,x:milx10(via.center.x),y:milx10(via.center.y),outer_diameter:milx10(via.outerDiameter),hole_diameter:milx10(via.holeDiameter),layers:["top","bottom"]}),handleCutout=(solidRegion,index)=>pcb_cutout2.parse({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_${index+1}`,shape:"polygon",points:solidRegion.points.map(p4=>({x:milx10(p4.x),y:milx10(p4.y)}))}),LEAD_SHAPE_LAYER=100,isPcbSolidRegionCutout=shape=>shape.fillStyle==="cutout"&&shape.layermask!==LEAD_SHAPE_LAYER,getCadPositionZMmFromMetadata=easyEdaJson=>{let svgNode=easyEdaJson.packageDetail.dataStr.shape.find(shape=>shape.type==="SVGNODE"&&shape.svgData.attrs?.uuid);if(!svgNode||svgNode.type!=="SVGNODE")return;let svgNodeZ=Number(svgNode.svgData.attrs?.z??0);if(!Number.isFinite(svgNodeZ))return;let bounds=easyEdaJson._objMetadata?.bounds;return bounds?(Math.abs(bounds.min.z)<1e-6?0:bounds.min.z)-mil10ToMm(svgNodeZ):void 0},convertEasyEdaJsonToCircuitJson=(easyEdaJson,{useModelCdn,shouldRecenter=!0,cadPositionXMm,cadPositionYMm,cadPositionZMm,cadModelBounds,showDesignator=!1}={})=>{let resolvedCadPositionZMm=cadPositionZMm??getCadPositionZMmFromMetadata(easyEdaJson),circuitElements=[],source_component=any_source_component2.parse({type:"source_component",source_component_id:"source_component_1",name:"U1",ftype:"simple_chip"}),pcb_component22=pcb_component2.parse({type:"pcb_component",pcb_component_id:"pcb_component_1",source_component_id:"source_component_1",name:"U1",ftype:"simple_chip",width:0,height:0,rotation:0,center:{x:0,y:0},layer:"top"});circuitElements.push(source_component,pcb_component22);let pads=easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="PAD"),pins=easyEdaJson.dataStr.shape.filter(shape=>shape.type==="PIN"),pinLabelSets=pads.map(pad2=>{let labels=[];pad2.number&&labels.push(pad2.number.toString());let pin=pins.find(p4=>p4.pinNumber===pad2.number);return pin&&labels.push(normalizeSymbolName(pin.label)),labels}),normalizedPinLabels=normalizePinLabels2(pinLabelSets);pads.forEach((pad2,index)=>{let portHints2=normalizedPinLabels[index],pinNumber=Number.parseInt(portHints2.find(hint=>hint.match(/pin\d+/)).replace("pin",""));if(circuitElements.push({type:"source_port",source_port_id:`source_port_${index+1}`,source_component_id:"source_component_1",name:`pin${pinNumber}`,pin_number:pinNumber,port_hints:portHints2.filter(hint=>hint!==`pin${pinNumber}`)}),pad2.holeRadius!==void 0&&mil2mm2(pad2.holeRadius)!==0){let commonPlatedHoleProps={type:"pcb_plated_hole",pcb_plated_hole_id:pad2.shape==="RECT"&&pad2.rotation!==void 0?`pcb_plated_hole_${index+1}_rot${pad2.rotation}`:`pcb_plated_hole_${index+1}`,x:mil2mm2(pad2.center.x),y:mil2mm2(pad2.center.y),layers:["top"],port_hints:[`pin${pinNumber}`],pcb_component_id:"pcb_component_1",pcb_port_id:`pcb_port_${index+1}`},additionalPlatedHoleProps;if(pad2.shape==="OVAL"){let largestOuterDimensionName=mil2mm2(pad2.width)>mil2mm2(pad2.height)?"width":"height",smallestOuterDimension=Math.min(mil2mm2(pad2.width),mil2mm2(pad2.height)),largestOuterDimension=Math.max(mil2mm2(pad2.width),mil2mm2(pad2.height)),distanceFromOuterPlatingToHole=smallestOuterDimension/2-mil2mm2(pad2.holeRadius),largestInnerDimension=largestOuterDimension-distanceFromOuterPlatingToHole*2,smallestInnerDimension=mil2mm2(pad2.holeRadius)*2;additionalPlatedHoleProps={shape:"pill",hole_width:largestOuterDimensionName==="width"?largestInnerDimension:smallestInnerDimension,hole_height:largestOuterDimensionName==="height"?largestInnerDimension:smallestInnerDimension,outer_width:mil2mm2(pad2.width),outer_height:mil2mm2(pad2.height),ccw_rotation:pad2.rotation||0}}else if(pad2.shape==="RECT"){let padWidth=mil2mm2(pad2.width),padHeight=mil2mm2(pad2.height),holeDiameter=mil2mm2(pad2.holeRadius)*2;if(Math.max(padWidth,padHeight)/Math.min(padWidth,padHeight)>1.5){let baseWidth=holeDiameter,pillHeight=baseWidth*2.6,holeWidth=padWidth>padHeight?pillHeight:baseWidth,holeHeight=padHeight>padWidth?pillHeight:baseWidth;additionalPlatedHoleProps={shape:"rotated_pill_hole_with_rect_pad",hole_shape:"rotated_pill",pad_shape:"rect",hole_width:holeWidth,hole_height:holeHeight,hole_ccw_rotation:pad2.rotation||0,rect_ccw_rotation:pad2.rotation||0,rect_pad_width:padWidth,rect_pad_height:padHeight}}else additionalPlatedHoleProps={shape:"circle",hole_diameter:holeDiameter,outer_diameter:Math.max(padWidth,padHeight),radius:holeDiameter/2}}else additionalPlatedHoleProps={shape:"circle",hole_diameter:mil2mm2(pad2.holeRadius)*2,outer_diameter:mil2mm2(pad2.width),radius:mil2mm2(pad2.holeRadius)};circuitElements.push(pcb_plated_hole2.parse({...commonPlatedHoleProps,...additionalPlatedHoleProps}))}else{let soupShape;if(pad2.shape==="RECT"||pad2.shape==="ELLIPSE"?soupShape="rect":pad2.shape==="OVAL"?soupShape="pill":pad2.shape==="POLYGON"&&(soupShape="polygon"),!soupShape)throw new Error(`unknown pad.shape: "${pad2.shape}"`);let rectSize={width:mil2mm2(pad2.width),height:mil2mm2(pad2.height)};(pad2.rotation===90||pad2.rotation===270)&&(rectSize.width=mil2mm2(pad2.height),rectSize.height=mil2mm2(pad2.width));let parsedPcbSmtpad=pcb_smtpad2.parse({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${index+1}`,shape:soupShape,...soupShape!=="polygon"&&{x:mil2mm2(pad2.center.x),y:mil2mm2(pad2.center.y)},...soupShape==="rect"?rectSize:soupShape==="pill"?{...rectSize,radius:Math.min(rectSize.width,rectSize.height)/2}:soupShape==="polygon"&&pad2.points?{points:pad2.points.map(p4=>({x:milx10(p4.x),y:milx10(p4.y)}))}:{radius:Math.min(mil2mm2(pad2.width),mil2mm2(pad2.height))/2},layer:"top",port_hints:[`pin${pinNumber}`],pcb_component_id:"pcb_component_1",pcb_port_id:`pcb_port_${index+1}`});circuitElements.push(parsedPcbSmtpad)}}),easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="HOLE").forEach((h6,index)=>{circuitElements.push(handleHole(h6,index)),circuitElements.push(handleHoleCutout(h6,index))}),easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="VIA").forEach((v4,index)=>{circuitElements.push(handleVia(v4,index))}),easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="SOLIDREGION"&&isPcbSolidRegionCutout(shape)).forEach((sr3,index)=>{circuitElements.push(handleCutout(sr3,index))});let hasFoundDesignator=!1;if(easyEdaJson.packageDetail.dataStr.shape.forEach((shape,index)=>{if(shape.type==="TRACK")isCourtyardLayer(shape.layer)||circuitElements.push(handleSilkscreenPath(shape,index));else if(shape.type==="ARC")isCourtyardLayer(shape.layer)||circuitElements.push(handleSilkscreenArc(shape,index));else if(shape.type==="TEXT"){if(isCourtyardLayer(shape.layer))return;let text=shape.text,designatorPrefix=easyEdaJson.dataStr.head.c_para.pre||"U",normalizedPrefix=designatorPrefix.replace(/\?/g,""),trimmedText=text.trim();if(trimmedText===designatorPrefix||trimmedText===`${normalizedPrefix}?`||trimmedText===normalizedPrefix){if(!showDesignator)return;text="{NAME}",hasFoundDesignator=!0}circuitElements.push(pcb_silkscreen_text2.parse({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pcb_silkscreen_text_${index+1}`,pcb_component_id:"pcb_component_1",text,anchor_position:{x:mil2mm2(shape.x),y:mil2mm2(shape.y)},anchor_alignment:{L:"bottom_left",C:"center",R:"bottom_right"}[shape.textAnchor??"L"],font_size:shape.size_mm||1,layer:"top"}))}}),!hasFoundDesignator&&showDesignator){let bbox=easyEdaJson.packageDetail.dataStr.BBox;circuitElements.push(pcb_silkscreen_text2.parse({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:"pcb_silkscreen_text_designator_fallback",pcb_component_id:"pcb_component_1",text:"{NAME}",anchor_position:{x:milx10(bbox.x+bbox.width/2),y:milx10(bbox.y)-1},anchor_alignment:"center",font_size:1,layer:"top"}))}let pcbElements=circuitElements.filter(e5=>e5.type==="pcb_smtpad"||e5.type==="pcb_plated_hole"||e5.type==="pcb_hole"||e5.type==="pcb_via"||e5.type==="pcb_courtyard_outline"||e5.type==="pcb_silkscreen_path"||e5.type==="pcb_silkscreen_text");if(pcbElements.length>0){let bounds=findBoundsAndCenter2(pcbElements);pcb_component22.width=bounds.width,pcb_component22.height=bounds.height}let svgNode=easyEdaJson.packageDetail.dataStr.shape.find(a3=>!!(a3.type==="SVGNODE"&&a3.svgData.attrs?.uuid)),modelUuid=svgNode?.svgData?.attrs?.uuid,objFileUrl=modelUuid?useModelCdn?`${TSCIRCUIT_MODEL_CDN_URL}/assets/${easyEdaJson.lcsc.number}.obj?uuid=${modelUuid}`:`${EASYEDA_OBJ_MODEL_URL}/${modelUuid}`:void 0,stepFileUrl=modelUuid?useModelCdn?`${TSCIRCUIT_MODEL_CDN_URL}/assets/${easyEdaJson.lcsc.number}.step?uuid=${modelUuid}`:`${EASYEDA_STEP_MODEL_URL}/${modelUuid}`:void 0;if(objFileUrl!==void 0||stepFileUrl!==void 0){let{position:position22,rotation:rotation22}=parseCadOffsetsFromSvgNode(svgNode);circuitElements.push(cad_component2.parse({type:"cad_component",cad_component_id:"cad_component_1",source_component_id:"source_component_1",pcb_component_id:"pcb_component_1",anchor_alignment:"center_of_component_on_board_surface",model_origin_alignment:"center_of_component_on_board_surface",model_origin_position:{x:cadPositionXMm??0,y:cadPositionYMm??0,z:resolvedCadPositionZMm??position22.z},position:{x:0,y:0,z:0},rotation:rotation22,model_obj_url:objFileUrl,model_step_url:stepFileUrl}))}if(!circuitElements.some(e5=>e5.type==="pcb_courtyard_outline")){let bbox=easyEdaJson.packageDetail.dataStr.BBox;if(bbox){let x12=milx10(bbox.x)-.25,y12=milx10(bbox.y)-.25,x22=milx10(bbox.x+bbox.width)+.25,y22=milx10(bbox.y+bbox.height)+.25;circuitElements.push(pcb_courtyard_outline2.parse({type:"pcb_courtyard_outline",pcb_courtyard_outline_id:`pcb_courtyard_outline_${easyEdaJson.lcsc.number}_1`,pcb_component_id:"pcb_component_1",layer:"top",outline:[{x:x12,y:y12},{x:x22,y:y12},{x:x22,y:y22},{x:x12,y:y22},{x:x12,y:y12}],stroke_width:.05}))}}if(shouldRecenter){let elementsForBounds=circuitElements.filter(e5=>e5.type!=="pcb_component"&&e5.type!=="cad_component"),bounds=findBoundsAndCenter2(elementsForBounds);if(Number.isFinite(bounds.center.x)&&Number.isFinite(bounds.center.y)){let matrix2=compose4(translate4(-bounds.center.x,bounds.center.y),scale4(1,-1)),elementsForTransform=circuitElements.filter(e5=>!(e5.type==="pcb_smtpad"&&e5.shape==="polygon")&&e5.type!=="cad_component");transformPCBElements2(elementsForTransform,matrix2);for(let e5 of circuitElements)if(e5.type==="pcb_cutout"){if(e5.shape==="polygon")e5.points=e5.points.map(p4=>applyToPoint4(matrix2,p4));else if(e5.shape==="circle"||e5.shape==="rect")e5.center=applyToPoint4(matrix2,e5.center);else if("route"in e5){let cutoutPath=e5;cutoutPath.route=cutoutPath.route.map(p4=>applyToPoint4(matrix2,p4))}}else e5.type==="pcb_smtpad"&&e5.shape==="polygon"&&(e5.points=e5.points.map(p4=>applyToPoint4(matrix2,p4)));let cad=circuitElements.find(e5=>e5.type==="cad_component");if(cad){cad.rotation||(cad.rotation={x:0,y:0,z:0}),cad.model_origin_position||(cad.model_origin_position={x:0,y:0,z:0});let resolvedCadModelBounds=cadModelBounds??easyEdaJson._objMetadata?.bounds,recenteredCadOffset=resolvedCadModelBounds&&getCadModelOffsetMmFromBounds(easyEdaJson,resolvedCadModelBounds,{footprintBoundsCenterMm:bounds.center});recenteredCadOffset&&(cad.model_origin_position.x=recenteredCadOffset.x,cad.model_origin_position.y=recenteredCadOffset.y);let side=pcb_component22.layer??"top",t52=DEFAULT_PCB_THICKNESS_MM/2,attrs=svgNode?.svgData?.attrs??{},modelHeight=readModelHeightMm(attrs.c_height);cad.size||(cad.size={x:pcb_component22.width,y:pcb_component22.height,z:modelHeight});let ROTATE_X_FOR_YUP=90,originalZRotation=(cad.rotation.z??0)%360;Math.abs(originalZRotation-0)<1||Math.abs(originalZRotation-360)<1||Math.abs(originalZRotation-180)<1||Math.abs(originalZRotation-90)<1?cad.rotation.x=((cad.rotation.x??0)+0+360)%360:Math.abs(originalZRotation-270)<1?(cad.rotation.x=((cad.rotation.x??0)+0+360)%360,cad.rotation.y=((cad.rotation.y??0)+0+360)%360):(console.warn(`[3D] Unusual rotation angle: ${originalZRotation}\xB0 for component ${easyEdaJson.lcsc.number}`),cad.rotation.x=((cad.rotation.x??0)+ROTATE_X_FOR_YUP+360)%360),side!=="top"&&(cad.rotation.x=((cad.rotation.x??0)+180)%360);let USE_Z_OFFSET_FOR_180=Math.abs(originalZRotation-180)<1,zOffRaw=cad.model_origin_position.z??cad.position.z??0,zOff=USE_Z_OFFSET_FOR_180?-zOffRaw:0,rx3=(cad.rotation.x%360+360)%360,thicknessAlongWorldZ,is180RotatedYUp=(Math.abs(originalZRotation-180)<1||Math.abs(originalZRotation-0)<1||Math.abs(originalZRotation-360)<1)&&Math.abs(rx3)<1;if(is180RotatedYUp||rx3%180===90?thicknessAlongWorldZ=cad.size.y:thicknessAlongWorldZ=cad.size.z,Number.isFinite(resolvedCadPositionZMm))cad.model_origin_position.z=side==="top"?resolvedCadPositionZMm:-resolvedCadPositionZMm;else{let centerZ;is180RotatedYUp?centerZ=side==="top"?t52-thicknessAlongWorldZ/2:-t52+thicknessAlongWorldZ/2:centerZ=side==="top"?t52+zOff+thicknessAlongWorldZ/2:-t52-zOff-thicknessAlongWorldZ/2,cad.model_origin_position.z=centerZ}}}pcb_component22.center={x:0,y:0}}return circuitElements},safeNumber=(defaultValue=0)=>external_exports2.union([external_exports2.number(),external_exports2.string()]).transform(val=>{let num=Number(val);return isNaN(num)?defaultValue:num}).default(defaultValue),tenthmil=external_exports2.union([external_exports2.number(),external_exports2.string()]).optional().transform(n4=>typeof n4=="string"&&n4.endsWith("mil")?n4:`${Number.parseFloat(n4)*10}mil`).pipe(external_exports2.string()),PointSchema=external_exports2.any().transform(p4=>{if(Array.isArray(p4)){let[x4,y4]=p4;return{x:x4,y:y4}}if(typeof p4=="object")return p4;throw new Error(`Invalid point: ${p4}`)}).pipe(external_exports2.object({x:external_exports2.number(),y:external_exports2.number()})),BaseShapeSchema=external_exports2.object({type:external_exports2.string(),id:external_exports2.string().optional(),layer:external_exports2.coerce.number().optional()}),TrackSchema=BaseShapeSchema.extend({type:external_exports2.literal("TRACK"),width:external_exports2.coerce.number(),points:external_exports2.array(PointSchema)}),PadSchema=BaseShapeSchema.extend({type:external_exports2.literal("PAD"),shape:external_exports2.enum(["RECT","ELLIPSE","OVAL","POLYGON"]),center:external_exports2.object({x:tenthmil,y:tenthmil}),width:tenthmil,height:tenthmil,layermask:external_exports2.number(),net:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),number:external_exports2.union([external_exports2.string(),external_exports2.number()]),holeRadius:tenthmil,points:external_exports2.array(PointSchema).optional(),rotation:safeNumber(0),plated:external_exports2.boolean()}),ArcSchema=BaseShapeSchema.extend({type:external_exports2.literal("ARC"),width:external_exports2.number(),start:PointSchema,end:PointSchema,radiusX:external_exports2.number(),radiusY:external_exports2.number(),largeArc:external_exports2.boolean(),sweepDirection:external_exports2.enum(["CW","CCW"])}),CircleSchema=BaseShapeSchema.extend({type:external_exports2.literal("CIRCLE"),center:PointSchema,radius:external_exports2.number(),width:external_exports2.number()}),SolidRegionSchema=BaseShapeSchema.extend({type:external_exports2.literal("SOLIDREGION"),layermask:external_exports2.number(),points:external_exports2.array(PointSchema),fillStyle:external_exports2.string()}),SVGNodeSchema=BaseShapeSchema.extend({type:external_exports2.literal("SVGNODE"),svgData:external_exports2.object({gId:external_exports2.string(),nodeName:external_exports2.string(),nodeType:external_exports2.number(),layerid:external_exports2.string(),attrs:external_exports2.record(external_exports2.string(),external_exports2.string()),childNodes:external_exports2.array(external_exports2.unknown())})}),HoleSchema=BaseShapeSchema.extend({type:external_exports2.literal("HOLE"),center:PointSchema,radius:external_exports2.number()}),ViaSchema=BaseShapeSchema.extend({type:external_exports2.literal("VIA"),center:PointSchema,outerDiameter:external_exports2.number(),holeDiameter:external_exports2.number()}),RectSchema=BaseShapeSchema.extend({type:external_exports2.literal("RECT"),x:tenthmil,y:tenthmil,width:tenthmil,height:tenthmil,lineWidth:external_exports2.number(),fillStyle:external_exports2.string(),rotation:external_exports2.number().optional()}),TextSchema=BaseShapeSchema.extend({type:external_exports2.literal("TEXT"),text:external_exports2.string(),x:tenthmil,y:tenthmil,size_mm:external_exports2.number(),rotation:external_exports2.number().optional(),layer:external_exports2.number().optional(),textAnchor:external_exports2.enum(["L","C","R",""]).optional().transform(val=>val===""?void 0:val),font:external_exports2.string().optional()}),PackageDetailShapeSchema=external_exports2.discriminatedUnion("type",[TrackSchema,PadSchema,ArcSchema,CircleSchema,SolidRegionSchema,SVGNodeSchema,HoleSchema,ViaSchema,RectSchema,TextSchema]),pairs3=arr=>{let pairs22=[];for(let i3=0;i3<arr.length;i3+=2)pairs22.push([arr[i3],arr[i3+1]]);return pairs22},parsePoints=pointsStr=>pairs3(pointsStr.trim().split(" ").map(n4=>Number(n4))),ShapeItemSchema=external_exports2.object({type:external_exports2.string(),data:external_exports2.string()}).transform(shape=>{switch(shape.type){case"TRACK":{let[width,layer,_4,pointsStr,id2,_n3]=shape.data.split("~"),points=parsePoints(pointsStr);return TrackSchema.parse({type:"TRACK",width,layer,points,id:id2})}case"PAD":{let[padShape,...params]=shape.data.split("~"),[centerX,centerY,width,height,layermask,net,number,holeRadius,...rest]=params.map(p4=>Number.isNaN(Number(p4))?p4:Number(p4)),center2={x:centerX,y:centerY},points;(padShape==="RECT"||padShape==="POLYGON")&&(points=parsePoints(rest[0]));let r5=Number(rest[1]),rotation22=Number.isNaN(r5)?void 0:r5,padInputParams={type:"PAD",shape:padShape,center:center2,width,height,layermask,net,number,holeRadius,points,rotation:rotation22,plated:rest.includes("Y")};return PadSchema.parse(padInputParams)}case"ARC":{let[width,layer,,arcData]=shape.data.split("~"),match2=arcData.match(/M\s*([\d.-]+)(?:\s*,\s*|\s+)([\d.-]+)\s*A\s*([\d.-]+)(?:\s*,\s*|\s+)([\d.-]+)\s*([\d.-]+)\s*([\d.-]+)\s*([\d.-]+)\s*([\d.-]+)(?:\s*,\s*|\s+)([\d.-]+)/);if(!match2)throw new Error(`Invalid arc data: ${arcData}`);let[,startX,startY,radiusX,radiusY,xAxisRotation,largeArcFlag,sweepFlag,endX,endY]=match2,start=[Number(startX),Number(startY)],end=[Number(endX),Number(endY)];return ArcSchema.parse({type:"ARC",width:Number(width),layer:Number(layer),start,end,radiusX:Number(radiusX),radiusY:Number(radiusY),largeArc:largeArcFlag==="1",sweepDirection:sweepFlag==="1"?"CW":"CCW"})}case"CIRCLE":{let[centerX,centerY,radius,width,layer,id2]=shape.data.split("~"),center2=[Number(centerX),Number(centerY)];return CircleSchema.parse({type:"CIRCLE",center:center2,radius:Number(radius),width:Number(width),layer:Number(layer),id:id2})}case"HOLE":{let[centerX,centerY,radius,id2]=shape.data.split("~"),center2=[Number(centerX),Number(centerY)];return HoleSchema.parse({type:"HOLE",center:center2,radius:Number(radius),id:id2})}case"VIA":{let[x4,y4,outerDiameter,,holeDiameter,id2]=shape.data.split("~"),center2=[Number(x4),Number(y4)];return ViaSchema.parse({type:"VIA",center:center2,outerDiameter:Number(outerDiameter),holeDiameter:Number(holeDiameter),id:id2})}case"SOLIDREGION":{let[layermask,,pathData,fillStyle,id2]=shape.data.split("~"),points=pathData.match(/[ML] ?(-?[\d.]+)[ ,](-?[\d.]+)/g)?.map(point23=>{let[,x4,y4]=point23.match(/[ML]? ?(-?[\d.]+)[ ,](-?[\d.]+)/)||[];return[Number(x4),Number(y4)]})||[];return SolidRegionSchema.parse({type:"SOLIDREGION",layermask:Number(layermask),points,fillStyle,id:id2})}case"SVGNODE":{let svgData=JSON.parse(shape.data);return SVGNodeSchema.parse({type:"SVGNODE",svgData})}case"RECT":{let[x4,y4,width,height,lineWidth,id2,rotation22,layer,fillStyle]=shape.data.split("~"),r5=rotation22?Number(rotation22):void 0;return RectSchema.parse({type:"RECT",x:x4,y:y4,width,height,lineWidth:Number(lineWidth),id:id2,rotation:Number.isNaN(r5)?void 0:r5,layer:layer?Number(layer):void 0,fillStyle:fillStyle||void 0})}case"TEXT":{let[textAnchor,x4,y4,size22,layer,id2,rotation22,,font,text]=shape.data.split("~"),r5=rotation22?Number(rotation22):void 0;return TextSchema.parse({type:"TEXT",text,x:x4,y:y4,size_mm:Number(size22)*2.54,layer:layer?Number(layer):void 0,id:id2,rotation:Number.isNaN(r5)?void 0:r5,textAnchor,font:font||void 0})}default:throw new Error(`Unknown shape type: ${shape.type}`)}}).pipe(PackageDetailShapeSchema),ShapesArraySchema=external_exports2.array(ShapeItemSchema),PointSchema2=external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}),RectangleShapeOutputSchema=external_exports2.object({type:external_exports2.literal("RECTANGLE"),position:PointSchema2,width:external_exports2.number(),height:external_exports2.number(),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parseRectangle=str=>{let[,x4,y4,,,width,height,color,lineWidth,,,id2]=str.split("~");return{type:"RECTANGLE",position:{x:Number(x4),y:Number(y4)},width:Number(width),height:Number(height),color,lineWidth:Number(lineWidth),id:id2}},RectangleShapeSchema=external_exports2.string().startsWith("R~").transform(parseRectangle).pipe(RectangleShapeOutputSchema),EllipseShapeOutputSchema=external_exports2.object({type:external_exports2.literal("ELLIPSE"),center:PointSchema2,radiusX:external_exports2.number(),radiusY:external_exports2.number(),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parseEllipse=str=>{let[,x4,y4,radiusX,radiusY,color,lineWidth,,,id2]=str.split("~");return{type:"ELLIPSE",center:{x:Number(x4),y:Number(y4)},radiusX:Number(radiusX),radiusY:Number(radiusY),color,lineWidth:Number(lineWidth),id:id2}},EllipseShapeSchema=external_exports2.string().startsWith("E~").transform(parseEllipse).pipe(EllipseShapeOutputSchema),ArcShapeOutputSchema=external_exports2.object({type:external_exports2.literal("ARC"),start:PointSchema2,end:PointSchema2,radius:external_exports2.number(),sweepFlag:external_exports2.boolean(),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parseArc=str=>{let[,pathData,color,lineWidth,,,id2]=str.split("~"),parts=pathData.split(" "),x12=Number(parts[1])||0,y12=Number(parts[2])||0,radius=Number(parts[4])||0,sweepFlag=parts[7]==="1",x22=Number(parts[8])||0,y22=Number(parts[9])||0,parsedLineWidth=Number(lineWidth),finalLineWidth=Number.isNaN(parsedLineWidth)?1:parsedLineWidth;return{type:"ARC",start:{x:x12,y:y12},end:{x:x22,y:y22},radius,sweepFlag,color:color||"#880000",lineWidth:finalLineWidth,id:id2||"gge1"}},ArcShapeSchema=external_exports2.string().startsWith("A~").transform(parseArc).pipe(ArcShapeOutputSchema),PinShapeOutputSchema=external_exports2.object({type:external_exports2.literal("PIN"),visibility:external_exports2.enum(["show","hide","none"]),pinNumber:external_exports2.union([external_exports2.string(),external_exports2.number()]),x:external_exports2.number(),y:external_exports2.number(),rotation:external_exports2.number(),id:external_exports2.string(),label:external_exports2.string(),labelColor:external_exports2.string(),path:external_exports2.string(),arrow:external_exports2.string()}),parsePin=pinString=>{let parts=pinString.split("~"),[,visibility,,pinNumber,x4,y4,rotation22,id2]=parts,nameMatch=pinString.match(/~([\w+#-]+)~(start|end)~/),label=nameMatch?nameMatch[1]:"";label.endsWith("+")&&(label=label.slice(0,-1)+"_POS"),label.endsWith("-")&&(label=label.slice(0,-1)+"_NEG"),label.endsWith("#")&&(label=label.slice(0,-1)),/^\+\d+(?:\.\d+)?V$/i.test(label)&&(label=`V${label.slice(1,-1)}`);let colorMatch=pinString.match(/#[0-9A-F]{6}/),labelColor=colorMatch?colorMatch[0]:"",pathMatch=pinString.match(/\^\^([^~]+)/),path=pathMatch?pathMatch[1]:"",arrowMatch=pinString.match(/\^\^0~(.+)$/),arrow=arrowMatch?arrowMatch[1]:"",r5=Number.parseFloat(rotation22);return{type:"PIN",visibility,id:id2,pinNumber:Number.isNaN(Number(pinNumber))?pinNumber:Number(pinNumber),x:Number.parseFloat(x4),y:Number.parseFloat(y4),rotation:Number.isNaN(r5)?0:r5,label,labelColor,path,arrow}},PinShapeSchema=external_exports2.string().startsWith("P~").transform(parsePin).pipe(PinShapeOutputSchema),PolylineShapeOutputSchema=external_exports2.object({type:external_exports2.literal("POLYLINE"),points:external_exports2.array(PointSchema2),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parsePoints2=pointsStr=>pointsStr.split(" ").reduce((acc,value,index)=>(index%2===0?acc.push({x:Number(value),y:0}):acc[acc.length-1].y=Number(value),acc),[]),parsePolyline=str=>{let[,...rest]=str.split("~"),[pointsStr,color,lineWidth,,,id2]=rest;return{type:"POLYLINE",points:parsePoints2(pointsStr),color,lineWidth:Number(lineWidth),id:id2}},PolylineShapeSchema=external_exports2.string().startsWith("PL~").transform(parsePolyline).pipe(PolylineShapeOutputSchema),PolygonShapeOutputSchema=external_exports2.object({type:external_exports2.literal("POLYGON"),points:external_exports2.array(PointSchema2),fillColor:external_exports2.string(),lineWidth:external_exports2.number(),lineColor:external_exports2.string(),id:external_exports2.string()}),parsePolygon2=str=>{let[,...rest]=str.split("~"),[pointsStr,fillColor,lineWidth,lineColor,,id2]=rest;return{type:"POLYGON",points:parsePoints2(pointsStr),fillColor,lineWidth:Number(lineWidth),lineColor,id:id2}},PolygonShapeSchema=external_exports2.string().startsWith("PG~").transform(parsePolygon2).pipe(PolygonShapeOutputSchema),PathShapeOutputSchema=external_exports2.object({type:external_exports2.literal("PATH"),pathData:external_exports2.string(),fillColor:external_exports2.string(),strokeWidth:external_exports2.number(),strokeColor:external_exports2.string(),id:external_exports2.string()}),parsePath=str=>{let[,pathData,fillColor,strokeWidth,strokeColor,,id2]=str.split("~");return{type:"PATH",pathData,fillColor,strokeWidth:mil10ToMm(Number(strokeWidth)),strokeColor,id:id2}},PathShapeSchema=external_exports2.string().startsWith("PT~").transform(parsePath).pipe(PathShapeOutputSchema),optionalEasyEdaTextField=fieldSchema=>external_exports2.preprocess(textField=>{if(!(textField==null||textField===""||textField==="undefined"))return textField},fieldSchema),TextShapeOutputSchema=external_exports2.object({type:external_exports2.literal("TEXT"),alignment:external_exports2.enum(["L","C","R"]),x:external_exports2.number(),y:external_exports2.number(),rotation:external_exports2.number(),fontColor:external_exports2.string(),backgroundColor:optionalEasyEdaTextField(external_exports2.string().optional()),fontSize:external_exports2.string(),fontWeight:optionalEasyEdaTextField(external_exports2.string().optional().default("normal")),fontStyle:optionalEasyEdaTextField(external_exports2.enum(["normal","italic"]).optional().default("normal")),fontDecoration:optionalEasyEdaTextField(external_exports2.string().optional().default("")),content:external_exports2.string(),textType:external_exports2.string(),visibility:external_exports2.enum(["0","1"]),mirror:external_exports2.string(),id:external_exports2.string()}),parseText=str=>{let[,alignment,x4,y4,rotation22,fontColor,backgroundColor,fontSize,fontWeight,fontStyle,fontDecoration,content,textType,visibility,mirror,id2]=str.split("~");return{type:"TEXT",alignment,x:Number(x4),y:Number(y4),rotation:Number(rotation22),fontColor,backgroundColor,fontSize,fontWeight,fontStyle,fontDecoration,content,textType,visibility,mirror,id:id2}},TextShapeSchema=external_exports2.string().startsWith("T~").transform(parseText).pipe(TextShapeOutputSchema),SingleLetterShapeSchema=external_exports2.string().transform(x4=>{if(x4.startsWith("R~"))return RectangleShapeSchema.parse(x4);if(x4.startsWith("E~"))return EllipseShapeSchema.parse(x4);if(x4.startsWith("P~"))return PinShapeSchema.parse(x4);if(x4.startsWith("PL~"))return PolylineShapeSchema.parse(x4);if(x4.startsWith("PG~"))return PolygonShapeSchema.parse(x4);if(x4.startsWith("PT~"))return PathShapeSchema.parse(x4);if(x4.startsWith("T~"))return TextShapeSchema.parse(x4);if(x4.startsWith("A~"))return ArcShapeSchema.parse(x4);throw new Error(`Invalid shape type: ${x4}`)}).pipe(external_exports2.union([RectangleShapeOutputSchema,EllipseShapeOutputSchema,PinShapeOutputSchema,PolylineShapeOutputSchema,PolygonShapeOutputSchema,PathShapeOutputSchema,TextShapeOutputSchema,ArcShapeOutputSchema])),maybeNumber=external_exports2.any().transform(k4=>k4==="nan"||Number.isNaN(k4)?null:k4).pipe(external_exports2.number().nullable().optional()),SzlcscSchema=external_exports2.object({id:external_exports2.number(),number:external_exports2.string(),step:external_exports2.number().optional(),min:external_exports2.number().optional(),price:external_exports2.number().optional(),stock:external_exports2.number().optional(),url:external_exports2.string().url().optional(),image:external_exports2.string().optional().optional()}),LcscSchema=external_exports2.object({id:external_exports2.number(),number:external_exports2.string(),step:external_exports2.number().optional(),min:external_exports2.number().optional(),price:external_exports2.number().optional(),stock:external_exports2.number().optional(),url:external_exports2.string().url().optional()}),OwnerSchema=external_exports2.object({uuid:external_exports2.string(),username:external_exports2.string(),nickname:external_exports2.string(),avatar:external_exports2.string()}),HeadSchema=external_exports2.object({docType:external_exports2.preprocess(val=>val==null?val:String(val),external_exports2.string()),editorVersion:external_exports2.string(),c_para:external_exports2.record(external_exports2.string(),external_exports2.string().nullable()),x:external_exports2.number(),y:external_exports2.number(),puuid:external_exports2.string().optional(),uuid:external_exports2.string(),utime:external_exports2.preprocess(val=>val===""?0:typeof val=="string"?Number(val):val,external_exports2.number()),importFlag:external_exports2.number().optional(),c_spiceCmd:external_exports2.any().optional(),hasIdFlag:external_exports2.boolean()}),BBoxSchema=external_exports2.object({x:external_exports2.number(),y:external_exports2.number(),width:external_exports2.number(),height:external_exports2.number()}),LayerItemSchema=external_exports2.object({name:external_exports2.string(),color:external_exports2.string(),visible:external_exports2.boolean(),active:external_exports2.boolean(),config:external_exports2.boolean(),transparency:external_exports2.boolean()}),ObjectItemSchema=external_exports2.object({name:external_exports2.string(),visible:external_exports2.boolean(),locked:external_exports2.boolean()}),DataStrSchema=external_exports2.object({head:HeadSchema,canvas:external_exports2.string(),shape:external_exports2.array(SingleLetterShapeSchema),BBox:BBoxSchema,colors:external_exports2.union([external_exports2.array(external_exports2.string()),external_exports2.record(external_exports2.string())])}),PackageDetailDataStrSchema=external_exports2.object({head:HeadSchema,canvas:external_exports2.string(),shape:external_exports2.array(external_exports2.string()).transform(shapes=>shapes.map(shape=>{let[type,...data]=shape.split("~");return ShapeItemSchema.parse({type,data:data.join("~")})})).pipe(external_exports2.array(PackageDetailShapeSchema)),layers:external_exports2.array(external_exports2.string()).transform(layers=>layers.map(layer=>{let[name,color,visible,active,config,transparency]=layer.split("~");return LayerItemSchema.parse({name,color,visible:visible==="true",active:active==="true",config:config==="true",transparency:transparency==="true"})})),objects:external_exports2.array(external_exports2.string()).transform(objects=>objects.map(obj=>{let[name,visible,locked]=obj.split("~");return ObjectItemSchema.parse({name,visible:visible==="true",locked:locked==="true"})})),BBox:BBoxSchema,netColors:external_exports2.array(external_exports2.unknown()).optional()}),PackageDetailSchema=external_exports2.object({uuid:external_exports2.string(),title:external_exports2.string(),docType:external_exports2.number(),updateTime:external_exports2.number(),owner:OwnerSchema,datastrid:external_exports2.string(),writable:external_exports2.boolean(),dataStr:PackageDetailDataStrSchema}),ModelBoundsSchema=external_exports2.object({min:external_exports2.object({x:external_exports2.number(),y:external_exports2.number(),z:external_exports2.number()}),max:external_exports2.object({x:external_exports2.number(),y:external_exports2.number(),z:external_exports2.number()})}),EasyEdaJsonSchema=external_exports2.object({uuid:external_exports2.string(),title:external_exports2.string(),description:external_exports2.string(),docType:external_exports2.number(),type:external_exports2.number(),szlcsc:SzlcscSchema,lcsc:LcscSchema,owner:OwnerSchema,tags:external_exports2.array(external_exports2.string()),category:external_exports2.string().optional(),updateTime:external_exports2.number(),updated_at:external_exports2.string(),dataStr:DataStrSchema,verify:external_exports2.boolean(),SMT:external_exports2.boolean().optional(),datastrid:external_exports2.string(),jlcOnSale:external_exports2.number().optional(),writable:external_exports2.boolean(),isFavorite:external_exports2.boolean(),packageDetail:PackageDetailSchema,_objMetadata:external_exports2.object({bounds:ModelBoundsSchema}).optional()}),getModelObjCdnUrl=({easyedaModelUuid,easyedaPartNumber})=>`https://modelcdn.tscircuit.com/easyeda_models/assets/${easyedaPartNumber}.obj?uuid=${easyedaModelUuid}`,getModelCdnUrl=getModelObjCdnUrl,getModelUuidFromRawPackageDetail=result=>{let shapes=result.packageDetail?.dataStr?.shape;if(!Array.isArray(shapes))return null;for(let shape of shapes){if(typeof shape!="string"||!shape.startsWith("SVGNODE~"))continue;let svgNodeJson=shape.slice(8);try{let modelUuid=JSON.parse(svgNodeJson)?.attrs?.uuid;if(typeof modelUuid=="string"&&modelUuid.length>0)return modelUuid}catch{}}return null},parseObjBounds2=objText=>{let minX=Number.POSITIVE_INFINITY,minY=Number.POSITIVE_INFINITY,minZ=Number.POSITIVE_INFINITY,maxX=Number.NEGATIVE_INFINITY,maxY=Number.NEGATIVE_INFINITY,maxZ=Number.NEGATIVE_INFINITY,vertexCount=0;for(let line2 of objText.split(/\r?\n/)){let trimmed=line2.trim();if(!trimmed.startsWith("v "))continue;let[,xStr,yStr,zStr]=trimmed.split(/\s+/,4),x4=Number(xStr),y4=Number(yStr),z4=Number(zStr);!Number.isFinite(x4)||!Number.isFinite(y4)||!Number.isFinite(z4)||(vertexCount+=1,minX=Math.min(minX,x4),minY=Math.min(minY,y4),minZ=Math.min(minZ,z4),maxX=Math.max(maxX,x4),maxY=Math.max(maxY,y4),maxZ=Math.max(maxZ,z4))}return vertexCount===0?null:{min:{x:minX,y:minY,z:minZ},max:{x:maxX,y:maxY,z:maxZ}}};async function fetchEasyEDAComponent(jlcpcbPartNumber,{fetch:fetch22=globalThis.fetch,includeModelMetadata=!0}={}){let searchUrl="https://easyeda.com/api/components/search",componentUrl=uuid=>`https://easyeda.com/api/components/${uuid}?version=6.4.7&uuid=${uuid}&datastrid=`,searchHeaders={authority:"easyeda.com",pragma:"no-cache","cache-control":"no-cache",accept:"application/json, text/javascript, */*; q=0.01","x-requested-with":"XMLHttpRequest","user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36","content-type":"application/x-www-form-urlencoded; charset=UTF-8",origin:"https://easyeda.com","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty",referer:"https://easyeda.com/editor","accept-language":"cs,en;q=0.9,sk;q=0.8,en-GB;q=0.7",cookie:"<PUT your cookies here>"},searchData=`type=3&doctype%5B%5D=2&uid=0819f05c4eef4c71ace90d822a990e87&returnListStyle=classifyarr&wd=${jlcpcbPartNumber}&version=6.4.7`,searchResponse=await fetch22(searchUrl,{method:"POST",headers:searchHeaders,body:searchData});if(!searchResponse.ok)throw new Error("Failed to search for the component");let searchResult=await searchResponse.json();if(!searchResult.success||!searchResult.result.lists.lcsc.length)throw new Error("Component not found");let componentUUID=(searchResult.result.lists.lcsc.find(component=>component.dataStr.head.c_para["Supplier Part"]===jlcpcbPartNumber)??searchResult.result.lists.lcsc[0]).uuid,componentResponse=await fetch22(componentUrl(componentUUID),{method:"GET",headers:{...searchHeaders,referer:`https://easyeda.com/editor?uuid=${componentUUID}`}});if(!componentResponse.ok)throw new Error("Failed to fetch the component details");let result=(await componentResponse.json()).result;if(includeModelMetadata){let modelUuid=getModelUuidFromRawPackageDetail(result),partNumber=result.lcsc?.number;if(modelUuid&&partNumber)try{let objUrl=getModelCdnUrl({easyedaModelUuid:modelUuid,easyedaPartNumber:partNumber}),objResponse=await fetch22(objUrl);if(objResponse.ok){let objText=await objResponse.text(),bounds=parseObjBounds2(objText);bounds&&(result._objMetadata={bounds})}}catch(error2){console.error(`Error fetching model metadata for ${jlcpcbPartNumber}:`,error2)}}return result}var getFootprinterStringFromKicad=kicadFootprint=>{let match2=kicadFootprint.match(/:[RC]_(\d{4})_/);if(match2||(match2=kicadFootprint.match(/:(SOIC-\d+|SOT-\d+|SOD-\d+|SSOP-\d+|TSSOP-\d+|QFP-\d+|QFN-\d+)/),match2))return match2[1]},getJlcPackageFromFootprinterString=footprinterString=>footprinterString.includes("cap")?footprinterString.replace(/cap/g,""):footprinterString,getJlcpcbPackageName=footprint=>{if(footprint){if(footprint.startsWith("kicad:")){let footprinterString=getFootprinterStringFromKicad(footprint);return footprinterString?getJlcPackageFromFootprinterString(footprinterString):footprint}return getJlcPackageFromFootprinterString(footprint)}},EASYEDA_API_ORIGIN="https://easyeda.com",METHODS_WITHOUT_BODY=new Set(["GET","HEAD"]),getRequestUrl=requestInput=>typeof requestInput=="string"?requestInput:requestInput instanceof URL?requestInput.toString():requestInput.url,createMergedTargetRequest=(requestInput,requestInit)=>requestInput instanceof URL?new Request(requestInput.toString(),requestInit):typeof requestInput=="string"?new Request(requestInput,requestInit):new Request(requestInput,requestInit),isEasyEdaApiRequestUrl=requestUrl=>requestUrl.startsWith(`${EASYEDA_API_ORIGIN}/api/`),getFetchWithEasyEdaProxy=({platformFetch:upstreamFetch,easyEdaProxyConfig})=>async(requestInput,requestInit)=>{let targetRequestUrl=getRequestUrl(requestInput);if(!isEasyEdaApiRequestUrl(targetRequestUrl))return upstreamFetch(requestInput,requestInit);let mergedTargetRequest=createMergedTargetRequest(requestInput,requestInit),targetRequestHeaders=new Headers(mergedTargetRequest.headers),proxyRequestHeaders=new Headers(targetRequestHeaders);proxyRequestHeaders.delete("origin"),proxyRequestHeaders.delete("authority"),proxyRequestHeaders.delete("host"),proxyRequestHeaders.delete("referer"),proxyRequestHeaders.delete("user-agent"),proxyRequestHeaders.delete("cookie"),proxyRequestHeaders.set("X-Target-Url",targetRequestUrl),proxyRequestHeaders.set("X-Sender-Origin",targetRequestHeaders.get("origin")??""),proxyRequestHeaders.set("X-Sender-Host",targetRequestHeaders.get("host")??EASYEDA_API_ORIGIN),proxyRequestHeaders.set("X-Sender-Referer",targetRequestHeaders.get("referer")??""),proxyRequestHeaders.set("X-Sender-User-Agent",targetRequestHeaders.get("user-agent")??""),proxyRequestHeaders.set("X-Sender-Cookie",targetRequestHeaders.get("cookie")??""),proxyRequestHeaders.set("authority",targetRequestHeaders.get("authority")??targetRequestHeaders.get("host")??""),proxyRequestHeaders.set("content-type",targetRequestHeaders.get("content-type")??"");for(let[name,value]of Object.entries(easyEdaProxyConfig.headers??{}))proxyRequestHeaders.set(name,value);let proxyRequestBody=METHODS_WITHOUT_BODY.has(mergedTargetRequest.method)?void 0:await mergedTargetRequest.clone().arrayBuffer();return upstreamFetch(easyEdaProxyConfig.proxyEndpointUrl,{method:mergedTargetRequest.method,headers:proxyRequestHeaders,body:proxyRequestBody,signal:requestInit?.signal})},cache=new Map,getJlcPartsCached=async(name,params)=>{let paramString=new URLSearchParams({...params,json:"true"}).toString();if(cache.has(paramString))return cache.get(paramString);let responseJson=await(await fetch(`https://jlcsearch.tscircuit.com/${name}/list?${paramString}`)).json();return cache.set(paramString,responseJson),responseJson},withBasicPartPreference=parts=>parts?[...parts].sort((a3,b3)=>Number(b3.is_basic??!1)-Number(a3.is_basic??!1)):[],JlcPcbPartsEngine=class{constructor({platformFetch:defaultPlatformFetch,easyEdaProxyConfig}={}){__publicField(this,"defaultPlatformFetch");__publicField(this,"easyEdaProxyConfig");this.defaultPlatformFetch=defaultPlatformFetch,this.easyEdaProxyConfig=easyEdaProxyConfig,this.fetchPartCircuitJson=this.fetchPartCircuitJson.bind(this)}getEasyEdaPlatformFetch(platformFetchOverride){let resolvedPlatformFetch=platformFetchOverride??this.defaultPlatformFetch??globalThis.fetch;return this.easyEdaProxyConfig?getFetchWithEasyEdaProxy({platformFetch:resolvedPlatformFetch,easyEdaProxyConfig:this.easyEdaProxyConfig}):resolvedPlatformFetch}async findPart({sourceComponent,footprinterString}){let jlcpcbPackage=getJlcpcbPackageName(footprinterString);if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_resistor"){let{resistors}=await getJlcPartsCached("resistors",{resistance:sourceComponent.resistance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(resistors).map(r5=>`C${r5.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_capacitor"){let{capacitors}=await getJlcPartsCached("capacitors",{capacitance:sourceComponent.capacitance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(capacitors).map(c4=>`C${c4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_pin_header"){let pitch;footprinterString?.includes("_p")&&(pitch=Number(footprinterString.split("_p")[1]));let{headers}=await getJlcPartsCached("headers",pitch?{pitch,num_pins:sourceComponent.pin_count,gender:sourceComponent.gender}:{num_pins:sourceComponent.pin_count,gender:sourceComponent.gender});return{jlcpcb:withBasicPartPreference(headers).map(h6=>`C${h6.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_potentiometer"){let{potentiometers}=await getJlcPartsCached("potentiometers",{resistance:sourceComponent.max_resistance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(potentiometers).map(p4=>`C${p4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_diode"){let{diodes}=await getJlcPartsCached("diodes",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(diodes).map(d4=>`C${d4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_chip"){if(!jlcpcbPackage||!footprinterString)return{};let{chips}=await getJlcPartsCached("chips",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(chips).map(c4=>`C${c4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_transistor"){let{transistors}=await getJlcPartsCached("transistors",{package:jlcpcbPackage,transistor_type:sourceComponent.transistor_type});return{jlcpcb:withBasicPartPreference(transistors).map(t52=>`C${t52.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_power_source"){let{power_sources}=await getJlcPartsCached("power_sources",{voltage:sourceComponent.voltage,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(power_sources).map(p4=>`C${p4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_inductor"){let{inductors}=await getJlcPartsCached("inductors",{inductance:sourceComponent.inductance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(inductors).map(i3=>`C${i3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_crystal"){let{crystals}=await getJlcPartsCached("crystals",{frequency:sourceComponent.frequency,load_capacitance:sourceComponent.load_capacitance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(crystals).map(c4=>`C${c4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_mosfet"){let{mosfets}=await getJlcPartsCached("mosfets",{package:jlcpcbPackage,mosfet_mode:sourceComponent.mosfet_mode,channel_type:sourceComponent.channel_type});return{jlcpcb:withBasicPartPreference(mosfets).map(m4=>`C${m4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_resonator"){let{resonators}=await getJlcPartsCached("resonators",{frequency:sourceComponent.frequency,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(resonators).map(r5=>`C${r5.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_switch"){let{switches}=await getJlcPartsCached("switches",{switch_type:sourceComponent.type,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(switches).map(s3=>`C${s3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_led"){let{leds}=await getJlcPartsCached("leds",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(leds).map(l4=>`C${l4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_fuse"){let{fuses}=await getJlcPartsCached("fuses",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(fuses).map(l4=>`C${l4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_connector"&&sourceComponent.standard==="usb_c"){let{usb_c_connectors}=await getJlcPartsCached("usb_c_connectors",{});return{jlcpcb:withBasicPartPreference(usb_c_connectors).map(c4=>`C${c4.lcsc}`).slice(0,3)}}return{}}async fetchPartCircuitJson({supplierPartNumber,manufacturerPartNumber,platformFetch:platformFetchOverride}){let easyEdaPlatformFetch=this.getEasyEdaPlatformFetch(platformFetchOverride),resolvedSupplierPartNumber=supplierPartNumber;if(!resolvedSupplierPartNumber&&manufacturerPartNumber){let{components}=await getJlcPartsCached("components",{search:manufacturerPartNumber});resolvedSupplierPartNumber=components?.[0]?`C${components[0].lcsc}`:void 0}if(!resolvedSupplierPartNumber)return;let rawEasyEdaJson=await fetchEasyEDAComponent(resolvedSupplierPartNumber,{fetch:easyEdaPlatformFetch}),parsed=EasyEdaJsonSchema.parse(rawEasyEdaJson);return convertEasyEdaJsonToCircuitJson(parsed)}},jlcPartsEngine=new JlcPcbPartsEngine;var gridRouter=__toESM(require_grid_router(),1);async function initKiCadRoutingToolsAutorouter(){}var KiCadRoutingToolsAutorouter=class{constructor(input2,options={}){__publicField(this,"input");__publicField(this,"options");__publicField(this,"isRouting",!1);__publicField(this,"cachedTraces",null);__publicField(this,"completeHandlers",[]);__publicField(this,"errorHandlers",[]);__publicField(this,"progressHandlers",[]);this.input=input2,this.options=options}on(event,callback){if(event==="complete"){this.completeHandlers.push(callback);return}if(event==="error"){this.errorHandlers.push(callback);return}this.progressHandlers.push(callback)}start(){this.isRouting||(this.isRouting=!0,this.emitProgress(0,"initializing KiCadRoutingTools wasm router"),this.solve().then(traces=>{this.isRouting&&(this.isRouting=!1,this.emitProgress(1,"routing complete"),this.emitComplete(traces))},error2=>{this.isRouting=!1,this.emitError(error2)}))}stop(){this.isRouting=!1}async solve(){return this.cachedTraces?this.cachedTraces:(await initKiCadRoutingToolsAutorouter(),this.cachedTraces=this.solveSync(),this.cachedTraces)}solveSync(){return this.cachedTraces??(this.cachedTraces=gridRouter.routeSimpleRouteJson(this.input,normalizeOptions(this.options))),(this.options.collapseShortSameLayerTunnels??!0)&&(this.cachedTraces=collapseShortSameLayerTunnels(this.cachedTraces)),this.cachedTraces}emitComplete(traces){for(let handler of this.completeHandlers)handler({type:"complete",traces})}emitError(error2){let normalizedError=error2 instanceof Error?error2:new Error(String(error2));for(let handler of this.errorHandlers)handler({type:"error",error:normalizedError})}emitProgress(progress,phase){for(let handler of this.progressHandlers)handler({type:"progress",steps:Math.round(progress*this.input.connections.length),progress,phase})}};function createKiCadRoutingToolsAutorouter(options={}){return async simpleRouteJson=>(await initKiCadRoutingToolsAutorouter(),new KiCadRoutingToolsAutorouter(simpleRouteJson,options))}function normalizeOptions(options){return{gridStep:options.gridStep??.1,clearance:options.clearance??.2,maxIterations:options.maxIterations??3e5,viaCost:options.viaCost??5e4,hWeight:options.hWeight??1.25,turnCost:options.turnCost??1e3,trackMargin:options.trackMargin??0,layerCosts:options.layerCosts,layerDirectionPreferences:options.layerDirectionPreferences,directionPreferenceCost:options.directionPreferenceCost??0}}function collapseShortSameLayerTunnels(traces){return traces.map(trace=>({...trace,route:collapseTraceRoute(trace.route??[],1)}))}function collapseTraceRoute(route,maxTunnelLength){let collapsed=[],index=0;for(;index<route.length;){let replacement=getShortTunnelReplacement(route.slice(index),maxTunnelLength);if(replacement){collapsed.push(replacement),index+=6;continue}collapsed.push(route[index]),index+=1}return collapsed}function getShortTunnelReplacement(route,maxTunnelLength){let[start,viaIn,innerStart,innerEnd,viaOut,end]=route;return start?.route_type!=="wire"||viaIn?.route_type!=="via"||innerStart?.route_type!=="wire"||innerEnd?.route_type!=="wire"||viaOut?.route_type!=="via"||end?.route_type!=="wire"||start.layer!==viaIn.from_layer||viaIn.to_layer!==innerStart.layer||innerStart.layer!==innerEnd.layer||viaOut.from_layer!==innerStart.layer||viaOut.to_layer!==start.layer||end.layer!==start.layer||!samePoint(start,viaIn)||!samePoint(start,innerStart)||!samePoint(innerEnd,viaOut)||!samePoint(innerEnd,end)||Math.hypot(end.x-start.x,end.y-start.y)>maxTunnelLength?null:{route_type:"wire",x:end.x,y:end.y,layer:start.layer,width:start.width}}function samePoint(a3,b3){return Math.abs(a3.x-b3.x)<1e-6&&Math.abs(a3.y-b3.y)<1e-6}var import_s_expression=__toESM(require_s_expression(),1);init_zod();var import_debug20=__toESM(require_browser(),1),import_debug21=__toESM(require_browser(),1),point22=external_exports.tuple([external_exports.coerce.number(),external_exports.coerce.number()]),point34=external_exports.tuple([external_exports.number(),external_exports.number(),external_exports.number()]),point6=external_exports.union([point22,point34]),fp_poly_arc_segment_def=external_exports.object({kind:external_exports.literal("arc"),start:point22,mid:point22,end:point22}),fp_poly_point_def=external_exports.union([point22,fp_poly_arc_segment_def]),attributes_def=external_exports.object({at:point6,size:point22,layer:external_exports.string(),layers:external_exports.array(external_exports.string()),roundrect_rratio:external_exports.number(),uuid:external_exports.string()}).partial(),property_def=external_exports.object({key:external_exports.string(),val:external_exports.string(),attributes:attributes_def}),drill_def=external_exports.object({oval:external_exports.boolean().default(!1),width:external_exports.number().optional(),height:external_exports.number().optional(),offset:point22.optional()}),hole_def=external_exports.object({name:external_exports.string(),pad_type:external_exports.enum(["thru_hole","smd","np_thru_hole","connect"]),pad_shape:external_exports.enum(["roundrect","circle","rect","oval","trapezoid","custom"]),at:point6,drill:external_exports.union([external_exports.number(),external_exports.array(external_exports.any()),drill_def]).transform(a3=>typeof a3=="number"?{oval:!1,width:a3,height:a3}:"oval"in a3?a3:a3.length===2?{oval:!1,width:Number.parseFloat(a3[0]),height:Number.parseFloat(a3[0]),offset:point22.parse(a3[1].slice(1))}:a3.length===3||a3.length===4?{oval:a3[0]==="oval",width:Number.parseFloat(a3[1]),height:Number.parseFloat(a3[2]),offset:a3[3]?point22.parse(a3[3].slice(1)):void 0}:a3).pipe(drill_def),size:external_exports.union([external_exports.array(external_exports.number()).length(2).transform(([w4,h6])=>({width:w4,height:h6})),external_exports.object({width:external_exports.number(),height:external_exports.number()})]),layers:external_exports.array(external_exports.string()).optional(),roundrect_rratio:external_exports.number().optional(),uuid:external_exports.string().optional()}),pad_def2=external_exports.object({name:external_exports.string(),pad_type:external_exports.enum(["thru_hole","smd","np_thru_hole","connect"]),pad_shape:external_exports.enum(["roundrect","circle","rect","oval","trapezoid","custom"]),at:point6,size:point22,drill:external_exports.union([external_exports.number(),external_exports.array(external_exports.any()),drill_def]).transform(a3=>typeof a3=="number"?{oval:!1,width:a3,height:a3}:"oval"in a3?a3:a3.length===2?{oval:!1,width:Number.parseFloat(a3[0]),height:Number.parseFloat(a3[0]),offset:point22.parse(a3[1].slice(1))}:a3.length===3||a3.length===4?{oval:a3[0]==="oval",width:Number.parseFloat(a3[1]),height:Number.parseFloat(a3[2]),offset:a3[3]?point22.parse(a3[3].slice(1)):void 0}:a3).pipe(drill_def).optional(),layers:external_exports.array(external_exports.string()).optional(),roundrect_rratio:external_exports.number().optional(),chamfer_ratio:external_exports.number().optional(),solder_paste_margin:external_exports.number().optional(),solder_paste_margin_ratio:external_exports.number().optional(),clearance:external_exports.number().optional(),zone_connection:external_exports.union([external_exports.literal(0).describe("Pad is not connect to zone"),external_exports.literal(1).describe("Pad is connected to zone using thermal relief"),external_exports.literal(2).describe("Pad is connected to zone using solid fill")]).optional(),thermal_width:external_exports.number().optional(),thermal_gap:external_exports.number().optional(),uuid:external_exports.string().optional()}),effects_def=external_exports.object({font:external_exports.object({size:point22,thickness:external_exports.number().optional()})}).partial(),fp_text_def=external_exports.object({fp_text_type:external_exports.literal("user"),text:external_exports.string(),at:point6,layer:external_exports.string(),uuid:external_exports.string().optional(),effects:effects_def.partial()}),fp_arc_def=external_exports.object({start:point22,mid:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}),layer:external_exports.string(),uuid:external_exports.string().optional()}),fp_circle_def=external_exports.object({center:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}),fill:external_exports.string().optional(),layer:external_exports.string(),uuid:external_exports.string().optional()}),fp_poly_def=external_exports.object({pts:external_exports.array(fp_poly_point_def),stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}).optional(),width:external_exports.number().optional(),layer:external_exports.string(),uuid:external_exports.string().optional(),fill:external_exports.string().optional()}).transform(data=>({...data,width:void 0,stroke:data.stroke??{width:data.width}})),fp_rect_def=external_exports.object({start:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}).optional(),width:external_exports.number().optional(),fill:external_exports.string().optional(),layer:external_exports.string(),uuid:external_exports.string().optional()}).transform(data=>({...data,width:void 0,stroke:data.stroke??{width:data.width}})),fp_line=external_exports.object({start:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}).optional(),width:external_exports.number().optional(),layer:external_exports.string(),uuid:external_exports.string().optional()}).transform(data=>({...data,width:void 0,stroke:data.stroke??{width:data.width}})),kicad_mod_json_def=external_exports.object({footprint_name:external_exports.string(),version:external_exports.string().optional(),generator:external_exports.string().optional(),generator_version:external_exports.string().optional(),layer:external_exports.string(),descr:external_exports.string().default(""),tags:external_exports.array(external_exports.string()).optional(),properties:external_exports.array(property_def),fp_lines:external_exports.array(fp_line),fp_rects:external_exports.array(fp_rect_def).optional(),fp_texts:external_exports.array(fp_text_def),fp_arcs:external_exports.array(fp_arc_def),fp_circles:external_exports.array(fp_circle_def).optional(),fp_polys:external_exports.array(fp_poly_def).optional(),pads:external_exports.array(pad_def2),holes:external_exports.array(hole_def).optional()}),formatAttr=(val,attrKey)=>{if(attrKey==="effects"&&Array.isArray(val)){let effectsObj={};for(let elm of val)if(elm[0]==="font"){let fontObj={};for(let fontElm of elm.slice(1))fontElm.length===2?fontObj[fontElm[0].valueOf()]=Number.parseFloat(fontElm[1].valueOf()):fontObj[fontElm[0].valueOf()]=fontElm.slice(1).map(n4=>Number.parseFloat(n4.valueOf()));effectsObj.font=fontObj}return effects_def.parse(effectsObj)}if(attrKey==="pts")return val.map(segment2=>{let segmentType=segment2[0]?.valueOf?.()??segment2[0];if(segmentType==="xy")return segment2.slice(1).map(n4=>Number.parseFloat(n4.valueOf()));if(segmentType==="arc"){let arcObj={kind:"arc"};for(let arcAttr of segment2.slice(1)){let key=arcAttr[0].valueOf();arcObj[key]=arcAttr.slice(1).map(n4=>Number.parseFloat(n4.valueOf()))}return arcObj}return segment2});if(attrKey==="stroke"){let strokeObj={};for(let strokeElm of val){let strokePropKey=strokeElm[0].valueOf();strokeObj[strokePropKey]=formatAttr(strokeElm.slice(1),strokePropKey)}return strokeObj}return attrKey==="at"||attrKey==="size"||attrKey==="start"||attrKey==="mid"||attrKey==="end"?(Array.isArray(val)?val:[val]).map(n4=>n4?.valueOf?.()??n4).filter(v4=>typeof v4=="number"||typeof v4=="string"&&/^[-+]?\d*\.?\d+(e[-+]?\d+)?$/i.test(v4)).map(v4=>typeof v4=="number"?v4:Number.parseFloat(v4)):attrKey==="tags"?val.map(n4=>n4.valueOf()):attrKey==="generator_version"||attrKey==="version"?val[0].valueOf():val.length===2?val.valueOf():attrKey==="uuid"?Array.isArray(val)?val[0].valueOf():val.valueOf():/^[\d\.]+$/.test(val)&&!Number.isNaN(Number.parseFloat(val))?Number.parseFloat(val):Array.isArray(val)&&val.length===1?val[0].valueOf():Array.isArray(val)?val.map(s3=>s3.valueOf()):val},getAttr=(s3,key)=>{for(let elm of s3)if(Array.isArray(elm)&&elm[0]===key)return formatAttr(elm.slice(1),key)},debug11=(0,import_debug20.default)("kicad-mod-converter"),parseKicadModToKicadJson=fileContent=>{let kicadSExpr=(0,import_s_expression.default)(fileContent),footprintName=kicadSExpr[1].valueOf(),topLevelAttributes={},simpleTopLevelAttributes=Object.entries(kicad_mod_json_def.shape).filter(([attributeKey,def])=>def._def.typeName==="ZodString"||attributeKey==="tags").map(([attributeKey])=>attributeKey);for(let kicadSExprRow of kicadSExpr.slice(2)){if(!simpleTopLevelAttributes.includes(kicadSExprRow[0]))continue;let key=kicadSExprRow[0].valueOf(),val=formatAttr(kicadSExprRow.slice(1),key);topLevelAttributes[key]=val}let properties=kicadSExpr.slice(2).filter(row=>row[0]==="property").map(row=>{let key=row[1].valueOf(),val=row[2].valueOf(),attributes2=attributes_def.parse(row.slice(3).reduce((acc,attrAr)=>{let attrKey=attrAr[0].valueOf();return acc[attrKey]=formatAttr(attrAr.slice(1),attrKey),acc},{}));return{key,val,attributes:attributes2}}),padRows=kicadSExpr.slice(2).filter(row=>row[0]==="pad"),pads=[];for(let row of padRows){let at3=getAttr(row,"at"),size3=getAttr(row,"size"),drill=getAttr(row,"drill"),layers=getAttr(row,"layers");Array.isArray(layers)?layers=layers.map(layer=>layer.valueOf()):typeof layers=="string"?layers=[layers]:layers||(layers=[]);let padType=row[2].valueOf(),isCu=layers.some(l4=>l4.endsWith(".Cu")||l4==="*.Cu"||l4.includes(".Cu"));if(padType==="thru_hole")continue;if(!isCu&&padType!=="np_thru_hole"){debug11(`Skipping pad without copper layer: layers=${layers.join(", ")}`);continue}let roundrect_rratio=getAttr(row,"roundrect_rratio"),uuid=getAttr(row,"uuid"),padRaw={name:row[1].valueOf(),pad_type:row[2].valueOf(),pad_shape:row[3].valueOf(),at:at3,drill,size:size3,layers,roundrect_rratio,uuid};debug11(`attempting to parse pad: ${JSON.stringify(padRaw,null," ")}`),pads.push(pad_def2.parse(padRaw))}let fp_texts_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_text"),fp_texts=[];for(let fp_text_row of fp_texts_rows){let text=fp_text_row[2].valueOf(),at3=getAttr(fp_text_row,"at"),layer=getAttr(fp_text_row,"layer"),uuid=getAttr(fp_text_row,"uuid"),effects=getAttr(fp_text_row,"effects");fp_texts.push({fp_text_type:"user",text,at:at3,layer,uuid,effects})}let fp_lines=[],fp_lines_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_line");for(let fp_line_row of fp_lines_rows){let start=getAttr(fp_line_row,"start"),end=getAttr(fp_line_row,"end"),stroke=getAttr(fp_line_row,"stroke"),layer=getAttr(fp_line_row,"layer"),uuid=getAttr(fp_line_row,"uuid");fp_lines.push({start,end,stroke,layer,uuid})}let fp_rects=[],fp_rect_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_rect");for(let fp_rect_row of fp_rect_rows){let start=getAttr(fp_rect_row,"start"),end=getAttr(fp_rect_row,"end"),stroke=getAttr(fp_rect_row,"stroke"),layer=getAttr(fp_rect_row,"layer"),fill=getAttr(fp_rect_row,"fill"),uuid=getAttr(fp_rect_row,"uuid");!start||!end||!layer||fp_rects.push({start,end,stroke,fill,layer,uuid})}let fp_arcs=[],fp_arcs_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_arc");for(let fp_arc_row of fp_arcs_rows){let start=getAttr(fp_arc_row,"start"),mid=getAttr(fp_arc_row,"mid"),end=getAttr(fp_arc_row,"end"),stroke=getAttr(fp_arc_row,"stroke"),layer=getAttr(fp_arc_row,"layer"),uuid=getAttr(fp_arc_row,"uuid");!start||!end||!mid||!stroke||!layer||fp_arcs.push({start,mid,end,stroke,layer,uuid})}let fp_circles=[],fp_circles_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_circle");for(let fp_circle_row of fp_circles_rows){let center2=getAttr(fp_circle_row,"center"),end=getAttr(fp_circle_row,"end"),stroke=getAttr(fp_circle_row,"stroke"),fill=getAttr(fp_circle_row,"fill"),layer=getAttr(fp_circle_row,"layer"),uuid=getAttr(fp_circle_row,"uuid");!center2||!end||!stroke||!layer||fp_circles.push({center:center2,end,stroke,fill,layer,uuid})}let fp_polys=[],fp_polys_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_poly");for(let fp_poly_row of fp_polys_rows){let pts=getAttr(fp_poly_row,"pts"),stroke=getAttr(fp_poly_row,"stroke"),width=getAttr(fp_poly_row,"width"),layer=getAttr(fp_poly_row,"layer"),uuid=getAttr(fp_poly_row,"uuid"),fill=getAttr(fp_poly_row,"fill"),normalizedStroke=stroke;!normalizedStroke&&typeof width=="number"?normalizedStroke={width,type:"solid"}:normalizedStroke&&typeof normalizedStroke=="object"&&typeof width=="number"&&normalizedStroke.width===void 0&&(normalizedStroke={...normalizedStroke,width}),fp_polys.push({pts,stroke:normalizedStroke,layer,uuid,fill})}let holes=[];for(let row of kicadSExpr.slice(2)){if(row[0]!=="pad"||row[2]?.valueOf?.()!=="thru_hole")continue;let name=row[1]?.valueOf?.(),pad_type=row[2]?.valueOf?.(),pad_shape=row[3]?.valueOf?.(),at3=getAttr(row,"at"),drill=getAttr(row,"drill"),size3=getAttr(row,"size");Array.isArray(size3)&&(size3[0]==="size"&&(size3=size3.slice(1)),size3={width:Number(size3[0]),height:Number(size3[1])});let uuid=getAttr(row,"uuid"),roundrect_rratio=getAttr(row,"roundrect_rratio"),layers=getAttr(row,"layers");Array.isArray(layers)?layers=layers.map(layer=>layer.valueOf()):typeof layers=="string"?layers=[layers]:layers||(layers=[]);let holeRaw={name,pad_type,pad_shape,at:at3,drill,size:size3,layers,roundrect_rratio,uuid};debug11(`attempting to parse holes: ${JSON.stringify(holeRaw,null,2)}`),holes.push(hole_def.parse(holeRaw))}return kicad_mod_json_def.parse({footprint_name:footprintName,...topLevelAttributes,properties,fp_lines,fp_rects,fp_texts,fp_arcs,fp_circles,pads,holes,fp_polys})},TWO_PI=Math.PI*2,normalizeAngle2=angle=>{let result=angle%TWO_PI;return result<0&&(result+=TWO_PI),result},directedAngleCCW=(start,target)=>{let startNorm=normalizeAngle2(start),delta=normalizeAngle2(target)-startNorm;return delta<0&&(delta+=TWO_PI),delta};function calculateCenter(start,mid,end){let mid1={x:(start.x+mid.x)/2,y:(start.y+mid.y)/2},mid2={x:(mid.x+end.x)/2,y:(mid.y+end.y)/2},slope1=-(start.x-mid.x)/(start.y-mid.y),slope2=-(mid.x-end.x)/(mid.y-end.y),centerX=(mid1.y-mid2.y+slope2*mid2.x-slope1*mid1.x)/(slope2-slope1),centerY=mid1.y+slope1*(centerX-mid1.x);return{x:centerX,y:centerY}}function calculateRadius(center2,point42){return Math.sqrt((center2.x-point42.x)**2+(center2.y-point42.y)**2)}function calculateAngle(center2,point42){return Math.atan2(point42.y-center2.y,point42.x-center2.x)}var getArcLength2=(start,mid,end)=>{let center2=calculateCenter(start,mid,end),radius=calculateRadius(center2,start),angleStart=calculateAngle(center2,start),angleMid=calculateAngle(center2,mid),angleEnd=calculateAngle(center2,end),ccwToMid=directedAngleCCW(angleStart,angleMid),ccwToEnd=directedAngleCCW(angleStart,angleEnd),angleDelta=ccwToEnd;return ccwToMid>ccwToEnd&&(angleDelta=ccwToEnd-TWO_PI),Math.abs(radius*angleDelta)};function generateArcPath(start,mid,end,numPoints){let center2=calculateCenter(start,mid,end),radius=calculateRadius(center2,start),angleStart=calculateAngle(center2,start),angleMid=calculateAngle(center2,mid),angleEnd=calculateAngle(center2,end),ccwToMid=directedAngleCCW(angleStart,angleMid),ccwToEnd=directedAngleCCW(angleStart,angleEnd),angleDelta=ccwToEnd;ccwToMid>ccwToEnd&&(angleDelta=ccwToEnd-TWO_PI);let path=[];for(let i3=0;i3<=numPoints;i3++){let angle=angleStart+i3/numPoints*angleDelta,x4=center2.x+radius*Math.cos(angle),y4=center2.y+radius*Math.sin(angle);path.push({x:x4,y:y4})}return path}var makePoint=p4=>Array.isArray(p4)?{x:p4[0],y:p4[1]}:p4,pointsEqual4=(p12,p22,tolerance=1e-4)=>Math.abs(p12.x-p22.x)<tolerance&&Math.abs(p12.y-p22.y)<tolerance,findClosedPolygons=segments=>{let polygons=[],used=new Set;for(let i3=0;i3<segments.length;i3++){if(used.has(i3))continue;let polygon2=[segments[i3]];used.add(i3);let currentEnd=segments[i3].end,foundNext=!0;for(;foundNext;){if(foundNext=!1,polygon2.length>1&&pointsEqual4(currentEnd,polygon2[0].start)){polygons.push(polygon2);break}for(let j4=0;j4<segments.length;j4++)if(!used.has(j4)){if(pointsEqual4(currentEnd,segments[j4].start)){polygon2.push(segments[j4]),used.add(j4),currentEnd=segments[j4].end,foundNext=!0;break}else if(pointsEqual4(currentEnd,segments[j4].end)){segments[j4].type==="arc"?polygon2.push({...segments[j4],reversed:!0}):polygon2.push({...segments[j4],start:segments[j4].end,end:segments[j4].start}),used.add(j4),currentEnd=segments[j4].start,foundNext=!0;break}}if(!foundNext){for(let k4=polygon2.length-1;k4>=0;k4--){let idx=segments.indexOf(polygon2[k4]);idx!==-1&&used.delete(idx)}break}}}return polygons},polygonToPoints=polygon2=>{let points=[];for(let segment2 of polygon2)if(segment2.type==="line")points.push(segment2.start);else if(segment2.type==="arc"&&segment2.mid){let arcLength2=getArcLength2(segment2.start,segment2.mid,segment2.end),numPoints=Math.max(3,Math.ceil(arcLength2)),arcPoints=generateArcPath(segment2.start,segment2.mid,segment2.end,numPoints);segment2.reversed&&(arcPoints=arcPoints.reverse()),points.push(...arcPoints.slice(0,-1))}return points};function getSilkscreenFontSizeFromFpTexts(fp_texts){if(!Array.isArray(fp_texts))return null;let refText=fp_texts.find(t52=>t52.layer?.toLowerCase()==="f.silks"&&(t52.text?.includes("${REFERENCE}")||t52.fp_text_type?.toLowerCase()==="reference"||t52.text?.match(/^R\d+|C\d+|U\d+/))),fallbackText=refText||fp_texts.find(t52=>t52.layer?.toLowerCase()==="f.fab"&&(t52.text?.includes("${REFERENCE}")||t52.fp_text_type?.toLowerCase()==="reference")),target=refText||fallbackText;if(!target?.effects?.font?.size)return null;let[width,height]=target.effects.font.size;return height??width??1}var degToRad=deg=>deg*Math.PI/180,rotatePoint4=(x4,y4,deg)=>{let r5=degToRad(deg),cos6=Math.cos(r5),sin6=Math.sin(r5);return{x:x4*cos6-y4*sin6,y:x4*sin6+y4*cos6}},getAxisAlignedRectFromPoints=points=>{let uniquePoints=[...new Map(points.map(p4=>[`${p4.x},${p4.y}`,p4])).values()];if(uniquePoints.length!==4)return null;let xs3=uniquePoints.map(p4=>p4.x),ys3=uniquePoints.map(p4=>p4.y),uniqueXs=[...new Set(xs3)],uniqueYs=[...new Set(ys3)];if(uniqueXs.length!==2||uniqueYs.length!==2)return null;let[minX,maxX]=uniqueXs.sort((a3,b3)=>a3-b3),[minY,maxY]=uniqueYs.sort((a3,b3)=>a3-b3);return minX===void 0||maxX===void 0||minY===void 0||maxY===void 0?null:{x:(minX+maxX)/2,y:(minY+maxY)/2,width:maxX-minX,height:maxY-minY}},fpPolyHasFill=fill=>{if(!fill)return!1;let normalized=fill.toLowerCase();return normalized!=="no"&&normalized!=="none"&&normalized!=="outline"},getRotationDeg=at3=>at3&&Array.isArray(at3)&&at3.length>=3&&typeof at3[2]=="number"?at3[2]:0,isNinetyLike=deg=>{let n4=(deg%360+360)%360;return n4===90||n4===270},normalizePortName=name=>{if(name!=null)return`${name}`},getPinNumber=name=>{let normalized=normalizePortName(name),parsed=normalized!==void 0?Number(normalized):NaN;return Number.isFinite(parsed)?parsed:void 0},debug23=(0,import_debug21.default)("kicad-mod-converter"),convertKicadLayerToTscircuitLayer=kicadLayer=>{switch(kicadLayer.toLowerCase()){case"f.cu":case"f.fab":case"f.silks":case"f.crtyd":case"edge.cuts":return"top";case"b.cu":case"b.fab":case"b.silks":case"b.crtyd":return"bottom"}},convertKicadJsonToTsCircuitSoup=async kicadJson=>{let{fp_lines,fp_rects,fp_texts,fp_arcs,fp_circles,pads,properties,holes,fp_polys}=kicadJson,circuitJson=[];circuitJson.push({type:"source_component",source_component_id:"source_component_0",supplier_part_numbers:{}}),circuitJson.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 portNames=new Set,portNameToPinNumber=new Map;for(let pad2 of pads){let portName=normalizePortName(pad2.name);if(portName){portNames.add(portName);let pinNumber=getPinNumber(pad2.name);pinNumber!==void 0&&portNameToPinNumber.set(portName,pinNumber)}}if(holes)for(let hole of holes){let portName=normalizePortName(hole.name);if(portName){portNames.add(portName);let pinNumber=getPinNumber(hole.name);pinNumber!==void 0&&portNameToPinNumber.set(portName,pinNumber)}}let sourcePortId=0,portNameToSourcePortId=new Map;for(let portName of portNames){let source_port_id=`source_port_${sourcePortId++}`;portNameToSourcePortId.set(portName,source_port_id);let pinNumber=portNameToPinNumber.get(portName);circuitJson.push({type:"source_port",source_port_id,source_component_id:"source_component_0",name:portName,port_hints:[portName],pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0}),circuitJson.push({type:"schematic_port",schematic_port_id:`schematic_port_${sourcePortId++}`,source_port_id,schematic_component_id:"schematic_component_0",center:{x:0,y:0}})}let minX=Number.POSITIVE_INFINITY,maxX=Number.NEGATIVE_INFINITY,minY=Number.POSITIVE_INFINITY,maxY=Number.NEGATIVE_INFINITY;for(let pad2 of pads){let x4=pad2.at[0],y4=-pad2.at[1],w4=pad2.size[0],h6=pad2.size[1];minX=Math.min(minX,x4-w4/2),maxX=Math.max(maxX,x4+w4/2),minY=Math.min(minY,y4-h6/2),maxY=Math.max(maxY,y4+h6/2)}let pcb_component_id="pcb_component_0";circuitJson.push({type:"pcb_component",source_component_id:"source_component_0",pcb_component_id,layer:"top",center:{x:0,y:0},rotation:0,width:Number.isFinite(minX)?maxX-minX:0,height:Number.isFinite(minY)?maxY-minY:0});let pcbPortId=0,portNameToPcbPortId=new Map;for(let portName of portNames){let pcb_port_id=`pcb_port_${pcbPortId++}`,source_port_id=portNameToSourcePortId.get(portName);portNameToPcbPortId.set(portName,pcb_port_id);let x4=0,y4=0,layers=["top","bottom"],pad2=pads.find(p4=>normalizePortName(p4.name)===portName);if(pad2)x4=pad2.at[0],y4=-pad2.at[1],layers=pad2.layers?pad2.layers.map(l4=>convertKicadLayerToTscircuitLayer(l4)).filter(Boolean):["top","bottom"];else if(holes){let hole=holes.find(h6=>normalizePortName(h6.name)===portName);hole&&(x4=hole.at[0],y4=-hole.at[1],layers=hole.layers?hole.layers.map(l4=>convertKicadLayerToTscircuitLayer(l4)).filter(Boolean):["top","bottom"])}circuitJson.push({type:"pcb_port",pcb_port_id,source_port_id,pcb_component_id,x:x4,y:y4,layers})}let smtpadId=0,platedHoleId=0,holeId=0;for(let pad2 of pads){let portName=normalizePortName(pad2.name),pinNumber=portName?portNameToPinNumber.get(portName):void 0;if(pad2.pad_type==="smd"){let rotation5=getRotationDeg(pad2.at),width=isNinetyLike(rotation5)?pad2.size[1]:pad2.size[0],height=isNinetyLike(rotation5)?pad2.size[0]:pad2.size[1],pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${smtpadId++}`,shape:"rect",x:pad2.at[0],y:-pad2.at[1],width,height,layer:convertKicadLayerToTscircuitLayer(pad2.layers?.[0]??"F.Cu"),pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}else if(pad2.pad_type==="thru_hole"){if(pad2.pad_shape==="rect"){let rotation5=getRotationDeg(pad2.at),width=isNinetyLike(rotation5)?pad2.size[1]:pad2.size[0],height=isNinetyLike(rotation5)?pad2.size[0]:pad2.size[1],offX=pad2.drill?.offset?.[0]??0,offY=pad2.drill?.offset?.[1]??0,rotOff=rotatePoint4(offX,offY,rotation5),pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:pad2.at[0],y:-pad2.at[1],hole_offset_x:-rotOff.x,hole_offset_y:-rotOff.y,hole_diameter:pad2.drill?.width,rect_pad_width:width,rect_pad_height:height,layers:["top","bottom"],pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}else if(pad2.pad_shape==="circle"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circle",x:pad2.at[0],y:-pad2.at[1],outer_diameter:pad2.size[0],hole_diameter:pad2.drill?.width,layers:["top","bottom"],pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}else if(pad2.pad_shape==="oval"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"pill",x:pad2.at[0],y:-pad2.at[1],outer_width:pad2.size[0],outer_height:pad2.size[1],hole_width:pad2.drill?.width,hole_height:pad2.drill?.height,layers:["top","bottom"],pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}}else pad2.pad_type==="np_thru_hole"&&pad2.pad_shape==="circle"&&circuitJson.push({type:"pcb_hole",pcb_hole_id:`pcb_hole_${holeId++}`,x:pad2.at[0],y:-pad2.at[1],hole_shape:"circle",hole_diameter:pad2.drill?.width??pad2.size[0],pcb_component_id})}if(holes)for(let hole of holes){let portName=normalizePortName(hole.name),pinNumber=portName?portNameToPinNumber.get(portName):void 0,hasCuLayer=hole.layers?.some(l4=>l4.endsWith(".Cu")||l4==="*.Cu"),rotation5=getRotationDeg(hole.at),offX=hole.drill?.offset?.[0]??0,offY=hole.drill?.offset?.[1]??0,rotOff=rotatePoint4(offX,offY,rotation5),x4=hole.at[0]+rotOff.x,y4=-(hole.at[1]+rotOff.y),holeDiameter=hole.drill?.width??0,outerDiameter=hole.size?.width??holeDiameter,rr3=hole.roundrect_rratio??0,rectBorderRadius=rr3>0?Math.min(isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,isNinetyLike(rotation5)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter)/2*rr3:0;if(hasCuLayer)if(hole.pad_shape==="rect"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:hole.at[0],y:-hole.at[1],hole_offset_x:-rotOff.x,hole_offset_y:-rotOff.y,hole_diameter:holeDiameter,rect_pad_width:isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,rect_pad_height:isNinetyLike(rotation5)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter,rect_border_radius:rectBorderRadius,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else if(hole.pad_shape==="oval"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"pill",x:x4,y:y4,outer_width:isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,outer_height:isNinetyLike(rotation5)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter,hole_width:isNinetyLike(rotation5)?hole.drill?.height??holeDiameter:hole.drill?.width??holeDiameter,hole_height:isNinetyLike(rotation5)?hole.drill?.width??holeDiameter:hole.drill?.height??holeDiameter,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else if(hole.pad_shape==="roundrect"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,offX2=hole.drill?.offset?.[0]??0,offY2=hole.drill?.offset?.[1]??0,rotOff2=rotatePoint4(offX2,offY2,rotation5),width=isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,height=isNinetyLike(rotation5)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:x4,y:y4,hole_offset_x:-rotOff2.x,hole_offset_y:rotOff2.y,hole_diameter:holeDiameter,rect_pad_width:width,rect_pad_height:height,rect_border_radius:rectBorderRadius,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else{let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circle",x:x4,y:y4,outer_diameter:outerDiameter,hole_diameter:holeDiameter,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else circuitJson.push({type:"pcb_hole",pcb_hole_id:`pcb_hole_${holeId++}`,x:x4,y:y4,hole_shape:"circle",hole_diameter:holeDiameter,pcb_component_id})}let edgeCutSegments=[],frontCourtyardSegments=[],backCourtyardSegments=[];for(let fp_line2 of fp_lines){let lowerLayer=fp_line2.layer.toLowerCase();lowerLayer==="edge.cuts"?edgeCutSegments.push({type:"line",start:{x:fp_line2.start[0],y:fp_line2.start[1]},end:{x:fp_line2.end[0],y:fp_line2.end[1]},strokeWidth:fp_line2.stroke.width}):lowerLayer==="f.crtyd"?frontCourtyardSegments.push({type:"line",start:{x:fp_line2.start[0],y:fp_line2.start[1]},end:{x:fp_line2.end[0],y:fp_line2.end[1]},strokeWidth:fp_line2.stroke.width}):lowerLayer==="b.crtyd"&&backCourtyardSegments.push({type:"line",start:{x:fp_line2.start[0],y:fp_line2.start[1]},end:{x:fp_line2.end[0],y:fp_line2.end[1]},strokeWidth:fp_line2.stroke.width})}for(let fp_arc of fp_arcs){let lowerLayer=fp_arc.layer.toLowerCase();lowerLayer==="edge.cuts"?edgeCutSegments.push({type:"arc",start:{x:fp_arc.start[0],y:fp_arc.start[1]},mid:{x:fp_arc.mid[0],y:fp_arc.mid[1]},end:{x:fp_arc.end[0],y:fp_arc.end[1]},strokeWidth:fp_arc.stroke.width}):lowerLayer==="f.crtyd"?frontCourtyardSegments.push({type:"arc",start:{x:fp_arc.start[0],y:fp_arc.start[1]},mid:{x:fp_arc.mid[0],y:fp_arc.mid[1]},end:{x:fp_arc.end[0],y:fp_arc.end[1]},strokeWidth:fp_arc.stroke.width}):lowerLayer==="b.crtyd"&&backCourtyardSegments.push({type:"arc",start:{x:fp_arc.start[0],y:fp_arc.start[1]},mid:{x:fp_arc.mid[0],y:fp_arc.mid[1]},end:{x:fp_arc.end[0],y:fp_arc.end[1]},strokeWidth:fp_arc.stroke.width})}let closedPolygons=findClosedPolygons(edgeCutSegments),cutoutId=0;for(let polygon2 of closedPolygons){let points=polygonToPoints(polygon2);points.length>=3&&circuitJson.push({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_${cutoutId++}`,shape:"polygon",points:points.map(p4=>({x:p4.x,y:-p4.y})),pcb_component_id})}let courtyardOutlineId=0;for(let[segments,layer]of[[frontCourtyardSegments,"top"],[backCourtyardSegments,"bottom"]]){let closedCourtyardPolygons=findClosedPolygons(segments);for(let polygon2 of closedCourtyardPolygons){let points=polygonToPoints(polygon2);points.length>=3&&circuitJson.push({type:"pcb_courtyard_outline",pcb_courtyard_outline_id:`pcb_courtyard_outline_${courtyardOutlineId++}`,layer,pcb_component_id,outline:points.map(p4=>({x:p4.x,y:-p4.y}))})}}if(fp_rects)for(let fp_rect of fp_rects){let lowerLayer=fp_rect.layer.toLowerCase();if(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"){let x12=fp_rect.start[0],y12=fp_rect.start[1],x22=fp_rect.end[0],y22=fp_rect.end[1];circuitJson.push({type:"pcb_courtyard_rect",pcb_courtyard_rect_id:`pcb_courtyard_rect_${courtyardOutlineId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_rect.layer),center:{x:(x12+x22)/2,y:-((y12+y22)/2)},width:Math.abs(x22-x12),height:Math.abs(y22-y12)})}else debug23("Unhandled layer for fp_rect",fp_rect.layer)}let traceId=0,silkPathId=0,fabPathId=0,noteLineId=0;for(let fp_line2 of fp_lines){let route=[{x:fp_line2.start[0],y:-fp_line2.start[1]},{x:fp_line2.end[0],y:-fp_line2.end[1]}],lowerLayer=fp_line2.layer.toLowerCase();lowerLayer==="f.cu"?circuitJson.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${traceId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_line2.layer),route,thickness:fp_line2.stroke.width}):lowerLayer==="f.silks"?circuitJson.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${silkPathId++}`,pcb_component_id,layer:"top",route,stroke_width:fp_line2.stroke.width}):lowerLayer==="edge.cuts"?debug23("Skipping Edge.Cuts fp_line (converted to pcb_cutout)",fp_line2.layer):lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"?debug23("Skipping CrtYd fp_line (converted to pcb_courtyard_outline)",fp_line2.layer):lowerLayer==="f.fab"?circuitJson.push({type:"pcb_fabrication_note_path",fabrication_note_path_id:`fabrication_note_path_${fabPathId++}`,pcb_component_id,layer:"top",route,stroke_width:fp_line2.stroke.width,port_hints:[]}):lowerLayer.startsWith("user.")?circuitJson.push({type:"pcb_note_line",pcb_note_line_id:`pcb_note_line_${noteLineId++}`,pcb_component_id,x1:fp_line2.start[0],y1:-fp_line2.start[1],x2:fp_line2.end[0],y2:-fp_line2.end[1],stroke_width:fp_line2.stroke.width}):debug23("Unhandled layer for fp_line",fp_line2.layer)}if(fp_polys)for(let fp_poly of fp_polys){let route=[],pushRoutePoint=point42=>{!Number.isFinite(point42.x)||!Number.isFinite(point42.y)||route.push(point42)};for(let segment2 of fp_poly.pts){if(Array.isArray(segment2)){pushRoutePoint({x:segment2[0],y:-segment2[1]});continue}if(segment2&&typeof segment2=="object"&&"kind"in segment2){if(segment2.kind==="arc"){let start=makePoint(segment2.start),mid=makePoint(segment2.mid),end=makePoint(segment2.end),arcLength2=getArcLength2(start,mid,end),adjustedNumPoints=Math.max(2,Math.ceil(arcLength2/.1)),arcPoints=generateArcPath(start,mid,end,adjustedNumPoints).map(p4=>({x:p4.x,y:-p4.y}));for(let point42 of arcPoints)pushRoutePoint(point42)}continue}}let routePoints=route,polygonPoints=routePoints.length>2&&routePoints[0].x===routePoints[routePoints.length-1].x&&routePoints[0].y===routePoints[routePoints.length-1].y?routePoints.slice(0,-1):routePoints;if(routePoints.length===0)continue;let strokeWidth=fp_poly.stroke?.width??0;if(fp_poly.layer.endsWith(".Cu")){let rect=getAxisAlignedRectFromPoints(polygonPoints);rect?circuitJson.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${smtpadId++}`,shape:"rect",x:rect.x,y:rect.y,width:rect.width,height:rect.height,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id}):fpPolyHasFill(fp_poly.fill)?polygonPoints.length>=3?circuitJson.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${smtpadId++}`,shape:"polygon",points:polygonPoints,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id}):polygonPoints.length>=2&&circuitJson.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${traceId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:polygonPoints,thickness:strokeWidth}):polygonPoints.length>=2&&circuitJson.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${traceId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:polygonPoints,thickness:strokeWidth})}else fp_poly.layer.endsWith(".SilkS")?circuitJson.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${silkPathId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:routePoints,stroke_width:strokeWidth}):fp_poly.layer.endsWith(".Fab")?circuitJson.push({type:"pcb_fabrication_note_path",fabrication_note_path_id:`fabrication_note_path_${fabPathId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:polygonPoints,stroke_width:strokeWidth,port_hints:[]}):fp_poly.layer.toLowerCase().endsWith(".crtyd")?polygonPoints.length>=3&&circuitJson.push({type:"pcb_courtyard_polygon",pcb_courtyard_polygon_id:`pcb_courtyard_polygon_${courtyardOutlineId++}`,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id,points:polygonPoints}):debug23("Unhandled layer for fp_poly",fp_poly.layer)}let notePathId=0;for(let fp_arc of fp_arcs){let lowerLayer=fp_arc.layer.toLowerCase();if(lowerLayer==="edge.cuts"){debug23("Skipping Edge.Cuts fp_arc (converted to pcb_cutout)",fp_arc.layer);continue}if(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"){debug23("Skipping CrtYd fp_arc (converted to pcb_courtyard_outline)",fp_arc.layer);continue}let start=makePoint(fp_arc.start),mid=makePoint(fp_arc.mid),end=makePoint(fp_arc.end),arcLength2=getArcLength2(start,mid,end),arcPoints=generateArcPath(start,mid,end,Math.ceil(arcLength2));if(lowerLayer.startsWith("user.")){circuitJson.push({type:"pcb_note_path",pcb_note_path_id:`pcb_note_path_${notePathId++}`,pcb_component_id,route:arcPoints.map(p4=>({x:p4.x,y:-p4.y})),stroke_width:fp_arc.stroke.width});continue}let tscircuitLayer=convertKicadLayerToTscircuitLayer(fp_arc.layer);if(!tscircuitLayer){debug23("Unable to convert layer for fp_arc",fp_arc.layer);continue}circuitJson.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${silkPathId++}`,layer:tscircuitLayer,pcb_component_id,route:arcPoints.map(p4=>({x:p4.x,y:-p4.y})),stroke_width:fp_arc.stroke.width})}if(fp_circles)for(let fp_circle of fp_circles){let lowerLayer=fp_circle.layer.toLowerCase(),center2=makePoint(fp_circle.center),endPoint=makePoint(fp_circle.end),radius=Math.sqrt((endPoint.x-center2.x)**2+(endPoint.y-center2.y)**2),numPoints=Math.max(16,Math.ceil(2*Math.PI*radius)),circlePoints=[];for(let i3=0;i3<=numPoints;i3++){let angle=i3/numPoints*2*Math.PI;circlePoints.push({x:center2.x+radius*Math.cos(angle),y:center2.y+radius*Math.sin(angle)})}lowerLayer.startsWith("user.")?circuitJson.push({type:"pcb_note_path",pcb_note_path_id:`pcb_note_path_${notePathId++}`,pcb_component_id,route:circlePoints.map(p4=>({x:p4.x,y:-p4.y})),stroke_width:fp_circle.stroke.width}):(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd")&&circuitJson.push({type:"pcb_courtyard_circle",pcb_courtyard_circle_id:`pcb_courtyard_circle_${courtyardOutlineId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_circle.layer),center:{x:center2.x,y:-center2.y},radius})}for(let fp_text of fp_texts){let layerRef=convertKicadLayerToTscircuitLayer(fp_text.layer);fp_text.layer.endsWith(".SilkS")?circuitJson.push({type:"pcb_silkscreen_text",layer:layerRef,font:"tscircuit2024",font_size:fp_text.effects?.font?.size[0]??1,pcb_component_id,anchor_position:{x:fp_text.at[0],y:-fp_text.at[1]},anchor_alignment:"center",text:fp_text.text}):fp_text.layer.endsWith(".Fab")?circuitJson.push({type:"pcb_fabrication_note_text",layer:layerRef,font:"tscircuit2024",font_size:fp_text.effects?.font?.size[0]??1,pcb_component_id,anchor_position:{x:fp_text.at[0],y:-fp_text.at[1]},anchor_alignment:"center",text:fp_text.text}):debug23("Unhandled layer for fp_text",fp_text.layer)}let refProp=properties.find(prop=>prop.key==="Reference"),valProp=properties.find(prop=>prop.key==="Value"),propFabTexts=[refProp,valProp].filter(p4=>p4&&!!p4.val);for(let propFab of propFabTexts){let at3=propFab.attributes.at;if(!at3)continue;let isFabLayer=propFab.attributes.layer?.toLowerCase()?.endsWith(".fab"),font_size=getSilkscreenFontSizeFromFpTexts(fp_texts);circuitJson.push({type:isFabLayer?"pcb_fabrication_note_text":"pcb_silkscreen_text",layer:"top",font:"tscircuit2024",font_size,pcb_component_id,anchor_position:{x:at3[0],y:-at3[1]},anchor_alignment:"center",text:propFab.val})}return circuitJson},parseKicadModToCircuitJson=async kicadMod=>{let kicadJson=parseKicadModToKicadJson(kicadMod);return await convertKicadJsonToTsCircuitSoup(kicadJson)};var transformJsDelivrImports=code=>code.replace(/from\s*["']\/npm\//g,'from "https://cdn.jsdelivr.net/npm/').replace(/import\s*\(\s*["']\/npm\//g,'import("https://cdn.jsdelivr.net/npm/'),dynamicallyLoadDependencyWithCdnBackup=async packageName=>{try{return(await import(packageName)).default}catch{console.log(`Failed to load ${packageName} locally, trying CDN fallback...`);try{let res2=await fetch(`https://cdn.jsdelivr.net/npm/${packageName}/+esm`);if(!res2.ok)throw new Error(`Failed to fetch ${packageName} from CDN: ${res2.statusText}`);let code=await res2.text();code=transformJsDelivrImports(code);let blob=new Blob([code],{type:"application/javascript"}),url2=URL.createObjectURL(blob);try{let{default:loadedModule}=await import(url2);return loadedModule}finally{URL.revokeObjectURL(url2)}}catch(cdnError){throw console.error(`CDN fallback for ${packageName} also failed:`,cdnError),cdnError}}};init_dist6();function tokenize3(input2){let tokens=[],i3=0,isWhitespace2=ch3=>/\s/.test(ch3),isSymbolInitial=ch3=>/[^\s()"]/u.test(ch3),peek=()=>i3<input2.length?input2[i3]:void 0,advance=()=>{if(i3>=input2.length)throw new SyntaxError("Unexpected end of input");return input2[i3++]};for(;i3<input2.length;){let ch3=peek();if(ch3===void 0)break;let current3=ch3;if(isWhitespace2(current3)){i3++;continue}if(current3===";"){for(;i3<input2.length&&input2[i3]!==`
710
+ at `+loc}return str};peg$SyntaxError3.buildMessage=function(expected,found){var DESCRIBE_EXPECTATION_FNS={literal:function(expectation){return'"'+literalEscape(expectation.text)+'"'},class:function(expectation){var escapedParts=expectation.parts.map(function(part){return Array.isArray(part)?classEscape(part[0])+"-"+classEscape(part[1]):classEscape(part)});return"["+(expectation.inverted?"^":"")+escapedParts.join("")+"]"},any:function(){return"any character"},end:function(){return"end of input"},other:function(expectation){return expectation.description}};function hex(ch3){return ch3.charCodeAt(0).toString(16).toUpperCase()}function literalEscape(s3){return s3.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch3){return"\\x0"+hex(ch3)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch3){return"\\x"+hex(ch3)})}function classEscape(s3){return s3.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch3){return"\\x0"+hex(ch3)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch3){return"\\x"+hex(ch3)})}function describeExpectation(expectation){return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation)}function describeExpected(expected2){var descriptions=expected2.map(describeExpectation),i3,j4;if(descriptions.sort(),descriptions.length>0){for(i3=1,j4=1;i3<descriptions.length;i3++)descriptions[i3-1]!==descriptions[i3]&&(descriptions[j4]=descriptions[i3],j4++);descriptions.length=j4}switch(descriptions.length){case 1:return descriptions[0];case 2:return descriptions[0]+" or "+descriptions[1];default:return descriptions.slice(0,-1).join(", ")+", or "+descriptions[descriptions.length-1]}}function describeFound(found2){return found2?'"'+literalEscape(found2)+'"':"end of input"}return"Expected "+describeExpected(expected)+" but "+describeFound(found)+" found."};function decomposeTSR3(matrix2,flipX=!1,flipY2=!1){flipX?flipY2?matrix2=compose4(matrix2,scale4(-1,-1)):matrix2=compose4(matrix2,scale4(1,-1)):flipY2&&(matrix2=compose4(matrix2,scale4(-1,1)));let a3=matrix2.a,b3=matrix2.b,c4=matrix2.c,d4=matrix2.d,scaleX,scaleY,rotation22;if(a3!==0||c4!==0){let hypotAc=Math.hypot(a3,c4);scaleX=hypotAc,scaleY=(a3*d4-b3*c4)/hypotAc;let acos=Math.acos(a3/hypotAc);rotation22=c4>0?-acos:acos}else if(b3!==0||d4!==0){let hypotBd=Math.hypot(b3,d4);scaleX=(a3*d4-b3*c4)/hypotBd,scaleY=hypotBd;let acos=Math.acos(b3/hypotBd);rotation22=Math.PI/2+(d4>0?-acos:acos)}else scaleX=0,scaleY=0,rotation22=0;return flipY2&&(scaleX=-scaleX),flipX&&(scaleY=-scaleY),{translate:{tx:matrix2.e,ty:matrix2.f},scale:{sx:scaleX,sy:scaleY},rotation:{angle:rotation22}}}function connect2(map,a3,b3){if(!a3||!b3)return;let setA=map.get(a3);setA||(setA=new Set,map.set(a3,setA)),setA.add(b3);let setB=map.get(b3);setB||(setB=new Set,map.set(b3,setB)),setB.add(a3)}function buildSubtree2(soup,opts){if(!opts.subcircuit_id&&!opts.source_group_id)return[...soup];let effectiveOpts=opts;if(opts.subcircuit_id){let subcircuitIds=new Set([opts.subcircuit_id]),groupChildren=new Map,groupSubcircuit=new Map;for(let elm of soup)if(elm.type==="source_group"){let groupId=elm.source_group_id,subcircuitId=elm.subcircuit_id;subcircuitId&&groupSubcircuit.set(groupId,subcircuitId);let parentId=elm.parent_source_group_id;parentId&&(groupChildren.has(parentId)||groupChildren.set(parentId,[]),groupChildren.get(parentId).push(groupId))}let rootGroupId;for(let[groupId,subcircuitId]of groupSubcircuit)if(subcircuitId===opts.subcircuit_id){rootGroupId=groupId;break}if(rootGroupId){let collectChildSubcircuits=groupId=>{let children=groupChildren.get(groupId)||[];for(let childId of children){let childSubcircuit=groupSubcircuit.get(childId);childSubcircuit&&subcircuitIds.add(childSubcircuit),collectChildSubcircuits(childId)}};collectChildSubcircuits(rootGroupId),effectiveOpts={...opts,subcircuit_ids:Array.from(subcircuitIds)}}}let idMap=new Map;for(let elm of soup){let idKey=`${elm.type}_id`,idVal=elm[idKey];typeof idVal=="string"&&idMap.set(idVal,elm)}let adj=new Map;for(let elm of soup){let entries=Object.entries(elm);for(let[key,val]of entries)if(key!=="parent_source_group_id"){if(key.endsWith("_id")&&typeof val=="string"){let other=idMap.get(val);connect2(adj,elm,other)}else if(key.endsWith("_ids")&&Array.isArray(val)){for(let v4 of val)if(typeof v4=="string"){let other=idMap.get(v4);connect2(adj,elm,other)}}}}let queue=[],included=new Set;for(let elm of soup){let shouldInclude=!1;(effectiveOpts.subcircuit_id&&"subcircuit_id"in elm&&elm.subcircuit_id===effectiveOpts.subcircuit_id||effectiveOpts.subcircuit_ids&&"subcircuit_id"in elm&&elm.subcircuit_id&&effectiveOpts.subcircuit_ids.includes(elm.subcircuit_id)||effectiveOpts.source_group_id&&"source_group_id"in elm&&elm.source_group_id===effectiveOpts.source_group_id||effectiveOpts.source_group_id&&"member_source_group_ids"in elm&&Array.isArray(elm.member_source_group_ids)&&elm.member_source_group_ids.includes(effectiveOpts.source_group_id))&&(shouldInclude=!0),shouldInclude&&(queue.push(elm),included.add(elm))}for(;queue.length>0;){let elm=queue.shift(),neighbors=adj.get(elm);if(neighbors)for(let n4 of neighbors)included.has(n4)||(included.add(n4),queue.push(n4))}return soup.filter(e5=>included.has(e5))}var cju2=(circuitJsonInput,options={})=>{let circuitJson=circuitJsonInput,internalStore=circuitJson._internal_store;if(!internalStore){internalStore={counts:{},editCount:0},circuitJson._internal_store=internalStore;for(let elm of circuitJson){let type=elm.type,idVal=elm[`${type}_id`];if(!idVal)continue;let idNum=Number.parseInt(idVal.split("_").pop());Number.isNaN(idNum)||(internalStore.counts[type]=Math.max(internalStore.counts[type]??0,idNum))}}let su22=new Proxy({},{get:(proxy_target,prop)=>{if(prop==="toArray")return()=>(circuitJson.editCount=internalStore.editCount,circuitJson);if(prop==="editCount")return internalStore.editCount;if(prop==="subtree")return opts=>cju2(buildSubtree2(circuitJson,opts),options);if(prop==="insert")return elm=>{var _a463;let component_type2=elm.type;if(!component_type2)throw new Error("insert requires an element with a type");(_a463=internalStore.counts)[component_type2]??(_a463[component_type2]=-1),internalStore.counts[component_type2]++;let index=internalStore.counts[component_type2],newElm={...elm,type:component_type2,[`${component_type2}_id`]:`${component_type2}_${index}`};return options.validateInserts&&(dist_exports6[component_type2]??any_soup_element2).parse(newElm),circuitJson.push(newElm),internalStore.editCount++,newElm};if(prop==="insertAll")return elms=>elms.map(elm=>su22.insert(elm));let component_type=prop;return{get:id2=>circuitJson.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2),getUsing:using=>{let keys=Object.keys(using);if(keys.length!==1)throw new Error("getUsing requires exactly one key, e.g. { pcb_component_id }");let join_key=keys[0],join_type=join_key.replace("_id",""),joiner=circuitJson.find(e5=>e5.type===join_type&&e5[join_key]===using[join_key]);return joiner?circuitJson.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===joiner[`${component_type}_id`]):null},getWhere:where=>{let keys=Object.keys(where);return circuitJson.find(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))},list:where=>{let keys=where?Object.keys(where):[];return circuitJson.filter(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))},insert:elm=>{var _a463;(_a463=internalStore.counts)[component_type]??(_a463[component_type]=-1),internalStore.counts[component_type]++;let index=internalStore.counts[component_type],newElm={type:component_type,[`${component_type}_id`]:`${component_type}_${index}`,...elm};return options.validateInserts&&(dist_exports6[component_type]??any_soup_element2).parse(newElm),circuitJson.push(newElm),internalStore.editCount++,newElm},delete:id2=>{let elm=circuitJson.find(e5=>e5[`${component_type}_id`]===id2);elm&&(circuitJson.splice(circuitJson.indexOf(elm),1),internalStore.editCount++)},update:(id2,newProps)=>{let elm=circuitJson.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2);return elm?(Object.assign(elm,newProps),internalStore.editCount++,elm):null},select:selector=>{if(component_type==="source_component")return circuitJson.find(e5=>e5.type==="source_component"&&e5.name===selector.replace(/\./g,""));if(component_type==="pcb_port"||component_type==="source_port"||component_type==="schematic_port"){let[component_name,port_selector]=selector.replace(/\./g,"").split(/[\s\>]+/),source_component=circuitJson.find(e5=>e5.type==="source_component"&&e5.name===component_name);if(!source_component)return null;let source_port22=circuitJson.find(e5=>e5.type==="source_port"&&e5.source_component_id===source_component.source_component_id&&(e5.name===port_selector||(e5.port_hints??[]).includes(port_selector)));if(!source_port22)return null;if(component_type==="source_port")return source_port22;if(component_type==="pcb_port")return circuitJson.find(e5=>e5.type==="pcb_port"&&e5.source_port_id===source_port22.source_port_id);if(component_type==="schematic_port")return circuitJson.find(e5=>e5.type==="schematic_port"&&e5.source_port_id===source_port22.source_port_id)}}}}});return su22};cju2.unparsed=cju2;function createIdKey2(element){let type=element.type;return`${type}:${element[`${type}_id`]}`}var cjuIndexed2=(soup,options={})=>{let internalStore=soup._internal_store_indexed;if(!internalStore){internalStore={counts:{},editCount:0,indexes:{}};for(let elm of soup){let type=elm.type,idVal=elm[`${type}_id`];if(!idVal)continue;let idNum=Number.parseInt(idVal.split("_").pop()||"");Number.isNaN(idNum)||(internalStore.counts[type]=Math.max(internalStore.counts[type]??0,idNum))}let indexConfig=options.indexConfig||{},indexes=internalStore.indexes;if(indexConfig.byId&&(indexes.byId=new Map),indexConfig.byType&&(indexes.byType=new Map),indexConfig.byRelation&&(indexes.byRelation=new Map),indexConfig.bySubcircuit&&(indexes.bySubcircuit=new Map),indexConfig.byCustomField&&indexConfig.byCustomField.length>0){indexes.byCustomField=new Map;for(let field of indexConfig.byCustomField)indexes.byCustomField.set(field,new Map)}for(let element of soup){if(indexConfig.byId){let idKey=createIdKey2(element);indexes.byId.set(idKey,element)}if(indexConfig.byType){let elementsOfType=indexes.byType.get(element.type)||[];elementsOfType.push(element),indexes.byType.set(element.type,elementsOfType)}if(indexConfig.byRelation){let elementEntries=Object.entries(element);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${element.type}_id`&&typeof value=="string"){let relationTypeMap=indexes.byRelation.get(key)||new Map,relatedElements=relationTypeMap.get(value)||[];relatedElements.push(element),relationTypeMap.set(value,relatedElements),indexes.byRelation.set(key,relationTypeMap)}}if(indexConfig.bySubcircuit&&"subcircuit_id"in element){let subcircuitId=element.subcircuit_id;if(subcircuitId&&typeof subcircuitId=="string"){let subcircuitElements=indexes.bySubcircuit.get(subcircuitId)||[];subcircuitElements.push(element),indexes.bySubcircuit.set(subcircuitId,subcircuitElements)}}if(indexConfig.byCustomField&&indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in element){let fieldValue=element[field];if(fieldValue!==void 0&&(typeof fieldValue=="string"||typeof fieldValue=="number")){let fieldValueStr=String(fieldValue),fieldMap=indexes.byCustomField.get(field),elementsWithFieldValue=fieldMap.get(fieldValueStr)||[];elementsWithFieldValue.push(element),fieldMap.set(fieldValueStr,elementsWithFieldValue)}}}}soup._internal_store_indexed=internalStore}return new Proxy({},{get:(proxy_target,prop)=>{if(prop==="toArray")return()=>(soup.editCount=internalStore.editCount,soup);if(prop==="editCount")return internalStore.editCount;let component_type=prop;return{get:id2=>{let indexConfig=options.indexConfig||{};return indexConfig.byId&&internalStore.indexes.byId?internalStore.indexes.byId.get(`${component_type}:${id2}`)||null:indexConfig.byType&&internalStore.indexes.byType?(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===id2)||null:soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2)||null},getUsing:using=>{let indexConfig=options.indexConfig||{},keys=Object.keys(using);if(keys.length!==1)throw new Error("getUsing requires exactly one key, e.g. { pcb_component_id }");let join_key=keys[0],join_type=join_key.replace("_id","");if(indexConfig.byRelation&&internalStore.indexes.byRelation){let relationMap=internalStore.indexes.byRelation.get(join_key);if(relationMap){let joiner2=(relationMap.get(using[join_key])||[]).find(e5=>e5.type===join_type);if(!joiner2)return null;let joinerId=joiner2[`${component_type}_id`];return indexConfig.byId&&internalStore.indexes.byId?internalStore.indexes.byId.get(`${component_type}:${joinerId}`)||null:indexConfig.byType&&internalStore.indexes.byType?(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===joinerId)||null:soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===joinerId)||null}}let joiner=soup.find(e5=>e5.type===join_type&&e5[join_key]===using[join_key]);return joiner&&soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===joiner[`${component_type}_id`])||null},getWhere:where=>{let indexConfig=options.indexConfig||{},keys=Object.keys(where);if(keys.length===1&&indexConfig.byCustomField&&internalStore.indexes.byCustomField){let field=keys[0],fieldMap=internalStore.indexes.byCustomField.get(field);if(fieldMap){let fieldValue=String(where[field]);return(fieldMap.get(fieldValue)||[]).find(e5=>e5.type===component_type)||null}}if("subcircuit_id"in where&&indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit){let subcircuitId=where.subcircuit_id;return(internalStore.indexes.bySubcircuit.get(subcircuitId)||[]).find(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))||null}return indexConfig.byType&&internalStore.indexes.byType?(internalStore.indexes.byType.get(component_type)||[]).find(e5=>keys.every(key=>e5[key]===where[key]))||null:soup.find(e5=>e5.type===component_type&&keys.every(key=>e5[key]===where[key]))||null},list:where=>{let indexConfig=options.indexConfig||{},keys=where?Object.keys(where):[];if(keys.length===0&&indexConfig.byType&&internalStore.indexes.byType)return internalStore.indexes.byType.get(component_type)||[];if(keys.length===1&&keys[0]==="subcircuit_id"&&indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit){let subcircuitId=where.subcircuit_id;return(internalStore.indexes.bySubcircuit.get(subcircuitId)||[]).filter(e5=>e5.type===component_type)}let elementsToFilter;return indexConfig.byType&&internalStore.indexes.byType?elementsToFilter=internalStore.indexes.byType.get(component_type)||[]:elementsToFilter=soup.filter(e5=>e5.type===component_type),keys.length>0?elementsToFilter.filter(e5=>keys.every(key=>e5[key]===where[key])):elementsToFilter},insert:elm=>{var _a463;(_a463=internalStore.counts)[component_type]??(_a463[component_type]=-1),internalStore.counts[component_type]++;let index=internalStore.counts[component_type],newElm={type:component_type,[`${component_type}_id`]:`${component_type}_${index}`,...elm};options.validateInserts&&(dist_exports6[component_type]??any_soup_element2).parse(newElm),soup.push(newElm),internalStore.editCount++;let indexConfig=options.indexConfig||{};if(indexConfig.byId&&internalStore.indexes.byId){let idKey=createIdKey2(newElm);internalStore.indexes.byId.set(idKey,newElm)}if(indexConfig.byType&&internalStore.indexes.byType){let elementsOfType=internalStore.indexes.byType.get(component_type)||[];elementsOfType.push(newElm),internalStore.indexes.byType.set(component_type,elementsOfType)}if(indexConfig.byRelation&&internalStore.indexes.byRelation){let elementEntries=Object.entries(newElm);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${newElm.type}_id`&&typeof value=="string"){let relationTypeMap=internalStore.indexes.byRelation.get(key)||new Map,relatedElements=relationTypeMap.get(value)||[];relatedElements.push(newElm),relationTypeMap.set(value,relatedElements),internalStore.indexes.byRelation.set(key,relationTypeMap)}}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in newElm){let subcircuitId=newElm.subcircuit_id;if(subcircuitId&&typeof subcircuitId=="string"){let subcircuitElements=internalStore.indexes.bySubcircuit.get(subcircuitId)||[];subcircuitElements.push(newElm),internalStore.indexes.bySubcircuit.set(subcircuitId,subcircuitElements)}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in newElm){let fieldValue=newElm[field];if(fieldValue!==void 0&&(typeof fieldValue=="string"||typeof fieldValue=="number")){let fieldValueStr=String(fieldValue),fieldMap=internalStore.indexes.byCustomField.get(field),elementsWithFieldValue=fieldMap.get(fieldValueStr)||[];elementsWithFieldValue.push(newElm),fieldMap.set(fieldValueStr,elementsWithFieldValue)}}}return newElm},delete:id2=>{let indexConfig=options.indexConfig||{},elm;if(indexConfig.byId&&internalStore.indexes.byId?elm=internalStore.indexes.byId.get(`${component_type}:${id2}`):indexConfig.byType&&internalStore.indexes.byType?elm=(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===id2):elm=soup.find(e5=>e5[`${component_type}_id`]===id2),!elm)return;let elmIndex=soup.indexOf(elm);if(elmIndex>=0&&(soup.splice(elmIndex,1),internalStore.editCount++),indexConfig.byId&&internalStore.indexes.byId){let idKey=createIdKey2(elm);internalStore.indexes.byId.delete(idKey)}if(indexConfig.byType&&internalStore.indexes.byType){let filteredElements=(internalStore.indexes.byType.get(component_type)||[]).filter(e5=>e5[`${component_type}_id`]!==id2);internalStore.indexes.byType.set(component_type,filteredElements)}if(indexConfig.byRelation&&internalStore.indexes.byRelation)for(let[relationKey,relationMap]of internalStore.indexes.byRelation.entries())for(let[relationValue,elements]of relationMap.entries()){let updatedElements=elements.filter(e5=>e5!==elm);updatedElements.length===0?relationMap.delete(relationValue):relationMap.set(relationValue,updatedElements)}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in elm){let subcircuitId=elm.subcircuit_id;if(subcircuitId){let updatedElements=(internalStore.indexes.bySubcircuit.get(subcircuitId)||[]).filter(e5=>e5!==elm);updatedElements.length===0?internalStore.indexes.bySubcircuit.delete(subcircuitId):internalStore.indexes.bySubcircuit.set(subcircuitId,updatedElements)}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField)for(let fieldMap of internalStore.indexes.byCustomField.values())for(let[fieldValue,elements]of fieldMap.entries()){let updatedElements=elements.filter(e5=>e5!==elm);updatedElements.length===0?fieldMap.delete(fieldValue):fieldMap.set(fieldValue,updatedElements)}},update:(id2,newProps)=>{let indexConfig=options.indexConfig||{},elm;if(indexConfig.byId&&internalStore.indexes.byId?elm=internalStore.indexes.byId.get(`${component_type}:${id2}`):indexConfig.byType&&internalStore.indexes.byType?elm=(internalStore.indexes.byType.get(component_type)||[]).find(e5=>e5[`${component_type}_id`]===id2):elm=soup.find(e5=>e5.type===component_type&&e5[`${component_type}_id`]===id2),!elm)return null;if(indexConfig.byRelation&&internalStore.indexes.byRelation){let elementEntries=Object.entries(elm);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${elm.type}_id`&&typeof value=="string"&&key in newProps&&newProps[key]!==value){let relationTypeMap=internalStore.indexes.byRelation.get(key);if(relationTypeMap){let updatedElements=(relationTypeMap.get(value)||[]).filter(e5=>e5!==elm);updatedElements.length===0?relationTypeMap.delete(value):relationTypeMap.set(value,updatedElements)}}}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in elm&&"subcircuit_id"in newProps){let oldSubcircuitId=elm.subcircuit_id,newSubcircuitId=newProps.subcircuit_id;if(oldSubcircuitId!==newSubcircuitId){let updatedElements=(internalStore.indexes.bySubcircuit.get(oldSubcircuitId)||[]).filter(e5=>e5!==elm);updatedElements.length===0?internalStore.indexes.bySubcircuit.delete(oldSubcircuitId):internalStore.indexes.bySubcircuit.set(oldSubcircuitId,updatedElements)}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in elm&&field in newProps&&elm[field]!==newProps[field]){let fieldMap=internalStore.indexes.byCustomField.get(field);if(fieldMap){let oldValue=String(elm[field]),updatedElements=(fieldMap.get(oldValue)||[]).filter(e5=>e5!==elm);updatedElements.length===0?fieldMap.delete(oldValue):fieldMap.set(oldValue,updatedElements)}}}if(Object.assign(elm,newProps),internalStore.editCount++,indexConfig.byRelation&&internalStore.indexes.byRelation){let elementEntries=Object.entries(elm);for(let[key,value]of elementEntries)if(key.endsWith("_id")&&key!==`${elm.type}_id`&&typeof value=="string"&&key in newProps){let relationTypeMap=internalStore.indexes.byRelation.get(key)||new Map,relatedElements=relationTypeMap.get(value)||[];relatedElements.includes(elm)||(relatedElements.push(elm),relationTypeMap.set(value,relatedElements),internalStore.indexes.byRelation.set(key,relationTypeMap))}}if(indexConfig.bySubcircuit&&internalStore.indexes.bySubcircuit&&"subcircuit_id"in elm&&"subcircuit_id"in newProps){let subcircuitId=elm.subcircuit_id;if(subcircuitId&&typeof subcircuitId=="string"){let subcircuitElements=internalStore.indexes.bySubcircuit.get(subcircuitId)||[];subcircuitElements.includes(elm)||(subcircuitElements.push(elm),internalStore.indexes.bySubcircuit.set(subcircuitId,subcircuitElements))}}if(indexConfig.byCustomField&&internalStore.indexes.byCustomField){for(let field of indexConfig.byCustomField)if(field in elm&&field in newProps){let fieldValue=elm[field];if(fieldValue!==void 0&&(typeof fieldValue=="string"||typeof fieldValue=="number")){let fieldValueStr=String(fieldValue),fieldMap=internalStore.indexes.byCustomField.get(field),elementsWithFieldValue=fieldMap.get(fieldValueStr)||[];elementsWithFieldValue.includes(elm)||(elementsWithFieldValue.push(elm),fieldMap.set(fieldValueStr,elementsWithFieldValue))}}}return elm},select:selector=>{if(component_type==="source_component")return soup.find(e5=>e5.type==="source_component"&&e5.name===selector.replace(/\./g,""))||null;if(component_type==="pcb_port"||component_type==="source_port"||component_type==="schematic_port"){let[component_name,port_selector]=selector.replace(/\./g,"").split(/[\s\>]+/),source_component=soup.find(e5=>e5.type==="source_component"&&e5.name===component_name);if(!source_component)return null;let source_port22=soup.find(e5=>e5.type==="source_port"&&e5.source_component_id===source_component.source_component_id&&(e5.name===port_selector||(e5.port_hints??[]).includes(port_selector)));if(!source_port22)return null;if(component_type==="source_port")return source_port22;if(component_type==="pcb_port")return soup.find(e5=>e5.type==="pcb_port"&&e5.source_port_id===source_port22.source_port_id)||null;if(component_type==="schematic_port")return soup.find(e5=>e5.type==="schematic_port"&&e5.source_port_id===source_port22.source_port_id)||null}return null}}}})};cjuIndexed2.unparsed=cjuIndexed2;var transformPCBElement2=(elm,matrix2)=>{let tsr=decomposeTSR3(matrix2),flipPadWidthHeight=Math.round(tsr.rotation.angle/(Math.PI/2))%2===1;if(elm.type==="pcb_plated_hole"||elm.type==="pcb_hole"||elm.type==="pcb_via"||elm.type==="pcb_smtpad"||elm.type==="pcb_port"){let{x:x4,y:y4}=applyToPoint4(matrix2,{x:Number(elm.x),y:Number(elm.y)});elm.x=x4,elm.y=y4,elm.type==="pcb_smtpad"&&elm.shape==="polygon"&&Array.isArray(elm.points)&&(elm.points=elm.points.map(point23=>{let tp3=applyToPoint4(matrix2,{x:point23.x,y:point23.y});return{x:tp3.x,y:tp3.y}}))}else if(elm.type==="pcb_keepout"||elm.type==="pcb_board")elm.center=applyToPoint4(matrix2,elm.center);else if(elm.type==="pcb_silkscreen_text"||elm.type==="pcb_fabrication_note_text"||elm.type==="pcb_note_text")elm.anchor_position=applyToPoint4(matrix2,elm.anchor_position);else if(elm.type==="pcb_silkscreen_circle"||elm.type==="pcb_silkscreen_rect"||elm.type==="pcb_note_rect"||elm.type==="pcb_courtyard_rect"||elm.type==="pcb_courtyard_circle")elm.center=applyToPoint4(matrix2,elm.center);else if(elm.type==="pcb_component")elm.center=applyToPoint4(matrix2,elm.center),elm.rotation=elm.rotation+tsr.rotation.angle/Math.PI*180,elm.rotation=elm.rotation%360,flipPadWidthHeight&&([elm.width,elm.height]=[elm.height,elm.width]);else if(elm.type==="pcb_courtyard_outline")elm.outline=elm.outline.map(p4=>{let tp3=applyToPoint4(matrix2,p4);return p4.x=tp3.x,p4.y=tp3.y,p4});else if(elm.type==="pcb_courtyard_polygon")elm.points=elm.points.map(p4=>{let tp3=applyToPoint4(matrix2,p4);return p4.x=tp3.x,p4.y=tp3.y,p4});else if(elm.type==="pcb_silkscreen_path"||elm.type==="pcb_trace"||elm.type==="pcb_fabrication_note_path"||elm.type==="pcb_note_path")elm.route=elm.route.map(rp3=>{let tp3=applyToPoint4(matrix2,rp3);return rp3.x=tp3.x,rp3.y=tp3.y,rp3});else if(elm.type==="pcb_silkscreen_line"||elm.type==="pcb_note_line"){let p12={x:elm.x1,y:elm.y1},p22={x:elm.x2,y:elm.y2},p1t=applyToPoint4(matrix2,p12),p2t=applyToPoint4(matrix2,p22);elm.x1=p1t.x,elm.y1=p1t.y,elm.x2=p2t.x,elm.y2=p2t.y}else if(elm.type==="cad_component"){let newPos=applyToPoint4(matrix2,{x:elm.position.x,y:elm.position.y});elm.position.x=newPos.x,elm.position.y=newPos.y}return elm},transformPCBElements2=(elms,matrix2)=>{let tsr=decomposeTSR3(matrix2),quarterTurns=Math.round(tsr.rotation.angle/(Math.PI/2)),flipPadWidthHeight=Math.abs(quarterTurns)%2===1,transformedElms=elms.map(elm=>transformPCBElement2(elm,matrix2));return flipPadWidthHeight&&(transformedElms=transformedElms.map(elm=>(elm.type==="pcb_smtpad"&&elm.shape==="rect"&&([elm.width,elm.height]=[elm.height,elm.width]),elm))),transformedElms};function stringHash3(str){let hash=0;if(str.length==0)return hash;for(var i3=0;i3<str.length;i3++){var char=str.charCodeAt(i3);hash=(hash<<5)-hash+char,hash=hash&hash}return Math.abs(hash)}var nice_color_palettes2=[["#69d2e7","#a7dbd8","#e0e4cc","#f38630","#fa6900"],["#fe4365","#fc9d9a","#f9cdad","#c8c8a9","#83af9b"],["#ecd078","#d95b43","#c02942","#542437","#53777a"],["#556270","#4ecdc4","#c7f464","#ff6b6b","#c44d58"],["#774f38","#e08e79","#f1d4af","#ece5ce","#c5e0dc"],["#e8ddcb","#cdb380","#036564","#033649","#031634"],["#490a3d","#bd1550","#e97f02","#f8ca00","#8a9b0f"],["#594f4f","#547980","#45ada8","#9de0ad","#e5fcc2"],["#00a0b0","#6a4a3c","#cc333f","#eb6841","#edc951"],["#e94e77","#d68189","#c6a49a","#c6e5d9","#f4ead5"],["#3fb8af","#7fc7af","#dad8a7","#ff9e9d","#ff3d7f"],["#d9ceb2","#948c75","#d5ded9","#7a6a53","#99b2b7"],["#ffffff","#cbe86b","#f2e9e1","#1c140d","#cbe86b"],["#efffcd","#dce9be","#555152","#2e2633","#99173c"],["#343838","#005f6b","#008c9e","#00b4cc","#00dffc"],["#413e4a","#73626e","#b38184","#f0b49e","#f7e4be"],["#ff4e50","#fc913a","#f9d423","#ede574","#e1f5c4"],["#99b898","#fecea8","#ff847c","#e84a5f","#2a363b"],["#655643","#80bca3","#f6f7bd","#e6ac27","#bf4d28"],["#00a8c6","#40c0cb","#f9f2e7","#aee239","#8fbe00"],["#351330","#424254","#64908a","#e8caa4","#cc2a41"],["#554236","#f77825","#d3ce3d","#f1efa5","#60b99a"],["#5d4157","#838689","#a8caba","#cad7b2","#ebe3aa"],["#8c2318","#5e8c6a","#88a65e","#bfb35a","#f2c45a"],["#fad089","#ff9c5b","#f5634a","#ed303c","#3b8183"],["#ff4242","#f4fad2","#d4ee5e","#e1edb9","#f0f2eb"],["#f8b195","#f67280","#c06c84","#6c5b7b","#355c7d"],["#d1e751","#ffffff","#000000","#4dbce9","#26ade4"],["#1b676b","#519548","#88c425","#bef202","#eafde6"],["#5e412f","#fcebb6","#78c0a8","#f07818","#f0a830"],["#bcbdac","#cfbe27","#f27435","#f02475","#3b2d38"],["#452632","#91204d","#e4844a","#e8bf56","#e2f7ce"],["#eee6ab","#c5bc8e","#696758","#45484b","#36393b"],["#f0d8a8","#3d1c00","#86b8b1","#f2d694","#fa2a00"],["#2a044a","#0b2e59","#0d6759","#7ab317","#a0c55f"],["#f04155","#ff823a","#f2f26f","#fff7bd","#95cfb7"],["#b9d7d9","#668284","#2a2829","#493736","#7b3b3b"],["#bbbb88","#ccc68d","#eedd99","#eec290","#eeaa88"],["#b3cc57","#ecf081","#ffbe40","#ef746f","#ab3e5b"],["#a3a948","#edb92e","#f85931","#ce1836","#009989"],["#300030","#480048","#601848","#c04848","#f07241"],["#67917a","#170409","#b8af03","#ccbf82","#e33258"],["#aab3ab","#c4cbb7","#ebefc9","#eee0b7","#e8caaf"],["#e8d5b7","#0e2430","#fc3a51","#f5b349","#e8d5b9"],["#ab526b","#bca297","#c5ceae","#f0e2a4","#f4ebc3"],["#607848","#789048","#c0d860","#f0f0d8","#604848"],["#b6d8c0","#c8d9bf","#dadabd","#ecdbbc","#fedcba"],["#a8e6ce","#dcedc2","#ffd3b5","#ffaaa6","#ff8c94"],["#3e4147","#fffedf","#dfba69","#5a2e2e","#2a2c31"],["#fc354c","#29221f","#13747d","#0abfbc","#fcf7c5"],["#cc0c39","#e6781e","#c8cf02","#f8fcc1","#1693a7"],["#1c2130","#028f76","#b3e099","#ffeaad","#d14334"],["#a7c5bd","#e5ddcb","#eb7b59","#cf4647","#524656"],["#dad6ca","#1bb0ce","#4f8699","#6a5e72","#563444"],["#5c323e","#a82743","#e15e32","#c0d23e","#e5f04c"],["#edebe6","#d6e1c7","#94c7b6","#403b33","#d3643b"],["#fdf1cc","#c6d6b8","#987f69","#e3ad40","#fcd036"],["#230f2b","#f21d41","#ebebbc","#bce3c5","#82b3ae"],["#b9d3b0","#81bda4","#b28774","#f88f79","#f6aa93"],["#3a111c","#574951","#83988e","#bcdea5","#e6f9bc"],["#5e3929","#cd8c52","#b7d1a3","#dee8be","#fcf7d3"],["#1c0113","#6b0103","#a30006","#c21a01","#f03c02"],["#000000","#9f111b","#b11623","#292c37","#cccccc"],["#382f32","#ffeaf2","#fcd9e5","#fbc5d8","#f1396d"],["#e3dfba","#c8d6bf","#93ccc6","#6cbdb5","#1a1f1e"],["#f6f6f6","#e8e8e8","#333333","#990100","#b90504"],["#1b325f","#9cc4e4","#e9f2f9","#3a89c9","#f26c4f"],["#a1dbb2","#fee5ad","#faca66","#f7a541","#f45d4c"],["#c1b398","#605951","#fbeec2","#61a6ab","#accec0"],["#5e9fa3","#dcd1b4","#fab87f","#f87e7b","#b05574"],["#951f2b","#f5f4d7","#e0dfb1","#a5a36c","#535233"],["#8dccad","#988864","#fea6a2","#f9d6ac","#ffe9af"],["#2d2d29","#215a6d","#3ca2a2","#92c7a3","#dfece6"],["#413d3d","#040004","#c8ff00","#fa023c","#4b000f"],["#eff3cd","#b2d5ba","#61ada0","#248f8d","#605063"],["#ffefd3","#fffee4","#d0ecea","#9fd6d2","#8b7a5e"],["#cfffdd","#b4dec1","#5c5863","#a85163","#ff1f4c"],["#9dc9ac","#fffec7","#f56218","#ff9d2e","#919167"],["#4e395d","#827085","#8ebe94","#ccfc8e","#dc5b3e"],["#a8a7a7","#cc527a","#e8175d","#474747","#363636"],["#f8edd1","#d88a8a","#474843","#9d9d93","#c5cfc6"],["#046d8b","#309292","#2fb8ac","#93a42a","#ecbe13"],["#f38a8a","#55443d","#a0cab5","#cde9ca","#f1edd0"],["#a70267","#f10c49","#fb6b41","#f6d86b","#339194"],["#ff003c","#ff8a00","#fabe28","#88c100","#00c176"],["#ffedbf","#f7803c","#f54828","#2e0d23","#f8e4c1"],["#4e4d4a","#353432","#94ba65","#2790b0","#2b4e72"],["#0ca5b0","#4e3f30","#fefeeb","#f8f4e4","#a5b3aa"],["#4d3b3b","#de6262","#ffb88c","#ffd0b3","#f5e0d3"],["#fffbb7","#a6f6af","#66b6ab","#5b7c8d","#4f2958"],["#edf6ee","#d1c089","#b3204d","#412e28","#151101"],["#9d7e79","#ccac95","#9a947c","#748b83","#5b756c"],["#fcfef5","#e9ffe1","#cdcfb7","#d6e6c3","#fafbe3"],["#9cddc8","#bfd8ad","#ddd9ab","#f7af63","#633d2e"],["#30261c","#403831","#36544f","#1f5f61","#0b8185"],["#aaff00","#ffaa00","#ff00aa","#aa00ff","#00aaff"],["#d1313d","#e5625c","#f9bf76","#8eb2c5","#615375"],["#ffe181","#eee9e5","#fad3b2","#ffba7f","#ff9c97"],["#73c8a9","#dee1b6","#e1b866","#bd5532","#373b44"],["#805841","#dcf7f3","#fffcdd","#ffd8d8","#f5a2a2"]],getDebugLayoutObject2=lo3=>{let{x:x4,y:y4,width,height}={...lo3,...lo3.size,...lo3.center,...lo3.position};if(lo3.x1!==void 0&&lo3.x2!==void 0&&lo3.y1!==void 0&&lo3.y2!==void 0&&(x4=(lo3.x1+lo3.x2)/2,y4=(lo3.y1+lo3.y2)/2,width=Math.abs(lo3.x1-lo3.x2),height=Math.abs(lo3.y1-lo3.y2)),lo3.points&&Array.isArray(lo3.points)&&lo3.points.length>0){let xCoords=lo3.points.map(point23=>point23.x),yCoords=lo3.points.map(point23=>point23.y),minX=Math.min(...xCoords),maxX=Math.max(...xCoords),minY=Math.min(...yCoords),maxY=Math.max(...yCoords);x4=(minX+maxX)/2,y4=(minY+maxY)/2,width=maxX-minX,height=maxY-minY}let title=lo3.text||lo3.name||lo3.source?.text||lo3.source?.name||"?",content=lo3;return x4===void 0||y4===void 0?null:(width===void 0&&"outer_diameter"in lo3&&(width=lo3.outer_diameter,height=lo3.outer_diameter),(width===void 0||height===void 0)&&(width=.1,height=.1),{x:x4,y:y4,width,height,title,content,bg_color:nice_color_palettes2[stringHash3(lo3.type||title)%nice_color_palettes2.length]?.[4]??"#f00"})},isTruthy2=value=>!!value,findBoundsAndCenter2=elements=>{let debugObjects=elements.filter(elm=>elm.type.startsWith("pcb_")||elm.type.startsWith("schematic_")).concat(elements.filter(elm=>elm.type==="pcb_trace"||elm.type==="schematic_trace").flatMap(elm=>elm.route)).map(elm=>getDebugLayoutObject2(elm)).filter(isTruthy2);if(debugObjects.length===0)return{center:{x:0,y:0},width:0,height:0};let minX=debugObjects[0].x-debugObjects[0].width/2,maxX=debugObjects[0].x+debugObjects[0].width/2,minY=debugObjects[0].y-debugObjects[0].height/2,maxY=debugObjects[0].y+debugObjects[0].height/2;for(let obj of debugObjects.slice(1))minX=Math.min(minX,obj.x-obj.width/2),maxX=Math.max(maxX,obj.x+obj.width/2),minY=Math.min(minY,obj.y-obj.height/2),maxY=Math.max(maxY,obj.y+obj.height/2);let width=maxX-minX,height=maxY-minY;return{center:{x:minX+width/2,y:minY+height/2},width,height}},unitToMm3={in:25.4,inch:25.4,mil:.0254,mm:1,m:1e3,cm:10,ft:304.8,feet:304.8},mmNumberFormatter2=new Intl.NumberFormat("en-US",{useGrouping:!1,notation:"standard",maximumFractionDigits:12}),mm5=n4=>{let unit=typeof n4=="number"?"mm":n4.replace(/^[^a-zA-Z]+/g,"").toLowerCase();unit||(unit="mm");let val=typeof n4=="number"?n4:Number.parseFloat(n4.split(unit)[0]);if(unit in unitToMm3)return val*unitToMm3[unit];throw new Error(`Unsupported unit: ${unit}`)},mil2mm2=mil=>typeof mil=="number"?mm5(`${mil}mil`):mil.match(/^\d+$/)?mm5(`${mil}mil`):mm5(mil);function generateArcFromSweep(startX,startY,endX,endY,radius,largeArcFlag,sweepFlag){let start={x:startX,y:startY},end={x:endX,y:endY},midX=(startX+endX)/2,midY=(startY+endY)/2,dx3=endX-startX,dy3=endY-startY,distance32=Math.sqrt(dx3*dx3+dy3*dy3);if(distance32===0||radius<distance32/2)return[start,end];let h6=Math.sqrt(radius*radius-distance32*distance32/4),angle=Math.atan2(dy3,dx3),centerX=midX+h6*Math.sin(angle)*(sweepFlag?-1:1),centerY=midY-h6*Math.cos(angle)*(sweepFlag?-1:1),startAngle=Math.atan2(startY-centerY,startX-centerX),endAngle=Math.atan2(endY-centerY,endX-centerX);sweepFlag&&endAngle>startAngle?endAngle-=2*Math.PI:!sweepFlag&&endAngle<startAngle&&(endAngle+=2*Math.PI),(!largeArcFlag&&Math.abs(endAngle-startAngle)>Math.PI||largeArcFlag&&Math.abs(endAngle-startAngle)<Math.PI)&&(endAngle>startAngle?endAngle-=2*Math.PI:endAngle+=2*Math.PI);let numPoints=Math.max(2,Math.ceil(Math.abs(endAngle-startAngle)*radius)),path=[];for(let i3=0;i3<=numPoints;i3++){let t52=i3/numPoints,angle2=startAngle+t52*(endAngle-startAngle),x4=centerX+radius*Math.cos(angle2),y4=centerY+radius*Math.sin(angle2);path.push({x:x4,y:y4})}return path}var mil10ToMm=value=>value*10*.0254,getBoundsCenter2=bounds=>({x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2}),getBoundsFromPoints2=points=>{if(points.length===0)return null;let minX=points[0].x,minY=points[0].y,maxX=points[0].x,maxY=points[0].y;for(let i3=1;i3<points.length;i3++){let point23=points[i3];point23.x<minX&&(minX=point23.x),point23.y<minY&&(minY=point23.y),point23.x>maxX&&(maxX=point23.x),point23.y>maxY&&(maxY=point23.y)}return{minX,minY,maxX,maxY}},getCadSvgNode=easyEdaJson=>{let svgNode=easyEdaJson.packageDetail.dataStr.shape.find(shape=>shape.type==="SVGNODE"&&shape.svgData.attrs?.uuid);return svgNode?.type==="SVGNODE"?svgNode:null},isSvgChildNodeWithAttrs=childNode=>typeof childNode=="object"&&childNode!==null,getXyBoundsFromModelBounds=bounds=>({minX:bounds.min.x,minY:bounds.min.y,maxX:bounds.max.x,maxY:bounds.max.y}),rotateScenePoint=(point23,rotationDeg)=>{switch(rotationDeg){case 0:return point23;case 90:return{x:point23.y,y:-point23.x};case 180:return{x:-point23.x,y:-point23.y};case 270:return{x:-point23.y,y:point23.x}}},getEasyEdaModelOriginOnBoardMm=({svgNode,footprintCenterMm})=>{let points=[];for(let childNode of svgNode.svgData.childNodes??[]){if(!isSvgChildNodeWithAttrs(childNode))continue;let rawPoints=childNode.attrs?.points;if(!rawPoints)continue;let values=String(rawPoints).trim().split(/\s+/).map(Number);for(let i3=0;i3+1<values.length;i3+=2){let x4=values[i3],y4=values[i3+1];Number.isFinite(x4)&&Number.isFinite(y4)&&points.push({x:mil10ToMm(x4),y:mil10ToMm(y4)})}}let modelOriginMm=null;if(points.length>0){let bounds=getBoundsFromPoints2(points);modelOriginMm=bounds?getBoundsCenter2(bounds):null}else{let[originX,originY]=String(svgNode.svgData.attrs?.c_origin??"0,0").split(",").map(value=>Number(value.trim()));Number.isFinite(originX)&&Number.isFinite(originY)&&(modelOriginMm={x:mil10ToMm(originX),y:mil10ToMm(originY)})}return modelOriginMm?{x:modelOriginMm.x-footprintCenterMm.x,y:footprintCenterMm.y-modelOriginMm.y}:null},snapZero=value=>Math.abs(value)<1e-6?0:value,normalizePoint=point23=>({x:snapZero(point23.x),y:snapZero(point23.y)}),getCadModelOffsetMmFromBounds=(easyEdaJson,bounds,{footprintBoundsCenterMm}={})=>{let svgNode=getCadSvgNode(easyEdaJson);if(!svgNode||!bounds)return null;let[,,rotationZRaw]=String(svgNode.svgData.attrs?.c_rotation??"0,0,0").split(",").map(value=>Number(value.trim())),rotationDeg=(rotationZRaw%360+360)%360;if(![0,90,180,270].includes(rotationDeg))return null;let modelCenter=getBoundsCenter2(getXyBoundsFromModelBounds(bounds)),footprintCenter=easyEdaJson.packageDetail.dataStr.head,footprintCenterMm=footprintBoundsCenterMm??{x:mil10ToMm(footprintCenter.x),y:mil10ToMm(footprintCenter.y)},targetOriginOnBoardMm=getEasyEdaModelOriginOnBoardMm({svgNode,footprintCenterMm});if(!targetOriginOnBoardMm)return null;let targetOriginInModelFrame=rotateScenePoint(targetOriginOnBoardMm,rotationDeg);return normalizePoint({x:modelCenter.x-targetOriginInModelFrame.x,y:modelCenter.y-targetOriginInModelFrame.y})},normalizePinLabels2=inputPinLabels=>{let uniqueInputPinLabels=inputPinLabels.map(labels=>[...new Set(labels)]),result=uniqueInputPinLabels.map(()=>[]),desiredNumbers=uniqueInputPinLabels.map(()=>null);for(let i3=0;i3<uniqueInputPinLabels.length;i3++)for(let label of uniqueInputPinLabels[i3])if(/^\d+$/.test(label)){desiredNumbers[i3]=Number.parseInt(label);break}let highestPinNumber=0,acceptedDesiredNumbers=new Set;for(let i3=0;i3<desiredNumbers.length;i3++){let desiredNumber=desiredNumbers[i3];if(desiredNumber===null||desiredNumber<1)continue;if(!acceptedDesiredNumbers.has(desiredNumber)){acceptedDesiredNumbers.add(desiredNumber),result[i3].push(`pin${desiredNumber}`),highestPinNumber=Math.max(highestPinNumber,desiredNumber);continue}let existingAltCount=0;for(let label of result[i3])label.startsWith(`pin${desiredNumber}_alt`)&&(existingAltCount+=1);result[i3].push(`pin${desiredNumber}_alt${existingAltCount+1}`)}for(let i3=0;i3<result.length;i3++)result[i3][0]?.includes("_alt")&&(highestPinNumber+=1,result[i3].unshift(`pin${highestPinNumber}`));for(let i3=0;i3<result.length;i3++)result[i3].length===0&&(highestPinNumber+=1,result[i3].push(`pin${highestPinNumber}`));let totalLabelCounts={};for(let inputLabels of uniqueInputPinLabels)for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]=(totalLabelCounts[label]??0)+1);let incrementalLabelCounts={};for(let i3=0;i3<uniqueInputPinLabels.length;i3++)for(let label of uniqueInputPinLabels[i3])/^\d+$/.test(label)||(totalLabelCounts[label]===1?result[i3].push(label):(incrementalLabelCounts[label]=(incrementalLabelCounts[label]??0)+1,result[i3].push(`${label}${incrementalLabelCounts[label]}`)));return result},normalizeSymbolName=name=>{let trimmedName=name.trim();return trimmedName==="+"?"_POS":trimmedName==="-"?"_NEG":trimmedName},DEFAULT_PCB_THICKNESS_MM=1.6,EASYEDA_STEP_MODEL_URL="https://modules.easyeda.com/qAxj6KHrDKw4blvCG8QJPs7Y",EASYEDA_OBJ_MODEL_URL="https://modules.easyeda.com/3dmodel",TSCIRCUIT_MODEL_CDN_URL="https://modelcdn.tscircuit.com/easyeda_models",milx10=mil10=>typeof mil10=="number"||mil10.match(/^\d+$/)?mil2mm2(mil10)*10:mil2mm2(mil10),parseCadOffsetsFromSvgNode=svgNode=>{let attrs=svgNode?.svgData?.attrs??{},[cx3,cy3]=String(attrs.c_origin??"0,0").split(",").map(s3=>Number(s3.trim())),zStr=attrs.z??0,z_mm=typeof zStr=="string"&&/[a-z]/i.test(zStr)?mm5(zStr):mm5(`${Number(zStr)||0}mil`);return{position:{x:mil10ToMm(Number.isNaN(cx3)?0:cx3),y:mil10ToMm(Number.isNaN(cy3)?0:cy3),z:z_mm},rotation:(()=>{let[rx3,ry3,rz2]=(attrs.c_rotation??"0,0,0").split(",").map(Number);return{x:rx3||0,y:ry3||0,z:rz2||0}})()}},readModelHeightMm=raw=>{if(raw==null)return 3.5;let n4=Number(raw);if(!Number.isFinite(n4))return 3.5;let mmFromMil10=mil10ToMm(n4),mmFromMil=mm5(`${n4}mil`),upper=12,lower=.1,chosen=Math.max(mmFromMil10,mmFromMil);return(chosen>upper||chosen<lower)&&(chosen=3.5),chosen},handleSilkscreenPath=(track,index)=>pcb_silkscreen_path2.parse({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${index+1}`,pcb_component_id:"pcb_component_1",layer:"top",route:track.points.map(point23=>({x:milx10(point23.x),y:milx10(point23.y)})),stroke_width:mil10ToMm(track.width)}),isCourtyardLayer=layer=>layer===13||layer===14||layer===15,handleSilkscreenArc=(arc2,index)=>{let arcPath=generateArcFromSweep(arc2.start.x,arc2.start.y,arc2.end.x,arc2.end.y,arc2.radiusX,arc2.largeArc,arc2.sweepDirection==="CW");return pcb_silkscreen_path2.parse({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_arc_${index+1}`,pcb_component_id:"pcb_component_1",layer:"top",route:arcPath.map(p4=>({x:milx10(p4.x),y:milx10(p4.y)})),stroke_width:mil10ToMm(arc2.width)})},handleHole=(hole,index)=>pcb_hole2.parse({type:"pcb_hole",x:milx10(hole.center.x),y:milx10(hole.center.y),hole_diameter:milx10(hole.radius)*2,hole_shape:"circle",pcb_hole_id:`pcb_hole_${index+1}`}),handleHoleCutout=(hole,index)=>pcb_cutout2.parse({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_from_hole_${index+1}`,shape:"circle",center:{x:milx10(hole.center.x),y:milx10(hole.center.y)},radius:milx10(hole.radius)}),handleVia=(via,index)=>pcb_via2.parse({type:"pcb_via",pcb_via_id:`pcb_via_${index+1}`,x:milx10(via.center.x),y:milx10(via.center.y),outer_diameter:milx10(via.outerDiameter),hole_diameter:milx10(via.holeDiameter),layers:["top","bottom"]}),handleCutout=(solidRegion,index)=>pcb_cutout2.parse({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_${index+1}`,shape:"polygon",points:solidRegion.points.map(p4=>({x:milx10(p4.x),y:milx10(p4.y)}))}),LEAD_SHAPE_LAYER=100,isPcbSolidRegionCutout=shape=>shape.fillStyle==="cutout"&&shape.layermask!==LEAD_SHAPE_LAYER,getCadPositionZMmFromMetadata=easyEdaJson=>{let svgNode=easyEdaJson.packageDetail.dataStr.shape.find(shape=>shape.type==="SVGNODE"&&shape.svgData.attrs?.uuid);if(!svgNode||svgNode.type!=="SVGNODE")return;let svgNodeZ=Number(svgNode.svgData.attrs?.z??0);if(!Number.isFinite(svgNodeZ))return;let bounds=easyEdaJson._objMetadata?.bounds;return bounds?(Math.abs(bounds.min.z)<1e-6?0:bounds.min.z)-mil10ToMm(svgNodeZ):void 0},convertEasyEdaJsonToCircuitJson=(easyEdaJson,{useModelCdn,shouldRecenter=!0,cadPositionXMm,cadPositionYMm,cadPositionZMm,cadModelBounds,showDesignator=!1}={})=>{let resolvedCadPositionZMm=cadPositionZMm??getCadPositionZMmFromMetadata(easyEdaJson),circuitElements=[],source_component=any_source_component2.parse({type:"source_component",source_component_id:"source_component_1",name:"U1",ftype:"simple_chip"}),pcb_component22=pcb_component2.parse({type:"pcb_component",pcb_component_id:"pcb_component_1",source_component_id:"source_component_1",name:"U1",ftype:"simple_chip",width:0,height:0,rotation:0,center:{x:0,y:0},layer:"top"});circuitElements.push(source_component,pcb_component22);let pads=easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="PAD"),pins=easyEdaJson.dataStr.shape.filter(shape=>shape.type==="PIN"),pinLabelSets=pads.map(pad2=>{let labels=[];pad2.number&&labels.push(pad2.number.toString());let pin=pins.find(p4=>p4.pinNumber===pad2.number);return pin&&labels.push(normalizeSymbolName(pin.label)),labels}),normalizedPinLabels=normalizePinLabels2(pinLabelSets);pads.forEach((pad2,index)=>{let portHints2=normalizedPinLabels[index],pinNumber=Number.parseInt(portHints2.find(hint=>hint.match(/pin\d+/)).replace("pin",""));if(circuitElements.push({type:"source_port",source_port_id:`source_port_${index+1}`,source_component_id:"source_component_1",name:`pin${pinNumber}`,pin_number:pinNumber,port_hints:portHints2.filter(hint=>hint!==`pin${pinNumber}`)}),pad2.holeRadius!==void 0&&mil2mm2(pad2.holeRadius)!==0){let commonPlatedHoleProps={type:"pcb_plated_hole",pcb_plated_hole_id:pad2.shape==="RECT"&&pad2.rotation!==void 0?`pcb_plated_hole_${index+1}_rot${pad2.rotation}`:`pcb_plated_hole_${index+1}`,x:mil2mm2(pad2.center.x),y:mil2mm2(pad2.center.y),layers:["top"],port_hints:[`pin${pinNumber}`],pcb_component_id:"pcb_component_1",pcb_port_id:`pcb_port_${index+1}`},additionalPlatedHoleProps;if(pad2.shape==="OVAL"){let largestOuterDimensionName=mil2mm2(pad2.width)>mil2mm2(pad2.height)?"width":"height",smallestOuterDimension=Math.min(mil2mm2(pad2.width),mil2mm2(pad2.height)),largestOuterDimension=Math.max(mil2mm2(pad2.width),mil2mm2(pad2.height)),distanceFromOuterPlatingToHole=smallestOuterDimension/2-mil2mm2(pad2.holeRadius),largestInnerDimension=largestOuterDimension-distanceFromOuterPlatingToHole*2,smallestInnerDimension=mil2mm2(pad2.holeRadius)*2;additionalPlatedHoleProps={shape:"pill",hole_width:largestOuterDimensionName==="width"?largestInnerDimension:smallestInnerDimension,hole_height:largestOuterDimensionName==="height"?largestInnerDimension:smallestInnerDimension,outer_width:mil2mm2(pad2.width),outer_height:mil2mm2(pad2.height),ccw_rotation:pad2.rotation||0}}else if(pad2.shape==="RECT"){let padWidth=mil2mm2(pad2.width),padHeight=mil2mm2(pad2.height),holeDiameter=mil2mm2(pad2.holeRadius)*2;if(Math.max(padWidth,padHeight)/Math.min(padWidth,padHeight)>1.5){let baseWidth=holeDiameter,pillHeight=baseWidth*2.6,holeWidth=padWidth>padHeight?pillHeight:baseWidth,holeHeight=padHeight>padWidth?pillHeight:baseWidth;additionalPlatedHoleProps={shape:"rotated_pill_hole_with_rect_pad",hole_shape:"rotated_pill",pad_shape:"rect",hole_width:holeWidth,hole_height:holeHeight,hole_ccw_rotation:pad2.rotation||0,rect_ccw_rotation:pad2.rotation||0,rect_pad_width:padWidth,rect_pad_height:padHeight}}else additionalPlatedHoleProps={shape:"circle",hole_diameter:holeDiameter,outer_diameter:Math.max(padWidth,padHeight),radius:holeDiameter/2}}else additionalPlatedHoleProps={shape:"circle",hole_diameter:mil2mm2(pad2.holeRadius)*2,outer_diameter:mil2mm2(pad2.width),radius:mil2mm2(pad2.holeRadius)};circuitElements.push(pcb_plated_hole2.parse({...commonPlatedHoleProps,...additionalPlatedHoleProps}))}else{let soupShape;if(pad2.shape==="RECT"||pad2.shape==="ELLIPSE"?soupShape="rect":pad2.shape==="OVAL"?soupShape="pill":pad2.shape==="POLYGON"&&(soupShape="polygon"),!soupShape)throw new Error(`unknown pad.shape: "${pad2.shape}"`);let rectSize={width:mil2mm2(pad2.width),height:mil2mm2(pad2.height)};(pad2.rotation===90||pad2.rotation===270)&&(rectSize.width=mil2mm2(pad2.height),rectSize.height=mil2mm2(pad2.width));let parsedPcbSmtpad=pcb_smtpad2.parse({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${index+1}`,shape:soupShape,...soupShape!=="polygon"&&{x:mil2mm2(pad2.center.x),y:mil2mm2(pad2.center.y)},...soupShape==="rect"?rectSize:soupShape==="pill"?{...rectSize,radius:Math.min(rectSize.width,rectSize.height)/2}:soupShape==="polygon"&&pad2.points?{points:pad2.points.map(p4=>({x:milx10(p4.x),y:milx10(p4.y)}))}:{radius:Math.min(mil2mm2(pad2.width),mil2mm2(pad2.height))/2},layer:"top",port_hints:[`pin${pinNumber}`],pcb_component_id:"pcb_component_1",pcb_port_id:`pcb_port_${index+1}`});circuitElements.push(parsedPcbSmtpad)}}),easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="HOLE").forEach((h6,index)=>{circuitElements.push(handleHole(h6,index)),circuitElements.push(handleHoleCutout(h6,index))}),easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="VIA").forEach((v4,index)=>{circuitElements.push(handleVia(v4,index))}),easyEdaJson.packageDetail.dataStr.shape.filter(shape=>shape.type==="SOLIDREGION"&&isPcbSolidRegionCutout(shape)).forEach((sr3,index)=>{circuitElements.push(handleCutout(sr3,index))});let hasFoundDesignator=!1;if(easyEdaJson.packageDetail.dataStr.shape.forEach((shape,index)=>{if(shape.type==="TRACK")isCourtyardLayer(shape.layer)||circuitElements.push(handleSilkscreenPath(shape,index));else if(shape.type==="ARC")isCourtyardLayer(shape.layer)||circuitElements.push(handleSilkscreenArc(shape,index));else if(shape.type==="TEXT"){if(isCourtyardLayer(shape.layer))return;let text=shape.text,designatorPrefix=easyEdaJson.dataStr.head.c_para.pre||"U",normalizedPrefix=designatorPrefix.replace(/\?/g,""),trimmedText=text.trim();if(trimmedText===designatorPrefix||trimmedText===`${normalizedPrefix}?`||trimmedText===normalizedPrefix){if(!showDesignator)return;text="{NAME}",hasFoundDesignator=!0}circuitElements.push(pcb_silkscreen_text2.parse({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:`pcb_silkscreen_text_${index+1}`,pcb_component_id:"pcb_component_1",text,anchor_position:{x:mil2mm2(shape.x),y:mil2mm2(shape.y)},anchor_alignment:{L:"bottom_left",C:"center",R:"bottom_right"}[shape.textAnchor??"L"],font_size:shape.size_mm||1,layer:"top"}))}}),!hasFoundDesignator&&showDesignator){let bbox=easyEdaJson.packageDetail.dataStr.BBox;circuitElements.push(pcb_silkscreen_text2.parse({type:"pcb_silkscreen_text",pcb_silkscreen_text_id:"pcb_silkscreen_text_designator_fallback",pcb_component_id:"pcb_component_1",text:"{NAME}",anchor_position:{x:milx10(bbox.x+bbox.width/2),y:milx10(bbox.y)-1},anchor_alignment:"center",font_size:1,layer:"top"}))}let pcbElements=circuitElements.filter(e5=>e5.type==="pcb_smtpad"||e5.type==="pcb_plated_hole"||e5.type==="pcb_hole"||e5.type==="pcb_via"||e5.type==="pcb_courtyard_outline"||e5.type==="pcb_silkscreen_path"||e5.type==="pcb_silkscreen_text");if(pcbElements.length>0){let bounds=findBoundsAndCenter2(pcbElements);pcb_component22.width=bounds.width,pcb_component22.height=bounds.height}let svgNode=easyEdaJson.packageDetail.dataStr.shape.find(a3=>!!(a3.type==="SVGNODE"&&a3.svgData.attrs?.uuid)),modelUuid=svgNode?.svgData?.attrs?.uuid,objFileUrl=modelUuid?useModelCdn?`${TSCIRCUIT_MODEL_CDN_URL}/assets/${easyEdaJson.lcsc.number}.obj?uuid=${modelUuid}`:`${EASYEDA_OBJ_MODEL_URL}/${modelUuid}`:void 0,stepFileUrl=modelUuid?useModelCdn?`${TSCIRCUIT_MODEL_CDN_URL}/assets/${easyEdaJson.lcsc.number}.step?uuid=${modelUuid}`:`${EASYEDA_STEP_MODEL_URL}/${modelUuid}`:void 0;if(objFileUrl!==void 0||stepFileUrl!==void 0){let{position:position22,rotation:rotation22}=parseCadOffsetsFromSvgNode(svgNode);circuitElements.push(cad_component2.parse({type:"cad_component",cad_component_id:"cad_component_1",source_component_id:"source_component_1",pcb_component_id:"pcb_component_1",anchor_alignment:"center_of_component_on_board_surface",model_origin_alignment:"center_of_component_on_board_surface",model_origin_position:{x:cadPositionXMm??0,y:cadPositionYMm??0,z:resolvedCadPositionZMm??position22.z},position:{x:0,y:0,z:0},rotation:rotation22,model_obj_url:objFileUrl,model_step_url:stepFileUrl}))}if(!circuitElements.some(e5=>e5.type==="pcb_courtyard_outline")){let bbox=easyEdaJson.packageDetail.dataStr.BBox;if(bbox){let x12=milx10(bbox.x)-.25,y12=milx10(bbox.y)-.25,x22=milx10(bbox.x+bbox.width)+.25,y22=milx10(bbox.y+bbox.height)+.25;circuitElements.push(pcb_courtyard_outline2.parse({type:"pcb_courtyard_outline",pcb_courtyard_outline_id:`pcb_courtyard_outline_${easyEdaJson.lcsc.number}_1`,pcb_component_id:"pcb_component_1",layer:"top",outline:[{x:x12,y:y12},{x:x22,y:y12},{x:x22,y:y22},{x:x12,y:y22},{x:x12,y:y12}],stroke_width:.05}))}}if(shouldRecenter){let elementsForBounds=circuitElements.filter(e5=>e5.type!=="pcb_component"&&e5.type!=="cad_component"),bounds=findBoundsAndCenter2(elementsForBounds);if(Number.isFinite(bounds.center.x)&&Number.isFinite(bounds.center.y)){let matrix2=compose4(translate4(-bounds.center.x,bounds.center.y),scale4(1,-1)),elementsForTransform=circuitElements.filter(e5=>!(e5.type==="pcb_smtpad"&&e5.shape==="polygon")&&e5.type!=="cad_component");transformPCBElements2(elementsForTransform,matrix2);for(let e5 of circuitElements)if(e5.type==="pcb_cutout"){if(e5.shape==="polygon")e5.points=e5.points.map(p4=>applyToPoint4(matrix2,p4));else if(e5.shape==="circle"||e5.shape==="rect")e5.center=applyToPoint4(matrix2,e5.center);else if("route"in e5){let cutoutPath=e5;cutoutPath.route=cutoutPath.route.map(p4=>applyToPoint4(matrix2,p4))}}else e5.type==="pcb_smtpad"&&e5.shape==="polygon"&&(e5.points=e5.points.map(p4=>applyToPoint4(matrix2,p4)));let cad=circuitElements.find(e5=>e5.type==="cad_component");if(cad){cad.rotation||(cad.rotation={x:0,y:0,z:0}),cad.model_origin_position||(cad.model_origin_position={x:0,y:0,z:0});let resolvedCadModelBounds=cadModelBounds??easyEdaJson._objMetadata?.bounds,recenteredCadOffset=resolvedCadModelBounds&&getCadModelOffsetMmFromBounds(easyEdaJson,resolvedCadModelBounds,{footprintBoundsCenterMm:bounds.center});recenteredCadOffset&&(cad.model_origin_position.x=recenteredCadOffset.x,cad.model_origin_position.y=recenteredCadOffset.y);let side=pcb_component22.layer??"top",t52=DEFAULT_PCB_THICKNESS_MM/2,attrs=svgNode?.svgData?.attrs??{},modelHeight=readModelHeightMm(attrs.c_height);cad.size||(cad.size={x:pcb_component22.width,y:pcb_component22.height,z:modelHeight});let ROTATE_X_FOR_YUP=90,originalZRotation=(cad.rotation.z??0)%360;Math.abs(originalZRotation-0)<1||Math.abs(originalZRotation-360)<1||Math.abs(originalZRotation-180)<1||Math.abs(originalZRotation-90)<1?cad.rotation.x=((cad.rotation.x??0)+0+360)%360:Math.abs(originalZRotation-270)<1?(cad.rotation.x=((cad.rotation.x??0)+0+360)%360,cad.rotation.y=((cad.rotation.y??0)+0+360)%360):(console.warn(`[3D] Unusual rotation angle: ${originalZRotation}\xB0 for component ${easyEdaJson.lcsc.number}`),cad.rotation.x=((cad.rotation.x??0)+ROTATE_X_FOR_YUP+360)%360),side!=="top"&&(cad.rotation.x=((cad.rotation.x??0)+180)%360);let USE_Z_OFFSET_FOR_180=Math.abs(originalZRotation-180)<1,zOffRaw=cad.model_origin_position.z??cad.position.z??0,zOff=USE_Z_OFFSET_FOR_180?-zOffRaw:0,rx3=(cad.rotation.x%360+360)%360,thicknessAlongWorldZ,is180RotatedYUp=(Math.abs(originalZRotation-180)<1||Math.abs(originalZRotation-0)<1||Math.abs(originalZRotation-360)<1)&&Math.abs(rx3)<1;if(is180RotatedYUp||rx3%180===90?thicknessAlongWorldZ=cad.size.y:thicknessAlongWorldZ=cad.size.z,Number.isFinite(resolvedCadPositionZMm))cad.model_origin_position.z=side==="top"?resolvedCadPositionZMm:-resolvedCadPositionZMm;else{let centerZ;is180RotatedYUp?centerZ=side==="top"?t52-thicknessAlongWorldZ/2:-t52+thicknessAlongWorldZ/2:centerZ=side==="top"?t52+zOff+thicknessAlongWorldZ/2:-t52-zOff-thicknessAlongWorldZ/2,cad.model_origin_position.z=centerZ}}}pcb_component22.center={x:0,y:0}}return circuitElements},safeNumber=(defaultValue=0)=>external_exports2.union([external_exports2.number(),external_exports2.string()]).transform(val=>{let num=Number(val);return isNaN(num)?defaultValue:num}).default(defaultValue),tenthmil=external_exports2.union([external_exports2.number(),external_exports2.string()]).optional().transform(n4=>typeof n4=="string"&&n4.endsWith("mil")?n4:`${Number.parseFloat(n4)*10}mil`).pipe(external_exports2.string()),PointSchema=external_exports2.any().transform(p4=>{if(Array.isArray(p4)){let[x4,y4]=p4;return{x:x4,y:y4}}if(typeof p4=="object")return p4;throw new Error(`Invalid point: ${p4}`)}).pipe(external_exports2.object({x:external_exports2.number(),y:external_exports2.number()})),BaseShapeSchema=external_exports2.object({type:external_exports2.string(),id:external_exports2.string().optional(),layer:external_exports2.coerce.number().optional()}),TrackSchema=BaseShapeSchema.extend({type:external_exports2.literal("TRACK"),width:external_exports2.coerce.number(),points:external_exports2.array(PointSchema)}),PadSchema=BaseShapeSchema.extend({type:external_exports2.literal("PAD"),shape:external_exports2.enum(["RECT","ELLIPSE","OVAL","POLYGON"]),center:external_exports2.object({x:tenthmil,y:tenthmil}),width:tenthmil,height:tenthmil,layermask:external_exports2.number(),net:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),number:external_exports2.union([external_exports2.string(),external_exports2.number()]),holeRadius:tenthmil,points:external_exports2.array(PointSchema).optional(),rotation:safeNumber(0),plated:external_exports2.boolean()}),ArcSchema=BaseShapeSchema.extend({type:external_exports2.literal("ARC"),width:external_exports2.number(),start:PointSchema,end:PointSchema,radiusX:external_exports2.number(),radiusY:external_exports2.number(),largeArc:external_exports2.boolean(),sweepDirection:external_exports2.enum(["CW","CCW"])}),CircleSchema=BaseShapeSchema.extend({type:external_exports2.literal("CIRCLE"),center:PointSchema,radius:external_exports2.number(),width:external_exports2.number()}),SolidRegionSchema=BaseShapeSchema.extend({type:external_exports2.literal("SOLIDREGION"),layermask:external_exports2.number(),points:external_exports2.array(PointSchema),fillStyle:external_exports2.string()}),SVGNodeSchema=BaseShapeSchema.extend({type:external_exports2.literal("SVGNODE"),svgData:external_exports2.object({gId:external_exports2.string(),nodeName:external_exports2.string(),nodeType:external_exports2.number(),layerid:external_exports2.string(),attrs:external_exports2.record(external_exports2.string(),external_exports2.string()),childNodes:external_exports2.array(external_exports2.unknown())})}),HoleSchema=BaseShapeSchema.extend({type:external_exports2.literal("HOLE"),center:PointSchema,radius:external_exports2.number()}),ViaSchema=BaseShapeSchema.extend({type:external_exports2.literal("VIA"),center:PointSchema,outerDiameter:external_exports2.number(),holeDiameter:external_exports2.number()}),RectSchema=BaseShapeSchema.extend({type:external_exports2.literal("RECT"),x:tenthmil,y:tenthmil,width:tenthmil,height:tenthmil,lineWidth:external_exports2.number(),fillStyle:external_exports2.string(),rotation:external_exports2.number().optional()}),TextSchema=BaseShapeSchema.extend({type:external_exports2.literal("TEXT"),text:external_exports2.string(),x:tenthmil,y:tenthmil,size_mm:external_exports2.number(),rotation:external_exports2.number().optional(),layer:external_exports2.number().optional(),textAnchor:external_exports2.enum(["L","C","R",""]).optional().transform(val=>val===""?void 0:val),font:external_exports2.string().optional()}),PackageDetailShapeSchema=external_exports2.discriminatedUnion("type",[TrackSchema,PadSchema,ArcSchema,CircleSchema,SolidRegionSchema,SVGNodeSchema,HoleSchema,ViaSchema,RectSchema,TextSchema]),pairs3=arr=>{let pairs22=[];for(let i3=0;i3<arr.length;i3+=2)pairs22.push([arr[i3],arr[i3+1]]);return pairs22},parsePoints=pointsStr=>pairs3(pointsStr.trim().split(" ").map(n4=>Number(n4))),ShapeItemSchema=external_exports2.object({type:external_exports2.string(),data:external_exports2.string()}).transform(shape=>{switch(shape.type){case"TRACK":{let[width,layer,_4,pointsStr,id2,_n3]=shape.data.split("~"),points=parsePoints(pointsStr);return TrackSchema.parse({type:"TRACK",width,layer,points,id:id2})}case"PAD":{let[padShape,...params]=shape.data.split("~"),[centerX,centerY,width,height,layermask,net,number,holeRadius,...rest]=params.map(p4=>Number.isNaN(Number(p4))?p4:Number(p4)),center2={x:centerX,y:centerY},points;(padShape==="RECT"||padShape==="POLYGON")&&(points=parsePoints(rest[0]));let r5=Number(rest[1]),rotation22=Number.isNaN(r5)?void 0:r5,padInputParams={type:"PAD",shape:padShape,center:center2,width,height,layermask,net,number,holeRadius,points,rotation:rotation22,plated:rest.includes("Y")};return PadSchema.parse(padInputParams)}case"ARC":{let[width,layer,,arcData]=shape.data.split("~"),match2=arcData.match(/M\s*([\d.-]+)(?:\s*,\s*|\s+)([\d.-]+)\s*A\s*([\d.-]+)(?:\s*,\s*|\s+)([\d.-]+)\s*([\d.-]+)\s*([\d.-]+)\s*([\d.-]+)\s*([\d.-]+)(?:\s*,\s*|\s+)([\d.-]+)/);if(!match2)throw new Error(`Invalid arc data: ${arcData}`);let[,startX,startY,radiusX,radiusY,xAxisRotation,largeArcFlag,sweepFlag,endX,endY]=match2,start=[Number(startX),Number(startY)],end=[Number(endX),Number(endY)];return ArcSchema.parse({type:"ARC",width:Number(width),layer:Number(layer),start,end,radiusX:Number(radiusX),radiusY:Number(radiusY),largeArc:largeArcFlag==="1",sweepDirection:sweepFlag==="1"?"CW":"CCW"})}case"CIRCLE":{let[centerX,centerY,radius,width,layer,id2]=shape.data.split("~"),center2=[Number(centerX),Number(centerY)];return CircleSchema.parse({type:"CIRCLE",center:center2,radius:Number(radius),width:Number(width),layer:Number(layer),id:id2})}case"HOLE":{let[centerX,centerY,radius,id2]=shape.data.split("~"),center2=[Number(centerX),Number(centerY)];return HoleSchema.parse({type:"HOLE",center:center2,radius:Number(radius),id:id2})}case"VIA":{let[x4,y4,outerDiameter,,holeDiameter,id2]=shape.data.split("~"),center2=[Number(x4),Number(y4)];return ViaSchema.parse({type:"VIA",center:center2,outerDiameter:Number(outerDiameter),holeDiameter:Number(holeDiameter),id:id2})}case"SOLIDREGION":{let[layermask,,pathData,fillStyle,id2]=shape.data.split("~"),points=pathData.match(/[ML] ?(-?[\d.]+)[ ,](-?[\d.]+)/g)?.map(point23=>{let[,x4,y4]=point23.match(/[ML]? ?(-?[\d.]+)[ ,](-?[\d.]+)/)||[];return[Number(x4),Number(y4)]})||[];return SolidRegionSchema.parse({type:"SOLIDREGION",layermask:Number(layermask),points,fillStyle,id:id2})}case"SVGNODE":{let svgData=JSON.parse(shape.data);return SVGNodeSchema.parse({type:"SVGNODE",svgData})}case"RECT":{let[x4,y4,width,height,lineWidth,id2,rotation22,layer,fillStyle]=shape.data.split("~"),r5=rotation22?Number(rotation22):void 0;return RectSchema.parse({type:"RECT",x:x4,y:y4,width,height,lineWidth:Number(lineWidth),id:id2,rotation:Number.isNaN(r5)?void 0:r5,layer:layer?Number(layer):void 0,fillStyle:fillStyle||void 0})}case"TEXT":{let[textAnchor,x4,y4,size22,layer,id2,rotation22,,font,text]=shape.data.split("~"),r5=rotation22?Number(rotation22):void 0;return TextSchema.parse({type:"TEXT",text,x:x4,y:y4,size_mm:Number(size22)*2.54,layer:layer?Number(layer):void 0,id:id2,rotation:Number.isNaN(r5)?void 0:r5,textAnchor,font:font||void 0})}default:throw new Error(`Unknown shape type: ${shape.type}`)}}).pipe(PackageDetailShapeSchema),ShapesArraySchema=external_exports2.array(ShapeItemSchema),PointSchema2=external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}),RectangleShapeOutputSchema=external_exports2.object({type:external_exports2.literal("RECTANGLE"),position:PointSchema2,width:external_exports2.number(),height:external_exports2.number(),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parseRectangle=str=>{let[,x4,y4,,,width,height,color,lineWidth,,,id2]=str.split("~");return{type:"RECTANGLE",position:{x:Number(x4),y:Number(y4)},width:Number(width),height:Number(height),color,lineWidth:Number(lineWidth),id:id2}},RectangleShapeSchema=external_exports2.string().startsWith("R~").transform(parseRectangle).pipe(RectangleShapeOutputSchema),EllipseShapeOutputSchema=external_exports2.object({type:external_exports2.literal("ELLIPSE"),center:PointSchema2,radiusX:external_exports2.number(),radiusY:external_exports2.number(),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parseEllipse=str=>{let[,x4,y4,radiusX,radiusY,color,lineWidth,,,id2]=str.split("~");return{type:"ELLIPSE",center:{x:Number(x4),y:Number(y4)},radiusX:Number(radiusX),radiusY:Number(radiusY),color,lineWidth:Number(lineWidth),id:id2}},EllipseShapeSchema=external_exports2.string().startsWith("E~").transform(parseEllipse).pipe(EllipseShapeOutputSchema),ArcShapeOutputSchema=external_exports2.object({type:external_exports2.literal("ARC"),start:PointSchema2,end:PointSchema2,radius:external_exports2.number(),sweepFlag:external_exports2.boolean(),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parseArc=str=>{let[,pathData,color,lineWidth,,,id2]=str.split("~"),parts=pathData.split(" "),x12=Number(parts[1])||0,y12=Number(parts[2])||0,radius=Number(parts[4])||0,sweepFlag=parts[7]==="1",x22=Number(parts[8])||0,y22=Number(parts[9])||0,parsedLineWidth=Number(lineWidth),finalLineWidth=Number.isNaN(parsedLineWidth)?1:parsedLineWidth;return{type:"ARC",start:{x:x12,y:y12},end:{x:x22,y:y22},radius,sweepFlag,color:color||"#880000",lineWidth:finalLineWidth,id:id2||"gge1"}},ArcShapeSchema=external_exports2.string().startsWith("A~").transform(parseArc).pipe(ArcShapeOutputSchema),PinShapeOutputSchema=external_exports2.object({type:external_exports2.literal("PIN"),visibility:external_exports2.enum(["show","hide","none"]),pinNumber:external_exports2.union([external_exports2.string(),external_exports2.number()]),x:external_exports2.number(),y:external_exports2.number(),rotation:external_exports2.number(),id:external_exports2.string(),label:external_exports2.string(),labelColor:external_exports2.string(),path:external_exports2.string(),arrow:external_exports2.string()}),parsePin=pinString=>{let parts=pinString.split("~"),[,visibility,,pinNumber,x4,y4,rotation22,id2]=parts,nameMatch=pinString.match(/~([\w+#-]+)~(start|end)~/),label=nameMatch?nameMatch[1]:"";label.endsWith("+")&&(label=label.slice(0,-1)+"_POS"),label.endsWith("-")&&(label=label.slice(0,-1)+"_NEG"),label.endsWith("#")&&(label=label.slice(0,-1)),/^\+\d+(?:\.\d+)?V$/i.test(label)&&(label=`V${label.slice(1,-1)}`);let colorMatch=pinString.match(/#[0-9A-F]{6}/),labelColor=colorMatch?colorMatch[0]:"",pathMatch=pinString.match(/\^\^([^~]+)/),path=pathMatch?pathMatch[1]:"",arrowMatch=pinString.match(/\^\^0~(.+)$/),arrow=arrowMatch?arrowMatch[1]:"",r5=Number.parseFloat(rotation22);return{type:"PIN",visibility,id:id2,pinNumber:Number.isNaN(Number(pinNumber))?pinNumber:Number(pinNumber),x:Number.parseFloat(x4),y:Number.parseFloat(y4),rotation:Number.isNaN(r5)?0:r5,label,labelColor,path,arrow}},PinShapeSchema=external_exports2.string().startsWith("P~").transform(parsePin).pipe(PinShapeOutputSchema),PolylineShapeOutputSchema=external_exports2.object({type:external_exports2.literal("POLYLINE"),points:external_exports2.array(PointSchema2),color:external_exports2.string(),lineWidth:external_exports2.number(),id:external_exports2.string()}),parsePoints2=pointsStr=>pointsStr.split(" ").reduce((acc,value,index)=>(index%2===0?acc.push({x:Number(value),y:0}):acc[acc.length-1].y=Number(value),acc),[]),parsePolyline=str=>{let[,...rest]=str.split("~"),[pointsStr,color,lineWidth,,,id2]=rest;return{type:"POLYLINE",points:parsePoints2(pointsStr),color,lineWidth:Number(lineWidth),id:id2}},PolylineShapeSchema=external_exports2.string().startsWith("PL~").transform(parsePolyline).pipe(PolylineShapeOutputSchema),PolygonShapeOutputSchema=external_exports2.object({type:external_exports2.literal("POLYGON"),points:external_exports2.array(PointSchema2),fillColor:external_exports2.string(),lineWidth:external_exports2.number(),lineColor:external_exports2.string(),id:external_exports2.string()}),parsePolygon2=str=>{let[,...rest]=str.split("~"),[pointsStr,fillColor,lineWidth,lineColor,,id2]=rest;return{type:"POLYGON",points:parsePoints2(pointsStr),fillColor,lineWidth:Number(lineWidth),lineColor,id:id2}},PolygonShapeSchema=external_exports2.string().startsWith("PG~").transform(parsePolygon2).pipe(PolygonShapeOutputSchema),PathShapeOutputSchema=external_exports2.object({type:external_exports2.literal("PATH"),pathData:external_exports2.string(),fillColor:external_exports2.string(),strokeWidth:external_exports2.number(),strokeColor:external_exports2.string(),id:external_exports2.string()}),parsePath=str=>{let[,pathData,fillColor,strokeWidth,strokeColor,,id2]=str.split("~");return{type:"PATH",pathData,fillColor,strokeWidth:mil10ToMm(Number(strokeWidth)),strokeColor,id:id2}},PathShapeSchema=external_exports2.string().startsWith("PT~").transform(parsePath).pipe(PathShapeOutputSchema),optionalEasyEdaTextField=fieldSchema=>external_exports2.preprocess(textField=>{if(!(textField==null||textField===""||textField==="undefined"))return textField},fieldSchema),TextShapeOutputSchema=external_exports2.object({type:external_exports2.literal("TEXT"),alignment:external_exports2.enum(["L","C","R"]),x:external_exports2.number(),y:external_exports2.number(),rotation:external_exports2.number(),fontColor:external_exports2.string(),backgroundColor:optionalEasyEdaTextField(external_exports2.string().optional()),fontSize:external_exports2.string(),fontWeight:optionalEasyEdaTextField(external_exports2.string().optional().default("normal")),fontStyle:optionalEasyEdaTextField(external_exports2.enum(["normal","italic"]).optional().default("normal")),fontDecoration:optionalEasyEdaTextField(external_exports2.string().optional().default("")),content:external_exports2.string(),textType:external_exports2.string(),visibility:external_exports2.enum(["0","1"]),mirror:external_exports2.string(),id:external_exports2.string()}),parseText=str=>{let[,alignment,x4,y4,rotation22,fontColor,backgroundColor,fontSize,fontWeight,fontStyle,fontDecoration,content,textType,visibility,mirror,id2]=str.split("~");return{type:"TEXT",alignment,x:Number(x4),y:Number(y4),rotation:Number(rotation22),fontColor,backgroundColor,fontSize,fontWeight,fontStyle,fontDecoration,content,textType,visibility,mirror,id:id2}},TextShapeSchema=external_exports2.string().startsWith("T~").transform(parseText).pipe(TextShapeOutputSchema),SingleLetterShapeSchema=external_exports2.string().transform(x4=>{if(x4.startsWith("R~"))return RectangleShapeSchema.parse(x4);if(x4.startsWith("E~"))return EllipseShapeSchema.parse(x4);if(x4.startsWith("P~"))return PinShapeSchema.parse(x4);if(x4.startsWith("PL~"))return PolylineShapeSchema.parse(x4);if(x4.startsWith("PG~"))return PolygonShapeSchema.parse(x4);if(x4.startsWith("PT~"))return PathShapeSchema.parse(x4);if(x4.startsWith("T~"))return TextShapeSchema.parse(x4);if(x4.startsWith("A~"))return ArcShapeSchema.parse(x4);throw new Error(`Invalid shape type: ${x4}`)}).pipe(external_exports2.union([RectangleShapeOutputSchema,EllipseShapeOutputSchema,PinShapeOutputSchema,PolylineShapeOutputSchema,PolygonShapeOutputSchema,PathShapeOutputSchema,TextShapeOutputSchema,ArcShapeOutputSchema])),maybeNumber=external_exports2.any().transform(k4=>k4==="nan"||Number.isNaN(k4)?null:k4).pipe(external_exports2.number().nullable().optional()),SzlcscSchema=external_exports2.object({id:external_exports2.number(),number:external_exports2.string(),step:external_exports2.number().optional(),min:external_exports2.number().optional(),price:external_exports2.number().optional(),stock:external_exports2.number().optional(),url:external_exports2.string().url().optional(),image:external_exports2.string().optional().optional()}),LcscSchema=external_exports2.object({id:external_exports2.number(),number:external_exports2.string(),step:external_exports2.number().optional(),min:external_exports2.number().optional(),price:external_exports2.number().optional(),stock:external_exports2.number().optional(),url:external_exports2.string().url().optional()}),OwnerSchema=external_exports2.object({uuid:external_exports2.string(),username:external_exports2.string(),nickname:external_exports2.string(),avatar:external_exports2.string()}),HeadSchema=external_exports2.object({docType:external_exports2.preprocess(val=>val==null?val:String(val),external_exports2.string()),editorVersion:external_exports2.string(),c_para:external_exports2.record(external_exports2.string(),external_exports2.string().nullable()),x:external_exports2.number(),y:external_exports2.number(),puuid:external_exports2.string().optional(),uuid:external_exports2.string(),utime:external_exports2.preprocess(val=>val===""?0:typeof val=="string"?Number(val):val,external_exports2.number()),importFlag:external_exports2.number().optional(),c_spiceCmd:external_exports2.any().optional(),hasIdFlag:external_exports2.boolean()}),BBoxSchema=external_exports2.object({x:external_exports2.number(),y:external_exports2.number(),width:external_exports2.number(),height:external_exports2.number()}),LayerItemSchema=external_exports2.object({name:external_exports2.string(),color:external_exports2.string(),visible:external_exports2.boolean(),active:external_exports2.boolean(),config:external_exports2.boolean(),transparency:external_exports2.boolean()}),ObjectItemSchema=external_exports2.object({name:external_exports2.string(),visible:external_exports2.boolean(),locked:external_exports2.boolean()}),DataStrSchema=external_exports2.object({head:HeadSchema,canvas:external_exports2.string(),shape:external_exports2.array(SingleLetterShapeSchema),BBox:BBoxSchema,colors:external_exports2.union([external_exports2.array(external_exports2.string()),external_exports2.record(external_exports2.string())])}),PackageDetailDataStrSchema=external_exports2.object({head:HeadSchema,canvas:external_exports2.string(),shape:external_exports2.array(external_exports2.string()).transform(shapes=>shapes.map(shape=>{let[type,...data]=shape.split("~");return ShapeItemSchema.parse({type,data:data.join("~")})})).pipe(external_exports2.array(PackageDetailShapeSchema)),layers:external_exports2.array(external_exports2.string()).transform(layers=>layers.map(layer=>{let[name,color,visible,active,config,transparency]=layer.split("~");return LayerItemSchema.parse({name,color,visible:visible==="true",active:active==="true",config:config==="true",transparency:transparency==="true"})})),objects:external_exports2.array(external_exports2.string()).transform(objects=>objects.map(obj=>{let[name,visible,locked]=obj.split("~");return ObjectItemSchema.parse({name,visible:visible==="true",locked:locked==="true"})})),BBox:BBoxSchema,netColors:external_exports2.array(external_exports2.unknown()).optional()}),PackageDetailSchema=external_exports2.object({uuid:external_exports2.string(),title:external_exports2.string(),docType:external_exports2.number(),updateTime:external_exports2.number(),owner:OwnerSchema,datastrid:external_exports2.string(),writable:external_exports2.boolean(),dataStr:PackageDetailDataStrSchema}),ModelBoundsSchema=external_exports2.object({min:external_exports2.object({x:external_exports2.number(),y:external_exports2.number(),z:external_exports2.number()}),max:external_exports2.object({x:external_exports2.number(),y:external_exports2.number(),z:external_exports2.number()})}),EasyEdaJsonSchema=external_exports2.object({uuid:external_exports2.string(),title:external_exports2.string(),description:external_exports2.string(),docType:external_exports2.number(),type:external_exports2.number(),szlcsc:SzlcscSchema,lcsc:LcscSchema,owner:OwnerSchema,tags:external_exports2.array(external_exports2.string()),category:external_exports2.string().optional(),updateTime:external_exports2.number(),updated_at:external_exports2.string(),dataStr:DataStrSchema,verify:external_exports2.boolean(),SMT:external_exports2.boolean().optional(),datastrid:external_exports2.string(),jlcOnSale:external_exports2.number().optional(),writable:external_exports2.boolean(),isFavorite:external_exports2.boolean(),packageDetail:PackageDetailSchema,_objMetadata:external_exports2.object({bounds:ModelBoundsSchema}).optional()}),getModelObjCdnUrl=({easyedaModelUuid,easyedaPartNumber})=>`https://modelcdn.tscircuit.com/easyeda_models/assets/${easyedaPartNumber}.obj?uuid=${easyedaModelUuid}`,getModelCdnUrl=getModelObjCdnUrl,getModelUuidFromRawPackageDetail=result=>{let shapes=result.packageDetail?.dataStr?.shape;if(!Array.isArray(shapes))return null;for(let shape of shapes){if(typeof shape!="string"||!shape.startsWith("SVGNODE~"))continue;let svgNodeJson=shape.slice(8);try{let modelUuid=JSON.parse(svgNodeJson)?.attrs?.uuid;if(typeof modelUuid=="string"&&modelUuid.length>0)return modelUuid}catch{}}return null},parseObjBounds2=objText=>{let minX=Number.POSITIVE_INFINITY,minY=Number.POSITIVE_INFINITY,minZ=Number.POSITIVE_INFINITY,maxX=Number.NEGATIVE_INFINITY,maxY=Number.NEGATIVE_INFINITY,maxZ=Number.NEGATIVE_INFINITY,vertexCount=0;for(let line2 of objText.split(/\r?\n/)){let trimmed=line2.trim();if(!trimmed.startsWith("v "))continue;let[,xStr,yStr,zStr]=trimmed.split(/\s+/,4),x4=Number(xStr),y4=Number(yStr),z4=Number(zStr);!Number.isFinite(x4)||!Number.isFinite(y4)||!Number.isFinite(z4)||(vertexCount+=1,minX=Math.min(minX,x4),minY=Math.min(minY,y4),minZ=Math.min(minZ,z4),maxX=Math.max(maxX,x4),maxY=Math.max(maxY,y4),maxZ=Math.max(maxZ,z4))}return vertexCount===0?null:{min:{x:minX,y:minY,z:minZ},max:{x:maxX,y:maxY,z:maxZ}}};async function fetchEasyEDAComponent(jlcpcbPartNumber,{fetch:fetch22=globalThis.fetch,includeModelMetadata=!0}={}){let searchUrl="https://easyeda.com/api/components/search",componentUrl=uuid=>`https://easyeda.com/api/components/${uuid}?version=6.4.7&uuid=${uuid}&datastrid=`,searchHeaders={authority:"easyeda.com",pragma:"no-cache","cache-control":"no-cache",accept:"application/json, text/javascript, */*; q=0.01","x-requested-with":"XMLHttpRequest","user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36","content-type":"application/x-www-form-urlencoded; charset=UTF-8",origin:"https://easyeda.com","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty",referer:"https://easyeda.com/editor","accept-language":"cs,en;q=0.9,sk;q=0.8,en-GB;q=0.7",cookie:"<PUT your cookies here>"},searchData=`type=3&doctype%5B%5D=2&uid=0819f05c4eef4c71ace90d822a990e87&returnListStyle=classifyarr&wd=${jlcpcbPartNumber}&version=6.4.7`,searchResponse=await fetch22(searchUrl,{method:"POST",headers:searchHeaders,body:searchData});if(!searchResponse.ok)throw new Error("Failed to search for the component");let searchResult=await searchResponse.json();if(!searchResult.success||!searchResult.result.lists.lcsc.length)throw new Error("Component not found");let componentUUID=(searchResult.result.lists.lcsc.find(component=>component.dataStr.head.c_para["Supplier Part"]===jlcpcbPartNumber)??searchResult.result.lists.lcsc[0]).uuid,componentResponse=await fetch22(componentUrl(componentUUID),{method:"GET",headers:{...searchHeaders,referer:`https://easyeda.com/editor?uuid=${componentUUID}`}});if(!componentResponse.ok)throw new Error("Failed to fetch the component details");let result=(await componentResponse.json()).result;if(includeModelMetadata){let modelUuid=getModelUuidFromRawPackageDetail(result),partNumber=result.lcsc?.number;if(modelUuid&&partNumber)try{let objUrl=getModelCdnUrl({easyedaModelUuid:modelUuid,easyedaPartNumber:partNumber}),objResponse=await fetch22(objUrl);if(objResponse.ok){let objText=await objResponse.text(),bounds=parseObjBounds2(objText);bounds&&(result._objMetadata={bounds})}}catch(error2){console.error(`Error fetching model metadata for ${jlcpcbPartNumber}:`,error2)}}return result}var getFootprinterStringFromKicad=kicadFootprint=>{let match2=kicadFootprint.match(/:[RC]_(\d{4})_/);if(match2||(match2=kicadFootprint.match(/:(SOIC-\d+|SOT-\d+|SOD-\d+|SSOP-\d+|TSSOP-\d+|QFP-\d+|QFN-\d+)/),match2))return match2[1]},getJlcPackageFromFootprinterString=footprinterString=>footprinterString.includes("cap")?footprinterString.replace(/cap/g,""):footprinterString,getJlcpcbPackageName=footprint=>{if(footprint){if(footprint.startsWith("kicad:")){let footprinterString=getFootprinterStringFromKicad(footprint);return footprinterString?getJlcPackageFromFootprinterString(footprinterString):footprint}return getJlcPackageFromFootprinterString(footprint)}},EASYEDA_API_ORIGIN="https://easyeda.com",METHODS_WITHOUT_BODY=new Set(["GET","HEAD"]),getRequestUrl=requestInput=>typeof requestInput=="string"?requestInput:requestInput instanceof URL?requestInput.toString():requestInput.url,createMergedTargetRequest=(requestInput,requestInit)=>requestInput instanceof URL?new Request(requestInput.toString(),requestInit):typeof requestInput=="string"?new Request(requestInput,requestInit):new Request(requestInput,requestInit),isEasyEdaApiRequestUrl=requestUrl=>requestUrl.startsWith(`${EASYEDA_API_ORIGIN}/api/`),getFetchWithEasyEdaProxy=({platformFetch:upstreamFetch,easyEdaProxyConfig})=>async(requestInput,requestInit)=>{let targetRequestUrl=getRequestUrl(requestInput);if(!isEasyEdaApiRequestUrl(targetRequestUrl))return upstreamFetch(requestInput,requestInit);let mergedTargetRequest=createMergedTargetRequest(requestInput,requestInit),targetRequestHeaders=new Headers(mergedTargetRequest.headers),proxyRequestHeaders=new Headers(targetRequestHeaders);proxyRequestHeaders.delete("origin"),proxyRequestHeaders.delete("authority"),proxyRequestHeaders.delete("host"),proxyRequestHeaders.delete("referer"),proxyRequestHeaders.delete("user-agent"),proxyRequestHeaders.delete("cookie"),proxyRequestHeaders.set("X-Target-Url",targetRequestUrl),proxyRequestHeaders.set("X-Sender-Origin",targetRequestHeaders.get("origin")??""),proxyRequestHeaders.set("X-Sender-Host",targetRequestHeaders.get("host")??EASYEDA_API_ORIGIN),proxyRequestHeaders.set("X-Sender-Referer",targetRequestHeaders.get("referer")??""),proxyRequestHeaders.set("X-Sender-User-Agent",targetRequestHeaders.get("user-agent")??""),proxyRequestHeaders.set("X-Sender-Cookie",targetRequestHeaders.get("cookie")??""),proxyRequestHeaders.set("authority",targetRequestHeaders.get("authority")??targetRequestHeaders.get("host")??""),proxyRequestHeaders.set("content-type",targetRequestHeaders.get("content-type")??"");for(let[name,value]of Object.entries(easyEdaProxyConfig.headers??{}))proxyRequestHeaders.set(name,value);let proxyRequestBody=METHODS_WITHOUT_BODY.has(mergedTargetRequest.method)?void 0:await mergedTargetRequest.clone().arrayBuffer();return upstreamFetch(easyEdaProxyConfig.proxyEndpointUrl,{method:mergedTargetRequest.method,headers:proxyRequestHeaders,body:proxyRequestBody,signal:requestInit?.signal})},cache=new Map,getJlcPartsCached=async(name,params)=>{let paramString=new URLSearchParams({...params,json:"true"}).toString();if(cache.has(paramString))return cache.get(paramString);let responseJson=await(await fetch(`https://jlcsearch.tscircuit.com/${name}/list?${paramString}`)).json();return cache.set(paramString,responseJson),responseJson},withBasicPartPreference=parts=>parts?[...parts].sort((a3,b3)=>Number(b3.is_basic??!1)-Number(a3.is_basic??!1)):[],JlcPcbPartsEngine=class{constructor({platformFetch:defaultPlatformFetch,easyEdaProxyConfig}={}){__publicField(this,"defaultPlatformFetch");__publicField(this,"easyEdaProxyConfig");this.defaultPlatformFetch=defaultPlatformFetch,this.easyEdaProxyConfig=easyEdaProxyConfig,this.fetchPartCircuitJson=this.fetchPartCircuitJson.bind(this)}getEasyEdaPlatformFetch(platformFetchOverride){let resolvedPlatformFetch=platformFetchOverride??this.defaultPlatformFetch??globalThis.fetch;return this.easyEdaProxyConfig?getFetchWithEasyEdaProxy({platformFetch:resolvedPlatformFetch,easyEdaProxyConfig:this.easyEdaProxyConfig}):resolvedPlatformFetch}async findPart({sourceComponent,footprinterString}){let jlcpcbPackage=getJlcpcbPackageName(footprinterString);if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_resistor"){let{resistors}=await getJlcPartsCached("resistors",{resistance:sourceComponent.resistance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(resistors).map(r5=>`C${r5.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_capacitor"){let{capacitors}=await getJlcPartsCached("capacitors",{capacitance:sourceComponent.capacitance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(capacitors).map(c4=>`C${c4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_pin_header"){let pitch;footprinterString?.includes("_p")&&(pitch=Number(footprinterString.split("_p")[1]));let{headers}=await getJlcPartsCached("headers",pitch?{pitch,num_pins:sourceComponent.pin_count,gender:sourceComponent.gender}:{num_pins:sourceComponent.pin_count,gender:sourceComponent.gender});return{jlcpcb:withBasicPartPreference(headers).map(h6=>`C${h6.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_potentiometer"){let{potentiometers}=await getJlcPartsCached("potentiometers",{resistance:sourceComponent.max_resistance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(potentiometers).map(p4=>`C${p4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_diode"){let{diodes}=await getJlcPartsCached("diodes",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(diodes).map(d4=>`C${d4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_chip"){if(!jlcpcbPackage||!footprinterString)return{};let{chips}=await getJlcPartsCached("chips",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(chips).map(c4=>`C${c4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_transistor"){let{transistors}=await getJlcPartsCached("transistors",{package:jlcpcbPackage,transistor_type:sourceComponent.transistor_type});return{jlcpcb:withBasicPartPreference(transistors).map(t52=>`C${t52.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_power_source"){let{power_sources}=await getJlcPartsCached("power_sources",{voltage:sourceComponent.voltage,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(power_sources).map(p4=>`C${p4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_inductor"){let{inductors}=await getJlcPartsCached("inductors",{inductance:sourceComponent.inductance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(inductors).map(i3=>`C${i3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_crystal"){let{crystals}=await getJlcPartsCached("crystals",{frequency:sourceComponent.frequency,load_capacitance:sourceComponent.load_capacitance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(crystals).map(c4=>`C${c4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_mosfet"){let{mosfets}=await getJlcPartsCached("mosfets",{package:jlcpcbPackage,mosfet_mode:sourceComponent.mosfet_mode,channel_type:sourceComponent.channel_type});return{jlcpcb:withBasicPartPreference(mosfets).map(m4=>`C${m4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_resonator"){let{resonators}=await getJlcPartsCached("resonators",{frequency:sourceComponent.frequency,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(resonators).map(r5=>`C${r5.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_switch"){let{switches}=await getJlcPartsCached("switches",{switch_type:sourceComponent.type,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(switches).map(s3=>`C${s3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_led"){let{leds}=await getJlcPartsCached("leds",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(leds).map(l4=>`C${l4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_fuse"){let{fuses}=await getJlcPartsCached("fuses",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(fuses).map(l4=>`C${l4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_connector"&&sourceComponent.standard==="usb_c"){let{usb_c_connectors}=await getJlcPartsCached("usb_c_connectors",{});return{jlcpcb:withBasicPartPreference(usb_c_connectors).map(c4=>`C${c4.lcsc}`).slice(0,3)}}return{}}async fetchPartCircuitJson({supplierPartNumber,manufacturerPartNumber,platformFetch:platformFetchOverride}){let easyEdaPlatformFetch=this.getEasyEdaPlatformFetch(platformFetchOverride),resolvedSupplierPartNumber=supplierPartNumber;if(!resolvedSupplierPartNumber&&manufacturerPartNumber){let{components}=await getJlcPartsCached("components",{search:manufacturerPartNumber});resolvedSupplierPartNumber=components?.[0]?`C${components[0].lcsc}`:void 0}if(!resolvedSupplierPartNumber)return;let rawEasyEdaJson=await fetchEasyEDAComponent(resolvedSupplierPartNumber,{fetch:easyEdaPlatformFetch}),parsed=EasyEdaJsonSchema.parse(rawEasyEdaJson);return convertEasyEdaJsonToCircuitJson(parsed)}},jlcPartsEngine=new JlcPcbPartsEngine;var gridRouter=__toESM(require_grid_router(),1);async function initKiCadRoutingToolsAutorouter(){}var KiCadRoutingToolsAutorouter=class{constructor(input2,options={}){__publicField(this,"input");__publicField(this,"options");__publicField(this,"isRouting",!1);__publicField(this,"cachedTraces",null);__publicField(this,"completeHandlers",[]);__publicField(this,"errorHandlers",[]);__publicField(this,"progressHandlers",[]);this.input=input2,this.options=options}on(event,callback){if(event==="complete"){this.completeHandlers.push(callback);return}if(event==="error"){this.errorHandlers.push(callback);return}this.progressHandlers.push(callback)}start(){this.isRouting||(this.isRouting=!0,this.emitProgress(0,"initializing KiCadRoutingTools wasm router"),this.solve().then(traces=>{this.isRouting&&(this.isRouting=!1,this.emitProgress(1,"routing complete"),this.emitComplete(traces))},error2=>{this.isRouting=!1,this.emitError(error2)}))}stop(){this.isRouting=!1}async solve(){return this.cachedTraces?this.cachedTraces:(await initKiCadRoutingToolsAutorouter(),this.cachedTraces=this.solveSync(),this.cachedTraces)}solveSync(){return this.cachedTraces??(this.cachedTraces=gridRouter.routeSimpleRouteJson(this.input,normalizeOptions(this.options))),(this.options.collapseShortSameLayerTunnels??!0)&&(this.cachedTraces=collapseShortSameLayerTunnels(this.cachedTraces)),this.cachedTraces}emitComplete(traces){for(let handler of this.completeHandlers)handler({type:"complete",traces})}emitError(error2){let normalizedError=error2 instanceof Error?error2:new Error(String(error2));for(let handler of this.errorHandlers)handler({type:"error",error:normalizedError})}emitProgress(progress,phase){for(let handler of this.progressHandlers)handler({type:"progress",steps:Math.round(progress*this.input.connections.length),progress,phase})}};function createKiCadRoutingToolsAutorouter(options={}){return async simpleRouteJson=>(await initKiCadRoutingToolsAutorouter(),new KiCadRoutingToolsAutorouter(simpleRouteJson,options))}function normalizeOptions(options){return{gridStep:options.gridStep??.1,clearance:options.clearance??.2,maxIterations:options.maxIterations??3e5,viaCost:options.viaCost??5e4,hWeight:options.hWeight??1.25,turnCost:options.turnCost??1e3,trackMargin:options.trackMargin??0,layerCosts:options.layerCosts,layerDirectionPreferences:options.layerDirectionPreferences,directionPreferenceCost:options.directionPreferenceCost??0}}function collapseShortSameLayerTunnels(traces){return traces.map(trace=>({...trace,route:collapseTraceRoute(trace.route??[],1)}))}function collapseTraceRoute(route,maxTunnelLength){let collapsed=[],index=0;for(;index<route.length;){let replacement=getShortTunnelReplacement(route.slice(index),maxTunnelLength);if(replacement){collapsed.push(replacement),index+=6;continue}collapsed.push(route[index]),index+=1}return collapsed}function getShortTunnelReplacement(route,maxTunnelLength){let[start,viaIn,innerStart,innerEnd,viaOut,end]=route;return start?.route_type!=="wire"||viaIn?.route_type!=="via"||innerStart?.route_type!=="wire"||innerEnd?.route_type!=="wire"||viaOut?.route_type!=="via"||end?.route_type!=="wire"||start.layer!==viaIn.from_layer||viaIn.to_layer!==innerStart.layer||innerStart.layer!==innerEnd.layer||viaOut.from_layer!==innerStart.layer||viaOut.to_layer!==start.layer||end.layer!==start.layer||!samePoint(start,viaIn)||!samePoint(start,innerStart)||!samePoint(innerEnd,viaOut)||!samePoint(innerEnd,end)||Math.hypot(end.x-start.x,end.y-start.y)>maxTunnelLength?null:{route_type:"wire",x:end.x,y:end.y,layer:start.layer,width:start.width}}function samePoint(a3,b3){return Math.abs(a3.x-b3.x)<1e-6&&Math.abs(a3.y-b3.y)<1e-6}var import_s_expression=__toESM(require_s_expression(),1);init_zod();var import_debug20=__toESM(require_browser(),1),import_debug21=__toESM(require_browser(),1),point22=external_exports.tuple([external_exports.coerce.number(),external_exports.coerce.number()]),point34=external_exports.tuple([external_exports.number(),external_exports.number(),external_exports.number()]),point6=external_exports.union([point22,point34]),fp_poly_arc_segment_def=external_exports.object({kind:external_exports.literal("arc"),start:point22,mid:point22,end:point22}),fp_poly_point_def=external_exports.union([point22,fp_poly_arc_segment_def]),attributes_def=external_exports.object({at:point6,size:point22,layer:external_exports.string(),layers:external_exports.array(external_exports.string()),roundrect_rratio:external_exports.number(),uuid:external_exports.string()}).partial(),property_def=external_exports.object({key:external_exports.string(),val:external_exports.string(),attributes:attributes_def}),drill_def=external_exports.object({oval:external_exports.boolean().default(!1),width:external_exports.number().optional(),height:external_exports.number().optional(),offset:point22.optional()}),hole_def=external_exports.object({name:external_exports.string(),pad_type:external_exports.enum(["thru_hole","smd","np_thru_hole","connect"]),pad_shape:external_exports.enum(["roundrect","circle","rect","oval","trapezoid","custom"]),at:point6,drill:external_exports.union([external_exports.number(),external_exports.array(external_exports.any()),drill_def]).transform(a3=>typeof a3=="number"?{oval:!1,width:a3,height:a3}:"oval"in a3?a3:a3.length===2?{oval:!1,width:Number.parseFloat(a3[0]),height:Number.parseFloat(a3[0]),offset:point22.parse(a3[1].slice(1))}:a3.length===3||a3.length===4?{oval:a3[0]==="oval",width:Number.parseFloat(a3[1]),height:Number.parseFloat(a3[2]),offset:a3[3]?point22.parse(a3[3].slice(1)):void 0}:a3).pipe(drill_def),size:external_exports.union([external_exports.array(external_exports.number()).length(2).transform(([w4,h6])=>({width:w4,height:h6})),external_exports.object({width:external_exports.number(),height:external_exports.number()})]),layers:external_exports.array(external_exports.string()).optional(),roundrect_rratio:external_exports.number().optional(),uuid:external_exports.string().optional()}),pad_def2=external_exports.object({name:external_exports.string(),pad_type:external_exports.enum(["thru_hole","smd","np_thru_hole","connect"]),pad_shape:external_exports.enum(["roundrect","circle","rect","oval","trapezoid","custom"]),at:point6,size:point22,drill:external_exports.union([external_exports.number(),external_exports.array(external_exports.any()),drill_def]).transform(a3=>typeof a3=="number"?{oval:!1,width:a3,height:a3}:"oval"in a3?a3:a3.length===2?{oval:!1,width:Number.parseFloat(a3[0]),height:Number.parseFloat(a3[0]),offset:point22.parse(a3[1].slice(1))}:a3.length===3||a3.length===4?{oval:a3[0]==="oval",width:Number.parseFloat(a3[1]),height:Number.parseFloat(a3[2]),offset:a3[3]?point22.parse(a3[3].slice(1)):void 0}:a3).pipe(drill_def).optional(),layers:external_exports.array(external_exports.string()).optional(),roundrect_rratio:external_exports.number().optional(),chamfer_ratio:external_exports.number().optional(),solder_paste_margin:external_exports.number().optional(),solder_paste_margin_ratio:external_exports.number().optional(),clearance:external_exports.number().optional(),zone_connection:external_exports.union([external_exports.literal(0).describe("Pad is not connect to zone"),external_exports.literal(1).describe("Pad is connected to zone using thermal relief"),external_exports.literal(2).describe("Pad is connected to zone using solid fill")]).optional(),thermal_width:external_exports.number().optional(),thermal_gap:external_exports.number().optional(),uuid:external_exports.string().optional()}),effects_def=external_exports.object({font:external_exports.object({size:point22,thickness:external_exports.number().optional()})}).partial(),fp_text_def=external_exports.object({fp_text_type:external_exports.literal("user"),text:external_exports.string(),at:point6,layer:external_exports.string(),uuid:external_exports.string().optional(),effects:effects_def.partial()}),fp_arc_def=external_exports.object({start:point22,mid:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}),layer:external_exports.string(),uuid:external_exports.string().optional()}),fp_circle_def=external_exports.object({center:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}),fill:external_exports.string().optional(),layer:external_exports.string(),uuid:external_exports.string().optional()}),fp_poly_def=external_exports.object({pts:external_exports.array(fp_poly_point_def),stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}).optional(),width:external_exports.number().optional(),layer:external_exports.string(),uuid:external_exports.string().optional(),fill:external_exports.string().optional()}).transform(data=>({...data,width:void 0,stroke:data.stroke??{width:data.width}})),fp_rect_def=external_exports.object({start:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}).optional(),width:external_exports.number().optional(),fill:external_exports.string().optional(),layer:external_exports.string(),uuid:external_exports.string().optional()}).transform(data=>({...data,width:void 0,stroke:data.stroke??{width:data.width}})),fp_line=external_exports.object({start:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}).optional(),width:external_exports.number().optional(),layer:external_exports.string(),uuid:external_exports.string().optional()}).transform(data=>({...data,width:void 0,stroke:data.stroke??{width:data.width}})),kicad_mod_json_def=external_exports.object({footprint_name:external_exports.string(),version:external_exports.string().optional(),generator:external_exports.string().optional(),generator_version:external_exports.string().optional(),layer:external_exports.string(),descr:external_exports.string().default(""),tags:external_exports.array(external_exports.string()).optional(),properties:external_exports.array(property_def),fp_lines:external_exports.array(fp_line),fp_rects:external_exports.array(fp_rect_def).optional(),fp_texts:external_exports.array(fp_text_def),fp_arcs:external_exports.array(fp_arc_def),fp_circles:external_exports.array(fp_circle_def).optional(),fp_polys:external_exports.array(fp_poly_def).optional(),pads:external_exports.array(pad_def2),holes:external_exports.array(hole_def).optional()}),formatAttr=(val,attrKey)=>{if(attrKey==="effects"&&Array.isArray(val)){let effectsObj={};for(let elm of val)if(elm[0]==="font"){let fontObj={};for(let fontElm of elm.slice(1))fontElm.length===2?fontObj[fontElm[0].valueOf()]=Number.parseFloat(fontElm[1].valueOf()):fontObj[fontElm[0].valueOf()]=fontElm.slice(1).map(n4=>Number.parseFloat(n4.valueOf()));effectsObj.font=fontObj}return effects_def.parse(effectsObj)}if(attrKey==="pts")return val.map(segment2=>{let segmentType=segment2[0]?.valueOf?.()??segment2[0];if(segmentType==="xy")return segment2.slice(1).map(n4=>Number.parseFloat(n4.valueOf()));if(segmentType==="arc"){let arcObj={kind:"arc"};for(let arcAttr of segment2.slice(1)){let key=arcAttr[0].valueOf();arcObj[key]=arcAttr.slice(1).map(n4=>Number.parseFloat(n4.valueOf()))}return arcObj}return segment2});if(attrKey==="stroke"){let strokeObj={};for(let strokeElm of val){let strokePropKey=strokeElm[0].valueOf();strokeObj[strokePropKey]=formatAttr(strokeElm.slice(1),strokePropKey)}return strokeObj}return attrKey==="at"||attrKey==="size"||attrKey==="start"||attrKey==="mid"||attrKey==="end"?(Array.isArray(val)?val:[val]).map(n4=>n4?.valueOf?.()??n4).filter(v4=>typeof v4=="number"||typeof v4=="string"&&/^[-+]?\d*\.?\d+(e[-+]?\d+)?$/i.test(v4)).map(v4=>typeof v4=="number"?v4:Number.parseFloat(v4)):attrKey==="tags"?val.map(n4=>n4.valueOf()):attrKey==="generator_version"||attrKey==="version"?val[0].valueOf():val.length===2?val.valueOf():attrKey==="uuid"?Array.isArray(val)?val[0].valueOf():val.valueOf():/^[\d\.]+$/.test(val)&&!Number.isNaN(Number.parseFloat(val))?Number.parseFloat(val):Array.isArray(val)&&val.length===1?val[0].valueOf():Array.isArray(val)?val.map(s3=>s3.valueOf()):val},getAttr=(s3,key)=>{for(let elm of s3)if(Array.isArray(elm)&&elm[0]===key)return formatAttr(elm.slice(1),key)},debug11=(0,import_debug20.default)("kicad-mod-converter"),parseKicadModToKicadJson=fileContent=>{let kicadSExpr=(0,import_s_expression.default)(fileContent),footprintName=kicadSExpr[1].valueOf(),topLevelAttributes={},simpleTopLevelAttributes=Object.entries(kicad_mod_json_def.shape).filter(([attributeKey,def])=>def._def.typeName==="ZodString"||attributeKey==="tags").map(([attributeKey])=>attributeKey);for(let kicadSExprRow of kicadSExpr.slice(2)){if(!simpleTopLevelAttributes.includes(kicadSExprRow[0]))continue;let key=kicadSExprRow[0].valueOf(),val=formatAttr(kicadSExprRow.slice(1),key);topLevelAttributes[key]=val}let properties=kicadSExpr.slice(2).filter(row=>row[0]==="property").map(row=>{let key=row[1].valueOf(),val=row[2].valueOf(),attributes2=attributes_def.parse(row.slice(3).reduce((acc,attrAr)=>{let attrKey=attrAr[0].valueOf();return acc[attrKey]=formatAttr(attrAr.slice(1),attrKey),acc},{}));return{key,val,attributes:attributes2}}),padRows=kicadSExpr.slice(2).filter(row=>row[0]==="pad"),pads=[];for(let row of padRows){let at3=getAttr(row,"at"),size3=getAttr(row,"size"),drill=getAttr(row,"drill"),layers=getAttr(row,"layers");Array.isArray(layers)?layers=layers.map(layer=>layer.valueOf()):typeof layers=="string"?layers=[layers]:layers||(layers=[]);let padType=row[2].valueOf(),isCu=layers.some(l4=>l4.endsWith(".Cu")||l4==="*.Cu"||l4.includes(".Cu"));if(padType==="thru_hole")continue;if(!isCu&&padType!=="np_thru_hole"){debug11(`Skipping pad without copper layer: layers=${layers.join(", ")}`);continue}let roundrect_rratio=getAttr(row,"roundrect_rratio"),uuid=getAttr(row,"uuid"),padRaw={name:row[1].valueOf(),pad_type:row[2].valueOf(),pad_shape:row[3].valueOf(),at:at3,drill,size:size3,layers,roundrect_rratio,uuid};debug11(`attempting to parse pad: ${JSON.stringify(padRaw,null," ")}`),pads.push(pad_def2.parse(padRaw))}let fp_texts_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_text"),fp_texts=[];for(let fp_text_row of fp_texts_rows){let text=fp_text_row[2].valueOf(),at3=getAttr(fp_text_row,"at"),layer=getAttr(fp_text_row,"layer"),uuid=getAttr(fp_text_row,"uuid"),effects=getAttr(fp_text_row,"effects");fp_texts.push({fp_text_type:"user",text,at:at3,layer,uuid,effects})}let fp_lines=[],fp_lines_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_line");for(let fp_line_row of fp_lines_rows){let start=getAttr(fp_line_row,"start"),end=getAttr(fp_line_row,"end"),stroke=getAttr(fp_line_row,"stroke"),layer=getAttr(fp_line_row,"layer"),uuid=getAttr(fp_line_row,"uuid");fp_lines.push({start,end,stroke,layer,uuid})}let fp_rects=[],fp_rect_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_rect");for(let fp_rect_row of fp_rect_rows){let start=getAttr(fp_rect_row,"start"),end=getAttr(fp_rect_row,"end"),stroke=getAttr(fp_rect_row,"stroke"),layer=getAttr(fp_rect_row,"layer"),fill=getAttr(fp_rect_row,"fill"),uuid=getAttr(fp_rect_row,"uuid");!start||!end||!layer||fp_rects.push({start,end,stroke,fill,layer,uuid})}let fp_arcs=[],fp_arcs_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_arc");for(let fp_arc_row of fp_arcs_rows){let start=getAttr(fp_arc_row,"start"),mid=getAttr(fp_arc_row,"mid"),end=getAttr(fp_arc_row,"end"),stroke=getAttr(fp_arc_row,"stroke"),layer=getAttr(fp_arc_row,"layer"),uuid=getAttr(fp_arc_row,"uuid");!start||!end||!mid||!stroke||!layer||fp_arcs.push({start,mid,end,stroke,layer,uuid})}let fp_circles=[],fp_circles_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_circle");for(let fp_circle_row of fp_circles_rows){let center2=getAttr(fp_circle_row,"center"),end=getAttr(fp_circle_row,"end"),stroke=getAttr(fp_circle_row,"stroke"),fill=getAttr(fp_circle_row,"fill"),layer=getAttr(fp_circle_row,"layer"),uuid=getAttr(fp_circle_row,"uuid");!center2||!end||!stroke||!layer||fp_circles.push({center:center2,end,stroke,fill,layer,uuid})}let fp_polys=[],fp_polys_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_poly");for(let fp_poly_row of fp_polys_rows){let pts=getAttr(fp_poly_row,"pts"),stroke=getAttr(fp_poly_row,"stroke"),width=getAttr(fp_poly_row,"width"),layer=getAttr(fp_poly_row,"layer"),uuid=getAttr(fp_poly_row,"uuid"),fill=getAttr(fp_poly_row,"fill"),normalizedStroke=stroke;!normalizedStroke&&typeof width=="number"?normalizedStroke={width,type:"solid"}:normalizedStroke&&typeof normalizedStroke=="object"&&typeof width=="number"&&normalizedStroke.width===void 0&&(normalizedStroke={...normalizedStroke,width}),fp_polys.push({pts,stroke:normalizedStroke,layer,uuid,fill})}let holes=[];for(let row of kicadSExpr.slice(2)){if(row[0]!=="pad"||row[2]?.valueOf?.()!=="thru_hole")continue;let name=row[1]?.valueOf?.(),pad_type=row[2]?.valueOf?.(),pad_shape=row[3]?.valueOf?.(),at3=getAttr(row,"at"),drill=getAttr(row,"drill"),size3=getAttr(row,"size");Array.isArray(size3)&&(size3[0]==="size"&&(size3=size3.slice(1)),size3={width:Number(size3[0]),height:Number(size3[1])});let uuid=getAttr(row,"uuid"),roundrect_rratio=getAttr(row,"roundrect_rratio"),layers=getAttr(row,"layers");Array.isArray(layers)?layers=layers.map(layer=>layer.valueOf()):typeof layers=="string"?layers=[layers]:layers||(layers=[]);let holeRaw={name,pad_type,pad_shape,at:at3,drill,size:size3,layers,roundrect_rratio,uuid};debug11(`attempting to parse holes: ${JSON.stringify(holeRaw,null,2)}`),holes.push(hole_def.parse(holeRaw))}return kicad_mod_json_def.parse({footprint_name:footprintName,...topLevelAttributes,properties,fp_lines,fp_rects,fp_texts,fp_arcs,fp_circles,pads,holes,fp_polys})},TWO_PI=Math.PI*2,normalizeAngle2=angle=>{let result=angle%TWO_PI;return result<0&&(result+=TWO_PI),result},directedAngleCCW=(start,target)=>{let startNorm=normalizeAngle2(start),delta=normalizeAngle2(target)-startNorm;return delta<0&&(delta+=TWO_PI),delta};function calculateCenter(start,mid,end){let mid1={x:(start.x+mid.x)/2,y:(start.y+mid.y)/2},mid2={x:(mid.x+end.x)/2,y:(mid.y+end.y)/2},slope1=-(start.x-mid.x)/(start.y-mid.y),slope2=-(mid.x-end.x)/(mid.y-end.y),centerX=(mid1.y-mid2.y+slope2*mid2.x-slope1*mid1.x)/(slope2-slope1),centerY=mid1.y+slope1*(centerX-mid1.x);return{x:centerX,y:centerY}}function calculateRadius(center2,point42){return Math.sqrt((center2.x-point42.x)**2+(center2.y-point42.y)**2)}function calculateAngle(center2,point42){return Math.atan2(point42.y-center2.y,point42.x-center2.x)}var getArcLength2=(start,mid,end)=>{let center2=calculateCenter(start,mid,end),radius=calculateRadius(center2,start),angleStart=calculateAngle(center2,start),angleMid=calculateAngle(center2,mid),angleEnd=calculateAngle(center2,end),ccwToMid=directedAngleCCW(angleStart,angleMid),ccwToEnd=directedAngleCCW(angleStart,angleEnd),angleDelta=ccwToEnd;return ccwToMid>ccwToEnd&&(angleDelta=ccwToEnd-TWO_PI),Math.abs(radius*angleDelta)};function generateArcPath(start,mid,end,numPoints){let center2=calculateCenter(start,mid,end),radius=calculateRadius(center2,start),angleStart=calculateAngle(center2,start),angleMid=calculateAngle(center2,mid),angleEnd=calculateAngle(center2,end),ccwToMid=directedAngleCCW(angleStart,angleMid),ccwToEnd=directedAngleCCW(angleStart,angleEnd),angleDelta=ccwToEnd;ccwToMid>ccwToEnd&&(angleDelta=ccwToEnd-TWO_PI);let path=[];for(let i3=0;i3<=numPoints;i3++){let angle=angleStart+i3/numPoints*angleDelta,x4=center2.x+radius*Math.cos(angle),y4=center2.y+radius*Math.sin(angle);path.push({x:x4,y:y4})}return path}var makePoint=p4=>Array.isArray(p4)?{x:p4[0],y:p4[1]}:p4,pointsEqual4=(p12,p22,tolerance=1e-4)=>Math.abs(p12.x-p22.x)<tolerance&&Math.abs(p12.y-p22.y)<tolerance,findClosedPolygons=segments=>{let polygons=[],used=new Set;for(let i3=0;i3<segments.length;i3++){if(used.has(i3))continue;let polygon2=[segments[i3]];used.add(i3);let currentEnd=segments[i3].end,foundNext=!0;for(;foundNext;){if(foundNext=!1,polygon2.length>1&&pointsEqual4(currentEnd,polygon2[0].start)){polygons.push(polygon2);break}for(let j4=0;j4<segments.length;j4++)if(!used.has(j4)){if(pointsEqual4(currentEnd,segments[j4].start)){polygon2.push(segments[j4]),used.add(j4),currentEnd=segments[j4].end,foundNext=!0;break}else if(pointsEqual4(currentEnd,segments[j4].end)){segments[j4].type==="arc"?polygon2.push({...segments[j4],reversed:!0}):polygon2.push({...segments[j4],start:segments[j4].end,end:segments[j4].start}),used.add(j4),currentEnd=segments[j4].start,foundNext=!0;break}}if(!foundNext){for(let k4=polygon2.length-1;k4>=0;k4--){let idx=segments.indexOf(polygon2[k4]);idx!==-1&&used.delete(idx)}break}}}return polygons},polygonToPoints=polygon2=>{let points=[];for(let segment2 of polygon2)if(segment2.type==="line")points.push(segment2.start);else if(segment2.type==="arc"&&segment2.mid){let arcLength2=getArcLength2(segment2.start,segment2.mid,segment2.end),numPoints=Math.max(3,Math.ceil(arcLength2)),arcPoints=generateArcPath(segment2.start,segment2.mid,segment2.end,numPoints);segment2.reversed&&(arcPoints=arcPoints.reverse()),points.push(...arcPoints.slice(0,-1))}return points};function getSilkscreenFontSizeFromFpTexts(fp_texts){if(!Array.isArray(fp_texts))return null;let refText=fp_texts.find(t52=>t52.layer?.toLowerCase()==="f.silks"&&(t52.text?.includes("${REFERENCE}")||t52.fp_text_type?.toLowerCase()==="reference"||t52.text?.match(/^R\d+|C\d+|U\d+/))),fallbackText=refText||fp_texts.find(t52=>t52.layer?.toLowerCase()==="f.fab"&&(t52.text?.includes("${REFERENCE}")||t52.fp_text_type?.toLowerCase()==="reference")),target=refText||fallbackText;if(!target?.effects?.font?.size)return null;let[width,height]=target.effects.font.size;return height??width??1}var degToRad=deg=>deg*Math.PI/180,rotatePoint4=(x4,y4,deg)=>{let r5=degToRad(deg),cos6=Math.cos(r5),sin6=Math.sin(r5);return{x:x4*cos6-y4*sin6,y:x4*sin6+y4*cos6}},getAxisAlignedRectFromPoints=points=>{let uniquePoints=[...new Map(points.map(p4=>[`${p4.x},${p4.y}`,p4])).values()];if(uniquePoints.length!==4)return null;let xs3=uniquePoints.map(p4=>p4.x),ys3=uniquePoints.map(p4=>p4.y),uniqueXs=[...new Set(xs3)],uniqueYs=[...new Set(ys3)];if(uniqueXs.length!==2||uniqueYs.length!==2)return null;let[minX,maxX]=uniqueXs.sort((a3,b3)=>a3-b3),[minY,maxY]=uniqueYs.sort((a3,b3)=>a3-b3);return minX===void 0||maxX===void 0||minY===void 0||maxY===void 0?null:{x:(minX+maxX)/2,y:(minY+maxY)/2,width:maxX-minX,height:maxY-minY}},fpPolyHasFill=fill=>{if(!fill)return!1;let normalized=fill.toLowerCase();return normalized!=="no"&&normalized!=="none"&&normalized!=="outline"},getRotationDeg=at3=>at3&&Array.isArray(at3)&&at3.length>=3&&typeof at3[2]=="number"?at3[2]:0,isNinetyLike=deg=>{let n4=(deg%360+360)%360;return n4===90||n4===270},normalizePortName=name=>{if(name!=null)return`${name}`},getPinNumber=name=>{let normalized=normalizePortName(name),parsed=normalized!==void 0?Number(normalized):NaN;return Number.isFinite(parsed)?parsed:void 0},debug23=(0,import_debug21.default)("kicad-mod-converter"),convertKicadLayerToTscircuitLayer=kicadLayer=>{switch(kicadLayer.toLowerCase()){case"f.cu":case"f.fab":case"f.silks":case"f.crtyd":case"edge.cuts":return"top";case"b.cu":case"b.fab":case"b.silks":case"b.crtyd":return"bottom"}},convertKicadJsonToTsCircuitSoup=async kicadJson=>{let{fp_lines,fp_rects,fp_texts,fp_arcs,fp_circles,pads,properties,holes,fp_polys}=kicadJson,circuitJson=[];circuitJson.push({type:"source_component",source_component_id:"source_component_0",supplier_part_numbers:{}}),circuitJson.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 portNames=new Set,portNameToPinNumber=new Map;for(let pad2 of pads){let portName=normalizePortName(pad2.name);if(portName){portNames.add(portName);let pinNumber=getPinNumber(pad2.name);pinNumber!==void 0&&portNameToPinNumber.set(portName,pinNumber)}}if(holes)for(let hole of holes){let portName=normalizePortName(hole.name);if(portName){portNames.add(portName);let pinNumber=getPinNumber(hole.name);pinNumber!==void 0&&portNameToPinNumber.set(portName,pinNumber)}}let sourcePortId=0,portNameToSourcePortId=new Map;for(let portName of portNames){let source_port_id=`source_port_${sourcePortId++}`;portNameToSourcePortId.set(portName,source_port_id);let pinNumber=portNameToPinNumber.get(portName);circuitJson.push({type:"source_port",source_port_id,source_component_id:"source_component_0",name:portName,port_hints:[portName],pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0}),circuitJson.push({type:"schematic_port",schematic_port_id:`schematic_port_${sourcePortId++}`,source_port_id,schematic_component_id:"schematic_component_0",center:{x:0,y:0}})}let minX=Number.POSITIVE_INFINITY,maxX=Number.NEGATIVE_INFINITY,minY=Number.POSITIVE_INFINITY,maxY=Number.NEGATIVE_INFINITY;for(let pad2 of pads){let x4=pad2.at[0],y4=-pad2.at[1],w4=pad2.size[0],h6=pad2.size[1];minX=Math.min(minX,x4-w4/2),maxX=Math.max(maxX,x4+w4/2),minY=Math.min(minY,y4-h6/2),maxY=Math.max(maxY,y4+h6/2)}let pcb_component_id="pcb_component_0";circuitJson.push({type:"pcb_component",source_component_id:"source_component_0",pcb_component_id,layer:"top",center:{x:0,y:0},rotation:0,width:Number.isFinite(minX)?maxX-minX:0,height:Number.isFinite(minY)?maxY-minY:0});let pcbPortId=0,portNameToPcbPortId=new Map;for(let portName of portNames){let pcb_port_id=`pcb_port_${pcbPortId++}`,source_port_id=portNameToSourcePortId.get(portName);portNameToPcbPortId.set(portName,pcb_port_id);let x4=0,y4=0,layers=["top","bottom"],pad2=pads.find(p4=>normalizePortName(p4.name)===portName);if(pad2)x4=pad2.at[0],y4=-pad2.at[1],layers=pad2.layers?pad2.layers.map(l4=>convertKicadLayerToTscircuitLayer(l4)).filter(Boolean):["top","bottom"];else if(holes){let hole=holes.find(h6=>normalizePortName(h6.name)===portName);hole&&(x4=hole.at[0],y4=-hole.at[1],layers=hole.layers?hole.layers.map(l4=>convertKicadLayerToTscircuitLayer(l4)).filter(Boolean):["top","bottom"])}circuitJson.push({type:"pcb_port",pcb_port_id,source_port_id,pcb_component_id,x:x4,y:y4,layers})}let smtpadId=0,platedHoleId=0,holeId=0;for(let pad2 of pads){let portName=normalizePortName(pad2.name),pinNumber=portName?portNameToPinNumber.get(portName):void 0;if(pad2.pad_type==="smd"){let rotation5=getRotationDeg(pad2.at),width=isNinetyLike(rotation5)?pad2.size[1]:pad2.size[0],height=isNinetyLike(rotation5)?pad2.size[0]:pad2.size[1],pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${smtpadId++}`,shape:"rect",x:pad2.at[0],y:-pad2.at[1],width,height,layer:convertKicadLayerToTscircuitLayer(pad2.layers?.[0]??"F.Cu"),pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}else if(pad2.pad_type==="thru_hole"){if(pad2.pad_shape==="rect"){let rotation5=getRotationDeg(pad2.at),width=isNinetyLike(rotation5)?pad2.size[1]:pad2.size[0],height=isNinetyLike(rotation5)?pad2.size[0]:pad2.size[1],offX=pad2.drill?.offset?.[0]??0,offY=pad2.drill?.offset?.[1]??0,rotOff=rotatePoint4(offX,offY,rotation5),pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:pad2.at[0],y:-pad2.at[1],hole_offset_x:-rotOff.x,hole_offset_y:-rotOff.y,hole_diameter:pad2.drill?.width,rect_pad_width:width,rect_pad_height:height,layers:["top","bottom"],pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}else if(pad2.pad_shape==="circle"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circle",x:pad2.at[0],y:-pad2.at[1],outer_diameter:pad2.size[0],hole_diameter:pad2.drill?.width,layers:["top","bottom"],pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}else if(pad2.pad_shape==="oval"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"pill",x:pad2.at[0],y:-pad2.at[1],outer_width:pad2.size[0],outer_height:pad2.size[1],hole_width:pad2.drill?.width,hole_height:pad2.drill?.height,layers:["top","bottom"],pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}}else pad2.pad_type==="np_thru_hole"&&pad2.pad_shape==="circle"&&circuitJson.push({type:"pcb_hole",pcb_hole_id:`pcb_hole_${holeId++}`,x:pad2.at[0],y:-pad2.at[1],hole_shape:"circle",hole_diameter:pad2.drill?.width??pad2.size[0],pcb_component_id})}if(holes)for(let hole of holes){let portName=normalizePortName(hole.name),pinNumber=portName?portNameToPinNumber.get(portName):void 0,hasCuLayer=hole.layers?.some(l4=>l4.endsWith(".Cu")||l4==="*.Cu"),rotation5=getRotationDeg(hole.at),offX=hole.drill?.offset?.[0]??0,offY=hole.drill?.offset?.[1]??0,rotOff=rotatePoint4(offX,offY,rotation5),x4=hole.at[0]+rotOff.x,y4=-(hole.at[1]+rotOff.y),holeDiameter=hole.drill?.width??0,outerDiameter=hole.size?.width??holeDiameter,rr3=hole.roundrect_rratio??0,rectBorderRadius=rr3>0?Math.min(isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,isNinetyLike(rotation5)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter)/2*rr3:0;if(hasCuLayer)if(hole.pad_shape==="rect"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:hole.at[0],y:-hole.at[1],hole_offset_x:-rotOff.x,hole_offset_y:-rotOff.y,hole_diameter:holeDiameter,rect_pad_width:isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,rect_pad_height:isNinetyLike(rotation5)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter,rect_border_radius:rectBorderRadius,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else if(hole.pad_shape==="oval"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"pill",x:x4,y:y4,outer_width:isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,outer_height:isNinetyLike(rotation5)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter,hole_width:isNinetyLike(rotation5)?hole.drill?.height??holeDiameter:hole.drill?.width??holeDiameter,hole_height:isNinetyLike(rotation5)?hole.drill?.width??holeDiameter:hole.drill?.height??holeDiameter,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else if(hole.pad_shape==="roundrect"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,offX2=hole.drill?.offset?.[0]??0,offY2=hole.drill?.offset?.[1]??0,rotOff2=rotatePoint4(offX2,offY2,rotation5),width=isNinetyLike(rotation5)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,height=isNinetyLike(rotation5)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:x4,y:y4,hole_offset_x:-rotOff2.x,hole_offset_y:rotOff2.y,hole_diameter:holeDiameter,rect_pad_width:width,rect_pad_height:height,rect_border_radius:rectBorderRadius,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else{let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circle",x:x4,y:y4,outer_diameter:outerDiameter,hole_diameter:holeDiameter,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else circuitJson.push({type:"pcb_hole",pcb_hole_id:`pcb_hole_${holeId++}`,x:x4,y:y4,hole_shape:"circle",hole_diameter:holeDiameter,pcb_component_id})}let edgeCutSegments=[],frontCourtyardSegments=[],backCourtyardSegments=[];for(let fp_line2 of fp_lines){let lowerLayer=fp_line2.layer.toLowerCase();lowerLayer==="edge.cuts"?edgeCutSegments.push({type:"line",start:{x:fp_line2.start[0],y:fp_line2.start[1]},end:{x:fp_line2.end[0],y:fp_line2.end[1]},strokeWidth:fp_line2.stroke.width}):lowerLayer==="f.crtyd"?frontCourtyardSegments.push({type:"line",start:{x:fp_line2.start[0],y:fp_line2.start[1]},end:{x:fp_line2.end[0],y:fp_line2.end[1]},strokeWidth:fp_line2.stroke.width}):lowerLayer==="b.crtyd"&&backCourtyardSegments.push({type:"line",start:{x:fp_line2.start[0],y:fp_line2.start[1]},end:{x:fp_line2.end[0],y:fp_line2.end[1]},strokeWidth:fp_line2.stroke.width})}for(let fp_arc of fp_arcs){let lowerLayer=fp_arc.layer.toLowerCase();lowerLayer==="edge.cuts"?edgeCutSegments.push({type:"arc",start:{x:fp_arc.start[0],y:fp_arc.start[1]},mid:{x:fp_arc.mid[0],y:fp_arc.mid[1]},end:{x:fp_arc.end[0],y:fp_arc.end[1]},strokeWidth:fp_arc.stroke.width}):lowerLayer==="f.crtyd"?frontCourtyardSegments.push({type:"arc",start:{x:fp_arc.start[0],y:fp_arc.start[1]},mid:{x:fp_arc.mid[0],y:fp_arc.mid[1]},end:{x:fp_arc.end[0],y:fp_arc.end[1]},strokeWidth:fp_arc.stroke.width}):lowerLayer==="b.crtyd"&&backCourtyardSegments.push({type:"arc",start:{x:fp_arc.start[0],y:fp_arc.start[1]},mid:{x:fp_arc.mid[0],y:fp_arc.mid[1]},end:{x:fp_arc.end[0],y:fp_arc.end[1]},strokeWidth:fp_arc.stroke.width})}let closedPolygons=findClosedPolygons(edgeCutSegments),cutoutId=0;for(let polygon2 of closedPolygons){let points=polygonToPoints(polygon2);points.length>=3&&circuitJson.push({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_${cutoutId++}`,shape:"polygon",points:points.map(p4=>({x:p4.x,y:-p4.y})),pcb_component_id})}let courtyardOutlineId=0;for(let[segments,layer]of[[frontCourtyardSegments,"top"],[backCourtyardSegments,"bottom"]]){let closedCourtyardPolygons=findClosedPolygons(segments);for(let polygon2 of closedCourtyardPolygons){let points=polygonToPoints(polygon2);points.length>=3&&circuitJson.push({type:"pcb_courtyard_outline",pcb_courtyard_outline_id:`pcb_courtyard_outline_${courtyardOutlineId++}`,layer,pcb_component_id,outline:points.map(p4=>({x:p4.x,y:-p4.y}))})}}if(fp_rects)for(let fp_rect of fp_rects){let lowerLayer=fp_rect.layer.toLowerCase();if(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"){let x12=fp_rect.start[0],y12=fp_rect.start[1],x22=fp_rect.end[0],y22=fp_rect.end[1];circuitJson.push({type:"pcb_courtyard_rect",pcb_courtyard_rect_id:`pcb_courtyard_rect_${courtyardOutlineId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_rect.layer),center:{x:(x12+x22)/2,y:-((y12+y22)/2)},width:Math.abs(x22-x12),height:Math.abs(y22-y12)})}else debug23("Unhandled layer for fp_rect",fp_rect.layer)}let traceId=0,silkPathId=0,fabPathId=0,noteLineId=0;for(let fp_line2 of fp_lines){let route=[{x:fp_line2.start[0],y:-fp_line2.start[1]},{x:fp_line2.end[0],y:-fp_line2.end[1]}],lowerLayer=fp_line2.layer.toLowerCase();lowerLayer==="f.cu"?circuitJson.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${traceId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_line2.layer),route,thickness:fp_line2.stroke.width}):lowerLayer==="f.silks"?circuitJson.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${silkPathId++}`,pcb_component_id,layer:"top",route,stroke_width:fp_line2.stroke.width}):lowerLayer==="edge.cuts"?debug23("Skipping Edge.Cuts fp_line (converted to pcb_cutout)",fp_line2.layer):lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"?debug23("Skipping CrtYd fp_line (converted to pcb_courtyard_outline)",fp_line2.layer):lowerLayer==="f.fab"?circuitJson.push({type:"pcb_fabrication_note_path",fabrication_note_path_id:`fabrication_note_path_${fabPathId++}`,pcb_component_id,layer:"top",route,stroke_width:fp_line2.stroke.width,port_hints:[]}):lowerLayer.startsWith("user.")?circuitJson.push({type:"pcb_note_line",pcb_note_line_id:`pcb_note_line_${noteLineId++}`,pcb_component_id,x1:fp_line2.start[0],y1:-fp_line2.start[1],x2:fp_line2.end[0],y2:-fp_line2.end[1],stroke_width:fp_line2.stroke.width}):debug23("Unhandled layer for fp_line",fp_line2.layer)}if(fp_polys)for(let fp_poly of fp_polys){let route=[],pushRoutePoint=point42=>{!Number.isFinite(point42.x)||!Number.isFinite(point42.y)||route.push(point42)};for(let segment2 of fp_poly.pts){if(Array.isArray(segment2)){pushRoutePoint({x:segment2[0],y:-segment2[1]});continue}if(segment2&&typeof segment2=="object"&&"kind"in segment2){if(segment2.kind==="arc"){let start=makePoint(segment2.start),mid=makePoint(segment2.mid),end=makePoint(segment2.end),arcLength2=getArcLength2(start,mid,end),adjustedNumPoints=Math.max(2,Math.ceil(arcLength2/.1)),arcPoints=generateArcPath(start,mid,end,adjustedNumPoints).map(p4=>({x:p4.x,y:-p4.y}));for(let point42 of arcPoints)pushRoutePoint(point42)}continue}}let routePoints=route,polygonPoints=routePoints.length>2&&routePoints[0].x===routePoints[routePoints.length-1].x&&routePoints[0].y===routePoints[routePoints.length-1].y?routePoints.slice(0,-1):routePoints;if(routePoints.length===0)continue;let strokeWidth=fp_poly.stroke?.width??0;if(fp_poly.layer.endsWith(".Cu")){let rect=getAxisAlignedRectFromPoints(polygonPoints);rect?circuitJson.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${smtpadId++}`,shape:"rect",x:rect.x,y:rect.y,width:rect.width,height:rect.height,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id}):fpPolyHasFill(fp_poly.fill)?polygonPoints.length>=3?circuitJson.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${smtpadId++}`,shape:"polygon",points:polygonPoints,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id}):polygonPoints.length>=2&&circuitJson.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${traceId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:polygonPoints,thickness:strokeWidth}):polygonPoints.length>=2&&circuitJson.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${traceId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:polygonPoints,thickness:strokeWidth})}else fp_poly.layer.endsWith(".SilkS")?circuitJson.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${silkPathId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:routePoints,stroke_width:strokeWidth}):fp_poly.layer.endsWith(".Fab")?circuitJson.push({type:"pcb_fabrication_note_path",fabrication_note_path_id:`fabrication_note_path_${fabPathId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:polygonPoints,stroke_width:strokeWidth,port_hints:[]}):fp_poly.layer.toLowerCase().endsWith(".crtyd")?polygonPoints.length>=3&&circuitJson.push({type:"pcb_courtyard_polygon",pcb_courtyard_polygon_id:`pcb_courtyard_polygon_${courtyardOutlineId++}`,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id,points:polygonPoints}):debug23("Unhandled layer for fp_poly",fp_poly.layer)}let notePathId=0;for(let fp_arc of fp_arcs){let lowerLayer=fp_arc.layer.toLowerCase();if(lowerLayer==="edge.cuts"){debug23("Skipping Edge.Cuts fp_arc (converted to pcb_cutout)",fp_arc.layer);continue}if(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"){debug23("Skipping CrtYd fp_arc (converted to pcb_courtyard_outline)",fp_arc.layer);continue}let start=makePoint(fp_arc.start),mid=makePoint(fp_arc.mid),end=makePoint(fp_arc.end),arcLength2=getArcLength2(start,mid,end),arcPoints=generateArcPath(start,mid,end,Math.ceil(arcLength2));if(lowerLayer.startsWith("user.")){circuitJson.push({type:"pcb_note_path",pcb_note_path_id:`pcb_note_path_${notePathId++}`,pcb_component_id,route:arcPoints.map(p4=>({x:p4.x,y:-p4.y})),stroke_width:fp_arc.stroke.width});continue}let tscircuitLayer=convertKicadLayerToTscircuitLayer(fp_arc.layer);if(!tscircuitLayer){debug23("Unable to convert layer for fp_arc",fp_arc.layer);continue}circuitJson.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${silkPathId++}`,layer:tscircuitLayer,pcb_component_id,route:arcPoints.map(p4=>({x:p4.x,y:-p4.y})),stroke_width:fp_arc.stroke.width})}if(fp_circles)for(let fp_circle of fp_circles){let lowerLayer=fp_circle.layer.toLowerCase(),center2=makePoint(fp_circle.center),endPoint=makePoint(fp_circle.end),radius=Math.sqrt((endPoint.x-center2.x)**2+(endPoint.y-center2.y)**2),numPoints=Math.max(16,Math.ceil(2*Math.PI*radius)),circlePoints=[];for(let i3=0;i3<=numPoints;i3++){let angle=i3/numPoints*2*Math.PI;circlePoints.push({x:center2.x+radius*Math.cos(angle),y:center2.y+radius*Math.sin(angle)})}lowerLayer.startsWith("user.")?circuitJson.push({type:"pcb_note_path",pcb_note_path_id:`pcb_note_path_${notePathId++}`,pcb_component_id,route:circlePoints.map(p4=>({x:p4.x,y:-p4.y})),stroke_width:fp_circle.stroke.width}):(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd")&&circuitJson.push({type:"pcb_courtyard_circle",pcb_courtyard_circle_id:`pcb_courtyard_circle_${courtyardOutlineId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_circle.layer),center:{x:center2.x,y:-center2.y},radius})}for(let fp_text of fp_texts){let layerRef=convertKicadLayerToTscircuitLayer(fp_text.layer);fp_text.layer.endsWith(".SilkS")?circuitJson.push({type:"pcb_silkscreen_text",layer:layerRef,font:"tscircuit2024",font_size:fp_text.effects?.font?.size[0]??1,pcb_component_id,anchor_position:{x:fp_text.at[0],y:-fp_text.at[1]},anchor_alignment:"center",text:fp_text.text}):fp_text.layer.endsWith(".Fab")?circuitJson.push({type:"pcb_fabrication_note_text",layer:layerRef,font:"tscircuit2024",font_size:fp_text.effects?.font?.size[0]??1,pcb_component_id,anchor_position:{x:fp_text.at[0],y:-fp_text.at[1]},anchor_alignment:"center",text:fp_text.text}):debug23("Unhandled layer for fp_text",fp_text.layer)}let refProp=properties.find(prop=>prop.key==="Reference"),valProp=properties.find(prop=>prop.key==="Value"),propFabTexts=[refProp,valProp].filter(p4=>p4&&!!p4.val);for(let propFab of propFabTexts){let at3=propFab.attributes.at;if(!at3)continue;let isFabLayer=propFab.attributes.layer?.toLowerCase()?.endsWith(".fab"),font_size=getSilkscreenFontSizeFromFpTexts(fp_texts);circuitJson.push({type:isFabLayer?"pcb_fabrication_note_text":"pcb_silkscreen_text",layer:"top",font:"tscircuit2024",font_size,pcb_component_id,anchor_position:{x:at3[0],y:-at3[1]},anchor_alignment:"center",text:propFab.val})}return circuitJson},parseKicadModToCircuitJson=async kicadMod=>{let kicadJson=parseKicadModToKicadJson(kicadMod);return await convertKicadJsonToTsCircuitSoup(kicadJson)};var JSCDN_ORIGIN="https://jscdn.tscircuit.com";function getJscdnPackageUrl(importName){let parsedSpecifier=parseNpmSpecifier(importName),pathParts=[parsedSpecifier.packageName,parsedSpecifier.version];return parsedSpecifier.filePath&&pathParts.push(parsedSpecifier.filePath),`${JSCDN_ORIGIN}/${pathParts.join("/")}`}function parseNpmSpecifier(importName){let pathParts=importName.split("/");if(importName.startsWith("@")){let packageName2=pathParts.slice(0,2).join("/"),packageNameWithVersion2=pathParts[1]??"",versionSeparatorIndex2=packageNameWithVersion2.indexOf("@"),version3="latest",parsedPackageName=packageName2;versionSeparatorIndex2!==-1&&(version3=packageNameWithVersion2.slice(versionSeparatorIndex2+1),parsedPackageName=`${pathParts[0]}/${packageNameWithVersion2.slice(0,versionSeparatorIndex2)}`);let filePath2=pathParts.slice(2).join("/");return{packageName:parsedPackageName,version:version3,filePath:filePath2||void 0}}let packageNameWithVersion=pathParts[0]??importName,versionSeparatorIndex=packageNameWithVersion.indexOf("@"),packageName=packageNameWithVersion,version2="latest";versionSeparatorIndex!==-1&&(packageName=packageNameWithVersion.slice(0,versionSeparatorIndex),version2=packageNameWithVersion.slice(versionSeparatorIndex+1));let filePath=pathParts.slice(1).join("/");return{packageName,version:version2,filePath:filePath||void 0}}var transformJsDelivrImports=code=>code.replace(/from\s*["']\/npm\//g,'from "https://cdn.jsdelivr.net/npm/').replace(/import\s*\(\s*["']\/npm\//g,'import("https://cdn.jsdelivr.net/npm/'),dynamicallyLoadDependencyWithCdnBackup=async packageName=>{try{return(await import(packageName)).default}catch{console.log(`Failed to load ${packageName} locally, trying CDN fallback...`);let cdnUrls=[`${getJscdnPackageUrl(packageName)}/+esm`,`https://cdn.jsdelivr.net/npm/${packageName}/+esm`],lastCdnError;for(let cdnUrl of cdnUrls)try{let res2=await fetch(cdnUrl);if(!res2.ok)throw new Error(`Failed to fetch ${packageName} from CDN: ${res2.statusText}`);let code=await res2.text();code=transformJsDelivrImports(code);let blob=new Blob([code],{type:"application/javascript"}),url2=URL.createObjectURL(blob);try{let{default:loadedModule}=await import(url2);return loadedModule}finally{URL.revokeObjectURL(url2)}}catch(cdnError){lastCdnError=cdnError}throw lastCdnError?(console.error(`CDN fallback for ${packageName} also failed:`,lastCdnError),lastCdnError):new Error(`CDN fallback for ${packageName} failed`)}};init_dist6();function tokenize3(input2){let tokens=[],i3=0,isWhitespace2=ch3=>/\s/.test(ch3),isSymbolInitial=ch3=>/[^\s()"]/u.test(ch3),peek=()=>i3<input2.length?input2[i3]:void 0,advance=()=>{if(i3>=input2.length)throw new SyntaxError("Unexpected end of input");return input2[i3++]};for(;i3<input2.length;){let ch3=peek();if(ch3===void 0)break;let current3=ch3;if(isWhitespace2(current3)){i3++;continue}if(current3===";"){for(;i3<input2.length&&input2[i3]!==`
711
711
  `;)i3++;continue}if(current3==="("){tokens.push({type:"lparen"}),i3++;continue}if(current3===")"){tokens.push({type:"rparen"}),i3++;continue}if(current3==='"'){i3++;let out="";for(;i3<input2.length;){let c4=advance();if(c4==='"')break;if(c4==="\\"){if(i3>=input2.length)throw new SyntaxError("Unterminated escape in string");let e5=advance();switch(e5){case"n":out+=`
712
712
  `;break;case"r":out+="\r";break;case"t":out+=" ";break;case'"':out+='"';break;case"\\":out+="\\";break;default:out+=e5;break}}else out+=c4}if(input2[i3-1]!=='"')throw new SyntaxError("Unterminated string literal");tokens.push({type:"string",value:out});continue}if(isSymbolInitial(current3)||current3==="-"||current3==="+"||current3==="."){let start=i3;for(;i3<input2.length;){let nextChar=input2[i3];if(isWhitespace2(nextChar)||nextChar==="("||nextChar===")"||nextChar==='"')break;i3++}let raw=input2.slice(start,i3);if(raw==="#t"){tokens.push({type:"boolean",value:!0});continue}if(raw==="#f"){tokens.push({type:"boolean",value:!1});continue}if(raw==="nil"){tokens.push({type:"nil"});continue}/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/u.test(raw)?tokens.push({type:"number",value:Number(raw)}):tokens.push({type:"symbol",value:raw});continue}throw new SyntaxError(`Unexpected character: ${JSON.stringify(ch3)} at ${i3}`)}return tokens}function parseToPrimitiveSExpr(input2){let toks=tokenize3(input2),idx=0,peekToken=()=>idx<toks.length?toks[idx]:void 0,advanceToken=()=>{if(idx>=toks.length)throw new SyntaxError("Unexpected end of input");return toks[idx++]};function readForm(){let t52=advanceToken();switch(t52.type){case"lparen":{let list=[];for(;;){let next2=peekToken();if(!next2)throw new SyntaxError("Unmatched '('");if(next2.type==="rparen")break;list.push(readForm())}return advanceToken(),list}case"rparen":throw new SyntaxError("Unmatched ')'");case"number":return t52.value;case"string":return t52.value;case"boolean":return t52.value;case"nil":return null;case"symbol":return t52.value}}let forms=[];for(;peekToken();)forms.push(readForm());return forms}function printSExpr(x4){if(x4===null)return"nil";if(typeof x4=="boolean")return x4?"#t":"#f";if(typeof x4=="number")return Number.isFinite(x4)?String(x4):"nan";if(typeof x4=="string")return/^[^\s()"]+$/u.test(x4)&&x4!=="nil"&&x4!=="#t"&&x4!=="#f"?x4:`"${x4.replace(/["\\\n\r\t]/g,m4=>m4==='"'?'\\"':m4==="\\"?"\\\\":m4===`
713
713
  `?"\\n":m4==="\r"?"\\r":"\\t")}"`;if(Array.isArray(x4))return`(${x4.map(printSExpr).join(" ")})`;throw new Error(`Unsupported S-expression value: ${JSON.stringify(x4)}`)}var DEFAULT_PARENT_TOKEN="__default__",_a6,SxClass=(_a6=class{constructor(){__publicField(this,"isSxClass",!0)}getChildren(){return Object.keys(this).filter(k4=>k4.startsWith("_sx")).map(k4=>this[k4]).filter(v4=>v4&&typeof v4=="object"&&v4.isSxClass)}getStringIndented(){return this.getString().split(`
@@ -932,11 +932,13 @@ ${ctx.logger.stringifyLogs()}`)}if(!resolvedNodeModulePath){if(hasPackageJson&&n
932
932
 
933
933
  ${ctx.logger.stringifyLogs()}`);if(entrypoint&&!resolveEntrypointPath(importName,entrypoint,fsMap))throw new Error(`${importName}'s main path (${entrypoint}) was not found, it may not be built
934
934
 
935
- ${ctx.logger.stringifyLogs()}`)}let platform=ctx.circuit?.platform;if(platform?.nodeModulesResolver){debug14(`Attempting to resolve "${importName}" using nodeModulesResolver`);try{let fileContent=await platform.nodeModulesResolver(importName);if(fileContent){debug14(`Successfully resolved "${importName}" via nodeModulesResolver`);let syntheticPath=`node_modules/${importName}.ts`;ctx.fsMap[syntheticPath]=fileContent,await importLocalFile(syntheticPath,ctx,depth),preSuppliedImports[importName]=preSuppliedImports[syntheticPath];let unprefixedPath2=syntheticPath.replace(/^node_modules\//,"");preSuppliedImports[unprefixedPath2]=preSuppliedImports[syntheticPath];return}debug14(`nodeModulesResolver returned null for "${importName}"`)}catch(error2){debug14(`nodeModulesResolver failed for "${importName}":`,error2)}}throw new Error(`Node module "${importName}" not found`)}await importLocalFile(resolvedNodeModulePath,ctx,depth),preSuppliedImports[importName]=preSuppliedImports[resolvedNodeModulePath];let unprefixedPath=resolvedNodeModulePath.replace(/^node_modules\//,"");if(preSuppliedImports[unprefixedPath]=preSuppliedImports[resolvedNodeModulePath],resolvedNodeModulePath.endsWith("/index.tsx")||resolvedNodeModulePath.endsWith("/index.ts")||resolvedNodeModulePath.endsWith("/index.js")){let unprefixedDirPath=resolvedNodeModulePath.replace(/\/index\.(tsx?|js)$/,"").replace(/^node_modules\//,"");if(preSuppliedImports[unprefixedDirPath]=preSuppliedImports[resolvedNodeModulePath],unprefixedDirPath.startsWith("@")){let scopeParts=unprefixedDirPath.split("/");if(scopeParts.length>=2){let scopedName=`${scopeParts[0]}/${scopeParts[1]}`;preSuppliedImports[scopedName]=preSuppliedImports[resolvedNodeModulePath]}}}};var import_debug25=__toESM(require_browser(),1);var debug15=(0,import_debug25.default)("tsci:eval:import-npm-package");function extractPackagePathFromJSDelivr(url2){let prefix="https://cdn.jsdelivr.net/npm/";return url2.startsWith(prefix)?url2.substring(prefix.length).replace(/\/\+esm$/,""):url2}async function importNpmPackageFromCdn({importName,depth=0},ctx){debug15(`importing npm package from CDN: ${importName}`);let{preSuppliedImports}=ctx;if(preSuppliedImports[importName])return;let npmCdnUrl=`https://cdn.jsdelivr.net/npm/${importName}/+esm`,finalUrl,{content,error:error2}=await globalThis.fetch(npmCdnUrl).then(async res2=>{if(finalUrl=res2.url,!res2.ok)throw new Error(`Could not fetch "${importName}" from jsdelivr: ${res2.statusText}
935
+ ${ctx.logger.stringifyLogs()}`)}let platform=ctx.circuit?.platform;if(platform?.nodeModulesResolver){debug14(`Attempting to resolve "${importName}" using nodeModulesResolver`);try{let fileContent=await platform.nodeModulesResolver(importName);if(fileContent){debug14(`Successfully resolved "${importName}" via nodeModulesResolver`);let syntheticPath=`node_modules/${importName}.ts`;ctx.fsMap[syntheticPath]=fileContent,await importLocalFile(syntheticPath,ctx,depth),preSuppliedImports[importName]=preSuppliedImports[syntheticPath];let unprefixedPath2=syntheticPath.replace(/^node_modules\//,"");preSuppliedImports[unprefixedPath2]=preSuppliedImports[syntheticPath];return}debug14(`nodeModulesResolver returned null for "${importName}"`)}catch(error2){debug14(`nodeModulesResolver failed for "${importName}":`,error2)}}throw new Error(`Node module "${importName}" not found`)}await importLocalFile(resolvedNodeModulePath,ctx,depth),preSuppliedImports[importName]=preSuppliedImports[resolvedNodeModulePath];let unprefixedPath=resolvedNodeModulePath.replace(/^node_modules\//,"");if(preSuppliedImports[unprefixedPath]=preSuppliedImports[resolvedNodeModulePath],resolvedNodeModulePath.endsWith("/index.tsx")||resolvedNodeModulePath.endsWith("/index.ts")||resolvedNodeModulePath.endsWith("/index.js")){let unprefixedDirPath=resolvedNodeModulePath.replace(/\/index\.(tsx?|js)$/,"").replace(/^node_modules\//,"");if(preSuppliedImports[unprefixedDirPath]=preSuppliedImports[resolvedNodeModulePath],unprefixedDirPath.startsWith("@")){let scopeParts=unprefixedDirPath.split("/");if(scopeParts.length>=2){let scopedName=`${scopeParts[0]}/${scopeParts[1]}`;preSuppliedImports[scopedName]=preSuppliedImports[resolvedNodeModulePath]}}}};var import_debug25=__toESM(require_browser(),1);var debug15=(0,import_debug25.default)("tsci:eval:import-npm-package");function extractPackagePathFromCdnUrl(url2,importName){return url2.startsWith("https://cdn.jsdelivr.net/npm/")?url2.substring(29).replace(/\/\+esm$/,""):url2.startsWith("https://jscdn.tscircuit.com/")?importName:url2}async function importNpmPackageFromCdn({importName,depth=0},ctx){debug15(`importing npm package from CDN: ${importName}`);let{preSuppliedImports}=ctx;if(preSuppliedImports[importName])return;let npmCdnUrls=[`${getJscdnPackageUrl(importName)}/+esm`,`https://cdn.jsdelivr.net/npm/${importName}/+esm`],lastCdnError;for(let npmCdnUrl of npmCdnUrls)try{let response=await globalThis.fetch(npmCdnUrl);if(!response.ok)throw new Error(`Could not fetch "${importName}" from ${npmCdnUrl}: ${response.statusText}
936
936
 
937
- ${ctx.logger.stringifyLogs()}`);return{content:await res2.text(),error:null}}).catch(e5=>({error:e5,content:null}));if(error2)throw console.error("Error fetching npm import",importName,error2),error2;let finalImportName=extractPackagePathFromJSDelivr(finalUrl),cwd=dirname(finalImportName),importNames=getImportsFromCode(content);for(let subImportName of importNames)preSuppliedImports[subImportName]||await importEvalPath(subImportName,ctx,depth+1,{cwd});let transformedCode=transformWithSucrase(content,finalImportName||importName);try{let exports=evalCompiledJs(transformedCode,preSuppliedImports,cwd).exports;preSuppliedImports[importName]=exports,preSuppliedImports[finalImportName]=exports,preSuppliedImports[finalUrl]=exports}catch(e5){throw new Error(`Eval npm package error for "${importName}": ${e5.message}
937
+ ${ctx.logger.stringifyLogs()}`);let content=await response.text(),finalImportName=extractPackagePathFromCdnUrl(response.url,importName),cwd=dirname(finalImportName),importNames=getImportsFromCode(content);for(let subImportName of importNames)preSuppliedImports[subImportName]||await importEvalPath(subImportName,ctx,depth+1,{cwd});let transformedCode=transformWithSucrase(content,finalImportName||importName),exports=evalCompiledJs(transformedCode,preSuppliedImports,cwd).exports;preSuppliedImports[importName]=exports,preSuppliedImports[finalImportName]=exports,preSuppliedImports[response.url]=exports;return}catch(error2){lastCdnError=error2}throw lastCdnError instanceof Error?new Error(`Eval npm package error for "${importName}": ${lastCdnError.message}
938
938
 
939
- ${ctx.logger.stringifyLogs()}`)}}var import_debug26=__toESM(require_browser(),1);var debug16=(0,import_debug26.default)("tsci:eval:import-eval-path");async function importEvalPath(importName,ctx,depth=0,opts={}){debug16("importEvalPath called with:",{importName,depth,opts}),ctx.logger.info(`importEvalPath("${importName}", {cwd: "${opts.cwd}", depth: ${depth}})`),debug16(`${" ".repeat(depth)}\u27A1\uFE0F`,importName);let{preSuppliedImports}=ctx,disableCdnLoading=ctx.disableCdnLoading||globalThis.__DISABLE_CDN_LOADING__;if(preSuppliedImports[importName]){ctx.logger.info(`Import "${importName}" in preSuppliedImports[1]`);return}if(importName.startsWith("./")&&preSuppliedImports[importName.slice(2)]){ctx.logger.info(`Import "${importName}" in preSuppliedImports[2]`);return}if(importName.includes("/")&&!importName.startsWith(".")&&!importName.startsWith("/")){let basePkg=importName.split("/")[0],isScoped=basePkg.startsWith("@"),pkgName=isScoped?importName.split("/").slice(0,2).join("/"):basePkg,subpath=isScoped?importName.split("/").slice(2).join("/"):importName.split("/").slice(1).join("/");if(preSuppliedImports[pkgName])try{let resolved=await import(`${pkgName}/${subpath}`);preSuppliedImports[importName]=resolved,ctx.logger.info(`Import "${importName}" resolved from preSuppliedImports base package "${pkgName}"`);return}catch{ctx.logger.info(`Failed to resolve "${importName}" from preSuppliedImports package "${pkgName}", falling back to normal resolution`)}}if(depth>30)throw new Error(`Max depth for imports reached (30) Import Path: ${ctx.importStack.join(" -> ")}`);if(importName.startsWith("/npm/")){let pkgName=importName.replace(/^\/npm\//,"").replace(/\/\+esm$/,"");if(disableCdnLoading)throw new Error(`Cannot find module "${pkgName}". The package is not available in the local environment.
939
+ ${ctx.logger.stringifyLogs()}`):new Error(`Eval npm package error for "${importName}"
940
+
941
+ ${ctx.logger.stringifyLogs()}`)}var import_debug26=__toESM(require_browser(),1);var debug16=(0,import_debug26.default)("tsci:eval:import-eval-path");async function importEvalPath(importName,ctx,depth=0,opts={}){debug16("importEvalPath called with:",{importName,depth,opts}),ctx.logger.info(`importEvalPath("${importName}", {cwd: "${opts.cwd}", depth: ${depth}})`),debug16(`${" ".repeat(depth)}\u27A1\uFE0F`,importName);let{preSuppliedImports}=ctx,disableCdnLoading=ctx.disableCdnLoading||globalThis.__DISABLE_CDN_LOADING__;if(preSuppliedImports[importName]){ctx.logger.info(`Import "${importName}" in preSuppliedImports[1]`);return}if(importName.startsWith("./")&&preSuppliedImports[importName.slice(2)]){ctx.logger.info(`Import "${importName}" in preSuppliedImports[2]`);return}if(importName.includes("/")&&!importName.startsWith(".")&&!importName.startsWith("/")){let basePkg=importName.split("/")[0],isScoped=basePkg.startsWith("@"),pkgName=isScoped?importName.split("/").slice(0,2).join("/"):basePkg,subpath=isScoped?importName.split("/").slice(2).join("/"):importName.split("/").slice(1).join("/");if(preSuppliedImports[pkgName])try{let resolved=await import(`${pkgName}/${subpath}`);preSuppliedImports[importName]=resolved,ctx.logger.info(`Import "${importName}" resolved from preSuppliedImports base package "${pkgName}"`);return}catch{ctx.logger.info(`Failed to resolve "${importName}" from preSuppliedImports package "${pkgName}", falling back to normal resolution`)}}if(depth>30)throw new Error(`Max depth for imports reached (30) Import Path: ${ctx.importStack.join(" -> ")}`);if(importName.startsWith("/npm/")){let pkgName=importName.replace(/^\/npm\//,"").replace(/\/\+esm$/,"");if(disableCdnLoading)throw new Error(`Cannot find module "${pkgName}". The package is not available in the local environment.
940
942
 
941
943
  ${ctx.logger.stringifyLogs()}`);ctx.logger.info(`importNpmPackageFromCdn("${pkgName}")`),await importNpmPackageFromCdn({importName:pkgName,depth},ctx);let pkg=preSuppliedImports[pkgName];pkg&&(preSuppliedImports[importName]=pkg);return}let tsconfigDir=".",tsConfigToUse=ctx.tsConfig;if(ctx.tsConfig&&opts.cwd){let nodeModulesMatch=opts.cwd.match(/^(node_modules\/[^\/]+)/);nodeModulesMatch&&(tsconfigDir=nodeModulesMatch[1],tsConfigToUse=null)}let resolvedLocalImportPath=resolveFilePath(importName,ctx.fsMap,opts.cwd,{tsConfig:tsConfigToUse,tsconfigDir});if(resolvedLocalImportPath){ctx.logger.info(`importLocalFile("${resolvedLocalImportPath}")`),await importLocalFile(resolvedLocalImportPath,ctx,depth),importName!==resolvedLocalImportPath&&(preSuppliedImports[importName]=preSuppliedImports[resolvedLocalImportPath]);return}let tsConfig=ctx.tsConfig??getTsConfig(ctx.fsMap);if(!ctx.tsConfig&&tsConfig&&(ctx.tsConfig=tsConfig),matchesTsconfigPathPattern(importName,tsConfig))throw new Error(`Import "${importName}" matches a tsconfig path alias but could not be resolved to an existing file${opts.cwd?` from directory "${opts.cwd}"`:""}
942
944