@tscircuit/footprinter 0.0.98 → 0.0.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -216,16 +216,16 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
216
216
  x: number;
217
217
  y: number;
218
218
  }>>]>>;
219
- legsoutside: z.ZodOptional<z.ZodBoolean>;
219
+ legsoutside: z.ZodDefault<z.ZodBoolean>;
220
220
  }, {}>, "strip", z.ZodTypeAny, {
221
221
  fn: string;
222
222
  num_pins: number;
223
223
  p: number;
224
+ legsoutside: boolean;
224
225
  w?: number | undefined;
225
226
  pw?: number | undefined;
226
227
  h?: number | undefined;
227
228
  pl?: number | undefined;
228
- legsoutside?: boolean | undefined;
229
229
  ccw?: boolean | undefined;
230
230
  startingpin?: ("leftside" | "topside" | "rightside" | "bottomside" | "toppin" | "bottompin" | "leftpin" | "rightpin")[] | undefined;
231
231
  cc?: boolean | undefined;
@@ -250,11 +250,11 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
250
250
  fn: string;
251
251
  num_pins: number;
252
252
  p: number;
253
+ legsoutside: boolean;
253
254
  w?: number | undefined;
254
255
  pw?: number | undefined;
255
256
  h?: number | undefined;
256
257
  pl?: number | undefined;
257
- legsoutside?: boolean | undefined;
258
258
  ccw?: boolean | undefined;
259
259
  startingpin?: ("leftside" | "topside" | "rightside" | "bottomside" | "toppin" | "bottompin" | "leftpin" | "rightpin")[] | undefined;
260
260
  cc?: boolean | undefined;
@@ -397,16 +397,16 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
397
397
  x: number;
398
398
  y: number;
399
399
  }>>]>>;
400
- legsoutside: z.ZodOptional<z.ZodBoolean>;
400
+ legsoutside: z.ZodDefault<z.ZodBoolean>;
401
401
  }, {}>, "strip", z.ZodTypeAny, {
402
402
  fn: string;
403
403
  num_pins: number;
404
404
  p: number;
405
+ legsoutside: boolean;
405
406
  w?: number | undefined;
406
407
  pw?: number | undefined;
407
408
  h?: number | undefined;
408
409
  pl?: number | undefined;
409
- legsoutside?: boolean | undefined;
410
410
  ccw?: boolean | undefined;
411
411
  startingpin?: ("leftside" | "topside" | "rightside" | "bottomside" | "toppin" | "bottompin" | "leftpin" | "rightpin")[] | undefined;
412
412
  cc?: boolean | undefined;
@@ -431,11 +431,11 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
431
431
  fn: string;
432
432
  num_pins: number;
433
433
  p: number;
434
+ legsoutside: boolean;
434
435
  w?: number | undefined;
435
436
  pw?: number | undefined;
436
437
  h?: number | undefined;
437
438
  pl?: number | undefined;
438
- legsoutside?: boolean | undefined;
439
439
  ccw?: boolean | undefined;
440
440
  startingpin?: ("leftside" | "topside" | "rightside" | "bottomside" | "toppin" | "bottompin" | "leftpin" | "rightpin")[] | undefined;
441
441
  cc?: boolean | undefined;
@@ -480,16 +480,16 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
480
480
  x: number;
481
481
  y: number;
482
482
  }>>]>>;
483
- legsoutside: z.ZodOptional<z.ZodBoolean>;
483
+ legsoutside: z.ZodDefault<z.ZodBoolean>;
484
484
  }, "strip", z.ZodTypeAny, {
485
485
  fn: string;
486
486
  num_pins: number;
487
487
  p: number;
488
+ legsoutside: boolean;
488
489
  w?: number | undefined;
489
490
  pw?: number | undefined;
490
491
  h?: number | undefined;
491
492
  pl?: number | undefined;
492
- legsoutside?: boolean | undefined;
493
493
  ccw?: boolean | undefined;
494
494
  startingpin?: ("leftside" | "topside" | "rightside" | "bottomside" | "toppin" | "bottompin" | "leftpin" | "rightpin")[] | undefined;
495
495
  cc?: boolean | undefined;
@@ -514,11 +514,11 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
514
514
  fn: string;
515
515
  num_pins: number;
516
516
  p: number;
517
+ legsoutside: boolean;
517
518
  w?: number | undefined;
518
519
  pw?: number | undefined;
519
520
  h?: number | undefined;
520
521
  pl?: number | undefined;
521
- legsoutside?: boolean | undefined;
522
522
  ccw?: boolean | undefined;
523
523
  startingpin?: ("leftside" | "topside" | "rightside" | "bottomside" | "toppin" | "bottompin" | "leftpin" | "rightpin")[] | undefined;
524
524
  cc?: boolean | undefined;
@@ -563,16 +563,16 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
563
563
  x: number;
564
564
  y: number;
565
565
  }>>]>>;
566
- legsoutside: z.ZodOptional<z.ZodBoolean>;
566
+ legsoutside: z.ZodDefault<z.ZodBoolean>;
567
567
  }, "strip", z.ZodTypeAny, {
568
568
  fn: string;
569
569
  num_pins: number;
570
570
  p: number;
571
+ legsoutside: boolean;
571
572
  w?: number | undefined;
572
573
  pw?: number | undefined;
573
574
  h?: number | undefined;
574
575
  pl?: number | undefined;
575
- legsoutside?: boolean | undefined;
576
576
  ccw?: boolean | undefined;
577
577
  startingpin?: ("leftside" | "topside" | "rightside" | "bottomside" | "toppin" | "bottompin" | "leftpin" | "rightpin")[] | undefined;
578
578
  cc?: boolean | undefined;
@@ -597,11 +597,11 @@ declare const any_footprinter_def: z.ZodUnion<[z.ZodObject<{
597
597
  fn: string;
598
598
  num_pins: number;
599
599
  p: number;
600
+ legsoutside: boolean;
600
601
  w?: number | undefined;
601
602
  pw?: number | undefined;
602
603
  h?: number | undefined;
603
604
  pl?: number | undefined;
604
- legsoutside?: boolean | undefined;
605
605
  ccw?: boolean | undefined;
606
606
  startingpin?: ("leftside" | "topside" | "rightside" | "bottomside" | "toppin" | "bottompin" | "leftpin" | "rightpin")[] | undefined;
607
607
  cc?: boolean | undefined;
@@ -995,6 +995,10 @@ type Footprinter = {
995
995
  };
996
996
  declare const string: (def: string) => Footprinter;
997
997
  declare const getFootprintNames: () => string[];
998
+ declare const getFootprintNamesByType: () => {
999
+ passiveFootprints: string[];
1000
+ normalFootprints: string[];
1001
+ };
998
1002
  declare const footprinter: {
999
1003
  (): Footprinter & {
1000
1004
  string: typeof string;
@@ -1014,4 +1018,4 @@ declare const fp: {
1014
1018
  getFootprintNames: () => string[];
1015
1019
  };
1016
1020
 
1017
- export { type Footprinter, type FootprinterParamsBuilder, footprinter, fp, getFootprintNames, string };
1021
+ export { type Footprinter, type FootprinterParamsBuilder, footprinter, fp, getFootprintNames, getFootprintNamesByType, string };
package/dist/index.js CHANGED
@@ -717,7 +717,7 @@ var base_quad_def = z8.object({
717
717
  pw: length5.optional(),
718
718
  pl: length5.optional(),
719
719
  thermalpad: z8.union([z8.literal(true), dim2d]).optional(),
720
- legsoutside: z8.boolean().optional()
720
+ legsoutside: z8.boolean().default(false)
721
721
  });
722
722
  var quadTransform = (v) => {
723
723
  if (v.w && !v.h) {
@@ -2497,6 +2497,19 @@ var string = (def) => {
2497
2497
  var getFootprintNames = () => {
2498
2498
  return Object.keys(fn_exports);
2499
2499
  };
2500
+ var getFootprintNamesByType = () => {
2501
+ const allFootprints = Object.keys(fn_exports);
2502
+ const passiveFootprints = allFootprints.filter((name) => {
2503
+ const fn = fn_exports[name];
2504
+ return fn.toString().includes("passive(");
2505
+ });
2506
+ return {
2507
+ passiveFootprints,
2508
+ normalFootprints: allFootprints.filter(
2509
+ (name) => !passiveFootprints.includes(name)
2510
+ )
2511
+ };
2512
+ };
2500
2513
  var footprinter = () => {
2501
2514
  const proxy = new Proxy(
2502
2515
  {},
@@ -2573,6 +2586,7 @@ export {
2573
2586
  footprinter,
2574
2587
  fp,
2575
2588
  getFootprintNames,
2589
+ getFootprintNamesByType,
2576
2590
  string
2577
2591
  };
2578
2592
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fn/index.ts","../src/helpers/u-curve.ts","../src/helpers/platedhole.ts","../src/fn/dip.ts","../src/helpers/silkscreenRef.ts","../src/helpers/rectpad.ts","../src/helpers/passive-fn.ts","../src/fn/diode.ts","../src/fn/cap.ts","../src/fn/led.ts","../src/fn/res.ts","../src/helpers/zod/ALPHABET.ts","../src/fn/bga.ts","../src/helpers/zod/dim-2d.ts","../src/helpers/zod/function-call.ts","../src/fn/soic.ts","../src/fn/quad.ts","../src/helpers/zod/pin-order-specifier.ts","../src/helpers/get-quad-pin-map.ts","../src/fn/qfn.ts","../src/fn/qfp.ts","../src/fn/mlp.ts","../src/fn/ssop.ts","../src/fn/tssop.ts","../src/fn/sot236.ts","../src/fn/sot363.ts","../src/fn/sot23.ts","../src/fn/dfn.ts","../src/helpers/corner.ts","../src/fn/pinrow.ts","../src/fn/sot563.ts","../src/fn/ms012.ts","../src/fn/ms013.ts","../src/fn/sot723.ts","../src/fn/sod123.ts","../src/fn/axial.ts","../src/fn/pushbutton.ts","../src/helpers/silkscreenpath.ts","../src/fn/stampboard.ts","../src/fn/stampreceiver.ts","../src/fn/lqfp.ts","../src/fn/sot235.ts","../src/fn/breakoutheaders.ts","../src/helpers/is-not-null.ts","../src/footprinter.ts"],"sourcesContent":["export { dip } from \"./dip\"\nexport { diode } from \"./diode\"\nexport { cap } from \"./cap\"\nexport { led } from \"./led\"\nexport { res } from \"./res\"\nexport { bga } from \"./bga\"\nexport { soic } from \"./soic\"\nexport { quad } from \"./quad\"\nexport { qfn } from \"./qfn\"\nexport { qfp } from \"./qfp\"\nexport { mlp } from \"./mlp\"\nexport { ssop } from \"./ssop\"\nexport { tssop } from \"./tssop\"\nexport { sot236 } from \"./sot236\"\nexport { sot363 } from \"./sot363\"\nexport { sot23 } from \"./sot23\"\nexport { dfn } from \"./dfn\"\nexport { pinrow } from \"./pinrow\"\nexport { sot563 } from \"./sot563\"\nexport { ms012 } from \"./ms012\"\nexport { ms013 } from \"./ms013\"\nexport { sot723 } from \"./sot723\"\nexport { sod123 } from \"./sod123\"\nexport { axial } from \"./axial\"\nexport { pushbutton } from \"./pushbutton\"\nexport { stampboard } from \"./stampboard\"\nexport { stampreceiver } from \"./stampreceiver\"\nexport { lqfp } from \"./lqfp\"\nexport { sot235 } from \"./sot235\"\nexport { breakoutheaders } from \"./breakoutheaders\"\n","export const u_curve = Array.from({ length: 9 }, (_, i) =>\n Math.cos((i / 8) * Math.PI - Math.PI),\n).map((x) => ({\n x,\n y: -Math.sqrt(1 - x ** 2),\n}))\n","import type { PcbPlatedHole } from \"circuit-json\"\nimport { mm } from \"@tscircuit/mm\"\n\nexport const platedhole = (\n pn: number,\n x: number,\n y: number,\n id: number | string,\n od: number | string,\n): PcbPlatedHole => {\n return {\n type: \"pcb_plated_hole\",\n shape: \"circle\",\n x,\n y,\n hole_diameter: mm(id),\n outer_diameter: mm(od),\n pcb_port_id: \"\",\n layers: [\"top\", \"bottom\"],\n port_hints: [pn.toString()],\n }\n}\n","import type {\n AnyCircuitElement,\n PcbFabricationNoteText,\n PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const extendDipDef = (newDefaults: { w?: string; p?: string }) =>\n z\n .object({\n fn: z.string(),\n num_pins: z.number().optional().default(6),\n wide: z.boolean().optional(),\n narrow: z.boolean().optional(),\n w: length.optional(),\n p: length.default(length.parse(newDefaults.p ?? \"2.54mm\")),\n id: length.optional(),\n od: length.optional(),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.id && !v.od) {\n v.id = length.parse(\"1.0mm\")\n v.od = length.parse(\"1.5mm\")\n } else if (!v.id) {\n v.id = v.od! * (1.0 / 1.5)\n } else if (!v.od) {\n v.od = v.id! * (1.5 / 1.0)\n }\n\n // Default width (TODO high pin counts should probably be wide?)\n if (!v.w) {\n if (v.wide) {\n v.w = length.parse(\"600mil\")\n } else if (v.narrow) {\n v.w = length.parse(\"300mil\")\n } else {\n v.w = length.parse(newDefaults.w ?? \"300mil\")\n }\n }\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"id\" | \"od\">\n })\n\nexport const dip_def = extendDipDef({})\n\nexport const getCcwDipCoords = (\n pinCount: number,\n pn: number,\n w: number,\n p: number,\n) => {\n /** pin height */\n const ph = pinCount / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a DIP package.\n */\nexport const dip = (raw_params: {\n dip: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = dip_def.parse(raw_params)\n const platedHoles: AnyCircuitElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwDipCoords(\n parameters.num_pins,\n i + 1,\n parameters.w,\n parameters.p ?? 2.54,\n )\n platedHoles.push(\n platedhole(i + 1, x, y, parameters.id ?? \"0.8mm\", parameters.od ?? \"1mm\"),\n )\n }\n /** silkscreen width */\n const sw = parameters.w - parameters.od - 0.4\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.od + 0.4\n const silkscreenBorder: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPins: PcbFabricationNoteText[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const isLeft = i < parameters.num_pins / 2\n const pinLabelX = isLeft\n ? -parameters.w / 2 - parameters.p / 2 - 0.2\n : parameters.p / 2 + parameters.w / 2 + 0.2\n const pinLabelY = isLeft\n ? (-sh + 1.6) / 2 + i * parameters.p\n : (-sh + 1.6) / 2 + (i - parameters.num_pins / 2) * parameters.p\n const silkscreenPin = {\n type: \"pcb_fabrication_note_text\",\n layer: \"top\",\n pcb_component_id: `pin_${i + 1}`,\n pcb_silkscreen_text_id: `pin_${i + 1}`,\n text: `{pin${i + 1}}`,\n anchor_position: {\n x: pinLabelX,\n y: pinLabelY,\n },\n font_size: 0.3,\n font_color: \"red\",\n font: \"tscircuit2024\",\n anchor_alignment: \"top-left\",\n }\n\n silkscreenPins.push(silkscreenPin)\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, sh / 2 + 0.5, 0.4)\n\n return {\n circuitJson: [\n ...platedHoles,\n silkscreenBorder,\n silkscreenRefText,\n ...silkscreenPins,\n ],\n parameters,\n }\n}\n","import type { PcbSilkscreenText } from \"circuit-json\"\n\nexport const silkscreenRef: (\n x: number,\n y: number,\n font_size: number,\n) => PcbSilkscreenText = (x: number, y: number, font_size: number) => {\n return {\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: \"silkscreen_text_1\",\n font: \"tscircuit2024\",\n font_size: font_size,\n pcb_component_id: \"pcb_component_1\",\n text: \"{REF}\",\n layer: \"top\",\n anchor_position: { x: x, y: y },\n anchor_alignment: \"center\",\n }\n}\nexport type SilkscreenRef = ReturnType<typeof silkscreenRef>\n","import type { PCBSMTPad } from \"circuit-json\"\nexport const rectpad = (\n pn: number | Array<string | number>,\n x: number,\n y: number,\n w: number,\n h: number,\n): PCBSMTPad => {\n return {\n type: \"pcb_smtpad\",\n x,\n y,\n width: w,\n height: h,\n layer: \"top\",\n shape: \"rect\",\n pcb_smtpad_id: \"\",\n port_hints: Array.isArray(pn)\n ? pn.map((item) => item.toString())\n : [pn.toString()],\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport mm from \"@tscircuit/mm\"\nimport { platedhole } from \"./platedhole\"\nimport { z } from \"zod\"\nimport { length, distance } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"./silkscreenRef\"\n\ntype StandardSize = {\n imperial: string\n metric: string\n Z_mm_min: number\n G_mm_min: number\n X_mm_min: number\n C_mm_ref: number\n}\n\n// https://www.worthingtonassembly.com/perfect-0201-footprint\n// https://static1.squarespace.com/static/54982a02e4b02e9f5e5d9ca7/t/660c692f69a0d83a4afecdf0/1712089391915/Discrete+Component+Footprints.pdf\n// https://page.venkel.com/hubfs/Resources/Technical/Resistors%20Landing%20Pattern.pdf\nconst sizes = [\n {\n imperial: \"01005\",\n metric: \"0402\",\n Z_mm_min: 0.58,\n G_mm_min: 0.18,\n X_mm_min: 0.21,\n C_mm_ref: 0.038,\n },\n {\n imperial: \"0201\",\n metric: \"0603\",\n Z_mm_min: 0.9,\n G_mm_min: 0.3,\n X_mm_min: 0.3,\n C_mm_ref: 0.6,\n },\n {\n imperial: \"0402\",\n metric: \"1005\",\n Z_mm_min: 1.6,\n G_mm_min: 0.4,\n X_mm_min: 0.7,\n C_mm_ref: 1,\n },\n {\n imperial: \"0603\",\n metric: \"1608\",\n Z_mm_min: 2.6,\n G_mm_min: 0.6,\n X_mm_min: 1.0,\n C_mm_ref: 1.7,\n },\n {\n imperial: \"0805\",\n metric: \"2012\",\n Z_mm_min: 3.0,\n G_mm_min: 0.6,\n X_mm_min: 1.2,\n C_mm_ref: 1.9,\n },\n {\n imperial: \"1206\",\n metric: \"3216\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 1.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"1210\",\n metric: \"3225\",\n Z_mm_min: 3.2,\n G_mm_min: 1.0,\n X_mm_min: 2.5,\n C_mm_ref: 2.0,\n },\n {\n imperial: \"2010\",\n metric: \"5025\",\n Z_mm_min: 5.0,\n G_mm_min: 1.2,\n X_mm_min: 2.5,\n C_mm_ref: 3.6,\n },\n {\n imperial: \"2512\",\n metric: \"6332\",\n Z_mm_min: 6.3,\n G_mm_min: 1.2,\n X_mm_min: 3.2,\n C_mm_ref: 4.5,\n },\n]\nconst metricMap: Record<string, StandardSize> = sizes.reduce((acc: any, s) => {\n acc[s.metric] = s\n return acc\n}, {})\nconst imperialMap: Record<string, StandardSize> = sizes.reduce(\n (acc: any, s) => {\n acc[s.imperial] = s\n return acc\n },\n {},\n)\n\nexport const passive_def = z.object({\n tht: z.boolean(),\n p: length,\n pw: length.optional(),\n ph: length.optional(),\n metric: distance.optional(),\n imperial: distance.optional(),\n w: length.optional(),\n h: length.optional(),\n})\n\nexport type PassiveDef = z.input<typeof passive_def>\n\nconst deriveXFromH = (h: number) => 0.079 * h ** 2 + 0.94 * h - 0.009\nconst deriveZFromW = (w: number) => 1.09 * w + 0.6\nconst deriveGFromW = (w: number) => 0.59 * w - 0.31\nconst deriveCFromW = (w: number) => -0.01 * w ** 2 + 0.94 * w + 0.03\n\nexport const passive = (params: PassiveDef): AnySoupElement[] => {\n let { tht, p, pw, ph, metric, imperial, w, h } = params\n\n if (typeof w === \"string\") w = mm(w)\n if (typeof h === \"string\") h = mm(h)\n if (typeof p === \"string\") p = mm(p)\n if (typeof pw === \"string\") pw = mm(pw)\n if (typeof ph === \"string\") ph = mm(ph)\n\n if (h! > w!) {\n throw new Error(\n \"height cannot be greater than width (rotated footprint not yet implemented)\",\n )\n }\n\n /** standard size */\n let sz: StandardSize | undefined\n if (metric) {\n sz = metricMap[metric]\n }\n\n if (imperial) {\n sz = imperialMap[imperial]\n }\n\n if (!sz && w && h && !pw && !ph) {\n sz = {\n imperial: \"custom\",\n metric: \"custom\",\n Z_mm_min: deriveZFromW(w),\n G_mm_min: deriveGFromW(w),\n X_mm_min: deriveXFromH(h),\n C_mm_ref: deriveCFromW(w),\n }\n }\n\n if (sz) {\n w = sz.Z_mm_min\n h = sz.X_mm_min\n p = sz.C_mm_ref\n pw = (sz.Z_mm_min - sz.G_mm_min) / 2\n ph = (sz.Z_mm_min - sz.G_mm_min) / 2\n }\n\n if (pw === undefined) throw new Error(\"could not infer pad width\")\n if (ph === undefined) throw new Error(\"could not infer pad width\")\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, 0.9, 0.2)\n if (tht) {\n return [\n platedhole(1, -p / 2, 0, pw, (pw * 1) / 0.8),\n platedhole(2, p / 2, 0, pw, (pw * 1) / 0.8),\n silkscreenRefText,\n ]\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return [\n rectpad([\"1\", \"left\"], -p / 2, 0, pw, ph),\n rectpad([\"2\", \"right\"], p / 2, 0, pw, ph),\n silkscreenRefText,\n ]\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { passive, type PassiveDef } from \"src/helpers/passive-fn\"\n\nexport const diode = (parameters: {\n tht: boolean\n p: number\n}): { circuitJson: AnySoupElement[]; parameters: PassiveDef } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const cap = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: PassiveDef } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const led = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: PassiveDef } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\n\nexport const res = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","export const ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n","import type { AnySoupElement, PCBSMTPad } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { ALPHABET } from \"../helpers/zod/ALPHABET\"\nimport { z } from \"zod\"\nimport { length, distance } from \"circuit-json\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { function_call } from \"src/helpers/zod/function-call\"\nimport type { NowDefined } from \"src/helpers/zod/now-defined\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const bga_def = z\n .object({\n fn: z.string(),\n num_pins: z.number().optional().default(64),\n grid: dim2d.optional(),\n p: distance.default(\"0.8mm\"),\n w: length.optional(),\n h: length.optional(),\n ball: length.optional().describe(\"ball diameter\"),\n pad: length.optional().describe(\"pad width/height\"),\n\n tlorigin: z.boolean().optional(),\n blorigin: z.boolean().optional(),\n trorigin: z.boolean().optional(),\n brorigin: z.boolean().optional(),\n\n missing: function_call.default([]),\n })\n .transform((a) => {\n let origin: \"tl\" | \"bl\" | \"tr\" | \"br\" = \"tl\"\n if (a.blorigin) origin = \"bl\"\n if (a.trorigin) origin = \"tr\"\n if (a.brorigin) origin = \"br\"\n\n if (!a.grid) {\n // find the largest square for the number of pins\n const largest_square = Math.ceil(Math.sqrt(a.num_pins))\n a.grid = { x: largest_square, y: largest_square }\n }\n\n if (a.missing) {\n a.missing = a.missing.map((s) => {\n if (typeof s === \"number\") return s\n if (s === \"center\") return \"center\"\n if (s === \"topleft\") return \"topleft\"\n const m = s.match(/([A-Z]+)(\\d+)/)\n if (!m) return s\n const Y = ALPHABET.indexOf(m[1]!)\n const X = Number.parseInt(m[2]!) - 1\n return Y * a.grid!.x + X + 1\n })\n }\n\n const new_def = { ...a, origin }\n\n return new_def as NowDefined<typeof new_def, \"w\" | \"h\" | \"grid\">\n })\n\nexport type BgaDefInput = z.input<typeof bga_def>\nexport type BgaDef = z.infer<typeof bga_def>\n\nexport const bga = (\n raw_params: BgaDefInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = bga_def.parse(raw_params)\n let { num_pins, grid, p, w, h, ball, pad, missing } = parameters\n\n ball ??= (0.75 / 1.27) * p\n\n pad ??= ball * 0.8\n\n const pads: PCBSMTPad[] = []\n\n const missing_pin_nums = (missing ?? []).filter((a) => typeof a === \"number\")\n const num_pins_missing = grid.x * grid.y - num_pins\n\n if (missing.length === 0 && num_pins_missing > 0) {\n // No missing pins specified, let's see if a squared center works\n // if num_pins_missing is a square\n if (Math.sqrt(num_pins_missing) % 1 === 0) {\n missing.push(\"center\")\n } else if (num_pins_missing === 1) {\n missing.push(\"topleft\")\n }\n }\n\n if (missing?.includes(\"center\")) {\n // Find the largest square that's square is less than\n // the number of missing pins\n const square_size = Math.floor(Math.sqrt(num_pins_missing))\n\n // Find the top left coordinate of the inner square, keep\n // in mind the full grid size is grid.x x grid.y\n const inner_square_x = Math.floor((grid.x - square_size) / 2)\n const inner_square_y = Math.floor((grid.y - square_size) / 2)\n\n // Add all the missing square pin numbers to missing_pin_nums\n for (let y = inner_square_y; y < inner_square_y + square_size; y++) {\n for (let x = inner_square_x; x < inner_square_x + square_size; x++) {\n missing_pin_nums.push(y * grid.x + x + 1)\n }\n }\n }\n\n if (missing?.includes(\"topleft\")) {\n missing_pin_nums.push(1)\n }\n\n const missing_pin_nums_set = new Set(missing_pin_nums)\n\n let missing_pins_passed = 0\n for (let y = 0; y < grid.y; y++) {\n for (let x = 0; x < grid.x; x++) {\n let pin_num = y * grid.x + x + 1\n if (missing_pin_nums_set.has(pin_num)) {\n missing_pins_passed++\n continue\n }\n pin_num -= missing_pins_passed\n\n const pad_x = (x - (grid.x - 1) / 2) * p\n const pad_y = -(y - (grid.y - 1) / 2) * p\n\n // TODO handle >26 rows\n pads.push(\n rectpad([pin_num, `${ALPHABET[y]}${x + 1}`], pad_x, pad_y, pad, pad),\n )\n }\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n (grid.y * p) / 2,\n 0.2,\n )\n\n return {\n circuitJson: [...pads, silkscreenRefText as AnySoupElement],\n parameters,\n }\n}\n","import { z } from \"zod\"\n\nexport const dim2d = z\n .string()\n .transform((a) => {\n const [x, y] = a.split(/[x ]/)\n return {\n x: parseFloat(x),\n y: parseFloat(y),\n }\n })\n .pipe(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n )\n","import { z } from \"zod\"\n\nexport const function_call = z\n .string()\n .or(z.array(z.any()))\n .transform((a) => {\n if (Array.isArray(a)) return a\n if (a.startsWith(\"(\") && a.endsWith(\")\")) {\n a = a.slice(1, -1)\n }\n return a.split(\",\").map((v) => {\n const numVal = Number(v)\n return isNaN(numVal) ? v : numVal\n })\n })\n .pipe(z.array(z.string().or(z.number())))\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nexport const extendSoicDef = (newDefaults: {\n w?: string\n p?: string\n num_pins?: number\n legsoutside?: boolean\n}) =>\n z\n .object({\n fn: z.string(),\n num_pins: z.number().optional().default(8),\n w: length.default(length.parse(newDefaults.w ?? \"5.3mm\")),\n p: length.default(length.parse(newDefaults.p ?? \"1.27mm\")),\n pw: length.optional(),\n pl: length.optional(),\n legsoutside: z\n .boolean()\n .optional()\n .default(newDefaults.legsoutside ?? false),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.pw && !v.pl) {\n v.pw = length.parse(\"0.6mm\")\n v.pl = length.parse(\"1.0mm\")\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"pw\" | \"pl\">\n })\n\nexport const soic_def = extendSoicDef({})\nexport type SoicInput = z.infer<typeof soic_def>\n\nexport const getCcwSoicCoords = (parameters: {\n num_pins: number\n pn: number\n w: number\n p: number\n pl: number\n legsoutside?: boolean\n widthincludeslegs?: boolean\n}) => {\n if (parameters.widthincludeslegs !== undefined) {\n parameters.legsoutside = !parameters.widthincludeslegs\n }\n const { num_pins, pn, w, p, pl, legsoutside } = parameters\n /** pin height */\n const ph = num_pins / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n const legoffset = legsoutside ? pl / 2 : -pl / 2\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2 - legoffset, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2 + legoffset, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a SOIC package.\n */\nexport const soic = (raw_params: {\n soic: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = soic_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters) as AnySoupElement[],\n parameters,\n }\n}\n\nexport const soicWithoutParsing = (parameters: z.infer<typeof soic_def>) => {\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n /** silkscreen width */\n const m = Math.min(1, parameters.p / 2)\n const sw =\n parameters.w - (parameters.legsoutside ? 0 : parameters.pl * 2) - 0.2\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 + 0.4,\n sh / 12,\n )\n const silkscreenBorder: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n stroke_width: 0.1,\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n }\n\n return [...pads, silkscreenBorder, silkscreenRefText] as AnySoupElement[]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { optional, z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { pin_order_specifier } from \"src/helpers/zod/pin-order-specifier\"\nimport { getQuadPinMap } from \"src/helpers/get-quad-pin-map\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const base_quad_def = z.object({\n fn: z.string(),\n cc: z.boolean().default(true).optional(),\n ccw: z.boolean().default(true).optional(),\n startingpin: z\n .string()\n .or(z.array(pin_order_specifier))\n .transform((a) => (typeof a === \"string\" ? a.slice(1, -1).split(\",\") : a))\n .pipe(z.array(pin_order_specifier))\n .optional(),\n num_pins: z.number().optional().default(64),\n w: length.optional(),\n h: length.optional(),\n p: length.default(length.parse(\"0.5mm\")),\n pw: length.optional(),\n pl: length.optional(),\n thermalpad: z.union([z.literal(true), dim2d]).optional(),\n legsoutside: z.boolean().optional(),\n})\n\nexport const quadTransform = <T extends z.infer<typeof base_quad_def>>(\n v: T,\n) => {\n if (v.w && !v.h) {\n v.h = v.w\n } else if (!v.w && v.h) {\n v.w = v.h\n }\n\n const side_pin_count = v.num_pins / 4\n\n if (!v.p && !v.pw && !v.pl && v.w) {\n // HACK: This is wayyy underspecified\n const approx_pin_size_of_side = side_pin_count + 4\n v.p = v.w / approx_pin_size_of_side\n }\n\n if (!v.p && v.w && v.h && v.pw && v.pl) {\n // HACK: This is wayyy underspecified\n v.p = (v.w - v.pl * 2) / (side_pin_count - 1)\n }\n\n if (!v.w && !v.h && v.p) {\n // HACK: underspecified\n v.w = v.p * (side_pin_count + 4)\n v.h = v.w\n }\n\n if (v.p && !v.pw && !v.pl) {\n v.pw = v.p / 2\n v.pl = v.p / 2\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<T, \"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n}\n\nexport const quad_def = base_quad_def.transform(quadTransform)\n\nconst SIDES_CCW = [\"left\", \"bottom\", \"right\", \"top\"] as const\n\nexport const getQuadCoords = (params: {\n pin_count: number\n pn: number // pin number\n w: number // width of the package\n h: number // height (length) of the package\n p: number // pitch between pins\n pl: number // length of the pin\n legsoutside?: boolean\n}) => {\n const { pin_count, pn, w, h, p, pl, legsoutside } = params\n const sidePinCount = pin_count / 4\n const side = SIDES_CCW[Math.floor((pn - 1) / sidePinCount)]\n const pos = (pn - 1) % sidePinCount\n\n /** inner box width */\n const ibw = p * (sidePinCount - 1)\n /** inner box height */\n const ibh = p * (sidePinCount - 1)\n\n /** pad center distance from edge (negative is inside, positive is outside) */\n const pcdfe = legsoutside ? pl / 2 : -pl / 2\n\n switch (side) {\n case \"left\":\n return { x: -w / 2 - pcdfe, y: ibh / 2 - pos * p, o: \"vert\" }\n case \"bottom\":\n return { x: -ibw / 2 + pos * p, y: -h / 2 - pcdfe, o: \"horz\" }\n case \"right\":\n return { x: w / 2 + pcdfe, y: -ibh / 2 + pos * p, o: \"vert\" }\n case \"top\":\n return { x: ibw / 2 - pos * p, y: h / 2 + pcdfe, o: \"horz\" }\n default:\n throw new Error(\"Invalid pin number\")\n }\n}\n\nexport const quad = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = quad_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n const pin_map = getQuadPinMap(parameters)\n /** Side pin count */\n const spc = parameters.num_pins / 4\n for (let i = 0; i < parameters.num_pins; i++) {\n const {\n x,\n y,\n o: orientation,\n } = getQuadCoords({\n pin_count: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n h: parameters.h,\n p: parameters.p ?? 0.5,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n\n let pw = parameters.pw\n let pl = parameters.pl\n if (orientation === \"vert\") {\n ;[pw, pl] = [pl, pw]\n }\n\n const pn = pin_map[i + 1]!\n pads.push(rectpad(pn, x, y, pw, pl))\n }\n\n if (parameters.thermalpad) {\n if (typeof parameters.thermalpad === \"boolean\") {\n const ibw = parameters.p * (spc - 1) + parameters.pw\n const ibh = parameters.p * (spc - 1) + parameters.pw\n pads.push(rectpad([\"thermalpad\"], 0, 0, ibw, ibh))\n } else {\n pads.push(\n rectpad(\n [\"thermalpad\"],\n 0,\n 0,\n parameters.thermalpad.x,\n parameters.thermalpad.y,\n ),\n )\n }\n }\n\n // Silkscreen corners\n const silkscreen_corners: PcbSilkscreenPath[] = []\n for (const [corner, dx, dy] of [\n [\"top-left\", -1, 1],\n [\"bottom-left\", -1, -1],\n [\"bottom-right\", 1, -1],\n [\"top-right\", 1, 1],\n ] as const) {\n // const dx = Math.floor(corner_index / 2) * 2 - 1\n // const dy = 1 - (corner_index % 2) * 2\n const corner_x = (parameters.w / 2) * dx\n const corner_y = (parameters.h / 2) * dy\n let arrow: \"none\" | \"in1\" | \"in2\" = \"none\"\n\n let arrow_x = corner_x\n let arrow_y = corner_y\n\n /** corner size */\n const csz = parameters.pw * 2\n\n if (pin_map[1] === 1 && corner === \"top-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 4] === 1 && corner === \"top-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3 + 1] === 1 && corner === \"top-right\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3] === 1 && corner === \"top-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc] === 1 && corner === \"bottom-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc + 1] === 1 && corner === \"bottom-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 2] === 1 && corner === \"bottom-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 2 + 1] === 1 && corner === \"bottom-right\") {\n arrow = \"in2\"\n }\n\n const rotate_arrow = arrow === \"in1\" ? 1 : -1\n if (parameters.legsoutside) {\n const arrow_dx = arrow === \"in1\" ? parameters.pl / 2 : parameters.pw / 2\n const arrow_dy = arrow === \"in1\" ? parameters.pw / 2 : parameters.pl / 2\n arrow_x += arrow_dx * dx * rotate_arrow\n arrow_y -= arrow_dy * dy * rotate_arrow\n }\n\n // Normal Corner\n if (arrow === \"none\" || parameters.legsoutside) {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n\n // Two lines nearly forming a corner, used when the arrow needs to overlap\n // the corne (QFN components where legs are inside)\n if ((arrow === \"in1\" || arrow === \"in2\") && !parameters.legsoutside) {\n silkscreen_corners.push(\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_1`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x - (csz * dx) / 2,\n y: corner_y,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0,\n },\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_2`,\n route: [\n {\n x: corner_x,\n y: corner_y - (csz * dy) / 2,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n },\n )\n }\n if (arrow === \"in1\" || arrow === \"in2\") {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_3`,\n route: [\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n {\n x: arrow_x,\n y: arrow_y,\n },\n {\n x: arrow_x + 0.2 * rotate_arrow * -dx,\n y: arrow_y + 0.2,\n },\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n parameters.h / 2 + (parameters.legsoutside ? parameters.pl * 1.2 : 0.5),\n 0.3,\n )\n return {\n circuitJson: [\n ...pads,\n ...silkscreen_corners,\n silkscreenRefText,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","import { z } from \"zod\"\nexport const pin_order_specifier = z.enum([\n \"leftside\",\n \"topside\",\n \"rightside\",\n \"bottomside\",\n \"toppin\",\n \"bottompin\",\n \"leftpin\",\n \"rightpin\",\n])\n\nexport type PinOrderSpecifier = z.infer<typeof pin_order_specifier>\n","import type { PinOrderSpecifier } from \"./zod/pin-order-specifier\"\n\n/**\n * A counter-clockwise pin map is [1,2,3,4,5,6,7,8] for an 8-pin package\n *\n * 8 7\n * 1 6\n * 2 5\n * 3 4\n *\n * Given some parameters, we're returning how to map the pins in a quad package\n * with a different order. For example, if we pass in cw=true, we'll get the\n * following mapping\n *\n * 1 -> 1\n * 2 -> 8\n * 3 -> 7\n * 4 -> 6\n * 5 -> 5\n * 6 -> 4\n * 7 -> 3\n * 8 -> 2\n *\n * Which allows us to create the CW version of the package using...\n * new_pin = pin_map[normal_ccw_pin]\n *\n * 2 3\n * 1 4\n * 8 5\n * 7 6\n */\nexport const getQuadPinMap = ({\n num_pins,\n cw,\n ccw,\n startingpin,\n}: {\n num_pins: number\n cw?: boolean\n ccw?: boolean\n startingpin?: PinOrderSpecifier[]\n}): number[] => {\n const pin_map: number[] = []\n const pins_per_side = num_pins / 4\n let current_position_ccw_normal = 1\n\n /** Starting Flag Pins */\n const sfp: Record<PinOrderSpecifier, boolean> = {} as any\n for (const specifier of startingpin ?? []) {\n sfp[specifier] = true\n }\n if (!sfp.leftside && !sfp.topside && !sfp.rightside && !sfp.bottomside) {\n sfp.leftside = true\n }\n if (!sfp.bottompin && !sfp.leftpin && !sfp.rightpin && !sfp.toppin) {\n if (sfp.leftside) {\n sfp.toppin = true\n } else if (sfp.topside) {\n sfp.rightpin = true\n } else if (sfp.rightside) {\n sfp.bottompin = true\n } else if (sfp.bottomside) {\n sfp.leftpin = true\n }\n }\n\n if (sfp.leftside && sfp.toppin) {\n current_position_ccw_normal = 1\n } else if (sfp.leftside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side\n } else if (sfp.bottomside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side + 1\n } else if (sfp.bottomside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 2\n } else if (sfp.rightside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side * 2 + 1\n } else if (sfp.rightside && sfp.toppin) {\n current_position_ccw_normal = pins_per_side * 3\n } else if (sfp.topside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 3 + 1\n } else if (sfp.topside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side * 4\n }\n\n pin_map.push(-1) // the first index is meaningless\n\n // Each iteration we move the current position to the next pin, if we're\n // going CCW this means incrementing, if we're going CW this means\n // decrementing\n for (let i = 0; i < num_pins; i++) {\n pin_map[current_position_ccw_normal] = i + 1\n if (ccw || !cw) {\n current_position_ccw_normal++\n if (current_position_ccw_normal > num_pins) {\n current_position_ccw_normal = 1\n }\n } else {\n current_position_ccw_normal--\n if (current_position_ccw_normal < 1) {\n current_position_ccw_normal = num_pins\n }\n }\n }\n\n return pin_map\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfn_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const qfn = (\n parameters: z.input<typeof qfn_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n return quad(parameters)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { quad, quad_def } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfp_def = quad_def\n\nexport const qfp = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n raw_params.legsoutside = true\n\n const quad_defaults = quad_def.parse(raw_params)\n if (!raw_params.p) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.p = 0.8\n break\n case 52:\n if (raw_params.w === 14) raw_params.p = 1\n else raw_params.p = 0.65\n break\n case 208:\n raw_params.p = 0.5\n break\n }\n }\n if (!raw_params.pl) {\n switch (raw_params.num_pins) {\n case 44:\n case 52:\n case 64:\n raw_params.pl = 2.25\n break\n case 208:\n raw_params.pl = 1.65\n break\n default:\n raw_params.pl = quad_defaults.pl * 4\n break\n }\n }\n if (!raw_params.pw) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.pw = 0.5\n break\n case 52:\n if (raw_params.w === 14) raw_params.pw = 0.45\n else raw_params.pw = 0.55\n break\n case 208:\n raw_params.pw = 0.3\n break\n default:\n raw_params.pw = quad_defaults.pw\n break\n }\n }\n return quad(raw_params)\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const mlp_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const mlp = (\n parameters: z.input<typeof mlp_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n if (parameters.thermalpad === undefined) {\n parameters.thermalpad = true\n }\n return quad(parameters)\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\n// TODO we should accept MS-012 or MS-013\n\nexport const ssop_def = extendSoicDef({\n w: \"3.9mm\",\n p: \"1.27mm\",\n})\n\nexport const ssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\nexport const tssop_def = extendSoicDef({\n w: \"6.1mm\",\n p: \"0.65mm\",\n legsoutside: true,\n})\n\nexport const tssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = tssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot236_def = extendSoicDef({\n p: \"0.95mm\",\n w: \"1.6mm\",\n legsoutside: true,\n})\n\nexport const sot236 = (\n raw_params: z.input<typeof sot236_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot236_def.parse({ ...raw_params, num_pins: 6 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot363_def = extendSoicDef({})\n\nexport const sot363 = (\n raw_params: z.input<typeof sot363_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot363_def.parse({\n fn: \"sot363\",\n num_pins: 6,\n w: 1.94,\n p: 0.65,\n pw: 0.3,\n pl: 0.7,\n legoutside: true,\n })\n\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot23_def = z.object({\n fn: z.string(),\n num_pins: z.literal(3).default(3),\n w: z.string().default(\"1.92mm\"),\n h: z.string().default(\"2.74mm\"),\n pl: z.string().default(\"0.8mm\"),\n pw: z.string().default(\"0.764mm\"),\n})\n\nexport const sot23 = (\n raw_params: z.input<typeof sot23_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot23_def.parse(raw_params)\n return {\n circuitJson: sot23WithoutParsing(parameters),\n parameters: parameters,\n }\n}\n\nexport const getCcwSot23Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: -1.7, y: 0 }\n } else if (pn === 2) {\n return { x: 1.7, y: -0.95 }\n } else {\n return { x: 1.7, y: 0.95 }\n }\n}\n\nexport const sot23WithoutParsing = (parameters: z.infer<typeof sot23_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot23Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h),\n 0.3,\n )\n return [...pads, silkscreenRefText as AnySoupElement]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport {\n extendSoicDef,\n soicWithoutParsing,\n type SoicInput,\n getCcwSoicCoords,\n} from \"./soic\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { z } from \"zod\"\nimport { CORNERS } from \"src/helpers/corner\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const dfn_def = extendSoicDef({})\n\n/**\n * Dual Flat No-lead\n *\n * Similar to SOIC but different silkscreen\n */\nexport const dfn = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = dfn_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n widthincludeslegs: true,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n // The silkscreen is 4 corners and an arrow identifier for pin1\n const m = Math.min(1, parameters.p / 2)\n const sw = parameters.w + m\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenPaths: PcbSilkscreenPath[] = []\n\n for (const corner of CORNERS) {\n const { dx, dy } = corner\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n route: [\n { x: (dx * sw) / 2 - dx * parameters.p, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 - dy * parameters.p },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n\n // Arrow\n /** arrow size */\n const as = parameters.p / 4\n /** Arrow tip x */\n const atx = -sw / 2 - as / 2\n /** Arrow tip y */\n const aty = sh / 2 - parameters.p / 2\n\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n type: \"pcb_silkscreen_path\",\n route: [\n {\n x: atx,\n y: aty,\n },\n {\n x: atx - as,\n y: aty + as,\n },\n {\n x: atx - as,\n y: aty - as,\n },\n {\n x: atx,\n y: aty,\n },\n ],\n stroke_width: 0.1,\n })\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 + 0.4,\n sh / 12,\n )\n return {\n circuitJson: [\n ...pads,\n silkscreenRefText,\n ...silkscreenPaths,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","export const CORNERS = [\n { name: \"top-left\", dx: -1, dy: 1 },\n { name: \"top-right\", dx: 1, dy: 1 },\n { name: \"bottom-left\", dx: -1, dy: -1 },\n { name: \"bottom-right\", dx: 1, dy: -1 },\n]\n","import { z } from \"zod\"\nimport { length, type AnySoupElement } from \"circuit-json\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const pinrow_def = z.object({\n fn: z.string(),\n num_pins: z.number().optional().default(6),\n p: length.default(\"0.1in\").describe(\"pitch\"),\n id: length.default(\"1.0mm\").describe(\"inner diameter\"),\n od: length.default(\"1.5mm\").describe(\"outer diameter\"),\n})\n\nexport const pinrow = (\n raw_params: z.input<typeof pinrow_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = pinrow_def.parse(raw_params)\n const { p, id, od } = parameters\n const holes: any[] = []\n /** num_spaces */\n const ns = parameters.num_pins - 1\n const xoff = -(ns / 2) * p\n\n for (let i = 0; i < parameters.num_pins; i++) {\n holes.push(platedhole(i + 1, xoff + i * p, 0, id, od))\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 2, 0.5)\n return {\n circuitJson: [...holes, silkscreenRefText] as AnySoupElement[],\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot563_def = extendSoicDef({})\n\nexport const sot563 = (\n raw_params: z.input<typeof sot563_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot563_def.parse({\n fn: \"sot563\",\n num_pins: 6,\n w: 1.94,\n p: 0.5,\n pw: 0.3,\n pl: 0.67,\n legoutside: true,\n })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms012_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"3.9mm\",\n legsoutside: true,\n})\n\nexport const ms012 = (\n raw_params: z.input<typeof ms012_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms012_def.parse({ ...raw_params, num_pins: 8 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms013_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"7.5mm\",\n legsoutside: true,\n})\n\nexport const ms013 = (\n raw_params: z.input<typeof ms013_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms013_def.parse({ ...raw_params, num_pins: 16 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import { length, type AnySoupElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot723_def = z.object({\n fn: z.string(),\n num_pins: z.literal(3).default(3),\n w: z.string().default(\"1.2mm\"),\n h: z.string().default(\"1.2mm\"),\n pl: z.string().default(\"0.3mm\"),\n pw: z.string().default(\"0.32mm\"),\n})\n\nexport const sot723 = (\n raw_params: z.input<typeof sot723_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot723_def.parse(raw_params)\n const pad = sot723WithoutParsing(parameters)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0.4,\n length.parse(parameters.h),\n 0.2,\n )\n return {\n circuitJson: [...pad, silkscreenRefText as AnySoupElement],\n parameters,\n }\n}\n\nexport const getCcwSot723Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: 0, y: 0 }\n } else if (pn === 2) {\n return { x: 1, y: -0.4 }\n } else {\n return { x: 1, y: 0.4 }\n }\n}\n\nexport const sot723WithoutParsing = (\n parameters: z.infer<typeof sot723_def>,\n) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 3; i++) {\n const { x, y } = getCcwSot723Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n i !== 0 ? Number.parseFloat(parameters.pw) : 0.42,\n ),\n )\n }\n\n return pads\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\n\nexport const sod_def = z.object({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"2.36mm\"),\n h: z.string().default(\"1.22mm\"),\n pl: z.string().default(\"0.9mm\"),\n pw: z.string().default(\"0.9mm\"),\n pad_spacing: z.string().default(\"4.19mm\"),\n})\n\nexport const sod123 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) / 4 + 0.4,\n 0.3,\n )\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getSodCoords = (parameters: {\n pn: number\n pad_spacing: number\n}) => {\n const { pn, pad_spacing } = parameters\n\n if (pn === 1) {\n return { x: -pad_spacing / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: pad_spacing / 2, y: 0 }\n }\n}\n\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n pad_spacing: Number.parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenLine,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\nimport { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\n\nexport const axial_def = z.object({\n fn: z.string(),\n p: length.optional().default(\"2.54mm\"),\n id: length.optional().default(\"0.7mm\"),\n od: length.optional().default(\"1mm\"),\n})\nexport type AxialDef = z.input<typeof axial_def>\n\nexport const axial = (\n raw_params: AxialDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = axial_def.parse(raw_params)\n\n const { p, id, od } = parameters\n\n const plated_holes = [\n platedhole(1, -p / 2, 0, id, od),\n platedhole(2, p / 2, 0, id, od),\n ]\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -p / 2 + od + id / 2, y: 0 },\n { x: p / 2 - od - id / 2, y: 0 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 4, 0.5)\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenLine,\n silkscreenRefText as AnySoupElement,\n ],\n parameters,\n }\n}\n","import { length, type AnyCircuitElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenpath } from \"../helpers/silkscreenpath\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const pushbutton_def = z.object({\n fn: z.literal(\"pushbutton\"),\n w: length.default(4.5),\n h: length.default(6.5),\n id: length.default(1),\n od: length.default(1.2),\n})\n\nexport const pushbutton = (\n raw_params: z.input<typeof pushbutton_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = pushbutton_def.parse(raw_params)\n\n const width = parameters.w\n const height = parameters.h\n const holeDiameter = parameters.id\n\n const holes: AnyCircuitElement[] = [\n platedhole(1, -width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(2, -width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(3, width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(4, width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n ]\n\n const silkscreenLines: AnyCircuitElement[] = [\n // Vertical lines indicating connections\n silkscreenpath([\n { x: -width / 2, y: -height / 2 },\n { x: -width / 2, y: height / 2 },\n ]),\n silkscreenpath([\n { x: width / 2, y: -height / 2 },\n { x: width / 2, y: height / 2 },\n ]),\n // Center indicating latch\n silkscreenpath([\n { x: -width / 2, y: 0 },\n { x: -width / 5, y: 0 },\n { x: ((width / 5) * 1) / Math.sqrt(2), y: height / 8 },\n ]),\n silkscreenpath([\n { x: width / 2, y: 0 },\n { x: width / 5, y: 0 },\n ]),\n ]\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 2 + 0.4,\n 0.5,\n )\n return {\n circuitJson: [...holes, ...silkscreenLines, silkscreenRefText],\n parameters,\n }\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\n\nexport const silkscreenpath = (\n route: Array<{ x: number; y: number }>,\n options: {\n stroke_width?: number\n layer?: string\n pcb_component_id?: string\n pcb_silkscreen_path_id?: string\n } = {},\n): PcbSilkscreenPath => {\n return {\n type: \"pcb_silkscreen_path\",\n layer: options.layer || \"top\",\n pcb_component_id: options.pcb_component_id || \"\",\n pcb_silkscreen_path_id: options.pcb_silkscreen_path_id || \"\",\n route,\n stroke_width: options.stroke_width || 0.1,\n }\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const stampboard_def = z.object({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n h: length.optional(),\n left: length.optional().default(20),\n right: length.optional().default(20),\n top: length.optional().default(2),\n bottom: length.optional().default(2),\n p: length.default(length.parse(\"2.54mm\")),\n pw: length.default(length.parse(\"1.6mm\")),\n pl: length.default(length.parse(\"2.4mm\")),\n innerhole: z.boolean().default(false),\n innerholeedgedistance: length.default(length.parse(\"1.61mm\")),\n})\n\nexport type Stampboard_def = z.input<typeof stampboard_def>\n\nconst getHeight = (parameters: Stampboard_def) => {\n const params = stampboard_def.parse(parameters)\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n if (params.left) {\n return params.left * params.p\n }\n if (params.right) {\n return params.right * params.p\n }\n return 51 // Default height if no pins are provided\n}\nconst getTriangleDir = (x: number, y: number, side: string) => {\n let routes: { x: number; y: number }[] = []\n const triangleHeight = 1 // Adjust triangle size as needed\n const triangleWidth = 0.6 // Adjust triangle width as needed\n if (side === \"right\") {\n routes = [\n {\n x: x + triangleHeight / 2,\n y: y,\n }, // Tip of the triangle (pointing right)\n {\n x: x - triangleHeight / 2,\n y: y + triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: x - triangleHeight / 2,\n y: y - triangleWidth / 2,\n }, // Top corner of the base\n {\n x: x + triangleHeight / 2,\n y: y,\n }, // Close the path at the tip\n ]\n }\n if (side === \"left\") {\n routes = [\n {\n x: x - triangleHeight / 2,\n y: y,\n }, // Tip of the triangle (pointing left)\n {\n x: x + triangleHeight / 2,\n y: y + triangleWidth / 2,\n }, // Top corner of the base\n {\n x: x + triangleHeight / 2,\n y: y - triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: x - triangleHeight / 2,\n y: y,\n }, // Close the path at the tip\n ]\n }\n if (side === \"top\") {\n routes = [\n {\n x: x,\n y: y + triangleHeight / 2,\n }, // Tip of the triangle (pointing up)\n {\n x: x - triangleWidth / 2,\n y: y - triangleHeight / 2,\n }, // Left corner of the base\n {\n x: x + triangleWidth / 2,\n y: y - triangleHeight / 2,\n }, // Right corner of the base\n {\n x: x,\n y: y + triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n if (side === \"bottom\") {\n routes = [\n {\n x: x,\n y: y - triangleHeight / 2,\n }, // Tip of the triangle (pointing down)\n {\n x: x - triangleWidth / 2,\n y: y + triangleHeight / 2,\n }, // Left corner of the base\n {\n x: x + triangleWidth / 2,\n y: y + triangleHeight / 2,\n }, // Right corner of the base\n {\n x: x,\n y: y - triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n return routes\n}\n\nexport const stampboard = (\n raw_params: Stampboard_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = stampboard_def.parse(raw_params)\n const height = params.h ?? getHeight(params)\n const rectpads: AnyCircuitElement[] = []\n const holes: PcbPlatedHole[] = []\n let routes: { x: number; y: number }[] = []\n const innerDiameter = 1\n const outerDiameter = 1.2\n const totalPadsNumber =\n params.left + params.right + (params.bottom ?? 0) + (params.top ?? 0)\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n if (i === 0 && !params.left && !params.bottom) {\n routes = getTriangleDir(\n params.w / 2 - params.pl * 1.4,\n yoff + i * params.p,\n \"right\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left + (params.bottom ?? 0),\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0) + totalPadsNumber,\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0) + totalPadsNumber * 2,\n params.w / 2 - params.innerholeedgedistance,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.left) {\n const yoff = -((params.left - 1) / 2) * params.p\n for (let i = 0; i < params.left; i++) {\n if (i === params.left - 1) {\n routes = getTriangleDir(\n -params.w / 2 + params.pl * 1.4,\n yoff + i * params.p,\n \"left\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1,\n -params.w / 2 + params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1 + totalPadsNumber,\n -params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1 + totalPadsNumber * 2,\n -params.w / 2 + params.innerholeedgedistance,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.top) {\n const xoff = -((params.top - 1) / 2) * params.p\n for (let i = 0; i < params.top; i++) {\n if (\n i === params.top - 1 &&\n !params.left &&\n !params.bottom &&\n !params.right\n ) {\n routes = getTriangleDir(\n xoff + i * params.p,\n height / 2 - params.pl * 1.4,\n \"top\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left + params.right + (params.bottom ?? 0),\n xoff + i * params.p,\n height / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i +\n 1 +\n params.left +\n params.right +\n (params.bottom ?? 0) +\n totalPadsNumber,\n xoff + i * params.p,\n height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i +\n 1 +\n params.left +\n params.right +\n (params.bottom ?? 0) +\n totalPadsNumber * 2,\n xoff + i * params.p,\n height / 2 - params.innerholeedgedistance,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.bottom) {\n const xoff = -((params.bottom - 1) / 2) * params.p\n for (let i = 0; i < params.bottom; i++) {\n if (i === 0 && !params.left) {\n routes = getTriangleDir(\n xoff + i * params.p,\n -height / 2 + params.pl * 1.4,\n \"bottom\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left,\n xoff + i * params.p,\n -height / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1 + params.left + totalPadsNumber,\n xoff + i * params.p,\n -height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1 + params.left + totalPadsNumber * 2,\n xoff + i * params.p,\n -height / 2 + params.innerholeedgedistance,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_triangle_1\",\n pcb_component_id: \"2\",\n route: routes,\n stroke_width: 0.1,\n layer: \"top\",\n }\n\n const silkscreenPath: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_path_1\",\n pcb_component_id: \"1\",\n route: [\n { x: -params.w / 2, y: height / 2 },\n { x: params.w / 2, y: height / 2 },\n { x: params.w / 2, y: -height / 2 },\n { x: -params.w / 2, y: -height / 2 },\n { x: -params.w / 2, y: height / 2 },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 1.8,\n height / 25,\n )\n return {\n circuitJson: [\n ...rectpads,\n ...holes,\n silkscreenPath,\n silkscreenTriangle,\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { platedhole } from \"src/helpers/platedhole\"\n\nexport const stampreceiver_def = z.object({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n h: length.optional(),\n left: length.optional().default(20),\n right: length.optional().default(20),\n top: length.optional().default(2),\n bottom: length.optional().default(2),\n p: length.default(length.parse(\"2.54mm\")),\n pw: length.default(length.parse(\"1.6mm\")),\n pl: length.default(length.parse(\"3.2mm\")),\n innerhole: z.boolean().default(false),\n innerholeedgedistance: length.default(length.parse(\"1.61mm\")),\n})\n\nexport type Stampreceiver_def = z.input<typeof stampreceiver_def>\n\nconst getHeight = (parameters: Stampreceiver_def): number => {\n const params = stampreceiver_def.parse(parameters)\n\n // Calculate height based on the presence of left and right parameters\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n\n if (params.left) {\n return params.left * params.p\n }\n\n if (params.right) {\n return params.right * params.p\n }\n\n // Return default height if neither left nor right is provided\n return 51\n}\ntype Point = { x: number; y: number }\ntype Direction = \"left\" | \"right\" | \"top\" | \"bottom\"\n\nconst getTriangleDir = (\n x: number,\n y: number,\n side: Direction,\n triangleHeight = 1,\n triangleWidth = 0.6,\n): Point[] => {\n const halfHeight = triangleHeight / 2\n const halfWidth = triangleWidth / 2\n\n const routes: Record<Direction, Point[]> = {\n left: [\n { x: x + halfHeight, y }, // Tip\n { x: x - halfHeight, y: y + halfWidth }, // Bottom corner\n { x: x - halfHeight, y: y - halfWidth }, // Top corner\n { x: x + halfHeight, y }, // Close path\n ],\n right: [\n { x: x - halfHeight, y }, // Tip\n { x: x + halfHeight, y: y + halfWidth }, // Top corner\n { x: x + halfHeight, y: y - halfWidth }, // Bottom corner\n { x: x - halfHeight, y }, // Close path\n ],\n top: [\n { x, y: y - halfHeight }, // Tip\n { x: x - halfWidth, y: y + halfHeight }, // Left corner\n { x: x + halfWidth, y: y + halfHeight }, // Right corner\n { x, y: y - halfHeight }, // Close path\n ],\n bottom: [\n { x, y: y + halfHeight }, // Tip\n { x: x - halfWidth, y: y - halfHeight }, // Left corner\n { x: x + halfWidth, y: y - halfHeight }, // Right corner\n { x, y: y + halfHeight }, // Close path\n ],\n }\n\n return routes[side]\n}\nexport const stampreceiver = (\n raw_params: Stampreceiver_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = stampreceiver_def.parse(raw_params)\n const height = params.h ?? getHeight(params)\n const rectpads: AnyCircuitElement[] = []\n const holes: PcbPlatedHole[] = []\n const innerDiameter = 1\n const outerDiameter = 1.2\n const totalPadsNumber =\n params.left + params.right + (params.bottom ?? 0) + (params.top ?? 0)\n let routes: { x: number; y: number }[] = []\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n if (i === 0 && !params.left && !params.bottom) {\n routes = getTriangleDir(\n params.w / 2 + params.pl * 1.4,\n yoff + i * params.p,\n \"right\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left + (params.bottom ?? 0),\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n params.innerhole &&\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0) + totalPadsNumber,\n params.w / 2 - params.innerholeedgedistance,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n if (params.left) {\n const yoff = -((params.left - 1) / 2) * params.p\n for (let i = 0; i < params.left; i++) {\n if (i === params.left - 1) {\n routes = getTriangleDir(\n -params.w / 2 - params.pl / 3,\n yoff + i * params.p,\n \"left\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1,\n -params.w / 2 + params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n params.innerhole &&\n holes.push(\n platedhole(\n i + 1 + totalPadsNumber,\n -params.w / 2 + params.innerholeedgedistance,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n if (params.top) {\n const xoff = -((params.top - 1) / 2) * params.p\n for (let i = 0; i < params.top; i++) {\n if (\n i === params.top - 1 &&\n !params.left &&\n !params.bottom &&\n !params.right\n ) {\n routes = getTriangleDir(\n xoff + i * params.p,\n height / 2 + params.pl * 1.4,\n \"top\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.right + (params.bottom ?? 0) + params.left,\n xoff + i * params.p,\n height / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n params.innerhole &&\n holes.push(\n platedhole(\n i +\n 1 +\n params.right +\n (params.bottom ?? 0) +\n params.left +\n totalPadsNumber,\n xoff + i * params.p,\n height / 2 - params.innerholeedgedistance,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n if (params.bottom) {\n const xoff = -((params.bottom - 1) / 2) * params.p\n for (let i = 0; i < params.bottom; i++) {\n if (i === 0 && !params.left) {\n routes = getTriangleDir(\n xoff + i * params.p,\n -height / 2 - params.pl * 1.4,\n \"bottom\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left,\n xoff + i * params.p,\n -height / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n params.innerhole &&\n holes.push(\n platedhole(\n i + 1 + params.left + totalPadsNumber,\n xoff + i * params.p,\n -height / 2 + params.innerholeedgedistance,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"1\",\n pcb_component_id: \"1\",\n layer: \"top\",\n route: routes,\n stroke_width: 0.1,\n }\n\n const silkscreenPath: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_path_1\",\n pcb_component_id: \"1\",\n route: [\n {\n x: -params.w / 2 - params.pl / 3,\n y: height / 2 + params.pl / 3,\n },\n {\n x: params.w / 2 + params.pl / 3,\n y: height / 2 + params.pl / 3,\n },\n {\n x: params.w / 2 + params.pl / 3,\n y: -height / 2 - params.pl / 3,\n },\n {\n x: -params.w / 2 - params.pl / 3,\n y: -height / 2 - params.pl / 3,\n },\n {\n x: -params.w / 2 - params.pl / 3,\n y: height / 2 + params.pl / 3,\n },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 1.8,\n height / 25,\n )\n return {\n circuitJson: [\n ...holes,\n ...rectpads,\n silkscreenPath,\n silkscreenTriangle,\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { quad, quad_def } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const lqfp_def = quad_def\n\nexport const lqfp = (\n parameters: z.input<typeof lqfp_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n parameters.legsoutside = true\n return quad(parameters)\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot235_def = z.object({\n fn: z.string(),\n num_pins: z.literal(5).default(5),\n h: z.string().default(\"1.6mm\"),\n pl: z.string().default(\"1mm\"),\n pw: z.string().default(\"0.7mm\"),\n p: z.string().default(\"0.95mm\"),\n})\n\nexport const sot235 = (\n raw_params: z.input<typeof sot235_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = sot235_def.parse(raw_params)\n return {\n circuitJson: sot23_5WithoutParsing(parameters),\n parameters: parameters,\n }\n}\n\nexport const getCcwSot235Coords = (parameters: {\n h: number\n p: number\n pn: number\n}) => {\n const { p, h, pn } = parameters\n if (pn === 1) {\n return { x: -h / 2 - 0.5, y: p }\n }\n if (pn === 2) {\n return { x: -h / 2 - 0.5, y: 0 }\n }\n if (pn === 3) {\n return { x: -h / 2 - 0.5, y: -p }\n }\n if (pn === 4) {\n return { x: h / 2 + 0.5, y: -p }\n }\n if (pn === 5) {\n return { x: h / 2 + 0.5, y: p }\n }\n throw new Error(\"Invalid pin number\")\n}\n\nexport const sot23_5WithoutParsing = (\n parameters: z.infer<typeof sot235_def>,\n) => {\n const pads: AnyCircuitElement[] = []\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getCcwSot235Coords({\n h: Number.parseFloat(parameters.h),\n p: Number.parseFloat(parameters.p),\n pn: i,\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n\n const width =\n ((parameters.num_pins + 1) / 2) * Number.parseFloat(parameters.p)\n const height = Number.parseFloat(parameters.h)\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width / 3, y: height / 2 + Number.parseFloat(parameters.p) / 1.3 },\n { x: width / 3, y: height / 2 + Number.parseFloat(parameters.p) / 1.3 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.05,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width / 3, y: -height / 2 - Number.parseFloat(parameters.p) / 1.3 },\n { x: width / 3, y: -height / 2 - Number.parseFloat(parameters.p) / 1.3 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.05,\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, height + 0.3, 0.3)\n const pin1Position = getCcwSot235Coords({\n h: Number.parseFloat(parameters.h),\n p: Number.parseFloat(parameters.p),\n pn: 1,\n })\n pin1Position.x = pin1Position.x - Number.parseFloat(parameters.pw) * 1.5\n const triangleHeight = 0.7 // Adjust triangle size as needed\n const triangleWidth = 0.3 // Adjust triangle width as needed\n const pin1Indicator: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"pin1_indicator\",\n route: [\n {\n x: pin1Position.x + triangleHeight / 2,\n y: pin1Position.y,\n }, // Tip of the triangle (pointing right)\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y + triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y - triangleWidth / 2,\n }, // Top corner of the base\n {\n x: pin1Position.x + triangleHeight / 2,\n y: pin1Position.y,\n }, // Close the path at the tip\n ],\n stroke_width: 0.05,\n }\n\n return [\n ...pads,\n silkscreenRefText,\n silkscreenPath1,\n silkscreenPath2,\n pin1Indicator as AnyCircuitElement,\n ]\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { platedhole } from \"src/helpers/platedhole\"\n\nexport const breakoutheaders_def = z.object({\n fn: z.string(),\n w: length.default(\"10mm\"),\n h: length.optional(),\n left: length.optional().default(20),\n right: length.optional().default(20),\n top: length.optional().default(0),\n bottom: length.optional().default(0),\n p: length.default(length.parse(\"2.54mm\")),\n id: length.optional().default(length.parse(\"1mm\")),\n od: length.optional().default(length.parse(\"1.5mm\")),\n})\n\nexport type breakoutheaders_def = z.input<typeof breakoutheaders_def>\n\nconst getHeight = (parameters: breakoutheaders_def): number => {\n const params = breakoutheaders_def.parse(parameters)\n\n // Calculate height based on the presence of left and right parameters\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n\n if (params.left) {\n return params.left * params.p\n }\n\n if (params.right) {\n return params.right * params.p\n }\n\n return 51\n}\n\ntype Point = { x: number; y: number }\ntype Direction = \"left\" | \"right\" | \"top\" | \"bottom\"\n\nconst getTrianglePath = (\n x: number,\n y: number,\n side: Direction,\n triangleHeight = 1,\n triangleWidth = 0.6,\n): Point[] => {\n const halfHeight = triangleHeight / 2\n const halfWidth = triangleWidth / 2\n\n const silkscreenTriangleRoutes: Record<Direction, Point[]> = {\n left: [\n { x: x + halfHeight, y },\n { x: x - halfHeight, y: y + halfWidth },\n { x: x - halfHeight, y: y - halfWidth },\n { x: x + halfHeight, y },\n ],\n right: [\n { x: x - halfHeight, y },\n { x: x + halfHeight, y: y + halfWidth },\n { x: x + halfHeight, y: y - halfWidth },\n { x: x - halfHeight, y },\n ],\n top: [\n { x, y: y - halfHeight },\n { x: x - halfWidth, y: y + halfHeight },\n { x: x + halfWidth, y: y + halfHeight },\n { x, y: y - halfHeight },\n ],\n bottom: [\n { x, y: y + halfHeight },\n { x: x - halfWidth, y: y - halfHeight },\n { x: x + halfWidth, y: y - halfHeight },\n { x, y: y + halfHeight },\n ],\n }\n\n return silkscreenTriangleRoutes[side]\n}\nexport const breakoutheaders = (\n raw_params: breakoutheaders_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = breakoutheaders_def.parse(raw_params)\n const height = params.h ?? getHeight(params)\n const holes: PcbPlatedHole[] = []\n const innerDiameter = params.id\n const outerDiameter = params.od\n let silkscreenTriangleRoutes: { x: number; y: number }[] = []\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n if (i === 0 && !params.left && !params.bottom) {\n silkscreenTriangleRoutes = getTrianglePath(\n params.w / 2 + outerDiameter * 1.4,\n yoff + i * params.p,\n \"right\",\n )\n }\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0),\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n if (params.left) {\n const yoff = -((params.left - 1) / 2) * params.p\n for (let i = 0; i < params.left; i++) {\n if (i === params.left - 1) {\n silkscreenTriangleRoutes = getTrianglePath(\n -params.w / 2 - outerDiameter * 1.4,\n yoff + i * params.p,\n \"left\",\n )\n }\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n if (params.top) {\n const xoff = -((params.top - 1) / 2) * params.p\n for (let i = 0; i < params.top; i++) {\n if (\n i === params.top - 1 &&\n !params.left &&\n !params.bottom &&\n !params.right\n ) {\n silkscreenTriangleRoutes = getTrianglePath(\n xoff + i * params.p,\n height / 2 + outerDiameter * 1.4,\n \"top\",\n )\n }\n holes.push(\n platedhole(\n i + 1 + params.right + (params.bottom ?? 0) + params.left,\n xoff + i * params.p,\n height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n if (params.bottom) {\n const xoff = -((params.bottom - 1) / 2) * params.p\n for (let i = 0; i < params.bottom; i++) {\n if (i === 0 && !params.left) {\n silkscreenTriangleRoutes = getTrianglePath(\n xoff + i * params.p,\n -height / 2 - outerDiameter * 1.4,\n \"bottom\",\n )\n }\n holes.push(\n platedhole(\n i + 1 + params.left,\n xoff + i * params.p,\n -height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"1\",\n pcb_component_id: \"1\",\n layer: \"top\",\n route: silkscreenTriangleRoutes,\n stroke_width: 0.1,\n }\n\n const silkscreenPath: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_path_1\",\n pcb_component_id: \"1\",\n route: [\n {\n x: -params.w / 2 - outerDiameter,\n y: height / 2 + outerDiameter,\n },\n {\n x: params.w / 2 + outerDiameter,\n y: height / 2 + outerDiameter,\n },\n {\n x: params.w / 2 + outerDiameter,\n y: -height / 2 - outerDiameter,\n },\n {\n x: -params.w / 2 - outerDiameter,\n y: -height / 2 - outerDiameter,\n },\n {\n x: -params.w / 2 - outerDiameter,\n y: height / 2 + outerDiameter,\n },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 1.7,\n height / 25,\n )\n return {\n circuitJson: [\n ...holes,\n silkscreenPath,\n silkscreenRefText,\n silkscreenTriangle,\n ],\n parameters: params,\n }\n}\n","export function isNotNull<T>(value: T | null): value is T {\n return value !== null\n}\n","import * as FOOTPRINT_FN from \"./fn\"\nimport type { AnySoupElement } from \"circuit-json\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport type { AnyFootprinterDefinitionOutput } from \"./helpers/zod/AnyFootprinterDefinitionOutput\"\nimport { isNotNull } from \"./helpers/is-not-null\"\n\nexport type FootprinterParamsBuilder<K extends string> = {\n [P in K | \"params\" | \"soup\"]: P extends \"params\" | \"soup\"\n ? Footprinter[P]\n : (v?: number | string) => FootprinterParamsBuilder<K>\n}\n\ntype CommonPassiveOptionKey =\n | \"metric\"\n | \"imperial\"\n | \"tht\"\n | \"p\"\n | \"pw\"\n | \"ph\"\n | \"w\"\n | \"h\"\n\nexport type Footprinter = {\n dip: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n cap: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n res: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n diode: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n led: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n lr: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"l\" | \"pl\" | \"pr\">\n qfp: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n quad: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\n \"w\" | \"l\" | \"square\" | \"pl\" | \"pr\" | \"pb\" | \"pt\" | \"p\" | \"pw\" | \"ph\"\n >\n bga: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\n \"grid\" | \"p\" | \"w\" | \"h\" | \"ball\" | \"pad\" | \"missing\"\n >\n qfn: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n soic: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\">\n mlp: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n ssop: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n tssop: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n dfn: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n pinrow: (num_pins?: number) => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n axial: () => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n sot235: () => FootprinterParamsBuilder<\"h\" | \"p\" | \"pl\" | \"pw\">\n lqfp: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"pl\" | \"pw\">\n pushbutton: () => FootprinterParamsBuilder<\n \"tllabel\" | \"trlabel\" | \"bllabel\" | \"brlabel\"\n >\n stampboard: () => FootprinterParamsBuilder<\n | \"w\"\n | \"h\"\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"p\"\n | \"pw\"\n | \"pl\"\n | \"innerhole\"\n | \"innerholeedgedistance\"\n >\n stampreceiver: () => FootprinterParamsBuilder<\n | \"w\"\n | \"h\"\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"p\"\n | \"pw\"\n | \"pl\"\n | \"innerhole\"\n | \"innerholeedgedistance\"\n >\n breakoutheaders: () => FootprinterParamsBuilder<\n \"w\" | \"h\" | \"left\" | \"right\" | \"top\" | \"bottom\" | \"p\" | \"id\" | \"od\"\n >\n\n params: () => any\n /** @deprecated use circuitJson() instead */\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n json: () => AnyFootprinterDefinitionOutput[]\n getFootprintNames: () => string[]\n}\n\nexport const string = (def: string): Footprinter => {\n let fp = footprinter()\n\n // special case: 0402, 0603, etc.\n if ((def.length === 4 || def.length === 5) && /^\\d+$/.test(def))\n def = `res${def}`\n\n const def_parts = def\n .split(\"_\")\n .map((s) => {\n const m = s.match(/([a-z]+)([\\(\\d\\.\\+\\?].*)?/)\n const [_, fn, v] = m ?? []\n if (v?.includes(\"?\")) return null\n return { fn: m?.[1]!, v: m?.[2]! }\n })\n .filter(isNotNull)\n\n for (const { fn, v } of def_parts) {\n fp = fp[fn](v)\n }\n\n fp.setString(def)\n\n return fp\n}\n\nexport const getFootprintNames = (): string[] => {\n return Object.keys(FOOTPRINT_FN)\n}\n\nexport const footprinter = (): Footprinter & {\n string: typeof string\n getFootprintNames: string[]\n setString: (string) => void\n} => {\n const proxy = new Proxy(\n {},\n {\n get: (target: any, prop: string) => {\n // console.log(prop, target)\n if (prop === \"soup\" || prop === \"circuitJson\") {\n if (\"fn\" in target && FOOTPRINT_FN[target.fn]) {\n return () => FOOTPRINT_FN[target.fn](target).circuitJson\n }\n\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n\n return () => {\n // TODO improve error\n throw new Error(\n `No function found for footprinter, make sure to specify .dip, .lr, .p, etc. Got \"${prop}\"`,\n )\n }\n }\n if (prop === \"json\") {\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n return () => FOOTPRINT_FN[target.fn](target).parameters\n }\n if (prop === \"getFootprintNames\") {\n return () => Object.keys(FOOTPRINT_FN)\n }\n if (prop === \"params\") {\n // TODO\n return () => target\n }\n if (prop === \"setString\") {\n return (v: string) => {\n target.string = v\n return proxy\n }\n }\n return (v: any) => {\n if (Object.keys(target).length === 0) {\n if (`${prop}${v}` in FOOTPRINT_FN) {\n target[`${prop}${v}`] = true\n target.fn = `${prop}${v}`\n } else {\n target[prop] = true\n target.fn = prop\n if (prop === \"res\" || prop === \"cap\") {\n if (v) {\n target.imperial = v // res0402, cap0603 etc.\n }\n } else {\n target.num_pins = Number.isNaN(Number.parseFloat(v))\n ? undefined\n : Number.parseFloat(v)\n }\n }\n } else {\n // handle dip_w or other invalid booleans\n if (!v && [\"w\", \"h\", \"p\"].includes(prop as string)) {\n // ignore\n } else {\n target[prop] = v ?? true\n }\n }\n return proxy\n }\n },\n },\n )\n return proxy as any\n}\nfootprinter.string = string\nfootprinter.getFootprintNames = getFootprintNames\n\nexport const fp = footprinter\n"],"mappings":";;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,UAAU,MAAM;AAAA,EAAK,EAAE,QAAQ,EAAE;AAAA,EAAG,CAAC,GAAG,MACnD,KAAK,IAAK,IAAI,IAAK,KAAK,KAAK,KAAK,EAAE;AACtC,EAAE,IAAI,CAAC,OAAO;AAAA,EACZ;AAAA,EACA,GAAG,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC;AAC1B,EAAE;;;ACJF,SAAS,UAAU;AAEZ,IAAM,aAAa,CACxB,IACA,GACA,GACA,IACA,OACkB;AAClB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,eAAe,GAAG,EAAE;AAAA,IACpB,gBAAgB,GAAG,EAAE;AAAA,IACrB,aAAa;AAAA,IACb,QAAQ,CAAC,OAAO,QAAQ;AAAA,IACxB,YAAY,CAAC,GAAG,SAAS,CAAC;AAAA,EAC5B;AACF;;;ACdA,SAAS,SAAS;AAClB,SAAS,cAAc;;;ACNhB,IAAM,gBAIY,CAAC,GAAW,GAAW,cAAsB;AACpE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,MAAM;AAAA,IACN;AAAA,IACA,kBAAkB;AAAA,IAClB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,iBAAiB,EAAE,GAAM,EAAK;AAAA,IAC9B,kBAAkB;AAAA,EACpB;AACF;;;ADNO,IAAM,eAAe,CAAC,gBAC3B,EACG,OAAO;AAAA,EACN,IAAI,EAAE,OAAO;AAAA,EACb,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACzC,MAAM,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC3B,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,GAAG,OAAO,SAAS;AAAA,EACnB,GAAG,OAAO,QAAQ,OAAO,MAAM,YAAY,KAAK,QAAQ,CAAC;AAAA,EACzD,IAAI,OAAO,SAAS;AAAA,EACpB,IAAI,OAAO,SAAS;AACtB,CAAC,EACA,UAAU,CAAC,MAAM;AAEhB,MAAI,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI;AAClB,MAAE,KAAK,OAAO,MAAM,OAAO;AAC3B,MAAE,KAAK,OAAO,MAAM,OAAO;AAAA,EAC7B,WAAW,CAAC,EAAE,IAAI;AAChB,MAAE,KAAK,EAAE,MAAO,IAAM;AAAA,EACxB,WAAW,CAAC,EAAE,IAAI;AAChB,MAAE,KAAK,EAAE,MAAO,MAAM;AAAA,EACxB;AAGA,MAAI,CAAC,EAAE,GAAG;AACR,QAAI,EAAE,MAAM;AACV,QAAE,IAAI,OAAO,MAAM,QAAQ;AAAA,IAC7B,WAAW,EAAE,QAAQ;AACnB,QAAE,IAAI,OAAO,MAAM,QAAQ;AAAA,IAC7B,OAAO;AACL,QAAE,IAAI,OAAO,MAAM,YAAY,KAAK,QAAQ;AAAA,IAC9C;AAAA,EACF;AACA,SAAO;AACT,CAAC;AAEE,IAAM,UAAU,aAAa,CAAC,CAAC;AAE/B,IAAM,kBAAkB,CAC7B,UACA,IACA,GACA,MACG;AAEH,QAAM,KAAK,WAAW;AACtB,QAAM,SAAS,MAAM;AAGrB,QAAM,cAAc,KAAK;AAGzB,QAAM,KAAK;AAEX,QAAM,IAAI,KAAK;AAEf,MAAI,QAAQ;AAGV,WAAO,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,KAAK,KAAK,KAAK,GAAG;AAAA,EAC/C,OAAO;AAEL,WAAO,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACpD;AACF;AAKO,IAAM,MAAM,CAAC,eAOyC;AAC3D,QAAM,aAAa,QAAQ,MAAM,UAAU;AAC3C,QAAM,cAAmC,CAAC;AAC1C,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM,EAAE,GAAG,EAAE,IAAI;AAAA,MACf,WAAW;AAAA,MACX,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AACA,gBAAY;AAAA,MACV,WAAW,IAAI,GAAG,GAAG,GAAG,WAAW,MAAM,SAAS,WAAW,MAAM,KAAK;AAAA,IAC1E;AAAA,EACF;AAEA,QAAM,KAAK,WAAW,IAAI,WAAW,KAAK;AAC1C,QAAM,MAAM,WAAW,WAAW,IAAI,KAAK,WAAW,IAAI,WAAW,KAAK;AAC1E,QAAM,mBAAsC;AAAA,IAC1C,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,OAAO;AAAA,MACL,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,MACzB,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,EAAE;AAAA;AAAA,MAExB,GAAG,QAAQ,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO;AAAA,QAC5B,GAAI,IAAI,KAAM;AAAA,QACd,GAAI,IAAI,KAAM,IAAI,KAAK;AAAA,MACzB,EAAE;AAAA,MACF,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE;AAAA,MACvB,EAAE,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,MACxB,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,IAC3B;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AACA,QAAM,iBAA2C,CAAC;AAClD,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM,SAAS,IAAI,WAAW,WAAW;AACzC,UAAM,YAAY,SACd,CAAC,WAAW,IAAI,IAAI,WAAW,IAAI,IAAI,MACvC,WAAW,IAAI,IAAI,WAAW,IAAI,IAAI;AAC1C,UAAM,YAAY,UACb,CAAC,KAAK,OAAO,IAAI,IAAI,WAAW,KAChC,CAAC,KAAK,OAAO,KAAK,IAAI,WAAW,WAAW,KAAK,WAAW;AACjE,UAAM,gBAAgB;AAAA,MACpB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,kBAAkB,OAAO,IAAI,CAAC;AAAA,MAC9B,wBAAwB,OAAO,IAAI,CAAC;AAAA,MACpC,MAAM,OAAO,IAAI,CAAC;AAAA,MAClB,iBAAiB;AAAA,QACf,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,MACA,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,kBAAkB;AAAA,IACpB;AAEA,mBAAe,KAAK,aAAa;AAAA,EACnC;AACA,QAAM,oBAAmC,cAAc,GAAG,KAAK,IAAI,KAAK,GAAG;AAE3E,SAAO;AAAA,IACL,aAAa;AAAA,MACX,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;AEjKO,IAAM,UAAU,CACrB,IACA,GACA,GACA,GACA,MACc;AACd,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,eAAe;AAAA,IACf,YAAY,MAAM,QAAQ,EAAE,IACxB,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,IAChC,CAAC,GAAG,SAAS,CAAC;AAAA,EACpB;AACF;;;ACnBA,OAAOA,SAAQ;AAEf,SAAS,KAAAC,UAAS;AAClB,SAAS,UAAAC,SAAQ,gBAAgB;AAejC,IAAM,QAAQ;AAAA,EACZ;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AACF;AACA,IAAM,YAA0C,MAAM,OAAO,CAAC,KAAU,MAAM;AAC5E,MAAI,EAAE,MAAM,IAAI;AAChB,SAAO;AACT,GAAG,CAAC,CAAC;AACL,IAAM,cAA4C,MAAM;AAAA,EACtD,CAAC,KAAU,MAAM;AACf,QAAI,EAAE,QAAQ,IAAI;AAClB,WAAO;AAAA,EACT;AAAA,EACA,CAAC;AACH;AAEO,IAAM,cAAcC,GAAE,OAAO;AAAA,EAClC,KAAKA,GAAE,QAAQ;AAAA,EACf,GAAGC;AAAA,EACH,IAAIA,QAAO,SAAS;AAAA,EACpB,IAAIA,QAAO,SAAS;AAAA,EACpB,QAAQ,SAAS,SAAS;AAAA,EAC1B,UAAU,SAAS,SAAS;AAAA,EAC5B,GAAGA,QAAO,SAAS;AAAA,EACnB,GAAGA,QAAO,SAAS;AACrB,CAAC;AAID,IAAM,eAAe,CAAC,MAAc,QAAQ,KAAK,IAAI,OAAO,IAAI;AAChE,IAAM,eAAe,CAAC,MAAc,OAAO,IAAI;AAC/C,IAAM,eAAe,CAAC,MAAc,OAAO,IAAI;AAC/C,IAAM,eAAe,CAAC,MAAc,QAAQ,KAAK,IAAI,OAAO,IAAI;AAEzD,IAAM,UAAU,CAAC,WAAyC;AAC/D,MAAI,EAAE,KAAK,GAAG,IAAI,IAAI,QAAQ,UAAU,GAAG,EAAE,IAAI;AAEjD,MAAI,OAAO,MAAM;AAAU,QAAIC,IAAG,CAAC;AACnC,MAAI,OAAO,MAAM;AAAU,QAAIA,IAAG,CAAC;AACnC,MAAI,OAAO,MAAM;AAAU,QAAIA,IAAG,CAAC;AACnC,MAAI,OAAO,OAAO;AAAU,SAAKA,IAAG,EAAE;AACtC,MAAI,OAAO,OAAO;AAAU,SAAKA,IAAG,EAAE;AAEtC,MAAI,IAAK,GAAI;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,QAAQ;AACV,SAAK,UAAU,MAAM;AAAA,EACvB;AAEA,MAAI,UAAU;AACZ,SAAK,YAAY,QAAQ;AAAA,EAC3B;AAEA,MAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI;AAC/B,SAAK;AAAA,MACH,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU,aAAa,CAAC;AAAA,MACxB,UAAU,aAAa,CAAC;AAAA,MACxB,UAAU,aAAa,CAAC;AAAA,MACxB,UAAU,aAAa,CAAC;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,IAAI;AACN,QAAI,GAAG;AACP,QAAI,GAAG;AACP,QAAI,GAAG;AACP,UAAM,GAAG,WAAW,GAAG,YAAY;AACnC,UAAM,GAAG,WAAW,GAAG,YAAY;AAAA,EACrC;AAEA,MAAI,OAAO;AAAW,UAAM,IAAI,MAAM,2BAA2B;AACjE,MAAI,OAAO;AAAW,UAAM,IAAI,MAAM,2BAA2B;AAEjE,QAAM,oBAAmC,cAAc,GAAG,KAAK,GAAG;AAClE,MAAI,KAAK;AACP,WAAO;AAAA,MACL,WAAW,GAAG,CAAC,IAAI,GAAG,GAAG,IAAK,KAAK,IAAK,GAAG;AAAA,MAC3C,WAAW,GAAG,IAAI,GAAG,GAAG,IAAK,KAAK,IAAK,GAAG;AAAA,MAC1C;AAAA,IACF;AAAA,EAEF,OAAO;AACL,WAAO;AAAA,MACL,QAAQ,CAAC,KAAK,MAAM,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,MACxC,QAAQ,CAAC,KAAK,OAAO,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACF;;;ACvLO,IAAM,QAAQ,CAAC,eAG2C;AAC/D,SAAO,EAAE,aAAa,QAAQ,UAAU,GAAG,WAAW;AACxD;;;ACJO,IAAM,MAAM,CACjB,eAC8D;AAC9D,SAAO,EAAE,aAAa,QAAQ,UAAU,GAAG,WAAW;AACxD;;;ACLO,IAAM,MAAM,CACjB,eAC8D;AAC9D,SAAO,EAAE,aAAa,QAAQ,UAAU,GAAG,WAAW;AACxD;;;ACJO,IAAM,MAAM,CACjB,eACuD;AACvD,SAAO,EAAE,aAAa,QAAQ,UAAU,GAAG,WAAW;AACxD;;;ACPO,IAAM,WAAW;;;ACGxB,SAAS,KAAAC,UAAS;AAClB,SAAS,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACJjC,SAAS,KAAAC,UAAS;AAEX,IAAM,QAAQA,GAClB,OAAO,EACP,UAAU,CAAC,MAAM;AAChB,QAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,MAAM;AAC7B,SAAO;AAAA,IACL,GAAG,WAAW,CAAC;AAAA,IACf,GAAG,WAAW,CAAC;AAAA,EACjB;AACF,CAAC,EACA;AAAA,EACCA,GAAE,OAAO;AAAA,IACP,GAAGA,GAAE,OAAO;AAAA,IACZ,GAAGA,GAAE,OAAO;AAAA,EACd,CAAC;AACH;;;AChBF,SAAS,KAAAC,UAAS;AAEX,IAAM,gBAAgBA,GAC1B,OAAO,EACP,GAAGA,GAAE,MAAMA,GAAE,IAAI,CAAC,CAAC,EACnB,UAAU,CAAC,MAAM;AAChB,MAAI,MAAM,QAAQ,CAAC;AAAG,WAAO;AAC7B,MAAI,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,GAAG;AACxC,QAAI,EAAE,MAAM,GAAG,EAAE;AAAA,EACnB;AACA,SAAO,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM;AAC7B,UAAM,SAAS,OAAO,CAAC;AACvB,WAAO,MAAM,MAAM,IAAI,IAAI;AAAA,EAC7B,CAAC;AACH,CAAC,EACA,KAAKA,GAAE,MAAMA,GAAE,OAAO,EAAE,GAAGA,GAAE,OAAO,CAAC,CAAC,CAAC;;;AFLnC,IAAM,UAAUC,GACpB,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO;AAAA,EACb,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EAC1C,MAAM,MAAM,SAAS;AAAA,EACrB,GAAGC,UAAS,QAAQ,OAAO;AAAA,EAC3B,GAAGC,QAAO,SAAS;AAAA,EACnB,GAAGA,QAAO,SAAS;AAAA,EACnB,MAAMA,QAAO,SAAS,EAAE,SAAS,eAAe;AAAA,EAChD,KAAKA,QAAO,SAAS,EAAE,SAAS,kBAAkB;AAAA,EAElD,UAAUF,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAE/B,SAAS,cAAc,QAAQ,CAAC,CAAC;AACnC,CAAC,EACA,UAAU,CAAC,MAAM;AAChB,MAAI,SAAoC;AACxC,MAAI,EAAE;AAAU,aAAS;AACzB,MAAI,EAAE;AAAU,aAAS;AACzB,MAAI,EAAE;AAAU,aAAS;AAEzB,MAAI,CAAC,EAAE,MAAM;AAEX,UAAM,iBAAiB,KAAK,KAAK,KAAK,KAAK,EAAE,QAAQ,CAAC;AACtD,MAAE,OAAO,EAAE,GAAG,gBAAgB,GAAG,eAAe;AAAA,EAClD;AAEA,MAAI,EAAE,SAAS;AACb,MAAE,UAAU,EAAE,QAAQ,IAAI,CAAC,MAAM;AAC/B,UAAI,OAAO,MAAM;AAAU,eAAO;AAClC,UAAI,MAAM;AAAU,eAAO;AAC3B,UAAI,MAAM;AAAW,eAAO;AAC5B,YAAM,IAAI,EAAE,MAAM,eAAe;AACjC,UAAI,CAAC;AAAG,eAAO;AACf,YAAM,IAAI,SAAS,QAAQ,EAAE,CAAC,CAAE;AAChC,YAAM,IAAI,OAAO,SAAS,EAAE,CAAC,CAAE,IAAI;AACnC,aAAO,IAAI,EAAE,KAAM,IAAI,IAAI;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,EAAE,GAAG,GAAG,OAAO;AAE/B,SAAO;AACT,CAAC;AAKI,IAAM,MAAM,CACjB,eACuD;AACvD,QAAM,aAAa,QAAQ,MAAM,UAAU;AAC3C,MAAI,EAAE,UAAU,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,QAAQ,IAAI;AAEtD,WAAU,OAAO,OAAQ;AAEzB,UAAQ,OAAO;AAEf,QAAM,OAAoB,CAAC;AAE3B,QAAM,oBAAoB,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,OAAO,MAAM,QAAQ;AAC5E,QAAM,mBAAmB,KAAK,IAAI,KAAK,IAAI;AAE3C,MAAI,QAAQ,WAAW,KAAK,mBAAmB,GAAG;AAGhD,QAAI,KAAK,KAAK,gBAAgB,IAAI,MAAM,GAAG;AACzC,cAAQ,KAAK,QAAQ;AAAA,IACvB,WAAW,qBAAqB,GAAG;AACjC,cAAQ,KAAK,SAAS;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,QAAQ,GAAG;AAG/B,UAAM,cAAc,KAAK,MAAM,KAAK,KAAK,gBAAgB,CAAC;AAI1D,UAAM,iBAAiB,KAAK,OAAO,KAAK,IAAI,eAAe,CAAC;AAC5D,UAAM,iBAAiB,KAAK,OAAO,KAAK,IAAI,eAAe,CAAC;AAG5D,aAAS,IAAI,gBAAgB,IAAI,iBAAiB,aAAa,KAAK;AAClE,eAAS,IAAI,gBAAgB,IAAI,iBAAiB,aAAa,KAAK;AAClE,yBAAiB,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,SAAS,GAAG;AAChC,qBAAiB,KAAK,CAAC;AAAA,EACzB;AAEA,QAAM,uBAAuB,IAAI,IAAI,gBAAgB;AAErD,MAAI,sBAAsB;AAC1B,WAAS,IAAI,GAAG,IAAI,KAAK,GAAG,KAAK;AAC/B,aAAS,IAAI,GAAG,IAAI,KAAK,GAAG,KAAK;AAC/B,UAAI,UAAU,IAAI,KAAK,IAAI,IAAI;AAC/B,UAAI,qBAAqB,IAAI,OAAO,GAAG;AACrC;AACA;AAAA,MACF;AACA,iBAAW;AAEX,YAAM,SAAS,KAAK,KAAK,IAAI,KAAK,KAAK;AACvC,YAAM,QAAQ,EAAE,KAAK,KAAK,IAAI,KAAK,KAAK;AAGxC,WAAK;AAAA,QACH,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,OAAO,OAAO,KAAK,GAAG;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACA,QAAM,oBAAmC;AAAA,IACvC;AAAA,IACC,KAAK,IAAI,IAAK;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,CAAC,GAAG,MAAM,iBAAmC;AAAA,IAC1D;AAAA,EACF;AACF;;;AGzIA,SAAS,KAAAG,UAAS;AAClB,SAAS,UAAAC,eAAc;AAKhB,IAAM,gBAAgB,CAAC,gBAM5BC,GACG,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO;AAAA,EACb,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACzC,GAAGC,QAAO,QAAQA,QAAO,MAAM,YAAY,KAAK,OAAO,CAAC;AAAA,EACxD,GAAGA,QAAO,QAAQA,QAAO,MAAM,YAAY,KAAK,QAAQ,CAAC;AAAA,EACzD,IAAIA,QAAO,SAAS;AAAA,EACpB,IAAIA,QAAO,SAAS;AAAA,EACpB,aAAaD,GACV,QAAQ,EACR,SAAS,EACT,QAAQ,YAAY,eAAe,KAAK;AAC7C,CAAC,EACA,UAAU,CAAC,MAAM;AAEhB,MAAI,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI;AAClB,MAAE,KAAKC,QAAO,MAAM,OAAO;AAC3B,MAAE,KAAKA,QAAO,MAAM,OAAO;AAAA,EAC7B,WAAW,CAAC,EAAE,IAAI;AAChB,MAAE,KAAK,EAAE,MAAO,MAAM;AAAA,EACxB,WAAW,CAAC,EAAE,IAAI;AAChB,MAAE,KAAK,EAAE,MAAO,IAAM;AAAA,EACxB;AAEA,SAAO;AACT,CAAC;AAEE,IAAM,WAAW,cAAc,CAAC,CAAC;AAGjC,IAAM,mBAAmB,CAAC,eAQ3B;AACJ,MAAI,WAAW,sBAAsB,QAAW;AAC9C,eAAW,cAAc,CAAC,WAAW;AAAA,EACvC;AACA,QAAM,EAAE,UAAU,IAAI,GAAG,GAAG,IAAI,YAAY,IAAI;AAEhD,QAAM,KAAK,WAAW;AACtB,QAAM,SAAS,MAAM;AAGrB,QAAM,cAAc,KAAK;AAGzB,QAAM,KAAK;AAEX,QAAM,IAAI,KAAK;AAEf,QAAM,YAAY,cAAc,KAAK,IAAI,CAAC,KAAK;AAE/C,MAAI,QAAQ;AAGV,WAAO,EAAE,GAAG,CAAC,IAAI,IAAI,WAAW,GAAG,IAAI,KAAK,KAAK,KAAK,GAAG;AAAA,EAC3D,OAAO;AAEL,WAAO,EAAE,GAAG,IAAI,IAAI,WAAW,GAAG,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAChE;AACF;AAKO,IAAM,OAAO,CAAC,eAOqC;AACxD,QAAM,aAAa,SAAS,MAAM,UAAU;AAC5C,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;AAEO,IAAM,qBAAqB,CAAC,eAAyC;AAC1E,QAAM,OAAyB,CAAC;AAChC,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM,EAAE,GAAG,EAAE,IAAI,iBAAiB;AAAA,MAChC,UAAU,WAAW;AAAA,MACrB,IAAI,IAAI;AAAA,MACR,GAAG,WAAW;AAAA,MACd,GAAG,WAAW,KAAK;AAAA,MACnB,IAAI,WAAW;AAAA,MACf,aAAa,WAAW;AAAA,IAC1B,CAAC;AACD,SAAK;AAAA,MACH,QAAQ,IAAI,GAAG,GAAG,GAAG,WAAW,MAAM,OAAO,WAAW,MAAM,OAAO;AAAA,IACvE;AAAA,EACF;AAGA,QAAM,IAAI,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC;AACtC,QAAM,KACJ,WAAW,KAAK,WAAW,cAAc,IAAI,WAAW,KAAK,KAAK;AACpE,QAAM,MAAM,WAAW,WAAW,IAAI,KAAK,WAAW,IAAI,WAAW,KAAK;AAC1E,QAAM,oBAAmC;AAAA,IACvC;AAAA,IACA,KAAK,IAAI;AAAA,IACT,KAAK;AAAA,EACP;AACA,QAAM,mBAAsC;AAAA,IAC1C,MAAM;AAAA,IACN,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,cAAc;AAAA,IACd,OAAO;AAAA,MACL,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,MACzB,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,EAAE;AAAA;AAAA,MAExB,GAAG,QAAQ,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO;AAAA,QAC5B,GAAI,IAAI,KAAM;AAAA,QACd,GAAI,IAAI,KAAM,IAAI,KAAK;AAAA,MACzB,EAAE;AAAA,MACF,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,EAAE;AAAA,MACvB,EAAE,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,MACxB,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,MAAM,kBAAkB,iBAAiB;AACtD;;;ACjJA,SAAmB,KAAAC,UAAS;AAC5B,SAAS,UAAAC,eAAc;;;ACFvB,SAAS,KAAAC,UAAS;AACX,IAAM,sBAAsBA,GAAE,KAAK;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;ACqBM,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAKgB;AACd,QAAM,UAAoB,CAAC;AAC3B,QAAM,gBAAgB,WAAW;AACjC,MAAI,8BAA8B;AAGlC,QAAM,MAA0C,CAAC;AACjD,aAAW,aAAa,eAAe,CAAC,GAAG;AACzC,QAAI,SAAS,IAAI;AAAA,EACnB;AACA,MAAI,CAAC,IAAI,YAAY,CAAC,IAAI,WAAW,CAAC,IAAI,aAAa,CAAC,IAAI,YAAY;AACtE,QAAI,WAAW;AAAA,EACjB;AACA,MAAI,CAAC,IAAI,aAAa,CAAC,IAAI,WAAW,CAAC,IAAI,YAAY,CAAC,IAAI,QAAQ;AAClE,QAAI,IAAI,UAAU;AAChB,UAAI,SAAS;AAAA,IACf,WAAW,IAAI,SAAS;AACtB,UAAI,WAAW;AAAA,IACjB,WAAW,IAAI,WAAW;AACxB,UAAI,YAAY;AAAA,IAClB,WAAW,IAAI,YAAY;AACzB,UAAI,UAAU;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,IAAI,YAAY,IAAI,QAAQ;AAC9B,kCAA8B;AAAA,EAChC,WAAW,IAAI,YAAY,IAAI,WAAW;AACxC,kCAA8B;AAAA,EAChC,WAAW,IAAI,cAAc,IAAI,SAAS;AACxC,kCAA8B,gBAAgB;AAAA,EAChD,WAAW,IAAI,cAAc,IAAI,UAAU;AACzC,kCAA8B,gBAAgB;AAAA,EAChD,WAAW,IAAI,aAAa,IAAI,WAAW;AACzC,kCAA8B,gBAAgB,IAAI;AAAA,EACpD,WAAW,IAAI,aAAa,IAAI,QAAQ;AACtC,kCAA8B,gBAAgB;AAAA,EAChD,WAAW,IAAI,WAAW,IAAI,UAAU;AACtC,kCAA8B,gBAAgB,IAAI;AAAA,EACpD,WAAW,IAAI,WAAW,IAAI,SAAS;AACrC,kCAA8B,gBAAgB;AAAA,EAChD;AAEA,UAAQ,KAAK,EAAE;AAKf,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,YAAQ,2BAA2B,IAAI,IAAI;AAC3C,QAAI,OAAO,CAAC,IAAI;AACd;AACA,UAAI,8BAA8B,UAAU;AAC1C,sCAA8B;AAAA,MAChC;AAAA,IACF,OAAO;AACL;AACA,UAAI,8BAA8B,GAAG;AACnC,sCAA8B;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AF/FO,IAAM,gBAAgBC,GAAE,OAAO;AAAA,EACpC,IAAIA,GAAE,OAAO;AAAA,EACb,IAAIA,GAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS;AAAA,EACvC,KAAKA,GAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS;AAAA,EACxC,aAAaA,GACV,OAAO,EACP,GAAGA,GAAE,MAAM,mBAAmB,CAAC,EAC/B,UAAU,CAAC,MAAO,OAAO,MAAM,WAAW,EAAE,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,IAAI,CAAE,EACxE,KAAKA,GAAE,MAAM,mBAAmB,CAAC,EACjC,SAAS;AAAA,EACZ,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EAC1C,GAAGC,QAAO,SAAS;AAAA,EACnB,GAAGA,QAAO,SAAS;AAAA,EACnB,GAAGA,QAAO,QAAQA,QAAO,MAAM,OAAO,CAAC;AAAA,EACvC,IAAIA,QAAO,SAAS;AAAA,EACpB,IAAIA,QAAO,SAAS;AAAA,EACpB,YAAYD,GAAE,MAAM,CAACA,GAAE,QAAQ,IAAI,GAAG,KAAK,CAAC,EAAE,SAAS;AAAA,EACvD,aAAaA,GAAE,QAAQ,EAAE,SAAS;AACpC,CAAC;AAEM,IAAM,gBAAgB,CAC3B,MACG;AACH,MAAI,EAAE,KAAK,CAAC,EAAE,GAAG;AACf,MAAE,IAAI,EAAE;AAAA,EACV,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG;AACtB,MAAE,IAAI,EAAE;AAAA,EACV;AAEA,QAAM,iBAAiB,EAAE,WAAW;AAEpC,MAAI,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG;AAEjC,UAAM,0BAA0B,iBAAiB;AACjD,MAAE,IAAI,EAAE,IAAI;AAAA,EACd;AAEA,MAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI;AAEtC,MAAE,KAAK,EAAE,IAAI,EAAE,KAAK,MAAM,iBAAiB;AAAA,EAC7C;AAEA,MAAI,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG;AAEvB,MAAE,IAAI,EAAE,KAAK,iBAAiB;AAC9B,MAAE,IAAI,EAAE;AAAA,EACV;AAEA,MAAI,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI;AACzB,MAAE,KAAK,EAAE,IAAI;AACb,MAAE,KAAK,EAAE,IAAI;AAAA,EACf,WAAW,CAAC,EAAE,IAAI;AAChB,MAAE,KAAK,EAAE,MAAO,MAAM;AAAA,EACxB,WAAW,CAAC,EAAE,IAAI;AAChB,MAAE,KAAK,EAAE,MAAO,IAAM;AAAA,EACxB;AAEA,SAAO;AACT;AAEO,IAAM,WAAW,cAAc,UAAU,aAAa;AAE7D,IAAM,YAAY,CAAC,QAAQ,UAAU,SAAS,KAAK;AAE5C,IAAM,gBAAgB,CAAC,WAQxB;AACJ,QAAM,EAAE,WAAW,IAAI,GAAG,GAAG,GAAG,IAAI,YAAY,IAAI;AACpD,QAAM,eAAe,YAAY;AACjC,QAAM,OAAO,UAAU,KAAK,OAAO,KAAK,KAAK,YAAY,CAAC;AAC1D,QAAM,OAAO,KAAK,KAAK;AAGvB,QAAM,MAAM,KAAK,eAAe;AAEhC,QAAM,MAAM,KAAK,eAAe;AAGhC,QAAM,QAAQ,cAAc,KAAK,IAAI,CAAC,KAAK;AAE3C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,EAAE,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,MAAM,IAAI,MAAM,GAAG,GAAG,OAAO;AAAA,IAC9D,KAAK;AACH,aAAO,EAAE,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,OAAO;AAAA,IAC/D,KAAK;AACH,aAAO,EAAE,GAAG,IAAI,IAAI,OAAO,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,GAAG,OAAO;AAAA,IAC9D,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,GAAG,OAAO;AAAA,IAC7D;AACE,YAAM,IAAI,MAAM,oBAAoB;AAAA,EACxC;AACF;AAEO,IAAM,OAAO,CAClB,eACuD;AACvD,QAAM,aAAa,SAAS,MAAM,UAAU;AAC5C,QAAM,OAAyB,CAAC;AAChC,QAAM,UAAU,cAAc,UAAU;AAExC,QAAM,MAAM,WAAW,WAAW;AAClC,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,IAAI,cAAc;AAAA,MAChB,WAAW,WAAW;AAAA,MACtB,IAAI,IAAI;AAAA,MACR,GAAG,WAAW;AAAA,MACd,GAAG,WAAW;AAAA,MACd,GAAG,WAAW,KAAK;AAAA,MACnB,IAAI,WAAW;AAAA,MACf,aAAa,WAAW;AAAA,IAC1B,CAAC;AAED,QAAI,KAAK,WAAW;AACpB,QAAI,KAAK,WAAW;AACpB,QAAI,gBAAgB,QAAQ;AAC1B;AAAC,OAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AAAA,IACrB;AAEA,UAAM,KAAK,QAAQ,IAAI,CAAC;AACxB,SAAK,KAAK,QAAQ,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;AAAA,EACrC;AAEA,MAAI,WAAW,YAAY;AACzB,QAAI,OAAO,WAAW,eAAe,WAAW;AAC9C,YAAM,MAAM,WAAW,KAAK,MAAM,KAAK,WAAW;AAClD,YAAM,MAAM,WAAW,KAAK,MAAM,KAAK,WAAW;AAClD,WAAK,KAAK,QAAQ,CAAC,YAAY,GAAG,GAAG,GAAG,KAAK,GAAG,CAAC;AAAA,IACnD,OAAO;AACL,WAAK;AAAA,QACH;AAAA,UACE,CAAC,YAAY;AAAA,UACb;AAAA,UACA;AAAA,UACA,WAAW,WAAW;AAAA,UACtB,WAAW,WAAW;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,qBAA0C,CAAC;AACjD,aAAW,CAAC,QAAQ,IAAI,EAAE,KAAK;AAAA,IAC7B,CAAC,YAAY,IAAI,CAAC;AAAA,IAClB,CAAC,eAAe,IAAI,EAAE;AAAA,IACtB,CAAC,gBAAgB,GAAG,EAAE;AAAA,IACtB,CAAC,aAAa,GAAG,CAAC;AAAA,EACpB,GAAY;AAGV,UAAM,WAAY,WAAW,IAAI,IAAK;AACtC,UAAM,WAAY,WAAW,IAAI,IAAK;AACtC,QAAI,QAAgC;AAEpC,QAAI,UAAU;AACd,QAAI,UAAU;AAGd,UAAM,MAAM,WAAW,KAAK;AAE5B,QAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,YAAY;AAC7C,cAAQ;AAAA,IACV,WAAW,QAAQ,MAAM,CAAC,MAAM,KAAK,WAAW,YAAY;AAC1D,cAAQ;AAAA,IACV,WAAW,QAAQ,MAAM,IAAI,CAAC,MAAM,KAAK,WAAW,aAAa;AAC/D,cAAQ;AAAA,IACV,WAAW,QAAQ,MAAM,CAAC,MAAM,KAAK,WAAW,aAAa;AAC3D,cAAQ;AAAA,IACV,WAAW,QAAQ,GAAG,MAAM,KAAK,WAAW,eAAe;AACzD,cAAQ;AAAA,IACV,WAAW,QAAQ,MAAM,CAAC,MAAM,KAAK,WAAW,eAAe;AAC7D,cAAQ;AAAA,IACV,WAAW,QAAQ,MAAM,CAAC,MAAM,KAAK,WAAW,gBAAgB;AAC9D,cAAQ;AAAA,IACV,WAAW,QAAQ,MAAM,IAAI,CAAC,MAAM,KAAK,WAAW,gBAAgB;AAClE,cAAQ;AAAA,IACV;AAEA,UAAM,eAAe,UAAU,QAAQ,IAAI;AAC3C,QAAI,WAAW,aAAa;AAC1B,YAAM,WAAW,UAAU,QAAQ,WAAW,KAAK,IAAI,WAAW,KAAK;AACvE,YAAM,WAAW,UAAU,QAAQ,WAAW,KAAK,IAAI,WAAW,KAAK;AACvE,iBAAW,WAAW,KAAK;AAC3B,iBAAW,WAAW,KAAK;AAAA,IAC7B;AAGA,QAAI,UAAU,UAAU,WAAW,aAAa;AAC9C,yBAAmB,KAAK;AAAA,QACtB,OAAO;AAAA,QACP,kBAAkB;AAAA,QAClB,wBAAwB,uBAAuB,MAAM;AAAA,QACrD,OAAO;AAAA,UACL;AAAA,YACE,GAAG,WAAW,MAAM;AAAA,YACpB,GAAG;AAAA,UACL;AAAA,UACA;AAAA,YACE,GAAG;AAAA,YACH,GAAG;AAAA,UACL;AAAA,UACA;AAAA,YACE,GAAG;AAAA,YACH,GAAG,WAAW,MAAM;AAAA,UACtB;AAAA,QACF;AAAA,QACA,MAAM;AAAA,QACN,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAIA,SAAK,UAAU,SAAS,UAAU,UAAU,CAAC,WAAW,aAAa;AACnE,yBAAmB;AAAA,QACjB;AAAA,UACE,OAAO;AAAA,UACP,kBAAkB;AAAA,UAClB,wBAAwB,uBAAuB,MAAM;AAAA,UACrD,OAAO;AAAA,YACL;AAAA,cACE,GAAG,WAAW,MAAM;AAAA,cACpB,GAAG;AAAA,YACL;AAAA,YACA;AAAA,cACE,GAAG,WAAY,MAAM,KAAM;AAAA,cAC3B,GAAG;AAAA,YACL;AAAA,UACF;AAAA,UACA,MAAM;AAAA,UACN,cAAc;AAAA,QAChB;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,kBAAkB;AAAA,UAClB,wBAAwB,uBAAuB,MAAM;AAAA,UACrD,OAAO;AAAA,YACL;AAAA,cACE,GAAG;AAAA,cACH,GAAG,WAAY,MAAM,KAAM;AAAA,YAC7B;AAAA,YACA;AAAA,cACE,GAAG;AAAA,cACH,GAAG,WAAW,MAAM;AAAA,YACtB;AAAA,UACF;AAAA,UACA,MAAM;AAAA,UACN,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AACA,QAAI,UAAU,SAAS,UAAU,OAAO;AACtC,yBAAmB,KAAK;AAAA,QACtB,OAAO;AAAA,QACP,kBAAkB;AAAA,QAClB,wBAAwB,uBAAuB,MAAM;AAAA,QACrD,OAAO;AAAA,UACL;AAAA,YACE,GAAG,UAAU,MAAM,CAAC;AAAA,YACpB,GAAG,UAAU,MAAM;AAAA,UACrB;AAAA,UACA;AAAA,YACE,GAAG;AAAA,YACH,GAAG;AAAA,UACL;AAAA,UACA;AAAA,YACE,GAAG,UAAU,MAAM,eAAe,CAAC;AAAA,YACnC,GAAG,UAAU;AAAA,UACf;AAAA,UACA;AAAA,YACE,GAAG,UAAU,MAAM,CAAC;AAAA,YACpB,GAAG,UAAU,MAAM;AAAA,UACrB;AAAA,QACF;AAAA,QACA,MAAM;AAAA,QACN,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,oBAAmC;AAAA,IACvC;AAAA,IACA,WAAW,IAAI,KAAK,WAAW,cAAc,WAAW,KAAK,MAAM;AAAA,IACnE;AAAA,EACF;AACA,SAAO;AAAA,IACL,aAAa;AAAA,MACX,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;;;AGrTO,IAAM,UAAU,cAAc,OAAO,CAAC,CAAC,EAAE,UAAU,aAAa;AAEhE,IAAM,MAAM,CACjB,eACuD;AACvD,aAAW,cAAc;AACzB,SAAO,KAAK,UAAU;AACxB;;;ACLO,IAAM,MAAM,CACjB,eAC0D;AAC1D,aAAW,cAAc;AAEzB,QAAM,gBAAgB,SAAS,MAAM,UAAU;AAC/C,MAAI,CAAC,WAAW,GAAG;AACjB,YAAQ,WAAW,UAAU;AAAA,MAC3B,KAAK;AAAA,MACL,KAAK;AACH,mBAAW,IAAI;AACf;AAAA,MACF,KAAK;AACH,YAAI,WAAW,MAAM;AAAI,qBAAW,IAAI;AAAA;AACnC,qBAAW,IAAI;AACpB;AAAA,MACF,KAAK;AACH,mBAAW,IAAI;AACf;AAAA,IACJ;AAAA,EACF;AACA,MAAI,CAAC,WAAW,IAAI;AAClB,YAAQ,WAAW,UAAU;AAAA,MAC3B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,mBAAW,KAAK;AAChB;AAAA,MACF,KAAK;AACH,mBAAW,KAAK;AAChB;AAAA,MACF;AACE,mBAAW,KAAK,cAAc,KAAK;AACnC;AAAA,IACJ;AAAA,EACF;AACA,MAAI,CAAC,WAAW,IAAI;AAClB,YAAQ,WAAW,UAAU;AAAA,MAC3B,KAAK;AAAA,MACL,KAAK;AACH,mBAAW,KAAK;AAChB;AAAA,MACF,KAAK;AACH,YAAI,WAAW,MAAM;AAAI,qBAAW,KAAK;AAAA;AACpC,qBAAW,KAAK;AACrB;AAAA,MACF,KAAK;AACH,mBAAW,KAAK;AAChB;AAAA,MACF;AACE,mBAAW,KAAK,cAAc;AAC9B;AAAA,IACJ;AAAA,EACF;AACA,SAAO,KAAK,UAAU;AACxB;;;ACzDO,IAAM,UAAU,cAAc,OAAO,CAAC,CAAC,EAAE,UAAU,aAAa;AAEhE,IAAM,MAAM,CACjB,eACuD;AACvD,aAAW,cAAc;AACzB,MAAI,WAAW,eAAe,QAAW;AACvC,eAAW,aAAa;AAAA,EAC1B;AACA,SAAO,KAAK,UAAU;AACxB;;;ACTO,IAAM,WAAW,cAAc;AAAA,EACpC,GAAG;AAAA,EACH,GAAG;AACL,CAAC;AAEM,IAAM,OAAO,CAClB,eACuD;AACvD,QAAM,aAAa,SAAS,MAAM,UAAU;AAC5C,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;ACfO,IAAM,YAAY,cAAc;AAAA,EACrC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,aAAa;AACf,CAAC;AAEM,IAAM,QAAQ,CACnB,eACuD;AACvD,QAAM,aAAa,UAAU,MAAM,UAAU;AAC7C,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;ACbO,IAAM,aAAa,cAAc;AAAA,EACtC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,aAAa;AACf,CAAC;AAEM,IAAM,SAAS,CACpB,eACuD;AACvD,QAAM,aAAa,WAAW,MAAM,EAAE,GAAG,YAAY,UAAU,EAAE,CAAC;AAClE,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;ACdO,IAAM,aAAa,cAAc,CAAC,CAAC;AAEnC,IAAM,SAAS,CACpB,eACuD;AACvD,QAAM,aAAa,WAAW,MAAM;AAAA,IAClC,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,YAAY;AAAA,EACd,CAAC;AAED,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;ACtBA,SAAS,KAAAE,UAAS;AAIX,IAAM,YAAYC,GAAE,OAAO;AAAA,EAChC,IAAIA,GAAE,OAAO;AAAA,EACb,UAAUA,GAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;AAAA,EAChC,GAAGA,GAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,EAC9B,GAAGA,GAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,EAC9B,IAAIA,GAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC9B,IAAIA,GAAE,OAAO,EAAE,QAAQ,SAAS;AAClC,CAAC;AAEM,IAAM,QAAQ,CACnB,eACuD;AACvD,QAAM,aAAa,UAAU,MAAM,UAAU;AAC7C,SAAO;AAAA,IACL,aAAa,oBAAoB,UAAU;AAAA,IAC3C;AAAA,EACF;AACF;AAEO,IAAM,oBAAoB,CAAC,eAM5B;AACJ,QAAM,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI;AAEzB,MAAI,OAAO,GAAG;AACZ,WAAO,EAAE,GAAG,MAAM,GAAG,EAAE;AAAA,EACzB,WAAW,OAAO,GAAG;AACnB,WAAO,EAAE,GAAG,KAAK,GAAG,MAAM;AAAA,EAC5B,OAAO;AACL,WAAO,EAAE,GAAG,KAAK,GAAG,KAAK;AAAA,EAC3B;AACF;AAEO,IAAM,sBAAsB,CAAC,eAA0C;AAC5E,QAAM,OAAyB,CAAC;AAEhC,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM,EAAE,GAAG,EAAE,IAAI,kBAAkB;AAAA,MACjC,UAAU,WAAW;AAAA,MACrB,IAAI,IAAI;AAAA,MACR,GAAG,OAAO,WAAW,WAAW,CAAC;AAAA,MACjC,GAAG,OAAO,WAAW,WAAW,CAAC;AAAA,MACjC,IAAI,OAAO,WAAW,WAAW,EAAE;AAAA,IACrC,CAAC;AACD,SAAK;AAAA,MACH;AAAA,QACE,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,OAAO,WAAW,WAAW,EAAE;AAAA,QAC/B,OAAO,WAAW,WAAW,EAAE;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAmC;AAAA,IACvC;AAAA,IACA,OAAO,WAAW,CAAC;AAAA,IACnB;AAAA,EACF;AACA,SAAO,CAAC,GAAG,MAAM,iBAAmC;AACtD;;;AC9DA,OAAkB;;;ACRX,IAAM,UAAU;AAAA,EACrB,EAAE,MAAM,YAAY,IAAI,IAAI,IAAI,EAAE;AAAA,EAClC,EAAE,MAAM,aAAa,IAAI,GAAG,IAAI,EAAE;AAAA,EAClC,EAAE,MAAM,eAAe,IAAI,IAAI,IAAI,GAAG;AAAA,EACtC,EAAE,MAAM,gBAAgB,IAAI,GAAG,IAAI,GAAG;AACxC;;;ADOO,IAAM,UAAU,cAAc,CAAC,CAAC;AAOhC,IAAM,MAAM,CACjB,eACuD;AACvD,QAAM,aAAa,QAAQ,MAAM,UAAU;AAC3C,QAAM,OAAyB,CAAC;AAChC,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM,EAAE,GAAG,EAAE,IAAI,iBAAiB;AAAA,MAChC,UAAU,WAAW;AAAA,MACrB,IAAI,IAAI;AAAA,MACR,GAAG,WAAW;AAAA,MACd,GAAG,WAAW,KAAK;AAAA,MACnB,IAAI,WAAW;AAAA,MACf,mBAAmB;AAAA,IACrB,CAAC;AACD,SAAK;AAAA,MACH,QAAQ,IAAI,GAAG,GAAG,GAAG,WAAW,MAAM,OAAO,WAAW,MAAM,OAAO;AAAA,IACvE;AAAA,EACF;AAGA,QAAM,IAAI,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC;AACtC,QAAM,KAAK,WAAW,IAAI;AAC1B,QAAM,MAAM,WAAW,WAAW,IAAI,KAAK,WAAW,IAAI,WAAW,KAAK;AAC1E,QAAM,kBAAuC,CAAC;AAE9C,aAAW,UAAU,SAAS;AAC5B,UAAM,EAAE,IAAI,GAAG,IAAI;AACnB,oBAAgB,KAAK;AAAA,MACnB,OAAO;AAAA,MACP,kBAAkB;AAAA,MAClB,wBAAwB;AAAA,MACxB,OAAO;AAAA,QACL,EAAE,GAAI,KAAK,KAAM,IAAI,KAAK,WAAW,GAAG,GAAI,KAAK,KAAM,EAAE;AAAA,QACzD,EAAE,GAAI,KAAK,KAAM,GAAG,GAAI,KAAK,KAAM,EAAE;AAAA,QACrC,EAAE,GAAI,KAAK,KAAM,GAAG,GAAI,KAAK,KAAM,IAAI,KAAK,WAAW,EAAE;AAAA,MAC3D;AAAA,MACA,MAAM;AAAA,MACN,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAIA,QAAM,KAAK,WAAW,IAAI;AAE1B,QAAM,MAAM,CAAC,KAAK,IAAI,KAAK;AAE3B,QAAM,MAAM,KAAK,IAAI,WAAW,IAAI;AAEpC,kBAAgB,KAAK;AAAA,IACnB,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,QACE,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG,MAAM;AAAA,QACT,GAAG,MAAM;AAAA,MACX;AAAA,MACA;AAAA,QACE,GAAG,MAAM;AAAA,QACT,GAAG,MAAM;AAAA,MACX;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,IACF;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,oBAAmC;AAAA,IACvC;AAAA,IACA,KAAK,IAAI;AAAA,IACT,KAAK;AAAA,EACP;AACA,SAAO;AAAA,IACL,aAAa;AAAA,MACX,GAAG;AAAA,MACH;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;AE1GA,SAAS,KAAAC,WAAS;AAClB,SAAS,UAAAC,eAAmC;AAIrC,IAAM,aAAaC,IAAE,OAAO;AAAA,EACjC,IAAIA,IAAE,OAAO;AAAA,EACb,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACzC,GAAGC,QAAO,QAAQ,OAAO,EAAE,SAAS,OAAO;AAAA,EAC3C,IAAIA,QAAO,QAAQ,OAAO,EAAE,SAAS,gBAAgB;AAAA,EACrD,IAAIA,QAAO,QAAQ,OAAO,EAAE,SAAS,gBAAgB;AACvD,CAAC;AAEM,IAAM,SAAS,CACpB,eACuD;AACvD,QAAM,aAAa,WAAW,MAAM,UAAU;AAC9C,QAAM,EAAE,GAAG,IAAI,GAAG,IAAI;AACtB,QAAM,QAAe,CAAC;AAEtB,QAAM,KAAK,WAAW,WAAW;AACjC,QAAM,OAAO,EAAE,KAAK,KAAK;AAEzB,WAAS,IAAI,GAAG,IAAI,WAAW,UAAU,KAAK;AAC5C,UAAM,KAAK,WAAW,IAAI,GAAG,OAAO,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;AAAA,EACvD;AACA,QAAM,oBAAmC,cAAc,GAAG,IAAI,GAAG,GAAG;AACpE,SAAO;AAAA,IACL,aAAa,CAAC,GAAG,OAAO,iBAAiB;AAAA,IACzC;AAAA,EACF;AACF;;;AC3BO,IAAM,aAAa,cAAc,CAAC,CAAC;AAEnC,IAAM,SAAS,CACpB,eACuD;AACvD,QAAM,aAAa,WAAW,MAAM;AAAA,IAClC,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,YAAY;AAAA,EACd,CAAC;AACD,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;AClBO,IAAM,YAAY,cAAc;AAAA,EACrC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,aAAa;AACf,CAAC;AAEM,IAAM,QAAQ,CACnB,eACuD;AACvD,QAAM,aAAa,UAAU,MAAM,EAAE,GAAG,YAAY,UAAU,EAAE,CAAC;AACjE,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;ACdO,IAAM,YAAY,cAAc;AAAA,EACrC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,aAAa;AACf,CAAC;AAEM,IAAM,QAAQ,CACnB,eACuD;AACvD,QAAM,aAAa,UAAU,MAAM,EAAE,GAAG,YAAY,UAAU,GAAG,CAAC;AAClE,SAAO;AAAA,IACL,aAAa,mBAAmB,UAAU;AAAA,IAC1C;AAAA,EACF;AACF;;;AClBA,SAAS,UAAAC,eAAmC;AAC5C,SAAS,KAAAC,WAAS;AAIX,IAAM,aAAaC,IAAE,OAAO;AAAA,EACjC,IAAIA,IAAE,OAAO;AAAA,EACb,UAAUA,IAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;AAAA,EAChC,GAAGA,IAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC7B,GAAGA,IAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC7B,IAAIA,IAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC9B,IAAIA,IAAE,OAAO,EAAE,QAAQ,QAAQ;AACjC,CAAC;AAEM,IAAM,SAAS,CACpB,eACuD;AACvD,QAAM,aAAa,WAAW,MAAM,UAAU;AAC9C,QAAM,MAAM,qBAAqB,UAAU;AAC3C,QAAM,oBAAmC;AAAA,IACvC;AAAA,IACAC,QAAO,MAAM,WAAW,CAAC;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AAAA,IACL,aAAa,CAAC,GAAG,KAAK,iBAAmC;AAAA,IACzD;AAAA,EACF;AACF;AAEO,IAAM,qBAAqB,CAAC,eAM7B;AACJ,QAAM,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI;AAEzB,MAAI,OAAO,GAAG;AACZ,WAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACtB,WAAW,OAAO,GAAG;AACnB,WAAO,EAAE,GAAG,GAAG,GAAG,KAAK;AAAA,EACzB,OAAO;AACL,WAAO,EAAE,GAAG,GAAG,GAAG,IAAI;AAAA,EACxB;AACF;AAEO,IAAM,uBAAuB,CAClC,eACG;AACH,QAAM,OAAyB,CAAC;AAEhC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,EAAE,GAAG,EAAE,IAAI,mBAAmB;AAAA,MAClC,UAAU,WAAW;AAAA,MACrB,IAAI,IAAI;AAAA,MACR,GAAG,OAAO,WAAW,WAAW,CAAC;AAAA,MACjC,GAAG,OAAO,WAAW,WAAW,CAAC;AAAA,MACjC,IAAI,OAAO,WAAW,WAAW,EAAE;AAAA,IACrC,CAAC;AACD,SAAK;AAAA,MACH;AAAA,QACE,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,OAAO,WAAW,WAAW,EAAE;AAAA,QAC/B,MAAM,IAAI,OAAO,WAAW,WAAW,EAAE,IAAI;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACxEA,SAAS,KAAAC,WAAS;AAGlB,SAAS,UAAAC,eAAc;AAEhB,IAAM,UAAUC,IAAE,OAAO;AAAA,EAC9B,IAAIA,IAAE,OAAO;AAAA,EACb,UAAUA,IAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;AAAA,EAChC,GAAGA,IAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,EAC9B,GAAGA,IAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,EAC9B,IAAIA,IAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC9B,IAAIA,IAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC9B,aAAaA,IAAE,OAAO,EAAE,QAAQ,QAAQ;AAC1C,CAAC;AAEM,IAAM,SAAS,CACpB,eACuD;AACvD,QAAM,aAAa,QAAQ,MAAM,UAAU;AAC3C,QAAM,oBAAmC;AAAA,IACvC;AAAA,IACAD,QAAO,MAAM,WAAW,CAAC,IAAI,IAAI;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,kBAAkB,UAAU,EAAE;AAAA,MACzC;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,eAAe,CAAC,eAGvB;AACJ,QAAM,EAAE,IAAI,YAAY,IAAI;AAE5B,MAAI,OAAO,GAAG;AACZ,WAAO,EAAE,GAAG,CAAC,cAAc,GAAG,GAAG,EAAE;AAAA,EAErC,OAAO;AACL,WAAO,EAAE,GAAG,cAAc,GAAG,GAAG,EAAE;AAAA,EACpC;AACF;AAEO,IAAM,oBAAoB,CAAC,eAAwC;AACxE,QAAM,OAAyB,CAAC;AAEhC,WAAS,IAAI,GAAG,KAAK,WAAW,UAAU,KAAK;AAC7C,UAAM,EAAE,GAAG,EAAE,IAAI,aAAa;AAAA,MAC5B,IAAI;AAAA,MACJ,aAAa,OAAO,WAAW,WAAW,WAAW;AAAA,IACvD,CAAC;AACD,SAAK;AAAA,MACH;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,WAAW,WAAW,EAAE;AAAA,QAC/B,OAAO,WAAW,WAAW,EAAE;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ACnEA;AAAA,EACE,UAAAE;AAAA,OAIK;AAEP,SAAS,KAAAC,WAAS;AAIX,IAAM,YAAYC,IAAE,OAAO;AAAA,EAChC,IAAIA,IAAE,OAAO;AAAA,EACb,GAAGC,QAAO,SAAS,EAAE,QAAQ,QAAQ;AAAA,EACrC,IAAIA,QAAO,SAAS,EAAE,QAAQ,OAAO;AAAA,EACrC,IAAIA,QAAO,SAAS,EAAE,QAAQ,KAAK;AACrC,CAAC;AAGM,IAAM,QAAQ,CACnB,eACuD;AACvD,QAAM,aAAa,UAAU,MAAM,UAAU;AAE7C,QAAM,EAAE,GAAG,IAAI,GAAG,IAAI;AAEtB,QAAM,eAAe;AAAA,IACnB,WAAW,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,IAC/B,WAAW,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE;AAAA,EAChC;AAEA,QAAM,iBAAoC;AAAA,IACxC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,OAAO;AAAA,MACL,EAAE,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,EAAE;AAAA,MAChC,EAAE,GAAG,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG,EAAE;AAAA,IACjC;AAAA,IACA,cAAc;AAAA,IACd,wBAAwB;AAAA,EAC1B;AACA,QAAM,oBAAmC,cAAc,GAAG,IAAI,GAAG,GAAG;AACpE,SAAO;AAAA,IACL,aAAa;AAAA,MACX,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;;;ACnDA,SAAS,UAAAC,gBAAsC;AAC/C,SAAS,KAAAC,WAAS;;;ACCX,IAAM,iBAAiB,CAC5B,OACA,UAKI,CAAC,MACiB;AACtB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,QAAQ,SAAS;AAAA,IACxB,kBAAkB,QAAQ,oBAAoB;AAAA,IAC9C,wBAAwB,QAAQ,0BAA0B;AAAA,IAC1D;AAAA,IACA,cAAc,QAAQ,gBAAgB;AAAA,EACxC;AACF;;;ADbO,IAAM,iBAAiBC,IAAE,OAAO;AAAA,EACrC,IAAIA,IAAE,QAAQ,YAAY;AAAA,EAC1B,GAAGC,SAAO,QAAQ,GAAG;AAAA,EACrB,GAAGA,SAAO,QAAQ,GAAG;AAAA,EACrB,IAAIA,SAAO,QAAQ,CAAC;AAAA,EACpB,IAAIA,SAAO,QAAQ,GAAG;AACxB,CAAC;AAEM,IAAM,aAAa,CACxB,eAC0D;AAC1D,QAAM,aAAa,eAAe,MAAM,UAAU;AAElD,QAAM,QAAQ,WAAW;AACzB,QAAM,SAAS,WAAW;AAC1B,QAAM,eAAe,WAAW;AAEhC,QAAM,QAA6B;AAAA,IACjC,WAAW,GAAG,CAAC,QAAQ,GAAG,SAAS,GAAG,cAAc,eAAe,GAAG;AAAA,IACtE,WAAW,GAAG,CAAC,QAAQ,GAAG,CAAC,SAAS,GAAG,cAAc,eAAe,GAAG;AAAA,IACvE,WAAW,GAAG,QAAQ,GAAG,CAAC,SAAS,GAAG,cAAc,eAAe,GAAG;AAAA,IACtE,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,eAAe,GAAG;AAAA,EACvE;AAEA,QAAM,kBAAuC;AAAA;AAAA,IAE3C,eAAe;AAAA,MACb,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,SAAS,EAAE;AAAA,MAChC,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,SAAS,EAAE;AAAA,IACjC,CAAC;AAAA,IACD,eAAe;AAAA,MACb,EAAE,GAAG,QAAQ,GAAG,GAAG,CAAC,SAAS,EAAE;AAAA,MAC/B,EAAE,GAAG,QAAQ,GAAG,GAAG,SAAS,EAAE;AAAA,IAChC,CAAC;AAAA;AAAA,IAED,eAAe;AAAA,MACb,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,EAAE;AAAA,MACtB,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,EAAE;AAAA,MACtB,EAAE,GAAK,QAAQ,IAAK,IAAK,KAAK,KAAK,CAAC,GAAG,GAAG,SAAS,EAAE;AAAA,IACvD,CAAC;AAAA,IACD,eAAe;AAAA,MACb,EAAE,GAAG,QAAQ,GAAG,GAAG,EAAE;AAAA,MACrB,EAAE,GAAG,QAAQ,GAAG,GAAG,EAAE;AAAA,IACvB,CAAC;AAAA,EACH;AACA,QAAM,oBAAmC;AAAA,IACvC;AAAA,IACA,SAAS,IAAI;AAAA,IACb;AAAA,EACF;AACA,SAAO;AAAA,IACL,aAAa,CAAC,GAAG,OAAO,GAAG,iBAAiB,iBAAiB;AAAA,IAC7D;AAAA,EACF;AACF;;;AE5DA;AAAA,EACE,UAAAC;AAAA,OAIK;AACP,SAAS,KAAAC,WAAS;AAKX,IAAM,iBAAiBC,IAAE,OAAO;AAAA,EACrC,IAAIA,IAAE,OAAO;AAAA,EACb,GAAGC,SAAO,QAAQ,SAAS;AAAA,EAC3B,GAAGA,SAAO,SAAS;AAAA,EACnB,MAAMA,SAAO,SAAS,EAAE,QAAQ,EAAE;AAAA,EAClC,OAAOA,SAAO,SAAS,EAAE,QAAQ,EAAE;AAAA,EACnC,KAAKA,SAAO,SAAS,EAAE,QAAQ,CAAC;AAAA,EAChC,QAAQA,SAAO,SAAS,EAAE,QAAQ,CAAC;AAAA,EACnC,GAAGA,SAAO,QAAQA,SAAO,MAAM,QAAQ,CAAC;AAAA,EACxC,IAAIA,SAAO,QAAQA,SAAO,MAAM,OAAO,CAAC;AAAA,EACxC,IAAIA,SAAO,QAAQA,SAAO,MAAM,OAAO,CAAC;AAAA,EACxC,WAAWD,IAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACpC,uBAAuBC,SAAO,QAAQA,SAAO,MAAM,QAAQ,CAAC;AAC9D,CAAC;AAID,IAAM,YAAY,CAAC,eAA+B;AAChD,QAAM,SAAS,eAAe,MAAM,UAAU;AAC9C,MAAI,OAAO,QAAQ,OAAO,OAAO;AAC/B,WAAO,KAAK,IAAI,OAAO,MAAM,OAAO,KAAK,IAAI,OAAO;AAAA,EACtD;AACA,MAAI,OAAO,MAAM;AACf,WAAO,OAAO,OAAO,OAAO;AAAA,EAC9B;AACA,MAAI,OAAO,OAAO;AAChB,WAAO,OAAO,QAAQ,OAAO;AAAA,EAC/B;AACA,SAAO;AACT;AACA,IAAM,iBAAiB,CAAC,GAAW,GAAW,SAAiB;AAC7D,MAAI,SAAqC,CAAC;AAC1C,QAAM,iBAAiB;AACvB,QAAM,gBAAgB;AACtB,MAAI,SAAS,SAAS;AACpB,aAAS;AAAA,MACP;AAAA,QACE,GAAG,IAAI,iBAAiB;AAAA,QACxB;AAAA,MACF;AAAA;AAAA,MACA;AAAA,QACE,GAAG,IAAI,iBAAiB;AAAA,QACxB,GAAG,IAAI,gBAAgB;AAAA,MACzB;AAAA;AAAA,MACA;AAAA,QACE,GAAG,IAAI,iBAAiB;AAAA,QACxB,GAAG,IAAI,gBAAgB;AAAA,MACzB;AAAA;AAAA,MACA;AAAA,QACE,GAAG,IAAI,iBAAiB;AAAA,QACxB;AAAA,MACF;AAAA;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,QAAQ;AACnB,aAAS;AAAA,MACP;AAAA,QACE,GAAG,IAAI,iBAAiB;AAAA,QACxB;AAAA,MACF;AAAA;AAAA,MACA;AAAA,QACE,GAAG,IAAI,iBAAiB;AAAA,QACxB,GAAG,IAAI,gBAAgB;AAAA,MACzB;AAAA;AAAA,MACA;AAAA,QACE,GAAG,IAAI,iBAAiB;AAAA,QACxB,GAAG,IAAI,gBAAgB;AAAA,MACzB;AAAA;AAAA,MACA;AAAA,QACE,GAAG,IAAI,iBAAiB;AAAA,QACxB;AAAA,MACF;AAAA;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,OAAO;AAClB,aAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA,GAAG,IAAI,iBAAiB;AAAA,MAC1B;AAAA;AAAA,MACA;AAAA,QACE,GAAG,IAAI,gBAAgB;AAAA,QACvB,GAAG,IAAI,iBAAiB;AAAA,MAC1B;AAAA;AAAA,MACA;AAAA,QACE,GAAG,IAAI,gBAAgB;AAAA,QACvB,GAAG,IAAI,iBAAiB;AAAA,MAC1B;AAAA;AAAA,MACA;AAAA,QACE;AAAA,QACA,GAAG,IAAI,iBAAiB;AAAA,MAC1B;AAAA;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,UAAU;AACrB,aAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA,GAAG,IAAI,iBAAiB;AAAA,MAC1B;AAAA;AAAA,MACA;AAAA,QACE,GAAG,IAAI,gBAAgB;AAAA,QACvB,GAAG,IAAI,iBAAiB;AAAA,MAC1B;AAAA;AAAA,MACA;AAAA,QACE,GAAG,IAAI,gBAAgB;AAAA,QACvB,GAAG,IAAI,iBAAiB;AAAA,MAC1B;AAAA;AAAA,MACA;AAAA,QACE;AAAA,QACA,GAAG,IAAI,iBAAiB;AAAA,MAC1B;AAAA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,aAAa,CACxB,eAC0D;AAC1D,QAAM,SAAS,eAAe,MAAM,UAAU;AAC9C,QAAM,SAAS,OAAO,KAAK,UAAU,MAAM;AAC3C,QAAM,WAAgC,CAAC;AACvC,QAAM,QAAyB,CAAC;AAChC,MAAI,SAAqC,CAAC;AAC1C,QAAM,gBAAgB;AACtB,QAAM,gBAAgB;AACtB,QAAM,kBACJ,OAAO,OAAO,OAAO,SAAS,OAAO,UAAU,MAAM,OAAO,OAAO;AACrE,MAAI,OAAO,OAAO;AAChB,UAAM,OAAO,GAAG,OAAO,QAAQ,KAAK,KAAK,OAAO;AAChD,aAAS,IAAI,GAAG,IAAI,OAAO,OAAO,KAAK;AACrC,UAAI,MAAM,KAAK,CAAC,OAAO,QAAQ,CAAC,OAAO,QAAQ;AAC7C,iBAAS;AAAA,UACP,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,UAC3B,OAAO,IAAI,OAAO;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP;AAAA,UACE,IAAI,IAAI,OAAO,QAAQ,OAAO,UAAU;AAAA,UACxC,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,UAC3B,OAAO,IAAI,OAAO;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AACA,UAAI,OAAO,WAAW;AACpB,cAAM;AAAA,UACJ;AAAA,YACE,IAAI,IAAI,OAAO,QAAQ,OAAO,UAAU,KAAK;AAAA,YAC7C,OAAO,IAAI;AAAA,YACX,OAAO,IAAI,OAAO;AAAA,YAClB;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,cAAM;AAAA,UACJ;AAAA,YACE,IAAI,IAAI,OAAO,QAAQ,OAAO,UAAU,KAAK,kBAAkB;AAAA,YAC/D,OAAO,IAAI,IAAI,OAAO;AAAA,YACtB,OAAO,IAAI,OAAO;AAAA,YAClB;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,MAAM;AACf,UAAM,OAAO,GAAG,OAAO,OAAO,KAAK,KAAK,OAAO;AAC/C,aAAS,IAAI,GAAG,IAAI,OAAO,MAAM,KAAK;AACpC,UAAI,MAAM,OAAO,OAAO,GAAG;AACzB,iBAAS;AAAA,UACP,CAAC,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,UAC5B,OAAO,IAAI,OAAO;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP;AAAA,UACE,IAAI;AAAA,UACJ,CAAC,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,UAC5B,OAAO,IAAI,OAAO;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AACA,UAAI,OAAO,WAAW;AACpB,cAAM;AAAA,UACJ;AAAA,YACE,IAAI,IAAI;AAAA,YACR,CAAC,OAAO,IAAI;AAAA,YACZ,OAAO,IAAI,OAAO;AAAA,YAClB;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,cAAM;AAAA,UACJ;AAAA,YACE,IAAI,IAAI,kBAAkB;AAAA,YAC1B,CAAC,OAAO,IAAI,IAAI,OAAO;AAAA,YACvB,OAAO,IAAI,OAAO;AAAA,YAClB;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,KAAK;AACd,UAAM,OAAO,GAAG,OAAO,MAAM,KAAK,KAAK,OAAO;AAC9C,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK,KAAK;AACnC,UACE,MAAM,OAAO,MAAM,KACnB,CAAC,OAAO,QACR,CAAC,OAAO,UACR,CAAC,OAAO,OACR;AACA,iBAAS;AAAA,UACP,OAAO,IAAI,OAAO;AAAA,UAClB,SAAS,IAAI,OAAO,KAAK;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP;AAAA,UACE,IAAI,IAAI,OAAO,OAAO,OAAO,SAAS,OAAO,UAAU;AAAA,UACvD,OAAO,IAAI,OAAO;AAAA,UAClB,SAAS,IAAI,OAAO,KAAK;AAAA,UACzB,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AACA,UAAI,OAAO,WAAW;AACpB,cAAM;AAAA,UACJ;AAAA,YACE,IACE,IACA,OAAO,OACP,OAAO,SACN,OAAO,UAAU,KAClB;AAAA,YACF,OAAO,IAAI,OAAO;AAAA,YAClB,SAAS;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,cAAM;AAAA,UACJ;AAAA,YACE,IACE,IACA,OAAO,OACP,OAAO,SACN,OAAO,UAAU,KAClB,kBAAkB;AAAA,YACpB,OAAO,IAAI,OAAO;AAAA,YAClB,SAAS,IAAI,OAAO;AAAA,YACpB;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,QAAQ;AACjB,UAAM,OAAO,GAAG,OAAO,SAAS,KAAK,KAAK,OAAO;AACjD,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,MAAM,KAAK,CAAC,OAAO,MAAM;AAC3B,iBAAS;AAAA,UACP,OAAO,IAAI,OAAO;AAAA,UAClB,CAAC,SAAS,IAAI,OAAO,KAAK;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP;AAAA,UACE,IAAI,IAAI,OAAO;AAAA,UACf,OAAO,IAAI,OAAO;AAAA,UAClB,CAAC,SAAS,IAAI,OAAO,KAAK;AAAA,UAC1B,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AACA,UAAI,OAAO,WAAW;AACpB,cAAM;AAAA,UACJ;AAAA,YACE,IAAI,IAAI,OAAO,OAAO;AAAA,YACtB,OAAO,IAAI,OAAO;AAAA,YAClB,CAAC,SAAS;AAAA,YACV;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,cAAM;AAAA,UACJ;AAAA,YACE,IAAI,IAAI,OAAO,OAAO,kBAAkB;AAAA,YACxC,OAAO,IAAI,OAAO;AAAA,YAClB,CAAC,SAAS,IAAI,OAAO;AAAA,YACrB;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,OAAO;AAAA,IACP,cAAc;AAAA,IACd,OAAO;AAAA,EACT;AAEA,QAAM,iBAAoC;AAAA,IACxC,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,OAAO;AAAA,MACL,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,GAAG,SAAS,EAAE;AAAA,MAClC,EAAE,GAAG,OAAO,IAAI,GAAG,GAAG,SAAS,EAAE;AAAA,MACjC,EAAE,GAAG,OAAO,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE;AAAA,MAClC,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE;AAAA,MACnC,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,GAAG,SAAS,EAAE;AAAA,IACpC;AAAA,IACA,cAAc;AAAA,IACd,OAAO;AAAA,EACT;AACA,QAAM,oBAAmC;AAAA,IACvC;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACA,SAAO;AAAA,IACL,aAAa;AAAA,MACX,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA,EACd;AACF;;;ACtWA;AAAA,EACE,UAAAC;AAAA,OAIK;AACP,SAAS,KAAAC,WAAS;AAKX,IAAM,oBAAoBC,IAAE,OAAO;AAAA,EACxC,IAAIA,IAAE,OAAO;AAAA,EACb,GAAGC,SAAO,QAAQ,SAAS;AAAA,EAC3B,GAAGA,SAAO,SAAS;AAAA,EACnB,MAAMA,SAAO,SAAS,EAAE,QAAQ,EAAE;AAAA,EAClC,OAAOA,SAAO,SAAS,EAAE,QAAQ,EAAE;AAAA,EACnC,KAAKA,SAAO,SAAS,EAAE,QAAQ,CAAC;AAAA,EAChC,QAAQA,SAAO,SAAS,EAAE,QAAQ,CAAC;AAAA,EACnC,GAAGA,SAAO,QAAQA,SAAO,MAAM,QAAQ,CAAC;AAAA,EACxC,IAAIA,SAAO,QAAQA,SAAO,MAAM,OAAO,CAAC;AAAA,EACxC,IAAIA,SAAO,QAAQA,SAAO,MAAM,OAAO,CAAC;AAAA,EACxC,WAAWD,IAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACpC,uBAAuBC,SAAO,QAAQA,SAAO,MAAM,QAAQ,CAAC;AAC9D,CAAC;AAID,IAAMC,aAAY,CAAC,eAA0C;AAC3D,QAAM,SAAS,kBAAkB,MAAM,UAAU;AAGjD,MAAI,OAAO,QAAQ,OAAO,OAAO;AAC/B,WAAO,KAAK,IAAI,OAAO,MAAM,OAAO,KAAK,IAAI,OAAO;AAAA,EACtD;AAEA,MAAI,OAAO,MAAM;AACf,WAAO,OAAO,OAAO,OAAO;AAAA,EAC9B;AAEA,MAAI,OAAO,OAAO;AAChB,WAAO,OAAO,QAAQ,OAAO;AAAA,EAC/B;AAGA,SAAO;AACT;AAIA,IAAMC,kBAAiB,CACrB,GACA,GACA,MACA,iBAAiB,GACjB,gBAAgB,QACJ;AACZ,QAAM,aAAa,iBAAiB;AACpC,QAAM,YAAY,gBAAgB;AAElC,QAAM,SAAqC;AAAA,IACzC,MAAM;AAAA,MACJ,EAAE,GAAG,IAAI,YAAY,EAAE;AAAA;AAAA,MACvB,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,UAAU;AAAA;AAAA,MACtC,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,UAAU;AAAA;AAAA,MACtC,EAAE,GAAG,IAAI,YAAY,EAAE;AAAA;AAAA,IACzB;AAAA,IACA,OAAO;AAAA,MACL,EAAE,GAAG,IAAI,YAAY,EAAE;AAAA;AAAA,MACvB,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,UAAU;AAAA;AAAA,MACtC,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,UAAU;AAAA;AAAA,MACtC,EAAE,GAAG,IAAI,YAAY,EAAE;AAAA;AAAA,IACzB;AAAA,IACA,KAAK;AAAA,MACH,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA;AAAA,MACvB,EAAE,GAAG,IAAI,WAAW,GAAG,IAAI,WAAW;AAAA;AAAA,MACtC,EAAE,GAAG,IAAI,WAAW,GAAG,IAAI,WAAW;AAAA;AAAA,MACtC,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA;AAAA,IACzB;AAAA,IACA,QAAQ;AAAA,MACN,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA;AAAA,MACvB,EAAE,GAAG,IAAI,WAAW,GAAG,IAAI,WAAW;AAAA;AAAA,MACtC,EAAE,GAAG,IAAI,WAAW,GAAG,IAAI,WAAW;AAAA;AAAA,MACtC,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,OAAO,IAAI;AACpB;AACO,IAAM,gBAAgB,CAC3B,eAC0D;AAC1D,QAAM,SAAS,kBAAkB,MAAM,UAAU;AACjD,QAAM,SAAS,OAAO,KAAKD,WAAU,MAAM;AAC3C,QAAM,WAAgC,CAAC;AACvC,QAAM,QAAyB,CAAC;AAChC,QAAM,gBAAgB;AACtB,QAAM,gBAAgB;AACtB,QAAM,kBACJ,OAAO,OAAO,OAAO,SAAS,OAAO,UAAU,MAAM,OAAO,OAAO;AACrE,MAAI,SAAqC,CAAC;AAC1C,MAAI,OAAO,OAAO;AAChB,UAAM,OAAO,GAAG,OAAO,QAAQ,KAAK,KAAK,OAAO;AAChD,aAAS,IAAI,GAAG,IAAI,OAAO,OAAO,KAAK;AACrC,UAAI,MAAM,KAAK,CAAC,OAAO,QAAQ,CAAC,OAAO,QAAQ;AAC7C,iBAASC;AAAA,UACP,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,UAC3B,OAAO,IAAI,OAAO;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP;AAAA,UACE,IAAI,IAAI,OAAO,QAAQ,OAAO,UAAU;AAAA,UACxC,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,UAC3B,OAAO,IAAI,OAAO;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,aACL,MAAM;AAAA,QACJ;AAAA,UACE,IAAI,IAAI,OAAO,QAAQ,OAAO,UAAU,KAAK;AAAA,UAC7C,OAAO,IAAI,IAAI,OAAO;AAAA,UACtB,OAAO,IAAI,OAAO;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AACA,MAAI,OAAO,MAAM;AACf,UAAM,OAAO,GAAG,OAAO,OAAO,KAAK,KAAK,OAAO;AAC/C,aAAS,IAAI,GAAG,IAAI,OAAO,MAAM,KAAK;AACpC,UAAI,MAAM,OAAO,OAAO,GAAG;AACzB,iBAASA;AAAA,UACP,CAAC,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,UAC5B,OAAO,IAAI,OAAO;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP;AAAA,UACE,IAAI;AAAA,UACJ,CAAC,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,UAC5B,OAAO,IAAI,OAAO;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,aACL,MAAM;AAAA,QACJ;AAAA,UACE,IAAI,IAAI;AAAA,UACR,CAAC,OAAO,IAAI,IAAI,OAAO;AAAA,UACvB,OAAO,IAAI,OAAO;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AACA,MAAI,OAAO,KAAK;AACd,UAAM,OAAO,GAAG,OAAO,MAAM,KAAK,KAAK,OAAO;AAC9C,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK,KAAK;AACnC,UACE,MAAM,OAAO,MAAM,KACnB,CAAC,OAAO,QACR,CAAC,OAAO,UACR,CAAC,OAAO,OACR;AACA,iBAASA;AAAA,UACP,OAAO,IAAI,OAAO;AAAA,UAClB,SAAS,IAAI,OAAO,KAAK;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP;AAAA,UACE,IAAI,IAAI,OAAO,SAAS,OAAO,UAAU,KAAK,OAAO;AAAA,UACrD,OAAO,IAAI,OAAO;AAAA,UAClB,SAAS,IAAI,OAAO,KAAK;AAAA,UACzB,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,aACL,MAAM;AAAA,QACJ;AAAA,UACE,IACE,IACA,OAAO,SACN,OAAO,UAAU,KAClB,OAAO,OACP;AAAA,UACF,OAAO,IAAI,OAAO;AAAA,UAClB,SAAS,IAAI,OAAO;AAAA,UACpB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AACA,MAAI,OAAO,QAAQ;AACjB,UAAM,OAAO,GAAG,OAAO,SAAS,KAAK,KAAK,OAAO;AACjD,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,MAAM,KAAK,CAAC,OAAO,MAAM;AAC3B,iBAASA;AAAA,UACP,OAAO,IAAI,OAAO;AAAA,UAClB,CAAC,SAAS,IAAI,OAAO,KAAK;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP;AAAA,UACE,IAAI,IAAI,OAAO;AAAA,UACf,OAAO,IAAI,OAAO;AAAA,UAClB,CAAC,SAAS,IAAI,OAAO,KAAK;AAAA,UAC1B,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,aACL,MAAM;AAAA,QACJ;AAAA,UACE,IAAI,IAAI,OAAO,OAAO;AAAA,UACtB,OAAO,IAAI,OAAO;AAAA,UAClB,CAAC,SAAS,IAAI,OAAO;AAAA,UACrB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,qBAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,OAAO;AAAA,IACP,OAAO;AAAA,IACP,cAAc;AAAA,EAChB;AAEA,QAAM,iBAAoC;AAAA,IACxC,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,OAAO;AAAA,MACL;AAAA,QACE,GAAG,CAAC,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAC/B,GAAG,SAAS,IAAI,OAAO,KAAK;AAAA,MAC9B;AAAA,MACA;AAAA,QACE,GAAG,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAC9B,GAAG,SAAS,IAAI,OAAO,KAAK;AAAA,MAC9B;AAAA,MACA;AAAA,QACE,GAAG,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAC9B,GAAG,CAAC,SAAS,IAAI,OAAO,KAAK;AAAA,MAC/B;AAAA,MACA;AAAA,QACE,GAAG,CAAC,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAC/B,GAAG,CAAC,SAAS,IAAI,OAAO,KAAK;AAAA,MAC/B;AAAA,MACA;AAAA,QACE,GAAG,CAAC,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAC/B,GAAG,SAAS,IAAI,OAAO,KAAK;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,cAAc;AAAA,IACd,OAAO;AAAA,EACT;AACA,QAAM,oBAAmC;AAAA,IACvC;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACA,SAAO;AAAA,IACL,aAAa;AAAA,MACX,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA,EACd;AACF;;;AC3RO,IAAM,OAAO,CAClB,eAC0D;AAC1D,aAAW,cAAc;AACzB,SAAO,KAAK,UAAU;AACxB;;;ACVA,SAAS,KAAAC,WAAS;AAIX,IAAM,aAAaC,IAAE,OAAO;AAAA,EACjC,IAAIA,IAAE,OAAO;AAAA,EACb,UAAUA,IAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;AAAA,EAChC,GAAGA,IAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC7B,IAAIA,IAAE,OAAO,EAAE,QAAQ,KAAK;AAAA,EAC5B,IAAIA,IAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC9B,GAAGA,IAAE,OAAO,EAAE,QAAQ,QAAQ;AAChC,CAAC;AAEM,IAAM,SAAS,CACpB,eAC0D;AAC1D,QAAM,aAAa,WAAW,MAAM,UAAU;AAC9C,SAAO;AAAA,IACL,aAAa,sBAAsB,UAAU;AAAA,IAC7C;AAAA,EACF;AACF;AAEO,IAAM,qBAAqB,CAAC,eAI7B;AACJ,QAAM,EAAE,GAAG,GAAG,GAAG,IAAI;AACrB,MAAI,OAAO,GAAG;AACZ,WAAO,EAAE,GAAG,CAAC,IAAI,IAAI,KAAK,GAAG,EAAE;AAAA,EACjC;AACA,MAAI,OAAO,GAAG;AACZ,WAAO,EAAE,GAAG,CAAC,IAAI,IAAI,KAAK,GAAG,EAAE;AAAA,EACjC;AACA,MAAI,OAAO,GAAG;AACZ,WAAO,EAAE,GAAG,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE;AAAA,EAClC;AACA,MAAI,OAAO,GAAG;AACZ,WAAO,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE;AAAA,EACjC;AACA,MAAI,OAAO,GAAG;AACZ,WAAO,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE;AAAA,EAChC;AACA,QAAM,IAAI,MAAM,oBAAoB;AACtC;AAEO,IAAM,wBAAwB,CACnC,eACG;AACH,QAAM,OAA4B,CAAC;AACnC,WAAS,IAAI,GAAG,KAAK,WAAW,UAAU,KAAK;AAC7C,UAAM,EAAE,GAAG,EAAE,IAAI,mBAAmB;AAAA,MAClC,GAAG,OAAO,WAAW,WAAW,CAAC;AAAA,MACjC,GAAG,OAAO,WAAW,WAAW,CAAC;AAAA,MACjC,IAAI;AAAA,IACN,CAAC;AACD,SAAK;AAAA,MACH;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,WAAW,WAAW,EAAE;AAAA,QAC/B,OAAO,WAAW,WAAW,EAAE;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SACF,WAAW,WAAW,KAAK,IAAK,OAAO,WAAW,WAAW,CAAC;AAClE,QAAM,SAAS,OAAO,WAAW,WAAW,CAAC;AAC7C,QAAM,kBAAqC;AAAA,IACzC,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,OAAO;AAAA,MACL,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,SAAS,IAAI,OAAO,WAAW,WAAW,CAAC,IAAI,IAAI;AAAA,MACvE,EAAE,GAAG,QAAQ,GAAG,GAAG,SAAS,IAAI,OAAO,WAAW,WAAW,CAAC,IAAI,IAAI;AAAA,IACxE;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AACA,QAAM,kBAAqC;AAAA,IACzC,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,OAAO;AAAA,MACL,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,SAAS,IAAI,OAAO,WAAW,WAAW,CAAC,IAAI,IAAI;AAAA,MACxE,EAAE,GAAG,QAAQ,GAAG,GAAG,CAAC,SAAS,IAAI,OAAO,WAAW,WAAW,CAAC,IAAI,IAAI;AAAA,IACzE;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,EAChB;AACA,QAAM,oBAAmC,cAAc,GAAG,SAAS,KAAK,GAAG;AAC3E,QAAM,eAAe,mBAAmB;AAAA,IACtC,GAAG,OAAO,WAAW,WAAW,CAAC;AAAA,IACjC,GAAG,OAAO,WAAW,WAAW,CAAC;AAAA,IACjC,IAAI;AAAA,EACN,CAAC;AACD,eAAa,IAAI,aAAa,IAAI,OAAO,WAAW,WAAW,EAAE,IAAI;AACrE,QAAM,iBAAiB;AACvB,QAAM,gBAAgB;AACtB,QAAM,gBAAmC;AAAA,IACvC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,OAAO;AAAA,MACL;AAAA,QACE,GAAG,aAAa,IAAI,iBAAiB;AAAA,QACrC,GAAG,aAAa;AAAA,MAClB;AAAA;AAAA,MACA;AAAA,QACE,GAAG,aAAa,IAAI,iBAAiB;AAAA,QACrC,GAAG,aAAa,IAAI,gBAAgB;AAAA,MACtC;AAAA;AAAA,MACA;AAAA,QACE,GAAG,aAAa,IAAI,iBAAiB;AAAA,QACrC,GAAG,aAAa,IAAI,gBAAgB;AAAA,MACtC;AAAA;AAAA,MACA;AAAA,QACE,GAAG,aAAa,IAAI,iBAAiB;AAAA,QACrC,GAAG,aAAa;AAAA,MAClB;AAAA;AAAA,IACF;AAAA,IACA,cAAc;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACxIA;AAAA,EACE,UAAAC;AAAA,OAIK;AACP,SAAS,KAAAC,WAAS;AAKX,IAAM,sBAAsBC,IAAE,OAAO;AAAA,EAC1C,IAAIA,IAAE,OAAO;AAAA,EACb,GAAGC,SAAO,QAAQ,MAAM;AAAA,EACxB,GAAGA,SAAO,SAAS;AAAA,EACnB,MAAMA,SAAO,SAAS,EAAE,QAAQ,EAAE;AAAA,EAClC,OAAOA,SAAO,SAAS,EAAE,QAAQ,EAAE;AAAA,EACnC,KAAKA,SAAO,SAAS,EAAE,QAAQ,CAAC;AAAA,EAChC,QAAQA,SAAO,SAAS,EAAE,QAAQ,CAAC;AAAA,EACnC,GAAGA,SAAO,QAAQA,SAAO,MAAM,QAAQ,CAAC;AAAA,EACxC,IAAIA,SAAO,SAAS,EAAE,QAAQA,SAAO,MAAM,KAAK,CAAC;AAAA,EACjD,IAAIA,SAAO,SAAS,EAAE,QAAQA,SAAO,MAAM,OAAO,CAAC;AACrD,CAAC;AAID,IAAMC,aAAY,CAAC,eAA4C;AAC7D,QAAM,SAAS,oBAAoB,MAAM,UAAU;AAGnD,MAAI,OAAO,QAAQ,OAAO,OAAO;AAC/B,WAAO,KAAK,IAAI,OAAO,MAAM,OAAO,KAAK,IAAI,OAAO;AAAA,EACtD;AAEA,MAAI,OAAO,MAAM;AACf,WAAO,OAAO,OAAO,OAAO;AAAA,EAC9B;AAEA,MAAI,OAAO,OAAO;AAChB,WAAO,OAAO,QAAQ,OAAO;AAAA,EAC/B;AAEA,SAAO;AACT;AAKA,IAAM,kBAAkB,CACtB,GACA,GACA,MACA,iBAAiB,GACjB,gBAAgB,QACJ;AACZ,QAAM,aAAa,iBAAiB;AACpC,QAAM,YAAY,gBAAgB;AAElC,QAAM,2BAAuD;AAAA,IAC3D,MAAM;AAAA,MACJ,EAAE,GAAG,IAAI,YAAY,EAAE;AAAA,MACvB,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,UAAU;AAAA,MACtC,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,UAAU;AAAA,MACtC,EAAE,GAAG,IAAI,YAAY,EAAE;AAAA,IACzB;AAAA,IACA,OAAO;AAAA,MACL,EAAE,GAAG,IAAI,YAAY,EAAE;AAAA,MACvB,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,UAAU;AAAA,MACtC,EAAE,GAAG,IAAI,YAAY,GAAG,IAAI,UAAU;AAAA,MACtC,EAAE,GAAG,IAAI,YAAY,EAAE;AAAA,IACzB;AAAA,IACA,KAAK;AAAA,MACH,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA,MACvB,EAAE,GAAG,IAAI,WAAW,GAAG,IAAI,WAAW;AAAA,MACtC,EAAE,GAAG,IAAI,WAAW,GAAG,IAAI,WAAW;AAAA,MACtC,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA,IACzB;AAAA,IACA,QAAQ;AAAA,MACN,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA,MACvB,EAAE,GAAG,IAAI,WAAW,GAAG,IAAI,WAAW;AAAA,MACtC,EAAE,GAAG,IAAI,WAAW,GAAG,IAAI,WAAW;AAAA,MACtC,EAAE,GAAG,GAAG,IAAI,WAAW;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,yBAAyB,IAAI;AACtC;AACO,IAAM,kBAAkB,CAC7B,eAC0D;AAC1D,QAAM,SAAS,oBAAoB,MAAM,UAAU;AACnD,QAAM,SAAS,OAAO,KAAKA,WAAU,MAAM;AAC3C,QAAM,QAAyB,CAAC;AAChC,QAAM,gBAAgB,OAAO;AAC7B,QAAM,gBAAgB,OAAO;AAC7B,MAAI,2BAAuD,CAAC;AAC5D,MAAI,OAAO,OAAO;AAChB,UAAM,OAAO,GAAG,OAAO,QAAQ,KAAK,KAAK,OAAO;AAChD,aAAS,IAAI,GAAG,IAAI,OAAO,OAAO,KAAK;AACrC,UAAI,MAAM,KAAK,CAAC,OAAO,QAAQ,CAAC,OAAO,QAAQ;AAC7C,mCAA2B;AAAA,UACzB,OAAO,IAAI,IAAI,gBAAgB;AAAA,UAC/B,OAAO,IAAI,OAAO;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AACA,YAAM;AAAA,QACJ;AAAA,UACE,IAAI,IAAI,OAAO,QAAQ,OAAO,UAAU;AAAA,UACxC,OAAO,IAAI;AAAA,UACX,OAAO,IAAI,OAAO;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,MAAM;AACf,UAAM,OAAO,GAAG,OAAO,OAAO,KAAK,KAAK,OAAO;AAC/C,aAAS,IAAI,GAAG,IAAI,OAAO,MAAM,KAAK;AACpC,UAAI,MAAM,OAAO,OAAO,GAAG;AACzB,mCAA2B;AAAA,UACzB,CAAC,OAAO,IAAI,IAAI,gBAAgB;AAAA,UAChC,OAAO,IAAI,OAAO;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AACA,YAAM;AAAA,QACJ;AAAA,UACE,IAAI;AAAA,UACJ,CAAC,OAAO,IAAI;AAAA,UACZ,OAAO,IAAI,OAAO;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,KAAK;AACd,UAAM,OAAO,GAAG,OAAO,MAAM,KAAK,KAAK,OAAO;AAC9C,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK,KAAK;AACnC,UACE,MAAM,OAAO,MAAM,KACnB,CAAC,OAAO,QACR,CAAC,OAAO,UACR,CAAC,OAAO,OACR;AACA,mCAA2B;AAAA,UACzB,OAAO,IAAI,OAAO;AAAA,UAClB,SAAS,IAAI,gBAAgB;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,YAAM;AAAA,QACJ;AAAA,UACE,IAAI,IAAI,OAAO,SAAS,OAAO,UAAU,KAAK,OAAO;AAAA,UACrD,OAAO,IAAI,OAAO;AAAA,UAClB,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,QAAQ;AACjB,UAAM,OAAO,GAAG,OAAO,SAAS,KAAK,KAAK,OAAO;AACjD,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,MAAM,KAAK,CAAC,OAAO,MAAM;AAC3B,mCAA2B;AAAA,UACzB,OAAO,IAAI,OAAO;AAAA,UAClB,CAAC,SAAS,IAAI,gBAAgB;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AACA,YAAM;AAAA,QACJ;AAAA,UACE,IAAI,IAAI,OAAO;AAAA,UACf,OAAO,IAAI,OAAO;AAAA,UAClB,CAAC,SAAS;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBAAwC;AAAA,IAC5C,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,OAAO;AAAA,IACP,OAAO;AAAA,IACP,cAAc;AAAA,EAChB;AAEA,QAAM,iBAAoC;AAAA,IACxC,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,OAAO;AAAA,MACL;AAAA,QACE,GAAG,CAAC,OAAO,IAAI,IAAI;AAAA,QACnB,GAAG,SAAS,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,QACE,GAAG,OAAO,IAAI,IAAI;AAAA,QAClB,GAAG,SAAS,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,QACE,GAAG,OAAO,IAAI,IAAI;AAAA,QAClB,GAAG,CAAC,SAAS,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,QACE,GAAG,CAAC,OAAO,IAAI,IAAI;AAAA,QACnB,GAAG,CAAC,SAAS,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,QACE,GAAG,CAAC,OAAO,IAAI,IAAI;AAAA,QACnB,GAAG,SAAS,IAAI;AAAA,MAClB;AAAA,IACF;AAAA,IACA,cAAc;AAAA,IACd,OAAO;AAAA,EACT;AACA,QAAM,oBAAmC;AAAA,IACvC;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACA,SAAO;AAAA,IACL,aAAa;AAAA,MACX,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY;AAAA,EACd;AACF;;;AC9OO,SAAS,UAAa,OAA6B;AACxD,SAAO,UAAU;AACnB;;;AC6FO,IAAM,SAAS,CAAC,QAA6B;AAClD,MAAIC,MAAK,YAAY;AAGrB,OAAK,IAAI,WAAW,KAAK,IAAI,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC5D,UAAM,MAAM,GAAG;AAEjB,QAAM,YAAY,IACf,MAAM,GAAG,EACT,IAAI,CAAC,MAAM;AACV,UAAM,IAAI,EAAE,MAAM,2BAA2B;AAC7C,UAAM,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC;AACzB,QAAI,GAAG,SAAS,GAAG;AAAG,aAAO;AAC7B,WAAO,EAAE,IAAI,IAAI,CAAC,GAAI,GAAG,IAAI,CAAC,EAAG;AAAA,EACnC,CAAC,EACA,OAAO,SAAS;AAEnB,aAAW,EAAE,IAAI,EAAE,KAAK,WAAW;AACjC,IAAAA,MAAKA,IAAG,EAAE,EAAE,CAAC;AAAA,EACf;AAEA,EAAAA,IAAG,UAAU,GAAG;AAEhB,SAAOA;AACT;AAEO,IAAM,oBAAoB,MAAgB;AAC/C,SAAO,OAAO,KAAK,UAAY;AACjC;AAEO,IAAM,cAAc,MAItB;AACH,QAAM,QAAQ,IAAI;AAAA,IAChB,CAAC;AAAA,IACD;AAAA,MACE,KAAK,CAAC,QAAa,SAAiB;AAElC,YAAI,SAAS,UAAU,SAAS,eAAe;AAC7C,cAAI,QAAQ,UAAU,WAAa,OAAO,EAAE,GAAG;AAC7C,mBAAO,MAAM,WAAa,OAAO,EAAE,EAAE,MAAM,EAAE;AAAA,UAC/C;AAEA,cAAI,CAAC,WAAa,OAAO,EAAE,GAAG;AAC5B,kBAAM,IAAI;AAAA,cACR,oCAAoC,OAAO,EAAE,IAC3C,OAAO,SAAS,kBAAkB,OAAO,MAAM,MAAM,EACvD;AAAA,YACF;AAAA,UACF;AAEA,iBAAO,MAAM;AAEX,kBAAM,IAAI;AAAA,cACR,oFAAoF,IAAI;AAAA,YAC1F;AAAA,UACF;AAAA,QACF;AACA,YAAI,SAAS,QAAQ;AACnB,cAAI,CAAC,WAAa,OAAO,EAAE,GAAG;AAC5B,kBAAM,IAAI;AAAA,cACR,oCAAoC,OAAO,EAAE,IAC3C,OAAO,SAAS,kBAAkB,OAAO,MAAM,MAAM,EACvD;AAAA,YACF;AAAA,UACF;AACA,iBAAO,MAAM,WAAa,OAAO,EAAE,EAAE,MAAM,EAAE;AAAA,QAC/C;AACA,YAAI,SAAS,qBAAqB;AAChC,iBAAO,MAAM,OAAO,KAAK,UAAY;AAAA,QACvC;AACA,YAAI,SAAS,UAAU;AAErB,iBAAO,MAAM;AAAA,QACf;AACA,YAAI,SAAS,aAAa;AACxB,iBAAO,CAAC,MAAc;AACpB,mBAAO,SAAS;AAChB,mBAAO;AAAA,UACT;AAAA,QACF;AACA,eAAO,CAAC,MAAW;AACjB,cAAI,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AACpC,gBAAI,GAAG,IAAI,GAAG,CAAC,MAAM,YAAc;AACjC,qBAAO,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI;AACxB,qBAAO,KAAK,GAAG,IAAI,GAAG,CAAC;AAAA,YACzB,OAAO;AACL,qBAAO,IAAI,IAAI;AACf,qBAAO,KAAK;AACZ,kBAAI,SAAS,SAAS,SAAS,OAAO;AACpC,oBAAI,GAAG;AACL,yBAAO,WAAW;AAAA,gBACpB;AAAA,cACF,OAAO;AACL,uBAAO,WAAW,OAAO,MAAM,OAAO,WAAW,CAAC,CAAC,IAC/C,SACA,OAAO,WAAW,CAAC;AAAA,cACzB;AAAA,YACF;AAAA,UACF,OAAO;AAEL,gBAAI,CAAC,KAAK,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,IAAc,GAAG;AAAA,YAEpD,OAAO;AACL,qBAAO,IAAI,IAAI,KAAK;AAAA,YACtB;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AACA,YAAY,SAAS;AACrB,YAAY,oBAAoB;AAEzB,IAAM,KAAK;","names":["mm","z","length","z","length","mm","z","length","distance","z","z","z","distance","length","z","length","z","length","z","length","z","z","length","z","z","z","length","z","length","length","z","z","length","z","length","z","length","z","z","length","length","z","z","length","length","z","z","length","length","z","z","length","getHeight","getTriangleDir","z","z","length","z","z","length","getHeight","fp"]}
1
+ {"version":3,"sources":["../src/fn/index.ts","../src/helpers/u-curve.ts","../src/helpers/platedhole.ts","../src/fn/dip.ts","../src/helpers/silkscreenRef.ts","../src/helpers/rectpad.ts","../src/helpers/passive-fn.ts","../src/fn/diode.ts","../src/fn/cap.ts","../src/fn/led.ts","../src/fn/res.ts","../src/helpers/zod/ALPHABET.ts","../src/fn/bga.ts","../src/helpers/zod/dim-2d.ts","../src/helpers/zod/function-call.ts","../src/fn/soic.ts","../src/fn/quad.ts","../src/helpers/zod/pin-order-specifier.ts","../src/helpers/get-quad-pin-map.ts","../src/fn/qfn.ts","../src/fn/qfp.ts","../src/fn/mlp.ts","../src/fn/ssop.ts","../src/fn/tssop.ts","../src/fn/sot236.ts","../src/fn/sot363.ts","../src/fn/sot23.ts","../src/fn/dfn.ts","../src/helpers/corner.ts","../src/fn/pinrow.ts","../src/fn/sot563.ts","../src/fn/ms012.ts","../src/fn/ms013.ts","../src/fn/sot723.ts","../src/fn/sod123.ts","../src/fn/axial.ts","../src/fn/pushbutton.ts","../src/helpers/silkscreenpath.ts","../src/fn/stampboard.ts","../src/fn/stampreceiver.ts","../src/fn/lqfp.ts","../src/fn/sot235.ts","../src/fn/breakoutheaders.ts","../src/helpers/is-not-null.ts","../src/footprinter.ts"],"sourcesContent":["export { dip } from \"./dip\"\nexport { diode } from \"./diode\"\nexport { cap } from \"./cap\"\nexport { led } from \"./led\"\nexport { res } from \"./res\"\nexport { bga } from \"./bga\"\nexport { soic } from \"./soic\"\nexport { quad } from \"./quad\"\nexport { qfn } from \"./qfn\"\nexport { qfp } from \"./qfp\"\nexport { mlp } from \"./mlp\"\nexport { ssop } from \"./ssop\"\nexport { tssop } from \"./tssop\"\nexport { sot236 } from \"./sot236\"\nexport { sot363 } from \"./sot363\"\nexport { sot23 } from \"./sot23\"\nexport { dfn } from \"./dfn\"\nexport { pinrow } from \"./pinrow\"\nexport { sot563 } from \"./sot563\"\nexport { ms012 } from \"./ms012\"\nexport { ms013 } from \"./ms013\"\nexport { sot723 } from \"./sot723\"\nexport { sod123 } from \"./sod123\"\nexport { axial } from \"./axial\"\nexport { pushbutton } from \"./pushbutton\"\nexport { stampboard } from \"./stampboard\"\nexport { stampreceiver } from \"./stampreceiver\"\nexport { lqfp } from \"./lqfp\"\nexport { sot235 } from \"./sot235\"\nexport { breakoutheaders } from \"./breakoutheaders\"\n","export const u_curve = Array.from({ length: 9 }, (_, i) =>\n Math.cos((i / 8) * Math.PI - Math.PI),\n).map((x) => ({\n x,\n y: -Math.sqrt(1 - x ** 2),\n}))\n","import type { PcbPlatedHole } from \"circuit-json\"\nimport { mm } from \"@tscircuit/mm\"\n\nexport const platedhole = (\n pn: number,\n x: number,\n y: number,\n id: number | string,\n od: number | string,\n): PcbPlatedHole => {\n return {\n type: \"pcb_plated_hole\",\n shape: \"circle\",\n x,\n y,\n hole_diameter: mm(id),\n outer_diameter: mm(od),\n pcb_port_id: \"\",\n layers: [\"top\", \"bottom\"],\n port_hints: [pn.toString()],\n }\n}\n","import type {\n AnyCircuitElement,\n PcbFabricationNoteText,\n PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const extendDipDef = (newDefaults: { w?: string; p?: string }) =>\n z\n .object({\n fn: z.string(),\n num_pins: z.number().optional().default(6),\n wide: z.boolean().optional(),\n narrow: z.boolean().optional(),\n w: length.optional(),\n p: length.default(length.parse(newDefaults.p ?? \"2.54mm\")),\n id: length.optional(),\n od: length.optional(),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.id && !v.od) {\n v.id = length.parse(\"1.0mm\")\n v.od = length.parse(\"1.5mm\")\n } else if (!v.id) {\n v.id = v.od! * (1.0 / 1.5)\n } else if (!v.od) {\n v.od = v.id! * (1.5 / 1.0)\n }\n\n // Default width (TODO high pin counts should probably be wide?)\n if (!v.w) {\n if (v.wide) {\n v.w = length.parse(\"600mil\")\n } else if (v.narrow) {\n v.w = length.parse(\"300mil\")\n } else {\n v.w = length.parse(newDefaults.w ?? \"300mil\")\n }\n }\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"id\" | \"od\">\n })\n\nexport const dip_def = extendDipDef({})\n\nexport const getCcwDipCoords = (\n pinCount: number,\n pn: number,\n w: number,\n p: number,\n) => {\n /** pin height */\n const ph = pinCount / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a DIP package.\n */\nexport const dip = (raw_params: {\n dip: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = dip_def.parse(raw_params)\n const platedHoles: AnyCircuitElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwDipCoords(\n parameters.num_pins,\n i + 1,\n parameters.w,\n parameters.p ?? 2.54,\n )\n platedHoles.push(\n platedhole(i + 1, x, y, parameters.id ?? \"0.8mm\", parameters.od ?? \"1mm\"),\n )\n }\n /** silkscreen width */\n const sw = parameters.w - parameters.od - 0.4\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.od + 0.4\n const silkscreenBorder: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n }\n const silkscreenPins: PcbFabricationNoteText[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const isLeft = i < parameters.num_pins / 2\n const pinLabelX = isLeft\n ? -parameters.w / 2 - parameters.p / 2 - 0.2\n : parameters.p / 2 + parameters.w / 2 + 0.2\n const pinLabelY = isLeft\n ? (-sh + 1.6) / 2 + i * parameters.p\n : (-sh + 1.6) / 2 + (i - parameters.num_pins / 2) * parameters.p\n const silkscreenPin = {\n type: \"pcb_fabrication_note_text\",\n layer: \"top\",\n pcb_component_id: `pin_${i + 1}`,\n pcb_silkscreen_text_id: `pin_${i + 1}`,\n text: `{pin${i + 1}}`,\n anchor_position: {\n x: pinLabelX,\n y: pinLabelY,\n },\n font_size: 0.3,\n font_color: \"red\",\n font: \"tscircuit2024\",\n anchor_alignment: \"top-left\",\n }\n\n silkscreenPins.push(silkscreenPin)\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, sh / 2 + 0.5, 0.4)\n\n return {\n circuitJson: [\n ...platedHoles,\n silkscreenBorder,\n silkscreenRefText,\n ...silkscreenPins,\n ],\n parameters,\n }\n}\n","import type { PcbSilkscreenText } from \"circuit-json\"\n\nexport const silkscreenRef: (\n x: number,\n y: number,\n font_size: number,\n) => PcbSilkscreenText = (x: number, y: number, font_size: number) => {\n return {\n type: \"pcb_silkscreen_text\",\n pcb_silkscreen_text_id: \"silkscreen_text_1\",\n font: \"tscircuit2024\",\n font_size: font_size,\n pcb_component_id: \"pcb_component_1\",\n text: \"{REF}\",\n layer: \"top\",\n anchor_position: { x: x, y: y },\n anchor_alignment: \"center\",\n }\n}\nexport type SilkscreenRef = ReturnType<typeof silkscreenRef>\n","import type { PCBSMTPad } from \"circuit-json\"\nexport const rectpad = (\n pn: number | Array<string | number>,\n x: number,\n y: number,\n w: number,\n h: number,\n): PCBSMTPad => {\n return {\n type: \"pcb_smtpad\",\n x,\n y,\n width: w,\n height: h,\n layer: \"top\",\n shape: \"rect\",\n pcb_smtpad_id: \"\",\n port_hints: Array.isArray(pn)\n ? pn.map((item) => item.toString())\n : [pn.toString()],\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport mm from \"@tscircuit/mm\"\nimport { platedhole } from \"./platedhole\"\nimport { z } from \"zod\"\nimport { length, distance } from \"circuit-json\"\nimport { type SilkscreenRef, silkscreenRef } from \"./silkscreenRef\"\n\ntype StandardSize = {\n imperial: string\n metric: string\n Z_mm_min: number\n G_mm_min: number\n X_mm_min: number\n C_mm_ref: number\n}\n\n// https://www.worthingtonassembly.com/perfect-0201-footprint\n// https://static1.squarespace.com/static/54982a02e4b02e9f5e5d9ca7/t/660c692f69a0d83a4afecdf0/1712089391915/Discrete+Component+Footprints.pdf\n// https://page.venkel.com/hubfs/Resources/Technical/Resistors%20Landing%20Pattern.pdf\nconst sizes = [\n {\n imperial: \"01005\",\n metric: \"0402\",\n Z_mm_min: 0.58,\n G_mm_min: 0.18,\n X_mm_min: 0.21,\n C_mm_ref: 0.038,\n },\n {\n imperial: \"0201\",\n metric: \"0603\",\n Z_mm_min: 0.9,\n G_mm_min: 0.3,\n X_mm_min: 0.3,\n C_mm_ref: 0.6,\n },\n {\n imperial: \"0402\",\n metric: \"1005\",\n Z_mm_min: 1.6,\n G_mm_min: 0.4,\n X_mm_min: 0.7,\n C_mm_ref: 1,\n },\n {\n imperial: \"0603\",\n metric: \"1608\",\n Z_mm_min: 2.6,\n G_mm_min: 0.6,\n X_mm_min: 1.0,\n C_mm_ref: 1.7,\n },\n {\n imperial: \"0805\",\n metric: \"2012\",\n Z_mm_min: 3.0,\n G_mm_min: 0.6,\n X_mm_min: 1.2,\n C_mm_ref: 1.9,\n },\n {\n imperial: \"1206\",\n metric: \"3216\",\n Z_mm_min: 4.2,\n G_mm_min: 1.2,\n X_mm_min: 1.4,\n C_mm_ref: 2.8,\n },\n {\n imperial: \"1210\",\n metric: \"3225\",\n Z_mm_min: 3.2,\n G_mm_min: 1.0,\n X_mm_min: 2.5,\n C_mm_ref: 2.0,\n },\n {\n imperial: \"2010\",\n metric: \"5025\",\n Z_mm_min: 5.0,\n G_mm_min: 1.2,\n X_mm_min: 2.5,\n C_mm_ref: 3.6,\n },\n {\n imperial: \"2512\",\n metric: \"6332\",\n Z_mm_min: 6.3,\n G_mm_min: 1.2,\n X_mm_min: 3.2,\n C_mm_ref: 4.5,\n },\n]\nconst metricMap: Record<string, StandardSize> = sizes.reduce((acc: any, s) => {\n acc[s.metric] = s\n return acc\n}, {})\nconst imperialMap: Record<string, StandardSize> = sizes.reduce(\n (acc: any, s) => {\n acc[s.imperial] = s\n return acc\n },\n {},\n)\n\nexport const passive_def = z.object({\n tht: z.boolean(),\n p: length,\n pw: length.optional(),\n ph: length.optional(),\n metric: distance.optional(),\n imperial: distance.optional(),\n w: length.optional(),\n h: length.optional(),\n})\n\nexport type PassiveDef = z.input<typeof passive_def>\n\nconst deriveXFromH = (h: number) => 0.079 * h ** 2 + 0.94 * h - 0.009\nconst deriveZFromW = (w: number) => 1.09 * w + 0.6\nconst deriveGFromW = (w: number) => 0.59 * w - 0.31\nconst deriveCFromW = (w: number) => -0.01 * w ** 2 + 0.94 * w + 0.03\n\nexport const passive = (params: PassiveDef): AnySoupElement[] => {\n let { tht, p, pw, ph, metric, imperial, w, h } = params\n\n if (typeof w === \"string\") w = mm(w)\n if (typeof h === \"string\") h = mm(h)\n if (typeof p === \"string\") p = mm(p)\n if (typeof pw === \"string\") pw = mm(pw)\n if (typeof ph === \"string\") ph = mm(ph)\n\n if (h! > w!) {\n throw new Error(\n \"height cannot be greater than width (rotated footprint not yet implemented)\",\n )\n }\n\n /** standard size */\n let sz: StandardSize | undefined\n if (metric) {\n sz = metricMap[metric]\n }\n\n if (imperial) {\n sz = imperialMap[imperial]\n }\n\n if (!sz && w && h && !pw && !ph) {\n sz = {\n imperial: \"custom\",\n metric: \"custom\",\n Z_mm_min: deriveZFromW(w),\n G_mm_min: deriveGFromW(w),\n X_mm_min: deriveXFromH(h),\n C_mm_ref: deriveCFromW(w),\n }\n }\n\n if (sz) {\n w = sz.Z_mm_min\n h = sz.X_mm_min\n p = sz.C_mm_ref\n pw = (sz.Z_mm_min - sz.G_mm_min) / 2\n ph = (sz.Z_mm_min - sz.G_mm_min) / 2\n }\n\n if (pw === undefined) throw new Error(\"could not infer pad width\")\n if (ph === undefined) throw new Error(\"could not infer pad width\")\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, 0.9, 0.2)\n if (tht) {\n return [\n platedhole(1, -p / 2, 0, pw, (pw * 1) / 0.8),\n platedhole(2, p / 2, 0, pw, (pw * 1) / 0.8),\n silkscreenRefText,\n ]\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return [\n rectpad([\"1\", \"left\"], -p / 2, 0, pw, ph),\n rectpad([\"2\", \"right\"], p / 2, 0, pw, ph),\n silkscreenRefText,\n ]\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { passive, type PassiveDef } from \"src/helpers/passive-fn\"\n\nexport const diode = (parameters: {\n tht: boolean\n p: number\n}): { circuitJson: AnySoupElement[]; parameters: PassiveDef } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const cap = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: PassiveDef } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { type PassiveDef, passive } from \"../helpers/passive-fn\"\n\nexport const led = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: PassiveDef } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\n\nexport const res = (\n parameters: PassiveDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n return { circuitJson: passive(parameters), parameters }\n}\n","export const ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n","import type { AnySoupElement, PCBSMTPad } from \"circuit-json\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { ALPHABET } from \"../helpers/zod/ALPHABET\"\nimport { z } from \"zod\"\nimport { length, distance } from \"circuit-json\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { function_call } from \"src/helpers/zod/function-call\"\nimport type { NowDefined } from \"src/helpers/zod/now-defined\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const bga_def = z\n .object({\n fn: z.string(),\n num_pins: z.number().optional().default(64),\n grid: dim2d.optional(),\n p: distance.default(\"0.8mm\"),\n w: length.optional(),\n h: length.optional(),\n ball: length.optional().describe(\"ball diameter\"),\n pad: length.optional().describe(\"pad width/height\"),\n\n tlorigin: z.boolean().optional(),\n blorigin: z.boolean().optional(),\n trorigin: z.boolean().optional(),\n brorigin: z.boolean().optional(),\n\n missing: function_call.default([]),\n })\n .transform((a) => {\n let origin: \"tl\" | \"bl\" | \"tr\" | \"br\" = \"tl\"\n if (a.blorigin) origin = \"bl\"\n if (a.trorigin) origin = \"tr\"\n if (a.brorigin) origin = \"br\"\n\n if (!a.grid) {\n // find the largest square for the number of pins\n const largest_square = Math.ceil(Math.sqrt(a.num_pins))\n a.grid = { x: largest_square, y: largest_square }\n }\n\n if (a.missing) {\n a.missing = a.missing.map((s) => {\n if (typeof s === \"number\") return s\n if (s === \"center\") return \"center\"\n if (s === \"topleft\") return \"topleft\"\n const m = s.match(/([A-Z]+)(\\d+)/)\n if (!m) return s\n const Y = ALPHABET.indexOf(m[1]!)\n const X = Number.parseInt(m[2]!) - 1\n return Y * a.grid!.x + X + 1\n })\n }\n\n const new_def = { ...a, origin }\n\n return new_def as NowDefined<typeof new_def, \"w\" | \"h\" | \"grid\">\n })\n\nexport type BgaDefInput = z.input<typeof bga_def>\nexport type BgaDef = z.infer<typeof bga_def>\n\nexport const bga = (\n raw_params: BgaDefInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = bga_def.parse(raw_params)\n let { num_pins, grid, p, w, h, ball, pad, missing } = parameters\n\n ball ??= (0.75 / 1.27) * p\n\n pad ??= ball * 0.8\n\n const pads: PCBSMTPad[] = []\n\n const missing_pin_nums = (missing ?? []).filter((a) => typeof a === \"number\")\n const num_pins_missing = grid.x * grid.y - num_pins\n\n if (missing.length === 0 && num_pins_missing > 0) {\n // No missing pins specified, let's see if a squared center works\n // if num_pins_missing is a square\n if (Math.sqrt(num_pins_missing) % 1 === 0) {\n missing.push(\"center\")\n } else if (num_pins_missing === 1) {\n missing.push(\"topleft\")\n }\n }\n\n if (missing?.includes(\"center\")) {\n // Find the largest square that's square is less than\n // the number of missing pins\n const square_size = Math.floor(Math.sqrt(num_pins_missing))\n\n // Find the top left coordinate of the inner square, keep\n // in mind the full grid size is grid.x x grid.y\n const inner_square_x = Math.floor((grid.x - square_size) / 2)\n const inner_square_y = Math.floor((grid.y - square_size) / 2)\n\n // Add all the missing square pin numbers to missing_pin_nums\n for (let y = inner_square_y; y < inner_square_y + square_size; y++) {\n for (let x = inner_square_x; x < inner_square_x + square_size; x++) {\n missing_pin_nums.push(y * grid.x + x + 1)\n }\n }\n }\n\n if (missing?.includes(\"topleft\")) {\n missing_pin_nums.push(1)\n }\n\n const missing_pin_nums_set = new Set(missing_pin_nums)\n\n let missing_pins_passed = 0\n for (let y = 0; y < grid.y; y++) {\n for (let x = 0; x < grid.x; x++) {\n let pin_num = y * grid.x + x + 1\n if (missing_pin_nums_set.has(pin_num)) {\n missing_pins_passed++\n continue\n }\n pin_num -= missing_pins_passed\n\n const pad_x = (x - (grid.x - 1) / 2) * p\n const pad_y = -(y - (grid.y - 1) / 2) * p\n\n // TODO handle >26 rows\n pads.push(\n rectpad([pin_num, `${ALPHABET[y]}${x + 1}`], pad_x, pad_y, pad, pad),\n )\n }\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n (grid.y * p) / 2,\n 0.2,\n )\n\n return {\n circuitJson: [...pads, silkscreenRefText as AnySoupElement],\n parameters,\n }\n}\n","import { z } from \"zod\"\n\nexport const dim2d = z\n .string()\n .transform((a) => {\n const [x, y] = a.split(/[x ]/)\n return {\n x: parseFloat(x),\n y: parseFloat(y),\n }\n })\n .pipe(\n z.object({\n x: z.number(),\n y: z.number(),\n }),\n )\n","import { z } from \"zod\"\n\nexport const function_call = z\n .string()\n .or(z.array(z.any()))\n .transform((a) => {\n if (Array.isArray(a)) return a\n if (a.startsWith(\"(\") && a.endsWith(\")\")) {\n a = a.slice(1, -1)\n }\n return a.split(\",\").map((v) => {\n const numVal = Number(v)\n return isNaN(numVal) ? v : numVal\n })\n })\n .pipe(z.array(z.string().or(z.number())))\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { u_curve } from \"../helpers/u-curve\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\nexport const extendSoicDef = (newDefaults: {\n w?: string\n p?: string\n num_pins?: number\n legsoutside?: boolean\n}) =>\n z\n .object({\n fn: z.string(),\n num_pins: z.number().optional().default(8),\n w: length.default(length.parse(newDefaults.w ?? \"5.3mm\")),\n p: length.default(length.parse(newDefaults.p ?? \"1.27mm\")),\n pw: length.optional(),\n pl: length.optional(),\n legsoutside: z\n .boolean()\n .optional()\n .default(newDefaults.legsoutside ?? false),\n })\n .transform((v) => {\n // Default inner diameter and outer diameter\n if (!v.pw && !v.pl) {\n v.pw = length.parse(\"0.6mm\")\n v.pl = length.parse(\"1.0mm\")\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<typeof v, \"w\" | \"p\" | \"pw\" | \"pl\">\n })\n\nexport const soic_def = extendSoicDef({})\nexport type SoicInput = z.infer<typeof soic_def>\n\nexport const getCcwSoicCoords = (parameters: {\n num_pins: number\n pn: number\n w: number\n p: number\n pl: number\n legsoutside?: boolean\n widthincludeslegs?: boolean\n}) => {\n if (parameters.widthincludeslegs !== undefined) {\n parameters.legsoutside = !parameters.widthincludeslegs\n }\n const { num_pins, pn, w, p, pl, legsoutside } = parameters\n /** pin height */\n const ph = num_pins / 2\n const isLeft = pn <= ph\n\n /** Number of gaps between pins on each side, e.g. 4 pins = 3 spaces */\n const leftPinGaps = ph - 1\n\n /** gap size (pitch) */\n const gs = p\n\n const h = gs * leftPinGaps\n\n const legoffset = legsoutside ? pl / 2 : -pl / 2\n\n if (isLeft) {\n // The y position starts at h/2, then goes down by gap size\n // for each pin\n return { x: -w / 2 - legoffset, y: h / 2 - (pn - 1) * gs }\n } else {\n // The y position starts at -h/2, then goes up by gap size\n return { x: w / 2 + legoffset, y: -h / 2 + (pn - ph - 1) * gs }\n }\n}\n\n/**\n * Returns the plated holes for a SOIC package.\n */\nexport const soic = (raw_params: {\n soic: true\n num_pins: number\n w: number\n p?: number\n id?: string | number\n od?: string | number\n}): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = soic_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters) as AnySoupElement[],\n parameters,\n }\n}\n\nexport const soicWithoutParsing = (parameters: z.infer<typeof soic_def>) => {\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n /** silkscreen width */\n const m = Math.min(1, parameters.p / 2)\n const sw =\n parameters.w - (parameters.legsoutside ? 0 : parameters.pl * 2) - 0.2\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 + 0.4,\n sh / 12,\n )\n const silkscreenBorder: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n stroke_width: 0.1,\n route: [\n { x: -sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: sh / 2 },\n // Little U shape at the top\n ...u_curve.map(({ x, y }) => ({\n x: (x * sw) / 6,\n y: (y * sw) / 6 + sh / 2,\n })),\n { x: sw / 2, y: sh / 2 },\n { x: sw / 2, y: -sh / 2 },\n { x: -sw / 2, y: -sh / 2 },\n ],\n }\n\n return [...pads, silkscreenBorder, silkscreenRefText] as AnySoupElement[]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { optional, z } from \"zod\"\nimport { length } from \"circuit-json\"\nimport type { NowDefined } from \"../helpers/zod/now-defined\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { pin_order_specifier } from \"src/helpers/zod/pin-order-specifier\"\nimport { getQuadPinMap } from \"src/helpers/get-quad-pin-map\"\nimport { dim2d } from \"src/helpers/zod/dim-2d\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const base_quad_def = z.object({\n fn: z.string(),\n cc: z.boolean().default(true).optional(),\n ccw: z.boolean().default(true).optional(),\n startingpin: z\n .string()\n .or(z.array(pin_order_specifier))\n .transform((a) => (typeof a === \"string\" ? a.slice(1, -1).split(\",\") : a))\n .pipe(z.array(pin_order_specifier))\n .optional(),\n num_pins: z.number().optional().default(64),\n w: length.optional(),\n h: length.optional(),\n p: length.default(length.parse(\"0.5mm\")),\n pw: length.optional(),\n pl: length.optional(),\n thermalpad: z.union([z.literal(true), dim2d]).optional(),\n legsoutside: z.boolean().default(false),\n})\n\nexport const quadTransform = <T extends z.infer<typeof base_quad_def>>(\n v: T,\n) => {\n if (v.w && !v.h) {\n v.h = v.w\n } else if (!v.w && v.h) {\n v.w = v.h\n }\n\n const side_pin_count = v.num_pins / 4\n\n if (!v.p && !v.pw && !v.pl && v.w) {\n // HACK: This is wayyy underspecified\n const approx_pin_size_of_side = side_pin_count + 4\n v.p = v.w / approx_pin_size_of_side\n }\n\n if (!v.p && v.w && v.h && v.pw && v.pl) {\n // HACK: This is wayyy underspecified\n v.p = (v.w - v.pl * 2) / (side_pin_count - 1)\n }\n\n if (!v.w && !v.h && v.p) {\n // HACK: underspecified\n v.w = v.p * (side_pin_count + 4)\n v.h = v.w\n }\n\n if (v.p && !v.pw && !v.pl) {\n v.pw = v.p / 2\n v.pl = v.p / 2\n } else if (!v.pw) {\n v.pw = v.pl! * (0.6 / 1.0)\n } else if (!v.pl) {\n v.pl = v.pw! * (1.0 / 0.6)\n }\n\n return v as NowDefined<T, \"w\" | \"h\" | \"p\" | \"pw\" | \"pl\">\n}\n\nexport const quad_def = base_quad_def.transform(quadTransform)\n\nconst SIDES_CCW = [\"left\", \"bottom\", \"right\", \"top\"] as const\n\nexport const getQuadCoords = (params: {\n pin_count: number\n pn: number // pin number\n w: number // width of the package\n h: number // height (length) of the package\n p: number // pitch between pins\n pl: number // length of the pin\n legsoutside?: boolean\n}) => {\n const { pin_count, pn, w, h, p, pl, legsoutside } = params\n const sidePinCount = pin_count / 4\n const side = SIDES_CCW[Math.floor((pn - 1) / sidePinCount)]\n const pos = (pn - 1) % sidePinCount\n\n /** inner box width */\n const ibw = p * (sidePinCount - 1)\n /** inner box height */\n const ibh = p * (sidePinCount - 1)\n\n /** pad center distance from edge (negative is inside, positive is outside) */\n const pcdfe = legsoutside ? pl / 2 : -pl / 2\n\n switch (side) {\n case \"left\":\n return { x: -w / 2 - pcdfe, y: ibh / 2 - pos * p, o: \"vert\" }\n case \"bottom\":\n return { x: -ibw / 2 + pos * p, y: -h / 2 - pcdfe, o: \"horz\" }\n case \"right\":\n return { x: w / 2 + pcdfe, y: -ibh / 2 + pos * p, o: \"vert\" }\n case \"top\":\n return { x: ibw / 2 - pos * p, y: h / 2 + pcdfe, o: \"horz\" }\n default:\n throw new Error(\"Invalid pin number\")\n }\n}\n\nexport const quad = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = quad_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n const pin_map = getQuadPinMap(parameters)\n /** Side pin count */\n const spc = parameters.num_pins / 4\n for (let i = 0; i < parameters.num_pins; i++) {\n const {\n x,\n y,\n o: orientation,\n } = getQuadCoords({\n pin_count: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n h: parameters.h,\n p: parameters.p ?? 0.5,\n pl: parameters.pl,\n legsoutside: parameters.legsoutside,\n })\n\n let pw = parameters.pw\n let pl = parameters.pl\n if (orientation === \"vert\") {\n ;[pw, pl] = [pl, pw]\n }\n\n const pn = pin_map[i + 1]!\n pads.push(rectpad(pn, x, y, pw, pl))\n }\n\n if (parameters.thermalpad) {\n if (typeof parameters.thermalpad === \"boolean\") {\n const ibw = parameters.p * (spc - 1) + parameters.pw\n const ibh = parameters.p * (spc - 1) + parameters.pw\n pads.push(rectpad([\"thermalpad\"], 0, 0, ibw, ibh))\n } else {\n pads.push(\n rectpad(\n [\"thermalpad\"],\n 0,\n 0,\n parameters.thermalpad.x,\n parameters.thermalpad.y,\n ),\n )\n }\n }\n\n // Silkscreen corners\n const silkscreen_corners: PcbSilkscreenPath[] = []\n for (const [corner, dx, dy] of [\n [\"top-left\", -1, 1],\n [\"bottom-left\", -1, -1],\n [\"bottom-right\", 1, -1],\n [\"top-right\", 1, 1],\n ] as const) {\n // const dx = Math.floor(corner_index / 2) * 2 - 1\n // const dy = 1 - (corner_index % 2) * 2\n const corner_x = (parameters.w / 2) * dx\n const corner_y = (parameters.h / 2) * dy\n let arrow: \"none\" | \"in1\" | \"in2\" = \"none\"\n\n let arrow_x = corner_x\n let arrow_y = corner_y\n\n /** corner size */\n const csz = parameters.pw * 2\n\n if (pin_map[1] === 1 && corner === \"top-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 4] === 1 && corner === \"top-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3 + 1] === 1 && corner === \"top-right\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 3] === 1 && corner === \"top-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc] === 1 && corner === \"bottom-left\") {\n arrow = \"in1\"\n } else if (pin_map[spc + 1] === 1 && corner === \"bottom-left\") {\n arrow = \"in2\"\n } else if (pin_map[spc * 2] === 1 && corner === \"bottom-right\") {\n arrow = \"in1\"\n } else if (pin_map[spc * 2 + 1] === 1 && corner === \"bottom-right\") {\n arrow = \"in2\"\n }\n\n const rotate_arrow = arrow === \"in1\" ? 1 : -1\n if (parameters.legsoutside) {\n const arrow_dx = arrow === \"in1\" ? parameters.pl / 2 : parameters.pw / 2\n const arrow_dy = arrow === \"in1\" ? parameters.pw / 2 : parameters.pl / 2\n arrow_x += arrow_dx * dx * rotate_arrow\n arrow_y -= arrow_dy * dy * rotate_arrow\n }\n\n // Normal Corner\n if (arrow === \"none\" || parameters.legsoutside) {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n\n // Two lines nearly forming a corner, used when the arrow needs to overlap\n // the corne (QFN components where legs are inside)\n if ((arrow === \"in1\" || arrow === \"in2\") && !parameters.legsoutside) {\n silkscreen_corners.push(\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_1`,\n route: [\n {\n x: corner_x - csz * dx,\n y: corner_y,\n },\n {\n x: corner_x - (csz * dx) / 2,\n y: corner_y,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0,\n },\n {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_2`,\n route: [\n {\n x: corner_x,\n y: corner_y - (csz * dy) / 2,\n },\n {\n x: corner_x,\n y: corner_y - csz * dy,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n },\n )\n }\n if (arrow === \"in1\" || arrow === \"in2\") {\n silkscreen_corners.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: `pcb_silkscreen_path_${corner}_3`,\n route: [\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n {\n x: arrow_x,\n y: arrow_y,\n },\n {\n x: arrow_x + 0.2 * rotate_arrow * -dx,\n y: arrow_y + 0.2,\n },\n {\n x: arrow_x - 0.2 * -dx,\n y: arrow_y + 0.2 * rotate_arrow,\n },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n parameters.h / 2 + (parameters.legsoutside ? parameters.pl * 1.2 : 0.5),\n 0.3,\n )\n return {\n circuitJson: [\n ...pads,\n ...silkscreen_corners,\n silkscreenRefText,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","import { z } from \"zod\"\nexport const pin_order_specifier = z.enum([\n \"leftside\",\n \"topside\",\n \"rightside\",\n \"bottomside\",\n \"toppin\",\n \"bottompin\",\n \"leftpin\",\n \"rightpin\",\n])\n\nexport type PinOrderSpecifier = z.infer<typeof pin_order_specifier>\n","import type { PinOrderSpecifier } from \"./zod/pin-order-specifier\"\n\n/**\n * A counter-clockwise pin map is [1,2,3,4,5,6,7,8] for an 8-pin package\n *\n * 8 7\n * 1 6\n * 2 5\n * 3 4\n *\n * Given some parameters, we're returning how to map the pins in a quad package\n * with a different order. For example, if we pass in cw=true, we'll get the\n * following mapping\n *\n * 1 -> 1\n * 2 -> 8\n * 3 -> 7\n * 4 -> 6\n * 5 -> 5\n * 6 -> 4\n * 7 -> 3\n * 8 -> 2\n *\n * Which allows us to create the CW version of the package using...\n * new_pin = pin_map[normal_ccw_pin]\n *\n * 2 3\n * 1 4\n * 8 5\n * 7 6\n */\nexport const getQuadPinMap = ({\n num_pins,\n cw,\n ccw,\n startingpin,\n}: {\n num_pins: number\n cw?: boolean\n ccw?: boolean\n startingpin?: PinOrderSpecifier[]\n}): number[] => {\n const pin_map: number[] = []\n const pins_per_side = num_pins / 4\n let current_position_ccw_normal = 1\n\n /** Starting Flag Pins */\n const sfp: Record<PinOrderSpecifier, boolean> = {} as any\n for (const specifier of startingpin ?? []) {\n sfp[specifier] = true\n }\n if (!sfp.leftside && !sfp.topside && !sfp.rightside && !sfp.bottomside) {\n sfp.leftside = true\n }\n if (!sfp.bottompin && !sfp.leftpin && !sfp.rightpin && !sfp.toppin) {\n if (sfp.leftside) {\n sfp.toppin = true\n } else if (sfp.topside) {\n sfp.rightpin = true\n } else if (sfp.rightside) {\n sfp.bottompin = true\n } else if (sfp.bottomside) {\n sfp.leftpin = true\n }\n }\n\n if (sfp.leftside && sfp.toppin) {\n current_position_ccw_normal = 1\n } else if (sfp.leftside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side\n } else if (sfp.bottomside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side + 1\n } else if (sfp.bottomside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 2\n } else if (sfp.rightside && sfp.bottompin) {\n current_position_ccw_normal = pins_per_side * 2 + 1\n } else if (sfp.rightside && sfp.toppin) {\n current_position_ccw_normal = pins_per_side * 3\n } else if (sfp.topside && sfp.rightpin) {\n current_position_ccw_normal = pins_per_side * 3 + 1\n } else if (sfp.topside && sfp.leftpin) {\n current_position_ccw_normal = pins_per_side * 4\n }\n\n pin_map.push(-1) // the first index is meaningless\n\n // Each iteration we move the current position to the next pin, if we're\n // going CCW this means incrementing, if we're going CW this means\n // decrementing\n for (let i = 0; i < num_pins; i++) {\n pin_map[current_position_ccw_normal] = i + 1\n if (ccw || !cw) {\n current_position_ccw_normal++\n if (current_position_ccw_normal > num_pins) {\n current_position_ccw_normal = 1\n }\n } else {\n current_position_ccw_normal--\n if (current_position_ccw_normal < 1) {\n current_position_ccw_normal = num_pins\n }\n }\n }\n\n return pin_map\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfn_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const qfn = (\n parameters: z.input<typeof qfn_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n return quad(parameters)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { quad, quad_def } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const qfp_def = quad_def\n\nexport const qfp = (\n raw_params: z.input<typeof quad_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n raw_params.legsoutside = true\n\n const quad_defaults = quad_def.parse(raw_params)\n if (!raw_params.p) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.p = 0.8\n break\n case 52:\n if (raw_params.w === 14) raw_params.p = 1\n else raw_params.p = 0.65\n break\n case 208:\n raw_params.p = 0.5\n break\n }\n }\n if (!raw_params.pl) {\n switch (raw_params.num_pins) {\n case 44:\n case 52:\n case 64:\n raw_params.pl = 2.25\n break\n case 208:\n raw_params.pl = 1.65\n break\n default:\n raw_params.pl = quad_defaults.pl * 4\n break\n }\n }\n if (!raw_params.pw) {\n switch (raw_params.num_pins) {\n case 44:\n case 64:\n raw_params.pw = 0.5\n break\n case 52:\n if (raw_params.w === 14) raw_params.pw = 0.45\n else raw_params.pw = 0.55\n break\n case 208:\n raw_params.pw = 0.3\n break\n default:\n raw_params.pw = quad_defaults.pw\n break\n }\n }\n return quad(raw_params)\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { base_quad_def, quad, quad_def, quadTransform } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const mlp_def = base_quad_def.extend({}).transform(quadTransform)\n\nexport const mlp = (\n parameters: z.input<typeof mlp_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n parameters.legsoutside = false\n if (parameters.thermalpad === undefined) {\n parameters.thermalpad = true\n }\n return quad(parameters)\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\n// TODO we should accept MS-012 or MS-013\n\nexport const ssop_def = extendSoicDef({\n w: \"3.9mm\",\n p: \"1.27mm\",\n})\n\nexport const ssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing, type SoicInput } from \"./soic\"\n\nexport const tssop_def = extendSoicDef({\n w: \"6.1mm\",\n p: \"0.65mm\",\n legsoutside: true,\n})\n\nexport const tssop = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = tssop_def.parse(raw_params)\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot236_def = extendSoicDef({\n p: \"0.95mm\",\n w: \"1.6mm\",\n legsoutside: true,\n})\n\nexport const sot236 = (\n raw_params: z.input<typeof sot236_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot236_def.parse({ ...raw_params, num_pins: 6 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot363_def = extendSoicDef({})\n\nexport const sot363 = (\n raw_params: z.input<typeof sot363_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot363_def.parse({\n fn: \"sot363\",\n num_pins: 6,\n w: 1.94,\n p: 0.65,\n pw: 0.3,\n pl: 0.7,\n legoutside: true,\n })\n\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot23_def = z.object({\n fn: z.string(),\n num_pins: z.literal(3).default(3),\n w: z.string().default(\"1.92mm\"),\n h: z.string().default(\"2.74mm\"),\n pl: z.string().default(\"0.8mm\"),\n pw: z.string().default(\"0.764mm\"),\n})\n\nexport const sot23 = (\n raw_params: z.input<typeof sot23_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot23_def.parse(raw_params)\n return {\n circuitJson: sot23WithoutParsing(parameters),\n parameters: parameters,\n }\n}\n\nexport const getCcwSot23Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: -1.7, y: 0 }\n } else if (pn === 2) {\n return { x: 1.7, y: -0.95 }\n } else {\n return { x: 1.7, y: 0.95 }\n }\n}\n\nexport const sot23WithoutParsing = (parameters: z.infer<typeof sot23_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSot23Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n Number(parameters.h),\n 0.3,\n )\n return [...pads, silkscreenRefText as AnySoupElement]\n}\n","import type { AnySoupElement, PcbSilkscreenPath } from \"circuit-json\"\nimport {\n extendSoicDef,\n soicWithoutParsing,\n type SoicInput,\n getCcwSoicCoords,\n} from \"./soic\"\nimport { rectpad } from \"src/helpers/rectpad\"\nimport { z } from \"zod\"\nimport { CORNERS } from \"src/helpers/corner\"\nimport { type SilkscreenRef, silkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const dfn_def = extendSoicDef({})\n\n/**\n * Dual Flat No-lead\n *\n * Similar to SOIC but different silkscreen\n */\nexport const dfn = (\n raw_params: SoicInput,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = dfn_def.parse(raw_params)\n const pads: AnySoupElement[] = []\n for (let i = 0; i < parameters.num_pins; i++) {\n const { x, y } = getCcwSoicCoords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: parameters.w,\n p: parameters.p ?? 1.27,\n pl: parameters.pl,\n widthincludeslegs: true,\n })\n pads.push(\n rectpad(i + 1, x, y, parameters.pl ?? \"1mm\", parameters.pw ?? \"0.6mm\"),\n )\n }\n\n // The silkscreen is 4 corners and an arrow identifier for pin1\n const m = Math.min(1, parameters.p / 2)\n const sw = parameters.w + m\n const sh = (parameters.num_pins / 2 - 1) * parameters.p + parameters.pw + m\n const silkscreenPaths: PcbSilkscreenPath[] = []\n\n for (const corner of CORNERS) {\n const { dx, dy } = corner\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n route: [\n { x: (dx * sw) / 2 - dx * parameters.p, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 },\n { x: (dx * sw) / 2, y: (dy * sh) / 2 - dy * parameters.p },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.1,\n })\n }\n\n // Arrow\n /** arrow size */\n const as = parameters.p / 4\n /** Arrow tip x */\n const atx = -sw / 2 - as / 2\n /** Arrow tip y */\n const aty = sh / 2 - parameters.p / 2\n\n silkscreenPaths.push({\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"\",\n type: \"pcb_silkscreen_path\",\n route: [\n {\n x: atx,\n y: aty,\n },\n {\n x: atx - as,\n y: aty + as,\n },\n {\n x: atx - as,\n y: aty - as,\n },\n {\n x: atx,\n y: aty,\n },\n ],\n stroke_width: 0.1,\n })\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n sh / 2 + 0.4,\n sh / 12,\n )\n return {\n circuitJson: [\n ...pads,\n silkscreenRefText,\n ...silkscreenPaths,\n ] as AnySoupElement[],\n parameters,\n }\n}\n","export const CORNERS = [\n { name: \"top-left\", dx: -1, dy: 1 },\n { name: \"top-right\", dx: 1, dy: 1 },\n { name: \"bottom-left\", dx: -1, dy: -1 },\n { name: \"bottom-right\", dx: 1, dy: -1 },\n]\n","import { z } from \"zod\"\nimport { length, type AnySoupElement } from \"circuit-json\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const pinrow_def = z.object({\n fn: z.string(),\n num_pins: z.number().optional().default(6),\n p: length.default(\"0.1in\").describe(\"pitch\"),\n id: length.default(\"1.0mm\").describe(\"inner diameter\"),\n od: length.default(\"1.5mm\").describe(\"outer diameter\"),\n})\n\nexport const pinrow = (\n raw_params: z.input<typeof pinrow_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = pinrow_def.parse(raw_params)\n const { p, id, od } = parameters\n const holes: any[] = []\n /** num_spaces */\n const ns = parameters.num_pins - 1\n const xoff = -(ns / 2) * p\n\n for (let i = 0; i < parameters.num_pins; i++) {\n holes.push(platedhole(i + 1, xoff + i * p, 0, id, od))\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 2, 0.5)\n return {\n circuitJson: [...holes, silkscreenRefText] as AnySoupElement[],\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const sot563_def = extendSoicDef({})\n\nexport const sot563 = (\n raw_params: z.input<typeof sot563_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot563_def.parse({\n fn: \"sot563\",\n num_pins: 6,\n w: 1.94,\n p: 0.5,\n pw: 0.3,\n pl: 0.67,\n legoutside: true,\n })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms012_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"3.9mm\",\n legsoutside: true,\n})\n\nexport const ms012 = (\n raw_params: z.input<typeof ms012_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = ms012_def.parse({ ...raw_params, num_pins: 8 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { extendSoicDef, soicWithoutParsing } from \"./soic\"\nimport type { z } from \"zod\"\n\nexport const ms013_def = extendSoicDef({\n p: \"1.27mm\",\n w: \"7.5mm\",\n legsoutside: true,\n})\n\nexport const ms013 = (\n raw_params: z.input<typeof ms013_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = ms013_def.parse({ ...raw_params, num_pins: 16 })\n return {\n circuitJson: soicWithoutParsing(parameters),\n parameters,\n }\n}\n","import { length, type AnySoupElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot723_def = z.object({\n fn: z.string(),\n num_pins: z.literal(3).default(3),\n w: z.string().default(\"1.2mm\"),\n h: z.string().default(\"1.2mm\"),\n pl: z.string().default(\"0.3mm\"),\n pw: z.string().default(\"0.32mm\"),\n})\n\nexport const sot723 = (\n raw_params: z.input<typeof sot723_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sot723_def.parse(raw_params)\n const pad = sot723WithoutParsing(parameters)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0.4,\n length.parse(parameters.h),\n 0.2,\n )\n return {\n circuitJson: [...pad, silkscreenRefText as AnySoupElement],\n parameters,\n }\n}\n\nexport const getCcwSot723Coords = (parameters: {\n num_pins: number\n pn: number\n w: number\n h: number\n pl: number\n}) => {\n const { pn, w, h, pl } = parameters\n\n if (pn === 1) {\n return { x: 0, y: 0 }\n } else if (pn === 2) {\n return { x: 1, y: -0.4 }\n } else {\n return { x: 1, y: 0.4 }\n }\n}\n\nexport const sot723WithoutParsing = (\n parameters: z.infer<typeof sot723_def>,\n) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 0; i < 3; i++) {\n const { x, y } = getCcwSot723Coords({\n num_pins: parameters.num_pins,\n pn: i + 1,\n w: Number.parseFloat(parameters.w),\n h: Number.parseFloat(parameters.h),\n pl: Number.parseFloat(parameters.pl),\n })\n pads.push(\n rectpad(\n i + 1,\n x,\n y,\n Number.parseFloat(parameters.pl),\n i !== 0 ? Number.parseFloat(parameters.pw) : 0.42,\n ),\n )\n }\n\n return pads\n}\n","import type { AnySoupElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { length } from \"circuit-json\"\n\nexport const sod_def = z.object({\n fn: z.string(),\n num_pins: z.literal(2).default(2),\n w: z.string().default(\"2.36mm\"),\n h: z.string().default(\"1.22mm\"),\n pl: z.string().default(\"0.9mm\"),\n pw: z.string().default(\"0.9mm\"),\n pad_spacing: z.string().default(\"4.19mm\"),\n})\n\nexport const sod123 = (\n raw_params: z.input<typeof sod_def>,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = sod_def.parse(raw_params)\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n length.parse(parameters.h) / 4 + 0.4,\n 0.3,\n )\n\n return {\n circuitJson: sodWithoutParsing(parameters).concat(\n silkscreenRefText as AnySoupElement,\n ),\n parameters,\n }\n}\n\nexport const getSodCoords = (parameters: {\n pn: number\n pad_spacing: number\n}) => {\n const { pn, pad_spacing } = parameters\n\n if (pn === 1) {\n return { x: -pad_spacing / 2, y: 0 }\n // biome-ignore lint/style/noUselessElse: <explanation>\n } else {\n return { x: pad_spacing / 2, y: 0 }\n }\n}\n\nexport const sodWithoutParsing = (parameters: z.infer<typeof sod_def>) => {\n const pads: AnySoupElement[] = []\n\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getSodCoords({\n pn: i,\n pad_spacing: Number.parseFloat(parameters.pad_spacing),\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n return pads\n}\n","import {\n length,\n type AnySoupElement,\n type PcbSilkscreenLine,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { passive, type PassiveDef } from \"../helpers/passive-fn\"\nimport { z } from \"zod\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"../helpers/silkscreenRef\"\n\nexport const axial_def = z.object({\n fn: z.string(),\n p: length.optional().default(\"2.54mm\"),\n id: length.optional().default(\"0.7mm\"),\n od: length.optional().default(\"1mm\"),\n})\nexport type AxialDef = z.input<typeof axial_def>\n\nexport const axial = (\n raw_params: AxialDef,\n): { circuitJson: AnySoupElement[]; parameters: any } => {\n const parameters = axial_def.parse(raw_params)\n\n const { p, id, od } = parameters\n\n const plated_holes = [\n platedhole(1, -p / 2, 0, id, od),\n platedhole(2, p / 2, 0, id, od),\n ]\n\n const silkscreenLine: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n route: [\n { x: -p / 2 + od + id / 2, y: 0 },\n { x: p / 2 - od - id / 2, y: 0 },\n ],\n stroke_width: 0.1,\n pcb_silkscreen_path_id: \"\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, p / 4, 0.5)\n return {\n circuitJson: [\n ...plated_holes,\n silkscreenLine,\n silkscreenRefText as AnySoupElement,\n ],\n parameters,\n }\n}\n","import { length, type AnyCircuitElement } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { platedhole } from \"../helpers/platedhole\"\nimport { silkscreenpath } from \"../helpers/silkscreenpath\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const pushbutton_def = z.object({\n fn: z.literal(\"pushbutton\"),\n w: length.default(4.5),\n h: length.default(6.5),\n id: length.default(1),\n od: length.default(1.2),\n})\n\nexport const pushbutton = (\n raw_params: z.input<typeof pushbutton_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = pushbutton_def.parse(raw_params)\n\n const width = parameters.w\n const height = parameters.h\n const holeDiameter = parameters.id\n\n const holes: AnyCircuitElement[] = [\n platedhole(1, -width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(2, -width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(3, width / 2, -height / 2, holeDiameter, holeDiameter * 1.2),\n platedhole(4, width / 2, height / 2, holeDiameter, holeDiameter * 1.2),\n ]\n\n const silkscreenLines: AnyCircuitElement[] = [\n // Vertical lines indicating connections\n silkscreenpath([\n { x: -width / 2, y: -height / 2 },\n { x: -width / 2, y: height / 2 },\n ]),\n silkscreenpath([\n { x: width / 2, y: -height / 2 },\n { x: width / 2, y: height / 2 },\n ]),\n // Center indicating latch\n silkscreenpath([\n { x: -width / 2, y: 0 },\n { x: -width / 5, y: 0 },\n { x: ((width / 5) * 1) / Math.sqrt(2), y: height / 8 },\n ]),\n silkscreenpath([\n { x: width / 2, y: 0 },\n { x: width / 5, y: 0 },\n ]),\n ]\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 2 + 0.4,\n 0.5,\n )\n return {\n circuitJson: [...holes, ...silkscreenLines, silkscreenRefText],\n parameters,\n }\n}\n","import type { PcbSilkscreenPath } from \"circuit-json\"\n\nexport const silkscreenpath = (\n route: Array<{ x: number; y: number }>,\n options: {\n stroke_width?: number\n layer?: string\n pcb_component_id?: string\n pcb_silkscreen_path_id?: string\n } = {},\n): PcbSilkscreenPath => {\n return {\n type: \"pcb_silkscreen_path\",\n layer: options.layer || \"top\",\n pcb_component_id: options.pcb_component_id || \"\",\n pcb_silkscreen_path_id: options.pcb_silkscreen_path_id || \"\",\n route,\n stroke_width: options.stroke_width || 0.1,\n }\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { platedhole } from \"src/helpers/platedhole\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const stampboard_def = z.object({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n h: length.optional(),\n left: length.optional().default(20),\n right: length.optional().default(20),\n top: length.optional().default(2),\n bottom: length.optional().default(2),\n p: length.default(length.parse(\"2.54mm\")),\n pw: length.default(length.parse(\"1.6mm\")),\n pl: length.default(length.parse(\"2.4mm\")),\n innerhole: z.boolean().default(false),\n innerholeedgedistance: length.default(length.parse(\"1.61mm\")),\n})\n\nexport type Stampboard_def = z.input<typeof stampboard_def>\n\nconst getHeight = (parameters: Stampboard_def) => {\n const params = stampboard_def.parse(parameters)\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n if (params.left) {\n return params.left * params.p\n }\n if (params.right) {\n return params.right * params.p\n }\n return 51 // Default height if no pins are provided\n}\nconst getTriangleDir = (x: number, y: number, side: string) => {\n let routes: { x: number; y: number }[] = []\n const triangleHeight = 1 // Adjust triangle size as needed\n const triangleWidth = 0.6 // Adjust triangle width as needed\n if (side === \"right\") {\n routes = [\n {\n x: x + triangleHeight / 2,\n y: y,\n }, // Tip of the triangle (pointing right)\n {\n x: x - triangleHeight / 2,\n y: y + triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: x - triangleHeight / 2,\n y: y - triangleWidth / 2,\n }, // Top corner of the base\n {\n x: x + triangleHeight / 2,\n y: y,\n }, // Close the path at the tip\n ]\n }\n if (side === \"left\") {\n routes = [\n {\n x: x - triangleHeight / 2,\n y: y,\n }, // Tip of the triangle (pointing left)\n {\n x: x + triangleHeight / 2,\n y: y + triangleWidth / 2,\n }, // Top corner of the base\n {\n x: x + triangleHeight / 2,\n y: y - triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: x - triangleHeight / 2,\n y: y,\n }, // Close the path at the tip\n ]\n }\n if (side === \"top\") {\n routes = [\n {\n x: x,\n y: y + triangleHeight / 2,\n }, // Tip of the triangle (pointing up)\n {\n x: x - triangleWidth / 2,\n y: y - triangleHeight / 2,\n }, // Left corner of the base\n {\n x: x + triangleWidth / 2,\n y: y - triangleHeight / 2,\n }, // Right corner of the base\n {\n x: x,\n y: y + triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n if (side === \"bottom\") {\n routes = [\n {\n x: x,\n y: y - triangleHeight / 2,\n }, // Tip of the triangle (pointing down)\n {\n x: x - triangleWidth / 2,\n y: y + triangleHeight / 2,\n }, // Left corner of the base\n {\n x: x + triangleWidth / 2,\n y: y + triangleHeight / 2,\n }, // Right corner of the base\n {\n x: x,\n y: y - triangleHeight / 2,\n }, // Close the path at the tip\n ]\n }\n return routes\n}\n\nexport const stampboard = (\n raw_params: Stampboard_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = stampboard_def.parse(raw_params)\n const height = params.h ?? getHeight(params)\n const rectpads: AnyCircuitElement[] = []\n const holes: PcbPlatedHole[] = []\n let routes: { x: number; y: number }[] = []\n const innerDiameter = 1\n const outerDiameter = 1.2\n const totalPadsNumber =\n params.left + params.right + (params.bottom ?? 0) + (params.top ?? 0)\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n if (i === 0 && !params.left && !params.bottom) {\n routes = getTriangleDir(\n params.w / 2 - params.pl * 1.4,\n yoff + i * params.p,\n \"right\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left + (params.bottom ?? 0),\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0) + totalPadsNumber,\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0) + totalPadsNumber * 2,\n params.w / 2 - params.innerholeedgedistance,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.left) {\n const yoff = -((params.left - 1) / 2) * params.p\n for (let i = 0; i < params.left; i++) {\n if (i === params.left - 1) {\n routes = getTriangleDir(\n -params.w / 2 + params.pl * 1.4,\n yoff + i * params.p,\n \"left\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1,\n -params.w / 2 + params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1 + totalPadsNumber,\n -params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1 + totalPadsNumber * 2,\n -params.w / 2 + params.innerholeedgedistance,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.top) {\n const xoff = -((params.top - 1) / 2) * params.p\n for (let i = 0; i < params.top; i++) {\n if (\n i === params.top - 1 &&\n !params.left &&\n !params.bottom &&\n !params.right\n ) {\n routes = getTriangleDir(\n xoff + i * params.p,\n height / 2 - params.pl * 1.4,\n \"top\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left + params.right + (params.bottom ?? 0),\n xoff + i * params.p,\n height / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i +\n 1 +\n params.left +\n params.right +\n (params.bottom ?? 0) +\n totalPadsNumber,\n xoff + i * params.p,\n height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i +\n 1 +\n params.left +\n params.right +\n (params.bottom ?? 0) +\n totalPadsNumber * 2,\n xoff + i * params.p,\n height / 2 - params.innerholeedgedistance,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n if (params.bottom) {\n const xoff = -((params.bottom - 1) / 2) * params.p\n for (let i = 0; i < params.bottom; i++) {\n if (i === 0 && !params.left) {\n routes = getTriangleDir(\n xoff + i * params.p,\n -height / 2 + params.pl * 1.4,\n \"bottom\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left,\n xoff + i * params.p,\n -height / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n if (params.innerhole) {\n holes.push(\n platedhole(\n i + 1 + params.left + totalPadsNumber,\n xoff + i * params.p,\n -height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n holes.push(\n platedhole(\n i + 1 + params.left + totalPadsNumber * 2,\n xoff + i * params.p,\n -height / 2 + params.innerholeedgedistance,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_triangle_1\",\n pcb_component_id: \"2\",\n route: routes,\n stroke_width: 0.1,\n layer: \"top\",\n }\n\n const silkscreenPath: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_path_1\",\n pcb_component_id: \"1\",\n route: [\n { x: -params.w / 2, y: height / 2 },\n { x: params.w / 2, y: height / 2 },\n { x: params.w / 2, y: -height / 2 },\n { x: -params.w / 2, y: -height / 2 },\n { x: -params.w / 2, y: height / 2 },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 1.8,\n height / 25,\n )\n return {\n circuitJson: [\n ...rectpads,\n ...holes,\n silkscreenPath,\n silkscreenTriangle,\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { platedhole } from \"src/helpers/platedhole\"\n\nexport const stampreceiver_def = z.object({\n fn: z.string(),\n w: length.default(\"22.58mm\"),\n h: length.optional(),\n left: length.optional().default(20),\n right: length.optional().default(20),\n top: length.optional().default(2),\n bottom: length.optional().default(2),\n p: length.default(length.parse(\"2.54mm\")),\n pw: length.default(length.parse(\"1.6mm\")),\n pl: length.default(length.parse(\"3.2mm\")),\n innerhole: z.boolean().default(false),\n innerholeedgedistance: length.default(length.parse(\"1.61mm\")),\n})\n\nexport type Stampreceiver_def = z.input<typeof stampreceiver_def>\n\nconst getHeight = (parameters: Stampreceiver_def): number => {\n const params = stampreceiver_def.parse(parameters)\n\n // Calculate height based on the presence of left and right parameters\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n\n if (params.left) {\n return params.left * params.p\n }\n\n if (params.right) {\n return params.right * params.p\n }\n\n // Return default height if neither left nor right is provided\n return 51\n}\ntype Point = { x: number; y: number }\ntype Direction = \"left\" | \"right\" | \"top\" | \"bottom\"\n\nconst getTriangleDir = (\n x: number,\n y: number,\n side: Direction,\n triangleHeight = 1,\n triangleWidth = 0.6,\n): Point[] => {\n const halfHeight = triangleHeight / 2\n const halfWidth = triangleWidth / 2\n\n const routes: Record<Direction, Point[]> = {\n left: [\n { x: x + halfHeight, y }, // Tip\n { x: x - halfHeight, y: y + halfWidth }, // Bottom corner\n { x: x - halfHeight, y: y - halfWidth }, // Top corner\n { x: x + halfHeight, y }, // Close path\n ],\n right: [\n { x: x - halfHeight, y }, // Tip\n { x: x + halfHeight, y: y + halfWidth }, // Top corner\n { x: x + halfHeight, y: y - halfWidth }, // Bottom corner\n { x: x - halfHeight, y }, // Close path\n ],\n top: [\n { x, y: y - halfHeight }, // Tip\n { x: x - halfWidth, y: y + halfHeight }, // Left corner\n { x: x + halfWidth, y: y + halfHeight }, // Right corner\n { x, y: y - halfHeight }, // Close path\n ],\n bottom: [\n { x, y: y + halfHeight }, // Tip\n { x: x - halfWidth, y: y - halfHeight }, // Left corner\n { x: x + halfWidth, y: y - halfHeight }, // Right corner\n { x, y: y + halfHeight }, // Close path\n ],\n }\n\n return routes[side]\n}\nexport const stampreceiver = (\n raw_params: Stampreceiver_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = stampreceiver_def.parse(raw_params)\n const height = params.h ?? getHeight(params)\n const rectpads: AnyCircuitElement[] = []\n const holes: PcbPlatedHole[] = []\n const innerDiameter = 1\n const outerDiameter = 1.2\n const totalPadsNumber =\n params.left + params.right + (params.bottom ?? 0) + (params.top ?? 0)\n let routes: { x: number; y: number }[] = []\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n if (i === 0 && !params.left && !params.bottom) {\n routes = getTriangleDir(\n params.w / 2 + params.pl * 1.4,\n yoff + i * params.p,\n \"right\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left + (params.bottom ?? 0),\n params.w / 2 - params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n params.innerhole &&\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0) + totalPadsNumber,\n params.w / 2 - params.innerholeedgedistance,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n if (params.left) {\n const yoff = -((params.left - 1) / 2) * params.p\n for (let i = 0; i < params.left; i++) {\n if (i === params.left - 1) {\n routes = getTriangleDir(\n -params.w / 2 - params.pl / 3,\n yoff + i * params.p,\n \"left\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1,\n -params.w / 2 + params.pl / 2,\n yoff + i * params.p,\n params.pl,\n params.pw,\n ),\n )\n params.innerhole &&\n holes.push(\n platedhole(\n i + 1 + totalPadsNumber,\n -params.w / 2 + params.innerholeedgedistance,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n if (params.top) {\n const xoff = -((params.top - 1) / 2) * params.p\n for (let i = 0; i < params.top; i++) {\n if (\n i === params.top - 1 &&\n !params.left &&\n !params.bottom &&\n !params.right\n ) {\n routes = getTriangleDir(\n xoff + i * params.p,\n height / 2 + params.pl * 1.4,\n \"top\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.right + (params.bottom ?? 0) + params.left,\n xoff + i * params.p,\n height / 2 - params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n params.innerhole &&\n holes.push(\n platedhole(\n i +\n 1 +\n params.right +\n (params.bottom ?? 0) +\n params.left +\n totalPadsNumber,\n xoff + i * params.p,\n height / 2 - params.innerholeedgedistance,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n if (params.bottom) {\n const xoff = -((params.bottom - 1) / 2) * params.p\n for (let i = 0; i < params.bottom; i++) {\n if (i === 0 && !params.left) {\n routes = getTriangleDir(\n xoff + i * params.p,\n -height / 2 - params.pl * 1.4,\n \"bottom\",\n )\n }\n rectpads.push(\n rectpad(\n i + 1 + params.left,\n xoff + i * params.p,\n -height / 2 + params.pl / 2,\n params.pw,\n params.pl,\n ),\n )\n params.innerhole &&\n holes.push(\n platedhole(\n i + 1 + params.left + totalPadsNumber,\n xoff + i * params.p,\n -height / 2 + params.innerholeedgedistance,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"1\",\n pcb_component_id: \"1\",\n layer: \"top\",\n route: routes,\n stroke_width: 0.1,\n }\n\n const silkscreenPath: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_path_1\",\n pcb_component_id: \"1\",\n route: [\n {\n x: -params.w / 2 - params.pl / 3,\n y: height / 2 + params.pl / 3,\n },\n {\n x: params.w / 2 + params.pl / 3,\n y: height / 2 + params.pl / 3,\n },\n {\n x: params.w / 2 + params.pl / 3,\n y: -height / 2 - params.pl / 3,\n },\n {\n x: -params.w / 2 - params.pl / 3,\n y: -height / 2 - params.pl / 3,\n },\n {\n x: -params.w / 2 - params.pl / 3,\n y: height / 2 + params.pl / 3,\n },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 1.8,\n height / 25,\n )\n return {\n circuitJson: [\n ...holes,\n ...rectpads,\n silkscreenPath,\n silkscreenTriangle,\n silkscreenRefText,\n ],\n parameters: params,\n }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { quad, quad_def } from \"./quad\"\nimport type { z } from \"zod\"\n\nexport const lqfp_def = quad_def\n\nexport const lqfp = (\n parameters: z.input<typeof lqfp_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n parameters.legsoutside = true\n return quad(parameters)\n}\n","import type { AnyCircuitElement, PcbSilkscreenPath } from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\n\nexport const sot235_def = z.object({\n fn: z.string(),\n num_pins: z.literal(5).default(5),\n h: z.string().default(\"1.6mm\"),\n pl: z.string().default(\"1mm\"),\n pw: z.string().default(\"0.7mm\"),\n p: z.string().default(\"0.95mm\"),\n})\n\nexport const sot235 = (\n raw_params: z.input<typeof sot235_def>,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const parameters = sot235_def.parse(raw_params)\n return {\n circuitJson: sot23_5WithoutParsing(parameters),\n parameters: parameters,\n }\n}\n\nexport const getCcwSot235Coords = (parameters: {\n h: number\n p: number\n pn: number\n}) => {\n const { p, h, pn } = parameters\n if (pn === 1) {\n return { x: -h / 2 - 0.5, y: p }\n }\n if (pn === 2) {\n return { x: -h / 2 - 0.5, y: 0 }\n }\n if (pn === 3) {\n return { x: -h / 2 - 0.5, y: -p }\n }\n if (pn === 4) {\n return { x: h / 2 + 0.5, y: -p }\n }\n if (pn === 5) {\n return { x: h / 2 + 0.5, y: p }\n }\n throw new Error(\"Invalid pin number\")\n}\n\nexport const sot23_5WithoutParsing = (\n parameters: z.infer<typeof sot235_def>,\n) => {\n const pads: AnyCircuitElement[] = []\n for (let i = 1; i <= parameters.num_pins; i++) {\n const { x, y } = getCcwSot235Coords({\n h: Number.parseFloat(parameters.h),\n p: Number.parseFloat(parameters.p),\n pn: i,\n })\n pads.push(\n rectpad(\n i,\n x,\n y,\n Number.parseFloat(parameters.pl),\n Number.parseFloat(parameters.pw),\n ),\n )\n }\n\n const width =\n ((parameters.num_pins + 1) / 2) * Number.parseFloat(parameters.p)\n const height = Number.parseFloat(parameters.h)\n const silkscreenPath1: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_1\",\n route: [\n { x: -width / 3, y: height / 2 + Number.parseFloat(parameters.p) / 1.3 },\n { x: width / 3, y: height / 2 + Number.parseFloat(parameters.p) / 1.3 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.05,\n }\n const silkscreenPath2: PcbSilkscreenPath = {\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"silkscreen_path_2\",\n route: [\n { x: -width / 3, y: -height / 2 - Number.parseFloat(parameters.p) / 1.3 },\n { x: width / 3, y: -height / 2 - Number.parseFloat(parameters.p) / 1.3 },\n ],\n type: \"pcb_silkscreen_path\",\n stroke_width: 0.05,\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(0, height + 0.3, 0.3)\n const pin1Position = getCcwSot235Coords({\n h: Number.parseFloat(parameters.h),\n p: Number.parseFloat(parameters.p),\n pn: 1,\n })\n pin1Position.x = pin1Position.x - Number.parseFloat(parameters.pw) * 1.5\n const triangleHeight = 0.7 // Adjust triangle size as needed\n const triangleWidth = 0.3 // Adjust triangle width as needed\n const pin1Indicator: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n layer: \"top\",\n pcb_component_id: \"\",\n pcb_silkscreen_path_id: \"pin1_indicator\",\n route: [\n {\n x: pin1Position.x + triangleHeight / 2,\n y: pin1Position.y,\n }, // Tip of the triangle (pointing right)\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y + triangleWidth / 2,\n }, // Bottom corner of the base\n {\n x: pin1Position.x - triangleHeight / 2,\n y: pin1Position.y - triangleWidth / 2,\n }, // Top corner of the base\n {\n x: pin1Position.x + triangleHeight / 2,\n y: pin1Position.y,\n }, // Close the path at the tip\n ],\n stroke_width: 0.05,\n }\n\n return [\n ...pads,\n silkscreenRefText,\n silkscreenPath1,\n silkscreenPath2,\n pin1Indicator as AnyCircuitElement,\n ]\n}\n","import {\n length,\n type AnyCircuitElement,\n type PcbPlatedHole,\n type PcbSilkscreenPath,\n} from \"circuit-json\"\nimport { z } from \"zod\"\nimport { rectpad } from \"../helpers/rectpad\"\nimport { silkscreenRef, type SilkscreenRef } from \"src/helpers/silkscreenRef\"\nimport { platedhole } from \"src/helpers/platedhole\"\n\nexport const breakoutheaders_def = z.object({\n fn: z.string(),\n w: length.default(\"10mm\"),\n h: length.optional(),\n left: length.optional().default(20),\n right: length.optional().default(20),\n top: length.optional().default(0),\n bottom: length.optional().default(0),\n p: length.default(length.parse(\"2.54mm\")),\n id: length.optional().default(length.parse(\"1mm\")),\n od: length.optional().default(length.parse(\"1.5mm\")),\n})\n\nexport type breakoutheaders_def = z.input<typeof breakoutheaders_def>\n\nconst getHeight = (parameters: breakoutheaders_def): number => {\n const params = breakoutheaders_def.parse(parameters)\n\n // Calculate height based on the presence of left and right parameters\n if (params.left && params.right) {\n return Math.max(params.left, params.right) * params.p\n }\n\n if (params.left) {\n return params.left * params.p\n }\n\n if (params.right) {\n return params.right * params.p\n }\n\n return 51\n}\n\ntype Point = { x: number; y: number }\ntype Direction = \"left\" | \"right\" | \"top\" | \"bottom\"\n\nconst getTrianglePath = (\n x: number,\n y: number,\n side: Direction,\n triangleHeight = 1,\n triangleWidth = 0.6,\n): Point[] => {\n const halfHeight = triangleHeight / 2\n const halfWidth = triangleWidth / 2\n\n const silkscreenTriangleRoutes: Record<Direction, Point[]> = {\n left: [\n { x: x + halfHeight, y },\n { x: x - halfHeight, y: y + halfWidth },\n { x: x - halfHeight, y: y - halfWidth },\n { x: x + halfHeight, y },\n ],\n right: [\n { x: x - halfHeight, y },\n { x: x + halfHeight, y: y + halfWidth },\n { x: x + halfHeight, y: y - halfWidth },\n { x: x - halfHeight, y },\n ],\n top: [\n { x, y: y - halfHeight },\n { x: x - halfWidth, y: y + halfHeight },\n { x: x + halfWidth, y: y + halfHeight },\n { x, y: y - halfHeight },\n ],\n bottom: [\n { x, y: y + halfHeight },\n { x: x - halfWidth, y: y - halfHeight },\n { x: x + halfWidth, y: y - halfHeight },\n { x, y: y + halfHeight },\n ],\n }\n\n return silkscreenTriangleRoutes[side]\n}\nexport const breakoutheaders = (\n raw_params: breakoutheaders_def,\n): { circuitJson: AnyCircuitElement[]; parameters: any } => {\n const params = breakoutheaders_def.parse(raw_params)\n const height = params.h ?? getHeight(params)\n const holes: PcbPlatedHole[] = []\n const innerDiameter = params.id\n const outerDiameter = params.od\n let silkscreenTriangleRoutes: { x: number; y: number }[] = []\n if (params.right) {\n const yoff = -((params.right - 1) / 2) * params.p\n for (let i = 0; i < params.right; i++) {\n if (i === 0 && !params.left && !params.bottom) {\n silkscreenTriangleRoutes = getTrianglePath(\n params.w / 2 + outerDiameter * 1.4,\n yoff + i * params.p,\n \"right\",\n )\n }\n holes.push(\n platedhole(\n i + 1 + params.left + (params.bottom ?? 0),\n params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n if (params.left) {\n const yoff = -((params.left - 1) / 2) * params.p\n for (let i = 0; i < params.left; i++) {\n if (i === params.left - 1) {\n silkscreenTriangleRoutes = getTrianglePath(\n -params.w / 2 - outerDiameter * 1.4,\n yoff + i * params.p,\n \"left\",\n )\n }\n holes.push(\n platedhole(\n i + 1,\n -params.w / 2,\n yoff + i * params.p,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n if (params.top) {\n const xoff = -((params.top - 1) / 2) * params.p\n for (let i = 0; i < params.top; i++) {\n if (\n i === params.top - 1 &&\n !params.left &&\n !params.bottom &&\n !params.right\n ) {\n silkscreenTriangleRoutes = getTrianglePath(\n xoff + i * params.p,\n height / 2 + outerDiameter * 1.4,\n \"top\",\n )\n }\n holes.push(\n platedhole(\n i + 1 + params.right + (params.bottom ?? 0) + params.left,\n xoff + i * params.p,\n height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n if (params.bottom) {\n const xoff = -((params.bottom - 1) / 2) * params.p\n for (let i = 0; i < params.bottom; i++) {\n if (i === 0 && !params.left) {\n silkscreenTriangleRoutes = getTrianglePath(\n xoff + i * params.p,\n -height / 2 - outerDiameter * 1.4,\n \"bottom\",\n )\n }\n holes.push(\n platedhole(\n i + 1 + params.left,\n xoff + i * params.p,\n -height / 2,\n innerDiameter,\n outerDiameter,\n ),\n )\n }\n }\n\n const silkscreenTriangle: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"1\",\n pcb_component_id: \"1\",\n layer: \"top\",\n route: silkscreenTriangleRoutes,\n stroke_width: 0.1,\n }\n\n const silkscreenPath: PcbSilkscreenPath = {\n type: \"pcb_silkscreen_path\",\n pcb_silkscreen_path_id: \"pcb_silkscreen_path_1\",\n pcb_component_id: \"1\",\n route: [\n {\n x: -params.w / 2 - outerDiameter,\n y: height / 2 + outerDiameter,\n },\n {\n x: params.w / 2 + outerDiameter,\n y: height / 2 + outerDiameter,\n },\n {\n x: params.w / 2 + outerDiameter,\n y: -height / 2 - outerDiameter,\n },\n {\n x: -params.w / 2 - outerDiameter,\n y: -height / 2 - outerDiameter,\n },\n {\n x: -params.w / 2 - outerDiameter,\n y: height / 2 + outerDiameter,\n },\n ],\n stroke_width: 0.1,\n layer: \"top\",\n }\n const silkscreenRefText: SilkscreenRef = silkscreenRef(\n 0,\n height / 1.7,\n height / 25,\n )\n return {\n circuitJson: [\n ...holes,\n silkscreenPath,\n silkscreenRefText,\n silkscreenTriangle,\n ],\n parameters: params,\n }\n}\n","export function isNotNull<T>(value: T | null): value is T {\n return value !== null\n}\n","import * as FOOTPRINT_FN from \"./fn\"\nimport type { AnySoupElement } from \"circuit-json\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport type { AnyFootprinterDefinitionOutput } from \"./helpers/zod/AnyFootprinterDefinitionOutput\"\nimport { isNotNull } from \"./helpers/is-not-null\"\n\nexport type FootprinterParamsBuilder<K extends string> = {\n [P in K | \"params\" | \"soup\"]: P extends \"params\" | \"soup\"\n ? Footprinter[P]\n : (v?: number | string) => FootprinterParamsBuilder<K>\n}\n\ntype CommonPassiveOptionKey =\n | \"metric\"\n | \"imperial\"\n | \"tht\"\n | \"p\"\n | \"pw\"\n | \"ph\"\n | \"w\"\n | \"h\"\n\nexport type Footprinter = {\n dip: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n cap: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n res: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n diode: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n led: () => FootprinterParamsBuilder<CommonPassiveOptionKey>\n lr: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"l\" | \"pl\" | \"pr\">\n qfp: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\" | \"wide\" | \"narrow\">\n quad: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\n \"w\" | \"l\" | \"square\" | \"pl\" | \"pr\" | \"pb\" | \"pt\" | \"p\" | \"pw\" | \"ph\"\n >\n bga: (\n num_pins?: number,\n ) => FootprinterParamsBuilder<\n \"grid\" | \"p\" | \"w\" | \"h\" | \"ball\" | \"pad\" | \"missing\"\n >\n qfn: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n soic: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"p\" | \"id\" | \"od\">\n mlp: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"p\">\n ssop: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n tssop: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n dfn: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"p\">\n pinrow: (num_pins?: number) => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n axial: () => FootprinterParamsBuilder<\"p\" | \"id\" | \"od\">\n sot235: () => FootprinterParamsBuilder<\"h\" | \"p\" | \"pl\" | \"pw\">\n lqfp: (num_pins?: number) => FootprinterParamsBuilder<\"w\" | \"h\" | \"pl\" | \"pw\">\n pushbutton: () => FootprinterParamsBuilder<\n \"tllabel\" | \"trlabel\" | \"bllabel\" | \"brlabel\"\n >\n stampboard: () => FootprinterParamsBuilder<\n | \"w\"\n | \"h\"\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"p\"\n | \"pw\"\n | \"pl\"\n | \"innerhole\"\n | \"innerholeedgedistance\"\n >\n stampreceiver: () => FootprinterParamsBuilder<\n | \"w\"\n | \"h\"\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"p\"\n | \"pw\"\n | \"pl\"\n | \"innerhole\"\n | \"innerholeedgedistance\"\n >\n breakoutheaders: () => FootprinterParamsBuilder<\n \"w\" | \"h\" | \"left\" | \"right\" | \"top\" | \"bottom\" | \"p\" | \"id\" | \"od\"\n >\n\n params: () => any\n /** @deprecated use circuitJson() instead */\n soup: () => AnySoupElement[]\n circuitJson: () => AnyCircuitElement[]\n json: () => AnyFootprinterDefinitionOutput[]\n getFootprintNames: () => string[]\n}\n\nexport const string = (def: string): Footprinter => {\n let fp = footprinter()\n\n // special case: 0402, 0603, etc.\n if ((def.length === 4 || def.length === 5) && /^\\d+$/.test(def))\n def = `res${def}`\n\n const def_parts = def\n .split(\"_\")\n .map((s) => {\n const m = s.match(/([a-z]+)([\\(\\d\\.\\+\\?].*)?/)\n const [_, fn, v] = m ?? []\n if (v?.includes(\"?\")) return null\n return { fn: m?.[1]!, v: m?.[2]! }\n })\n .filter(isNotNull)\n\n for (const { fn, v } of def_parts) {\n fp = fp[fn](v)\n }\n\n fp.setString(def)\n\n return fp\n}\n\nexport const getFootprintNames = (): string[] => {\n return Object.keys(FOOTPRINT_FN)\n}\n\nexport const getFootprintNamesByType = (): {\n passiveFootprints: string[]\n normalFootprints: string[]\n} => {\n const allFootprints = Object.keys(FOOTPRINT_FN)\n\n const passiveFootprints = allFootprints.filter((name) => {\n const fn = FOOTPRINT_FN[name]\n\n return fn.toString().includes(\"passive(\")\n })\n\n return {\n passiveFootprints,\n normalFootprints: allFootprints.filter(\n (name) => !passiveFootprints.includes(name),\n ),\n }\n}\n\nexport const footprinter = (): Footprinter & {\n string: typeof string\n getFootprintNames: string[]\n setString: (string) => void\n} => {\n const proxy = new Proxy(\n {},\n {\n get: (target: any, prop: string) => {\n // console.log(prop, target)\n if (prop === \"soup\" || prop === \"circuitJson\") {\n if (\"fn\" in target && FOOTPRINT_FN[target.fn]) {\n return () => FOOTPRINT_FN[target.fn](target).circuitJson\n }\n\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n\n return () => {\n // TODO improve error\n throw new Error(\n `No function found for footprinter, make sure to specify .dip, .lr, .p, etc. Got \"${prop}\"`,\n )\n }\n }\n if (prop === \"json\") {\n if (!FOOTPRINT_FN[target.fn]) {\n throw new Error(\n `Invalid footprint function, got \"${target.fn}\"${\n target.string ? `, from string \"${target.string}\"` : \"\"\n }`,\n )\n }\n return () => FOOTPRINT_FN[target.fn](target).parameters\n }\n if (prop === \"getFootprintNames\") {\n return () => Object.keys(FOOTPRINT_FN)\n }\n if (prop === \"params\") {\n // TODO\n return () => target\n }\n if (prop === \"setString\") {\n return (v: string) => {\n target.string = v\n return proxy\n }\n }\n return (v: any) => {\n if (Object.keys(target).length === 0) {\n if (`${prop}${v}` in FOOTPRINT_FN) {\n target[`${prop}${v}`] = true\n target.fn = `${prop}${v}`\n } else {\n target[prop] = true\n target.fn = prop\n if (prop === \"res\" || prop === \"cap\") {\n if (v) {\n target.imperial = v // res0402, cap0603 etc.\n }\n } else {\n target.num_pins = Number.isNaN(Number.parseFloat(v))\n ? undefined\n : Number.parseFloat(v)\n }\n }\n } else {\n // handle dip_w or other invalid booleans\n if (!v && [\"w\", \"h\", \"p\"].includes(prop as string)) {\n // ignore\n } else {\n target[prop] = v ?? true\n }\n }\n return proxy\n }\n },\n },\n )\n return proxy as any\n}\nfootprinter.string = string\nfootprinter.getFootprintNames = getFootprintNames\n\nexport const fp = footprinter\n"],"mappings":"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","names":["mm","z","length","z","length","mm","z","length","distance","z","z","z","distance","length","z","length","z","length","z","length","z","z","length","z","z","z","length","z","length","length","z","z","length","z","length","z","length","z","z","length","length","z","z","length","length","z","z","length","length","z","z","length","getHeight","getTriangleDir","z","z","length","z","z","length","getHeight","fp"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/footprinter",
3
3
  "type": "module",
4
- "version": "0.0.98",
4
+ "version": "0.0.100",
5
5
  "description": "",
6
6
  "main": "dist/index.js",
7
7
  "files": [