diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8d30786..16240a6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -193,3 +193,26 @@ jobs: core/src/two_way.cpp core/src/timecode.cpp core/src/chirp.cpp core/src/detect.cpp core/src/g711.cpp \ -framework Foundation -o /tmp/avsync-calibration-math /tmp/avsync-calibration-math + + calibrator: + # Calibrator board: firmware build, host tests, KiCad ERC/DRC (hardware/calibrator). + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + - name: packages + run: | + sudo apt-get update + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gcc-riscv64-unknown-elf picolibc-riscv64-unknown-elf make + - name: firmware (CH32X035, RISC-V) + working-directory: hardware/calibrator/firmware + run: | + make test + make CROSS=riscv64-unknown-elf- EXTRA_CFLAGS="-isystem /usr/lib/picolibc/riscv64-unknown-elf/include" + - name: ERC and DRC (KiCad 9.0.9) + working-directory: hardware/calibrator + run: | + docker run --rm -u "$(id -u):$(id -g)" -e HOME=/tmp -v "$PWD:/work" -w /work kicad/kicad:9.0.9 \ + sh -c 'kicad-cli sch erc --severity-error --exit-code-violations -o /tmp/erc.rpt calibrator.kicad_sch && + kicad-cli sch export netlist --format kicadsexpr -o /tmp/cal.net calibrator.kicad_sch && + python3 scripts/check_netlist.py /tmp/cal.net && + kicad-cli pcb drc --severity-error --exit-code-violations -o /tmp/drc.rpt calibrator.kicad_pcb' diff --git a/CHANGELOG.md b/CHANGELOG.md index 96ee94b..41bf3da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## Hardware (in development) + +- Calibrator board v0.3 under `hardware/calibrator/` (signal contract in + `docs/calibrator.md`): KiCad 9 project, JLCPCB files, CH32X035 firmware with host + tests. USB-C powered by the phone (no battery, no cables supplied); the firmware never + enables USB, so a phone only supplies power, and it can be updated over USB-C with the + BOOT button and open tools (wchisp, chprog). Comparator with hysteresis for the sensor + pair, 1 nF sensor filters. AVsync logo on both sides (gold ENIG copper, white silk, + black mask), QR code to the project site. Board files CERN-OHL-P-2.0, firmware MIT. + A first batch of 10 is ordered; not tested yet. + ## Mobile (not released yet) - Test signal (iPhone and Android) no longer stops by itself about 5 minutes diff --git a/docs/calibration.md b/docs/calibration.md index 7abe920..0a46595 100644 --- a/docs/calibration.md +++ b/docs/calibration.md @@ -9,7 +9,7 @@ The rig is an LED and a piezo on one microcontroller pin. Parts and firmware are ## With the calibrator The calibrator is a small board with an LED, a buzzer and two light sensors -([signal contract](calibrator.md)). The phone powers it over a USB-C cable. +([signal contract](calibrator.md), [hardware](../hardware/calibrator/README.md)). The phone powers it over a USB-C cable. In the app: **Settings → With calibrator** (iPhone and Android; the clap calibration stays as it is). Three steps: diff --git a/hardware/calibrator/.gitignore b/hardware/calibrator/.gitignore new file mode 100644 index 0000000..49e3036 --- /dev/null +++ b/hardware/calibrator/.gitignore @@ -0,0 +1,9 @@ +*.rpt +*.dsn +*.ses +*-backups/ +fp-info-cache +*.kicad_prl +fab/gerbers/ +fab/calibrator-pos.csv +__pycache__/ diff --git a/hardware/calibrator/3d/LED_reverse_1206.wrl b/hardware/calibrator/3d/LED_reverse_1206.wrl new file mode 100644 index 0000000..72fb822 --- /dev/null +++ b/hardware/calibrator/3d/LED_reverse_1206.wrl @@ -0,0 +1,3 @@ +#VRML V2.0 utf8 +Transform { translation 0.0000 0.0000 0.0551 children [ Shape { appearance Appearance { material Material { diffuseColor 0.9 0.9 0.85 } } geometry Box { size 1.2598 0.6299 0.1102 } } ] } +Transform { translation 0.0000 0.0000 -0.1024 children [ Shape { appearance Appearance { material Material { diffuseColor 1 1 0.6 } } geometry Box { size 0.7323 0.5512 0.2047 } } ] } diff --git a/hardware/calibrator/3d/MLT-8530.wrl b/hardware/calibrator/3d/MLT-8530.wrl new file mode 100644 index 0000000..5633a38 --- /dev/null +++ b/hardware/calibrator/3d/MLT-8530.wrl @@ -0,0 +1,3 @@ +#VRML V2.0 utf8 +Transform { translation 0.0000 0.0000 0.5906 children [ Shape { appearance Appearance { material Material { diffuseColor 0.08 0.08 0.08 } } geometry Box { size 3.3465 3.3465 1.1811 } } ] } +Transform { translation -1.7126 0.0000 0.5906 children [ Shape { appearance Appearance { material Material { diffuseColor 0.3 0.3 0.3 } } geometry Box { size 0.1181 0.4724 0.3937 } } ] } diff --git a/hardware/calibrator/3d/QSOP-28.wrl b/hardware/calibrator/3d/QSOP-28.wrl new file mode 100644 index 0000000..dd13bff --- /dev/null +++ b/hardware/calibrator/3d/QSOP-28.wrl @@ -0,0 +1,31 @@ +#VRML V2.0 utf8 +Transform { translation 0.0000 0.0000 0.3346 children [ Shape { appearance Appearance { material Material { diffuseColor 0.12 0.12 0.12 } } geometry Box { size 1.5354 3.8976 0.5906 } } ] } +Transform { translation -0.4528 1.6929 0.6378 children [ Shape { appearance Appearance { material Material { diffuseColor 0.6 0.6 0.6 } } geometry Box { size 0.1969 0.1969 0.0197 } } ] } +Transform { translation -0.9646 1.6250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 1.6250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 1.3750 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 1.3750 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 1.1250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 1.1250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 0.8750 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 0.8750 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 0.6250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 0.6250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 0.3750 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 0.3750 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 0.1250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 0.1250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 -0.1250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 -0.1250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 -0.3750 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 -0.3750 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 -0.6250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 -0.6250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 -0.8750 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 -0.8750 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 -1.1250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 -1.1250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 -1.3750 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 -1.3750 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation -0.9646 -1.6250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } +Transform { translation 0.9646 -1.6250 0.0984 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4331 0.0984 0.0787 } } ] } diff --git a/hardware/calibrator/3d/TS-1187A.wrl b/hardware/calibrator/3d/TS-1187A.wrl new file mode 100644 index 0000000..86526ea --- /dev/null +++ b/hardware/calibrator/3d/TS-1187A.wrl @@ -0,0 +1,7 @@ +#VRML V2.0 utf8 +Transform { translation 0.0000 0.0000 0.2953 children [ Shape { appearance Appearance { material Material { diffuseColor 0.85 0.85 0.85 } } geometry Box { size 2.0079 2.0079 0.5906 } } ] } +Transform { translation 0.0000 0.0000 0.6299 children [ Shape { appearance Appearance { material Material { diffuseColor 0.15 0.15 0.15 } } geometry Box { size 1.1811 1.1811 0.1181 } } ] } +Transform { translation -1.1417 -0.7382 0.0394 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4724 0.2756 0.0787 } } ] } +Transform { translation -1.1417 0.7382 0.0394 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4724 0.2756 0.0787 } } ] } +Transform { translation 1.1417 -0.7382 0.0394 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4724 0.2756 0.0787 } } ] } +Transform { translation 1.1417 0.7382 0.0394 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4724 0.2756 0.0787 } } ] } diff --git a/hardware/calibrator/3d/VEMT2500X01_RGW.wrl b/hardware/calibrator/3d/VEMT2500X01_RGW.wrl new file mode 100644 index 0000000..00902ac --- /dev/null +++ b/hardware/calibrator/3d/VEMT2500X01_RGW.wrl @@ -0,0 +1,5 @@ +#VRML V2.0 utf8 +Transform { translation 0.0000 0.0000 0.3150 children [ Shape { appearance Appearance { material Material { diffuseColor 0.75 0.8 0.85 } } geometry Box { size 0.9055 0.9055 0.6299 } } ] } +Transform { translation 0.0000 0.0000 -0.2283 children [ Shape { appearance Appearance { material Material { diffuseColor 0.7 0.75 0.8 } } geometry Box { size 0.7087 0.7087 0.4606 } } ] } +Transform { translation -0.9843 0.0000 0.0394 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4724 0.1575 0.0787 } } ] } +Transform { translation 0.9843 0.0000 0.0394 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } } geometry Box { size 0.4724 0.1575 0.0787 } } ] } diff --git a/hardware/calibrator/LICENSE-CERN-OHL-P-2.0.txt b/hardware/calibrator/LICENSE-CERN-OHL-P-2.0.txt new file mode 100644 index 0000000..4fe041e --- /dev/null +++ b/hardware/calibrator/LICENSE-CERN-OHL-P-2.0.txt @@ -0,0 +1,199 @@ +CERN Open Hardware Licence Version 2 - Permissive + + +Preamble + +CERN has developed this licence to promote collaboration among +hardware designers and to provide a legal tool which supports the +freedom to use, study, modify, share and distribute hardware designs +and products based on those designs. Version 2 of the CERN Open +Hardware Licence comes in three variants: this licence, CERN-OHL-P +(permissive); and two reciprocal licences: CERN-OHL-W (weakly +reciprocal) and CERN-OHL-S (strongly reciprocal). + +The CERN-OHL-P is copyright CERN 2020. Anyone is welcome to use it, in +unmodified form only. + +Use of this Licence does not imply any endorsement by CERN of any +Licensor or their designs nor does it imply any involvement by CERN in +their development. + + +1 Definitions + + 1.1 'Licence' means this CERN-OHL-P. + + 1.2 'Source' means information such as design materials or digital + code which can be applied to Make or test a Product or to + prepare a Product for use, Conveyance or sale, regardless of its + medium or how it is expressed. It may include Notices. + + 1.3 'Covered Source' means Source that is explicitly made available + under this Licence. + + 1.4 'Product' means any device, component, work or physical object, + whether in finished or intermediate form, arising from the use, + application or processing of Covered Source. + + 1.5 'Make' means to create or configure something, whether by + manufacture, assembly, compiling, loading or applying Covered + Source or another Product or otherwise. + + 1.6 'Notice' means copyright, acknowledgement and trademark notices, + references to the location of any Notices, modification notices + (subsection 3.3(b)) and all notices that refer to this Licence + and to the disclaimer of warranties that are included in the + Covered Source. + + 1.7 'Licensee' or 'You' means any person exercising rights under + this Licence. + + 1.8 'Licensor' means a person who creates Source or modifies Covered + Source and subsequently Conveys the resulting Covered Source + under the terms and conditions of this Licence. A person may be + a Licensee and a Licensor at the same time. + + 1.9 'Convey' means to communicate to the public or distribute. + + +2 Applicability + + 2.1 This Licence governs the use, copying, modification, Conveying + of Covered Source and Products, and the Making of Products. By + exercising any right granted under this Licence, You irrevocably + accept these terms and conditions. + + 2.2 This Licence is granted by the Licensor directly to You, and + shall apply worldwide and without limitation in time. + + 2.3 You shall not attempt to restrict by contract or otherwise the + rights granted under this Licence to other Licensees. + + 2.4 This Licence is not intended to restrict fair use, fair dealing, + or any other similar right. + + +3 Copying, Modifying and Conveying Covered Source + + 3.1 You may copy and Convey verbatim copies of Covered Source, in + any medium, provided You retain all Notices. + + 3.2 You may modify Covered Source, other than Notices. + + You may only delete Notices if they are no longer applicable to + the corresponding Covered Source as modified by You and You may + add additional Notices applicable to Your modifications. + + 3.3 You may Convey modified Covered Source (with the effect that You + shall also become a Licensor) provided that You: + + a) retain Notices as required in subsection 3.2; and + + b) add a Notice to the modified Covered Source stating that You + have modified it, with the date and brief description of how + You have modified it. + + 3.4 You may Convey Covered Source or modified Covered Source under + licence terms which differ from the terms of this Licence + provided that You: + + a) comply at all times with subsection 3.3; and + + b) provide a copy of this Licence to anyone to whom You + Convey Covered Source or modified Covered Source. + + +4 Making and Conveying Products + +You may Make Products, and/or Convey them, provided that You ensure +that the recipient of the Product has access to any Notices applicable +to the Product. + + +5 DISCLAIMER AND LIABILITY + + 5.1 DISCLAIMER OF WARRANTY -- The Covered Source and any Products + are provided 'as is' and any express or implied warranties, + including, but not limited to, implied warranties of + merchantability, of satisfactory quality, non-infringement of + third party rights, and fitness for a particular purpose or use + are disclaimed in respect of any Source or Product to the + maximum extent permitted by law. The Licensor makes no + representation that any Source or Product does not or will not + infringe any patent, copyright, trade secret or other + proprietary right. The entire risk as to the use, quality, and + performance of any Source or Product shall be with You and not + the Licensor. This disclaimer of warranty is an essential part + of this Licence and a condition for the grant of any rights + granted under this Licence. + + 5.2 EXCLUSION AND LIMITATION OF LIABILITY -- The Licensor shall, to + the maximum extent permitted by law, have no liability for + direct, indirect, special, incidental, consequential, exemplary, + punitive or other damages of any character including, without + limitation, procurement of substitute goods or services, loss of + use, data or profits, or business interruption, however caused + and on any theory of contract, warranty, tort (including + negligence), product liability or otherwise, arising in any way + in relation to the Covered Source, modified Covered Source + and/or the Making or Conveyance of a Product, even if advised of + the possibility of such damages, and You shall hold the + Licensor(s) free and harmless from any liability, costs, + damages, fees and expenses, including claims by third parties, + in relation to such use. + + +6 Patents + + 6.1 Subject to the terms and conditions of this Licence, each + Licensor hereby grants to You a perpetual, worldwide, + non-exclusive, no-charge, royalty-free, irrevocable (except as + stated in this section 6, or where terminated by the Licensor + for cause) patent licence to Make, have Made, use, offer to + sell, sell, import, and otherwise transfer the Covered Source + and Products, where such licence applies only to those patent + claims licensable by such Licensor that are necessarily + infringed by exercising rights under the Covered Source as + Conveyed by that Licensor. + + 6.2 If You institute patent litigation against any entity (including + a cross-claim or counterclaim in a lawsuit) alleging that the + Covered Source or a Product constitutes direct or contributory + patent infringement, or You seek any declaration that a patent + licensed to You under this Licence is invalid or unenforceable + then any rights granted to You under this Licence shall + terminate as of the date such process is initiated. + + +7 General + + 7.1 If any provisions of this Licence are or subsequently become + invalid or unenforceable for any reason, the remaining + provisions shall remain effective. + + 7.2 You shall not use any of the name (including acronyms and + abbreviations), image, or logo by which the Licensor or CERN is + known, except where needed to comply with section 3, or where + the use is otherwise allowed by law. Any such permitted use + shall be factual and shall not be made so as to suggest any kind + of endorsement or implication of involvement by the Licensor or + its personnel. + + 7.3 CERN may publish updated versions and variants of this Licence + which it considers to be in the spirit of this version, but may + differ in detail to address new problems or concerns. New + versions will be published with a unique version number and a + variant identifier specifying the variant. If the Licensor has + specified that a given variant applies to the Covered Source + without specifying a version, You may treat that Covered Source + as being released under any version of the CERN-OHL with that + variant. If no variant is specified, the Covered Source shall be + treated as being released under CERN-OHL-S. The Licensor may + also specify that the Covered Source is subject to a specific + version of the CERN-OHL or any later version in which case You + may apply this or any later version of CERN-OHL with the same + variant identifier published by CERN. + + 7.4 This Licence shall not be enforceable except by a Licensor + acting as such, and third party beneficiary rights are + specifically excluded. diff --git a/hardware/calibrator/README.md b/hardware/calibrator/README.md new file mode 100644 index 0000000..9025184 --- /dev/null +++ b/hardware/calibrator/README.md @@ -0,0 +1,247 @@ +# AV Sync calibrator board + + + +**Status: v0.3 proposal, in development. Not ordered, not built, not tested.** + +A small giveaway board (66 × 22 mm) for the AVsync app. The phone powers it over a +USB-C to USB-C cable. **No cable comes with the board: the user needs their own.** +It calibrates: + +- **camera mode**: a phone's camera against its microphone (LED flash + click together), +- **display mode**: a sending screen against its speaker (the board clicks when the + screen pattern swaps). + +The board picks the mode from its two light sensors. What the app must do is in +[`docs/calibrator.md`](../../docs/calibrator.md). The firmware can be updated over the +same USB-C socket from a PC (see [Update over USB](#update-over-usb)). + +![top](renders/calibrator-top.png) +![bottom](renders/calibrator-bottom.png) + +Black solder mask, ENIG finish: the orange parts of the AVsync logo (waveform and the +ring in the middle) are bare gold copper; the rest of the logo is white silkscreen. The +bottom has a QR code to . + +Schematic: [`renders/calibrator-schematic.pdf`](renders/calibrator-schematic.pdf) +(also [SVG](renders/calibrator.svg)). 3D view: [`renders/calibrator-3d.png`](renders/calibrator-3d.png). + +## How it works (short) + +- **MCU**: WCH CH32X035G8R6 (RISC-V, QSOP-28). It runs straight from the phone's 5 V + (2–5.5 V; 3.0–5.3 V while USB is used); 10 Ω + 1 µF/100 nF filter spikes. No regulator, + no crystal. +- **USB-C, 16 pins**: 5.1 kΩ on CC1/CC2 so the phone turns on 5 V. D+/D− go to the MCU + (PC17/PC16) **only for firmware updates**. The firmware never turns the USB block or its + D+ pull-up on, so a phone sees no USB device: no "accessory not supported" message and + no audio route change. +- **BOOT button** SW1 (update mode): connects D+ (PC17) to VDD through 4.7 kΩ (R9). The ROM bootloader + starts only at power-on and only if PC17 is high then (CH32X035 datasheet, pin note 8). +- **Flash and click**: white LED (PA4, ~12 mA) and buzzer transistor (PA5) are on the same + port, so one register write starts both. +- **Light sensors**: two phototransistors feed comparator 3 (PA13 +, PA2 −, hysteresis on). + It flips at the crossing point of a black/white swap. 22 kΩ + 1 nF per sensor + (τ ≈ 22 µs) delays that point by only ~15 µs, the same on both sensors. The ADC reads the same nodes (PA0, + PA2) for dark/light and to check that a flip is real. PB3 is the comparator output + (used inside the firmware) and must stay unconnected. + +### Choices on the update path + +- **No 10 kΩ pull-down on D+.** It was meant to stop a dumb wall charger (which may put + ~2.7 V on D+) from starting the bootloader. That case is harmless (the board just waits + in update mode until unplugged; the phone use case is not affected, because a phone holds + D+ low with its own 15 kΩ). A pull-down would also fight the button: with the PC's 15 kΩ + in parallel, D+ would only reach about 2.8 V when the button is pressed, too close to the + unknown input threshold. Without it D+ reaches ~3.8 V with a PC attached and 5 V without. +- **R9 = 4.7 kΩ** (as on community CH32X035 boards) limits the current into D+ to well under + 1 mA while the button is held. +- **No ESD part on D+/D−.** USB is only used for the occasional update, the MCU pins have + their own protection, and an extra extended part costs $3.07 per order plus ~$0.04/board + (+$0.35/board on the 10-board test). Revisit if boards fail. + +## Mechanics: why holes through the board + +The LED must touch the camera lens and the sensors must lie flat on the screen, but the +buzzer (3 mm) and the USB-C receptacle (3.2 mm) are much taller than an LED. + +| Option | Cost per order | Result | +| --- | --- | --- | +| **Chosen: all parts on top, LED and sensors look down through holes, bottom side flat** | 0 extra; sensors cost ~$0.40/board more than normal ones | flat bottom touches lens and screen; one-side Economic PCBA | +| Two-sided assembly (LED + sensors on the bottom) | Standard PCBA: setup $51.12 instead of $8.18, stencil $16.42, fixtures $41 (100 pcs), $0.48/board minimum | ≈ +$1.00/board at 100 | +| LED and sensors on the top, board lies parts-down | 0 | does not lie flat: buzzer and plug are 3 mm tall | + +Parts that make the hole idea work, all in JLC stock: + +- **LED**: XINGLIGHT XL-3216UWC-FB, a white *reverse-mount* 1206 LED. Its lens sits in a + 2.1 × 1.7 mm cut-out and shines through the board. Lite-On LTW-C230DS (C575513) fits the + same footprint as a second source. +- **Sensors**: Vishay VEMT2500X01, a *reverse-gullwing* phototransistor (visible + IR, + ±15°). The body sits on top, the dome lens looks down through a 2.3 mm hole. With a + **1.2 mm board** the lens ends flush with the bottom. VEMT2000X01 is the same package. +- **USB-C at the far end**: the cable plug is thicker than the board and sticks out + ~0.5 mm below the bottom. It sits ~55 mm away from the LED and sensors, so the board tilts + less than 1° and the LED end stays flat on the lens or screen. + +Look and markings: + +- **Logo** on both sides, from `assets/app-icon.svg`: on the top centred in the free area + between the BOOT button and the USB-C, on the bottom in the middle of the board, 11 mm, + beside the QR code; the short instructions sit at the LED/sensor end. Cyan and white strokes are silkscreen. + The orange parts are copper with a solder-mask opening and no paste, so with ENIG they look + gold. That copper has no net; keep-outs keep tracks and vias away from it. Like in the + icon, the white dashed centre line and the white centre dot lie on top of the gold: the + copper and its mask opening are cut away under them, because JLC removes silkscreen from + bare copper. On the bottom the logo and QR are mirrored so they read right from below. +- **QR code** (bottom): `https://leeo86.github.io/mxl-avsync/`. Version 3-M, 0.45 mm modules + (3× JLC's 0.153 mm minimum line), 4-module quiet zone, white silkscreen on black mask + (normal polarity), no via holes inside. Checked: zxing-cpp decodes the bottom render, also + at 1/3 size. Matrix: `scripts/qr_matrix.txt` (from `scripts/gen_qr.py`, needs `segno`). +- **Text**: one font; name 1.8–2.0 mm, sub-lines 1.0–1.2 mm, and JLC's minimum + (1.0 mm / 0.153 mm stroke) for "not a toy", the licence (small, below the MCU); "BOOT" under SW1 (1.2 mm bold). +- **Alignment**: LED circle, `A`/`B`, the split line (on the top next to the LED and again + behind the buzzer, so it is visible while the board lies face down) and a half-round notch + in the board edge on the split line. Marks on both sides. +- iPhone camera bumps: the lens rings stand higher than the bump plate. The board rests on + the ring of the lens under the LED circle; hold it lightly or tape it. The buzzer sits + next to the LED (5 mm), sound port pointing at the LED, close to the rear microphone. +- No company name on the board. Ground copper on both layers stops light going sideways + through the board; no vias at the optics end. + +## BOM (JLCPCB/LCSC, live stock and prices checked 2026-11-08) + +USD per part at the order quantity of 10 and 100 boards. Ext = extended part +($3.07 feeder fee per type, Economic PCBA). + +| Ref | Part | LCSC | Lib | Qty | Stock | $ @10 | $ @100 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| U1 | CH32X035G8R6, QSOP-28 | C49118551 | Ext | 1 | 800 | 0.4351 | 0.3304 | +| Q2, Q3 | VEMT2500X01 phototransistor, reverse gullwing | C3210911 | Ext | 2 | 782 | 0.3141 | 0.2306 | +| BZ1 | MLT-8530 magnetic buzzer 8.5 × 8.5 × 3 mm | C94599 | Ext | 1 | 137,398 | 0.2015 | 0.158 | +| J1 | TYPE-C 16P receptacle (SHOU HAN), USB 2.0 | C393939 | Ext | 1 | 366,678 | 0.0691 | 0.0553 | +| D1 | XL-3216UWC-FB white LED, reverse mount | C3646935 | Ext | 1 | 111,067 | 0.0164 | 0.0164 | +| SW1 | TS-1187A tact switch 5.1 × 5.1 mm (update) | C318884 | Basic | 1 | 871,253 | 0.0207 | 0.0207 | +| Q1 | S8050 NPN, SOT-23 | C2146 | Basic | 1 | 1.45 M | 0.0141 | 0.0141 | +| D2 | 1N4148WS, SOD-323 | C2128 | Basic | 1 | 2.8 M | 0.011 | 0.011 | +| C1 | 10 µF 25 V 0805 | C15850 | Basic | 1 | 8.7 M | 0.0359 | 0.0359 | +| C2 | 1 µF 0402 | C52923 | Basic | 1 | 11.5 M | 0.0058 | 0.0058 | +| C3 | 100 nF 0402 | C1525 | Basic | 1 | 34.2 M | 0.0031 | 0.0031 | +| C4, C5 | 1 nF 0402 | C1523 | Basic | 2 | 2.3 M | 0.0038 | 0.0038 | +| R1, R2 | 5.1 kΩ 0402 | C25905 | Basic | 2 | 4.5 M | 0.0023 | 0.0023 | +| R3 | 10 Ω 0402 | C25077 | Basic | 1 | 3.6 M | 0.001 | 0.001 | +| R4 | 150 Ω 0603 | C22808 | Basic | 1 | 1.3 M | 0.0015 | 0.0015 | +| R5 | 1 kΩ 0402 | C11702 | Basic | 1 | 33.7 M | 0.0013 | 0.0013 | +| R6 | 100 kΩ 0402 | C25741 | Basic | 1 | 8.8 M | 0.0012 | 0.0012 | +| R7, R8 | 22 kΩ 0402 | C25768 | Basic | 2 | 1.0 M | 0.0012 | 0.0012 | +| R9 | 4.7 kΩ 0402 | C25900 | Basic | 1 | 15.7 M | 0.0017 | 0.0017 | + +**Parts per board: $1.80 @10, $1.16 @100.** Stock covers the 10 + 100 boards (U1: 800, +sensors: 782 for 220 needed). Reserve them in the JLC parts library before ordering. + +## Cost (both orders, CHF, everything included, no cables) + +Assumptions: Economic PCBA fees from the JLC price page (setup $8.18, stencil $1.53, +5 extended types × $3.07, 95 joints × $0.0016, Confirm Parts Placement $0.45); PCB 2-layer +66 × 22 mm, 1.2 mm, **ENIG, black mask** [estimate: $21 for 10, $42 for 100; JLC's PCB price +only comes from their JavaScript calculator]; DHL $20 / $30 [estimate]; 1 USD = 0.80 CHF; +Swiss import VAT 8.1 % (only when ≥ CHF 5) + DHL clearance CHF 11.50 + 3 %. + +| | Test, 10 boards | Run, 100 boards | +| --- | --- | --- | +| Parts | $18.0 | $116.0 | +| PCBA fees | $27.0 | $40.7 | +| PCB with ENIG + black | ~$21 | ~$42 | +| DHL | ~$20 | ~$30 | +| Subtotal | $86 → CHF 69 | $229 → CHF 183 | +| VAT 8.1 % + DHL clearance | CHF 5.6 + 11.7 | CHF 14.8 + 11.9 | +| **Total** | **≈ CHF 86 (CHF 8.60/board)** | **≈ CHF 210 (CHF 2.10/board)** | + +**Both orders: ≈ CHF 296**, just under the CHF 300 budget. No programmer is needed (update +over USB-C). No cables are included. Ways to get more margin: JLC Global Standard Direct +instead of DHL (−CHF 10–20), or HASL instead of ENIG on the test batch (−~CHF 15; also stays +under the VAT limit). Run the real JLC quote with `fab/calibrator-gerbers.zip` before ordering. + +## Update over USB + +The CH32X035 has a USB bootloader in ROM, so the board cannot be bricked and needs no +programmer. + +1. Unplug the board. Hold the **BOOT** button (SW1). +2. Plug the board into a PC (USB-C to USB-C, or USB-A to C). Release after about a second. +3. The board shows up as a WCH ISP device. Flash with an open tool: + - [`wchisp`](https://github.com/ch32-rs/wchisp) (Rust, GPL-2.0): `wchisp flash firmware/build/calibrator.bin` + - or `chprog.py` from [wagiminator/MCU-Flash-Tools](https://github.com/wagiminator/MCU-Flash-Tools) (MIT). +4. Unplug and plug in again: the new firmware runs. + +A **blank chip** (as delivered by JLC) always starts the bootloader, so the first flash +needs no button. Linux needs a udev rule for the WCH device; see the +[firmware README](firmware/README.md). In normal use (no button) the phone never sees a +USB device. + +## Files + +| Path | What | +| --- | --- | +| `calibrator.kicad_pro/.kicad_sch/.kicad_pcb` | KiCad 9 project | +| `calibrator.kicad_sym` | custom CH32X035G8R6 symbol with pins grouped by use | +| `calibrator.pretty/` | custom footprints (buzzer, reverse LED, reverse-gullwing sensor) | +| `3d/` | simple box 3D models for the renders (KiCad 9's image has none for some parts; renders only, not used for assembly) | +| `fab/calibrator-gerbers.zip` | gerbers + drill for JLCPCB (order **1.2 mm**, **ENIG**, **black** mask, white silk) | +| `fab/calibrator-bom-jlc.csv`, `fab/calibrator-cpl-jlc.csv` | JLC BOM and pick-and-place files | +| `renders/` | PNG renders, schematic PDF/SVG | +| `scripts/` | generators: `design.py` (parts, nets, placement) → schematic (`gen_sch.py`, drawn in code), board (`gen_pcb.py`), fab files; `check_netlist.py` checks the drawn schematic against `design.py` | +| `firmware/` | CH32X035 firmware + host tests ([README](firmware/README.md)) | + +### Rebuild + +Needs docker only (pinned images `kicad/kicad:9.0.9-full`, `ghcr.io/freerouting/freerouting:2.1.0`). + +```sh +scripts/build.sh # footprints, schematic + netlist check, placement, autoroute, ground stitching, ERC, DRC +scripts/fab.sh # gerbers, drill, BOM, CPL, renders, schematic PDF/SVG +``` + +The autorouter does not give the same tracks every run; the committed board is the +checked one. + +### Checks + +- ERC: 0 violations. Netlist check: the schematic wires give exactly the nets in `design.py`. +- DRC: 0 violations, 0 unconnected (JLC rules: 0.15 mm track/space, 0.3/0.6 mm vias, + 0.3 mm copper to board edge). +- Footprints match the datasheets (U1: QSOP-28 3.9 × 9.9 mm, 0.635 mm pitch, pin 1 top left; + the USB-C uses KiCad's HRO TYPE-C-31-M-12 footprint, same pad layout as the SHOU HAN + C393939 drawing). +- CPL rotations: JLC's 0° is the orientation of its own footprint for each part, which is + not always KiCad's. `scripts/jlc_files.py` adds the known offsets for the stock footprints + (QSOP-28 +270°, SOT-23 −90°, HRO USB-C +180°; values from the community list of JLC + corrections, e.g. matthewlai/JLCKicadTools). Custom footprints (buzzer, reverse LED, + sensors) and the button keep KiCad's rotation. Still check every part in JLC's placement + preview before ordering (or use "Confirm Parts Placement"); JLC also places by the pin-1 + and polarity marks in the silkscreen. + +## Risks and open points + +1. **Phone powers the board?** A sink with 5.1 kΩ Rd is the standard USB-C way to ask for + 5 V. iPhone 15+ and most Android phones supply it. To test with real phones, including + that no "accessory" message appears with D+/D− wired to the MCU. +2. **Bootloader entry**: R9/SW1 values follow community boards, not a WCH document; one + user reports an "unknown device" when powered only from USB-C. Test on the first board. +3. **Comparator interrupt path** (comparator 3 → PB3 → EXTI) and the ADC/clock register + setup are written from the datasheet, ch32fun and WCH EVT, not tested on hardware. +4. **Buzzer delay** from coil-on to sound is unknown (expect 0.05–0.3 ms). Measure once. +5. **Sensor signal** on dim screens (22 kΩ load) and room light entering the clear sensor + bodies from above (both sensors alike, mostly cancels). +6. **LED fit**: the reverse LED lens (1.86 × 1.4 mm) has only ~0.1 mm room in the cut-out. +7. **Stock**: U1 800 and sensors 782 at JLC; enough for 110 boards, not for many more. +8. **VDD with USB**: the datasheet allows 3.0–5.3 V while USB runs; a PC port at the top of + the USB range (5.25 V) is just inside. + +## Licence + +- **Board** (KiCad project, footprints, 3D models, scripts, fab files, renders and the logo + artwork on the board): **CERN-OHL-P-2.0**, see + [`LICENSE-CERN-OHL-P-2.0.txt`](LICENSE-CERN-OHL-P-2.0.txt). + `SPDX-License-Identifier: CERN-OHL-P-2.0`. It is printed small on the top silkscreen. + CERN-OHL-S-2.0 (share-alike: changed boards must stay open) would be the alternative. +- **Firmware** (`firmware/`): MIT, like the rest of the repository. Vendored register + definitions come from ch32fun (MIT); see [`firmware/vendor/README.md`](firmware/vendor/README.md). diff --git a/hardware/calibrator/calibrator.kicad_pcb b/hardware/calibrator/calibrator.kicad_pcb new file mode 100644 index 0000000..c5ca176 --- /dev/null +++ b/hardware/calibrator/calibrator.kicad_pcb @@ -0,0 +1,12550 @@ +(kicad_pcb + (version 20241229) + (generator "pcbnew") + (generator_version "9.0") + (general + (thickness 1.2) + (legacy_teardrops no) + ) + (paper "A4") + (layers + (0 "F.Cu" signal) + (2 "B.Cu" signal) + (9 "F.Adhes" user "F.Adhesive") + (11 "B.Adhes" user "B.Adhesive") + (13 "F.Paste" user) + (15 "B.Paste" user) + (5 "F.SilkS" user "F.Silkscreen") + (7 "B.SilkS" user "B.Silkscreen") + (1 "F.Mask" user) + (3 "B.Mask" user) + (17 "Dwgs.User" user "User.Drawings") + (19 "Cmts.User" user "User.Comments") + (21 "Eco1.User" user "User.Eco1") + (23 "Eco2.User" user "User.Eco2") + (25 "Edge.Cuts" user) + (27 "Margin" user) + (31 "F.CrtYd" user "F.Courtyard") + (29 "B.CrtYd" user "B.Courtyard") + (35 "F.Fab" user) + (33 "B.Fab" user) + (39 "User.1" user) + (41 "User.2" user) + (43 "User.3" user) + (45 "User.4" user) + ) + (setup + (stackup + (layer "F.SilkS" + (type "Top Silk Screen") + (color "White") + ) + (layer "F.Paste" + (type "Top Solder Paste") + ) + (layer "F.Mask" + (type "Top Solder Mask") + (color "Black") + (thickness 0.01) + ) + (layer "F.Cu" + (type "copper") + (thickness 0.035) + ) + (layer "dielectric 1" + (type "core") + (thickness 1.11) + (material "FR4") + (epsilon_r 4.5) + (loss_tangent 0.02) + ) + (layer "B.Cu" + (type "copper") + (thickness 0.035) + ) + (layer "B.Mask" + (type "Bottom Solder Mask") + (color "Black") + (thickness 0.01) + ) + (layer "B.Paste" + (type "Bottom Solder Paste") + ) + (layer "B.SilkS" + (type "Bottom Silk Screen") + (color "White") + ) + (copper_finish "ENIG") + (dielectric_constraints no) + ) + (pad_to_mask_clearance 0) + (allow_soldermask_bridges_in_footprints no) + (tenting front back) + (pcbplotparams + (layerselection 0x00000000_00000000_55555555_5755f5ff) + (plot_on_all_layers_selection 0x00000000_00000000_00000000_00000000) + (disableapertmacros no) + (usegerberextensions no) + (usegerberattributes yes) + (usegerberadvancedattributes yes) + (creategerberjobfile yes) + (dashed_line_dash_ratio 12.000000) + (dashed_line_gap_ratio 3.000000) + (svgprecision 4) + (plotframeref no) + (mode 1) + (useauxorigin no) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15.000000) + (pdf_front_fp_property_popups yes) + (pdf_back_fp_property_popups yes) + (pdf_metadata yes) + (pdf_single_document no) + (dxfpolygonmode yes) + (dxfimperialunits yes) + (dxfusepcbnewfont yes) + (psnegative no) + (psa4output no) + (plot_black_and_white yes) + (sketchpadsonfab no) + (plotpadnumbers no) + (hidednponfab no) + (sketchdnponfab yes) + (crossoutdnponfab yes) + (subtractmaskfromsilk no) + (outputformat 1) + (mirror no) + (drillshape 1) + (scaleselection 1) + (outputdirectory "") + ) + ) + (net 0 "") + (net 1 "BOOT") + (net 2 "BUZ_B") + (net 3 "BUZ_DRV") + (net 4 "BUZ_N") + (net 5 "CC1") + (net 6 "CC2") + (net 7 "DM") + (net 8 "DP") + (net 9 "GND") + (net 10 "LED_A") + (net 11 "LED_DRV") + (net 12 "SENS_A") + (net 13 "SENS_B") + (net 14 "VBUS") + (net 15 "VDD") + (footprint "Resistor_SMD:R_0402_1005Metric" + (layer "F.Cu") + (uuid "07828d2b-4eeb-4f42-9e4f-cbb22e121321") + (at 124.4 119.6) + (descr "Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "resistor") + (property "Reference" "R6" + (at 0 -1.17 0) + (layer "F.Fab") + (uuid "8d775f7a-fbd0-4ac8-be12-2400b602b363") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "100k" + (at 0 1.17 0) + (layer "F.Fab") + (uuid "66e2f994-300d-4eb8-96e6-98cc918f5e22") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "3c708250-3630-4492-9920-c8d8b841fff0") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "d60ea37a-b920-4d34-91a6-553f1d2e5e24") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C25741" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "015ddf67-868a-46ae-8daf-c499ad9ecd6d") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.153641 -0.38) + (end 0.153641 -0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "593d78ed-a0bb-4585-986e-b61f207aabb3") + ) + (fp_line + (start -0.153641 0.38) + (end 0.153641 0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "6a3b891b-35d4-442e-a147-8465c6fef34c") + ) + (fp_rect + (start -0.93 -0.47) + (end 0.93 0.47) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "2e8783d5-0b89-4600-8a3d-2fab5d6894c5") + ) + (fp_rect + (start -0.525 -0.27) + (end 0.525 0.27) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "96d5b5d6-f8c7-4428-bc2d-8b0119b3e4a6") + ) + (fp_text user "${REFERENCE}" + (at 0 0 0) + (layer "F.Fab") + (uuid "f228864b-bd84-40f2-a19f-1a6968f894cd") + (effects + (font + (size 0.26 0.26) + (thickness 0.04) + ) + ) + ) + (pad "1" smd roundrect + (at -0.51 0) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 2 "BUZ_B") + (uuid "2485a3ad-8cc5-4355-9f4c-1c664d5b6e6b") + ) + (pad "2" smd roundrect + (at 0.51 0) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 9 "GND") + (uuid "3b7792c8-1fed-453c-bce2-1bcaca219650") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0402_1005Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Button_Switch_SMD:SW_Push_1P1T_XKB_TS-1187A" + (layer "F.Cu") + (uuid "27c04bbd-46e8-4d8c-b6ae-9f4df034f306") + (at 140.5 106) + (descr "SMD Tactile Switch, http://www.helloxkb.com/public/images/pdf/TS-1187A-X-X-X.pdf") + (tags "SPST Tactile Switch") + (property "Reference" "SW1" + (at 0 -3.75 0) + (layer "F.Fab") + (uuid "e9e3fb86-a712-4c77-be2d-cc4900d1f562") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "TS-1187A (BOOT)" + (at 0 3.75 0) + (layer "F.Fab") + (uuid "371ee147-7b54-40a6-9cb4-6c2446268057") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "ab8e7c08-5d89-4a8d-9757-39260b498be7") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "210b7a27-18b6-493d-9361-029a780e220d") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C318884" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "52218168-0f8c-4354-a152-092039f9cea2") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -2.75 -1) + (end -2.75 1) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "ae3f8f2b-2bfc-48ad-ae1f-e170f5f483f9") + ) + (fp_line + (start -1.75 -2.3) + (end -1.3 -2.75) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "c68de916-8e0d-4b1a-a14a-ed2ec6f44cd5") + ) + (fp_line + (start -1.75 2.3) + (end -1.3 2.75) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "6f21b8b5-8d51-483d-81f8-bf503a8a2042") + ) + (fp_line + (start -1.3 -2.75) + (end 1.3 -2.75) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "98b05a6b-13bf-4dae-bf29-3c09b91662dc") + ) + (fp_line + (start -1.3 2.75) + (end 1.3 2.75) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "e46dbe38-bc03-46f0-9173-2b088cf0f13f") + ) + (fp_line + (start 1.75 -2.3) + (end 1.3 -2.75) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "1ab17a96-a0df-464e-8b91-0dba57dcb7ed") + ) + (fp_line + (start 1.75 2.3) + (end 1.3 2.75) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "f990d8be-0dc6-482f-a8c7-7868aaf2ab14") + ) + (fp_line + (start 2.75 -1) + (end 2.75 1) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "b1929e63-68aa-431e-a493-ab8945e48605") + ) + (fp_line + (start -3.75 -2.8) + (end 3.75 -2.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "ae00380f-882f-4b4f-9d33-36641d386666") + ) + (fp_line + (start -3.75 2.8) + (end -3.75 -2.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "91f02a04-627b-4c0b-beb9-9a90b24c1d1b") + ) + (fp_line + (start 3.75 -2.8) + (end 3.75 2.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "34961336-4865-4a42-8571-58369a57f368") + ) + (fp_line + (start 3.75 2.8) + (end -3.75 2.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "4cab20b7-834b-4ef0-9dd0-081bfd69d03d") + ) + (fp_line + (start -2.9 -2.1) + (end -2.9 -1.6) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "8b70d3b6-0b5d-4c14-8c77-8fa222929cc9") + ) + (fp_line + (start -2.9 2.1) + (end -2.9 1.6) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "d9f4f92a-7be5-478f-92de-df9bfcdb2124") + ) + (fp_line + (start -2.4 -1.4) + (end -1.4 -2.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "0ed41b2b-4053-4184-990f-50d54316cb7c") + ) + (fp_line + (start -2.4 -1.25) + (end -2.4 -1.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "7f6e4ed8-b538-4700-a577-bd114145bf27") + ) + (fp_line + (start -2.4 1.4) + (end -2.4 1.25) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "c4ff28be-8360-4258-903d-7827184ec967") + ) + (fp_line + (start -1.4 -2.4) + (end -1.25 -2.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "b49a4cfc-a913-42de-a914-bf8f9f57a03a") + ) + (fp_line + (start -1.4 2.4) + (end -2.4 1.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "b64a2b09-684b-48a0-a495-3810ce6849c0") + ) + (fp_line + (start -1.25 2.4) + (end -1.4 2.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "003ba07a-ffd3-41fd-bd7b-235aa0992327") + ) + (fp_line + (start 1.25 -2.4) + (end 1.4 -2.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "f7e2c8a1-7f4b-4ea9-b3c4-38ef104aed8d") + ) + (fp_line + (start 1.4 -2.4) + (end 2.4 -1.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "59a2702a-9121-4179-81ad-715a4bf52018") + ) + (fp_line + (start 1.4 2.4) + (end 1.25 2.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "3c990e3b-e3d9-4e8f-aa93-512092d278d4") + ) + (fp_line + (start 2.4 -1.4) + (end 2.4 -1.25) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "00e078ba-ecf9-4894-9f7e-24710b9dc1af") + ) + (fp_line + (start 2.4 1.25) + (end 2.4 1.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "f3ce9b86-fa65-4e1b-8d8b-685e1830c214") + ) + (fp_line + (start 2.4 1.4) + (end 1.4 2.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "6d00623d-0b13-43ea-8654-814860db14ad") + ) + (fp_line + (start 2.9 -2.1) + (end 2.9 -1.6) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "a07b1cc3-59f1-4356-ae94-3f16a641c8c1") + ) + (fp_line + (start 2.9 2.1) + (end 2.9 1.6) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "8334f7ea-1aa2-4708-a332-73354662c397") + ) + (fp_circle + (center 0 0) + (end 1 0) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "f9d3529e-6133-49e0-851c-ceb7f2e29460") + ) + (fp_poly + (pts + (xy -1.7 -2.1) (xy -2.2 -1.6) (xy -3.25 -1.6) (xy -3.25 -2.1) + ) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "5ca38dea-f7d5-410d-889f-ab8c53181064") + ) + (fp_poly + (pts + (xy -1.7 2.1) (xy -2.2 1.6) (xy -3.25 1.6) (xy -3.25 2.1) + ) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "62e9d694-57e0-4359-931d-3667b5315412") + ) + (fp_poly + (pts + (xy 1.7 -2.1) (xy 2.2 -1.6) (xy 3.25 -1.6) (xy 3.25 -2.1) + ) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "994e1723-0d5f-4c88-932c-99d0357c5c80") + ) + (fp_poly + (pts + (xy 1.7 2.1) (xy 2.2 1.6) (xy 3.25 1.6) (xy 3.25 2.1) + ) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "30c15edd-acab-425e-8b90-d68b343f17f0") + ) + (fp_poly + (pts + (xy 0.85 -1.85) (xy 1.85 -0.85) (xy 1.85 0.85) (xy 0.85 1.85) (xy -0.85 1.85) (xy -1.85 0.85) (xy -1.85 -0.85) + (xy -0.85 -1.85) + ) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "760a07dc-318d-4745-972a-69f21c6a1352") + ) + (fp_poly + (pts + (xy -1.25 -2.55) (xy 1.25 -2.55) (xy 1.25 -1.975) (xy 1.575 -1.975) (xy 1.975 -1.575) (xy 1.975 -1.25) + (xy 2.55 -1.25) (xy 2.55 1.25) (xy 1.975 1.25) (xy 1.975 1.575) (xy 1.575 1.975) (xy 1.25 1.975) + (xy 1.25 2.55) (xy -1.25 2.55) (xy -1.25 1.975) (xy -1.575 1.975) (xy -1.975 1.575) (xy -1.975 1.25) + (xy -2.55 1.25) (xy -2.55 -1.25) (xy -1.975 -1.25) (xy -1.975 -1.575) (xy -1.575 -1.975) (xy -1.25 -1.975) + ) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "12e388d4-e7d6-4ff0-96ff-189502992f7d") + ) + (fp_text user "${REFERENCE}" + (at 0 -3.75 0) + (layer "F.Fab") + (uuid "f1528427-5e42-4a44-9900-cdbfefdd692d") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" smd rect + (at -3 -1.875) + (size 1 0.75) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 1 "BOOT") + (uuid "ef6f3371-64c0-41d0-893b-a18290621a67") + ) + (pad "1" smd rect + (at 3 -1.875) + (size 1 0.75) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 1 "BOOT") + (uuid "e810e254-d43e-44cd-9bb0-25f86a9d77aa") + ) + (pad "2" smd rect + (at -3 1.875) + (size 1 0.75) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 15 "VDD") + (uuid "3e6384ca-029f-486c-8181-889fd25de91c") + ) + (pad "2" smd rect + (at 3 1.875) + (size 1 0.75) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 15 "VDD") + (uuid "c108e665-ec81-474f-86cd-d3e61a50842b") + ) + (embedded_fonts no) + (model "${KIPRJMOD}/3d/TS-1187A.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Resistor_SMD:R_0402_1005Metric" + (layer "F.Cu") + (uuid "290396a8-2e7f-4e3d-9d24-c2bd696586bc") + (at 156.6 115 90) + (descr "Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "resistor") + (property "Reference" "R2" + (at 0 -1.17 90) + (layer "F.Fab") + (uuid "616c4c58-6a6b-42eb-962f-66be34e0cabc") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "5.1k" + (at 0 1.17 90) + (layer "F.Fab") + (uuid "c69daaeb-2bd5-424c-b31f-64d481bd59c3") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "0732bd4c-1971-4a94-97f0-e1e1a46e29a3") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "90058b31-135d-4aa6-8452-448ecc2f1c82") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C25905" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "17700340-ffe7-40c8-b8aa-5551a6a50204") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.153641 -0.38) + (end 0.153641 -0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "4efff164-317a-438d-b768-8e006236a0a7") + ) + (fp_line + (start -0.153641 0.38) + (end 0.153641 0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "70e35034-b547-4ee1-a2e4-884814dabcbf") + ) + (fp_rect + (start -0.93 -0.47) + (end 0.93 0.47) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "f514b61a-8397-43fd-ba2f-59ae9de7bfbf") + ) + (fp_rect + (start -0.525 -0.27) + (end 0.525 0.27) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "903d1665-f81a-4a65-abb9-8cc88fd8977e") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "b364ff4c-708e-4a9f-a593-764b135b8daa") + (effects + (font + (size 0.26 0.26) + (thickness 0.04) + ) + ) + ) + (pad "1" smd roundrect + (at -0.51 0 90) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 6 "CC2") + (uuid "f0250eb7-8f84-4f8b-a632-538fefeced21") + ) + (pad "2" smd roundrect + (at 0.51 0 90) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 9 "GND") + (uuid "663ef5f8-b534-4e8d-ad2b-2be713dbecf8") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0402_1005Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Resistor_SMD:R_0402_1005Metric" + (layer "F.Cu") + (uuid "36db2f3e-081c-4acb-862c-33eb584cd4c1") + (at 124.4 115.4 90) + (descr "Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "resistor") + (property "Reference" "R5" + (at 0 -1.17 90) + (layer "F.Fab") + (uuid "93d24245-6d96-411b-8a83-e8308260e7fd") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "1k" + (at 0 1.17 90) + (layer "F.Fab") + (uuid "7e4d813c-d4c7-47e0-983a-7e0c22ae1ae3") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "73dcc267-490e-41a8-a649-91b62806d1ee") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "e7a689fb-3315-4ceb-bf0e-2a7df9f5a7af") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C11702" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "4a62d153-cd50-48ff-9fda-237c7083f498") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.153641 -0.38) + (end 0.153641 -0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "a497c94f-502b-42cc-8104-90bd54a70383") + ) + (fp_line + (start -0.153641 0.38) + (end 0.153641 0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "e9d1aba0-b920-4107-b99e-9ba6f91ec41e") + ) + (fp_rect + (start -0.93 -0.47) + (end 0.93 0.47) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "230e03b6-461b-4fd8-a9b3-9e7fd1d0015b") + ) + (fp_rect + (start -0.525 -0.27) + (end 0.525 0.27) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "600cd512-cdb7-4a27-9feb-01e05116962f") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "974db476-3395-4325-a3fe-c4195a5320ae") + (effects + (font + (size 0.26 0.26) + (thickness 0.04) + ) + ) + ) + (pad "1" smd roundrect + (at -0.51 0 90) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 3 "BUZ_DRV") + (uuid "77771b44-2f5f-4db6-b8fb-cb9b0ea1f190") + ) + (pad "2" smd roundrect + (at 0.51 0 90) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 2 "BUZ_B") + (uuid "904f1d30-1cca-46c9-880b-68592310d740") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0402_1005Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Resistor_SMD:R_0402_1005Metric" + (layer "F.Cu") + (uuid "3c5e5133-e20f-49b9-bdff-0e3c93d717c8") + (at 134.3 102.4) + (descr "Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "resistor") + (property "Reference" "R3" + (at 0 -1.17 0) + (layer "F.Fab") + (uuid "832c63df-14c4-4665-989e-d65499d917a3") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "10" + (at 0 1.17 0) + (layer "F.Fab") + (uuid "24a213c3-708f-47e5-96c2-f237b50a7e66") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "97145a24-5f6b-40a3-b2f4-c8202c40869b") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "51f44796-a767-4f3f-b682-643a20b3c9c6") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C25077" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "db72a1e1-7900-4fb4-8558-8115929c828c") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.153641 -0.38) + (end 0.153641 -0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "2fd2bfba-fc9c-4255-8fee-f960875e81ed") + ) + (fp_line + (start -0.153641 0.38) + (end 0.153641 0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "b67c3ea2-1dfd-468e-a405-c868e256b84a") + ) + (fp_rect + (start -0.93 -0.47) + (end 0.93 0.47) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "fe55d859-abf7-48d9-b64a-8a7cb3b4adea") + ) + (fp_rect + (start -0.525 -0.27) + (end 0.525 0.27) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "a98e7bfd-29bb-49d1-9e62-0a9d71ef2278") + ) + (fp_text user "${REFERENCE}" + (at 0 0 0) + (layer "F.Fab") + (uuid "2175b94d-7e66-4b51-bca5-5d4a4c873912") + (effects + (font + (size 0.26 0.26) + (thickness 0.04) + ) + ) + ) + (pad "1" smd roundrect + (at -0.51 0) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 14 "VBUS") + (uuid "4093b458-74d1-4771-8e07-42dd62bdc745") + ) + (pad "2" smd roundrect + (at 0.51 0) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 15 "VDD") + (uuid "ad700fcf-e4e6-4ea8-80c3-22fda2d9d4ea") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0402_1005Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "calibrator:Buzzer_MLT-8530" + (layer "F.Cu") + (uuid "3ca9db10-f868-440b-8818-71c45e897eb8") + (at 114.6 111 180) + (descr "Magnetic buzzer Huaneng MLT-8530 8.5x8.5x3mm SMD, sound port on +x side, datasheet LCSC C94599") + (property "Reference" "BZ1" + (at 0 -5.6 180) + (layer "F.Fab") + (uuid "741a0d70-e8ed-48fb-a1db-26564a11a726") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "Value" "MLT-8530" + (at 0 5.6 180) + (layer "F.Fab") + (uuid "0f0f5fc7-edfc-4153-990c-8bb331d534c4") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 180) + (layer "F.Fab") + (hide yes) + (uuid "b13c7306-3fca-46fb-948d-3f1ec5605474") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "Description" "" + (at 0 0 180) + (layer "F.Fab") + (hide yes) + (uuid "5741b633-8037-4d05-80a4-b54947a54a08") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "LCSC" "C94599" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "40aec76f-26f5-46ff-b2b0-60a4876a433f") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start 4.35 -2.2) + (end 4.35 2.2) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "e1c1c63b-cbac-4ad3-a826-3b56b7ebeb51") + ) + (fp_line + (start 3.6 0) + (end 3.1 0.4) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "d74582b9-2a25-4c71-b962-c14e2410d355") + ) + (fp_line + (start 3.6 0) + (end 3.1 -0.4) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "2d9d7366-e496-4520-9a9b-d6ba569516d6") + ) + (fp_line + (start 2.6 0) + (end 3.6 0) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "9bf84f0d-1a3c-4f84-837c-17f39558aa06") + ) + (fp_line + (start -2.2 4.35) + (end 2.2 4.35) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "140a9010-f9ac-45f1-8459-89f684fa6144") + ) + (fp_line + (start -2.2 -4.35) + (end 2.2 -4.35) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "73f1ea9c-ac3e-4636-a964-f29f6435bf91") + ) + (fp_line + (start -4.35 -2.2) + (end -4.35 2.2) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "0f1c220a-322f-4b88-8ebf-69dd6e8ec6d5") + ) + (fp_line + (start -5.25 -3.9) + (end -5.25 -3.2) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "138d6c4f-30a8-4968-a889-869199d818a4") + ) + (fp_line + (start -5.6 -3.55) + (end -4.9 -3.55) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "ec7bf93a-e900-424b-b444-5fed942874a0") + ) + (fp_line + (start 5 5) + (end -5 5) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "d2756064-f066-4fc7-a97b-08baff84c65f") + ) + (fp_line + (start 5 -5) + (end 5 5) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "eb106929-92ad-4cc4-a519-5c7e985987dd") + ) + (fp_line + (start -5 5) + (end -5 -5) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "533a06ed-1909-44f9-aadd-385a92f3bce9") + ) + (fp_line + (start -5 -5) + (end 5 -5) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "6b99c9f9-7eb5-42aa-9cdb-55c795f1d96f") + ) + (fp_line + (start 4.25 4.25) + (end -4.25 4.25) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "a97e5b45-8dfb-4ded-aa80-9579c4555415") + ) + (fp_line + (start 4.25 -4.25) + (end 4.25 4.25) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "3d35da8c-f66e-490c-b245-9b99e3a75b35") + ) + (fp_line + (start -4.25 4.25) + (end -4.25 -4.25) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "da0af827-10bf-4595-a9f7-7e3a0c26bd50") + ) + (fp_line + (start -4.25 -4.25) + (end 4.25 -4.25) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "44b4f726-45d6-4167-948e-54d0a55b7f2e") + ) + (pad "" smd roundrect + (at 3.55 -3.55 180) + (size 2.3 2.3) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.15) + (uuid "f9a9b968-e344-4abd-93c9-4346d176c104") + ) + (pad "" smd roundrect + (at 3.55 3.55 180) + (size 2.3 2.3) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.15) + (uuid "b60b0221-434c-46f3-aaf2-5d129cd73a12") + ) + (pad "1" smd roundrect + (at -3.55 -3.55 180) + (size 2.3 2.3) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.15) + (net 14 "VBUS") + (uuid "2a7d8d62-55be-4e44-9060-c59bdf27e4fe") + ) + (pad "2" smd roundrect + (at -3.55 3.55 180) + (size 2.3 2.3) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.15) + (net 4 "BUZ_N") + (uuid "730e3190-0dbb-48a3-8e49-c48e57ec6c56") + ) + (embedded_fonts no) + (model "${KIPRJMOD}/3d/MLT-8530.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Capacitor_SMD:C_0402_1005Metric" + (layer "F.Cu") + (uuid "408f798e-34c4-43e8-b917-d54252cb3df7") + (at 135 112 90) + (descr "Capacitor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C3" + (at 0 -1.16 90) + (layer "F.Fab") + (uuid "d0d59b4b-17b5-43e7-be55-5a29aa0ac301") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "100n" + (at 0 1.16 90) + (layer "F.Fab") + (uuid "5ddd9253-c779-434a-a560-e297127f0a4f") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "566258db-b757-4da5-ab51-a1e56612157d") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "6e53a63d-be8a-4680-ba0e-56cb7561178c") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C1525" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "e9e72b82-410d-4983-9237-1aca8a5b04f6") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.107836 -0.36) + (end 0.107836 -0.36) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "5db9f1e0-3bbb-4f65-a9a4-25fbe527cae0") + ) + (fp_line + (start -0.107836 0.36) + (end 0.107836 0.36) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "54c2240f-6061-438e-a1d7-7ce95d094f31") + ) + (fp_rect + (start -0.91 -0.46) + (end 0.91 0.46) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "fb3f459f-0a12-44e5-8166-104769d27372") + ) + (fp_rect + (start -0.5 -0.25) + (end 0.5 0.25) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "326c1f5a-d309-4a10-bfd5-23b093cf45ac") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "9fe43a1c-8917-424e-99ef-f23a6d1a53fc") + (effects + (font + (size 0.25 0.25) + (thickness 0.04) + ) + ) + ) + (pad "1" smd roundrect + (at -0.48 0 90) + (size 0.56 0.62) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 15 "VDD") + (uuid "27be8af0-96f8-416d-ae89-fe0eee038050") + ) + (pad "2" smd roundrect + (at 0.48 0 90) + (size 0.56 0.62) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 9 "GND") + (uuid "1be9905b-f327-403a-b679-51e203c88e30") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0402_1005Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Resistor_SMD:R_0402_1005Metric" + (layer "F.Cu") + (uuid "4ab6a9f5-d613-4834-8efd-e48f467fae9f") + (at 140.5 116.6 90) + (descr "Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "resistor") + (property "Reference" "R9" + (at 0 -1.17 90) + (layer "F.Fab") + (uuid "98b0e5fa-3d15-41c6-97d3-cc97559a92e8") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "4.7k" + (at 0 1.17 90) + (layer "F.Fab") + (uuid "015db927-7dde-42eb-abc6-0d690b827044") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "cf138a72-01f8-44eb-a6f9-fad343764484") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "8f975621-2653-4c4f-952e-f85e05ba24ee") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C25900" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "1be52af3-4dc5-4a62-b89e-78ef7559360e") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.153641 -0.38) + (end 0.153641 -0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "e0d0f740-30c1-4b83-8ca8-3fa7c26f603e") + ) + (fp_line + (start -0.153641 0.38) + (end 0.153641 0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "d7478ca9-b4dc-4d72-a007-e370ee34a4eb") + ) + (fp_rect + (start -0.93 -0.47) + (end 0.93 0.47) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "68ac429d-5a53-4d23-a993-afe96bccf958") + ) + (fp_rect + (start -0.525 -0.27) + (end 0.525 0.27) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "ed5f9c09-8d16-4246-b1d9-32cde6451629") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "e624b978-a16e-41fb-851b-f43b5ec8b5ec") + (effects + (font + (size 0.26 0.26) + (thickness 0.04) + ) + ) + ) + (pad "1" smd roundrect + (at -0.51 0 90) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 8 "DP") + (uuid "99b5b33d-2aeb-4634-85ce-c0965da03603") + ) + (pad "2" smd roundrect + (at 0.51 0 90) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 1 "BOOT") + (uuid "e99b40bb-c112-4c9e-81d4-78f2fa3d03d8") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0402_1005Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Diode_SMD:D_SOD-323" + (layer "F.Cu") + (uuid "4b4ceef3-f970-4d3a-a025-8ed380e9d2a9") + (at 121.6 104.3 90) + (descr "SOD-323") + (tags "SOD-323") + (property "Reference" "D2" + (at 0 -1.85 90) + (layer "F.Fab") + (uuid "4d19ee8f-3e71-4c1d-863a-394fcfbc1b34") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "1N4148WS" + (at 0.1 1.9 90) + (layer "F.Fab") + (uuid "ae07001f-43aa-448e-a6d9-5e7fc86318de") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "683c2df0-0015-403e-a6de-540fe0d50305") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "8934a8e3-3b1e-45b6-912d-8326fdf34525") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C2128" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "b2b6d013-248c-4972-9308-549813f50e7c") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -1.61 -0.85) + (end 1.05 -0.85) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "52f4ffd4-7270-4e66-847d-fa4f36be99d9") + ) + (fp_line + (start -1.61 -0.85) + (end -1.61 0.85) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "8e8a0c6a-1176-49a7-af2d-31f79db8855e") + ) + (fp_line + (start -1.61 0.85) + (end 1.05 0.85) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "0d69ee2e-324b-4de7-af9e-3a15ddaa8bb4") + ) + (fp_line + (start 1.6 -0.95) + (end 1.6 0.95) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "7a2b0511-dfb2-49f7-ba31-954bb1dc1e93") + ) + (fp_line + (start -1.6 -0.95) + (end 1.6 -0.95) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "eb3da3dd-40c2-4ce5-90ba-c7d4f7653c26") + ) + (fp_line + (start -1.6 -0.95) + (end -1.6 0.95) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "9565b78e-54bd-484d-bf6f-6f37fc13ad1e") + ) + (fp_line + (start -1.6 0.95) + (end 1.6 0.95) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "eabc2a0e-490b-4add-ac46-8cab87ccdb3b") + ) + (fp_line + (start 0.9 -0.7) + (end 0.9 0.7) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "a77dbe40-f270-4d3e-b2f8-482b8561915c") + ) + (fp_line + (start -0.9 -0.7) + (end 0.9 -0.7) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "3d3e0bba-698a-4375-9439-1b4329457daf") + ) + (fp_line + (start 0.2 -0.35) + (end 0.2 0.35) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "10fb315f-f0cc-4d9e-9c7b-0d8f42c90934") + ) + (fp_line + (start -0.3 -0.35) + (end -0.3 0.35) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "1815a50f-1649-4e28-8979-14d348d8e0cd") + ) + (fp_line + (start 0.2 0) + (end 0.45 0) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "5f947790-8872-4dd7-83b4-3fe7610a76d0") + ) + (fp_line + (start -0.3 0) + (end 0.2 -0.35) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "cbd47cf8-0bcc-4fab-81ef-0692bcdc49f4") + ) + (fp_line + (start -0.3 0) + (end -0.5 0) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "c04eafae-3d49-4e87-9e48-204e9b3e5e30") + ) + (fp_line + (start 0.2 0.35) + (end -0.3 0) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "383ff968-d006-4230-adc7-04f73f609c42") + ) + (fp_line + (start 0.9 0.7) + (end -0.9 0.7) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "add09da1-c1bd-4c8f-8282-94834f1dae14") + ) + (fp_line + (start -0.9 0.7) + (end -0.9 -0.7) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "6ef691da-3f2e-4c4d-8107-cbf17a573ae9") + ) + (fp_text user "${REFERENCE}" + (at 0 -1.85 90) + (layer "F.Fab") + (uuid "6107400e-f337-4627-9e5b-8197949aa3ce") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" smd roundrect + (at -1.05 0 90) + (size 0.6 0.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 14 "VBUS") + (uuid "7f839482-2000-49ce-a861-6b46fb9db27d") + ) + (pad "2" smd roundrect + (at 1.05 0 90) + (size 0.6 0.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 4 "BUZ_N") + (uuid "8214c98b-6ba9-441e-a39d-9ac36c948276") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Diode_SMD.3dshapes/D_SOD-323.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Capacitor_SMD:C_0402_1005Metric" + (layer "F.Cu") + (uuid "5010c2e7-cb6b-4bd1-a031-ab65098bf9af") + (at 135 108.4 90) + (descr "Capacitor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C4" + (at 0 -1.16 90) + (layer "F.Fab") + (uuid "5e17fa7e-60ca-468d-8b93-aea1ac88f3df") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "1n" + (at 0 1.16 90) + (layer "F.Fab") + (uuid "2728666e-7674-411e-b11c-09a4097f0a27") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "fb5f98b0-5939-42f9-b9d3-bdbe4c8b8365") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "5609fca7-3f5f-4274-b6a3-a5fc9690fc6b") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C1523" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "558ba612-9dcc-4fb9-9122-11b34be5e14d") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.107836 -0.36) + (end 0.107836 -0.36) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "5e47bf92-e8e2-4154-8e82-fb10c714c5aa") + ) + (fp_line + (start -0.107836 0.36) + (end 0.107836 0.36) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "a98f8ad3-b943-418c-83d7-3d384b403eb5") + ) + (fp_rect + (start -0.91 -0.46) + (end 0.91 0.46) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "54366c30-5874-4273-8dde-761b3d6558d7") + ) + (fp_rect + (start -0.5 -0.25) + (end 0.5 0.25) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "3ed0ad37-c773-4e35-9f32-5d92b6f1d2b5") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "6d79c267-106c-4da1-a0cd-7b67562c813c") + (effects + (font + (size 0.25 0.25) + (thickness 0.04) + ) + ) + ) + (pad "1" smd roundrect + (at -0.48 0 90) + (size 0.56 0.62) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 12 "SENS_A") + (uuid "e001917f-d9d6-483e-93d5-16ba06fe3789") + ) + (pad "2" smd roundrect + (at 0.48 0 90) + (size 0.56 0.62) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 9 "GND") + (uuid "69db524c-8771-4989-86f1-b45cc4e9be89") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0402_1005Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Resistor_SMD:R_0603_1608Metric" + (layer "F.Cu") + (uuid "7b47f4a0-10a6-413f-90d4-bcc976ffeeed") + (at 123.2 109.6 90) + (descr "Resistor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "resistor") + (property "Reference" "R4" + (at 0 -1.43 90) + (layer "F.Fab") + (uuid "003e88cb-1c39-497b-88c8-2471555c17ab") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "150" + (at 0 1.43 90) + (layer "F.Fab") + (uuid "c54512db-96e7-420e-a4d5-f30a239a631e") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "8b3e15ca-c0da-4487-824b-12961e7f6ae3") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "ebaff8b3-7153-4734-a04b-65e53fc4f3f8") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C22808" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "419f64ac-1c9d-411c-8541-378db349ffd1") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.237258 -0.5225) + (end 0.237258 -0.5225) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "06d193f5-84f4-4cfc-ba35-e42e8f9bc0da") + ) + (fp_line + (start -0.237258 0.5225) + (end 0.237258 0.5225) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "58623f28-18c2-43c1-b546-3f131714d4cb") + ) + (fp_rect + (start -1.48 -0.73) + (end 1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "0028dc23-f3b0-41f0-8c81-1672e8e36486") + ) + (fp_rect + (start -0.8 -0.4125) + (end 0.8 0.4125) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "70bc6991-3369-4e9a-a8e1-8f5dceaed2dc") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "5fcd083f-7b8d-4fba-a05b-211522283912") + (effects + (font + (size 0.4 0.4) + (thickness 0.06) + ) + ) + ) + (pad "1" smd roundrect + (at -0.825 0 90) + (size 0.8 0.95) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 11 "LED_DRV") + (uuid "59d39084-25cf-4bba-aacb-aeaad02b3056") + ) + (pad "2" smd roundrect + (at 0.825 0 90) + (size 0.8 0.95) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 10 "LED_A") + (uuid "6a34f0eb-bd88-474b-a7f8-e4a1bfd2c3b5") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0603_1608Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Capacitor_SMD:C_0402_1005Metric" + (layer "F.Cu") + (uuid "84ebcc12-ffa1-4616-9274-550acdc1c482") + (at 133.6 112 90) + (descr "Capacitor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C2" + (at 0 -1.16 90) + (layer "F.Fab") + (uuid "4b8d7d4a-a296-4532-93eb-c524356b523f") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "1u" + (at 0 1.16 90) + (layer "F.Fab") + (uuid "029c3f19-238d-42ae-81e9-d8d9596e3f23") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "424b5fa2-4009-4994-8ea3-9cecd6509e15") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "46b99433-59f6-4a35-bf77-70f5eba7384f") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C52923" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "1904f51f-26c1-47cf-bcf6-848bd431dc07") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.107836 -0.36) + (end 0.107836 -0.36) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "3b5fb7b1-26e0-42be-9a5f-0158bac90a7b") + ) + (fp_line + (start -0.107836 0.36) + (end 0.107836 0.36) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "c585ac7c-da3b-435a-b5b7-947ae05ca1f0") + ) + (fp_rect + (start -0.91 -0.46) + (end 0.91 0.46) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "fe40e7dc-89ee-43f6-a640-5e8996b77599") + ) + (fp_rect + (start -0.5 -0.25) + (end 0.5 0.25) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "91c30daa-1932-412d-81aa-ed4aa6bce7c2") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "e30ce232-24b2-4804-80d3-c9262f1ecc4f") + (effects + (font + (size 0.25 0.25) + (thickness 0.04) + ) + ) + ) + (pad "1" smd roundrect + (at -0.48 0 90) + (size 0.56 0.62) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 15 "VDD") + (uuid "301d618c-9593-4a04-a803-31350d682fb4") + ) + (pad "2" smd roundrect + (at 0.48 0 90) + (size 0.56 0.62) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 9 "GND") + (uuid "9cead523-ae95-48a2-8ee2-894720e50c6b") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0402_1005Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12" + (layer "F.Cu") + (uuid "8681018d-15ad-45fb-93c3-a2b6d9721899") + (at 162.65 111 90) + (descr "USB Type-C receptacle for USB 2.0 and PD, http://www.krhro.com/uploads/soft/180320/1-1P320120243.pdf") + (tags "usb usb-c 2.0 pd") + (property "Reference" "J1" + (at 0 -5.645 90) + (layer "F.Fab") + (uuid "d4980fae-f607-47dc-bf24-b755a13b7df7") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "TYPE-C 16P" + (at 0 5.1 90) + (layer "F.Fab") + (uuid "1d7b88cb-1ae8-4562-a7c6-bccc24dd8cc9") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "28813ff3-b104-4f5d-8b78-43da1d12550f") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "c25ac2e8-5c7b-49b2-b483-222947a23c3b") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C393939" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "677458c3-cb63-4981-b4c5-4874989082d9") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start 5.32 -5.27) + (end 5.32 4.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "14b8cbee-612e-4710-b737-3fc3777ccfc7") + ) + (fp_line + (start -5.32 -5.27) + (end 5.32 -5.27) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "00d82233-a1ea-4e2f-ad6f-66c27b149faa") + ) + (fp_line + (start -5.32 -5.27) + (end -5.32 4.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "4eb26ed6-fc2d-40b2-aa75-8c0434ba3849") + ) + (fp_line + (start -5.32 4.15) + (end 5.32 4.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "cfb7751a-7adb-4530-88b1-7013321995e7") + ) + (fp_line + (start 4.47 -3.65) + (end 4.47 3.65) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "d6c97dbf-c948-47c5-82a8-8bf24c6ed775") + ) + (fp_line + (start -4.47 -3.65) + (end 4.47 -3.65) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "537d5b23-28d2-4b23-a23e-4ac4df2820d5") + ) + (fp_line + (start -4.47 -3.65) + (end -4.47 3.65) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "867ed174-cd2e-4021-9022-e2feee986e26") + ) + (fp_line + (start -4.47 3.65) + (end 4.47 3.65) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "77e68cbb-1480-448d-9f2c-a81d53d99216") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "299c177b-bd5e-4bf9-84ca-2d99c3d47dc4") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "" np_thru_hole circle + (at -2.89 -2.6 90) + (size 0.65 0.65) + (drill 0.65) + (layers "*.Cu" "*.Mask") + (uuid "b4bb65b2-a409-4304-8254-20a6c0f534e2") + ) + (pad "" np_thru_hole circle + (at 2.89 -2.6 90) + (size 0.65 0.65) + (drill 0.65) + (layers "*.Cu" "*.Mask") + (uuid "d906aa06-4ca3-401e-816d-ec2caf51ef49") + ) + (pad "A1" smd rect + (at -3.25 -4.045 90) + (size 0.6 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 9 "GND") + (uuid "014a70d2-f856-4378-9b83-5faba5e3c3a0") + ) + (pad "A4" smd rect + (at -2.45 -4.045 90) + (size 0.6 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 14 "VBUS") + (uuid "4153eb69-5491-4827-acf2-62cf1163872c") + ) + (pad "A5" smd rect + (at -1.25 -4.045 90) + (size 0.3 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 5 "CC1") + (uuid "38e6e001-4b83-4946-867c-c02c2574d50b") + ) + (pad "A6" smd rect + (at -0.25 -4.045 90) + (size 0.3 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 8 "DP") + (uuid "2b550584-9256-4812-912c-27a4c0671827") + ) + (pad "A7" smd rect + (at 0.25 -4.045 90) + (size 0.3 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 7 "DM") + (uuid "57f81c8c-0fde-4e92-8a5c-1af3b47423f2") + ) + (pad "A8" smd rect + (at 1.25 -4.045 90) + (size 0.3 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (uuid "2190a8cc-3f7c-4081-aefd-459be9ffe20c") + ) + (pad "A9" smd rect + (at 2.45 -4.045 90) + (size 0.6 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 14 "VBUS") + (uuid "a5090fe9-a25d-4eb4-9a60-afa3d71cc5a0") + ) + (pad "A12" smd rect + (at 3.25 -4.045 90) + (size 0.6 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 9 "GND") + (uuid "3c2bd131-d4d7-473d-9c7f-6e052b564adc") + ) + (pad "B1" smd rect + (at 3.25 -4.045 90) + (size 0.6 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 9 "GND") + (uuid "04e92903-114d-41df-a830-9f676b17e732") + ) + (pad "B4" smd rect + (at 2.45 -4.045 90) + (size 0.6 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 14 "VBUS") + (uuid "9ca0a306-a1e8-47d1-9142-04eeb6352bfc") + ) + (pad "B5" smd rect + (at 1.75 -4.045 90) + (size 0.3 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 6 "CC2") + (uuid "62bc6aa8-e73f-4f25-8612-5840e582a186") + ) + (pad "B6" smd rect + (at 0.75 -4.045 90) + (size 0.3 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 8 "DP") + (uuid "c281e116-3855-4dee-b774-6e0e0ae32492") + ) + (pad "B7" smd rect + (at -0.75 -4.045 90) + (size 0.3 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 7 "DM") + (uuid "6a70c755-6ac2-4d98-b486-6b630e528229") + ) + (pad "B8" smd rect + (at -1.75 -4.045 90) + (size 0.3 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (uuid "c4462ce3-305e-4e07-b33e-edd55194b177") + ) + (pad "B9" smd rect + (at -2.45 -4.045 90) + (size 0.6 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 14 "VBUS") + (uuid "6c1c9bca-e6de-43ac-a8e5-93abf84bb9b3") + ) + (pad "B12" smd rect + (at -3.25 -4.045 90) + (size 0.6 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (net 9 "GND") + (uuid "ec4df1d6-6c7c-4a3e-8d0d-9b73280b422b") + ) + (pad "S1" thru_hole oval + (at -4.32 -3.13 90) + (size 1 2.1) + (drill oval 0.6 1.7) + (property pad_prop_heatsink) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net 9 "GND") + (uuid "aae59115-103e-4b28-baec-dc90c2327520") + ) + (pad "S1" thru_hole oval + (at -4.32 1.05 90) + (size 1 1.6) + (drill oval 0.6 1.2) + (property pad_prop_heatsink) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net 9 "GND") + (uuid "c23a5feb-1952-4f65-8d3a-c378c780365e") + ) + (pad "S1" thru_hole oval + (at 4.32 -3.13 90) + (size 1 2.1) + (drill oval 0.6 1.7) + (property pad_prop_heatsink) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net 9 "GND") + (uuid "378054f3-e201-40a5-bd2d-87a6526af82a") + ) + (pad "S1" thru_hole oval + (at 4.32 1.05 90) + (size 1 1.6) + (drill oval 0.6 1.2) + (property pad_prop_heatsink) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (net 9 "GND") + (uuid "6b0d2a4e-b17e-4aab-93bc-fb52ecd5c056") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Connector_USB.3dshapes/USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Resistor_SMD:R_0402_1005Metric" + (layer "F.Cu") + (uuid "88250087-cd15-401b-8cf9-90f4fd885d24") + (at 133.6 105.4 90) + (descr "Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "resistor") + (property "Reference" "R8" + (at 0 -1.17 90) + (layer "F.Fab") + (uuid "ec740f22-a1bf-4534-9f62-9464d5c4b418") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "22k" + (at 0 1.17 90) + (layer "F.Fab") + (uuid "57da4e77-6cc3-416d-be92-53193d600516") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "87d5776b-8e7c-440a-bbad-80fa93b772d2") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "4d7d9475-ba7c-4990-a3d6-19029b0a5bcf") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C25768" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "36964418-33b2-4618-8bc7-3624e2567b94") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.153641 -0.38) + (end 0.153641 -0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "a96f25f1-4f54-4c7c-ad6a-dc67641d75bd") + ) + (fp_line + (start -0.153641 0.38) + (end 0.153641 0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "0d628427-63ec-4df7-b057-000077b35d37") + ) + (fp_rect + (start -0.93 -0.47) + (end 0.93 0.47) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "fd98153e-b461-4888-8d6d-da598e631d90") + ) + (fp_rect + (start -0.525 -0.27) + (end 0.525 0.27) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "1a2e19f9-2916-4c10-b632-76a5b9524440") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "db1f82a1-2d15-4776-b5df-fbec6532a075") + (effects + (font + (size 0.26 0.26) + (thickness 0.04) + ) + ) + ) + (pad "1" smd roundrect + (at -0.51 0 90) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 13 "SENS_B") + (uuid "cdb5e333-d12b-45c5-af67-3933074b7b18") + ) + (pad "2" smd roundrect + (at 0.51 0 90) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 9 "GND") + (uuid "027b2fcf-c491-4d62-b044-68dc090a350d") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0402_1005Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Capacitor_SMD:C_0402_1005Metric" + (layer "F.Cu") + (uuid "895df405-d8f0-436c-8dfb-ca0b8fdcca1c") + (at 135 105.4 90) + (descr "Capacitor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C5" + (at 0 -1.16 90) + (layer "F.Fab") + (uuid "aec0a524-7394-4461-88d7-4c09ecf6c1aa") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "1n" + (at 0 1.16 90) + (layer "F.Fab") + (uuid "d5c66b49-56de-40fc-a501-3971d28ab7dc") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "c4d5ad26-486d-41b1-b187-1cea1bb3a642") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "4d74b49c-2d08-4e0d-a887-3e1de26757ff") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C1523" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "3ec690bb-f4a7-45b8-b605-6ae6a2f5cf67") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.107836 -0.36) + (end 0.107836 -0.36) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "536a29ca-7550-4179-aa54-91a9d35166bf") + ) + (fp_line + (start -0.107836 0.36) + (end 0.107836 0.36) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "2f289637-c1a8-48ca-ab87-dbce91b546ac") + ) + (fp_rect + (start -0.91 -0.46) + (end 0.91 0.46) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "a4a333df-19c5-47ca-9612-e04609dd0502") + ) + (fp_rect + (start -0.5 -0.25) + (end 0.5 0.25) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "69ed99c8-79a2-448e-b0af-cec9d11930fd") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "cc13d139-b49d-4103-83f0-55372681bab0") + (effects + (font + (size 0.25 0.25) + (thickness 0.04) + ) + ) + ) + (pad "1" smd roundrect + (at -0.48 0 90) + (size 0.56 0.62) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 13 "SENS_B") + (uuid "86ff673b-4e6b-4c61-9a86-b3813dca837a") + ) + (pad "2" smd roundrect + (at 0.48 0 90) + (size 0.56 0.62) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 9 "GND") + (uuid "d9047c76-beec-4580-a826-a3301fc59fd8") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0402_1005Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Resistor_SMD:R_0402_1005Metric" + (layer "F.Cu") + (uuid "a0d8b4b1-4e86-4fa4-9112-f045f9d64197") + (at 156.6 107 90) + (descr "Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "resistor") + (property "Reference" "R1" + (at 0 -1.17 90) + (layer "F.Fab") + (uuid "53a83f45-dcb3-46d3-8ca7-66e62af653af") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "5.1k" + (at 0 1.17 90) + (layer "F.Fab") + (uuid "cad88f3b-e383-4565-bb55-4353b6f4dcc4") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "9dde193e-ccb1-45d6-9a04-01062fcbb447") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "dfd5658b-2c51-4b89-aae5-fc5963c743d0") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C25905" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "bdfbfece-2abf-4f96-b413-f65cd204968a") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.153641 -0.38) + (end 0.153641 -0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "2b177794-db82-4776-b1f8-a4678ff2100e") + ) + (fp_line + (start -0.153641 0.38) + (end 0.153641 0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "e6c77f7f-1eda-492c-9e1e-968473c4bdcf") + ) + (fp_rect + (start -0.93 -0.47) + (end 0.93 0.47) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "fa09b958-52a9-44a4-98fc-e3e31cb31f57") + ) + (fp_rect + (start -0.525 -0.27) + (end 0.525 0.27) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "775cf935-7ed5-4f9a-943e-14bf2e85a981") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "e4edc29e-b5c8-46b6-b596-57b48bb942a7") + (effects + (font + (size 0.26 0.26) + (thickness 0.04) + ) + ) + ) + (pad "1" smd roundrect + (at -0.51 0 90) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 5 "CC1") + (uuid "356792c4-5fe0-4aaa-bd8a-bda538bd1064") + ) + (pad "2" smd roundrect + (at 0.51 0 90) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 9 "GND") + (uuid "004fe717-e2d7-4c60-b167-036008deef2c") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0402_1005Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Package_SO:QSOP-28_3.9x9.9mm_P0.635mm" + (layer "F.Cu") + (uuid "a9f72ff5-2a79-474f-bc73-ba842e7d42aa") + (at 129 111 180) + (descr "QSOP, 28 Pin (https://pdfserv.maximintegrated.com/package_dwgs/21-0055.PDF), generated with kicad-footprint-generator ipc_gullwing_generator.py") + (tags "QSOP SO") + (property "Reference" "U1" + (at 0 -5.9 180) + (layer "F.Fab") + (uuid "7a9d873e-4b9a-43f4-87b2-5c7480ac7c99") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "CH32X035G8R6" + (at 0 5.9 180) + (layer "F.Fab") + (uuid "a62b8f56-c857-4f2b-9e20-c2ea47aeb74c") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 180) + (layer "F.Fab") + (hide yes) + (uuid "d7d77e0f-7d4f-480d-8f2f-58e9ae73102f") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 180) + (layer "F.Fab") + (hide yes) + (uuid "875d8546-7e43-4968-9515-6b6d610493ea") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C49118551" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "f8a78dda-1045-4a97-99b6-5146dc76a3c3") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start 2.06 5.06) + (end -2.06 5.06) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "f47f91e7-550f-41f2-816f-0287559a3afd") + ) + (fp_line + (start 2.06 4.5875) + (end 2.06 5.06) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "632a64cb-d926-4c94-a847-5ea4026f0f72") + ) + (fp_line + (start 2.06 -5.06) + (end 2.06 -4.5875) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "e3aab9ce-3b74-467b-b512-24a09402ea65") + ) + (fp_line + (start -2.06 5.06) + (end -2.06 4.5875) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "c7b1826e-7647-4db7-8038-2114deb70133") + ) + (fp_line + (start -2.06 -4.5875) + (end -2.06 -5.06) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "7683e0cd-a13d-4f5e-948f-5a92758f4372") + ) + (fp_line + (start -2.06 -5.06) + (end 2.06 -5.06) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "70256ecc-a0f1-40a5-9f1f-75d43ccf68ca") + ) + (fp_poly + (pts + (xy -2.7 -4.59) (xy -3.04 -5.06) (xy -2.36 -5.06) + ) + (stroke + (width 0.12) + (type solid) + ) + (fill yes) + (layer "F.SilkS") + (uuid "d82277c5-67d4-41de-9e69-6b4232a4cda8") + ) + (fp_line + (start 3.7 4.58) + (end 2.2 4.58) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "61706dda-8fef-4441-8750-89042e3526c5") + ) + (fp_line + (start 3.7 -4.58) + (end 3.7 4.58) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "90414c5e-411f-42d7-b8bb-d65a4d1b474d") + ) + (fp_line + (start 2.2 5.2) + (end -2.2 5.2) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "a9cb186a-74b1-42bd-b74d-3018ba933859") + ) + (fp_line + (start 2.2 4.58) + (end 2.2 5.2) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "545d781c-f314-4adf-b840-6130772f329f") + ) + (fp_line + (start 2.2 -4.58) + (end 3.7 -4.58) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "f56b5175-c4cc-434f-a1cf-dee8f0f97287") + ) + (fp_line + (start 2.2 -5.2) + (end 2.2 -4.58) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "2a51d471-ffa2-4e10-bb6c-ad4f8c55754f") + ) + (fp_line + (start -2.2 5.2) + (end -2.2 4.58) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "4ecc954d-29d5-4d87-ab33-77297c4dcb91") + ) + (fp_line + (start -2.2 4.58) + (end -3.7 4.58) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "02c261ae-214d-4aa6-9f82-0374dbd19034") + ) + (fp_line + (start -2.2 -4.58) + (end -2.2 -5.2) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "d2820390-6483-45fc-8a87-4ce8433328f6") + ) + (fp_line + (start -2.2 -5.2) + (end 2.2 -5.2) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "004fb94e-2f19-463f-a5ba-ec672ad7fe58") + ) + (fp_line + (start -3.7 4.58) + (end -3.7 -4.58) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "f7112bd4-50a1-4f91-aa84-bc23137e51f6") + ) + (fp_line + (start -3.7 -4.58) + (end -2.2 -4.58) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "aeb6c738-0289-4fed-b423-3149986da71f") + ) + (fp_poly + (pts + (xy -0.975 -4.95) (xy 1.95 -4.95) (xy 1.95 4.95) (xy -1.95 4.95) (xy -1.95 -3.975) + ) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "7b0d9e33-7ff2-4d94-a20e-4845403916e0") + ) + (fp_text user "${REFERENCE}" + (at 0 0 270) + (layer "F.Fab") + (uuid "743dfcad-e9ab-4e4b-8ce5-f426813174fa") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" smd roundrect + (at -2.6375 -4.1275 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "4c2d1ad2-5c0c-47e1-9cee-9c65bbc5417c") + ) + (pad "2" smd roundrect + (at -2.6375 -3.4925 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 7 "DM") + (uuid "287f56e4-f2ab-49eb-8ae4-b25f3e13c2cb") + ) + (pad "3" smd roundrect + (at -2.6375 -2.8575 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 8 "DP") + (uuid "3f281d2d-fa1d-45a9-a36f-3f4e5b7e5f91") + ) + (pad "4" smd roundrect + (at -2.6375 -2.2225 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "de9d7f25-01c6-4608-bcba-e1f49f0e9fde") + ) + (pad "5" smd roundrect + (at -2.6375 -1.5875 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 12 "SENS_A") + (uuid "c84ab6fb-4a61-422e-98a9-b116efbcbbbb") + ) + (pad "6" smd roundrect + (at -2.6375 -0.9525 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 15 "VDD") + (uuid "968c9ea0-a082-41c8-9587-82618cca0b83") + ) + (pad "7" smd roundrect + (at -2.6375 -0.3175 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 9 "GND") + (uuid "c4433018-4c54-4852-bc86-0e3a0df1b6fa") + ) + (pad "8" smd roundrect + (at -2.6375 0.3175 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "a7841677-c711-4343-99e3-fa37272d3a60") + ) + (pad "9" smd roundrect + (at -2.6375 0.9525 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 12 "SENS_A") + (uuid "c6770b7f-7df8-44c3-840b-6278f7d36561") + ) + (pad "10" smd roundrect + (at -2.6375 1.5875 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "42b8c86b-c793-4405-8e69-091bd08e8f13") + ) + (pad "11" smd roundrect + (at -2.6375 2.2225 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 13 "SENS_B") + (uuid "5c9f46db-abcc-467a-b5b8-ed3ba7369bdf") + ) + (pad "12" smd roundrect + (at -2.6375 2.8575 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "db8fe2f3-3a7c-4ff6-9a0f-c912a08bede0") + ) + (pad "13" smd roundrect + (at -2.6375 3.4925 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "a7b2044d-3f4b-4c8b-828b-1dfcec5d23a7") + ) + (pad "14" smd roundrect + (at -2.6375 4.1275 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "2dfff98d-a8e9-4f57-ba2f-5753c231f95c") + ) + (pad "15" smd roundrect + (at 2.6375 4.1275 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 11 "LED_DRV") + (uuid "d3cf05d7-c61a-4997-bdde-1a8b2a99e820") + ) + (pad "16" smd roundrect + (at 2.6375 3.4925 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 3 "BUZ_DRV") + (uuid "6891f005-b0c7-494d-8ac8-e9f0ade41729") + ) + (pad "17" smd roundrect + (at 2.6375 2.8575 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "35dccdd3-0c7d-4917-bcd1-1ce275fd3274") + ) + (pad "18" smd roundrect + (at 2.6375 2.2225 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "660b8eb4-598c-4dfa-bbdf-799af8ce34c5") + ) + (pad "19" smd roundrect + (at 2.6375 1.5875 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "ddc5f080-9272-41dd-baee-2b2b1f09b2e9") + ) + (pad "20" smd roundrect + (at 2.6375 0.9525 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "75bca6e9-e6a0-4273-b970-d9fccec3f68b") + ) + (pad "21" smd roundrect + (at 2.6375 0.3175 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "15517271-dc1e-4187-b71e-04475f6a6951") + ) + (pad "22" smd roundrect + (at 2.6375 -0.3175 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "01a7112b-3307-43c1-a9aa-e1536f1b5041") + ) + (pad "23" smd roundrect + (at 2.6375 -0.9525 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "5e0a1a18-4366-4f75-940a-a60d1f516a9c") + ) + (pad "24" smd roundrect + (at 2.6375 -1.5875 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "b19fb78c-de11-46b3-9223-5ef5ba8704c1") + ) + (pad "25" smd roundrect + (at 2.6375 -2.2225 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "64e52c2e-3c92-4f3e-9fa4-1bf0e73fbc6d") + ) + (pad "26" smd roundrect + (at 2.6375 -2.8575 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "f7d68e91-f84f-4ea9-b634-14d9849b71af") + ) + (pad "27" smd roundrect + (at 2.6375 -3.4925 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "329f9838-70bb-4412-8cdb-a3b4acf6db86") + ) + (pad "28" smd roundrect + (at 2.6375 -4.1275 180) + (size 1.625 0.4) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (uuid "c323be8b-48ec-40b5-9623-ad7cd2ffb184") + ) + (embedded_fonts no) + (model "${KIPRJMOD}/3d/QSOP-28.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Capacitor_SMD:C_0805_2012Metric" + (layer "F.Cu") + (uuid "b734f976-9b91-4832-9734-50ef3ee808cf") + (at 156.6 102.8) + (descr "Capacitor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf, https://docs.google.com/spreadsheets/d/1BsfQQcO9C6DZCsRaXUlFlo91Tg2WpOkGARC1WS5S8t0/edit?usp=sharing), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C1" + (at 0 -1.68 0) + (layer "F.Fab") + (uuid "9edcc109-0d70-41e1-84f8-9f1fa16b90df") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "10u" + (at 0 1.68 0) + (layer "F.Fab") + (uuid "a3e8a3da-917b-4b4c-a2cd-89ca81fa9ecf") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "4e564c39-b18b-4b29-a592-f6e5dbb87618") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "378d0323-d6b2-44a6-8086-6f3713e2c3d3") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C15850" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "c9584460-1f9e-4471-844e-39f866ae29da") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.261252 -0.735) + (end 0.261252 -0.735) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "c29f2d58-0c69-4454-8aa6-27f3e209a660") + ) + (fp_line + (start -0.261252 0.735) + (end 0.261252 0.735) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "3b754f8f-928a-4a45-8940-1967299abed6") + ) + (fp_rect + (start -1.7 -0.98) + (end 1.7 0.98) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "a648c499-170a-4a6c-be7d-0036693f0743") + ) + (fp_rect + (start -1 -0.625) + (end 1 0.625) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "d06d6a63-468f-43c6-b4b7-6442045d08d7") + ) + (fp_text user "${REFERENCE}" + (at 0 0 0) + (layer "F.Fab") + (uuid "378b58e8-1a3e-4f11-8da6-c13059293f4a") + (effects + (font + (size 0.5 0.5) + (thickness 0.08) + ) + ) + ) + (pad "1" smd roundrect + (at -0.95 0) + (size 1 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 14 "VBUS") + (uuid "8e8b73bf-c8d7-47c6-bc4f-42fc8b8ca829") + ) + (pad "2" smd roundrect + (at 0.95 0) + (size 1 1.45) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 9 "GND") + (uuid "1fa392c1-968e-429d-835c-9752d8744738") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0805_2012Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Resistor_SMD:R_0402_1005Metric" + (layer "F.Cu") + (uuid "d53f0d64-51e3-4e9a-9a53-cba002fc58dc") + (at 133.6 108.4 90) + (descr "Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "resistor") + (property "Reference" "R7" + (at 0 -1.17 90) + (layer "F.Fab") + (uuid "bcbbf309-36f3-49e8-9ec6-055bdba2901a") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "22k" + (at 0 1.17 90) + (layer "F.Fab") + (uuid "e27a67b3-ecbb-41fd-a994-efd190fb187f") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "b70c7fd5-56d0-403f-a2c9-e010ded51a40") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "d32a0d77-c5c4-42cb-bac8-6c98252a9a7e") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C25768" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "63f48075-103b-4247-85e0-5da154c55ef1") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.153641 -0.38) + (end 0.153641 -0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "e505f606-1d79-4899-b207-1cd9fd70a3c2") + ) + (fp_line + (start -0.153641 0.38) + (end 0.153641 0.38) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "0d620b05-4fc0-4cf8-b48f-5b011cef2bcf") + ) + (fp_rect + (start -0.93 -0.47) + (end 0.93 0.47) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "8a8d041d-30a1-43bc-8edd-e534c25b2352") + ) + (fp_rect + (start -0.525 -0.27) + (end 0.525 0.27) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "65f3a403-57a5-43ec-9e7d-2b931d479e40") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "0ead1a70-f74c-4f7f-95aa-e06f38aaede8") + (effects + (font + (size 0.26 0.26) + (thickness 0.04) + ) + ) + ) + (pad "1" smd roundrect + (at -0.51 0 90) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 12 "SENS_A") + (uuid "3a6dcc3a-8be0-447d-9753-2ae5c2c6a975") + ) + (pad "2" smd roundrect + (at 0.51 0 90) + (size 0.54 0.64) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 9 "GND") + (uuid "e61a381d-52fc-4b0d-835f-493881187000") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Resistor_SMD.3dshapes/R_0402_1005Metric.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Package_TO_SOT_SMD:SOT-23" + (layer "F.Cu") + (uuid "d9910488-3112-40df-ac88-ce063eba1d9b") + (at 121.6 117.6) + (descr "SOT, 3 Pin (JEDEC TO-236 Var AB https://www.jedec.org/document_search?search_api_views_fulltext=TO-236), generated with kicad-footprint-generator ipc_gullwing_generator.py") + (tags "SOT TO_SOT_SMD") + (property "Reference" "Q1" + (at 0 -2.4 0) + (layer "F.Fab") + (uuid "40350358-45e9-4c9c-bd1d-3a19a955d43a") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "S8050" + (at 0 2.4 0) + (layer "F.Fab") + (uuid "4ab18b07-177d-4bab-90c2-85201fa94e35") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "3d3fced9-b73f-4bea-b602-96666c84947c") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "acc769c3-3f4d-4a77-9a6f-4403102d571e") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "LCSC" "C2146" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "b50b0f74-fd84-448d-ac49-fa8c16382129") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -0.76 -1.56) + (end 0.76 -1.56) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "437265f1-5884-45aa-9187-8e4c9406ca36") + ) + (fp_line + (start -0.76 -1.51) + (end -0.76 -1.56) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "5dc8ea82-7423-4232-a06f-4e55d87d15a4") + ) + (fp_line + (start -0.76 0.39) + (end -0.76 -0.39) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "4eb39937-41fc-4c87-abb2-8a480c84ea2b") + ) + (fp_line + (start -0.76 1.56) + (end -0.76 1.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "2aac5cdb-1e3e-4858-8560-78979d473c63") + ) + (fp_line + (start 0.76 -1.56) + (end 0.76 -0.56) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "aa38dbac-9cf0-47b0-a7fd-4e7ff2d96669") + ) + (fp_line + (start 0.76 0.56) + (end 0.76 1.56) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "666eb491-3cf3-47bd-914e-39368467bdd4") + ) + (fp_line + (start 0.76 1.56) + (end -0.76 1.56) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "874f747f-fc87-4d0a-8512-eaff7de2287e") + ) + (fp_poly + (pts + (xy -1.3 -0.38) (xy -1.06 -0.05) (xy -1.54 -0.05) + ) + (stroke + (width 0.12) + (type solid) + ) + (fill yes) + (layer "F.SilkS") + (uuid "d9c57ff0-2090-47b9-9f0a-40de6276406e") + ) + (fp_line + (start -1.93 -1.5) + (end -0.9 -1.5) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "28dad49a-5db4-4eb6-a858-47a3ea91e852") + ) + (fp_line + (start -1.93 -0.39) + (end -1.93 -1.5) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "3f02f2c5-515e-4a37-a70f-b8bf48902bf1") + ) + (fp_line + (start -1.93 0.39) + (end -0.9 0.39) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "3648939e-212e-419b-86f5-4727b2df0c54") + ) + (fp_line + (start -1.93 1.5) + (end -1.93 0.39) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "58105756-3086-4f72-980c-ed1ace05260a") + ) + (fp_line + (start -0.9 -1.7) + (end 0.9 -1.7) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "41e18301-cd00-4d94-bc41-afdb405d1d72") + ) + (fp_line + (start -0.9 -1.5) + (end -0.9 -1.7) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "400bf58c-da74-409e-b1df-ba13bb4e038d") + ) + (fp_line + (start -0.9 -0.39) + (end -1.93 -0.39) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "9bda8ac4-78f4-40a2-8a05-d960ddc9c7a7") + ) + (fp_line + (start -0.9 0.39) + (end -0.9 -0.39) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "d8ba33d4-f476-4245-8140-1d38b68e7b07") + ) + (fp_line + (start -0.9 1.5) + (end -1.93 1.5) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "1dae120e-c535-4903-a146-6c9ae777ee79") + ) + (fp_line + (start -0.9 1.7) + (end -0.9 1.5) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "bed01b55-b48e-46b5-b7cf-506aa84a1ad8") + ) + (fp_line + (start 0.9 -1.7) + (end 0.9 -0.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "88c35a30-df37-4af5-92cf-749c3b9d8e1c") + ) + (fp_line + (start 0.9 -0.55) + (end 1.93 -0.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "dda5082d-98f5-4018-bc55-239203004bf7") + ) + (fp_line + (start 0.9 0.55) + (end 0.9 1.7) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "6e8b22c9-99d8-4d9e-9b89-bd9d67c8c934") + ) + (fp_line + (start 0.9 1.7) + (end -0.9 1.7) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "14b70b5f-0178-46fd-a9cb-70fb3ec59f97") + ) + (fp_line + (start 1.93 -0.55) + (end 1.93 0.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "32dfbcea-3fc6-4866-9ff7-4190dc31bece") + ) + (fp_line + (start 1.93 0.55) + (end 0.9 0.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "3c164999-f57c-4269-a5d2-f5f56caebda0") + ) + (fp_poly + (pts + (xy -0.325 -1.45) (xy 0.65 -1.45) (xy 0.65 1.45) (xy -0.65 1.45) (xy -0.65 -1.125) + ) + (stroke + (width 0.1) + (type solid) + ) + (fill no) + (layer "F.Fab") + (uuid "97dadac3-3854-4806-b804-825765a50e14") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "601a5e68-b657-4487-bfdd-4c9a6c213b34") + (effects + (font + (size 0.72 0.72) + (thickness 0.11) + ) + ) + ) + (pad "1" smd roundrect + (at -0.9375 -0.95) + (size 1.475 0.6) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 2 "BUZ_B") + (uuid "fd2ab339-185b-4d24-b167-1873b004c16c") + ) + (pad "2" smd roundrect + (at -0.9375 0.95) + (size 1.475 0.6) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 9 "GND") + (uuid "f596ae5c-7490-44cb-bf24-eab6ec2303f5") + ) + (pad "3" smd roundrect + (at 0.9375 0) + (size 1.475 0.6) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.25) + (net 4 "BUZ_N") + (uuid "f745ad03-68fa-45b9-940b-258b2dcd867d") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Package_TO_SOT_SMD.3dshapes/SOT-23.step" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "calibrator:Vishay_VEMT2500X01_ReverseGullwing" + (layer "F.Cu") + (uuid "e8ce6c74-6940-4524-b7a1-11f174d5bf1b") + (at 105 106.5) + (descr "Phototransistor Vishay VEMT2500X01 reverse gullwing, lens looks through a 2.3 mm hole; VEMT2000X01 is the same package") + (property "Reference" "Q2" + (at 0 -2 0) + (layer "F.Fab") + (uuid "335d554c-825d-4c00-9a2c-ea1e2fb96d97") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "Value" "VEMT2500X01" + (at 0 2 0) + (layer "F.Fab") + (uuid "c7e9c35e-40c6-48f4-bb4e-65aaa41f0e9a") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "9301f98e-6db7-4805-9185-5fb46ed5c225") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "7bd72ab5-2916-4be3-824c-3629d39b2b21") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "LCSC" "C3210911" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "9882c54f-fb83-4997-b00a-10474fcd3017") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -1.25 -1.25) + (end -1.25 -0.6) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "c54cb386-21cf-477c-be2a-ae9c759e367b") + ) + (fp_line + (start -1.25 -1.25) + (end 1.25 -1.25) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "387ed010-d108-482d-b223-5ac612d764ca") + ) + (fp_line + (start -1.25 1.25) + (end 1.25 1.25) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "239cff0c-15b5-48bf-b58c-bdff11c6587c") + ) + (fp_line + (start -3.6 -1.6) + (end 3.6 -1.6) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "2318a1dd-919c-4a52-98ce-177ef4f71304") + ) + (fp_line + (start -3.6 1.6) + (end -3.6 -1.6) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "22ce0757-2d14-4e51-ae9d-651836aab6dd") + ) + (fp_line + (start 3.6 -1.6) + (end 3.6 1.6) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "50a4abee-88e5-4697-8831-b2397aec38b3") + ) + (fp_line + (start 3.6 1.6) + (end -3.6 1.6) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "cfa2d3b6-22a5-408a-8412-7b7805289091") + ) + (fp_line + (start -1.15 -1.15) + (end 1.15 -1.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "9092915a-f144-45fd-b04e-d429f86f5fe7") + ) + (fp_line + (start -1.15 1.15) + (end -1.15 -1.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "0a399f63-d65e-4ca5-a313-1f6a2f7811e7") + ) + (fp_line + (start 1.15 -1.15) + (end 1.15 1.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "888ef869-2282-4817-a1f5-903e4b5b4f92") + ) + (fp_line + (start 1.15 1.15) + (end -1.15 1.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "188650a4-2ad3-4889-9606-263b79e85d68") + ) + (pad "" np_thru_hole circle + (at 0 0) + (size 2.3 2.3) + (drill 2.3) + (layers "*.Cu" "*.Mask") + (uuid "e7f42c73-ace3-4fea-845e-1d7bcb46210b") + ) + (pad "1" smd roundrect + (at -2.5 0) + (size 1.7 0.75) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.15) + (net 15 "VDD") + (uuid "0fe719ab-e2b5-4ab6-bceb-ce67928eba11") + ) + (pad "2" smd roundrect + (at 2.5 0) + (size 1.7 0.75) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.15) + (net 12 "SENS_A") + (uuid "da086fca-8931-424e-9ddb-710e13915f7a") + ) + (embedded_fonts no) + (model "${KIPRJMOD}/3d/VEMT2500X01_RGW.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "calibrator:LED_1206_ReverseMount_XL-3216UWC-FB" + (layer "F.Cu") + (uuid "ee2da1ac-e733-4678-812e-443d5f0458a3") + (at 104.4 111) + (descr "Reverse mount 1206 LED shining through a board cut-out, XINGLIGHT XL-3216UWC-FB (LCSC C3646935); Lite-On LTW-C230DS fits the same footprint") + (property "Reference" "D1" + (at 0 -1.8 0) + (layer "F.Fab") + (uuid "aeb82a29-4dee-4799-b74d-e122bb02b580") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "Value" "XL-3216UWC-FB white" + (at 0 1.8 0) + (layer "F.Fab") + (uuid "9813b59b-00f4-4cde-81ab-30899a8cec2a") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "70f62c42-a5ee-4174-866f-4628707ce52f") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "0478b3d1-a212-4bac-b0ad-b40f09c0dfb5") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "LCSC" "C3646935" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "9f8ceb0f-7508-4838-8e86-b118d76a755f") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -2.45 -1) + (end -2.45 1) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "afa858f2-0804-4e1a-9a8d-eaea78346402") + ) + (fp_line + (start -1.05 0.35) + (end -1.05 -0.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "ac795334-4bb7-4c1a-943e-9a31647c8e9b") + ) + (fp_line + (start -0.55 -0.85) + (end 0.55 -0.85) + (stroke + (width 0.05) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "5d46bb54-8d42-4301-a181-6a42ea15da13") + ) + (fp_line + (start 0.55 0.85) + (end -0.55 0.85) + (stroke + (width 0.05) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "dc184fdb-744c-4c3a-8cdf-12b3724cd370") + ) + (fp_line + (start 1.05 -0.35) + (end 1.05 0.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "1457c065-40a2-4224-abf0-908b09230013") + ) + (fp_arc + (start -1.05 -0.35) + (mid -0.9036 -0.7036) + (end -0.55 -0.85) + (stroke + (width 0.05) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "55181589-4ab9-4953-b1d1-e5ce33d6d66e") + ) + (fp_arc + (start -0.55 0.85) + (mid -0.9036 0.7036) + (end -1.05 0.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "0629f980-892d-4606-bbe6-27a2cad7b71b") + ) + (fp_arc + (start 0.55 -0.85) + (mid 0.9036 -0.7036) + (end 1.05 -0.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "86871a69-0fa6-44f2-a1eb-3e26298cdd69") + ) + (fp_arc + (start 1.05 0.35) + (mid 0.9036 0.7036) + (end 0.55 0.85) + (stroke + (width 0.05) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "3593866b-95c9-44b3-83fc-df9601d6574c") + ) + (fp_line + (start -2.3 -1.1) + (end 2.3 -1.1) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "1d043938-f719-4323-9cfe-a223cb941590") + ) + (fp_line + (start -2.3 1.1) + (end -2.3 -1.1) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "55b07e8a-1ebc-47b4-bbaa-3fb29474766d") + ) + (fp_line + (start 2.3 -1.1) + (end 2.3 1.1) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "6933d86c-2041-4db2-8b0f-5d0705d0d68a") + ) + (fp_line + (start 2.3 1.1) + (end -2.3 1.1) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "3c35b55e-9562-4b66-adb3-f45354e6c8bf") + ) + (fp_line + (start -1.6 -0.8) + (end 1.6 -0.8) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "989cdfa8-9f35-4d29-919a-a2d9ad5415ba") + ) + (fp_line + (start -1.6 0.8) + (end -1.6 -0.8) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "d65cd7a9-9cc6-4d0b-a376-ddf6dfc26275") + ) + (fp_line + (start 1.6 -0.8) + (end 1.6 0.8) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "074bf84c-01a5-44b5-9eb3-3ae6d725ce91") + ) + (fp_line + (start 1.6 0.8) + (end -1.6 0.8) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "ab5a1980-df4c-4ab6-94ad-d8f35dccba64") + ) + (pad "1" smd roundrect + (at -1.7 0) + (size 0.7 1.5) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.15) + (net 9 "GND") + (uuid "ba3629a8-57ed-4989-939d-69b4f012e048") + ) + (pad "2" smd roundrect + (at 1.7 0) + (size 0.7 1.5) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.15) + (net 10 "LED_A") + (uuid "07a3304f-499a-42d4-aed5-41e974d8a6fa") + ) + (embedded_fonts no) + (model "${KIPRJMOD}/3d/LED_reverse_1206.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "calibrator:Vishay_VEMT2500X01_ReverseGullwing" + (layer "F.Cu") + (uuid "fba50a84-e70d-437d-ade9-c5a79a5a1c26") + (at 105 115.5) + (descr "Phototransistor Vishay VEMT2500X01 reverse gullwing, lens looks through a 2.3 mm hole; VEMT2000X01 is the same package") + (property "Reference" "Q3" + (at 0 -2 0) + (layer "F.Fab") + (uuid "73693b13-167e-4fce-81bd-f8f26a5534ec") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "Value" "VEMT2500X01" + (at 0 2 0) + (layer "F.Fab") + (uuid "8e1be82a-8a5d-4f15-9d25-335d59403cbf") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "c15411b5-7d33-479b-9023-7cc5246834f3") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "9b5596cd-cecd-494c-bb85-2394ae68456e") + (effects + (font + (size 0.8 0.8) + (thickness 0.12) + ) + ) + ) + (property "LCSC" "C3210911" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "e71a430f-bc07-4841-a548-8656fe2e0fbd") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr smd) + (fp_line + (start -1.25 -1.25) + (end -1.25 -0.6) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "172dfd67-7d8c-4d96-be9d-07c0ad1740ab") + ) + (fp_line + (start -1.25 -1.25) + (end 1.25 -1.25) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "88a52dbd-a25b-4e12-ba23-2310868edc3f") + ) + (fp_line + (start -1.25 1.25) + (end 1.25 1.25) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "23c818e3-4b8b-4394-9aec-c87df7afdc1f") + ) + (fp_line + (start -3.6 -1.6) + (end 3.6 -1.6) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "f3c14a94-332a-41b5-8c81-55e3b5fbdafc") + ) + (fp_line + (start -3.6 1.6) + (end -3.6 -1.6) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "3675091a-68f7-44fa-aaa6-f49e67dc5b89") + ) + (fp_line + (start 3.6 -1.6) + (end 3.6 1.6) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "bb59486b-a929-4214-81f7-012233f81bf4") + ) + (fp_line + (start 3.6 1.6) + (end -3.6 1.6) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "858d34b7-344e-42f0-8c4b-05b48f76dd9b") + ) + (fp_line + (start -1.15 -1.15) + (end 1.15 -1.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "6f9d486b-6eb9-413b-be77-a2efb8dcf911") + ) + (fp_line + (start -1.15 1.15) + (end -1.15 -1.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "3a12acb0-8517-4cfd-bed9-500412794e53") + ) + (fp_line + (start 1.15 -1.15) + (end 1.15 1.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "33cc8640-c2af-42a1-856c-429da966d9c7") + ) + (fp_line + (start 1.15 1.15) + (end -1.15 1.15) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "6ef2feb0-2c19-4449-ab43-276c3a9cfde1") + ) + (pad "" np_thru_hole circle + (at 0 0) + (size 2.3 2.3) + (drill 2.3) + (layers "*.Cu" "*.Mask") + (uuid "d48d6683-2cda-45b0-89be-f06c31598690") + ) + (pad "1" smd roundrect + (at -2.5 0) + (size 1.7 0.75) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.15) + (net 15 "VDD") + (uuid "26176112-652f-45c8-bf7f-8c3bd637d5be") + ) + (pad "2" smd roundrect + (at 2.5 0) + (size 1.7 0.75) + (layers "F.Cu" "F.Mask" "F.Paste") + (roundrect_rratio 0.15) + (net 13 "SENS_B") + (uuid "c081198d-676a-4fd4-9bf4-ab4e6e460f3d") + ) + (embedded_fonts no) + (model "${KIPRJMOD}/3d/VEMT2500X01_RGW.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (gr_poly + (pts + (xy 150.482268 106.807378) (xy 150.875862 108.45332) (xy 150.895002 108.481965) (xy 150.945615 108.604155) + (xy 150.971417 108.733871) (xy 150.971417 108.852912) (xy 151.151419 109.605649) (xy 151.695864 107.917873) + (xy 151.707255 107.891679) (xy 151.7082 107.888469) (xy 151.70918 107.887252) (xy 151.710516 107.884183) + (xy 151.732654 107.85815) (xy 151.754108 107.831553) (xy 151.756282 107.830366) (xy 151.757888 107.828479) + (xy 151.788317 107.812893) (xy 151.818302 107.796538) (xy 151.820763 107.796274) (xy 151.822969 107.795145) + (xy 151.857043 107.79239) (xy 151.89101 107.788755) (xy 151.893385 107.789453) (xy 151.895855 107.789254) + (xy 151.928393 107.799749) (xy 151.96116 107.809387) (xy 151.963086 107.81094) (xy 151.965446 107.811702) + (xy 151.991492 107.833852) (xy 152.018076 107.855295) (xy 152.019958 107.858061) (xy 152.021149 107.859074) + (xy 152.022674 107.862052) (xy 152.038745 107.885668) (xy 152.435249 108.612593) (xy 153.073627 108.612593) + (xy 153.110188 108.616194) (xy 153.177745 108.644177) (xy 153.22945 108.695882) (xy 153.257433 108.763439) + (xy 153.257433 108.836561) (xy 153.22945 108.904118) (xy 153.177745 108.955823) (xy 153.110188 108.983806) + (xy 153.073627 108.987407) (xy 152.323998 108.987407) (xy 152.311585 108.986184) (xy 152.307209 108.986653) + (xy 152.30261 108.9853) (xy 152.287437 108.983806) (xy 152.262722 108.973569) (xy 152.237059 108.966021) + (xy 152.229204 108.959685) (xy 152.21988 108.955823) (xy 152.200961 108.936904) (xy 152.180143 108.920112) + (xy 152.171566 108.907509) (xy 152.168175 108.904118) (xy 152.166489 108.900049) (xy 152.159474 108.88974) + (xy 151.918627 108.448187) (xy 151.302948 110.356793) (xy 151.30074 110.361869) (xy 151.300356 110.364281) + (xy 151.298077 110.367991) (xy 151.288296 110.390482) (xy 151.273802 110.407525) (xy 151.262094 110.426593) + (xy 151.250335 110.43512) (xy 151.240925 110.446186) (xy 151.22101 110.456386) (xy 151.202898 110.469521) + (xy 151.188771 110.472899) (xy 151.175843 110.479521) (xy 151.153541 110.481323) (xy 151.131781 110.486527) + (xy 151.117435 110.484241) (xy 151.102957 110.485412) (xy 151.081663 110.478542) (xy 151.059568 110.475023) + (xy 151.047189 110.467421) (xy 151.033367 110.462963) (xy 151.016323 110.448469) (xy 150.997256 110.436761) + (xy 150.988728 110.425002) (xy 150.977663 110.415592) (xy 150.967462 110.395677) (xy 150.954328 110.377565) + (xy 150.946314 110.354388) (xy 150.944328 110.35051) (xy 150.944131 110.348073) (xy 150.942323 110.342844) + (xy 150.702215 109.338755) (xy 150.618035 109.395002) (xy 150.495845 109.445615) (xy 150.366129 109.471417) + (xy 150.233871 109.471417) (xy 150.104155 109.445615) (xy 149.981965 109.395002) (xy 149.91169 109.348046) + (xy 149.732906 110.116819) (xy 149.730442 110.12409) (xy 149.730156 110.12727) (xy 149.727916 110.131545) + (xy 149.721117 110.151614) (xy 149.70727 110.17096) (xy 149.696227 110.192044) (xy 149.686176 110.200433) + (xy 149.678559 110.211077) (xy 149.65836 110.223653) (xy 149.640092 110.238903) (xy 149.627597 110.242807) + (xy 149.616486 110.249726) (xy 149.593014 110.253615) (xy 149.570298 110.260714) (xy 149.557257 110.259539) + (xy 149.544346 110.261679) (xy 149.521171 110.256289) (xy 149.49747 110.254155) (xy 149.485873 110.24808) + (xy 149.473125 110.245116) (xy 149.453776 110.231267) (xy 149.432696 110.220226) (xy 149.424307 110.210176) + (xy 149.413662 110.202558) (xy 149.401084 110.182357) (xy 149.385836 110.164091) (xy 149.377562 110.14458) + (xy 149.375013 110.140485) (xy 149.374491 110.137336) (xy 149.371494 110.130268) (xy 148.77904 108.234416) + (xy 148.524967 108.869601) (xy 148.508045 108.90221) (xy 148.507232 108.903042) (xy 148.506787 108.904118) + (xy 148.481719 108.929185) (xy 148.456974 108.954542) (xy 148.455904 108.955) (xy 148.455082 108.955823) + (xy 148.422327 108.96939) (xy 148.389764 108.983346) (xy 148.388601 108.98336) (xy 148.387525 108.983806) + (xy 148.350964 108.987407) (xy 147.526372 108.987407) (xy 147.489811 108.983806) (xy 147.422254 108.955823) + (xy 147.370549 108.904118) (xy 147.342566 108.836561) (xy 147.342566 108.763439) (xy 147.370549 108.695882) + (xy 147.422254 108.644177) (xy 147.489811 108.616194) (xy 147.526372 108.612593) (xy 148.224083 108.612593) + (xy 148.626738 107.605955) (xy 148.64366 107.573346) (xy 148.650403 107.566436) (xy 148.654884 107.557882) + (xy 148.675748 107.540465) (xy 148.694731 107.521014) (xy 148.703607 107.51721) (xy 148.71102 107.511022) + (xy 148.736961 107.502915) (xy 148.761941 107.49221) (xy 148.771596 107.492092) (xy 148.780813 107.489212) + (xy 148.807882 107.491649) (xy 148.835059 107.491318) (xy 148.844023 107.494904) (xy 148.853641 107.49577) + (xy 148.877718 107.508381) (xy 148.902951 107.518475) (xy 148.90986 107.525218) (xy 148.918415 107.529699) + (xy 148.935831 107.550563) (xy 148.955283 107.569546) (xy 148.959086 107.578422) (xy 148.965275 107.585835) + (xy 148.979617 107.619657) (xy 149.523829 109.361138) (xy 149.633361 108.890152) (xy 149.628583 108.866129) + (xy 149.628583 108.750655) (xy 149.925186 108.750655) (xy 149.925186 108.849345) (xy 149.950729 108.944673) + (xy 149.989771 109.012296) (xy 149.989771 109.012297) (xy 150.000074 109.030142) (xy 150.069858 109.099926) + (xy 150.155327 109.149272) (xy 150.250655 109.174815) (xy 150.349345 109.174815) (xy 150.444673 109.149272) + (xy 150.530142 109.099926) (xy 150.599926 109.030142) (xy 150.620072 108.995248) (xy 150.620071 108.995247) + (xy 150.649271 108.944673) (xy 150.674814 108.849345) (xy 150.674814 108.750655) (xy 150.649271 108.655327) + (xy 150.599926 108.569859) (xy 150.530141 108.500074) (xy 150.497099 108.480997) (xy 150.497099 108.480996) + (xy 150.444673 108.450728) (xy 150.349345 108.425185) (xy 150.250655 108.425185) (xy 150.155327 108.450728) + (xy 150.114947 108.474041) (xy 150.114946 108.474042) (xy 150.069859 108.500074) (xy 150.000074 108.569859) + (xy 149.950729 108.655327) (xy 149.925186 108.750655) (xy 149.628583 108.750655) (xy 149.628583 108.733871) + (xy 149.654385 108.604155) (xy 149.704998 108.481965) (xy 149.740722 108.428498) (xy 149.808598 108.13663) + (xy 150.193415 108.13663) (xy 150.233871 108.128583) (xy 150.366129 108.128583) (xy 150.415158 108.138335) + (xy 150.302541 107.66739) (xy 150.193415 108.13663) (xy 149.808598 108.13663) (xy 149.927436 107.62563) + (xy 150.106296 107.62563) (xy 150.493703 107.62563) (xy 150.493703 107.125778) (xy 150.106296 107.125778) + (xy 150.106296 107.62563) (xy 149.927436 107.62563) (xy 150.117464 106.808513) (xy 150.119996 106.801038) + (xy 150.480076 106.801038) + ) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "F.Cu") + (uuid "7927278d-74b9-4a26-8665-12a4f1f78541") + ) + (gr_poly + (pts + (xy 150.515431 106.765683) (xy 150.527331 106.7847) (xy 150.529523 106.79104) (xy 150.530897 106.795749) + (xy 150.922409 108.432985) (xy 150.936575 108.454186) (xy 150.941196 108.462831) (xy 150.991809 108.585021) + (xy 150.994654 108.594401) (xy 151.020456 108.724117) (xy 151.021417 108.733871) (xy 151.021417 108.847016) + (xy 151.158577 109.420595) (xy 151.648279 107.902523) (xy 151.650012 107.897933) (xy 151.660165 107.874583) + (xy 151.660235 107.874349) (xy 151.66043 107.873976) (xy 151.661403 107.871739) (xy 151.661564 107.871809) + (xy 151.663817 107.867504) (xy 151.663336 107.867295) (xy 151.664672 107.864226) (xy 151.672426 107.851792) + (xy 151.694152 107.826242) (xy 151.715191 107.800161) (xy 151.719137 107.796864) (xy 151.719811 107.796073) + (xy 151.725029 107.791942) (xy 151.730147 107.787668) (xy 151.731061 107.787168) (xy 151.735094 107.783977) + (xy 151.764946 107.768686) (xy 151.79436 107.752643) (xy 151.799262 107.751109) (xy 151.80019 107.750635) + (xy 151.806639 107.748802) (xy 151.812969 107.746823) (xy 151.813993 107.746713) (xy 151.818939 107.745308) + (xy 151.852361 107.742605) (xy 151.88569 107.739039) (xy 151.890803 107.739498) (xy 151.89184 107.739415) + (xy 151.89851 107.740191) (xy 151.905108 107.740784) (xy 151.906092 107.741073) (xy 151.911204 107.741668) + (xy 151.943134 107.751966) (xy 151.975269 107.761419) (xy 151.979819 107.763801) (xy 151.980809 107.764121) + (xy 151.986674 107.76739) (xy 151.992545 107.770464) (xy 151.993343 107.771107) (xy 151.997838 107.773613) + (xy 152.023391 107.795344) (xy 152.049467 107.816377) (xy 152.059415 107.827168) (xy 152.061297 107.829934) + (xy 152.06086 107.83023) (xy 152.063862 107.834022) (xy 152.06401 107.833922) (xy 152.065399 107.835963) + (xy 152.065653 107.836284) (xy 152.065761 107.836495) (xy 152.080081 107.857538) (xy 152.08264 107.861725) + (xy 152.464931 108.562593) (xy 153.073627 108.562593) (xy 153.078528 108.562834) (xy 153.115089 108.566435) + (xy 153.129322 108.57) (xy 153.196879 108.597983) (xy 153.2131 108.608822) (xy 153.264805 108.660527) + (xy 153.275644 108.676748) (xy 153.303627 108.744305) (xy 153.307433 108.763439) (xy 153.307433 108.836561) + (xy 153.303627 108.855695) (xy 153.275644 108.923252) (xy 153.264805 108.939473) (xy 153.2131 108.991178) + (xy 153.196879 109.002017) (xy 153.129322 109.03) (xy 153.115089 109.033565) (xy 153.078528 109.037166) + (xy 153.073627 109.037407) (xy 152.323998 109.037407) (xy 152.319095 109.037166) (xy 152.306682 109.035943) + (xy 152.306691 109.035842) (xy 152.297712 109.035035) (xy 152.29771 109.035059) (xy 152.294877 109.03478) + (xy 152.293097 109.03462) (xy 152.293019 109.034597) (xy 152.282537 109.033565) (xy 152.268303 109.03) + (xy 152.24605 109.020783) (xy 152.222951 109.013989) (xy 152.205667 109.004938) (xy 152.203417 109.003123) + (xy 152.200746 109.002017) (xy 152.184525 108.991178) (xy 152.167496 108.974149) (xy 152.148752 108.95903) + (xy 152.138807 108.948243) (xy 152.132878 108.939531) (xy 152.13282 108.939473) (xy 152.131805 108.937954) + (xy 152.13023 108.93564) (xy 152.130249 108.935626) (xy 152.125233 108.928122) (xy 152.125152 108.928178) + (xy 152.118137 108.917869) (xy 152.115579 108.913683) (xy 151.930474 108.574324) (xy 151.350533 110.372143) + (xy 151.348798 110.376737) (xy 151.34659 110.381813) (xy 151.346216 110.38165) (xy 151.343897 110.387917) + (xy 151.343929 110.387931) (xy 151.343685 110.38849) (xy 151.34296 110.390452) (xy 151.342523 110.391161) + (xy 151.334148 110.410422) (xy 151.326385 110.422874) (xy 151.314389 110.436978) (xy 151.304703 110.452755) + (xy 151.291446 110.467071) (xy 151.284539 110.472079) (xy 151.279015 110.478576) (xy 151.263718 110.490688) + (xy 151.247239 110.499127) (xy 151.232252 110.509997) (xy 151.214526 110.51815) (xy 151.206231 110.520133) + (xy 151.198638 110.524023) (xy 151.17987 110.529359) (xy 151.161415 110.53085) (xy 151.143411 110.535156) + (xy 151.123913 110.535904) (xy 151.115488 110.534561) (xy 151.106988 110.535249) (xy 151.087605 110.532997) + (xy 151.069986 110.527312) (xy 151.051704 110.524401) (xy 151.033403 110.51763) (xy 151.026134 110.513166) + (xy 151.018019 110.510549) (xy 151.000976 110.501053) (xy 150.986867 110.489055) (xy 150.971093 110.479369) + (xy 150.95678 110.466116) (xy 150.95177 110.459208) (xy 150.945271 110.453681) (xy 150.933161 110.438387) + (xy 150.924718 110.421904) (xy 150.91385 110.406917) (xy 150.907073 110.393904) (xy 150.900208 110.374052) + (xy 150.899824 110.373301) (xy 150.899246 110.371269) (xy 150.899059 110.370727) (xy 150.899089 110.370716) + (xy 150.897259 110.364279) (xy 150.896876 110.364412) (xy 150.895068 110.359183) (xy 150.893694 110.354473) + (xy 150.670286 109.420223) (xy 150.645813 109.436576) (xy 150.637169 109.441196) (xy 150.514979 109.491809) + (xy 150.505599 109.494654) (xy 150.375883 109.520456) (xy 150.366129 109.521417) (xy 150.233871 109.521417) + (xy 150.224117 109.520456) (xy 150.094401 109.494654) (xy 150.085021 109.491809) (xy 149.962831 109.441196) + (xy 149.954187 109.436576) (xy 149.944016 109.42978) (xy 149.781606 110.128145) (xy 149.780261 110.132867) + (xy 149.777797 110.140138) (xy 149.777514 110.140042) (xy 149.774445 110.150476) (xy 149.774016 110.151293) + (xy 149.768473 110.167657) (xy 149.761775 110.180715) (xy 149.749951 110.197234) (xy 149.740519 110.215243) + (xy 149.728266 110.23043) (xy 149.72312 110.234724) (xy 149.71922 110.240175) (xy 149.704986 110.253523) + (xy 149.687729 110.264266) (xy 149.672134 110.277286) (xy 149.655003 110.286628) (xy 149.648602 110.288627) + (xy 149.642916 110.292169) (xy 149.624659 110.299054) (xy 149.60461 110.302375) (xy 149.585212 110.308438) + (xy 149.565811 110.310512) (xy 149.559132 110.30991) (xy 149.552522 110.311006) (xy 149.533019 110.310379) + (xy 149.513231 110.305776) (xy 149.492986 110.303954) (xy 149.474269 110.298446) (xy 149.468329 110.295334) + (xy 149.461802 110.293817) (xy 149.444024 110.285775) (xy 149.427496 110.273945) (xy 149.409497 110.264518) + (xy 149.394311 110.252267) (xy 149.390014 110.247119) (xy 149.384564 110.243219) (xy 149.371217 110.228986) + (xy 149.360474 110.211733) (xy 149.347452 110.196133) (xy 149.339804 110.183612) (xy 149.333052 110.167691) + (xy 149.332565 110.166908) (xy 149.328731 110.156739) (xy 149.328458 110.156855) (xy 149.325461 110.149787) + (xy 149.32377 110.145182) (xy 148.77325 108.383519) (xy 148.571391 108.88817) (xy 148.569347 108.892631) + (xy 148.552425 108.92524) (xy 148.543806 108.937155) (xy 148.543441 108.937527) (xy 148.542142 108.939474) + (xy 148.517301 108.964313) (xy 148.492759 108.989463) (xy 148.49083 108.990785) (xy 148.490459 108.991157) + (xy 148.483587 108.995751) (xy 148.476649 109.000508) (xy 148.476157 109.000718) (xy 148.474215 109.002017) + (xy 148.441758 109.01546) (xy 148.40946 109.029303) (xy 148.407171 109.029787) (xy 148.40667 109.029995) + (xy 148.392426 109.033565) (xy 148.355865 109.037166) (xy 148.350964 109.037407) (xy 147.526372 109.037407) + (xy 147.521471 109.037166) (xy 147.48491 109.033565) (xy 147.470677 109.03) (xy 147.40312 109.002017) + (xy 147.386899 108.991178) (xy 147.335194 108.939473) (xy 147.324355 108.923252) (xy 147.296372 108.855695) + (xy 147.292566 108.836561) (xy 147.292566 108.763439) (xy 147.296372 108.744305) (xy 147.324355 108.676748) + (xy 147.335194 108.660527) (xy 147.386899 108.608822) (xy 147.40312 108.597983) (xy 147.470677 108.57) + (xy 147.48491 108.566435) (xy 147.521471 108.562834) (xy 147.526372 108.562593) (xy 148.190231 108.562593) + (xy 148.580314 107.587385) (xy 148.582358 107.582925) (xy 148.59928 107.550316) (xy 148.607875 107.538426) + (xy 148.609506 107.536754) (xy 148.610593 107.53468) (xy 148.622842 107.519498) (xy 148.64175 107.503713) + (xy 148.658948 107.486092) (xy 148.675035 107.475057) (xy 148.677184 107.474135) (xy 148.678979 107.472638) + (xy 148.696106 107.463298) (xy 148.719609 107.455952) (xy 148.742246 107.446252) (xy 148.76133 107.442214) + (xy 148.763669 107.442185) (xy 148.765901 107.441488) (xy 148.785296 107.439413) (xy 148.80983 107.441621) + (xy 148.83445 107.441322) (xy 148.85363 107.444895) (xy 148.855795 107.445761) (xy 148.858125 107.445971) + (xy 148.87684 107.451478) (xy 148.898657 107.462905) (xy 148.921522 107.472052) (xy 148.937874 107.482692) + (xy 148.939544 107.484322) (xy 148.941615 107.485407) (xy 148.9568 107.497658) (xy 148.972583 107.516566) + (xy 148.990204 107.533762) (xy 149.001242 107.549854) (xy 149.002161 107.551999) (xy 149.003657 107.553791) + (xy 149.011307 107.566315) (xy 149.025649 107.600137) (xy 149.027341 107.604743) (xy 149.516748 109.170849) + (xy 149.582218 108.889329) (xy 149.579544 108.875883) (xy 149.578583 108.866129) (xy 149.578583 108.757236) + (xy 149.975186 108.757236) (xy 149.975186 108.842763) (xy 149.997321 108.925373) (xy 150.033072 108.987296) + (xy 150.033072 108.987297) (xy 150.040084 108.999442) (xy 150.100557 109.059915) (xy 150.174626 109.102679) + (xy 150.257237 109.124815) (xy 150.342763 109.124815) (xy 150.425373 109.102679) (xy 150.499442 109.059915) + (xy 150.559915 108.999442) (xy 150.576768 108.970252) (xy 150.57677 108.970246) (xy 150.602679 108.925371) + (xy 150.624814 108.842763) (xy 150.624814 108.757236) (xy 150.602678 108.674626) (xy 150.559915 108.600558) + (xy 150.499441 108.540084) (xy 150.472099 108.524298) (xy 150.472097 108.524296) (xy 150.425373 108.49732) + (xy 150.342763 108.475185) (xy 150.257237 108.475185) (xy 150.174626 108.49732) (xy 150.139952 108.517338) + (xy 150.139947 108.517343) (xy 150.100557 108.540085) (xy 150.040084 108.600558) (xy 149.997321 108.674626) + (xy 149.975186 108.757236) (xy 149.578583 108.757236) (xy 149.578583 108.733871) (xy 149.579544 108.724117) + (xy 149.605346 108.594401) (xy 149.608191 108.585021) (xy 149.658804 108.462831) (xy 149.663424 108.454187) + (xy 149.694086 108.408295) (xy 149.759898 108.125304) (xy 149.770763 108.078583) (xy 150.258248 108.078583) + (xy 150.34946 108.078583) (xy 150.303218 107.885211) (xy 150.258248 108.078583) (xy 149.770763 108.078583) + (xy 149.878736 107.614304) (xy 149.88773 107.57563) (xy 150.156296 107.57563) (xy 150.443703 107.57563) + (xy 150.443703 107.175778) (xy 150.156296 107.175778) (xy 150.156296 107.57563) (xy 149.88773 107.57563) + (xy 150.068764 106.797187) (xy 150.070107 106.792472) (xy 150.072639 106.784997) (xy 150.097852 106.756209) + (xy 150.119996 106.751038) (xy 150.480076 106.751038) + ) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "F.Mask") + (uuid "d0e83a23-de62-4883-b3fa-c93f6d97d8f3") + ) + (gr_poly + (pts + (xy 132.014825 106.538373) (xy 132.015777 106.544349) (xy 132.023099 106.565961) (xy 132.483558 108.545937) + (xy 132.527226 108.61129) (xy 132.589086 108.760633) (xy 132.620622 108.919176) (xy 132.620622 109.080824) + (xy 132.61478 109.11019) (xy 132.748651 109.685832) (xy 133.413799 107.557359) (xy 133.431329 107.51602) + (xy 133.438891 107.50696) (xy 133.443541 107.496112) (xy 133.467314 107.472911) (xy 133.488601 107.447411) + (xy 133.499056 107.441934) (xy 133.507502 107.433692) (xy 133.53834 107.421356) (xy 133.56777 107.405941) + (xy 133.579525 107.404882) (xy 133.590482 107.4005) (xy 133.6237 107.400904) (xy 133.656782 107.397926) + (xy 133.668043 107.401445) (xy 133.679848 107.401589) (xy 133.710386 107.414676) (xy 133.742086 107.424583) + (xy 133.751145 107.432145) (xy 133.761994 107.436795) (xy 133.785194 107.460568) (xy 133.810695 107.481855) + (xy 133.816171 107.492309) (xy 133.824414 107.500756) (xy 133.845096 107.540612) (xy 134.33723 108.770947) + (xy 135.189989 108.770947) (xy 135.234675 108.775348) (xy 135.317244 108.809549) (xy 135.38044 108.872745) + (xy 135.414641 108.955314) (xy 135.414641 109.044686) (xy 135.38044 109.127255) (xy 135.317244 109.190451) + (xy 135.234675 109.224652) (xy 135.189989 109.229053) (xy 134.182154 109.229053) (xy 134.137468 109.224652) + (xy 134.136155 109.224108) (xy 134.134732 109.224091) (xy 134.094899 109.207019) (xy 134.054899 109.190451) + (xy 134.053893 109.189445) (xy 134.052586 109.188885) (xy 134.022327 109.157879) (xy 133.991703 109.127255) + (xy 133.991158 109.125941) (xy 133.990166 109.124924) (xy 133.969484 109.085068) (xy 133.658949 108.30873) + (xy 132.93484 110.625883) (xy 132.931176 110.634522) (xy 132.930539 110.63837) (xy 132.927421 110.643376) + (xy 132.91731 110.667222) (xy 132.898673 110.689548) (xy 132.8833 110.714238) (xy 132.87029 110.723549) + (xy 132.860038 110.735831) (xy 132.834273 110.749327) (xy 132.810624 110.766253) (xy 132.795042 110.769876) + (xy 132.780869 110.777301) (xy 132.751899 110.779909) (xy 132.723575 110.786497) (xy 132.707792 110.783881) + (xy 132.691857 110.785317) (xy 132.664098 110.776642) (xy 132.635405 110.771888) (xy 132.621821 110.76343) + (xy 132.606553 110.758659) (xy 132.58423 110.740024) (xy 132.559537 110.72465) (xy 132.550224 110.711637) + (xy 132.537944 110.701387) (xy 132.524449 110.675625) (xy 132.507522 110.651974) (xy 132.499211 110.627444) + (xy 132.496474 110.622218) (xy 132.496123 110.61833) (xy 132.493114 110.609446) (xy 132.2746 109.669836) + (xy 132.18871 109.727226) (xy 132.039367 109.789086) (xy 131.880824 109.820622) (xy 131.719176 109.820622) + (xy 131.560633 109.789086) (xy 131.41129 109.727226) (xy 131.308402 109.658478) (xy 131.014937 110.885698) + (xy 131.012727 110.892087) (xy 131.012487 110.895067) (xy 131.010057 110.899809) (xy 131.000264 110.928135) + (xy 130.984211 110.950271) (xy 130.971744 110.974612) (xy 130.958219 110.986113) (xy 130.947798 111.000485) + (xy 130.924494 111.014794) (xy 130.903662 111.032511) (xy 130.886765 111.037961) (xy 130.871637 111.047251) + (xy 130.844629 111.051553) (xy 130.818606 111.059948) (xy 130.800911 111.058517) (xy 130.783378 111.061311) + (xy 130.756782 111.054951) (xy 130.729524 111.052748) (xy 130.71372 111.044653) (xy 130.696456 111.040525) + (xy 130.674319 111.024472) (xy 130.649979 111.012005) (xy 130.638478 110.998481) (xy 130.624106 110.988059) + (xy 130.609795 110.964752) (xy 130.592081 110.943923) (xy 130.580127 110.916437) (xy 130.57734 110.911898) + (xy 130.576869 110.908947) (xy 130.574173 110.902746) (xy 129.821676 108.570007) (xy 129.527309 109.109682) + (xy 129.518735 109.122281) (xy 129.516675 109.127255) (xy 129.51253 109.131399) (xy 129.502047 109.146805) + (xy 129.476598 109.167331) (xy 129.453479 109.190451) (xy 129.442083 109.195171) (xy 129.432484 109.202914) + (xy 129.401119 109.212138) (xy 129.37091 109.224652) (xy 129.352365 109.226478) (xy 129.346743 109.228132) + (xy 129.341391 109.227559) (xy 129.326224 109.229053) (xy 128.41001 109.229053) (xy 128.365324 109.224652) + (xy 128.282755 109.190451) (xy 128.219559 109.127255) (xy 128.185358 109.044686) (xy 128.185358 108.955314) + (xy 128.219559 108.872745) (xy 128.282755 108.809549) (xy 128.365324 108.775348) (xy 128.41001 108.770947) + (xy 129.19025 108.770947) (xy 129.674867 107.882483) (xy 129.694506 107.853623) (xy 129.696373 107.849979) + (xy 129.697829 107.84874) (xy 129.700129 107.845361) (xy 129.732618 107.819155) (xy 129.764455 107.79208) + (xy 129.767337 107.79115) (xy 129.769692 107.789251) (xy 129.80974 107.777472) (xy 129.849511 107.764643) + (xy 129.852529 107.764886) (xy 129.855433 107.764033) (xy 129.896962 107.768478) (xy 129.938593 107.771844) + (xy 129.941286 107.773223) (xy 129.944297 107.773546) (xy 129.980961 107.793544) (xy 130.018138 107.812586) + (xy 130.020099 107.814892) (xy 130.022757 107.816342) (xy 130.048972 107.848843) (xy 130.076037 107.880668) + (xy 130.077669 107.884421) (xy 130.078866 107.885905) (xy 130.080018 107.889823) (xy 130.093944 107.921845) + (xy 130.759375 109.984682) (xy 130.979378 109.064671) (xy 130.979378 108.939689) (xy 131.341893 108.939689) + (xy 131.341893 109.060311) (xy 131.373112 109.176823) (xy 131.408799 109.238635) (xy 131.408799 109.238637) + (xy 131.433422 109.281285) (xy 131.518715 109.366578) (xy 131.623177 109.426889) (xy 131.739689 109.458108) + (xy 131.860311 109.458108) (xy 131.976823 109.426889) (xy 132.081285 109.366578) (xy 132.166578 109.281285) + (xy 132.179168 109.259478) (xy 132.179167 109.259476) (xy 132.226888 109.176823) (xy 132.258107 109.060311) + (xy 132.258107 108.939689) (xy 132.226888 108.823177) (xy 132.166577 108.718716) (xy 132.081284 108.633423) + (xy 132.026174 108.601605) (xy 132.026174 108.601603) (xy 131.976823 108.573111) (xy 131.860311 108.541892) + (xy 131.739689 108.541892) (xy 131.623177 108.573111) (xy 131.5591 108.610105) (xy 131.559099 108.610107) + (xy 131.518716 108.633423) (xy 131.433423 108.718716) (xy 131.373112 108.823177) (xy 131.341893 108.939689) + (xy 130.979378 108.939689) (xy 130.979378 108.919176) (xy 131.010914 108.760633) (xy 131.072774 108.61129) + (xy 131.096167 108.576278) (xy 131.188228 108.191297) (xy 131.65925 108.191297) (xy 131.719176 108.179378) + (xy 131.880824 108.179378) (xy 131.930269 108.189213) (xy 131.796893 107.615698) (xy 131.65925 108.191297) + (xy 131.188228 108.191297) (xy 131.34339 107.542437) (xy 131.585473 107.542437) (xy 132.014526 107.542437) + (xy 132.014526 106.975952) (xy 131.585473 106.975952) (xy 131.585473 107.542437) (xy 131.34339 107.542437) + (xy 131.577228 106.564573) (xy 131.584684 106.543006) (xy 131.585674 106.537037) (xy 131.58719 106.534602) + (xy 132.012509 106.534602) + ) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.Cu") + (uuid "ea8d243b-3d45-49f8-92ae-580229fc7986") + ) + (gr_poly + (pts + (xy 132.047864 106.499247) (xy 132.055115 106.508435) (xy 132.057431 106.512206) (xy 132.064202 106.530507) + (xy 132.064488 106.532306) (xy 132.070455 106.549917) (xy 132.071799 106.554635) (xy 132.530193 108.525734) + (xy 132.568799 108.583511) (xy 132.57342 108.592156) (xy 132.63528 108.741499) (xy 132.638125 108.750879) + (xy 132.669661 108.909422) (xy 132.670622 108.919176) (xy 132.670622 109.080824) (xy 132.669661 109.09058) + (xy 132.665923 109.109369) (xy 132.755731 109.495543) (xy 133.366075 107.542445) (xy 133.367767 107.537839) + (xy 133.385297 107.4965) (xy 133.392943 107.483981) (xy 133.395816 107.480537) (xy 133.397585 107.476413) + (xy 133.408619 107.460329) (xy 133.430562 107.438913) (xy 133.450217 107.415369) (xy 133.465399 107.40312) + (xy 133.469371 107.401038) (xy 133.472581 107.397907) (xy 133.488931 107.387269) (xy 133.517396 107.375882) + (xy 133.54457 107.361649) (xy 133.563284 107.356143) (xy 133.56775 107.35574) (xy 133.571915 107.354075) + (xy 133.59109 107.350504) (xy 133.62175 107.350876) (xy 133.652299 107.348127) (xy 133.671696 107.350202) + (xy 133.675972 107.351538) (xy 133.680458 107.351593) (xy 133.699543 107.355631) (xy 133.727735 107.367712) + (xy 133.757001 107.376859) (xy 133.774127 107.386199) (xy 133.777566 107.38907) (xy 133.781691 107.390838) + (xy 133.797778 107.401874) (xy 133.819195 107.42382) (xy 133.842736 107.443471) (xy 133.854986 107.458654) + (xy 133.857065 107.462624) (xy 133.860199 107.465835) (xy 133.868794 107.477726) (xy 133.889476 107.517582) + (xy 133.89152 107.522042) (xy 134.371082 108.720947) (xy 135.189989 108.720947) (xy 135.19489 108.721188) + (xy 135.239576 108.725589) (xy 135.253809 108.729154) (xy 135.336378 108.763355) (xy 135.352599 108.774194) + (xy 135.415795 108.83739) (xy 135.426634 108.853611) (xy 135.460835 108.93618) (xy 135.464641 108.955314) + (xy 135.464641 109.044686) (xy 135.460835 109.06382) (xy 135.426634 109.146389) (xy 135.415795 109.16261) + (xy 135.352599 109.225806) (xy 135.336378 109.236645) (xy 135.253809 109.270846) (xy 135.239576 109.274411) + (xy 135.19489 109.278812) (xy 135.189989 109.279053) (xy 134.182154 109.279053) (xy 134.177253 109.278812) + (xy 134.132567 109.274411) (xy 134.11833 109.270844) (xy 134.11784 109.270641) (xy 134.115035 109.270048) + (xy 134.075466 109.253089) (xy 134.035765 109.236645) (xy 134.033383 109.235053) (xy 134.032894 109.234844) + (xy 134.026245 109.230283) (xy 134.019544 109.225806) (xy 134.019167 109.225429) (xy 134.016802 109.223807) + (xy 133.986705 109.192967) (xy 133.956348 109.16261) (xy 133.954757 109.160231) (xy 133.954373 109.159837) + (xy 133.945786 109.147954) (xy 133.925104 109.108098) (xy 133.92306 109.103638) (xy 133.664738 108.457834) + (xy 132.982564 110.640797) (xy 132.980871 110.645406) (xy 132.977207 110.654045) (xy 132.97706 110.653982) + (xy 132.97298 110.664804) (xy 132.971929 110.66649) (xy 132.963343 110.686741) (xy 132.955694 110.699264) + (xy 132.939282 110.718924) (xy 132.925745 110.740666) (xy 132.912399 110.754898) (xy 132.904584 110.760491) + (xy 132.898423 110.767872) (xy 132.883238 110.780123) (xy 132.860546 110.792009) (xy 132.839724 110.806912) + (xy 132.821948 110.814954) (xy 132.812585 110.81713) (xy 132.804072 110.821591) (xy 132.785352 110.8271) + (xy 132.759839 110.829396) (xy 132.734902 110.835197) (xy 132.715399 110.835824) (xy 132.705917 110.834252) + (xy 132.696345 110.835115) (xy 132.676943 110.833041) (xy 132.652501 110.825402) (xy 132.627232 110.821216) + (xy 132.608977 110.814333) (xy 132.600811 110.809249) (xy 132.59164 110.806383) (xy 132.574511 110.797043) + (xy 132.554855 110.780635) (xy 132.53311 110.767096) (xy 132.518877 110.753749) (xy 132.51328 110.745929) + (xy 132.505904 110.739772) (xy 132.493653 110.724588) (xy 132.481768 110.7019) (xy 132.466863 110.681074) + (xy 132.460166 110.668019) (xy 132.453105 110.64718) (xy 132.452181 110.645415) (xy 132.448915 110.634319) + (xy 132.448766 110.63437) (xy 132.445757 110.625486) (xy 132.444414 110.620772) (xy 132.242273 109.75157) + (xy 132.216489 109.768799) (xy 132.207844 109.77342) (xy 132.058501 109.83528) (xy 132.049121 109.838125) + (xy 131.890578 109.869661) (xy 131.880824 109.870622) (xy 131.719176 109.870622) (xy 131.709422 109.869661) + (xy 131.550879 109.838125) (xy 131.541499 109.83528) (xy 131.392156 109.77342) (xy 131.383511 109.768799) + (xy 131.34033 109.739946) (xy 131.063566 110.897327) (xy 131.06219 110.902043) (xy 131.05998 110.908432) + (xy 131.059695 110.908333) (xy 131.056985 110.917869) (xy 131.056162 110.919474) (xy 131.04752 110.944472) + (xy 131.040741 110.957489) (xy 131.02695 110.976505) (xy 131.016246 110.997405) (xy 131.004134 111.012702) + (xy 130.995179 111.020316) (xy 130.988277 111.029836) (xy 130.973961 111.043094) (xy 130.953944 111.055384) + (xy 130.936055 111.070599) (xy 130.91901 111.080097) (xy 130.907819 111.083706) (xy 130.897802 111.089858) + (xy 130.879502 111.096629) (xy 130.856302 111.100324) (xy 130.833957 111.107533) (xy 130.814576 111.109785) + (xy 130.802859 111.108837) (xy 130.791247 111.110688) (xy 130.771749 111.10994) (xy 130.748903 111.104476) + (xy 130.725496 111.102585) (xy 130.70673 111.09725) (xy 130.696261 111.091887) (xy 130.684828 111.089154) + (xy 130.667103 111.081002) (xy 130.64809 111.067214) (xy 130.627185 111.056507) (xy 130.61189 111.044397) + (xy 130.604271 111.035438) (xy 130.594753 111.028536) (xy 130.581497 111.014222) (xy 130.569205 110.994203) + (xy 130.553992 110.976315) (xy 130.54623 110.963864) (xy 130.535679 110.939603) (xy 130.534731 110.93806) + (xy 130.53129 110.928763) (xy 130.531015 110.928883) (xy 130.528319 110.922682) (xy 130.526588 110.918096) + (xy 129.809828 108.696144) (xy 129.571204 109.133625) (xy 129.568645 109.137812) (xy 129.562964 109.146159) + (xy 129.56287 109.146387) (xy 129.552026 109.162615) (xy 129.551215 109.163425) (xy 129.543385 109.174933) + (xy 129.533437 109.185724) (xy 129.510066 109.204573) (xy 129.488835 109.225806) (xy 129.472612 109.236646) + (xy 129.467867 109.23861) (xy 129.463876 109.241831) (xy 129.446591 109.250883) (xy 129.417782 109.259355) + (xy 129.390046 109.270845) (xy 129.375809 109.274411) (xy 129.361956 109.275774) (xy 129.360855 109.276099) + (xy 129.34142 109.277848) (xy 129.341176 109.277821) (xy 129.331125 109.278812) (xy 129.326224 109.279053) + (xy 128.41001 109.279053) (xy 128.405109 109.278812) (xy 128.360423 109.274411) (xy 128.34619 109.270846) + (xy 128.263621 109.236645) (xy 128.2474 109.225806) (xy 128.184204 109.16261) (xy 128.173365 109.146389) + (xy 128.139164 109.06382) (xy 128.135358 109.044686) (xy 128.135358 108.955314) (xy 128.139164 108.93618) + (xy 128.173365 108.853611) (xy 128.184204 108.83739) (xy 128.2474 108.774194) (xy 128.263621 108.763355) + (xy 128.34619 108.729154) (xy 128.360423 108.725589) (xy 128.405109 108.721188) (xy 128.41001 108.720947) + (xy 129.160568 108.720947) (xy 129.630972 107.85854) (xy 129.63353 107.854354) (xy 129.651423 107.828058) + (xy 129.651874 107.82718) (xy 129.652926 107.82585) (xy 129.653169 107.825494) (xy 129.653194 107.825511) + (xy 129.656874 107.820862) (xy 129.656496 107.820605) (xy 129.658796 107.817226) (xy 129.668738 107.806443) + (xy 129.700718 107.780647) (xy 129.732063 107.753991) (xy 129.737572 107.75092) (xy 129.738306 107.750329) + (xy 129.743721 107.747493) (xy 129.7491 107.744496) (xy 129.750003 107.744204) (xy 129.755583 107.741283) + (xy 129.794987 107.729693) (xy 129.834161 107.717057) (xy 129.840431 107.716327) (xy 129.841342 107.71606) + (xy 129.847419 107.715514) (xy 129.853524 107.714804) (xy 129.854476 107.71488) (xy 129.860754 107.714317) + (xy 129.901648 107.718694) (xy 129.942623 107.722007) (xy 129.94868 107.723729) (xy 129.94963 107.723831) + (xy 129.955533 107.725677) (xy 129.961382 107.72734) (xy 129.962217 107.727767) (xy 129.968239 107.729651) + (xy 130.004331 107.749337) (xy 130.040932 107.768084) (xy 130.045871 107.771994) (xy 130.046702 107.772448) + (xy 130.05143 107.776396) (xy 130.056228 107.780195) (xy 130.056836 107.78091) (xy 130.061675 107.784951) + (xy 130.08748 107.816943) (xy 130.114126 107.848276) (xy 130.121889 107.860729) (xy 130.123521 107.864482) + (xy 130.123099 107.864665) (xy 130.125838 107.869896) (xy 130.12587 107.869883) (xy 130.126062 107.870325) + (xy 130.126835 107.871801) (xy 130.127108 107.87273) (xy 130.139796 107.901905) (xy 130.141529 107.906495) + (xy 130.752217 109.799628) (xy 130.929378 109.058775) (xy 130.929378 108.94627) (xy 131.391893 108.94627) + (xy 131.391893 109.053729) (xy 131.419704 109.157523) (xy 131.4521 109.213635) (xy 131.452101 109.213638) + (xy 131.473432 109.250585) (xy 131.549414 109.326567) (xy 131.642476 109.380296) (xy 131.746271 109.408108) + (xy 131.853729 109.408108) (xy 131.957523 109.380296) (xy 132.050585 109.326567) (xy 132.126565 109.250587) + (xy 132.135861 109.234485) (xy 132.135866 109.234476) (xy 132.180295 109.157523) (xy 132.208107 109.053729) + (xy 132.208107 108.94627) (xy 132.180295 108.842476) (xy 132.126566 108.749415) (xy 132.050584 108.673433) + (xy 132.001174 108.644906) (xy 132.001171 108.644903) (xy 131.957522 108.619703) (xy 131.853729 108.591892) + (xy 131.746271 108.591892) (xy 131.642479 108.619702) (xy 131.584102 108.653405) (xy 131.5841 108.653408) + (xy 131.549414 108.673434) (xy 131.473433 108.749415) (xy 131.419704 108.842476) (xy 131.391893 108.94627) + (xy 130.929378 108.94627) (xy 130.929378 108.919176) (xy 130.930339 108.909422) (xy 130.961875 108.750879) + (xy 130.96472 108.741499) (xy 131.02658 108.592156) (xy 131.0312 108.583513) (xy 131.049619 108.555944) + (xy 131.139599 108.179668) (xy 131.151625 108.129378) (xy 131.725467 108.129378) (xy 131.86502 108.129378) + (xy 131.796215 107.833519) (xy 131.725467 108.129378) (xy 131.151625 108.129378) (xy 131.294761 107.530808) + (xy 131.303937 107.492437) (xy 131.635473 107.492437) (xy 131.964526 107.492437) (xy 131.964526 107.025952) + (xy 131.635473 107.025952) (xy 131.635473 107.492437) (xy 131.303937 107.492437) (xy 131.528599 106.552944) + (xy 131.529972 106.548236) (xy 131.536049 106.530657) (xy 131.536348 106.528856) (xy 131.543228 106.510611) + (xy 131.544744 106.508176) (xy 131.575862 106.485902) (xy 131.58719 106.484602) (xy 132.012509 106.484602) + ) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.Mask") + (uuid "f862d90e-fda0-4672-ad5f-086e4219fc50") + ) + (gr_line + (start 101.5 111) + (end 102.05 111) + (stroke + (width 0.25) + (type default) + ) + (layer "F.SilkS") + (uuid "18051333-ab42-4674-8b96-b1eb04553a38") + ) + (gr_circle + (center 104.4 111) + (end 107.1 111) + (stroke + (width 0.2) + (type default) + ) + (fill no) + (layer "F.SilkS") + (uuid "573271b1-05bd-49d7-988e-55337e911211") + ) + (gr_line + (start 106.75 111) + (end 109.3 111) + (stroke + (width 0.25) + (type default) + ) + (layer "F.SilkS") + (uuid "9f872215-17f0-4584-b3e4-749b068c1dbf") + ) + (gr_line + (start 119.8 111) + (end 122.4 111) + (stroke + (width 0.25) + (type default) + ) + (layer "F.SilkS") + (uuid "d16e54d3-ba8b-4ed2-a0b6-0cd993a091da") + ) + (gr_line + (start 122.4 110.3) + (end 122.4 111.7) + (stroke + (width 0.25) + (type default) + ) + (layer "F.SilkS") + (uuid "61c537e0-8d67-4a98-919c-243da1921058") + ) + (gr_line + (start 145.802225 104.302225) + (end 147.526372 104.302225) + (stroke + (width 0.674666) + (type default) + ) + (layer "F.SilkS") + (uuid "2ab10e70-6b3c-4f37-8b10-c73c7da8253a") + ) + (gr_line + (start 145.802225 106.026372) + (end 145.802225 104.302225) + (stroke + (width 0.674666) + (type default) + ) + (layer "F.SilkS") + (uuid "c8c08d21-d409-4b42-a104-d1bb3cab1ed7") + ) + (gr_line + (start 145.802225 111.573627) + (end 145.802225 113.297774) + (stroke + (width 0.674666) + (type default) + ) + (layer "F.SilkS") + (uuid "125b6de3-4e76-43b4-b1ab-b3e3343f72bf") + ) + (gr_line + (start 145.802225 113.297774) + (end 147.526372 113.297774) + (stroke + (width 0.674666) + (type default) + ) + (layer "F.SilkS") + (uuid "4f41f0a2-def8-4d5c-89cc-8e4292d16f0a") + ) + (gr_arc + (start 147.001632 106.476149) + (mid 147.199241 105.999093) + (end 147.676298 105.801483) + (stroke + (width 0.224888) + (type default) + ) + (layer "F.SilkS") + (uuid "d3621660-0d44-479d-9814-2832b7393bc6") + ) + (gr_line + (start 147.001632 111.12385) + (end 147.001632 106.476149) + (stroke + (width 0.224888) + (type default) + ) + (layer "F.SilkS") + (uuid "14b59671-10db-4036-847b-6d97d098b152") + ) + (gr_line + (start 147.676298 105.801483) + (end 152.923701 105.801483) + (stroke + (width 0.224888) + (type default) + ) + (layer "F.SilkS") + (uuid "514c999e-5cf0-477c-a639-38b088a56d87") + ) + (gr_arc + (start 147.676298 111.798516) + (mid 147.199241 111.600906) + (end 147.001632 111.12385) + (stroke + (width 0.224888) + (type default) + ) + (layer "F.SilkS") + (uuid "cf7c043b-391f-4e61-bf7c-56bb9d3caa5a") + ) + (gr_line + (start 147.751261 114.122366) + (end 152.848738 114.122366) + (stroke + (width 0.299851) + (type default) + ) + (layer "F.SilkS") + (uuid "2bf56d92-1bab-4fbc-8d01-99553296fe0c") + ) + (gr_line + (start 150.3 104.845706) + (end 150.3 104.95815) + (stroke + (width 0.187407) + (type default) + ) + (layer "F.SilkS") + (uuid "99fc1567-bc7f-4d50-99cf-a1032a9dfa83") + ) + (gr_line + (start 150.3 105.670298) + (end 150.3 105.782742) + (stroke + (width 0.187407) + (type default) + ) + (layer "F.SilkS") + (uuid "251dd620-beeb-4b89-9c64-b9d308212b03") + ) + (gr_line + (start 150.3 106.49489) + (end 150.3 106.607334) + (stroke + (width 0.187407) + (type default) + ) + (layer "F.SilkS") + (uuid "32377b69-22a9-47b2-ab1b-be2624a9d8c8") + ) + (gr_line + (start 150.3 107.319482) + (end 150.3 107.431926) + (stroke + (width 0.187407) + (type default) + ) + (layer "F.SilkS") + (uuid "0eb9ad91-c4ae-4b6a-8873-2d8fda5c43e0") + ) + (gr_circle + (center 150.3 108.8) + (end 150.574814 108.8) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "F.SilkS") + (uuid "18af174a-004a-48ff-9b6e-345025f940d7") + ) + (gr_line + (start 150.3 109.793258) + (end 150.3 109.905702) + (stroke + (width 0.187407) + (type default) + ) + (layer "F.SilkS") + (uuid "192bea3c-5102-44a3-b39f-a371282386c8") + ) + (gr_line + (start 150.3 110.61785) + (end 150.3 110.730294) + (stroke + (width 0.187407) + (type default) + ) + (layer "F.SilkS") + (uuid "fd217f56-14c0-44a2-a8c2-333fdae67e6b") + ) + (gr_line + (start 150.3 111.442442) + (end 150.3 111.554886) + (stroke + (width 0.187407) + (type default) + ) + (layer "F.SilkS") + (uuid "b8ffd16d-7787-42d9-9e4b-dc8fb6d330b3") + ) + (gr_line + (start 150.3 112.267034) + (end 150.3 112.379478) + (stroke + (width 0.187407) + (type default) + ) + (layer "F.SilkS") + (uuid "c4bae915-d609-495d-919e-e1923c774671") + ) + (gr_arc + (start 152.923701 105.801483) + (mid 153.400758 105.999093) + (end 153.598367 106.476149) + (stroke + (width 0.224888) + (type default) + ) + (layer "F.SilkS") + (uuid "8d4139c8-6dd9-4f9c-bd78-7889f3698d47") + ) + (gr_line + (start 152.923701 111.798516) + (end 147.676298 111.798516) + (stroke + (width 0.224888) + (type default) + ) + (layer "F.SilkS") + (uuid "ca74496d-1b30-4081-b31d-b0e0785c8f12") + ) + (gr_line + (start 153.073627 104.302225) + (end 154.797774 104.302225) + (stroke + (width 0.674666) + (type default) + ) + (layer "F.SilkS") + (uuid "510b3dcf-c75b-4ee5-9489-2a9bac0e0825") + ) + (gr_line + (start 153.073627 113.297774) + (end 154.797774 113.297774) + (stroke + (width 0.674666) + (type default) + ) + (layer "F.SilkS") + (uuid "7bda2fa3-e998-461a-830b-cadf92613aea") + ) + (gr_line + (start 153.598367 106.476149) + (end 153.598367 111.12385) + (stroke + (width 0.224888) + (type default) + ) + (layer "F.SilkS") + (uuid "6a5b971c-e7d5-4a44-ac0b-d1c1ba86a321") + ) + (gr_arc + (start 153.598367 111.12385) + (mid 153.400758 111.600906) + (end 152.923701 111.798516) + (stroke + (width 0.224888) + (type default) + ) + (layer "F.SilkS") + (uuid "35d1b096-71ec-4689-8152-83af08125891") + ) + (gr_line + (start 154.797774 104.302225) + (end 154.797774 106.026372) + (stroke + (width 0.674666) + (type default) + ) + (layer "F.SilkS") + (uuid "db09966f-24bf-477c-a13e-0f59162858c2") + ) + (gr_line + (start 154.797774 113.297774) + (end 154.797774 111.573627) + (stroke + (width 0.674666) + (type default) + ) + (layer "F.SilkS") + (uuid "54d7524c-f98c-4ca9-8b69-626007c6ac60") + ) + (gr_line + (start 101.5 111) + (end 103.1 111) + (stroke + (width 0.25) + (type default) + ) + (layer "B.SilkS") + (uuid "976f4a23-e4eb-45d0-93ed-d5e0a710ddad") + ) + (gr_circle + (center 104.4 111) + (end 107.1 111) + (stroke + (width 0.2) + (type default) + ) + (fill no) + (layer "B.SilkS") + (uuid "03a03cd5-7a85-4f6d-b1ca-2702b08589cf") + ) + (gr_line + (start 105.7 111) + (end 110.6 111) + (stroke + (width 0.25) + (type default) + ) + (layer "B.SilkS") + (uuid "49b83002-4ac6-4097-b5ba-5c063c2753b0") + ) + (gr_line + (start 110.6 110.3) + (end 110.6 111.7) + (stroke + (width 0.25) + (type default) + ) + (layer "B.SilkS") + (uuid "4f296d86-91c2-45ee-bdd4-de6abc1a4b98") + ) + (gr_line + (start 126.30272 103.50272) + (end 126.30272 105.61001) + (stroke + (width 0.824591) + (type default) + ) + (layer "B.SilkS") + (uuid "6408dbc9-aab9-4433-9312-1cb80b1e3d2a") + ) + (gr_line + (start 126.30272 114.497279) + (end 126.30272 112.389989) + (stroke + (width 0.824591) + (type default) + ) + (layer "B.SilkS") + (uuid "4aaac678-3587-4e52-bad3-12c71a2592ad") + ) + (gr_line + (start 127.768661 106.159738) + (end 127.768661 111.840261) + (stroke + (width 0.274863) + (type default) + ) + (layer "B.SilkS") + (uuid "71f15113-7c8e-4ec5-9c36-617662ce599d") + ) + (gr_arc + (start 127.768661 106.159738) + (mid 128.010197 105.576687) + (end 128.593253 105.335146) + (stroke + (width 0.274863) + (type default) + ) + (layer "B.SilkS") + (uuid "a29a5e8e-5c35-4525-9bc2-191506cd9191") + ) + (gr_line + (start 128.41001 103.50272) + (end 126.30272 103.50272) + (stroke + (width 0.824591) + (type default) + ) + (layer "B.SilkS") + (uuid "a50a067d-1bad-4131-ae78-2e4c0a1b98f7") + ) + (gr_line + (start 128.41001 114.497279) + (end 126.30272 114.497279) + (stroke + (width 0.824591) + (type default) + ) + (layer "B.SilkS") + (uuid "e9ca503c-d73d-42fb-857f-46fcaf749ecf") + ) + (gr_arc + (start 128.593253 112.664853) + (mid 128.010187 112.423323) + (end 127.768661 111.840261) + (stroke + (width 0.274863) + (type default) + ) + (layer "B.SilkS") + (uuid "b1a51633-bb86-4962-9d79-c65c191bde7a") + ) + (gr_line + (start 128.593253 112.664853) + (end 135.006746 112.664853) + (stroke + (width 0.274863) + (type default) + ) + (layer "B.SilkS") + (uuid "de86062f-0868-4ce4-98f9-be1bfcdca079") + ) + (gr_line + (start 131.8 104.166974) + (end 131.8 104.304406) + (stroke + (width 0.229053) + (type default) + ) + (layer "B.SilkS") + (uuid "914f959c-1fcf-4146-9fd3-1b05d4864c98") + ) + (gr_line + (start 131.8 105.174809) + (end 131.8 105.312241) + (stroke + (width 0.229053) + (type default) + ) + (layer "B.SilkS") + (uuid "2a73e1d9-584f-4c9b-8389-6f5a2f1ca5fc") + ) + (gr_line + (start 131.8 106.182644) + (end 131.8 106.320076) + (stroke + (width 0.229053) + (type default) + ) + (layer "B.SilkS") + (uuid "806b3c64-4752-4f43-9916-08928e23726a") + ) + (gr_line + (start 131.8 107.190478) + (end 131.8 107.32791) + (stroke + (width 0.229053) + (type default) + ) + (layer "B.SilkS") + (uuid "600001ed-965b-418c-9b69-8c73aa501a3a") + ) + (gr_circle + (center 131.8 109) + (end 132.158106 109) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4c52f557-d172-4b96-bef7-f1fbf59c8a0f") + ) + (gr_line + (start 131.8 110.213982) + (end 131.8 110.351414) + (stroke + (width 0.229053) + (type default) + ) + (layer "B.SilkS") + (uuid "8db31ac3-7623-4d1b-aa96-949a30b5f220") + ) + (gr_line + (start 131.8 111.221817) + (end 131.8 111.359249) + (stroke + (width 0.229053) + (type default) + ) + (layer "B.SilkS") + (uuid "7b3b1633-0116-4166-9219-66e67e1a9fce") + ) + (gr_line + (start 131.8 112.229651) + (end 131.8 112.367083) + (stroke + (width 0.229053) + (type default) + ) + (layer "B.SilkS") + (uuid "9b1fb0f4-ea7a-4ee4-91f1-daa7170457e8") + ) + (gr_line + (start 131.8 113.237486) + (end 131.8 113.374918) + (stroke + (width 0.229053) + (type default) + ) + (layer "B.SilkS") + (uuid "cdc2bffa-7a1b-4a5d-82ea-f9b3e1c8f670") + ) + (gr_line + (start 134.915125 115.505114) + (end 128.684874 115.505114) + (stroke + (width 0.366485) + (type default) + ) + (layer "B.SilkS") + (uuid "a8cb39db-a7cb-43f0-a4a3-84e91fa1a4ac") + ) + (gr_line + (start 135.006746 105.335146) + (end 128.593253 105.335146) + (stroke + (width 0.274863) + (type default) + ) + (layer "B.SilkS") + (uuid "7ef5556d-48b3-4db8-a66d-4330771d7253") + ) + (gr_arc + (start 135.006746 105.335146) + (mid 135.589813 105.576676) + (end 135.831338 106.159738) + (stroke + (width 0.274863) + (type default) + ) + (layer "B.SilkS") + (uuid "d3a81eac-68b1-4ab7-90c9-3a244c1fa253") + ) + (gr_arc + (start 135.831338 111.840261) + (mid 135.589802 112.423312) + (end 135.006746 112.664853) + (stroke + (width 0.274863) + (type default) + ) + (layer "B.SilkS") + (uuid "721a7521-20a2-4cbc-98f7-a859bcba8517") + ) + (gr_line + (start 135.831338 111.840261) + (end 135.831338 106.159738) + (stroke + (width 0.274863) + (type default) + ) + (layer "B.SilkS") + (uuid "91293c3d-7f9f-4bd4-ba0d-ad723850c4a4") + ) + (gr_line + (start 137.297279 103.50272) + (end 135.189989 103.50272) + (stroke + (width 0.824591) + (type default) + ) + (layer "B.SilkS") + (uuid "273b2e0a-480f-4c76-8eba-f493087eb97e") + ) + (gr_line + (start 137.297279 105.61001) + (end 137.297279 103.50272) + (stroke + (width 0.824591) + (type default) + ) + (layer "B.SilkS") + (uuid "b58f2ccd-bd00-46f8-8357-f534ec0353af") + ) + (gr_line + (start 137.297279 112.389989) + (end 137.297279 114.497279) + (stroke + (width 0.824591) + (type default) + ) + (layer "B.SilkS") + (uuid "d4b5c999-daa4-4cfa-9737-51605f7195e9") + ) + (gr_line + (start 137.297279 114.497279) + (end 135.189989 114.497279) + (stroke + (width 0.824591) + (type default) + ) + (layer "B.SilkS") + (uuid "e853fad2-2e3a-47c6-af91-7db70b8c57b7") + ) + (gr_rect + (start 140 102.675) + (end 156.65 103.125) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "8eaa4ed3-335e-488c-902f-9baa61348187") + ) + (gr_rect + (start 140 103.125) + (end 156.65 103.575) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "7d5ceb49-8ebc-4c65-8117-fa0a622e1987") + ) + (gr_rect + (start 140 103.575) + (end 156.65 104.025) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3fb3c4ae-daa1-4333-b44f-03a826b7a041") + ) + (gr_rect + (start 140 104.025) + (end 156.65 104.475) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "45b6063e-6821-4bb0-b28c-1ca7c2748025") + ) + (gr_rect + (start 140 104.475) + (end 141.8 104.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "e050de80-d03b-4ac1-acad-4df46757e9ef") + ) + (gr_rect + (start 140 104.925) + (end 141.8 105.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "e7129777-dc4a-406b-ac86-01b11261bdd2") + ) + (gr_rect + (start 140 105.375) + (end 141.8 105.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4208348b-943e-4883-b75b-7beac811be96") + ) + (gr_rect + (start 140 105.825) + (end 141.8 106.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "20776142-3a2a-49f4-aaa4-3c37aebc81c1") + ) + (gr_rect + (start 140 106.275) + (end 141.8 106.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "b7c8d204-a07e-4aba-abb7-0b7bc08bac17") + ) + (gr_rect + (start 140 106.725) + (end 141.8 107.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "a7334358-a508-4982-ab86-be9e3d03a1ed") + ) + (gr_rect + (start 140 107.175) + (end 141.8 107.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "426a2966-28d7-4c62-8701-348b57f6cee7") + ) + (gr_rect + (start 140 107.625) + (end 145.4 108.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "33a480b0-b554-4a95-8cf4-52cf5797824d") + ) + (gr_rect + (start 140 108.075) + (end 141.8 108.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "398ab761-7d57-41e3-8c08-4af84e73fc32") + ) + (gr_rect + (start 140 108.525) + (end 141.8 108.975) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4379d499-758f-4780-b242-91e000040d5e") + ) + (gr_rect + (start 140 108.975) + (end 142.25 109.425) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "b46c8538-b6c1-45ea-bc51-babbcd5a9718") + ) + (gr_rect + (start 140 109.425) + (end 141.8 109.875) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "7d718336-3e23-422b-9831-43aa6a29faff") + ) + (gr_rect + (start 140 109.875) + (end 142.7 110.325) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "a7e918f2-e000-4f3c-a15f-5e0e9427f684") + ) + (gr_rect + (start 140 110.325) + (end 141.8 110.775) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "b315bfd2-2fdf-4506-837e-36968bf1a13e") + ) + (gr_rect + (start 140 110.775) + (end 141.8 111.225) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "df292594-9f87-4643-a0e1-a4e6f4b26de4") + ) + (gr_rect + (start 140 111.225) + (end 142.25 111.675) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "903a5191-e36d-4857-91a4-ae1aeb8d7f77") + ) + (gr_rect + (start 140 111.675) + (end 142.25 112.125) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "97724ef1-9b28-4e04-987a-69c8c45958ad") + ) + (gr_rect + (start 140 112.125) + (end 142.25 112.575) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "fcfe9aa7-6f09-4d57-b1b5-2f74dd3c7a8e") + ) + (gr_rect + (start 140 112.575) + (end 142.7 113.025) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "ef0cfd37-6bf3-4e66-8308-4202ebb2955a") + ) + (gr_rect + (start 140 113.025) + (end 142.7 113.475) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "524ad889-3873-4a3b-8bbe-3399dfde6d35") + ) + (gr_rect + (start 140 113.475) + (end 142.7 113.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "aa946285-d18e-4ba2-9c4a-4542135efff5") + ) + (gr_rect + (start 140 113.925) + (end 141.8 114.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4f3d05c5-d854-4756-aa31-5d1ba9a870b1") + ) + (gr_rect + (start 140 114.375) + (end 142.25 114.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "cab5617b-5500-499b-a1ff-daf9a142488f") + ) + (gr_rect + (start 140 114.825) + (end 141.8 115.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "2ad79929-81c2-49bd-8841-2674d37d7287") + ) + (gr_rect + (start 140 115.275) + (end 142.7 115.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "5681086b-fe62-4cfd-a7ba-6859ed1f9b48") + ) + (gr_rect + (start 140 115.725) + (end 141.8 116.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "8836aadd-a818-4825-adbf-f4b5a0d41654") + ) + (gr_rect + (start 140 116.175) + (end 141.8 116.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "106cfeb9-dc46-48fb-9170-9b80542de696") + ) + (gr_rect + (start 140 116.625) + (end 142.25 117.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4684bcb7-444b-4ea0-b7ea-d0e1e90ccede") + ) + (gr_rect + (start 140 117.075) + (end 142.25 117.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3ece503d-8525-4f99-b12f-a7167adea2c1") + ) + (gr_rect + (start 140 117.525) + (end 156.65 117.975) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "b0029c23-4cae-41d9-be7b-268f41b355cc") + ) + (gr_rect + (start 140 117.975) + (end 156.65 118.425) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "ad0d14ef-ee95-482e-bead-370b313fcb1b") + ) + (gr_rect + (start 140 118.425) + (end 156.65 118.875) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "dd977b2d-1c12-46a3-af0a-08f68213dfb1") + ) + (gr_rect + (start 140 118.875) + (end 156.65 119.325) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "d7dcd124-b3fc-4600-ab22-a7e98f733e61") + ) + (gr_rect + (start 142.25 104.925) + (end 144.5 105.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "e5af0eaf-1e99-41e5-acb4-8e3adaff194e") + ) + (gr_rect + (start 142.25 105.375) + (end 142.7 105.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4e98cfd1-e192-4b57-acb3-89fe6869b4fc") + ) + (gr_rect + (start 142.25 105.825) + (end 142.7 106.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "ff98a493-6869-46e7-87ca-d7d6c10cb215") + ) + (gr_rect + (start 142.25 106.275) + (end 142.7 106.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "f39d782e-373c-4c8d-abd5-7e327367e684") + ) + (gr_rect + (start 142.25 106.725) + (end 144.5 107.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "084fba05-2f58-4906-a770-006076d5551a") + ) + (gr_rect + (start 142.25 108.525) + (end 143.6 108.975) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "d640d5d3-b509-4e58-9d3d-aceef58d6d63") + ) + (gr_rect + (start 142.25 109.425) + (end 143.6 109.875) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "0a7309be-bbf0-42e2-b06d-8c4135373a9e") + ) + (gr_rect + (start 142.25 114.825) + (end 143.15 115.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "fb0dc308-fb87-45fe-b0ef-17e8a2ccfc7e") + ) + (gr_rect + (start 142.25 115.725) + (end 143.15 116.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "9551a513-b779-42d6-b9bb-4835116ed639") + ) + (gr_rect + (start 142.25 116.175) + (end 142.7 116.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "8e4f96fe-648e-4329-b583-e7cb32d73240") + ) + (gr_rect + (start 142.7 108.075) + (end 143.15 108.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3f166812-291a-4791-8f82-5cce96f41513") + ) + (gr_rect + (start 142.7 111.225) + (end 143.6 111.675) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "8b2eadfe-6045-4377-af21-15938c716c6f") + ) + (gr_rect + (start 142.7 111.675) + (end 143.15 112.125) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "8cba0675-3d0f-41a6-bd1c-89620f7690c7") + ) + (gr_rect + (start 142.7 114.375) + (end 143.15 114.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "cbacc6ca-186b-4b74-9695-3150407ae7ad") + ) + (gr_rect + (start 142.7 116.625) + (end 143.15 117.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "ee2faff7-bdd3-4308-95a2-f11f70301910") + ) + (gr_rect + (start 142.7 117.075) + (end 143.6 117.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "22c370b8-8c9b-4f14-b4d7-385ad57f8c06") + ) + (gr_rect + (start 143.15 108.975) + (end 143.6 109.425) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "2d1ecf15-675f-4e09-8d55-7695cbba5ddb") + ) + (gr_rect + (start 143.15 110.325) + (end 144.5 110.775) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "79236812-f3f0-4cf1-a928-539c83c244a0") + ) + (gr_rect + (start 143.15 110.775) + (end 144.05 111.225) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "641861da-b6f2-4fbe-8af9-87d558e63bb1") + ) + (gr_rect + (start 143.15 112.575) + (end 143.6 113.025) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "5114fa8b-6ba3-44d6-bab3-c74e4619550c") + ) + (gr_rect + (start 143.15 113.025) + (end 144.5 113.475) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "ff079b60-6056-44c4-97f4-d619de6d1609") + ) + (gr_rect + (start 143.15 115.275) + (end 143.6 115.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "40706b3d-4066-417d-a783-645dcf174434") + ) + (gr_rect + (start 143.15 116.175) + (end 144.05 116.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "35595c59-1507-471b-b363-b1c2c307e61c") + ) + (gr_rect + (start 143.6 108.075) + (end 144.5 108.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "7c717051-2d28-4ad7-925d-a9c69a772729") + ) + (gr_rect + (start 143.6 109.875) + (end 144.95 110.325) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "ec6a4e75-711b-4524-b4a2-df1535442252") + ) + (gr_rect + (start 143.6 112.125) + (end 144.05 112.575) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "c1db26d6-ca87-4979-b60b-5cef97270b97") + ) + (gr_rect + (start 144.05 105.375) + (end 144.5 105.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "53de8ce9-5775-43d2-96ed-79847c264127") + ) + (gr_rect + (start 144.05 105.825) + (end 144.5 106.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "6aae7fb1-f1bb-40a0-92ca-8fee862d4f9d") + ) + (gr_rect + (start 144.05 106.275) + (end 144.5 106.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "46ea9d9a-7df1-49a5-950e-1e9d7383c857") + ) + (gr_rect + (start 144.05 108.525) + (end 144.5 108.975) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "17302c99-7ecc-4c39-b61c-08e1a633cb10") + ) + (gr_rect + (start 144.05 108.975) + (end 144.5 109.425) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "5b2bea67-81f2-4154-a493-b803e905edf4") + ) + (gr_rect + (start 144.05 113.925) + (end 145.4 114.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "b46628cb-09d2-4c50-9a26-2807b67b53b0") + ) + (gr_rect + (start 144.05 114.375) + (end 144.5 114.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "a4312ffe-2c7d-4bdb-aab1-1b8a66884d2f") + ) + (gr_rect + (start 144.05 114.825) + (end 145.4 115.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "931cd598-f4af-4d4f-a44a-8f7b8132d9f3") + ) + (gr_rect + (start 144.05 116.625) + (end 145.4 117.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "f90e50dd-5b20-4bf8-aca1-ad548e9df2bd") + ) + (gr_rect + (start 144.05 117.075) + (end 144.5 117.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "5cdd1503-c278-4866-b22a-74018b58e99d") + ) + (gr_rect + (start 144.5 111.675) + (end 145.4 112.125) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "c0c6d7b7-e16b-4a1d-b4d9-ef1e51423d8f") + ) + (gr_rect + (start 144.5 112.125) + (end 145.4 112.575) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "297f54da-d8f2-44b6-af86-fdf76a412adb") + ) + (gr_rect + (start 144.5 115.725) + (end 144.95 116.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "f5fb9f4d-cd56-41e7-874e-e28ad4a4605b") + ) + (gr_rect + (start 144.5 116.175) + (end 145.4 116.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "839c7685-c985-4205-8ef1-1fbda5ede252") + ) + (gr_rect + (start 144.95 104.475) + (end 145.4 104.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "6a47c8ba-ad6d-4a4c-b542-d13a0bff2c5e") + ) + (gr_rect + (start 144.95 104.925) + (end 145.4 105.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "d24e834e-b5cf-4fc5-833a-57372d74c5ea") + ) + (gr_rect + (start 144.95 105.375) + (end 145.4 105.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "5573a292-7953-4af4-b8c3-b7df10d0b760") + ) + (gr_rect + (start 144.95 105.825) + (end 145.85 106.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "51ea40d5-6443-427c-8215-6cb1108fa0db") + ) + (gr_rect + (start 144.95 106.275) + (end 145.4 106.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "6049db36-a07a-45f1-aa23-3ded8d3eb446") + ) + (gr_rect + (start 144.95 106.725) + (end 145.85 107.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "87a48070-64a5-4dfc-bed0-73a534a973a8") + ) + (gr_rect + (start 144.95 107.175) + (end 145.4 107.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3e4cdb45-fb67-479b-a496-dcbee3633102") + ) + (gr_rect + (start 144.95 108.075) + (end 145.85 108.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "99260872-82d6-4d27-b9d5-f88ba7953234") + ) + (gr_rect + (start 144.95 108.525) + (end 145.4 108.975) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "7c1c501a-77de-49fd-a037-8f2b31ebd57e") + ) + (gr_rect + (start 144.95 108.975) + (end 146.3 109.425) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "b2b4a539-4692-4b2c-9210-86593ab69e71") + ) + (gr_rect + (start 144.95 109.425) + (end 145.4 109.875) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4a7098b3-9d52-4261-a982-1998de9e3963") + ) + (gr_rect + (start 144.95 112.575) + (end 146.3 113.025) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "f84f956a-9c4b-4a00-a7b9-a05f36bb36f9") + ) + (gr_rect + (start 144.95 113.025) + (end 146.75 113.475) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "bc55a945-4fae-48b4-bd64-66b3d9327432") + ) + (gr_rect + (start 144.95 114.375) + (end 145.4 114.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "f0f843a2-e8dc-460b-902b-1d9e896671b6") + ) + (gr_rect + (start 145.4 110.325) + (end 145.85 110.775) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "f654da6f-128a-4fad-adf1-10cbde99d694") + ) + (gr_rect + (start 145.4 110.775) + (end 145.85 111.225) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4c73b9d1-afb1-49cb-b77e-9d813aa9b709") + ) + (gr_rect + (start 145.4 111.225) + (end 147.65 111.675) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "20ca8935-2910-41d5-b474-f0483f1e27f0") + ) + (gr_rect + (start 145.85 104.925) + (end 146.75 105.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "0862998f-85c0-4de8-a03c-09f760dbb09a") + ) + (gr_rect + (start 145.85 105.375) + (end 146.3 105.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4863c359-5fd8-4bad-9acf-bab1f332dfaf") + ) + (gr_rect + (start 145.85 107.175) + (end 146.3 107.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "a8378ad4-d5b6-453b-a1a2-57ff3e70e565") + ) + (gr_rect + (start 145.85 109.875) + (end 146.75 110.325) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "d5910b27-4255-4751-8c46-f634df199a70") + ) + (gr_rect + (start 145.85 112.125) + (end 146.3 112.575) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "8dbebfbf-da23-4e3e-9bca-8f144309f466") + ) + (gr_rect + (start 145.85 114.825) + (end 147.65 115.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "98229b60-0f98-4299-bcf7-b4883706bdec") + ) + (gr_rect + (start 145.85 115.275) + (end 146.3 115.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3715618c-ca8e-473e-98cc-eb56e2224379") + ) + (gr_rect + (start 145.85 116.625) + (end 147.65 117.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "60a9a9de-af6c-458b-8d4d-70f2a12a6212") + ) + (gr_rect + (start 146.3 105.825) + (end 146.75 106.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "932e7a9b-eed2-4ed7-b2da-c87eb8085a64") + ) + (gr_rect + (start 146.3 106.275) + (end 147.65 106.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "5a1df7d0-87b3-4aa9-b8f6-403be6f21a53") + ) + (gr_rect + (start 146.3 108.075) + (end 146.75 108.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "0e11b6a2-44d3-45fc-8cba-cf382a758e2b") + ) + (gr_rect + (start 146.3 110.325) + (end 147.2 110.775) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "deafc4d1-31a7-4ae0-913a-750b45a66110") + ) + (gr_rect + (start 146.3 115.725) + (end 147.2 116.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "1a3f0c49-f04f-437d-9c4a-9fc42ff7cb62") + ) + (gr_rect + (start 146.75 105.375) + (end 147.65 105.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "d4ade137-3efa-4161-8ae5-8630294c2b60") + ) + (gr_rect + (start 146.75 107.175) + (end 147.2 107.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "e612d630-0c49-4ee7-9bb0-4a45a346e356") + ) + (gr_rect + (start 146.75 108.975) + (end 148.1 109.425) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "88048b82-44e9-4016-9def-c90549d9eb1d") + ) + (gr_rect + (start 146.75 109.425) + (end 147.65 109.875) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "1488881f-c420-4649-bf47-ec2e866456e3") + ) + (gr_rect + (start 146.75 110.775) + (end 148.1 111.225) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "cd9f2c24-e7ab-40be-b5be-ef0f0dc8c8b8") + ) + (gr_rect + (start 146.75 111.675) + (end 147.2 112.125) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "f57d41f9-143a-419d-a9ed-59aebb1e09fa") + ) + (gr_rect + (start 146.75 112.575) + (end 147.2 113.025) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "19323129-4372-4b0c-808b-db9b582f7e70") + ) + (gr_rect + (start 146.75 116.175) + (end 149 116.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "c547333a-ef65-4434-926d-d2879d640ccb") + ) + (gr_rect + (start 146.75 117.075) + (end 148.1 117.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "a95abef2-24a0-4f5b-b4af-08a2f6b12c4b") + ) + (gr_rect + (start 147.2 104.475) + (end 147.65 104.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "0c5990ec-df5b-4e46-823f-0d3a2976001b") + ) + (gr_rect + (start 147.2 105.825) + (end 149 106.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "de5dba2b-8186-4452-93a0-96166bb34197") + ) + (gr_rect + (start 147.2 106.725) + (end 148.1 107.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "5c96ea50-2f42-40c4-9912-9a1cca897e09") + ) + (gr_rect + (start 147.2 107.625) + (end 147.65 108.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3aefd1f7-b95c-42d1-94ee-b18cea1f85aa") + ) + (gr_rect + (start 147.2 109.875) + (end 149 110.325) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "2e43162f-3bb1-406f-845e-23a33afee9c5") + ) + (gr_rect + (start 147.2 112.125) + (end 147.65 112.575) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "8009195c-d0d5-4885-be9e-8eb15f219218") + ) + (gr_rect + (start 147.2 113.025) + (end 147.65 113.475) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "efcd4daa-6366-423a-85f6-85412d4f421e") + ) + (gr_rect + (start 147.2 113.475) + (end 148.55 113.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "a600e8d2-e47d-4f65-a6c1-4c2fb023c9b9") + ) + (gr_rect + (start 147.2 114.375) + (end 148.55 114.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "afdd41d3-bae4-4777-bff1-1adfb6ec0a34") + ) + (gr_rect + (start 147.65 104.925) + (end 148.1 105.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "6246e25a-416a-41fb-ab92-7611631a4123") + ) + (gr_rect + (start 147.65 107.175) + (end 148.1 107.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "37298cf1-2ed1-427b-b9f0-6390a8f25268") + ) + (gr_rect + (start 147.65 108.075) + (end 148.1 108.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4a393899-7c8c-4aa8-8c7d-f433894b7f39") + ) + (gr_rect + (start 147.65 108.525) + (end 149 108.975) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "69155ee3-4cd2-4a3e-9c3c-1c2be169a707") + ) + (gr_rect + (start 147.65 113.925) + (end 148.1 114.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3dadf9e6-d0c5-4168-94f9-9c48d42e8aab") + ) + (gr_rect + (start 148.1 104.475) + (end 149 104.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "45761387-fda6-4cfb-a0c9-0db60ecbe402") + ) + (gr_rect + (start 148.1 105.375) + (end 148.55 105.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "b50ac22d-6092-435c-a2c7-89e742378e6e") + ) + (gr_rect + (start 148.1 110.325) + (end 148.55 110.775) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "05452ee2-d190-4d1d-9baa-7fedf9ce6533") + ) + (gr_rect + (start 148.1 111.225) + (end 148.55 111.675) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "a1410f4a-af2d-4327-aad0-7f2c249934f9") + ) + (gr_rect + (start 148.1 111.675) + (end 149 112.125) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "f57bda86-5ccf-4391-8c7b-294fad16f43d") + ) + (gr_rect + (start 148.1 112.125) + (end 148.55 112.575) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "8459d0ce-8fb9-403d-9e0c-a89db96b824a") + ) + (gr_rect + (start 148.1 112.575) + (end 149.45 113.025) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "0302f9c9-c1fb-4c48-9fe3-25fd47efbd62") + ) + (gr_rect + (start 148.1 113.025) + (end 149 113.475) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "1862afa3-829e-4f05-9a30-6f42a904ec04") + ) + (gr_rect + (start 148.1 114.825) + (end 149 115.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "f7194056-d443-42ad-8230-d13ff9139d2d") + ) + (gr_rect + (start 148.1 116.625) + (end 148.55 117.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "80395a8c-6f22-4a0d-bd99-253ad6accf38") + ) + (gr_rect + (start 148.55 104.925) + (end 149 105.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "a24127df-2fc2-482c-8f49-eeb7e43984af") + ) + (gr_rect + (start 148.55 106.725) + (end 150.35 107.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "c479adaa-f7d0-49aa-a575-11fa28814a66") + ) + (gr_rect + (start 148.55 107.175) + (end 149 107.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "cad33187-212c-4340-bb32-01254118eccd") + ) + (gr_rect + (start 148.55 108.975) + (end 149.45 109.425) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "458573ea-f13a-4fa2-81ef-7b2bd5511582") + ) + (gr_rect + (start 148.55 110.775) + (end 149 111.225) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "28759b0c-4b74-463e-a5a2-50e7c280de07") + ) + (gr_rect + (start 148.55 115.275) + (end 151.7 115.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "7ffc00af-0540-42ee-bbf5-f27805afc58e") + ) + (gr_rect + (start 148.55 115.725) + (end 149 116.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "cbbde727-f780-4f10-897c-058a600d03c6") + ) + (gr_rect + (start 148.55 117.075) + (end 149 117.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "d2a757e8-071f-4302-ada7-9dfced23c217") + ) + (gr_rect + (start 149 105.375) + (end 149.45 105.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "93a01371-e812-4c46-a4f3-63ebdcc7887b") + ) + (gr_rect + (start 149 106.275) + (end 150.35 106.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "143542dc-7a08-4828-8f0e-015ba91feb8a") + ) + (gr_rect + (start 149 109.425) + (end 149.45 109.875) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "768866d0-77c1-444e-a243-923620a17f86") + ) + (gr_rect + (start 149 110.325) + (end 151.25 110.775) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "de0ceb03-0d03-4c05-b3b0-134ae5cc8bf4") + ) + (gr_rect + (start 149 111.225) + (end 149.45 111.675) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "ddc36125-2b4f-4989-be1b-96a7fa8e7116") + ) + (gr_rect + (start 149 113.475) + (end 149.9 113.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "d8a10acb-9ede-422c-abd2-f21f4d02755b") + ) + (gr_rect + (start 149 113.925) + (end 149.45 114.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "6b3543e3-62fb-4b71-a06b-13493a669495") + ) + (gr_rect + (start 149 114.375) + (end 150.35 114.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "a99cd855-acc0-46ad-99b6-73b2870ada73") + ) + (gr_rect + (start 149.45 104.475) + (end 149.9 104.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "9e515955-52f2-46f8-bf20-94bed0d1367c") + ) + (gr_rect + (start 149.45 107.175) + (end 149.9 107.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "cdbc8d7c-a250-4425-b6fd-4e173e25a7d7") + ) + (gr_rect + (start 149.45 107.625) + (end 150.35 108.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3ca7961f-e7cf-4403-88e4-c83da14888f6") + ) + (gr_rect + (start 149.45 108.075) + (end 149.9 108.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "8644d743-b13c-4da5-9919-1241c6a8840b") + ) + (gr_rect + (start 149.45 108.525) + (end 149.9 108.975) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "9a961bc6-7892-4141-9f63-63edcfe44abd") + ) + (gr_rect + (start 149.45 109.875) + (end 150.35 110.325) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "eb0a46e2-afed-469a-a2ba-7817a7c18df2") + ) + (gr_rect + (start 149.45 114.825) + (end 150.8 115.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3d9bdfce-7067-4a53-921e-7914abd12d31") + ) + (gr_rect + (start 149.45 116.175) + (end 149.9 116.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "2cbaf7d5-2a93-4b5d-9cb1-bd93a5f8ce09") + ) + (gr_rect + (start 149.45 116.625) + (end 149.9 117.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "aae50a9d-7099-40a6-abb7-4623ef720c93") + ) + (gr_rect + (start 149.45 117.075) + (end 150.8 117.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "a8894cd9-9133-4de8-83c1-3898a39e8f13") + ) + (gr_rect + (start 149.9 108.975) + (end 150.35 109.425) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "9e83326b-a35d-4fc4-853f-acef4fa02651") + ) + (gr_rect + (start 149.9 110.775) + (end 150.35 111.225) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "c61d26f6-de47-4c27-b7c1-8c1f276c6200") + ) + (gr_rect + (start 149.9 111.675) + (end 151.25 112.125) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "e49bfc7b-1a6e-4dab-b866-9e829f7b6e82") + ) + (gr_rect + (start 149.9 112.125) + (end 152.6 112.575) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "e1c61625-aafe-4f7e-ae6e-0dcf12bcba13") + ) + (gr_rect + (start 150.35 105.375) + (end 151.7 105.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "23a7f197-6fbb-42fd-81cd-24920364146c") + ) + (gr_rect + (start 150.35 105.825) + (end 150.8 106.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "7288f9ec-dd73-4d62-89a5-7ae1683b6258") + ) + (gr_rect + (start 150.35 107.175) + (end 150.8 107.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "8442d88b-d66e-4fa5-916b-b090a950aaac") + ) + (gr_rect + (start 150.35 111.225) + (end 150.8 111.675) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "66e6df12-adb3-46ca-a5c7-f20f8947fe66") + ) + (gr_rect + (start 150.35 113.025) + (end 151.25 113.475) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "9e04b103-cd84-4d82-8e8e-832f1d42144f") + ) + (gr_rect + (start 150.35 115.725) + (end 150.8 116.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "b35f8b13-fafd-4544-ae48-12fffe4cb289") + ) + (gr_rect + (start 150.35 116.175) + (end 150.8 116.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "588dcb20-a311-4751-b483-91419c0317e5") + ) + (gr_rect + (start 150.8 106.275) + (end 151.7 106.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "50f1aac3-a433-4c00-a461-ce4bfcb0de0a") + ) + (gr_rect + (start 150.8 106.725) + (end 151.7 107.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "17725645-3fd0-40b8-8baa-2fa22ba6d427") + ) + (gr_rect + (start 150.8 108.075) + (end 151.25 108.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3e9d4b95-b8af-4545-818d-179dda7706ca") + ) + (gr_rect + (start 150.8 113.475) + (end 151.7 113.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "d2f4432f-f851-4adf-abbb-16f38bf9682f") + ) + (gr_rect + (start 150.8 116.625) + (end 151.7 117.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "71fe3c4a-1866-4a6b-b55a-936168edd10a") + ) + (gr_rect + (start 151.25 104.475) + (end 151.7 104.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "47bc7096-bcf5-47e6-a962-65d8726a3b42") + ) + (gr_rect + (start 151.25 104.925) + (end 151.7 105.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "5a598413-b750-403f-9ed3-d6e9d227acfd") + ) + (gr_rect + (start 151.25 105.825) + (end 151.7 106.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "2abbe1a2-5c6f-4c08-b629-9ef8a4acbf44") + ) + (gr_rect + (start 151.25 107.175) + (end 151.7 107.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "7c5f7515-b2b1-462a-a8c6-631020010d45") + ) + (gr_rect + (start 151.25 107.625) + (end 156.65 108.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "e5dd9a02-1266-44c2-82b2-e63ebc7fe4af") + ) + (gr_rect + (start 151.25 108.975) + (end 151.7 109.425) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "522e9935-d0c7-45b8-bfd2-48b55288cfe6") + ) + (gr_rect + (start 151.25 109.425) + (end 152.6 109.875) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "96ec47d1-9e10-4001-9869-0bf4f59c856a") + ) + (gr_rect + (start 151.25 109.875) + (end 151.7 110.325) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "e75fdf2e-3f3a-4b12-aff9-c6337b3f3d9e") + ) + (gr_rect + (start 151.25 113.925) + (end 156.65 114.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "1f28d46e-c4fb-4e9a-a416-4980021a1b15") + ) + (gr_rect + (start 151.25 114.375) + (end 151.7 114.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "92900693-17cf-4817-be3e-088d93f54850") + ) + (gr_rect + (start 151.25 114.825) + (end 151.7 115.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "ba9d49ba-cd5e-459e-8641-30fd453c6b6a") + ) + (gr_rect + (start 151.25 115.725) + (end 151.7 116.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "68da94fd-e937-4596-8e9e-90ef53d05750") + ) + (gr_rect + (start 151.25 116.175) + (end 151.7 116.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "613b165e-f7c9-430e-b21a-acc8401994a5") + ) + (gr_rect + (start 151.25 117.075) + (end 151.7 117.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "be67a88e-d8e4-4568-887a-2ad238fe73b8") + ) + (gr_rect + (start 151.7 108.525) + (end 152.15 108.975) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4cc96d76-ad0d-42c6-9f9b-77b7b05f36f4") + ) + (gr_rect + (start 151.7 110.325) + (end 152.15 110.775) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "f7080675-e3f2-4662-afa5-ed93710c4537") + ) + (gr_rect + (start 151.7 111.225) + (end 152.15 111.675) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3226785e-a112-4d6e-8d74-df3a726a000e") + ) + (gr_rect + (start 151.7 113.025) + (end 152.15 113.475) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "d8f635e2-ce46-4f56-9111-7f18fdba93ff") + ) + (gr_rect + (start 152.15 104.925) + (end 154.4 105.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "2263e6ce-a6af-459f-a03c-576365130ab2") + ) + (gr_rect + (start 152.15 105.375) + (end 152.6 105.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "5a7c13fe-f081-4cf0-937b-f8a6745b34fd") + ) + (gr_rect + (start 152.15 105.825) + (end 152.6 106.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "7fa34620-fb31-4049-b60a-ea894af4f6fe") + ) + (gr_rect + (start 152.15 106.275) + (end 152.6 106.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "40c2281f-72d4-4fde-b29f-97d1884b6cf2") + ) + (gr_rect + (start 152.15 106.725) + (end 154.4 107.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3848f3ed-6399-443a-a869-60144faa6ca5") + ) + (gr_rect + (start 152.15 108.975) + (end 153.95 109.425) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "0d5e5280-4644-4052-9c78-3867c4144e3e") + ) + (gr_rect + (start 152.15 110.775) + (end 153.05 111.225) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "02954d1c-5d10-4f0d-9712-77fea6d7c416") + ) + (gr_rect + (start 152.15 111.675) + (end 156.65 112.125) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3e3fbfec-db93-49c9-a770-adf79f1a5c66") + ) + (gr_rect + (start 152.15 114.825) + (end 154.4 115.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3f0c4f6f-3676-437b-920e-dc1b2820c261") + ) + (gr_rect + (start 152.15 115.275) + (end 152.6 115.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "740c4226-7bbf-4377-a658-3c0fc9515fb4") + ) + (gr_rect + (start 152.15 115.725) + (end 152.6 116.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "fb5d55af-f359-49eb-b3c4-b852d18f376e") + ) + (gr_rect + (start 152.15 116.175) + (end 152.6 116.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "9d36767c-d091-4e94-b556-ed55b5473e64") + ) + (gr_rect + (start 152.15 116.625) + (end 154.4 117.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "d362a8fb-2077-4ca2-9ab8-62c7790472c8") + ) + (gr_rect + (start 152.6 108.075) + (end 153.05 108.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "8c9e8d18-d4c3-4ccd-96c3-c1d6999f7131") + ) + (gr_rect + (start 152.6 110.325) + (end 156.65 110.775) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "d54656e8-df72-4430-95c0-31099d93f14c") + ) + (gr_rect + (start 152.6 111.225) + (end 156.65 111.675) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "6b1d016e-51fa-4bdf-ba6d-ea32f9b8c5ad") + ) + (gr_rect + (start 153.05 109.875) + (end 153.95 110.325) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "64522805-30f1-4a4e-8d7b-20721f31c1ab") + ) + (gr_rect + (start 153.05 113.475) + (end 153.5 113.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "9a369007-466e-4cd7-b180-49df7b6909ff") + ) + (gr_rect + (start 153.5 109.425) + (end 156.65 109.875) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "40413193-8960-4408-81c6-b0c6233fc8d4") + ) + (gr_rect + (start 153.95 105.375) + (end 154.4 105.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "1c25f9a4-8416-4516-8f71-0b59e96c10d6") + ) + (gr_rect + (start 153.95 105.825) + (end 154.4 106.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "afb32abf-2562-47ea-b88d-97a8f58797ec") + ) + (gr_rect + (start 153.95 106.275) + (end 154.4 106.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4205925c-956d-4b6d-801b-867f03560476") + ) + (gr_rect + (start 153.95 108.075) + (end 154.4 108.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "1bedfd5e-bafe-4c61-b3f5-474f8efa7cef") + ) + (gr_rect + (start 153.95 108.525) + (end 154.4 108.975) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "022230bc-3941-40c2-a174-b6af09a6d1ed") + ) + (gr_rect + (start 153.95 112.575) + (end 154.4 113.025) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "5340770b-22b5-48ad-bd32-9b01445df39f") + ) + (gr_rect + (start 153.95 113.025) + (end 156.65 113.475) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "ca0619b5-e081-4594-a007-fac8965d2c0f") + ) + (gr_rect + (start 153.95 115.275) + (end 154.4 115.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "8f3f6863-ff01-4d86-a229-c87dc07c7e1d") + ) + (gr_rect + (start 153.95 115.725) + (end 154.4 116.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "ebaa5f89-ad05-4612-bbad-861793a3f525") + ) + (gr_rect + (start 153.95 116.175) + (end 154.4 116.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "d0203e6d-5a37-4b64-900a-004baaea1b92") + ) + (gr_rect + (start 154.4 110.775) + (end 156.65 111.225) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "4ded825e-8a0c-47a8-bb8b-f73c22b1f1a5") + ) + (gr_rect + (start 154.4 112.125) + (end 156.65 112.575) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "200fffc7-30b2-4524-a7cb-6ba8d9c7c413") + ) + (gr_rect + (start 154.4 113.475) + (end 156.65 113.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "948c7b24-041d-4ae8-933c-363dc371d050") + ) + (gr_rect + (start 154.85 104.475) + (end 156.65 104.925) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "103e1f26-7a83-48d9-8490-d5d201373b24") + ) + (gr_rect + (start 154.85 104.925) + (end 156.65 105.375) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "e70e7de7-4367-4824-b5ed-c0c92dcf1ec3") + ) + (gr_rect + (start 154.85 105.375) + (end 156.65 105.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "55e2d879-64c5-4239-8573-5f908f3303cc") + ) + (gr_rect + (start 154.85 105.825) + (end 156.65 106.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "ca759bb6-9076-44e6-b234-dccec3c02795") + ) + (gr_rect + (start 154.85 106.275) + (end 156.65 106.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "72400880-94b3-4958-89e0-4d6e262255b4") + ) + (gr_rect + (start 154.85 106.725) + (end 156.65 107.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "3a4295b5-466c-4c49-93e6-612d5e2eb603") + ) + (gr_rect + (start 154.85 107.175) + (end 156.65 107.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "87740d5e-2f93-4b56-b358-21da64644631") + ) + (gr_rect + (start 154.85 108.075) + (end 156.65 108.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "ac153fde-c441-4a72-984d-0c738f8091a3") + ) + (gr_rect + (start 154.85 108.525) + (end 156.65 108.975) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "462ce390-4fb9-4e93-aa20-bbeaf776f155") + ) + (gr_rect + (start 154.85 108.975) + (end 156.65 109.425) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "bef89aa3-7a6a-4533-9dbe-cac45536149e") + ) + (gr_rect + (start 154.85 109.875) + (end 156.65 110.325) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "43c03f9b-bfeb-4ba9-9b90-7ece14c100d3") + ) + (gr_rect + (start 154.85 112.575) + (end 156.65 113.025) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "e9f39858-dca6-43ab-926c-470b1ccb2539") + ) + (gr_rect + (start 154.85 114.375) + (end 156.65 114.825) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "33033103-7e4c-41b8-be9a-fda664b88a11") + ) + (gr_rect + (start 154.85 114.825) + (end 156.65 115.275) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "346a6adf-aaa4-43be-b186-b61f73dcc137") + ) + (gr_rect + (start 154.85 115.275) + (end 156.65 115.725) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "90003a51-f9c5-43ea-9f17-f997b39eed46") + ) + (gr_rect + (start 154.85 115.725) + (end 156.65 116.175) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "643c806d-712d-40cf-a86b-1074d05f2f20") + ) + (gr_rect + (start 154.85 116.175) + (end 156.65 116.625) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "2842ba12-6bdd-4cab-9e87-4671e42f1d1e") + ) + (gr_rect + (start 154.85 116.625) + (end 156.65 117.075) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "70cf583f-4e51-41af-a772-c66d1ad623fc") + ) + (gr_rect + (start 154.85 117.075) + (end 156.65 117.525) + (stroke + (width 0) + (type default) + ) + (fill yes) + (layer "B.SilkS") + (uuid "7d86eb2a-766a-462d-8832-78258d9ea27e") + ) + (gr_arc + (start 100 102) + (mid 100.5858 100.5858) + (end 102 100) + (stroke + (width 0.05) + (type default) + ) + (layer "Edge.Cuts") + (uuid "983bdc8f-d5aa-419b-a9f1-214e2d2a2322") + ) + (gr_line + (start 100 110) + (end 100 102) + (stroke + (width 0.05) + (type default) + ) + (layer "Edge.Cuts") + (uuid "8e02c711-20d5-48f3-877f-5d531f879b89") + ) + (gr_arc + (start 100 110) + (mid 101 111) + (end 100 112) + (stroke + (width 0.05) + (type default) + ) + (layer "Edge.Cuts") + (uuid "966bc26d-7a07-4f9f-b813-5ca53d0d79de") + ) + (gr_line + (start 100 120) + (end 100 112) + (stroke + (width 0.05) + (type default) + ) + (layer "Edge.Cuts") + (uuid "3b28bff8-7940-40d2-b238-4c222f629d0b") + ) + (gr_line + (start 102 100) + (end 164 100) + (stroke + (width 0.05) + (type default) + ) + (layer "Edge.Cuts") + (uuid "17008e26-33bb-43f1-b211-6240e78e18d0") + ) + (gr_arc + (start 102 122) + (mid 100.5858 121.4142) + (end 100 120) + (stroke + (width 0.05) + (type default) + ) + (layer "Edge.Cuts") + (uuid "c1a33b4c-b597-42f8-867f-ef27717186a9") + ) + (gr_arc + (start 164 100) + (mid 165.4142 100.5858) + (end 166 102) + (stroke + (width 0.05) + (type default) + ) + (layer "Edge.Cuts") + (uuid "561c42c0-9dae-4068-82d6-909c26ecc014") + ) + (gr_line + (start 164 122) + (end 102 122) + (stroke + (width 0.05) + (type default) + ) + (layer "Edge.Cuts") + (uuid "a5d75d98-4c0b-441e-a2ec-ebde7c2d9386") + ) + (gr_line + (start 166 102) + (end 166 120) + (stroke + (width 0.05) + (type default) + ) + (layer "Edge.Cuts") + (uuid "d59577f9-3b33-44fb-9f02-0f4c8d266ed1") + ) + (gr_arc + (start 166 120) + (mid 165.4142 121.4142) + (end 164 122) + (stroke + (width 0.05) + (type default) + ) + (layer "Edge.Cuts") + (uuid "ed34ab9c-bbf4-49a2-b931-ab4bbbf2b3f4") + ) + (gr_text "CERN-OHL-P-2.0" + (at 132.8 120.7 0) + (layer "F.SilkS") + (uuid "67df1d93-accd-49f4-b738-9f5d3532bd16") + (effects + (font + (size 1 1) + (thickness 0.155) + ) + ) + ) + (gr_text "calibrator" + (at 150.3 118.5 0) + (layer "F.SilkS") + (uuid "26de0886-3ae6-40fa-b1b8-0d5a4a935a31") + (effects + (font + (size 1.2 1.2) + (thickness 0.18) + ) + ) + ) + (gr_text "BOOT" + (at 140.5 110.5 0) + (layer "F.SilkS") + (uuid "3708a746-656c-4a62-9f7f-be355dcb7436") + (effects + (font + (size 1.2 1.2) + (thickness 0.252) + ) + ) + ) + (gr_text "A" + (at 105 103.8 0) + (layer "F.SilkS") + (uuid "287d9e4d-9f7f-4865-94c7-becc493c9f94") + (effects + (font + (size 1.3 1.3) + (thickness 0.272999) + ) + ) + ) + (gr_text "B" + (at 105 118.2 0) + (layer "F.SilkS") + (uuid "406bda47-c056-4218-9807-27c7ce094417") + (effects + (font + (size 1.3 1.3) + (thickness 0.272999) + ) + ) + ) + (gr_text "AVsync" + (at 150.3 116.1 0) + (layer "F.SilkS") + (uuid "fdd61744-f5d0-4def-a458-3e516886d05d") + (effects + (font + (size 2 2) + (thickness 0.42) + ) + ) + ) + (gr_text "LED on lens" + (at 116.8 105.8 0) + (layer "B.SilkS") + (uuid "e5025bdc-b680-4eea-a502-60963e135d47") + (effects + (font + (size 1 1) + (thickness 0.155) + ) + (justify mirror) + ) + ) + (gr_text "A|B on line" + (at 116.8 115.8 0) + (layer "B.SilkS") + (uuid "9f545da9-716b-44b5-b9e4-1ea69bc48eed") + (effects + (font + (size 1 1) + (thickness 0.155) + ) + (justify mirror) + ) + ) + (gr_text "not a toy" + (at 116.8 118.8 0) + (layer "B.SilkS") + (uuid "b8d1a913-b87a-4ca0-9533-2aa723787cd5") + (effects + (font + (size 1 1) + (thickness 0.155) + ) + (justify mirror) + ) + ) + (gr_text "calibrator v0.3" + (at 131.8 118.8 0) + (layer "B.SilkS") + (uuid "fd98b6dd-ab93-4542-a813-39d1e251a686") + (effects + (font + (size 1 1) + (thickness 0.155) + ) + (justify mirror) + ) + ) + (gr_text "CAMERA" + (at 116.8 104 0) + (layer "B.SilkS") + (uuid "2db0dba1-4927-4fbc-8a09-fcef943ba391") + (effects + (font + (size 1.2 1.2) + (thickness 0.252) + ) + (justify mirror) + ) + ) + (gr_text "SCREEN" + (at 116.8 114 0) + (layer "B.SilkS") + (uuid "0eef150d-5eb6-4ee4-93af-650667c4c992") + (effects + (font + (size 1.2 1.2) + (thickness 0.252) + ) + (justify mirror) + ) + ) + (gr_text "A" + (at 105 103.8 0) + (layer "B.SilkS") + (uuid "4f5e04a4-8e7e-4bd7-bbb3-fd2b02523b27") + (effects + (font + (size 1.3 1.3) + (thickness 0.272999) + ) + (justify mirror) + ) + ) + (gr_text "B" + (at 105 118.2 0) + (layer "B.SilkS") + (uuid "0be03af4-3aba-4f1a-a6c7-17e54b31c30e") + (effects + (font + (size 1.3 1.3) + (thickness 0.272999) + ) + (justify mirror) + ) + ) + (gr_text "AVsync" + (at 131.8 116.7 0) + (layer "B.SilkS") + (uuid "04300474-507c-4b71-a72f-b2ad4d5b6adf") + (effects + (font + (size 1.8 1.8) + (thickness 0.378) + ) + (justify mirror) + ) + ) + (segment + (start 137.5 104.125) + (end 137.5 104.7617) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "0256609a-8e15-4625-bed7-4660d10248b7") + ) + (segment + (start 144.2617 105.5234) + (end 144.2617 108.4296) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "2e0b2620-9930-4e5c-8436-c4dd4491e72f") + ) + (segment + (start 143.5 104.7617) + (end 144.2617 105.5234) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "3f9ae758-98f1-4bc5-aec5-f54ebf12c15d") + ) + (segment + (start 143.5 104.125) + (end 143.5 104.7617) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "54d402cb-da3e-4df4-a529-0977a80432fe") + ) + (segment + (start 140.5 107.803) + (end 140.5 107.7617) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "72a60880-30f7-46e0-8077-da0774b85317") + ) + (segment + (start 144.1779 108.5134) + (end 140.5 108.5134) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "81c29836-53dc-4bb3-9f06-b60df05fd760") + ) + (segment + (start 140.5 116.09) + (end 140.5 108.5134) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "a10d005d-874b-4a65-9483-3a42b000e877") + ) + (segment + (start 144.2617 108.4296) + (end 144.1779 108.5134) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "a9827bd5-e689-4a3b-8952-6d260342eb3b") + ) + (segment + (start 140.5 108.5134) + (end 140.5 107.803) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "c216d9ff-b471-4114-8375-0e920b5a3bc8") + ) + (segment + (start 140.5 107.7617) + (end 137.5 104.7617) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "dd2bdc6f-5256-46ba-9e50-e9df8cfb4898") + ) + (segment + (start 123.89 119.6) + (end 123.89 116.65) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "125e19eb-dbdc-4803-be5f-2641dd663eaf") + ) + (segment + (start 124.5912 116.65) + (end 123.89 116.65) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "3d93e84e-615f-45ae-8c52-05d2f3d20f2b") + ) + (segment + (start 124.4 114.89) + (end 124.9967 115.4867) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "7f8b3b08-57c7-4c7e-8fb7-046202d39a75") + ) + (segment + (start 124.9967 116.2445) + (end 124.5912 116.65) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "d778539d-78a7-4770-a7bf-9c85bdbb51e0") + ) + (segment + (start 124.9967 115.4867) + (end 124.9967 116.2445) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "ec1be73d-eff3-463c-a9ac-1b2f7005debc") + ) + (segment + (start 123.89 116.65) + (end 120.6625 116.65) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "fc2ef32d-7673-4fe9-a3c3-ac1d0f9e1403") + ) + (segment + (start 124.5319 108.6129) + (end 125.6373 107.5075) + (width 0.2) + (layer "F.Cu") + (net 3) + (uuid "097032d0-2788-4e07-ac3f-5a14e943416e") + ) + (segment + (start 123.7705 115.2805) + (end 123.7705 110.9836) + (width 0.2) + (layer "F.Cu") + (net 3) + (uuid "38c2fdb5-465c-492f-97f5-e4b1c6f5ecad") + ) + (segment + (start 125.6373 107.5075) + (end 126.3625 107.5075) + (width 0.2) + (layer "F.Cu") + (net 3) + (uuid "a21e3b27-7215-4c17-b04d-d695918a5b4f") + ) + (segment + (start 124.4 115.91) + (end 123.7705 115.2805) + (width 0.2) + (layer "F.Cu") + (net 3) + (uuid "b1604468-834f-4266-aa84-c0b043efbc5e") + ) + (segment + (start 124.5319 110.2222) + (end 124.5319 108.6129) + (width 0.2) + (layer "F.Cu") + (net 3) + (uuid "b785c643-75d7-4b60-a76e-7c4c04e31fd7") + ) + (segment + (start 123.7705 110.9836) + (end 124.5319 110.2222) + (width 0.2) + (layer "F.Cu") + (net 3) + (uuid "e714339a-a820-4ca1-8de3-020d00cf5e50") + ) + (segment + (start 118.599 117.6) + (end 116.6821 115.6831) + (width 0.3) + (layer "F.Cu") + (net 4) + (uuid "1e7c6aaa-0ce2-4b00-81c1-d7a7d675e973") + ) + (segment + (start 116.6821 115.6831) + (end 116.6821 108.9179) + (width 0.3) + (layer "F.Cu") + (net 4) + (uuid "2aad2043-0cb9-4d04-82ac-6e6b200b2149") + ) + (segment + (start 121.6 103.25) + (end 118.15 106.7) + (width 0.3) + (layer "F.Cu") + (net 4) + (uuid "4ab05c4f-60d2-4f23-8109-61c2363770d4") + ) + (segment + (start 116.6821 108.9179) + (end 118.15 107.45) + (width 0.3) + (layer "F.Cu") + (net 4) + (uuid "845ba773-6297-46fd-9bc2-b80464952372") + ) + (segment + (start 122.5375 117.6) + (end 118.599 117.6) + (width 0.3) + (layer "F.Cu") + (net 4) + (uuid "ac41c2cc-eb3a-4bc8-bbaf-3e3c8443a2d8") + ) + (segment + (start 118.15 106.7) + (end 118.15 107.45) + (width 0.3) + (layer "F.Cu") + (net 4) + (uuid "c8216aa6-0c9f-42b3-979f-c9b80663655e") + ) + (segment + (start 156.6 111.2729) + (end 157.5771 112.25) + (width 0.2) + (layer "F.Cu") + (net 5) + (uuid "230f8d64-7c0c-4e30-9910-06aa8826fe85") + ) + (segment + (start 156.6 107.51) + (end 156.6 111.2729) + (width 0.2) + (layer "F.Cu") + (net 5) + (uuid "7a9569bb-4279-41ca-b5a7-8eba3f0ee9a7") + ) + (segment + (start 157.5771 112.25) + (end 158.605 112.25) + (width 0.2) + (layer "F.Cu") + (net 5) + (uuid "dc76fbc2-b3da-4973-bdd6-f1ec4326224e") + ) + (segment + (start 160.8901 110.5484) + (end 159.5917 109.25) + (width 0.2) + (layer "F.Cu") + (net 6) + (uuid "1c75cbd2-7c7f-4373-9af4-b90174302068") + ) + (segment + (start 158.605 109.25) + (end 159.5917 109.25) + (width 0.2) + (layer "F.Cu") + (net 6) + (uuid "36a1861e-cd51-417e-a798-e0659c999d66") + ) + (segment + (start 157.2256 116.1356) + (end 160.3654 116.1356) + (width 0.2) + (layer "F.Cu") + (net 6) + (uuid "4fcc98e0-84ec-4a11-9c0d-cc8bd00062c4") + ) + (segment + (start 160.8901 115.6109) + (end 160.8901 110.5484) + (width 0.2) + (layer "F.Cu") + (net 6) + (uuid "56eec71f-d019-4af0-9760-07ab2f64b948") + ) + (segment + (start 160.3654 116.1356) + (end 160.8901 115.6109) + (width 0.2) + (layer "F.Cu") + (net 6) + (uuid "b4fa596b-c591-4b33-9c15-647db10ca4f4") + ) + (segment + (start 156.6 115.51) + (end 157.2256 116.1356) + (width 0.2) + (layer "F.Cu") + (net 6) + (uuid "d9e441e5-6520-4ded-8a6f-7a54bcf1b5be") + ) + (segment + (start 158.605 111.75) + (end 157.6183 111.75) + (width 0.2) + (layer "F.Cu") + (net 7) + (uuid "0d22be08-7b66-4147-8295-c12256afd12d") + ) + (segment + (start 159.7856 111.75) + (end 159.5917 111.75) + (width 0.2) + (layer "F.Cu") + (net 7) + (uuid "329e7c6b-1b4f-48ec-91de-278a08b37410") + ) + (segment + (start 159.0976 111.75) + (end 158.605 111.75) + (width 0.2) + (layer "F.Cu") + (net 7) + (uuid "49b2f175-6ca6-483e-90d9-a2592a0519b8") + ) + (segment + (start 159.0976 111.75) + (end 159.5902 111.75) + (width 0.2) + (layer "F.Cu") + (net 7) + (uuid "5ccd1736-027a-4efa-86dd-ae7a90160fe6") + ) + (segment + (start 137.2231 114.4925) + (end 138.9337 116.2031) + (width 0.2) + (layer "F.Cu") + (net 7) + (uuid "63b67b09-8471-42bc-ac0d-e771db243dba") + ) + (segment + (start 159.5902 111.75) + (end 159.5917 111.75) + (width 0.2) + (layer "F.Cu") + (net 7) + (uuid "6c526c8a-45b7-4ebf-a759-24ba9cdaff35") + ) + (segment + (start 158.605 110.75) + (end 157.6183 110.75) + (width 0.2) + (layer "F.Cu") + (net 7) + (uuid "acd88f0b-4498-4c07-8e91-e3a6f407ea7f") + ) + (segment + (start 159.8372 111.8016) + (end 159.7856 111.75) + (width 0.2) + (layer "F.Cu") + (net 7) + (uuid "b22a79ec-5058-4b21-bd31-774fa3a8bc47") + ) + (segment + (start 157.6183 110.75) + (end 157.6183 111.75) + (width 0.2) + (layer "F.Cu") + (net 7) + (uuid "f2b67121-792e-43a8-bf57-b6987f9cb6ae") + ) + (segment + (start 131.6375 114.4925) + (end 137.2231 114.4925) + (width 0.2) + (layer "F.Cu") + (net 7) + (uuid "f825276a-b7e5-43d7-9cc3-367956e60117") + ) + (via + (at 159.8372 111.8016) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 7) + (uuid "51c75c13-5102-49b8-88a8-19f798523791") + ) + (via + (at 138.9337 116.2031) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 7) + (uuid "f4bb375c-5d97-436d-bbd6-cc85674cc30a") + ) + (segment + (start 155.4357 116.2031) + (end 159.8372 111.8016) + (width 0.2) + (layer "B.Cu") + (net 7) + (uuid "aa4ed0ec-09cd-4356-b3a8-c755feb8ee36") + ) + (segment + (start 138.9337 116.2031) + (end 155.4357 116.2031) + (width 0.2) + (layer "B.Cu") + (net 7) + (uuid "d7c68f11-9c2f-41c5-8c9e-2dcd19373f83") + ) + (segment + (start 158.605 110.25) + (end 159.5917 110.25) + (width 0.2) + (layer "F.Cu") + (net 8) + (uuid "18b22744-81b2-490e-b62e-97cfbc0d65e7") + ) + (segment + (start 159.5009 111.25) + (end 159.5917 111.1592) + (width 0.2) + (layer "F.Cu") + (net 8) + (uuid "535a1260-1f19-468d-8251-d54198ee9e44") + ) + (segment + (start 159.5917 110.4885) + (end 159.8481 110.4885) + (width 0.2) + (layer "F.Cu") + (net 8) + (uuid "7202d942-a457-4a18-ba29-364226651e19") + ) + (segment + (start 159.5917 110.4885) + (end 159.5917 110.4472) + (width 0.2) + (layer "F.Cu") + (net 8) + (uuid "822b03fd-64a8-4c74-b4ac-59f5ff3479b3") + ) + (segment + (start 159.5917 110.4472) + (end 159.5917 110.25) + (width 0.2) + (layer "F.Cu") + (net 8) + (uuid "86ea618b-43c2-4771-9e5f-6ab21f3dc577") + ) + (segment + (start 138.2925 113.8575) + (end 131.6375 113.8575) + (width 0.2) + (layer "F.Cu") + (net 8) + (uuid "87addead-ee22-4594-8080-23c1e1b44996") + ) + (segment + (start 158.605 111.25) + (end 159.5009 111.25) + (width 0.2) + (layer "F.Cu") + (net 8) + (uuid "b4cc4d5b-cf53-4bfb-b7cd-f93d26764167") + ) + (segment + (start 140.5 116.975) + (end 140.5 117.11) + (width 0.2) + (layer "F.Cu") + (net 8) + (uuid "bf527ca4-6c91-43fb-be66-9986888a0db4") + ) + (segment + (start 159.5917 111.1592) + (end 159.5917 110.4885) + (width 0.2) + (layer "F.Cu") + (net 8) + (uuid "e01fc89f-04eb-42cb-a810-103ddabc468c") + ) + (segment + (start 139.2068 114.7718) + (end 138.2925 113.8575) + (width 0.2) + (layer "F.Cu") + (net 8) + (uuid "f5be3726-31ba-44a3-98df-fc0540615a0f") + ) + (segment + (start 139.2068 115.6818) + (end 140.5 116.975) + (width 0.2) + (layer "F.Cu") + (net 8) + (uuid "f6b73926-16e1-45fa-82e0-3cefb078a3a9") + ) + (segment + (start 139.2068 114.7718) + (end 139.2068 115.6818) + (width 0.2) + (layer "F.Cu") + (net 8) + (uuid "fe7aaa5f-e8de-49ce-aa27-3d4f9c51537a") + ) + (via + (at 159.8481 110.4885) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 8) + (uuid "3deb2dd7-f933-498c-854b-14e3ed6d3403") + ) + (via + (at 139.2068 114.7718) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 8) + (uuid "6ca2598b-dc12-41b7-a302-4447940c1bca") + ) + (segment + (start 159.8481 110.4885) + (end 143.4901 110.4885) + (width 0.2) + (layer "B.Cu") + (net 8) + (uuid "0a803852-c2a0-42da-8439-c05e61277181") + ) + (segment + (start 143.4901 110.4885) + (end 139.2068 114.7718) + (width 0.2) + (layer "B.Cu") + (net 8) + (uuid "721fc7dd-3a57-4d76-be4d-e73bb1aa4ffb") + ) + (segment + (start 159.52 115.32) + (end 158.1583 115.32) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "036c2dad-535a-4b42-9f8d-838a7ef0b632") + ) + (segment + (start 134.3 111.52) + (end 133.6 111.52) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "03cc55aa-eeaa-4984-bf4c-933da01a6dc7") + ) + (segment + (start 112.1531 118.55) + (end 107.1817 113.5786) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "0ca5c45e-2ba2-4cd5-bec6-8b9fd254e3e8") + ) + (segment + (start 133.6 104.89) + (end 134.97 104.89) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "17a8c997-39a5-4a5e-9ec8-4284044b7ff2") + ) + (segment + (start 124.7607 118.1303) + (end 124.645 118.0147) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "1914164d-9cfb-4b8a-90e9-f7befda28723") + ) + (segment + (start 156.6 114.25) + (end 156.6 114.49) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "1ab2466f-f5fe-42f6-aa76-faef7a30cec2") + ) + (segment + (start 134.362 111.52) + (end 134.3 111.52) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "21078b15-7f64-4b1a-b51e-8833496f20a0") + ) + (segment + (start 135.661 107.259) + (end 135 107.92) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "253cfaa8-3f0b-4835-9a19-78cbfec84bcf") + ) + (segment + (start 163.7 106.68) + (end 162.5883 106.68) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "26eb03c4-4288-4152-88df-16c0272abb61") + ) + (segment + (start 135 111.52) + (end 134.362 111.52) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "2743fc25-b338-4816-8c26-5db27ec1e70c") + ) + (segment + (start 122.3885 120.276) + (end 120.6625 118.55) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "2875e427-773c-4e40-85f2-71e2b634bd73") + ) + (segment + (start 135 107.92) + (end 133.63 107.92) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "2ce76873-5dc0-4716-b08d-5fb409b2a78c") + ) + (segment + (start 158.7767 104.0267) + (end 157.55 102.8) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "396c8ce7-3720-4ad8-96e2-aa1eea3e00a9") + ) + (segment + (start 134.97 104.89) + (end 135 104.92) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "3a70e31a-7291-45bd-9556-fd337d7a2b61") + ) + (segment + (start 157.1396 105.8645) + (end 156.6 106.4041) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "420c08c8-b1c7-463d-8454-394d502d22f4") + ) + (segment + (start 158.1583 115.32) + (end 157.5683 114.73) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "42ee47fb-a6a3-47df-aaa5-4e043a14ac23") + ) + (segment + (start 135.661 105.581) + (end 135.661 107.259) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "43d66b87-4478-4061-8ede-c4d868be8fab") + ) + (segment + (start 156.6 114.25) + (end 157.5683 114.25) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "50df1b39-aaa9-472d-a36a-7509b4e39bb5") + ) + (segment + (start 125.5702 118.9398) + (end 125.3232 119.1868) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "53547d11-3524-43dc-a255-2f7739d6b03c") + ) + (segment + (start 158.1583 106.68) + (end 158.1583 107.3033) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "58d45719-0cbc-4424-8c85-317bf413cf04") + ) + (segment + (start 131.6375 111.3175) + (end 133.3975 111.3175) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "5c24b427-1d0a-420d-a879-f43b0a497b9a") + ) + (segment + (start 103.8805 113.4302) + (end 103.8805 113.0796) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "5f5caf25-5a2b-421f-9f72-08998037ec23") + ) + (segment + (start 103.8805 113.0796) + (end 103.5222 112.7213) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "5f72445c-d6da-4163-a1ac-e43346c34cc8") + ) + (segment + (start 125.3232 119.1868) + (end 124.91 119.6) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "74bf6a48-8fce-4070-9dd0-c8c8349e61bc") + ) + (segment + (start 159.52 106.68) + (end 158.7767 106.68) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "77c8cb74-2010-49d3-b014-708cfe0e56c6") + ) + (segment + (start 128.6369 108.4155) + (end 128.6369 114.2541) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "785e4f21-2625-4d0d-9ee1-d6f9fc3063bb") + ) + (segment + (start 158.605 114.25) + (end 157.5683 114.25) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "7926fed9-335b-4501-9b6c-5ad5d4d792a6") + ) + (segment + (start 158.1583 107.3033) + (end 158.605 107.75) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "793215e5-129d-48fb-ba1f-4e5a631f6d0a") + ) + (segment + (start 133.63 107.92) + (end 133.6 107.89) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "7fd8dfc6-c40c-4a33-a3fe-95729fe2f3d3") + ) + (segment + (start 135 111.52) + (end 135.6222 110.8978) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "8e27d9e0-6bda-4456-8b4a-6489fd21af55") + ) + (segment + (start 135.6222 108.5422) + (end 135 107.92) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "973f89fd-d22d-49b2-bb45-f7152c66fdd3") + ) + (segment + (start 124.234 120.276) + (end 122.3885 120.276) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "97aaea8b-9220-45eb-80d1-1cb5d59e8ddb") + ) + (segment + (start 103.5222 112.7213) + (end 103.1716 112.7213) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "99d7426a-2f30-4c45-9928-c5b5f60347b4") + ) + (segment + (start 158.7767 106.68) + (end 158.7767 104.0267) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "9b126ba6-c4b3-4470-a872-86963e920a5a") + ) + (segment + (start 107.1817 113.5786) + (end 104.0289 113.5786) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "a0aa3420-03b3-4934-85a4-eb2d6f5c0fa2") + ) + (segment + (start 103.1716 112.7213) + (end 102.7 112.2497) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "a3524a51-6795-487f-85c0-d90668d9f011") + ) + (segment + (start 120.6625 118.55) + (end 112.1531 118.55) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "a3d64457-d6bb-4a88-972f-f8d8c8047df4") + ) + (segment + (start 156.6 106.4041) + (end 156.6 106.49) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "a40c4518-154f-47ad-b844-146897d36ef8") + ) + (segment + (start 162.5883 106.68) + (end 162.5883 115.32) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "ac79e1e3-1cda-4db5-9594-7ae86df3e32b") + ) + (segment + (start 133.6 104.89) + (end 132.1624 104.89) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "aee078a1-f13e-4017-aa94-6328cea09d00") + ) + (segment + (start 135.6222 110.8978) + (end 135.6222 108.5422) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "b22fea35-e5d2-4f6e-851c-9e322867fd2d") + ) + (segment + (start 157.5683 114.73) + (end 157.5683 114.25) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "b39db1d6-1588-457c-ae29-9ea4b9ca5ac3") + ) + (segment + (start 133.3975 111.3175) + (end 133.6 111.52) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "be8447b9-2a65-4134-bf18-2ce215008fcf") + ) + (segment + (start 102.7 112.2497) + (end 102.7 111) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "bfc3cca8-bcb2-47fa-8454-a68e82508ce1") + ) + (segment + (start 128.6369 114.2541) + (end 124.7607 118.1303) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "c89835ec-fd47-4a1d-a123-ba6cd0f00184") + ) + (segment + (start 124.91 119.6) + (end 124.234 120.276) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "ca79f205-ed72-44c2-be0c-a16e64ef8d0c") + ) + (segment + (start 125.5702 118.9398) + (end 124.7607 118.1303) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "d7727125-7f42-4a92-981b-3302d5f3fc33") + ) + (segment + (start 132.1624 104.89) + (end 128.6369 108.4155) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "e1a3340c-e88a-448e-b591-c6b72bd1972f") + ) + (segment + (start 104.0289 113.5786) + (end 103.8805 113.4302) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "e3a120ee-ba51-4252-b678-a58d553c205b") + ) + (segment + (start 163.7 115.32) + (end 162.5883 115.32) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "ea13cf1e-1f95-40dd-848e-d02cf0363aed") + ) + (segment + (start 135 104.92) + (end 135.661 105.581) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "f205e9da-8b0a-4757-af6a-c002351436f5") + ) + (segment + (start 158.7767 106.68) + (end 158.1583 106.68) + (width 0.3) + (layer "F.Cu") + (net 9) + (uuid "f5fce6ae-2e0d-4638-ad3c-a81a3d8496d6") + ) + (via + (at 160.5 103.9) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "1d919eb7-b591-490e-98ec-9bed391d8d19") + ) + (via + (at 160.5 118.9) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "200e8760-d27b-40e6-a0be-a617d7bff5f6") + ) + (via + (at 163 103.9) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "22e1c664-a0c2-4641-914c-ed24d4eb31aa") + ) + (via + (at 115.5 101.4) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "272d2f59-c6ed-4970-870a-5fb4cfb3801a") + ) + (via + (at 124.645 118.0147) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "2bbd198e-8218-4cfc-9375-860a52322d59") + ) + (via + (at 158 118.9) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "3ed59ea4-b085-4c65-b85a-3678abc2a3a4") + ) + (via + (at 110.5 101.4) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "53d04136-96e7-48a5-9b43-1d3b10913acf") + ) + (via + (at 163 106.4) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "6a96f8b8-a06f-4427-bb72-a094f8662f34") + ) + (via + (at 163 113.9) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "84cac82c-d65a-45a9-a523-87b51633347a") + ) + (via + (at 110.5 103.9) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "8b18aa30-eb63-43ca-9994-5230d8e4b3b5") + ) + (via + (at 163 118.9) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "8b9a2dbd-9946-439f-a774-aa45438bbd60") + ) + (via + (at 160.5 101.4) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "9e1bccb7-fdea-45a0-913e-4e0c4e860a5e") + ) + (via + (at 158 101.4) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "a5ba10da-dd9c-4ed0-be4c-26b1d26b1205") + ) + (via + (at 163 111.4) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "a6f23530-8e53-43eb-ac9f-7ca41afd7fd9") + ) + (via + (at 160.5 106.4) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "b4ab317e-4357-4a37-961a-803db8abb404") + ) + (via + (at 163 108.9) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "c7629b6d-7222-4b99-858c-8a988ca940ed") + ) + (via + (at 157.1396 105.8645) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "d020d6f4-429b-4691-915c-443cbe3b9e33") + ) + (via + (at 163 101.4) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "ea529fc0-9283-4b39-9cb2-765dafe5a745") + ) + (via + (at 118 101.4) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "ec20d463-c1dc-4e81-a3c0-fff5a48e6533") + ) + (via + (at 163 116.4) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "f277e1ca-253e-4ef8-a7e6-b51ef357213d") + ) + (via + (at 113 101.4) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 9) + (uuid "ff71bb6b-88c5-4d5b-b806-57830778a0a0") + ) + (segment + (start 155.4636 118.0147) + (end 158.1583 115.32) + (width 0.3) + (layer "B.Cu") + (net 9) + (uuid "1e69a2ef-47e0-4508-92ab-799170d5711b") + ) + (segment + (start 163.7 106.68) + (end 159.52 106.68) + (width 0.3) + (layer "B.Cu") + (net 9) + (uuid "261af396-7040-4879-bc4f-d1ab20362df7") + ) + (segment + (start 159.52 106.68) + (end 157.9551 106.68) + (width 0.3) + (layer "B.Cu") + (net 9) + (uuid "54f01bd9-7f54-441d-ae3c-b4096033188c") + ) + (segment + (start 124.645 118.0147) + (end 155.4636 118.0147) + (width 0.3) + (layer "B.Cu") + (net 9) + (uuid "5f0bba25-f5ba-4aa3-8bd2-c34e8cdf27ad") + ) + (segment + (start 157.9551 106.68) + (end 157.1396 105.8645) + (width 0.3) + (layer "B.Cu") + (net 9) + (uuid "604c18b7-7994-4d81-84b3-fa1c942401d3") + ) + (segment + (start 159.52 115.32) + (end 158.1583 115.32) + (width 0.3) + (layer "B.Cu") + (net 9) + (uuid "7052fcad-94e4-4408-89e3-2a2df84eee7f") + ) + (segment + (start 163.7 115.32) + (end 159.52 115.32) + (width 0.3) + (layer "B.Cu") + (net 9) + (uuid "f75cbdff-5ef7-4c07-8090-dcddfa773b87") + ) + (segment + (start 106.1 111) + (end 107.2708 111) + (width 0.2) + (layer "F.Cu") + (net 10) + (uuid "1832c306-4a92-4e55-9500-64214567b00e") + ) + (segment + (start 123.1254 108.7004) + (end 123.2 108.775) + (width 0.2) + (layer "F.Cu") + (net 10) + (uuid "27ecb775-a4a6-49a9-8469-26a809368b22") + ) + (segment + (start 122.2371 108.7004) + (end 123.1254 108.7004) + (width 0.2) + (layer "F.Cu") + (net 10) + (uuid "548a9446-ad41-4a35-bf84-6741c048eb44") + ) + (segment + (start 107.2708 111) + (end 107.7238 111.453) + (width 0.2) + (layer "F.Cu") + (net 10) + (uuid "eb28eea9-5c15-46bb-869f-f774d8a277af") + ) + (via + (at 122.2371 108.7004) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 10) + (uuid "4ee86240-8b32-4482-b268-252ea1832b92") + ) + (via + (at 107.7238 111.453) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 10) + (uuid "c75b23f7-9d4e-4e4b-ac83-9acbcf3706f4") + ) + (segment + (start 107.7238 111.453) + (end 119.4845 111.453) + (width 0.2) + (layer "B.Cu") + (net 10) + (uuid "204c816c-b62d-4353-80ab-def24c045caf") + ) + (segment + (start 119.4845 111.453) + (end 122.2371 108.7004) + (width 0.2) + (layer "B.Cu") + (net 10) + (uuid "34c88254-72c4-4e1a-b467-b734134fa811") + ) + (segment + (start 125.5955 106.8725) + (end 124.1145 108.3535) + (width 0.2) + (layer "F.Cu") + (net 11) + (uuid "10c5ba67-4cb9-48a3-9deb-2deab836c34a") + ) + (segment + (start 124.1145 108.3535) + (end 124.1145 109.5105) + (width 0.2) + (layer "F.Cu") + (net 11) + (uuid "19af7e8e-daa5-4739-92cc-be763759612a") + ) + (segment + (start 126.3625 106.8725) + (end 125.5955 106.8725) + (width 0.2) + (layer "F.Cu") + (net 11) + (uuid "ca73fdce-6cc2-4f92-bcc5-0b83351fb303") + ) + (segment + (start 124.1145 109.5105) + (end 123.2 110.425) + (width 0.2) + (layer "F.Cu") + (net 11) + (uuid "cad809df-c1b4-4b1d-b101-71e1264bb2f8") + ) + (segment + (start 131.6375 110.0475) + (end 130.906 110.0475) + (width 0.2) + (layer "F.Cu") + (net 12) + (uuid "23159d05-39a0-4fc8-bba9-457a80cf70f7") + ) + (segment + (start 107.5 108.8266) + (end 107.3223 109.0043) + (width 0.2) + (layer "F.Cu") + (net 12) + (uuid "4122922a-7bc6-44a2-8eac-b643b0d044a9") + ) + (segment + (start 130.5268 110.4267) + (end 130.5268 112.5875) + (width 0.2) + (layer "F.Cu") + (net 12) + (uuid "4e337cc7-d10a-4354-8250-85040459a15f") + ) + (segment + (start 133.6 108.91) + (end 132.4625 110.0475) + (width 0.2) + (layer "F.Cu") + (net 12) + (uuid "5f382ad3-1d6c-4b12-9e43-278579864d8f") + ) + (segment + (start 134.97 108.91) + (end 133.6 108.91) + (width 0.2) + (layer "F.Cu") + (net 12) + (uuid "68288777-cd4d-47ad-910c-c2990f595b85") + ) + (segment + (start 130.5268 120.5904) + (end 130.1222 120.995) + (width 0.2) + (layer "F.Cu") + (net 12) + (uuid "685895be-8811-4be7-ac12-fb3fed3c1ba6") + ) + (segment + (start 132.4625 110.0475) + (end 131.6375 110.0475) + (width 0.2) + (layer "F.Cu") + (net 12) + (uuid "8a5ca4de-e1c5-42e4-a113-c40136c16b7d") + ) + (segment + (start 107.5 106.5) + (end 107.5 108.8266) + (width 0.2) + (layer "F.Cu") + (net 12) + (uuid "96ec64bd-e09b-4acf-9d31-15da129c7e75") + ) + (segment + (start 130.5268 112.5875) + (end 130.5268 120.5904) + (width 0.2) + (layer "F.Cu") + (net 12) + (uuid "a84bcceb-f71a-4de1-96ce-166c6a8da224") + ) + (segment + (start 131.6375 112.5875) + (end 130.5268 112.5875) + (width 0.2) + (layer "F.Cu") + (net 12) + (uuid "b73500d0-513e-40f8-8b50-606f527de454") + ) + (segment + (start 130.906 110.0475) + (end 130.5268 110.4267) + (width 0.2) + (layer "F.Cu") + (net 12) + (uuid "d2c0bc64-48ab-4a86-9916-7175bfe29c67") + ) + (segment + (start 135 108.88) + (end 134.97 108.91) + (width 0.2) + (layer "F.Cu") + (net 12) + (uuid "f0c39e0f-2d3f-4212-a015-c540d4f3bb21") + ) + (via + (at 130.1222 120.995) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 12) + (uuid "37b59001-0b2a-44bc-8d60-46ef2601a799") + ) + (via + (at 107.3223 109.0043) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 12) + (uuid "f7f38c75-dce6-4b25-b80a-6d211c7610a6") + ) + (segment + (start 106.9059 110.1936) + (end 107.3223 109.7772) + (width 0.2) + (layer "B.Cu") + (net 12) + (uuid "01372a9b-25dd-4bab-817a-13862eff32e4") + ) + (segment + (start 130.1222 120.995) + (end 116.288 120.995) + (width 0.2) + (layer "B.Cu") + (net 12) + (uuid "0a7ce432-c13d-4c63-b626-8e98cc472447") + ) + (segment + (start 107.3223 109.7772) + (end 107.3223 109.0043) + (width 0.2) + (layer "B.Cu") + (net 12) + (uuid "149f6f6f-0c2f-4bfd-9aab-392a86dcdff8") + ) + (segment + (start 116.288 120.995) + (end 106.9059 111.6129) + (width 0.2) + (layer "B.Cu") + (net 12) + (uuid "d1da9a8e-fa66-49a4-b411-bf3e4a6ff3c8") + ) + (segment + (start 106.9059 111.6129) + (end 106.9059 110.1936) + (width 0.2) + (layer "B.Cu") + (net 12) + (uuid "f2fa8d5a-55eb-4ea9-9f6a-0ad7f1a930b9") + ) + (segment + (start 132.7375 108.3671) + (end 132.3271 108.7775) + (width 0.2) + (layer "F.Cu") + (net 13) + (uuid "0c9874f9-33a0-41bb-a9f3-e23c6a2cea97") + ) + (segment + (start 131.6375 108.7775) + (end 130.902 108.7775) + (width 0.2) + (layer "F.Cu") + (net 13) + (uuid "200ce4eb-593c-4e81-87c6-efbcb6cf2cfa") + ) + (segment + (start 129.0486 110.6309) + (end 129.0486 116.3731) + (width 0.2) + (layer "F.Cu") + (net 13) + (uuid "2d79f1a0-b8cd-4ece-aa83-dc057db1894e") + ) + (segment + (start 129.0486 116.3731) + (end 124.7099 120.7118) + (width 0.2) + (layer "F.Cu") + (net 13) + (uuid "36d54769-496b-4a50-9d9b-d4444dc6a413") + ) + (segment + (start 132.7375 106.7725) + (end 132.7375 108.3671) + (width 0.2) + (layer "F.Cu") + (net 13) + (uuid "3808d42c-7ba7-405b-868c-024378ae6474") + ) + (segment + (start 133.6 105.91) + (end 134.97 105.91) + (width 0.2) + (layer "F.Cu") + (net 13) + (uuid "5423282c-712a-4d9b-bee1-49b2b4b8de1c") + ) + (segment + (start 130.902 108.7775) + (end 129.0486 110.6309) + (width 0.2) + (layer "F.Cu") + (net 13) + (uuid "76f32232-836a-43fd-83b9-9b24bbe806c9") + ) + (segment + (start 124.7099 120.7118) + (end 112.7118 120.7118) + (width 0.2) + (layer "F.Cu") + (net 13) + (uuid "8075d2f0-8b0d-449d-866a-1f49ee512ce9") + ) + (segment + (start 134.97 105.91) + (end 135 105.88) + (width 0.2) + (layer "F.Cu") + (net 13) + (uuid "e5bb99c9-7629-4bef-a1ec-b4ad889b90db") + ) + (segment + (start 112.7118 120.7118) + (end 107.5 115.5) + (width 0.2) + (layer "F.Cu") + (net 13) + (uuid "e973b235-9505-4eb7-9a1b-2745ff4126c4") + ) + (segment + (start 132.3271 108.7775) + (end 131.6375 108.7775) + (width 0.2) + (layer "F.Cu") + (net 13) + (uuid "f06fc332-87cf-4c4c-947a-a4d8300c8009") + ) + (segment + (start 133.6 105.91) + (end 132.7375 106.7725) + (width 0.2) + (layer "F.Cu") + (net 13) + (uuid "f832737a-b369-4516-983d-2a9f4ba3ed91") + ) + (segment + (start 121.6 105.35) + (end 121.6 111.1) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "156e032a-40cd-4914-9ce4-c03785f4ce81") + ) + (segment + (start 121.6 111.1) + (end 118.15 114.55) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "15898d54-a83d-4773-90bb-6b1c042ee91f") + ) + (segment + (start 155.65 101.2104) + (end 155.65 102.8) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "1a847f3d-7f7c-4c82-8f58-885f307c1af0") + ) + (segment + (start 124.55 102.4) + (end 124.488 102.4) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "248aca94-d3f2-437f-871e-18ce573ee797") + ) + (segment + (start 155.8184 101.042) + (end 155.65 101.2104) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "2ae3d5a7-9573-482a-b5e5-710dd99a232e") + ) + (segment + (start 157.5698 108.55) + (end 157.5683 108.55) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "38e77c21-9312-4961-a6c4-09c9b5d3710f") + ) + (segment + (start 157.5683 108.55) + (end 157.5683 106.3009) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "634a49c0-3206-4e85-b260-38f01abb66be") + ) + (segment + (start 157.7513 106.1179) + (end 157.7513 104.9013) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "655374d5-edcb-4c2b-b993-bafb469318b8") + ) + (segment + (start 157.57 108.55) + (end 157.5698 108.55) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "75271015-b14a-4be5-b914-35d5b5b3cdbf") + ) + (segment + (start 158.605 113.45) + (end 157.5683 113.45) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "81201d85-8a94-420e-a582-ccec8cd20a7f") + ) + (segment + (start 133.79 102.4) + (end 124.55 102.4) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "95e543cb-08af-451b-8e15-1bc8163edc70") + ) + (segment + (start 157.7513 104.9013) + (end 155.65 102.8) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "9dcf98f0-0931-40c6-8fe3-973bb05c7456") + ) + (segment + (start 157.5683 113.45) + (end 155.65 111.5317) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "b37fa105-0f5e-456e-904f-0a744a098703") + ) + (segment + (start 124.221 102.4) + (end 124.1132 102.2922) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "b580e9e9-44cc-4e6c-b400-2612dad69149") + ) + (segment + (start 158.605 108.55) + (end 157.57 108.55) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "d6d4df6d-3f53-424e-9538-1940e3b36bc0") + ) + (segment + (start 124.221 102.729) + (end 124.221 102.4) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "d6fad402-cb40-4376-8527-53da71035eba") + ) + (segment + (start 155.65 111.5317) + (end 155.65 102.8) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "e32e8d44-92f8-43a9-bb09-f24b908d1db2") + ) + (segment + (start 124.488 102.4) + (end 124.221 102.4) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "e3743f21-9cd0-49bf-9378-2d2ab038b2a0") + ) + (segment + (start 121.6 105.35) + (end 124.221 102.729) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "f92a782a-76c9-4d8c-bed1-e9de95d3a92b") + ) + (segment + (start 157.5683 106.3009) + (end 157.7513 106.1179) + (width 0.3) + (layer "F.Cu") + (net 14) + (uuid "fded807e-c024-43d3-92a8-921405c230cb") + ) + (via + (at 155.8184 101.042) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 14) + (uuid "43fb5a9e-8008-4dea-9bd8-3e953f56967c") + ) + (via + (at 124.1132 102.2922) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 14) + (uuid "d266fb48-486a-47a5-af5b-8102dfe2d96a") + ) + (segment + (start 154.5682 102.2922) + (end 155.8184 101.042) + (width 0.3) + (layer "B.Cu") + (net 14) + (uuid "228d1dba-a0df-4b54-b482-5d50e065a746") + ) + (segment + (start 124.1132 102.2922) + (end 154.5682 102.2922) + (width 0.3) + (layer "B.Cu") + (net 14) + (uuid "be8cef63-62a7-49f3-9683-95ca25fbb8e2") + ) + (segment + (start 102.5 107.4281) + (end 102.5 106.5) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "0b66bae3-fb22-4c9c-a49c-7a7c867ec723") + ) + (segment + (start 143.5 107.1883) + (end 139.7046 103.3929) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "0dc57459-f715-4b87-90d6-00019035df77") + ) + (segment + (start 104.2024 109.1305) + (end 102.5 107.4281) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "0ec5b28b-980f-4917-b862-387609396aa7") + ) + (segment + (start 106.0354 109.1305) + (end 104.2024 109.1305) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "201c8769-9e77-417f-87a6-2259162bf2c9") + ) + (segment + (start 137.5 109.98) + (end 135 112.48) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "2155f55c-f935-4389-bf99-69a742b9f9dd") + ) + (segment + (start 102.5 115.5) + (end 102.5 114.1018) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "2876a6c6-3687-41d5-8f78-3ca88f576971") + ) + (segment + (start 136.6835 106.3718) + (end 137.5 107.1883) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "36a716ba-7221-4f78-9191-382f68c3ae48") + ) + (segment + (start 120.5082 101.6805) + (end 112.4886 109.7001) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "3ddde597-7aba-4528-85b8-9ec73376ebee") + ) + (segment + (start 134.0905 101.6805) + (end 120.5082 101.6805) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "4c12d571-d2ea-496c-b72f-5b8ae1863559") + ) + (segment + (start 143.5 107.875) + (end 143.5 107.1883) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "5844bcb5-f4f9-45f7-91d5-050a67b1edcf") + ) + (segment + (start 106.605 109.7001) + (end 106.0354 109.1305) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "6a71acc1-311a-4113-9fda-8b1ecfb8a3cf") + ) + (segment + (start 136.6835 103.496) + (end 136.6835 106.3718) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "6b22b801-1cd4-4c57-956c-9674daa8eece") + ) + (segment + (start 136.7866 103.3929) + (end 136.6835 103.496) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "7f941ac0-4148-4dc9-b235-5f5da5ce838f") + ) + (segment + (start 134.81 102.4) + (end 134.0905 101.6805) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "869d17a2-00f1-4821-bd2f-4de59eadebee") + ) + (segment + (start 135.5875 102.4) + (end 134.81 102.4) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "97733273-0beb-4128-b012-c0aaca75b4c3") + ) + (segment + (start 112.4886 109.7001) + (end 106.605 109.7001) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "978398a2-b25f-4b9c-996a-f09444bd5366") + ) + (segment + (start 102.5 114.1018) + (end 103.2688 113.333) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "a2d73623-003b-48f9-9541-5d08d6caeb16") + ) + (segment + (start 137.5 107.875) + (end 137.5 107.1883) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "a6c132f8-e7eb-46b7-8f5e-1b642178c6c6") + ) + (segment + (start 136.6835 103.496) + (end 135.5875 102.4) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "bc7f50b0-ed7d-496f-90e3-09211b87501e") + ) + (segment + (start 131.6375 111.9525) + (end 133.0725 111.9525) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "c07eab64-0a46-4eb9-bc18-41d2661dc1e1") + ) + (segment + (start 137.5 107.875) + (end 137.5 109.98) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "c85baa3b-da19-4ab2-865d-dda0cdc5b152") + ) + (segment + (start 133.6 112.48) + (end 135 112.48) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "d732728c-a8df-4ac0-8d9a-47234406bcb9") + ) + (segment + (start 139.7046 103.3929) + (end 136.7866 103.3929) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "e321b9aa-419c-44a0-ab1c-eab9c38f77ec") + ) + (segment + (start 133.0725 111.9525) + (end 133.6 112.48) + (width 0.3) + (layer "F.Cu") + (net 15) + (uuid "f91428aa-44f3-4343-b6f6-637e71a128a1") + ) + (via + (at 103.2688 113.333) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 15) + (uuid "89b4695a-db73-4597-8dc6-ea4fbee8ac20") + ) + (via + (at 106.605 109.7001) + (size 0.6) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 15) + (uuid "eb357c97-ea4f-4540-9d63-2260962fe0d7") + ) + (segment + (start 106.4447 109.8604) + (end 106.605 109.7001) + (width 0.3) + (layer "B.Cu") + (net 15) + (uuid "02d21174-9f5e-4bf3-a369-8be6c3eeedd8") + ) + (segment + (start 103.2688 113.333) + (end 105.0134 113.333) + (width 0.3) + (layer "B.Cu") + (net 15) + (uuid "2015ffcb-3dd7-4f6e-8b3c-4bdafa5930e3") + ) + (segment + (start 105.0134 113.333) + (end 106.4447 111.9017) + (width 0.3) + (layer "B.Cu") + (net 15) + (uuid "61678a2c-e599-4da0-8ae7-4fb242c86dc3") + ) + (segment + (start 106.4447 111.9017) + (end 106.4447 109.8604) + (width 0.3) + (layer "B.Cu") + (net 15) + (uuid "ba9c0601-d731-4418-9585-24e7df2a6587") + ) + (zone + (net 9) + (net_name "GND") + (layer "F.Cu") + (uuid "2e24fcce-d0f9-4f81-a436-8ad4a1719d48") + (hatch edge 0.5) + (connect_pads yes + (clearance 0.25) + ) + (min_thickness 0.2) + (filled_areas_thickness no) + (fill yes + (thermal_gap 0.25) + (thermal_bridge_width 0.3) + ) + (polygon + (pts + (xy 100.2 100.2) (xy 165.8 100.2) (xy 165.8 121.8) (xy 100.2 121.8) + ) + ) + (filled_polygon + (layer "F.Cu") + (pts + (xy 155.764958 100.319407) (xy 155.800922 100.368907) (xy 155.800922 100.430093) (xy 155.764958 100.479593) + (xy 155.732393 100.495125) (xy 155.605915 100.529016) (xy 155.605913 100.529016) (xy 155.605909 100.529018) + (xy 155.480389 100.601487) (xy 155.377887 100.703989) (xy 155.305417 100.82951) (xy 155.2679 100.969525) + (xy 155.2679 101.075967) (xy 155.264527 101.101589) (xy 155.2495 101.157673) (xy 155.2495 101.778215) + (xy 155.230593 101.836406) (xy 155.185098 101.870973) (xy 155.157666 101.881204) (xy 155.042458 101.96745) + (xy 155.04245 101.967458) (xy 154.956202 102.08267) (xy 154.90591 102.217511) (xy 154.905908 102.217522) + (xy 154.8995 102.277129) (xy 154.8995 103.322866) (xy 154.899501 103.32287) (xy 154.905908 103.38248) + (xy 154.905909 103.382485) (xy 154.956202 103.517329) (xy 155.04245 103.632541) (xy 155.042454 103.632546) + (xy 155.157669 103.718796) (xy 155.185093 103.729024) (xy 155.233009 103.767073) (xy 155.2495 103.821783) + (xy 155.2495 111.478973) (xy 155.2495 111.584427) (xy 155.251401 111.59152) (xy 155.276794 111.686292) + (xy 155.329516 111.777608) (xy 155.329518 111.77761) (xy 155.32952 111.777613) (xy 157.322387 113.77048) + (xy 157.322389 113.770481) (xy 157.322391 113.770483) (xy 157.413708 113.823205) (xy 157.413706 113.823205) + (xy 157.41371 113.823206) (xy 157.413712 113.823207) (xy 157.515573 113.8505) (xy 157.592961 113.8505) + (xy 157.651152 113.869407) (xy 157.675276 113.894498) (xy 157.687302 113.912496) (xy 157.699398 113.9306) + (xy 157.6994 113.930602) (xy 157.724261 113.947213) (xy 157.78226 113.985966) (xy 157.837808 113.997015) + (xy 157.855315 114.000498) (xy 157.85532 114.000498) (xy 157.855326 114.0005) (xy 157.855327 114.0005) + (xy 159.354673 114.0005) (xy 159.354674 114.0005) (xy 159.386328 113.994203) (xy 159.447088 114.001392) + (xy 159.492019 114.042923) (xy 159.501271 114.065677) (xy 159.51372 114.112139) (xy 159.589481 114.24336) + (xy 159.589483 114.243362) (xy 159.589485 114.243365) (xy 159.696635 114.350515) (xy 159.696637 114.350516) + (xy 159.696639 114.350518) (xy 159.827861 114.426279) (xy 159.827859 114.426279) (xy 159.827863 114.42628) + (xy 159.827865 114.426281) (xy 159.974234 114.4655) (xy 159.974236 114.4655) (xy 160.125764 114.4655) + (xy 160.125766 114.4655) (xy 160.272135 114.426281) (xy 160.391101 114.357595) (xy 160.450947 114.344874) + (xy 160.506843 114.36976) (xy 160.537436 114.422748) (xy 160.5396 114.443332) (xy 160.5396 115.42471) + (xy 160.520693 115.482901) (xy 160.510604 115.494714) (xy 160.249214 115.756104) (xy 160.194697 115.783881) + (xy 160.17921 115.7851) (xy 157.41179 115.7851) (xy 157.353599 115.766193) (xy 157.341786 115.756104) + (xy 157.199496 115.613814) (xy 157.171719 115.559297) (xy 157.1705 115.54381) (xy 157.1705 115.338421) + (xy 157.1705 115.338418) (xy 157.159582 115.263482) (xy 157.103076 115.147898) (xy 157.012102 115.056924) + (xy 156.896518 115.000418) (xy 156.821582 114.9895) (xy 156.378418 114.9895) (xy 156.303482 115.000418) + (xy 156.187899 115.056923) (xy 156.096923 115.147899) (xy 156.059063 115.225344) (xy 156.040418 115.263482) + (xy 156.0295 115.338418) (xy 156.0295 115.681582) (xy 156.040418 115.756518) (xy 156.096924 115.872102) + (xy 156.187898 115.963076) (xy 156.303482 116.019582) (xy 156.378418 116.0305) (xy 156.58381 116.0305) + (xy 156.642001 116.049407) (xy 156.653813 116.059496) (xy 157.010387 116.416069) (xy 157.010392 116.416073) + (xy 157.085973 116.45971) (xy 157.085974 116.45971) (xy 157.087487 116.460583) (xy 157.090312 116.462214) + (xy 157.179456 116.4861) (xy 157.179457 116.4861) (xy 160.411543 116.4861) (xy 160.411544 116.4861) + (xy 160.500688 116.462214) (xy 160.504109 116.460238) (xy 160.505026 116.45971) (xy 160.580607 116.416073) + (xy 160.580607 116.416072) (xy 160.580612 116.41607) (xy 161.17057 115.826112) (xy 161.216714 115.746188) + (xy 161.221615 115.727898) (xy 161.225015 115.715211) (xy 161.234026 115.681578) (xy 161.2406 115.657044) + (xy 161.2406 110.502256) (xy 161.216714 110.413112) (xy 161.207989 110.398) (xy 161.207173 110.396587) + (xy 161.189722 110.36636) (xy 161.17057 110.333188) (xy 159.806912 108.96953) (xy 159.726988 108.923386) + (xy 159.721794 108.921994) (xy 159.712108 108.919398) (xy 159.712108 108.919399) (xy 159.653877 108.903796) + (xy 159.65161 108.902324) (xy 159.648907 108.902324) (xy 159.62615 108.88579) (xy 159.602562 108.870472) + (xy 159.601593 108.867948) (xy 159.599407 108.86636) (xy 159.590714 108.839606) (xy 159.580636 108.81335) + (xy 159.5805 108.808169) (xy 159.5805 108.674937) (xy 159.599407 108.616746) (xy 159.648907 108.580782) + (xy 159.710093 108.580782) (xy 159.728996 108.589198) (xy 159.827865 108.646281) (xy 159.974234 108.6855) + (xy 159.974236 108.6855) (xy 160.125764 108.6855) (xy 160.125766 108.6855) (xy 160.272135 108.646281) + (xy 160.272137 108.646279) (xy 160.272139 108.646279) (xy 160.40336 108.570518) (xy 160.40336 108.570517) + (xy 160.403365 108.570515) (xy 160.510515 108.463365) (xy 160.514234 108.456923) (xy 160.586279 108.332139) + (xy 160.586279 108.332137) (xy 160.586281 108.332135) (xy 160.6255 108.185766) (xy 160.6255 108.034234) + (xy 160.586281 107.887865) (xy 160.586279 107.887861) (xy 160.586279 107.88786) (xy 160.510518 107.756639) + (xy 160.510516 107.756637) (xy 160.510515 107.756635) (xy 160.403365 107.649485) (xy 160.403362 107.649483) + (xy 160.40336 107.649481) (xy 160.272138 107.57372) (xy 160.27214 107.57372) (xy 160.203102 107.555222) + (xy 160.125766 107.5345) (xy 159.974234 107.5345) (xy 159.896898 107.555222) (xy 159.82786 107.57372) + (xy 159.696639 107.649481) (xy 159.589481 107.756639) (xy 159.51372 107.887861) (xy 159.513718 107.887865) + (xy 159.50127 107.934323) (xy 159.467946 107.985637) (xy 159.410825 108.007563) (xy 159.386331 108.005797) + (xy 159.354674 107.9995) (xy 158.0678 107.9995) (xy 158.009609 107.980593) (xy 157.973645 107.931093) + (xy 157.9688 107.9005) (xy 157.9688 106.5078) (xy 157.987707 106.449609) (xy 157.99779 106.437802) + (xy 158.07178 106.363813) (xy 158.072206 106.363076) (xy 158.124505 106.272492) (xy 158.124505 106.27249) + (xy 158.124507 106.272488) (xy 158.1518 106.170627) (xy 158.1518 106.065173) (xy 158.1518 104.848573) + (xy 158.124507 104.746713) (xy 158.124507 104.746712) (xy 158.124507 104.746711) (xy 158.071783 104.655391) + (xy 158.071782 104.65539) (xy 158.071781 104.655389) (xy 158.07178 104.655387) (xy 156.429495 103.013102) + (xy 156.401718 102.958585) (xy 156.400499 102.943098) (xy 156.400499 102.277133) (xy 156.400499 102.277128) + (xy 156.394091 102.217517) (xy 156.368688 102.149407) (xy 156.343797 102.08267) (xy 156.257549 101.967458) + (xy 156.257548 101.967457) (xy 156.257546 101.967454) (xy 156.248169 101.960434) (xy 156.142333 101.881204) + (xy 156.114902 101.870973) (xy 156.092532 101.853207) (xy 156.069407 101.836406) (xy 156.068722 101.834298) + (xy 156.066988 101.832921) (xy 156.0505 101.778215) (xy 156.0505 101.600816) (xy 156.069407 101.542625) + (xy 156.099996 101.515082) (xy 156.156415 101.482509) (xy 156.258909 101.380015) (xy 156.270453 101.36002) + (xy 156.331382 101.254489) (xy 156.331382 101.254487) (xy 156.331384 101.254485) (xy 156.3689 101.114475) + (xy 156.3689 100.969525) (xy 156.331384 100.829515) (xy 156.331382 100.829512) (xy 156.331382 100.82951) + (xy 156.258912 100.703989) (xy 156.25891 100.703987) (xy 156.258909 100.703985) (xy 156.156415 100.601491) + (xy 156.156412 100.601489) (xy 156.15641 100.601487) (xy 156.03089 100.529018) (xy 156.030887 100.529017) + (xy 156.030885 100.529016) (xy 155.904407 100.495126) (xy 155.853095 100.461802) (xy 155.831169 100.404681) + (xy 155.847005 100.34558) (xy 155.894555 100.307075) (xy 155.930033 100.3005) (xy 163.99645 100.3005) + (xy 164.003514 100.300752) (xy 164.024934 100.302284) (xy 164.234808 100.317299) (xy 164.248765 100.319307) + (xy 164.471873 100.367845) (xy 164.485425 100.371824) (xy 164.699358 100.451619) (xy 164.7122 100.457484) + (xy 164.912601 100.566914) (xy 164.924468 100.574541) (xy 165.097385 100.703985) (xy 165.10725 100.71137) + (xy 165.117925 100.720619) (xy 165.27938 100.882074) (xy 165.288629 100.892749) (xy 165.425456 101.075527) + (xy 165.433087 101.087402) (xy 165.44787 101.114474) (xy 165.542513 101.287796) (xy 165.548381 101.300644) + (xy 165.628175 101.514574) (xy 165.632154 101.528126) (xy 165.68069 101.751221) (xy 165.682701 101.765202) + (xy 165.699248 101.996484) (xy 165.6995 102.003549) (xy 165.6995 119.99645) (xy 165.699248 120.003515) + (xy 165.682701 120.234797) (xy 165.68069 120.248778) (xy 165.632154 120.471873) (xy 165.628175 120.485425) + (xy 165.548381 120.699355) (xy 165.542513 120.712203) (xy 165.43309 120.912593) (xy 165.425453 120.924476) + (xy 165.288629 121.10725) (xy 165.27938 121.117925) (xy 165.117925 121.27938) (xy 165.10725 121.288629) + (xy 164.924476 121.425453) (xy 164.912593 121.43309) (xy 164.712203 121.542513) (xy 164.699355 121.548381) + (xy 164.485425 121.628175) (xy 164.471873 121.632154) (xy 164.248778 121.68069) (xy 164.234797 121.682701) + (xy 164.003515 121.699248) (xy 163.99645 121.6995) (xy 130.370031 121.6995) (xy 130.31184 121.680593) + (xy 130.275876 121.631093) (xy 130.275876 121.569907) (xy 130.31184 121.520407) (xy 130.332148 121.509035) + (xy 130.334679 121.507985) (xy 130.334685 121.507984) (xy 130.460215 121.435509) (xy 130.562709 121.333015) + (xy 130.562712 121.33301) (xy 130.635182 121.207489) (xy 130.635182 121.207487) (xy 130.635184 121.207485) + (xy 130.6727 121.067475) (xy 130.6727 120.981189) (xy 130.691607 120.922998) (xy 130.70169 120.911191) + (xy 130.80727 120.805612) (xy 130.853414 120.725688) (xy 130.8773 120.636544) (xy 130.8773 120.544256) + (xy 130.8773 115.677) (xy 130.896207 115.618809) (xy 130.945707 115.582845) (xy 130.9763 115.578) + (xy 132.383257 115.578) (xy 132.38326 115.578) (xy 132.451393 115.568073) (xy 132.556483 115.516698) + (xy 132.639198 115.433983) (xy 132.690573 115.328893) (xy 132.7005 115.26076) (xy 132.7005 114.99424) + (xy 132.694968 114.956272) (xy 132.705288 114.895965) (xy 132.749086 114.85324) (xy 132.792934 114.843) + (xy 137.03691 114.843) (xy 137.095101 114.861907) (xy 137.106914 114.871996) (xy 138.354204 116.119286) + (xy 138.381981 116.173803) (xy 138.3832 116.18929) (xy 138.3832 116.275575) (xy 138.389349 116.298524) + (xy 138.420717 116.415589) (xy 138.493187 116.54111) (xy 138.493189 116.541112) (xy 138.493191 116.541115) + (xy 138.595685 116.643609) (xy 138.595687 116.64361) (xy 138.595689 116.643612) (xy 138.721211 116.716082) + (xy 138.721212 116.716082) (xy 138.721215 116.716084) (xy 138.861225 116.7536) (xy 138.861226 116.7536) + (xy 139.006174 116.7536) (xy 139.006175 116.7536) (xy 139.146185 116.716084) (xy 139.146187 116.716082) + (xy 139.146189 116.716082) (xy 139.27171 116.643612) (xy 139.27171 116.643611) (xy 139.271715 116.643609) + (xy 139.374209 116.541115) (xy 139.381521 116.528449) (xy 139.426989 116.487508) (xy 139.48784 116.481111) + (xy 139.537262 116.507944) (xy 139.900504 116.871186) (xy 139.928281 116.925703) (xy 139.9295 116.94119) + (xy 139.9295 117.281582) (xy 139.940418 117.356518) (xy 139.996924 117.472102) (xy 140.087898 117.563076) + (xy 140.203482 117.619582) (xy 140.278418 117.6305) (xy 140.278421 117.6305) (xy 140.721578 117.6305) + (xy 140.721582 117.6305) (xy 140.796518 117.619582) (xy 140.912102 117.563076) (xy 141.003076 117.472102) + (xy 141.059582 117.356518) (xy 141.0705 117.281582) (xy 141.0705 116.938418) (xy 141.059582 116.863482) + (xy 141.003076 116.747898) (xy 140.925179 116.670001) (xy 140.897404 116.615487) (xy 140.906975 116.555055) + (xy 140.925178 116.529999) (xy 141.003076 116.452102) (xy 141.059582 116.336518) (xy 141.0705 116.261582) + (xy 141.0705 115.918418) (xy 141.059582 115.843482) (xy 141.003076 115.727898) (xy 140.912102 115.636924) + (xy 140.906017 115.633949) (xy 140.862045 115.591406) (xy 140.8505 115.54501) (xy 140.8505 108.9629) + (xy 140.869407 108.904709) (xy 140.918907 108.868745) (xy 140.9495 108.8639) (xy 144.224042 108.8639) + (xy 144.224044 108.8639) (xy 144.313188 108.840014) (xy 144.323849 108.833858) (xy 144.323851 108.833858) + (xy 144.359371 108.81335) (xy 144.393112 108.79387) (xy 144.423546 108.763436) (xy 147.087066 108.763436) + (xy 147.087066 108.836563) (xy 147.095606 108.879495) (xy 147.106015 108.931825) (xy 147.106515 108.934336) + (xy 147.106515 108.934338) (xy 147.134496 109.001891) (xy 147.189347 109.083983) (xy 147.189883 109.084784) + (xy 147.241588 109.136489) (xy 147.324478 109.191874) (xy 147.324479 109.191874) (xy 147.32448 109.191875) + (xy 147.329521 109.193963) (xy 147.392035 109.219857) (xy 147.464767 109.238076) (xy 147.501328 109.241677) + (xy 147.526372 109.242907) (xy 147.526389 109.242907) (xy 148.350947 109.242907) (xy 148.350964 109.242907) + (xy 148.376008 109.241677) (xy 148.394288 109.239876) (xy 148.412561 109.238077) (xy 148.412562 109.238077) + (xy 148.412564 109.238076) (xy 148.412569 109.238076) (xy 148.485358 109.219833) (xy 148.486434 109.219387) + (xy 148.486414 109.21934) (xy 148.487948 109.218707) (xy 148.490413 109.218186) (xy 148.521491 109.204866) + (xy 148.552854 109.191876) (xy 148.553001 109.191815) (xy 148.553005 109.191811) (xy 148.553581 109.191504) + (xy 148.555165 109.190739) (xy 148.557614 109.189385) (xy 148.557625 109.189381) (xy 148.596263 109.162875) + (xy 148.597015 109.162366) (xy 148.635858 109.136379) (xy 148.635864 109.136372) (xy 148.636901 109.135521) + (xy 148.63916 109.133448) (xy 148.639833 109.132988) (xy 148.641275 109.13151) (xy 148.643283 109.129669) + (xy 148.668738 109.118054) (xy 148.693503 109.105048) (xy 148.696339 109.105461) (xy 148.698949 109.104271) + (xy 148.726373 109.109837) (xy 148.754049 109.113871) (xy 148.7561 109.115872) (xy 148.758911 109.116443) + (xy 148.77782 109.137061) (xy 148.797846 109.156597) (xy 148.799587 109.160794) (xy 148.800267 109.161536) + (xy 148.800408 109.162775) (xy 148.804692 109.173101) (xy 149.12761 110.206436) (xy 149.127618 110.206458) + (xy 149.127624 110.206477) (xy 149.136267 110.23001) (xy 149.139264 110.237078) (xy 149.139553 110.236955) + (xy 149.142436 110.244289) (xy 149.142339 110.244331) (xy 149.143893 110.247996) (xy 149.143907 110.248031) + (xy 149.150609 110.263837) (xy 149.189693 110.327823) (xy 149.189695 110.327825) (xy 149.193569 110.332466) + (xy 149.196769 110.337605) (xy 149.196775 110.337615) (xy 149.206739 110.348241) (xy 149.208564 110.350426) + (xy 149.208564 110.350428) (xy 149.20857 110.350434) (xy 149.234901 110.381979) (xy 149.236083 110.383473) + (xy 149.236555 110.383961) (xy 149.236559 110.383966) (xy 149.246337 110.391854) (xy 149.256387 110.401182) + (xy 149.264969 110.410334) (xy 149.275614 110.417952) (xy 149.300514 110.435772) (xy 149.300516 110.435773) + (xy 149.302846 110.43744) (xy 149.31415 110.44656) (xy 149.319506 110.449365) (xy 149.324418 110.452881) + (xy 149.324432 110.452891) (xy 149.335084 110.457709) (xy 149.340201 110.460204) (xy 149.367313 110.474406) + (xy 149.367313 110.474407) (xy 149.37891 110.480482) (xy 149.37892 110.480487) (xy 149.397567 110.485973) + (xy 149.415263 110.493978) (xy 149.428011 110.496942) (xy 149.428448 110.495059) (xy 149.474558 110.508626) + (xy 149.474556 110.508626) (xy 149.480582 110.509168) (xy 149.486467 110.510537) (xy 149.486485 110.510541) + (xy 149.501037 110.511008) (xy 149.503872 110.511263) (xy 149.503874 110.511264) (xy 149.503889 110.511265) + (xy 149.534329 110.514007) (xy 149.534329 110.514008) (xy 149.540543 110.514567) (xy 149.547336 110.51518) + (xy 149.547338 110.51518) (xy 149.54737 110.515183) (xy 149.547384 110.515184) (xy 149.566713 110.513116) + (xy 149.586125 110.51374) (xy 149.599036 110.5116) (xy 149.59872 110.509693) (xy 149.64651 110.504583) + (xy 149.646512 110.504582) (xy 149.646514 110.504582) (xy 149.648508 110.504168) (xy 149.656654 110.502231) + (xy 149.656631 110.502114) (xy 149.658238 110.501791) (xy 149.65825 110.50179) (xy 149.658265 110.501787) + (xy 149.669232 110.49765) (xy 149.674629 110.495792) (xy 149.703793 110.486679) (xy 149.703794 110.48668) + (xy 149.716289 110.482776) (xy 149.716305 110.482771) (xy 149.727335 110.476755) (xy 149.739795 110.471041) + (xy 149.751544 110.466612) (xy 149.762655 110.459693) (xy 149.762654 110.459692) (xy 149.788633 110.443516) + (xy 149.788645 110.443508) (xy 149.791048 110.442011) (xy 149.803828 110.435043) (xy 149.808469 110.431168) + (xy 149.8136 110.427974) (xy 149.81362 110.427961) (xy 149.822172 110.41994) (xy 149.826446 110.416158) + (xy 149.849894 110.396586) (xy 149.849895 110.396587) (xy 149.859946 110.388198) (xy 149.859967 110.38818) + (xy 149.872174 110.373048) (xy 149.886337 110.359766) (xy 149.893954 110.349122) (xy 149.892382 110.347997) + (xy 149.915218 110.319691) (xy 149.91522 110.319688) (xy 149.922561 110.310589) (xy 149.922569 110.310573) + (xy 149.923686 110.308872) (xy 149.927021 110.303454) (xy 149.926984 110.303432) (xy 149.928873 110.300333) + (xy 149.928881 110.300322) (xy 149.963107 110.233596) (xy 149.969906 110.213527) (xy 149.971611 110.208495) + (xy 149.971615 110.208482) (xy 149.972425 110.206093) (xy 149.974889 110.198822) (xy 149.974891 110.198814) + (xy 149.975258 110.197732) (xy 149.975296 110.197614) (xy 149.978575 110.187933) (xy 149.98088 110.177798) + (xy 149.981758 110.174716) (xy 149.981765 110.174693) (xy 150.069613 109.796941) (xy 150.101209 109.744549) + (xy 150.157569 109.720732) (xy 150.181556 109.722068) (xy 150.181618 109.721651) (xy 150.184023 109.722007) + (xy 150.184026 109.722008) (xy 150.190256 109.722621) (xy 150.233864 109.726917) (xy 150.233871 109.726917) + (xy 150.366136 109.726917) (xy 150.405563 109.723033) (xy 150.415974 109.722008) (xy 150.432483 109.718724) + (xy 150.493245 109.725914) (xy 150.538176 109.767445) (xy 150.548085 109.792796) (xy 150.693617 110.401381) + (xy 150.693829 110.402266) (xy 150.70085 110.426337) (xy 150.702658 110.431566) (xy 150.703569 110.43125) + (xy 150.705682 110.437592) (xy 150.704842 110.437883) (xy 150.712856 110.46106) (xy 150.747488 110.527556) + (xy 150.749046 110.529705) (xy 150.75026 110.532074) (xy 150.756251 110.539641) (xy 150.757815 110.541797) + (xy 150.757817 110.541804) (xy 150.757827 110.541818) (xy 150.790423 110.586763) (xy 150.790424 110.586764) + (xy 150.796589 110.592474) (xy 150.800277 110.596073) (xy 150.803803 110.599697) (xy 150.81214 110.610226) + (xy 150.823205 110.619636) (xy 150.825925 110.621949) (xy 150.825927 110.621951) (xy 150.854447 110.646205) + (xy 150.854445 110.646206) (xy 150.854456 110.646212) (xy 150.8549 110.646589) (xy 150.858001 110.649341) + (xy 150.863561 110.65449) (xy 150.865826 110.655881) (xy 150.867849 110.657601) (xy 150.867854 110.657605) + (xy 150.876277 110.662298) (xy 150.882628 110.666198) (xy 150.882628 110.666197) (xy 150.917618 110.687684) + (xy 150.91763 110.68769) (xy 150.925329 110.692418) (xy 150.925852 110.692743) (xy 150.925878 110.692756) + (xy 150.92588 110.692756) (xy 150.925882 110.692758) (xy 150.931984 110.695015) (xy 150.933774 110.695677) + (xy 150.947614 110.702047) (xy 150.950863 110.703857) (xy 150.954939 110.706128) (xy 150.965995 110.709694) + (xy 150.987042 110.716482) (xy 150.987055 110.716486) (xy 151.008374 110.723365) (xy 151.012315 110.724729) + (xy 151.019385 110.727344) (xy 151.022088 110.728051) (xy 151.024524 110.728575) (xy 151.02453 110.728577) + (xy 151.032063 110.729451) (xy 151.036206 110.730022) (xy 151.041477 110.730862) (xy 151.041477 110.730861) + (xy 151.077355 110.73658) (xy 151.077375 110.736581) (xy 151.091575 110.738844) (xy 151.091591 110.738846) + (xy 151.105027 110.738329) (xy 151.110041 110.738647) (xy 151.110779 110.738939) (xy 151.115211 110.73911) + (xy 151.123555 110.74008) (xy 151.13328 110.739293) (xy 151.133289 110.739295) (xy 151.174117 110.735992) + (xy 151.174118 110.735993) (xy 151.179592 110.73555) (xy 151.17971 110.735541) (xy 151.181689 110.735385) + (xy 151.191209 110.73502) (xy 151.193606 110.734445) (xy 151.19609 110.73425) (xy 151.196428 110.73419) + (xy 151.196434 110.73419) (xy 151.203712 110.732119) (xy 151.207735 110.731067) (xy 151.212969 110.729816) + (xy 151.212968 110.729815) (xy 151.248321 110.721363) (xy 151.248324 110.721361) (xy 151.262317 110.718016) + (xy 151.262326 110.718013) (xy 151.274527 110.7124) (xy 151.279282 110.710774) (xy 151.280078 110.710761) + (xy 151.284244 110.709221) (xy 151.292324 110.706925) (xy 151.300991 110.702485) (xy 151.301005 110.702483) + (xy 151.337482 110.683792) (xy 151.337483 110.683794) (xy 151.344154 110.680376) (xy 151.352897 110.676356) + (xy 151.35504 110.674801) (xy 151.357398 110.673594) (xy 151.357411 110.673587) (xy 151.363374 110.668864) + (xy 151.366637 110.66639) (xy 151.371009 110.663221) (xy 151.371008 110.66322) (xy 151.404202 110.63915) + (xy 151.404204 110.639147) (xy 151.412084 110.633434) (xy 151.412087 110.633432) (xy 151.412088 110.633432) + (xy 151.412091 110.633429) (xy 151.417796 110.627267) (xy 151.42898 110.616914) (xy 151.435567 110.6117) + (xy 151.441858 110.604301) (xy 151.441866 110.604296) (xy 151.468434 110.573048) (xy 151.468436 110.573049) + (xy 151.473292 110.567338) (xy 151.479826 110.560283) (xy 151.481211 110.558027) (xy 151.48293 110.556006) + (xy 151.522599 110.492377) (xy 151.53238 110.469886) (xy 151.535052 110.463743) (xy 151.535057 110.463732) + (xy 151.536591 110.460204) (xy 151.537242 110.458708) (xy 151.537244 110.4587) (xy 151.537696 110.457663) + (xy 151.537743 110.457551) (xy 151.542983 110.4455) (xy 151.542965 110.445191) (xy 151.545758 110.436396) + (xy 151.545737 110.43639) (xy 151.545748 110.436355) (xy 151.54572 110.436346) (xy 151.546098 110.435261) + (xy 151.54611 110.435232) (xy 151.937279 109.222604) (xy 151.95123 109.203315) (xy 151.962275 109.182223) + (xy 151.968841 109.178968) (xy 151.973137 109.17303) (xy 151.995764 109.165624) (xy 152.017096 109.155052) + (xy 152.024321 109.156278) (xy 152.031287 109.153999) (xy 152.077419 109.165294) (xy 152.083165 109.168302) + (xy 152.095423 109.174721) (xy 152.104495 109.180107) (xy 152.122099 109.19187) (xy 152.122101 109.191871) + (xy 152.122107 109.191875) (xy 152.131431 109.195737) (xy 152.131431 109.195736) (xy 152.147039 109.202201) + (xy 152.14704 109.202202) (xy 152.151147 109.203903) (xy 152.164965 109.211139) (xy 152.177551 109.21484) + (xy 152.189658 109.219855) (xy 152.189658 109.219856) (xy 152.18966 109.219856) (xy 152.189664 109.219858) + (xy 152.221094 109.22773) (xy 152.224954 109.228781) (xy 152.230499 109.230412) (xy 152.230499 109.230413) + (xy 152.235098 109.231766) (xy 152.235145 109.23178) (xy 152.235148 109.23178) (xy 152.235151 109.231781) + (xy 152.240014 109.232714) (xy 152.239969 109.232947) (xy 152.245956 109.233957) (xy 152.258598 109.237124) + (xy 152.259691 109.237808) (xy 152.262392 109.238074) (xy 152.2624 109.238076) (xy 152.277573 109.23957) + (xy 152.277573 109.239569) (xy 152.286533 109.240452) (xy 152.286533 109.240453) (xy 152.298946 109.241676) + (xy 152.323998 109.242907) (xy 152.324012 109.242907) (xy 153.07361 109.242907) (xy 153.073627 109.242907) + (xy 153.098671 109.241677) (xy 153.135232 109.238076) (xy 153.207964 109.219857) (xy 153.275521 109.191874) + (xy 153.358411 109.136489) (xy 153.410116 109.084784) (xy 153.465501 109.001894) (xy 153.493484 108.934337) + (xy 153.512933 108.836561) (xy 153.512933 108.763439) (xy 153.493484 108.665663) (xy 153.467414 108.602725) + (xy 153.465502 108.598108) (xy 153.453925 108.580782) (xy 153.410116 108.515216) (xy 153.358411 108.463511) + (xy 153.358192 108.463365) (xy 153.275518 108.408124) (xy 153.207967 108.380144) (xy 153.207965 108.380143) + (xy 153.207964 108.380143) (xy 153.135232 108.361924) (xy 153.135231 108.361923) (xy 153.135228 108.361923) + (xy 153.098679 108.358323) (xy 153.08436 108.35762) (xy 153.073627 108.357093) (xy 153.073621 108.357093) + (xy 152.645692 108.357093) (xy 152.587501 108.338186) (xy 152.55878 108.305499) (xy 152.46161 108.127354) + (xy 152.263047 107.763321) (xy 152.249974 107.741924) (xy 152.234673 107.71944) (xy 152.23467 107.719434) + (xy 152.227276 107.708567) (xy 152.227257 107.708541) (xy 152.220605 107.698766) (xy 152.214364 107.695339) + (xy 152.21371 107.694636) (xy 152.194077 107.673338) (xy 152.189247 107.667687) (xy 152.186688 107.664455) + (xy 152.186685 107.664451) (xy 152.18668 107.664446) (xy 152.185405 107.663126) (xy 152.178909 107.656884) + (xy 152.178489 107.656429) (xy 152.178484 107.656424) (xy 152.169876 107.649481) (xy 152.155458 107.637852) + (xy 152.1541 107.636722) (xy 152.153278 107.636041) (xy 152.141953 107.62641) (xy 152.130967 107.617067) + (xy 152.130959 107.617062) (xy 152.126968 107.614292) (xy 152.12711 107.614086) (xy 152.125648 107.6131) + (xy 152.125609 107.613161) (xy 152.12154 107.610493) (xy 152.121538 107.610492) (xy 152.121537 107.610491) + (xy 152.083717 107.590689) (xy 152.08144 107.589459) (xy 152.079979 107.588644) (xy 152.043951 107.568562) + (xy 152.043947 107.56856) (xy 152.043944 107.568559) (xy 152.037437 107.566458) (xy 152.033258 107.56427) + (xy 152.004047 107.555677) (xy 152.003229 107.555413) (xy 152.002405 107.555158) (xy 152.002309 107.555127) + (xy 152.002304 107.555123) (xy 152.00218 107.555085) (xy 151.974291 107.54609) (xy 151.969546 107.54506) + (xy 151.969598 107.544816) (xy 151.967834 107.544456) (xy 151.967821 107.544528) (xy 151.963054 107.543622) + (xy 151.920473 107.539795) (xy 151.917899 107.539529) (xy 151.875334 107.534578) (xy 151.868514 107.535127) + (xy 151.863823 107.534706) (xy 151.833569 107.537943) (xy 151.832566 107.538024) (xy 151.832012 107.538076) + (xy 151.832013 107.538078) (xy 151.831846 107.538092) (xy 151.831845 107.538091) (xy 151.831813 107.538095) + (xy 151.831638 107.538109) (xy 151.831637 107.538108) (xy 151.831559 107.538116) (xy 151.802374 107.540476) + (xy 151.797596 107.54134) (xy 151.797552 107.541097) (xy 151.7958 107.541437) (xy 151.795815 107.541505) + (xy 151.791058 107.542494) (xy 151.791052 107.542495) (xy 151.79105 107.542496) (xy 151.761096 107.551862) + (xy 151.750353 107.555222) (xy 151.747873 107.555962) (xy 151.725564 107.562302) (xy 151.706566 107.567701) + (xy 151.706563 107.567702) (xy 151.706561 107.567703) (xy 151.70655 107.567707) (xy 151.700449 107.570829) + (xy 151.695958 107.572234) (xy 151.669386 107.586726) (xy 151.668441 107.58721) (xy 151.668443 107.58721) + (xy 151.66829 107.587288) (xy 151.667294 107.587813) (xy 151.667212 107.587854) (xy 151.667139 107.587893) + (xy 151.641407 107.601074) (xy 151.637327 107.603698) (xy 151.637193 107.60349) (xy 151.635646 107.604514) + (xy 151.635683 107.604568) (xy 151.631661 107.607306) (xy 151.598845 107.634714) (xy 151.598846 107.634715) + (xy 151.597817 107.635573) (xy 151.563317 107.662882) (xy 151.561711 107.664769) (xy 151.562283 107.665255) + (xy 151.555242 107.671138) (xy 151.555241 107.671139) (xy 151.537018 107.693729) (xy 151.536855 107.693931) + (xy 151.536843 107.693938) (xy 151.536802 107.693997) (xy 151.536698 107.694126) (xy 151.535048 107.696119) + (xy 151.515879 107.718663) (xy 151.515875 107.718668) (xy 151.515595 107.719116) (xy 151.515527 107.719228) + (xy 151.515526 107.719229) (xy 151.515525 107.719228) (xy 151.510509 107.727269) (xy 151.51018 107.727005) + (xy 151.5092 107.728222) (xy 151.505467 107.735353) (xy 151.503487 107.738528) (xy 151.503482 107.738538) + (xy 151.488355 107.762794) (xy 151.482577 107.76765) (xy 151.475154 107.78472) (xy 151.47514 107.784751) + (xy 151.46099 107.817257) (xy 151.460532 107.818701) (xy 151.452705 107.839422) (xy 151.452703 107.839429) + (xy 151.296385 108.324012) (xy 151.260526 108.373587) (xy 151.202375 108.392618) (xy 151.144145 108.373834) + (xy 151.108076 108.32441) (xy 151.105886 108.316662) (xy 150.730762 106.747956) (xy 150.723743 106.72389) + (xy 150.721551 106.71755) (xy 150.716127 106.703262) (xy 150.660742 106.620372) (xy 150.577852 106.564987) + (xy 150.480076 106.545538) (xy 150.119996 106.545538) (xy 150.10987 106.545872) (xy 150.103118 106.546096) + (xy 150.006842 106.571961) (xy 150.006839 106.571962) (xy 149.927791 106.632699) (xy 149.878003 106.719065) + (xy 149.878 106.719073) (xy 149.875472 106.726536) (xy 149.868603 106.750645) (xy 149.765519 107.193906) + (xy 149.67859 107.567701) (xy 149.678577 107.567755) (xy 149.570052 108.034408) (xy 149.538455 108.086803) + (xy 149.482095 108.11062) (xy 149.4225 108.096761) (xy 149.382433 108.050519) (xy 149.379136 108.041526) + (xy 149.223487 107.543448) (xy 149.214842 107.519911) (xy 149.2005 107.486089) (xy 149.190416 107.469581) + (xy 149.190134 107.468922) (xy 149.190124 107.468897) (xy 149.188978 107.467227) (xy 149.181914 107.455663) + (xy 149.161405 107.422086) (xy 149.161403 107.422083) (xy 149.145381 107.402892) (xy 149.145375 107.402886) + (xy 149.142383 107.399302) (xy 149.133731 107.386689) (xy 149.123615 107.376817) (xy 149.11456 107.365969) + (xy 149.114554 107.365963) (xy 149.106293 107.359298) (xy 149.099307 107.353096) (xy 149.081859 107.336067) + (xy 149.081436 107.335649) (xy 149.08141 107.335628) (xy 149.081407 107.335626) (xy 149.081406 107.335625) + (xy 149.062592 107.323382) (xy 149.054434 107.31746) (xy 149.036969 107.30337) (xy 149.036967 107.303369) + (xy 149.036965 107.303367) (xy 149.033821 107.30172) (xy 149.014795 107.291754) (xy 149.010651 107.289583) + (xy 148.997848 107.281252) (xy 148.984727 107.276003) (xy 148.980252 107.273659) (xy 148.980246 107.273657) + (xy 148.978754 107.272875) (xy 148.972189 107.269437) (xy 148.967325 107.268006) (xy 148.96199 107.266436) + (xy 148.953169 107.263381) (xy 148.938921 107.257682) (xy 148.938922 107.257682) (xy 148.929958 107.254096) + (xy 148.929953 107.254094) (xy 148.92995 107.254093) (xy 148.929944 107.254091) (xy 148.907901 107.249985) + (xy 148.898092 107.247635) (xy 148.876556 107.241299) (xy 148.851624 107.239054) (xy 148.851624 107.239053) + (xy 148.846952 107.238632) (xy 148.831947 107.235837) (xy 148.817814 107.236008) (xy 148.812784 107.235556) + (xy 148.812777 107.235556) (xy 148.803723 107.234741) (xy 148.803714 107.234741) (xy 148.793168 107.235869) + (xy 148.783856 107.236423) (xy 148.758818 107.236729) (xy 148.758814 107.236729) (xy 148.736875 107.24137) + (xy 148.736876 107.241371) (xy 148.73193 107.242417) (xy 148.704611 107.24534) (xy 148.695394 107.24822) + (xy 148.695958 107.25003) (xy 148.692363 107.250792) (xy 148.671676 107.255169) (xy 148.671675 107.255169) + (xy 148.6613 107.257365) (xy 148.652927 107.260953) (xy 148.652926 107.260952) (xy 148.648284 107.262941) + (xy 148.634807 107.267154) (xy 148.62141 107.274459) (xy 148.617115 107.2763) (xy 148.6171 107.276308) + (xy 148.594082 107.286172) (xy 148.575585 107.298861) (xy 148.571412 107.301722) (xy 148.547289 107.314878) + (xy 148.539876 107.321066) (xy 148.54109 107.322521) (xy 148.520643 107.336547) (xy 148.520638 107.336552) + (xy 148.511877 107.342561) (xy 148.505528 107.349068) (xy 148.501999 107.352684) (xy 148.491149 107.361742) + (xy 148.481559 107.373627) (xy 148.47829 107.376977) (xy 148.478288 107.376977) (xy 148.460796 107.394904) + (xy 148.431327 107.435668) (xy 148.429811 107.437766) (xy 148.428558 107.439321) (xy 148.428216 107.439971) + (xy 148.425976 107.443071) (xy 148.416875 107.455661) (xy 148.416874 107.455663) (xy 148.399971 107.488234) + (xy 148.399951 107.488276) (xy 148.389515 107.511057) (xy 148.337634 107.64076) (xy 148.076324 108.294037) + (xy 148.075994 108.294861) (xy 148.036828 108.341867) (xy 147.984075 108.357093) (xy 147.526372 108.357093) + (xy 147.517427 108.357532) (xy 147.501319 108.358323) (xy 147.46477 108.361923) (xy 147.392038 108.380142) + (xy 147.392031 108.380144) (xy 147.32448 108.408124) (xy 147.241591 108.463508) (xy 147.18988 108.515219) + (xy 147.134496 108.598108) (xy 147.106515 108.665661) (xy 147.106515 108.665663) (xy 147.087066 108.763436) + (xy 144.423546 108.763436) (xy 144.54217 108.644812) (xy 144.588314 108.564888) (xy 144.589011 108.562288) + (xy 144.6122 108.475744) (xy 144.6122 105.477256) (xy 144.588314 105.388112) (xy 144.566021 105.3495) + (xy 144.542169 105.308187) (xy 144.326696 105.092714) (xy 144.106434 104.872451) (xy 144.078657 104.817935) + (xy 144.088228 104.757503) (xy 144.121438 104.720132) (xy 144.180597 104.680604) (xy 144.180597 104.680603) + (xy 144.180601 104.680601) (xy 144.235966 104.59774) (xy 144.2505 104.524674) (xy 144.2505 103.725326) + (xy 144.235966 103.65226) (xy 144.180601 103.569399) (xy 144.180599 103.569397) (xy 144.097742 103.514035) + (xy 144.09774 103.514034) (xy 144.097737 103.514033) (xy 144.097736 103.514033) (xy 144.024684 103.499501) + (xy 144.024674 103.4995) (xy 142.975326 103.4995) (xy 142.975325 103.4995) (xy 142.975315 103.499501) + (xy 142.902263 103.514033) (xy 142.902257 103.514035) (xy 142.8194 103.569397) (xy 142.819397 103.5694) + (xy 142.764035 103.652257) (xy 142.764033 103.652263) (xy 142.749501 103.725315) (xy 142.7495 103.725327) + (xy 142.7495 104.524672) (xy 142.749501 104.524684) (xy 142.764033 104.597736) (xy 142.764035 104.597742) + (xy 142.819397 104.680599) (xy 142.819399 104.680601) (xy 142.90226 104.735966) (xy 142.956278 104.746711) + (xy 142.975315 104.750498) (xy 142.97532 104.750498) (xy 142.975326 104.7505) (xy 143.058169 104.7505) + (xy 143.11636 104.769407) (xy 143.152324 104.818907) (xy 143.153794 104.823869) (xy 143.160413 104.848573) + (xy 143.164276 104.862987) (xy 143.164275 104.862987) (xy 143.173385 104.896985) (xy 143.173386 104.896988) + (xy 143.21953 104.976912) (xy 143.882205 105.639587) (xy 143.909981 105.694102) (xy 143.9112 105.709589) + (xy 143.9112 106.7941) (xy 143.892293 106.852291) (xy 143.842793 106.888255) (xy 143.781607 106.888255) + (xy 143.742198 106.864105) (xy 139.950513 103.07242) (xy 139.95051 103.072418) (xy 139.950508 103.072416) + (xy 139.859191 103.019694) (xy 139.859193 103.019694) (xy 139.81967 103.009104) (xy 139.757327 102.9924) + (xy 139.757325 102.9924) (xy 136.787301 102.9924) (xy 136.72911 102.973493) (xy 136.717297 102.963404) + (xy 136.369481 102.615588) (xy 135.833413 102.07952) (xy 135.83341 102.079518) (xy 135.833409 102.079517) + (xy 135.833408 102.079516) (xy 135.742091 102.026794) (xy 135.742093 102.026794) (xy 135.70257 102.016204) + (xy 135.640227 101.9995) (xy 135.640225 101.9995) (xy 135.315685 101.9995) (xy 135.257494 101.980593) + (xy 135.245687 101.970509) (xy 135.172102 101.896924) (xy 135.056518 101.840418) (xy 134.981582 101.8295) + (xy 134.981579 101.8295) (xy 134.846899 101.8295) (xy 134.788708 101.810593) (xy 134.776895 101.800503) + (xy 134.560955 101.584563) (xy 134.336413 101.36002) (xy 134.336408 101.360016) (xy 134.245091 101.307294) + (xy 134.245093 101.307294) (xy 134.195525 101.294013) (xy 134.143227 101.28) (xy 120.560927 101.28) + (xy 120.455473 101.28) (xy 120.403175 101.294013) (xy 120.353607 101.307294) (xy 120.262291 101.360016) + (xy 112.351703 109.270604) (xy 112.297186 109.298381) (xy 112.281699 109.2996) (xy 107.942113 109.2996) + (xy 107.883922 109.280693) (xy 107.847958 109.231193) (xy 107.846486 109.174978) (xy 107.8728 109.076775) + (xy 107.8728 108.931825) (xy 107.855684 108.867948) (xy 107.853873 108.861189) (xy 107.8505 108.835566) + (xy 107.8505 107.224499) (xy 107.869407 107.166308) (xy 107.918907 107.130344) (xy 107.9495 107.125499) + (xy 108.271943 107.125499) (xy 108.271948 107.125499) (xy 108.319542 107.118565) (xy 108.342504 107.115221) + (xy 108.342505 107.11522) (xy 108.342509 107.11522) (xy 108.342511 107.115218) (xy 108.342514 107.115218) + (xy 108.451343 107.062014) (xy 108.451343 107.062013) (xy 108.451347 107.062012) (xy 108.537012 106.976347) + (xy 108.59022 106.867509) (xy 108.6005 106.796949) (xy 108.600499 106.605963) (xy 109.6495 106.605963) + (xy 109.6495 108.294031) (xy 109.649501 108.294037) (xy 109.664826 108.410455) (xy 109.664827 108.410457) + (xy 109.678265 108.442899) (xy 109.724829 108.555317) (xy 109.72483 108.555319) (xy 109.724831 108.55532) + (xy 109.820284 108.679716) (xy 109.94468 108.775169) (xy 109.944681 108.775169) (xy 109.944682 108.77517) + (xy 110.024349 108.808169) (xy 110.089543 108.835173) (xy 110.205965 108.8505) (xy 111.894034 108.850499) + (xy 112.010457 108.835173) (xy 112.15532 108.775169) (xy 112.279716 108.679716) (xy 112.375169 108.55532) + (xy 112.435173 108.410457) (xy 112.4505 108.294035) (xy 112.450499 106.605966) (xy 112.435173 106.489543) + (xy 112.375169 106.34468) (xy 112.279716 106.220284) (xy 112.15532 106.124831) (xy 112.155319 106.12483) + (xy 112.155317 106.124829) (xy 112.010461 106.064828) (xy 112.010453 106.064826) (xy 111.894035 106.0495) + (xy 110.205968 106.0495) (xy 110.205962 106.049501) (xy 110.089544 106.064826) (xy 110.089543 106.064827) + (xy 109.944682 106.124829) (xy 109.820286 106.220282) (xy 109.820282 106.220286) (xy 109.724829 106.344682) + (xy 109.664828 106.489538) (xy 109.664826 106.489546) (xy 109.6495 106.605963) (xy 108.600499 106.605963) + (xy 108.600499 106.489546) (xy 108.600499 106.203056) (xy 108.600498 106.203051) (xy 108.594062 106.158864) + (xy 108.590221 106.132495) (xy 108.590218 106.132485) (xy 108.537014 106.023656) (xy 108.537012 106.023654) + (xy 108.537012 106.023653) (xy 108.451347 105.937988) (xy 108.342509 105.88478) (xy 108.271949 105.8745) + (xy 108.271945 105.8745) (xy 106.728056 105.8745) (xy 106.728048 105.874501) (xy 106.657495 105.884778) + (xy 106.657485 105.884781) (xy 106.548656 105.937985) (xy 106.548651 105.937989) (xy 106.46764 106.019) + (xy 106.413123 106.046777) (xy 106.352691 106.037205) (xy 106.309427 105.993941) (xy 106.303483 105.979589) + (xy 106.297899 105.962404) (xy 106.297896 105.962399) (xy 106.297895 105.962394) (xy 106.197815 105.765978) + (xy 106.068242 105.587635) (xy 105.912365 105.431758) (xy 105.734022 105.302185) (xy 105.734021 105.302184) + (xy 105.734019 105.302183) (xy 105.644825 105.256736) (xy 105.537606 105.202105) (xy 105.537602 105.202104) + (xy 105.537599 105.202102) (xy 105.327948 105.133984) (xy 105.110225 105.0995) (xy 105.110222 105.0995) + (xy 104.889778 105.0995) (xy 104.889775 105.0995) (xy 104.672051 105.133984) (xy 104.4624 105.202102) + (xy 104.26598 105.302183) (xy 104.200854 105.3495) (xy 104.087635 105.431758) (xy 103.931758 105.587635) + (xy 103.876652 105.663482) (xy 103.802183 105.76598) (xy 103.74689 105.8745) (xy 103.702105 105.962394) + (xy 103.702103 105.962397) (xy 103.702101 105.962403) (xy 103.696515 105.979593) (xy 103.660549 106.029092) + (xy 103.602357 106.047996) (xy 103.544167 106.029086) (xy 103.532364 106.019005) (xy 103.451347 105.937988) + (xy 103.342509 105.88478) (xy 103.271949 105.8745) (xy 103.271945 105.8745) (xy 101.728056 105.8745) + (xy 101.728048 105.874501) (xy 101.657495 105.884778) (xy 101.657485 105.884781) (xy 101.548656 105.937985) + (xy 101.462987 106.023654) (xy 101.44269 106.065173) (xy 101.40978 106.132491) (xy 101.399501 106.203048) + (xy 101.3995 106.203054) (xy 101.3995 106.796943) (xy 101.399501 106.796951) (xy 101.409778 106.867504) + (xy 101.409781 106.867514) (xy 101.462985 106.976343) (xy 101.462987 106.976345) (xy 101.462988 106.976347) + (xy 101.548653 107.062012) (xy 101.657491 107.11522) (xy 101.728051 107.1255) (xy 102.0005 107.125499) + (xy 102.05869 107.144406) (xy 102.094654 107.193906) (xy 102.0995 107.224499) (xy 102.0995 107.375373) + (xy 102.0995 107.480827) (xy 102.117094 107.546489) (xy 102.126794 107.582692) (xy 102.179516 107.674008) + (xy 102.179518 107.67401) (xy 102.17952 107.674013) (xy 103.956487 109.45098) (xy 103.956489 109.450981) + (xy 103.956491 109.450983) (xy 104.047808 109.503705) (xy 104.047806 109.503705) (xy 104.04781 109.503706) + (xy 104.047812 109.503707) (xy 104.149673 109.531) (xy 105.828499 109.531) (xy 105.836096 109.533468) + (xy 105.843986 109.532219) (xy 105.864641 109.542743) (xy 105.88669 109.549907) (xy 105.898503 109.559996) + (xy 106.025504 109.686997) (xy 106.053281 109.741514) (xy 106.0545 109.757001) (xy 106.0545 109.772575) + (xy 106.057241 109.782805) (xy 106.081912 109.874877) (xy 106.078709 109.935978) (xy 106.040204 109.983528) + (xy 105.986285 109.9995) (xy 105.821258 109.9995) (xy 105.75216 110.009567) (xy 105.645573 110.061674) + (xy 105.639708 110.067539) (xy 105.58519 110.095314) (xy 105.524758 110.08574) (xy 105.499704 110.067536) + (xy 105.460323 110.028156) (xy 105.460321 110.028154) (xy 105.329177 109.940541) (xy 105.234321 109.901269) + (xy 105.183457 109.88021) (xy 105.156613 109.874877) (xy 105.028764 109.849478) (xy 105.028763 109.849478) + (xy 104.989333 109.849489) (xy 104.949903 109.8495) (xy 103.850097 109.8495) (xy 103.771238 109.849478) + (xy 103.771232 109.849478) (xy 103.616547 109.880209) (xy 103.616543 109.88021) (xy 103.470822 109.940541) + (xy 103.339681 110.028152) (xy 103.228152 110.139681) (xy 103.140541 110.270822) (xy 103.08021 110.416543) + (xy 103.080209 110.416547) (xy 103.049478 110.571232) (xy 103.049478 110.571238) (xy 103.0495 110.649501) + (xy 103.0495 111.349903) (xy 103.049478 111.428761) (xy 103.049478 111.428767) (xy 103.079383 111.579293) + (xy 103.08021 111.583457) (xy 103.095793 111.621095) (xy 103.140541 111.729177) (xy 103.224216 111.854426) + (xy 103.228155 111.860322) (xy 103.339678 111.971845) (xy 103.470822 112.059458) (xy 103.616543 112.11979) + (xy 103.771237 112.150522) (xy 103.850075 112.1505) (xy 103.850097 112.1505) (xy 104.949903 112.1505) + (xy 104.949925 112.1505) (xy 105.028763 112.150522) (xy 105.183457 112.11979) (xy 105.329178 112.059458) + (xy 105.460322 111.971845) (xy 105.499705 111.932461) (xy 105.55422 111.904686) (xy 105.614652 111.914257) + (xy 105.639707 111.93246) (xy 105.645571 111.938324) (xy 105.75216 111.990433) (xy 105.821258 112.0005) + (xy 105.821261 112.0005) (xy 106.378738 112.0005) (xy 106.378742 112.0005) (xy 106.44784 111.990433) + (xy 106.554429 111.938324) (xy 106.638324 111.854429) (xy 106.690433 111.74784) (xy 106.7005 111.678742) + (xy 106.7005 111.4495) (xy 106.719407 111.391309) (xy 106.768907 111.355345) (xy 106.7995 111.3505) + (xy 107.0743 111.3505) (xy 107.132491 111.369407) (xy 107.168455 111.418907) (xy 107.1733 111.4495) + (xy 107.1733 111.525475) (xy 107.190997 111.591519) (xy 107.210817 111.665489) (xy 107.283287 111.79101) + (xy 107.283289 111.791012) (xy 107.283291 111.791015) (xy 107.385785 111.893509) (xy 107.385787 111.89351) + (xy 107.385789 111.893512) (xy 107.511311 111.965982) (xy 107.511312 111.965982) (xy 107.511315 111.965984) + (xy 107.651325 112.0035) (xy 107.651326 112.0035) (xy 107.796274 112.0035) (xy 107.796275 112.0035) + (xy 107.936285 111.965984) (xy 107.936287 111.965982) (xy 107.936289 111.965982) (xy 108.06181 111.893512) + (xy 108.06181 111.893511) (xy 108.061815 111.893509) (xy 108.164309 111.791015) (xy 108.17205 111.777608) + (xy 108.236782 111.665489) (xy 108.236782 111.665487) (xy 108.236784 111.665485) (xy 108.2743 111.525475) + (xy 108.2743 111.380525) (xy 108.236784 111.240515) (xy 108.236782 111.240512) (xy 108.236782 111.24051) + (xy 108.164312 111.114989) (xy 108.16431 111.114987) (xy 108.164309 111.114985) (xy 108.061815 111.012491) + (xy 108.061812 111.012489) (xy 108.06181 111.012487) (xy 107.936288 110.940017) (xy 107.936289 110.940017) + (xy 107.895207 110.929009) (xy 107.796275 110.9025) (xy 107.796274 110.9025) (xy 107.70999 110.9025) + (xy 107.651799 110.883593) (xy 107.639987 110.873504) (xy 107.486014 110.719532) (xy 107.486012 110.71953) + (xy 107.406088 110.673386) (xy 107.316944 110.6495) (xy 107.316942 110.6495) (xy 106.7995 110.6495) + (xy 106.741309 110.630593) (xy 106.705345 110.581093) (xy 106.7005 110.5505) (xy 106.7005 110.320395) + (xy 106.719407 110.262204) (xy 106.768907 110.22624) (xy 106.773857 110.224773) (xy 106.817485 110.213084) + (xy 106.817487 110.213082) (xy 106.817489 110.213082) (xy 106.94301 110.140612) (xy 106.94301 110.140611) + (xy 106.943015 110.140609) (xy 106.954029 110.129594) (xy 107.008544 110.101819) (xy 107.024031 110.1006) + (xy 112.541325 110.1006) (xy 112.541327 110.1006) (xy 112.643188 110.073307) (xy 112.64319 110.073305) + (xy 112.643192 110.073305) (xy 112.734508 110.020583) (xy 112.734508 110.020582) (xy 112.734513 110.02058) + (xy 120.645097 102.109996) (xy 120.699614 102.082219) (xy 120.715101 102.081) (xy 123.470852 102.081) + (xy 123.529043 102.099907) (xy 123.565007 102.149407) (xy 123.566478 102.205624) (xy 123.5627 102.219722) + (xy 123.5627 102.364674) (xy 123.600216 102.504686) (xy 123.664246 102.615588) (xy 123.676967 102.675436) + (xy 123.65208 102.731332) (xy 123.648513 102.735092) (xy 121.613101 104.770504) (xy 121.558584 104.798281) + (xy 121.543098 104.7995) (xy 121.453057 104.7995) (xy 121.453048 104.799501) (xy 121.382495 104.809778) + (xy 121.382485 104.809781) (xy 121.273656 104.862985) (xy 121.187987 104.948654) (xy 121.157809 105.010385) + (xy 121.13478 105.057491) (xy 121.129649 105.092714) (xy 121.1245 105.128054) (xy 121.1245 105.571943) + (xy 121.124501 105.571951) (xy 121.134778 105.642504) (xy 121.134781 105.642514) (xy 121.18944 105.754318) + (xy 121.1995 105.797799) (xy 121.1995 110.893099) (xy 121.180593 110.95129) (xy 121.170504 110.963103) + (xy 119.013102 113.120504) (xy 118.958585 113.148281) (xy 118.943098 113.1495) (xy 117.305968 113.1495) + (xy 117.30596 113.149501) (xy 117.19452 113.164171) (xy 117.13436 113.15302) (xy 117.092243 113.108637) + (xy 117.0826 113.066018) (xy 117.0826 109.124799) (xy 117.101507 109.066608) (xy 117.111585 109.054807) + (xy 117.286898 108.879493) (xy 117.341413 108.851718) (xy 117.3569 108.850499) (xy 118.994032 108.850499) + (xy 118.994034 108.850499) (xy 119.110457 108.835173) (xy 119.25532 108.775169) (xy 119.379716 108.679716) + (xy 119.475169 108.55532) (xy 119.535173 108.410457) (xy 119.5505 108.294035) (xy 119.550499 106.605966) + (xy 119.535173 106.489543) (xy 119.475169 106.34468) (xy 119.379716 106.220284) (xy 119.379711 106.22028) + (xy 119.37971 106.220279) (xy 119.365386 106.209288) (xy 119.33073 106.158864) (xy 119.332331 106.097699) + (xy 119.355647 106.060744) (xy 121.586896 103.829494) (xy 121.641413 103.801718) (xy 121.6569 103.800499) + (xy 121.746943 103.800499) (xy 121.746948 103.800499) (xy 121.79568 103.7934) (xy 121.817504 103.790221) + (xy 121.817505 103.79022) (xy 121.817509 103.79022) (xy 121.817511 103.790218) (xy 121.817514 103.790218) + (xy 121.926343 103.737014) (xy 121.926343 103.737013) (xy 121.926347 103.737012) (xy 122.012012 103.651347) + (xy 122.06522 103.542509) (xy 122.0755 103.471949) (xy 122.075499 103.028052) (xy 122.067115 102.9705) + (xy 122.065221 102.957495) (xy 122.065218 102.957485) (xy 122.012014 102.848656) (xy 122.012012 102.848654) + (xy 122.012012 102.848653) (xy 121.926347 102.762988) (xy 121.817509 102.70978) (xy 121.746949 102.6995) + (xy 121.746945 102.6995) (xy 121.453056 102.6995) (xy 121.453048 102.699501) (xy 121.382495 102.709778) + (xy 121.382485 102.709781) (xy 121.273656 102.762985) (xy 121.187987 102.848654) (xy 121.182895 102.85907) + (xy 121.13478 102.957491) (xy 121.124501 103.028048) (xy 121.1245 103.028054) (xy 121.1245 103.118098) + (xy 121.105593 103.176289) (xy 121.095504 103.188102) (xy 118.263101 106.020504) (xy 118.208584 106.048281) + (xy 118.193097 106.0495) (xy 117.305968 106.0495) (xy 117.305962 106.049501) (xy 117.189544 106.064826) + (xy 117.189543 106.064827) (xy 117.044682 106.124829) (xy 116.920286 106.220282) (xy 116.920282 106.220286) + (xy 116.824829 106.344682) (xy 116.764828 106.489538) (xy 116.764826 106.489546) (xy 116.7495 106.605963) + (xy 116.7495 108.243099) (xy 116.730593 108.30129) (xy 116.720504 108.313102) (xy 116.36162 108.671986) + (xy 116.361616 108.671991) (xy 116.308894 108.763307) (xy 116.303272 108.784291) (xy 116.285742 108.849713) + (xy 116.2816 108.865173) (xy 116.2816 115.630373) (xy 116.2816 115.735827) (xy 116.300452 115.806185) + (xy 116.308894 115.837692) (xy 116.361616 115.929008) (xy 116.361618 115.92901) (xy 116.36162 115.929013) + (xy 118.353087 117.92048) (xy 118.353089 117.920481) (xy 118.353091 117.920483) (xy 118.444408 117.973205) + (xy 118.444406 117.973205) (xy 118.44441 117.973206) (xy 118.444412 117.973207) (xy 118.546273 118.0005) + (xy 121.5931 118.0005) (xy 121.651291 118.019407) (xy 121.663103 118.029496) (xy 121.704503 118.070895) + (xy 121.711658 118.07805) (xy 121.824696 118.135646) (xy 121.918481 118.1505) (xy 123.156518 118.150499) + (xy 123.156521 118.150499) (xy 123.156522 118.150498) (xy 123.217135 118.140899) (xy 123.250299 118.135647) + (xy 123.250299 118.135646) (xy 123.250304 118.135646) (xy 123.363342 118.07805) (xy 123.370498 118.070893) + (xy 123.425013 118.043118) (xy 123.485445 118.052689) (xy 123.52871 118.095954) (xy 123.5395 118.140899) + (xy 123.5395 119.044315) (xy 123.520593 119.102506) (xy 123.510509 119.114312) (xy 123.436924 119.187898) + (xy 123.436923 119.187899) (xy 123.380418 119.303482) (xy 123.3695 119.378418) (xy 123.3695 119.821582) + (xy 123.380418 119.896518) (xy 123.436924 120.012102) (xy 123.527898 120.103076) (xy 123.643482 120.159582) + (xy 123.676101 120.164334) (xy 123.730957 120.191434) (xy 123.759409 120.245602) (xy 123.750587 120.306148) + (xy 123.707862 120.349946) (xy 123.661827 120.3613) (xy 112.897989 120.3613) (xy 112.839798 120.342393) + (xy 112.827985 120.332304) (xy 108.565656 116.069974) (xy 108.537879 116.015457) (xy 108.546718 115.956492) + (xy 108.59022 115.867509) (xy 108.6005 115.796949) (xy 108.600499 115.203052) (xy 108.592465 115.147899) + (xy 108.590221 115.132495) (xy 108.590218 115.132485) (xy 108.537014 115.023656) (xy 108.537012 115.023654) + (xy 108.537012 115.023653) (xy 108.451347 114.937988) (xy 108.342509 114.88478) (xy 108.271949 114.8745) + (xy 108.271945 114.8745) (xy 106.728056 114.8745) (xy 106.728048 114.874501) (xy 106.657495 114.884778) + (xy 106.657485 114.884781) (xy 106.548656 114.937985) (xy 106.548651 114.937989) (xy 106.46764 115.019) + (xy 106.413123 115.046777) (xy 106.352691 115.037205) (xy 106.309427 114.993941) (xy 106.303483 114.979589) + (xy 106.297899 114.962404) (xy 106.297896 114.962399) (xy 106.297895 114.962394) (xy 106.197815 114.765978) + (xy 106.068242 114.587635) (xy 105.912365 114.431758) (xy 105.734022 114.302185) (xy 105.734021 114.302184) + (xy 105.734019 114.302183) (xy 105.618582 114.243365) (xy 105.537606 114.202105) (xy 105.537602 114.202104) + (xy 105.537599 114.202102) (xy 105.327948 114.133984) (xy 105.110225 114.0995) (xy 105.110222 114.0995) + (xy 104.889778 114.0995) (xy 104.889775 114.0995) (xy 104.672051 114.133984) (xy 104.4624 114.202102) + (xy 104.26598 114.302183) (xy 104.207221 114.344874) (xy 104.087635 114.431758) (xy 103.931758 114.587635) + (xy 103.904062 114.625756) (xy 103.802183 114.76598) (xy 103.74689 114.8745) (xy 103.702105 114.962394) + (xy 103.702103 114.962397) (xy 103.702101 114.962403) (xy 103.696515 114.979593) (xy 103.660549 115.029092) + (xy 103.602357 115.047996) (xy 103.544167 115.029086) (xy 103.532364 115.019005) (xy 103.451347 114.937988) + (xy 103.342509 114.88478) (xy 103.271949 114.8745) (xy 103.271946 114.8745) (xy 102.9995 114.8745) + (xy 102.941309 114.855593) (xy 102.905345 114.806093) (xy 102.9005 114.7755) (xy 102.9005 114.308701) + (xy 102.919407 114.25051) (xy 102.929496 114.238697) (xy 103.255697 113.912496) (xy 103.310214 113.884719) + (xy 103.325701 113.8835) (xy 103.341274 113.8835) (xy 103.341275 113.8835) (xy 103.481285 113.845984) + (xy 103.481287 113.845982) (xy 103.481289 113.845982) (xy 103.60681 113.773512) (xy 103.60681 113.773511) + (xy 103.606815 113.773509) (xy 103.674361 113.705963) (xy 109.6495 113.705963) (xy 109.6495 115.394031) + (xy 109.649501 115.394037) (xy 109.664826 115.510455) (xy 109.664827 115.510457) (xy 109.667412 115.516698) + (xy 109.724829 115.655317) (xy 109.72483 115.655319) (xy 109.724831 115.65532) (xy 109.820284 115.779716) + (xy 109.94468 115.875169) (xy 109.944681 115.875169) (xy 109.944682 115.87517) (xy 110.0491 115.918421) + (xy 110.089543 115.935173) (xy 110.205965 115.9505) (xy 111.894034 115.950499) (xy 112.010457 115.935173) + (xy 112.15532 115.875169) (xy 112.279716 115.779716) (xy 112.375169 115.65532) (xy 112.435173 115.510457) + (xy 112.4505 115.394035) (xy 112.450499 113.705966) (xy 112.435173 113.589543) (xy 112.375169 113.44468) + (xy 112.279716 113.320284) (xy 112.15532 113.224831) (xy 112.155319 113.22483) (xy 112.155317 113.224829) + (xy 112.010461 113.164828) (xy 112.010453 113.164826) (xy 111.894035 113.1495) (xy 110.205968 113.1495) + (xy 110.205962 113.149501) (xy 110.089544 113.164826) (xy 110.089543 113.164827) (xy 109.944682 113.224829) + (xy 109.820286 113.320282) (xy 109.820282 113.320286) (xy 109.724829 113.444682) (xy 109.664828 113.589538) + (xy 109.664826 113.589546) (xy 109.6495 113.705963) (xy 103.674361 113.705963) (xy 103.709309 113.671015) + (xy 103.781784 113.545485) (xy 103.8193 113.405475) (xy 103.8193 113.260525) (xy 103.781784 113.120515) + (xy 103.781782 113.120512) (xy 103.781782 113.12051) (xy 103.709312 112.994989) (xy 103.70931 112.994987) + (xy 103.709309 112.994985) (xy 103.606815 112.892491) (xy 103.606812 112.892489) (xy 103.60681 112.892487) + (xy 103.481288 112.820017) (xy 103.481289 112.820017) (xy 103.451696 112.812087) (xy 103.341275 112.7825) + (xy 103.196325 112.7825) (xy 103.172463 112.788894) (xy 103.05631 112.820017) (xy 102.930789 112.892487) + (xy 102.828287 112.994989) (xy 102.755817 113.12051) (xy 102.7183 113.260525) (xy 102.7183 113.276099) + (xy 102.699393 113.33429) (xy 102.689304 113.346103) (xy 102.179516 113.855891) (xy 102.126793 113.947211) + (xy 102.126792 113.947211) (xy 102.126793 113.947212) (xy 102.0995 114.049073) (xy 102.0995 114.7755) + (xy 102.080593 114.833691) (xy 102.031093 114.869655) (xy 102.0005 114.8745) (xy 101.728056 114.8745) + (xy 101.728048 114.874501) (xy 101.657495 114.884778) (xy 101.657485 114.884781) (xy 101.548656 114.937985) + (xy 101.462987 115.023654) (xy 101.436977 115.076858) (xy 101.40978 115.132491) (xy 101.399501 115.203048) + (xy 101.3995 115.203054) (xy 101.3995 115.796943) (xy 101.399501 115.796951) (xy 101.409778 115.867504) + (xy 101.409781 115.867514) (xy 101.462985 115.976343) (xy 101.462987 115.976345) (xy 101.462988 115.976347) + (xy 101.548653 116.062012) (xy 101.657491 116.11522) (xy 101.728051 116.1255) (xy 103.271948 116.125499) + (xy 103.319542 116.118565) (xy 103.342504 116.115221) (xy 103.342505 116.11522) (xy 103.342509 116.11522) + (xy 103.342511 116.115218) (xy 103.342514 116.115218) (xy 103.451343 116.062014) (xy 103.451343 116.062013) + (xy 103.451347 116.062012) (xy 103.53236 115.980998) (xy 103.586874 115.953222) (xy 103.647307 115.962793) + (xy 103.690571 116.006057) (xy 103.696516 116.020407) (xy 103.699796 116.0305) (xy 103.702105 116.037606) + (xy 103.74689 116.1255) (xy 103.799074 116.227918) (xy 103.802185 116.234022) (xy 103.931758 116.412365) + (xy 104.087635 116.568242) (xy 104.265978 116.697815) (xy 104.462394 116.797895) (xy 104.672049 116.866015) + (xy 104.75914 116.879809) (xy 104.889775 116.9005) (xy 104.889778 116.9005) (xy 105.110225 116.9005) + (xy 105.219086 116.883257) (xy 105.327951 116.866015) (xy 105.537606 116.797895) (xy 105.734022 116.697815) + (xy 105.912365 116.568242) (xy 106.068242 116.412365) (xy 106.197815 116.234022) (xy 106.297895 116.037606) + (xy 106.303482 116.020411) (xy 106.339446 115.970911) (xy 106.397636 115.952003) (xy 106.455827 115.97091) + (xy 106.467634 115.980993) (xy 106.548653 116.062012) (xy 106.657491 116.11522) (xy 106.728051 116.1255) + (xy 107.588809 116.125499) (xy 107.647 116.144406) (xy 107.658813 116.154495) (xy 112.431331 120.927012) + (xy 112.43133 120.927012) (xy 112.496587 120.992268) (xy 112.496589 120.99227) (xy 112.545502 121.02051) + (xy 112.576512 121.038414) (xy 112.665656 121.0623) (xy 112.665658 121.0623) (xy 124.756042 121.0623) + (xy 124.756044 121.0623) (xy 124.845188 121.038414) (xy 124.925112 120.99227) (xy 129.329069 116.588312) + (xy 129.375214 116.508388) (xy 129.381186 116.4861) (xy 129.381865 116.483568) (xy 129.388257 116.45971) + (xy 129.3991 116.419244) (xy 129.3991 110.817088) (xy 129.418007 110.758897) (xy 129.42809 110.74709) + (xy 130.416987 109.758192) (xy 130.443774 109.744544) (xy 130.470319 109.730611) (xy 130.470942 109.730702) + (xy 130.471504 109.730416) (xy 130.50118 109.735116) (xy 130.530863 109.739449) (xy 130.531313 109.739888) + (xy 130.531936 109.739987) (xy 130.553194 109.761245) (xy 130.574649 109.782186) (xy 130.574754 109.782805) + (xy 130.575201 109.783252) (xy 130.584953 109.842497) (xy 130.584505 109.845566) (xy 130.55739 109.900415) + (xy 130.556547 109.901269) (xy 130.246332 110.211485) (xy 130.24633 110.211487) (xy 130.24633 110.211488) + (xy 130.200186 110.291412) (xy 130.176742 110.378909) (xy 130.1763 110.380557) (xy 130.1763 120.3455) + (xy 130.157393 120.403691) (xy 130.107893 120.439655) (xy 130.0773 120.4445) (xy 130.049725 120.4445) + (xy 129.98799 120.461041) (xy 129.90971 120.482017) (xy 129.784189 120.554487) (xy 129.681687 120.656989) + (xy 129.609217 120.78251) (xy 129.5717 120.922525) (xy 129.5717 121.067474) (xy 129.609217 121.207489) + (xy 129.681687 121.33301) (xy 129.681689 121.333012) (xy 129.681691 121.333015) (xy 129.784185 121.435509) + (xy 129.784187 121.43551) (xy 129.784189 121.435512) (xy 129.909711 121.507982) (xy 129.909712 121.507982) + (xy 129.909715 121.507984) (xy 129.909717 121.507984) (xy 129.912252 121.509035) (xy 129.91375 121.510314) + (xy 129.915334 121.511229) (xy 129.915164 121.511522) (xy 129.958779 121.54877) (xy 129.973064 121.608264) + (xy 129.949651 121.664793) (xy 129.897483 121.696764) (xy 129.874369 121.6995) (xy 102.00355 121.6995) + (xy 101.996485 121.699248) (xy 101.917222 121.693577) (xy 101.765201 121.6827) (xy 101.751222 121.68069) + (xy 101.716895 121.673222) (xy 101.528126 121.632154) (xy 101.514574 121.628175) (xy 101.300644 121.548381) + (xy 101.287796 121.542513) (xy 101.22049 121.505761) (xy 101.087402 121.433087) (xy 101.075527 121.425456) + (xy 100.892749 121.288629) (xy 100.882074 121.27938) (xy 100.720619 121.117925) (xy 100.71137 121.10725) + (xy 100.659839 121.038413) (xy 100.574541 120.924468) (xy 100.566914 120.912601) (xy 100.457484 120.7122) + (xy 100.451618 120.699355) (xy 100.446508 120.685656) (xy 100.371824 120.485425) (xy 100.367845 120.471873) + (xy 100.355567 120.415437) (xy 100.319307 120.248765) (xy 100.317299 120.234808) (xy 100.300752 120.003514) + (xy 100.3005 119.99645) (xy 100.3005 112.342523) (xy 100.319407 112.284332) (xy 100.367351 112.248889) + (xy 100.524195 112.195045) (xy 100.713744 112.092466) (xy 100.883823 111.960088) (xy 101.029794 111.801521) + (xy 101.147675 111.621091) (xy 101.234251 111.423719) (xy 101.287159 111.214789) (xy 101.304957 111) + (xy 101.287159 110.785211) (xy 101.234251 110.576281) (xy 101.147675 110.378909) (xy 101.143596 110.372665) + (xy 101.029797 110.198483) (xy 101.029795 110.198481) (xy 101.029794 110.198479) (xy 100.883823 110.039912) + (xy 100.831902 109.9995) (xy 100.713747 109.907536) (xy 100.713744 109.907534) (xy 100.524199 109.804957) + (xy 100.524198 109.804956) (xy 100.524195 109.804955) (xy 100.396873 109.761245) (xy 100.367354 109.751111) + (xy 100.318456 109.714333) (xy 100.3005 109.657475) (xy 100.3005 102.003549) (xy 100.300752 101.996485) + (xy 100.307875 101.896923) (xy 100.317299 101.765189) (xy 100.319306 101.751236) (xy 100.367846 101.528121) + (xy 100.371824 101.514574) (xy 100.383784 101.482509) (xy 100.451621 101.300635) (xy 100.457481 101.287805) + (xy 100.566918 101.087391) (xy 100.574536 101.075537) (xy 100.711377 100.89274) (xy 100.720612 100.882081) + (xy 100.882081 100.720612) (xy 100.89274 100.711377) (xy 101.075537 100.574536) (xy 101.087391 100.566918) + (xy 101.287805 100.457481) (xy 101.300635 100.451621) (xy 101.514577 100.371822) (xy 101.528121 100.367846) + (xy 101.751236 100.319306) (xy 101.765189 100.317299) (xy 101.976514 100.30218) (xy 101.996486 100.300752) + (xy 102.00355 100.3005) (xy 155.706767 100.3005) + ) + ) + (filled_polygon + (layer "F.Cu") + (pts + (xy 134.344945 102.806975) (xy 134.37 102.825178) (xy 134.447898 102.903076) (xy 134.563482 102.959582) + (xy 134.638418 102.9705) (xy 134.638421 102.9705) (xy 134.981578 102.9705) (xy 134.981582 102.9705) + (xy 135.056518 102.959582) (xy 135.172102 102.903076) (xy 135.245683 102.829494) (xy 135.252798 102.825869) + (xy 135.257494 102.819407) (xy 135.279542 102.812243) (xy 135.300198 102.801719) (xy 135.315685 102.8005) + (xy 135.380599 102.8005) (xy 135.43879 102.819407) (xy 135.450603 102.829496) (xy 136.254004 103.632897) + (xy 136.281781 103.687414) (xy 136.283 103.702901) (xy 136.283 106.319073) (xy 136.283 106.424527) + (xy 136.30707 106.514359) (xy 136.310294 106.526392) (xy 136.363016 106.617708) (xy 136.363017 106.617709) + (xy 136.363018 106.61771) (xy 136.36302 106.617713) (xy 136.633562 106.888255) (xy 136.88115 107.135843) + (xy 136.908927 107.19036) (xy 136.899356 107.250792) (xy 136.866147 107.288163) (xy 136.8194 107.319397) + (xy 136.819397 107.3194) (xy 136.764035 107.402257) (xy 136.764033 107.402263) (xy 136.749501 107.475315) + (xy 136.7495 107.475327) (xy 136.7495 108.274672) (xy 136.749501 108.274684) (xy 136.764033 108.347736) + (xy 136.764035 108.347742) (xy 136.819397 108.430599) (xy 136.8194 108.430602) (xy 136.868653 108.463511) + (xy 136.90226 108.485966) (xy 136.957635 108.496981) (xy 136.975315 108.500498) (xy 136.97532 108.500498) + (xy 136.975326 108.5005) (xy 137.0005 108.5005) (xy 137.058691 108.519407) (xy 137.094655 108.568907) + (xy 137.0995 108.5995) (xy 137.0995 109.773098) (xy 137.080593 109.831289) (xy 137.070504 109.843102) + (xy 134.993101 111.920504) (xy 134.938584 111.948281) (xy 134.923098 111.9495) (xy 134.799263 111.9495) + (xy 134.707825 111.963983) (xy 134.707821 111.963984) (xy 134.59761 112.02014) (xy 134.567245 112.050505) + (xy 134.512728 112.078281) (xy 134.497242 112.0795) (xy 134.102758 112.0795) (xy 134.044567 112.060593) + (xy 134.032755 112.050505) (xy 134.002391 112.020141) (xy 133.892175 111.963983) (xy 133.892176 111.963983) + (xy 133.800737 111.9495) (xy 133.800735 111.9495) (xy 133.676899 111.9495) (xy 133.618708 111.930593) + (xy 133.606895 111.920503) (xy 133.471258 111.784866) (xy 133.318413 111.63202) (xy 133.318408 111.632016) + (xy 133.227091 111.579294) (xy 133.227093 111.579294) (xy 133.18757 111.568704) (xy 133.125227 111.552) + (xy 133.125225 111.552) (xy 132.556268 111.552) (xy 132.512788 111.541941) (xy 132.479106 111.525475) + (xy 132.451393 111.511927) (xy 132.38326 111.502) (xy 130.9763 111.502) (xy 130.961388 111.497155) + (xy 130.945707 111.497155) (xy 130.933021 111.487938) (xy 130.918109 111.483093) (xy 130.908892 111.470407) + (xy 130.896207 111.461191) (xy 130.891361 111.446278) (xy 130.882145 111.433593) (xy 130.8773 111.403) + (xy 130.8773 111.232) (xy 130.896207 111.173809) (xy 130.945707 111.137845) (xy 130.9763 111.133) + (xy 132.383257 111.133) (xy 132.38326 111.133) (xy 132.451393 111.123073) (xy 132.556483 111.071698) + (xy 132.639198 110.988983) (xy 132.690573 110.883893) (xy 132.7005 110.81576) (xy 132.7005 110.54924) + (xy 132.690573 110.481107) (xy 132.69027 110.480488) (xy 132.679302 110.458052) (xy 132.667111 110.433115) + (xy 132.65854 110.372536) (xy 132.686047 110.319634) (xy 133.319163 109.686519) (xy 133.546187 109.459496) + (xy 133.600703 109.431719) (xy 133.61619 109.4305) (xy 133.821578 109.4305) (xy 133.821582 109.4305) + (xy 133.896518 109.419582) (xy 134.012102 109.363076) (xy 134.085683 109.289494) (xy 134.140198 109.261719) + (xy 134.155685 109.2605) (xy 134.477242 109.2605) (xy 134.535433 109.279407) (xy 134.547245 109.289496) + (xy 134.579365 109.321615) (xy 134.597609 109.339859) (xy 134.707825 109.396017) (xy 134.799265 109.4105) + (xy 135.200734 109.410499) (xy 135.200737 109.410499) (xy 135.227332 109.406286) (xy 135.292175 109.396017) + (xy 135.402391 109.339859) (xy 135.489859 109.252391) (xy 135.546017 109.142175) (xy 135.5605 109.050735) + (xy 135.560499 108.709266) (xy 135.560499 108.709262) (xy 135.554595 108.671986) (xy 135.546017 108.617825) + (xy 135.489859 108.507609) (xy 135.402391 108.420141) (xy 135.292175 108.363983) (xy 135.292176 108.363983) + (xy 135.200736 108.3495) (xy 134.799262 108.3495) (xy 134.707825 108.363983) (xy 134.707821 108.363984) + (xy 134.59761 108.42014) (xy 134.510139 108.507611) (xy 134.505561 108.513913) (xy 134.503947 108.51274) + (xy 134.467979 108.548709) (xy 134.423034 108.5595) (xy 134.155685 108.5595) (xy 134.097494 108.540593) + (xy 134.085687 108.530509) (xy 134.012102 108.456924) (xy 133.896518 108.400418) (xy 133.821582 108.3895) + (xy 133.378418 108.3895) (xy 133.303482 108.400418) (xy 133.241741 108.430602) (xy 133.23048 108.436107) + (xy 133.169898 108.444678) (xy 133.115848 108.416002) (xy 133.088976 108.361034) (xy 133.088 108.347166) + (xy 133.088 106.95869) (xy 133.106907 106.900499) (xy 133.116996 106.888686) (xy 133.546186 106.459496) + (xy 133.600703 106.431719) (xy 133.61619 106.4305) (xy 133.821578 106.4305) (xy 133.821582 106.4305) + (xy 133.896518 106.419582) (xy 134.012102 106.363076) (xy 134.085683 106.289494) (xy 134.140198 106.261719) + (xy 134.155685 106.2605) (xy 134.477242 106.2605) (xy 134.535433 106.279407) (xy 134.547245 106.289496) + (xy 134.576823 106.319073) (xy 134.597609 106.339859) (xy 134.707825 106.396017) (xy 134.799265 106.4105) + (xy 135.200734 106.410499) (xy 135.200737 106.410499) (xy 135.227332 106.406286) (xy 135.292175 106.396017) + (xy 135.402391 106.339859) (xy 135.489859 106.252391) (xy 135.546017 106.142175) (xy 135.5605 106.050735) + (xy 135.560499 105.709266) (xy 135.560499 105.709262) (xy 135.549926 105.642508) (xy 135.546017 105.617825) + (xy 135.489859 105.507609) (xy 135.402391 105.420141) (xy 135.292175 105.363983) (xy 135.292176 105.363983) + (xy 135.200736 105.3495) (xy 134.799262 105.3495) (xy 134.707825 105.363983) (xy 134.707821 105.363984) + (xy 134.59761 105.42014) (xy 134.510139 105.507611) (xy 134.505561 105.513913) (xy 134.503947 105.51274) + (xy 134.467979 105.548709) (xy 134.423034 105.5595) (xy 134.155685 105.5595) (xy 134.097494 105.540593) + (xy 134.085687 105.530509) (xy 134.012102 105.456924) (xy 133.896518 105.400418) (xy 133.821582 105.3895) + (xy 133.378418 105.3895) (xy 133.303482 105.400418) (xy 133.187899 105.456923) (xy 133.096923 105.547899) + (xy 133.052101 105.639585) (xy 133.040418 105.663482) (xy 133.033701 105.709589) (xy 133.0295 105.738421) + (xy 133.0295 105.94381) (xy 133.010593 106.002001) (xy 133.000503 106.013814) (xy 132.589358 106.424958) + (xy 132.534842 106.452735) (xy 132.475876 106.443895) (xy 132.451396 106.431928) (xy 132.451394 106.431927) + (xy 132.451393 106.431927) (xy 132.38326 106.422) (xy 130.89174 106.422) (xy 130.857673 106.426963) + (xy 130.823604 106.431927) (xy 130.718518 106.483301) (xy 130.635801 106.566018) (xy 130.584427 106.671104) + (xy 130.584427 106.671107) (xy 130.5745 106.73924) (xy 130.5745 107.00576) (xy 130.578573 107.033712) + (xy 130.584427 107.073895) (xy 130.619931 107.14652) (xy 130.628502 107.207102) (xy 130.619931 107.23348) + (xy 130.584427 107.306104) (xy 130.58249 107.319399) (xy 130.5745 107.37424) (xy 130.5745 107.64076) + (xy 130.579247 107.673338) (xy 130.584427 107.708895) (xy 130.619931 107.78152) (xy 130.628502 107.842102) + (xy 130.619931 107.86848) (xy 130.584427 107.941104) (xy 130.581624 107.960346) (xy 130.5745 108.00924) + (xy 130.5745 108.27576) (xy 130.575716 108.284106) (xy 130.584427 108.343895) (xy 130.619931 108.41652) + (xy 130.621703 108.429052) (xy 130.62796 108.440054) (xy 130.62574 108.457584) (xy 130.628502 108.477102) + (xy 130.621164 108.500861) (xy 130.620552 108.502211) (xy 130.584427 108.576107) (xy 130.583175 108.584697) + (xy 130.577399 108.597445) (xy 130.565734 108.610229) (xy 130.558062 108.625744) (xy 130.557229 108.626588) + (xy 128.768128 110.41569) (xy 128.7294 110.48277) (xy 128.722929 110.493978) (xy 128.721986 110.495612) + (xy 128.699082 110.581093) (xy 128.6981 110.584757) (xy 128.6981 116.18691) (xy 128.679193 116.245101) + (xy 128.669104 116.256914) (xy 124.593714 120.332304) (xy 124.539197 120.360081) (xy 124.52371 120.3613) + (xy 124.118173 120.3613) (xy 124.059982 120.342393) (xy 124.024018 120.292893) (xy 124.024018 120.231707) + (xy 124.059982 120.182207) (xy 124.103898 120.164334) (xy 124.136518 120.159582) (xy 124.252102 120.103076) + (xy 124.343076 120.012102) (xy 124.399582 119.896518) (xy 124.4105 119.821582) (xy 124.4105 119.378418) + (xy 124.399582 119.303482) (xy 124.343076 119.187898) (xy 124.269494 119.114316) (xy 124.241719 119.059802) + (xy 124.2405 119.044315) (xy 124.2405 117.0995) (xy 124.259407 117.041309) (xy 124.308907 117.005345) + (xy 124.3395 117.0005) (xy 124.637342 117.0005) (xy 124.637344 117.0005) (xy 124.726488 116.976614) + (xy 124.806412 116.93047) (xy 125.27717 116.459712) (xy 125.323314 116.379788) (xy 125.324679 116.374695) + (xy 125.338428 116.323385) (xy 125.344827 116.2995) (xy 125.3472 116.290644) (xy 125.3472 115.628206) + (xy 125.366107 115.570015) (xy 125.415607 115.534051) (xy 125.476793 115.534051) (xy 125.48968 115.539265) + (xy 125.548607 115.568073) (xy 125.61674 115.578) (xy 125.616743 115.578) (xy 127.108257 115.578) + (xy 127.10826 115.578) (xy 127.176393 115.568073) (xy 127.281483 115.516698) (xy 127.364198 115.433983) + (xy 127.415573 115.328893) (xy 127.4255 115.26076) (xy 127.4255 114.99424) (xy 127.415573 114.926107) + (xy 127.380067 114.853479) (xy 127.371497 114.792899) (xy 127.380068 114.76652) (xy 127.415573 114.693893) + (xy 127.4255 114.62576) (xy 127.4255 114.35924) (xy 127.415573 114.291107) (xy 127.380067 114.218479) + (xy 127.371497 114.157899) (xy 127.380068 114.13152) (xy 127.415573 114.058893) (xy 127.4255 113.99076) + (xy 127.4255 113.72424) (xy 127.415573 113.656107) (xy 127.380067 113.583479) (xy 127.371497 113.522899) + (xy 127.380068 113.49652) (xy 127.415573 113.423893) (xy 127.4255 113.35576) (xy 127.4255 113.08924) + (xy 127.415573 113.021107) (xy 127.380067 112.948479) (xy 127.371497 112.887899) (xy 127.380068 112.86152) + (xy 127.415573 112.788893) (xy 127.4255 112.72076) (xy 127.4255 112.45424) (xy 127.415573 112.386107) + (xy 127.380067 112.313479) (xy 127.371497 112.252899) (xy 127.380068 112.22652) (xy 127.415573 112.153893) + (xy 127.4255 112.08576) (xy 127.4255 111.81924) (xy 127.415573 111.751107) (xy 127.380067 111.678479) + (xy 127.371497 111.617899) (xy 127.380068 111.59152) (xy 127.415573 111.518893) (xy 127.4255 111.45076) + (xy 127.4255 111.18424) (xy 127.415573 111.116107) (xy 127.380067 111.043479) (xy 127.371497 110.982899) + (xy 127.380068 110.95652) (xy 127.415573 110.883893) (xy 127.4255 110.81576) (xy 127.4255 110.54924) + (xy 127.415573 110.481107) (xy 127.380067 110.408479) (xy 127.371497 110.347899) (xy 127.380068 110.32152) + (xy 127.415573 110.248893) (xy 127.4255 110.18076) (xy 127.4255 109.91424) (xy 127.415573 109.846107) + (xy 127.380067 109.773479) (xy 127.371497 109.712899) (xy 127.380068 109.68652) (xy 127.415573 109.613893) + (xy 127.4255 109.54576) (xy 127.4255 109.27924) (xy 127.415573 109.211107) (xy 127.380067 109.138479) + (xy 127.371497 109.077899) (xy 127.380068 109.05152) (xy 127.415573 108.978893) (xy 127.4255 108.91076) + (xy 127.4255 108.64424) (xy 127.415573 108.576107) (xy 127.380067 108.503479) (xy 127.371497 108.442899) + (xy 127.380068 108.41652) (xy 127.415573 108.343893) (xy 127.4255 108.27576) (xy 127.4255 108.00924) + (xy 127.415573 107.941107) (xy 127.380067 107.868479) (xy 127.371497 107.807899) (xy 127.380068 107.78152) + (xy 127.415573 107.708893) (xy 127.4255 107.64076) (xy 127.4255 107.37424) (xy 127.415573 107.306107) + (xy 127.380067 107.233479) (xy 127.371497 107.172899) (xy 127.380068 107.14652) (xy 127.415573 107.073893) + (xy 127.4255 107.00576) (xy 127.4255 106.73924) (xy 127.415573 106.671107) (xy 127.407715 106.655034) + (xy 127.367104 106.571962) (xy 127.364198 106.566017) (xy 127.281483 106.483302) (xy 127.264376 106.474939) + (xy 127.176395 106.431927) (xy 127.149139 106.427956) (xy 127.10826 106.422) (xy 125.61674 106.422) + (xy 125.582673 106.426963) (xy 125.548604 106.431927) (xy 125.443518 106.483301) (xy 125.3608 106.566019) + (xy 125.324538 106.640193) (xy 125.305602 106.666715) (xy 123.834028 108.13829) (xy 123.83202 108.141769) + (xy 123.78655 108.182709) (xy 123.7257 108.189103) (xy 123.694713 108.175167) (xy 123.694445 108.175675) + (xy 123.687883 108.172207) (xy 123.559703 108.127355) (xy 123.559694 108.127353) (xy 123.529274 108.1245) + (xy 123.529266 108.1245) (xy 122.870734 108.1245) (xy 122.870725 108.1245) (xy 122.840305 108.127353) + (xy 122.840296 108.127355) (xy 122.712116 108.172207) (xy 122.637477 108.227294) (xy 122.57943 108.246636) + (xy 122.529189 108.233375) (xy 122.449588 108.187417) (xy 122.449589 108.187417) (xy 122.405767 108.175675) + (xy 122.309575 108.1499) (xy 122.164625 108.1499) (xy 122.125122 108.160484) (xy 122.064022 108.157283) + (xy 122.016472 108.118778) (xy 122.0005 108.064858) (xy 122.0005 105.797799) (xy 122.010559 105.754319) + (xy 122.018331 105.738421) (xy 122.06522 105.642509) (xy 122.0755 105.571949) (xy 122.075499 105.4819) + (xy 122.094406 105.42371) (xy 122.104489 105.411902) (xy 124.46691 103.049481) (xy 124.466913 103.04948) + (xy 124.54148 102.974913) (xy 124.582955 102.903076) (xy 124.594207 102.883588) (xy 124.598848 102.866265) + (xy 124.602068 102.85907) (xy 124.617554 102.841932) (xy 124.630134 102.822562) (xy 124.637674 102.819667) + (xy 124.64309 102.813675) (xy 124.665692 102.808912) (xy 124.687256 102.800636) (xy 124.692436 102.8005) + (xy 133.284315 102.8005) (xy 133.342506 102.819407) (xy 133.354312 102.82949) (xy 133.427898 102.903076) + (xy 133.543482 102.959582) (xy 133.618418 102.9705) (xy 133.618421 102.9705) (xy 133.961578 102.9705) + (xy 133.961582 102.9705) (xy 134.036518 102.959582) (xy 134.152102 102.903076) (xy 134.229998 102.825179) + (xy 134.284513 102.797404) + ) + ) + (filled_polygon + (layer "F.Cu") + (pts + (xy 156.219504 103.935897) (xy 157.321804 105.038197) (xy 157.349581 105.092714) (xy 157.3508 105.108201) + (xy 157.3508 105.910999) (xy 157.331893 105.96919) (xy 157.321804 105.981002) (xy 157.24782 106.054986) + (xy 157.247816 106.054991) (xy 157.195095 106.146306) (xy 157.175273 106.220283) (xy 157.1678 106.248172) + (xy 157.1678 106.975761) (xy 157.148893 107.033952) (xy 157.099393 107.069916) (xy 157.038207 107.069916) + (xy 157.019495 107.060479) (xy 157.019472 107.060527) (xy 157.007019 107.054439) (xy 156.896518 107.000418) + (xy 156.821582 106.9895) (xy 156.378418 106.9895) (xy 156.303482 107.000418) (xy 156.19298 107.054439) + (xy 156.132398 107.06301) (xy 156.078348 107.034334) (xy 156.051476 106.979366) (xy 156.0505 106.965498) + (xy 156.0505 104.005901) (xy 156.069407 103.94771) (xy 156.118907 103.911746) (xy 156.180093 103.911746) + ) + ) + ) + (zone + (net 0) + (net_name "") + (layer "F.Cu") + (uuid "676058b9-a184-40f4-a9f5-1e8efd6612e5") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (filled_areas_thickness no) + (keepout + (tracks not_allowed) + (vias not_allowed) + (pads allowed) + (copperpour allowed) + (footprints allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + ) + (polygon + (pts + (xy 145.3 103.8) (xy 155.3 103.8) (xy 155.3 113.8) (xy 145.3 113.8) + ) + ) + ) + (zone + (net 0) + (net_name "") + (layers "F.Cu" "B.Cu") + (uuid "28712f8e-7f51-4b71-b183-d456ba0679eb") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (filled_areas_thickness no) + (keepout + (tracks allowed) + (vias not_allowed) + (pads allowed) + (copperpour allowed) + (footprints allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + ) + (polygon + (pts + (xy 140 102.675) (xy 156.65 102.675) (xy 156.65 119.325) (xy 140 119.325) + ) + ) + ) + (zone + (net 0) + (net_name "") + (layers "F.Cu" "B.Cu") + (uuid "a5fa1c66-beb1-4b2f-8fc8-2342ede04f26") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (filled_areas_thickness no) + (keepout + (tracks not_allowed) + (vias not_allowed) + (pads allowed) + (copperpour allowed) + (footprints allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + ) + (polygon + (pts + (xy 103.55 114.05) (xy 106.45 114.05) (xy 106.45 116.95) (xy 103.55 116.95) + ) + ) + ) + (zone + (net 0) + (net_name "") + (layers "F.Cu" "B.Cu") + (uuid "a68cb0a7-fb4c-4c56-8a61-446eaae9cb00") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (filled_areas_thickness no) + (keepout + (tracks not_allowed) + (vias not_allowed) + (pads allowed) + (copperpour allowed) + (footprints allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + ) + (polygon + (pts + (xy 103.55 105.05) (xy 106.45 105.05) (xy 106.45 107.95) (xy 103.55 107.95) + ) + ) + ) + (zone + (net 0) + (net_name "") + (layers "F.Cu" "B.Cu") + (uuid "abdd2446-b79a-4606-a9ba-cfaf3d53a837") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (filled_areas_thickness no) + (keepout + (tracks allowed) + (vias not_allowed) + (pads allowed) + (copperpour allowed) + (footprints allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + ) + (polygon + (pts + (xy 144.8 103.3) (xy 155.8 103.3) (xy 155.8 119.3) (xy 144.8 119.3) + ) + ) + ) + (zone + (net 0) + (net_name "") + (layers "F.Cu" "B.Cu") + (uuid "b61e9851-6a46-449f-a696-f2304af6e912") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (filled_areas_thickness no) + (keepout + (tracks not_allowed) + (vias not_allowed) + (pads allowed) + (copperpour allowed) + (footprints allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + ) + (polygon + (pts + (xy 103.05 109.85) (xy 105.75 109.85) (xy 105.75 112.15) (xy 103.05 112.15) + ) + ) + ) + (zone + (net 0) + (net_name "") + (layers "F.Cu" "B.Cu") + (uuid "be175b56-7b94-4534-86c4-ef135d7bdd01") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (filled_areas_thickness no) + (keepout + (tracks not_allowed) + (vias not_allowed) + (pads allowed) + (copperpour allowed) + (footprints allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + ) + (polygon + (pts + (xy 100 109.1) (xy 102.3 109.1) (xy 102.3 112.9) (xy 100 112.9) + ) + ) + ) + (zone + (net 0) + (net_name "") + (layers "F.Cu" "B.Cu") + (uuid "ef1a5be7-bc53-49c2-9b35-8b827f513a4a") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (filled_areas_thickness no) + (keepout + (tracks allowed) + (vias not_allowed) + (pads allowed) + (copperpour allowed) + (footprints allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + ) + (polygon + (pts + (xy 125.3 102.5) (xy 138.3 102.5) (xy 138.3 120) (xy 125.3 120) + ) + ) + ) + (zone + (net 0) + (net_name "") + (layer "B.Cu") + (uuid "c809ac5c-3071-4fe3-ba80-0eae45537020") + (hatch edge 0.5) + (connect_pads + (clearance 0) + ) + (min_thickness 0.25) + (filled_areas_thickness no) + (keepout + (tracks not_allowed) + (vias not_allowed) + (pads allowed) + (copperpour allowed) + (footprints allowed) + ) + (placement + (enabled no) + (sheetname "") + ) + (fill + (thermal_gap 0.5) + (thermal_bridge_width 0.5) + ) + (polygon + (pts + (xy 125.8 103) (xy 137.8 103) (xy 137.8 115) (xy 125.8 115) + ) + ) + ) + (zone + (net 9) + (net_name "GND") + (layer "B.Cu") + (uuid "d63e7876-839c-44e4-b5e6-f663d8c3c1df") + (hatch edge 0.5) + (connect_pads yes + (clearance 0.25) + ) + (min_thickness 0.2) + (filled_areas_thickness no) + (fill yes + (thermal_gap 0.25) + (thermal_bridge_width 0.3) + ) + (polygon + (pts + (xy 100.2 100.2) (xy 165.8 100.2) (xy 165.8 121.8) (xy 100.2 121.8) + ) + ) + (filled_polygon + (layer "B.Cu") + (pts + (xy 155.764958 100.319407) (xy 155.800922 100.368907) (xy 155.800922 100.430093) (xy 155.764958 100.479593) + (xy 155.732393 100.495125) (xy 155.605915 100.529016) (xy 155.605913 100.529016) (xy 155.605909 100.529018) + (xy 155.480389 100.601487) (xy 155.377887 100.703989) (xy 155.305417 100.82951) (xy 155.2679 100.969525) + (xy 155.2679 100.985099) (xy 155.248993 101.04329) (xy 155.238904 101.055103) (xy 154.431303 101.862704) + (xy 154.376786 101.890481) (xy 154.361299 101.8917) (xy 124.532231 101.8917) (xy 124.47404 101.872793) + (xy 124.462233 101.862709) (xy 124.451215 101.851691) (xy 124.451212 101.851689) (xy 124.45121 101.851687) + (xy 124.325688 101.779217) (xy 124.325689 101.779217) (xy 124.273388 101.765203) (xy 124.185675 101.7417) + (xy 124.040725 101.7417) (xy 124.005193 101.751221) (xy 123.90071 101.779217) (xy 123.775189 101.851687) + (xy 123.672687 101.954189) (xy 123.600217 102.07971) (xy 123.5627 102.219725) (xy 123.5627 102.364674) + (xy 123.600217 102.504689) (xy 123.672687 102.63021) (xy 123.672689 102.630212) (xy 123.672691 102.630215) + (xy 123.775185 102.732709) (xy 123.775187 102.73271) (xy 123.775189 102.732712) (xy 123.900711 102.805182) + (xy 123.900712 102.805182) (xy 123.900715 102.805184) (xy 124.040725 102.8427) (xy 124.040726 102.8427) + (xy 124.185674 102.8427) (xy 124.185675 102.8427) (xy 124.325685 102.805184) (xy 124.325687 102.805182) + (xy 124.325689 102.805182) (xy 124.45121 102.732712) (xy 124.45121 102.732711) (xy 124.451215 102.732709) + (xy 124.462229 102.721694) (xy 124.516744 102.693919) (xy 124.532231 102.6927) (xy 154.620925 102.6927) + (xy 154.620927 102.6927) (xy 154.722788 102.665407) (xy 154.72279 102.665405) (xy 154.722792 102.665405) + (xy 154.814108 102.612683) (xy 154.814108 102.612682) (xy 154.814113 102.61268) (xy 155.805297 101.621496) + (xy 155.859814 101.593719) (xy 155.875301 101.5925) (xy 155.890874 101.5925) (xy 155.890875 101.5925) + (xy 156.030885 101.554984) (xy 156.030887 101.554982) (xy 156.030889 101.554982) (xy 156.15641 101.482512) + (xy 156.15641 101.482511) (xy 156.156415 101.482509) (xy 156.258909 101.380015) (xy 156.258912 101.38001) + (xy 156.331382 101.254489) (xy 156.331382 101.254487) (xy 156.331384 101.254485) (xy 156.3689 101.114475) + (xy 156.3689 100.969525) (xy 156.331384 100.829515) (xy 156.331382 100.829512) (xy 156.331382 100.82951) + (xy 156.258912 100.703989) (xy 156.25891 100.703987) (xy 156.258909 100.703985) (xy 156.156415 100.601491) + (xy 156.156412 100.601489) (xy 156.15641 100.601487) (xy 156.03089 100.529018) (xy 156.030887 100.529017) + (xy 156.030885 100.529016) (xy 155.904407 100.495126) (xy 155.853095 100.461802) (xy 155.831169 100.404681) + (xy 155.847005 100.34558) (xy 155.894555 100.307075) (xy 155.930033 100.3005) (xy 163.99645 100.3005) + (xy 164.003514 100.300752) (xy 164.024934 100.302284) (xy 164.234808 100.317299) (xy 164.248765 100.319307) + (xy 164.471873 100.367845) (xy 164.485425 100.371824) (xy 164.699358 100.451619) (xy 164.7122 100.457484) + (xy 164.912601 100.566914) (xy 164.924468 100.574541) (xy 165.097385 100.703985) (xy 165.10725 100.71137) + (xy 165.117925 100.720619) (xy 165.27938 100.882074) (xy 165.288629 100.892749) (xy 165.425456 101.075527) + (xy 165.43309 101.087406) (xy 165.542513 101.287796) (xy 165.548381 101.300644) (xy 165.628175 101.514574) + (xy 165.632154 101.528126) (xy 165.68069 101.751221) (xy 165.6827 101.765201) (xy 165.688888 101.851687) + (xy 165.699248 101.996484) (xy 165.6995 102.003549) (xy 165.6995 119.99645) (xy 165.699248 120.003515) + (xy 165.682701 120.234797) (xy 165.68069 120.248778) (xy 165.632154 120.471873) (xy 165.628175 120.485425) + (xy 165.548381 120.699355) (xy 165.542513 120.712203) (xy 165.43309 120.912593) (xy 165.425453 120.924476) + (xy 165.288629 121.10725) (xy 165.27938 121.117925) (xy 165.117925 121.27938) (xy 165.10725 121.288629) + (xy 164.924476 121.425453) (xy 164.912593 121.43309) (xy 164.712203 121.542513) (xy 164.699355 121.548381) + (xy 164.485425 121.628175) (xy 164.471873 121.632154) (xy 164.248778 121.68069) (xy 164.234797 121.682701) + (xy 164.003515 121.699248) (xy 163.99645 121.6995) (xy 130.370031 121.6995) (xy 130.31184 121.680593) + (xy 130.275876 121.631093) (xy 130.275876 121.569907) (xy 130.31184 121.520407) (xy 130.332148 121.509035) + (xy 130.334679 121.507985) (xy 130.334685 121.507984) (xy 130.460215 121.435509) (xy 130.562709 121.333015) + (xy 130.562712 121.33301) (xy 130.635182 121.207489) (xy 130.635182 121.207487) (xy 130.635184 121.207485) + (xy 130.6727 121.067475) (xy 130.6727 120.922525) (xy 130.635184 120.782515) (xy 130.635182 120.782512) + (xy 130.635182 120.78251) (xy 130.562712 120.656989) (xy 130.56271 120.656987) (xy 130.562709 120.656985) + (xy 130.460215 120.554491) (xy 130.460212 120.554489) (xy 130.46021 120.554487) (xy 130.334688 120.482017) + (xy 130.334689 120.482017) (xy 130.296831 120.471873) (xy 130.194675 120.4445) (xy 130.049725 120.4445) + (xy 129.98799 120.461041) (xy 129.90971 120.482017) (xy 129.784189 120.554487) (xy 129.784184 120.554491) + (xy 129.723171 120.615504) (xy 129.668654 120.643281) (xy 129.653168 120.6445) (xy 116.47419 120.6445) + (xy 116.415999 120.625593) (xy 116.404186 120.615504) (xy 111.919307 116.130625) (xy 138.3832 116.130625) + (xy 138.3832 116.275574) (xy 138.420717 116.415589) (xy 138.493187 116.54111) (xy 138.493189 116.541112) + (xy 138.493191 116.541115) (xy 138.595685 116.643609) (xy 138.595687 116.64361) (xy 138.595689 116.643612) + (xy 138.721211 116.716082) (xy 138.721212 116.716082) (xy 138.721215 116.716084) (xy 138.861225 116.7536) + (xy 138.861226 116.7536) (xy 139.006174 116.7536) (xy 139.006175 116.7536) (xy 139.146185 116.716084) + (xy 139.146187 116.716082) (xy 139.146189 116.716082) (xy 139.27171 116.643612) (xy 139.27171 116.643611) + (xy 139.271715 116.643609) (xy 139.302222 116.613102) (xy 139.332729 116.582596) (xy 139.387246 116.554819) + (xy 139.402732 116.5536) (xy 155.481842 116.5536) (xy 155.481844 116.5536) (xy 155.570988 116.529714) + (xy 155.581612 116.52358) (xy 155.650912 116.48357) (xy 158.320248 113.814234) (xy 159.4745 113.814234) + (xy 159.4745 113.965766) (xy 159.509086 114.094847) (xy 159.51372 114.112139) (xy 159.589481 114.24336) + (xy 159.589483 114.243362) (xy 159.589485 114.243365) (xy 159.696635 114.350515) (xy 159.696637 114.350516) + (xy 159.696639 114.350518) (xy 159.827861 114.426279) (xy 159.827859 114.426279) (xy 159.827863 114.42628) + (xy 159.827865 114.426281) (xy 159.974234 114.4655) (xy 159.974236 114.4655) (xy 160.125764 114.4655) + (xy 160.125766 114.4655) (xy 160.272135 114.426281) (xy 160.272137 114.426279) (xy 160.272139 114.426279) + (xy 160.40336 114.350518) (xy 160.40336 114.350517) (xy 160.403365 114.350515) (xy 160.510515 114.243365) + (xy 160.573666 114.133985) (xy 160.586279 114.112139) (xy 160.586279 114.112137) (xy 160.586281 114.112135) + (xy 160.6255 113.965766) (xy 160.6255 113.814234) (xy 160.586281 113.667865) (xy 160.586279 113.667862) + (xy 160.586279 113.66786) (xy 160.510518 113.536639) (xy 160.510516 113.536637) (xy 160.510515 113.536635) + (xy 160.403365 113.429485) (xy 160.403362 113.429483) (xy 160.40336 113.429481) (xy 160.272138 113.35372) + (xy 160.27214 113.35372) (xy 160.215347 113.338503) (xy 160.125766 113.3145) (xy 159.974234 113.3145) + (xy 159.884652 113.338503) (xy 159.82786 113.35372) (xy 159.696639 113.429481) (xy 159.589481 113.536639) + (xy 159.51372 113.66786) (xy 159.513719 113.667865) (xy 159.4745 113.814234) (xy 158.320248 113.814234) + (xy 159.753386 112.381096) (xy 159.807903 112.353319) (xy 159.82339 112.3521) (xy 159.909674 112.3521) + (xy 159.909675 112.3521) (xy 160.049685 112.314584) (xy 160.049687 112.314582) (xy 160.049689 112.314582) + (xy 160.17521 112.242112) (xy 160.17521 112.242111) (xy 160.175215 112.242109) (xy 160.277709 112.139615) + (xy 160.350184 112.014085) (xy 160.3877 111.874075) (xy 160.3877 111.729125) (xy 160.350184 111.589115) + (xy 160.350182 111.589112) (xy 160.350182 111.58911) (xy 160.277712 111.463589) (xy 160.27771 111.463587) + (xy 160.277709 111.463585) (xy 160.175215 111.361091) (xy 160.175212 111.361089) (xy 160.17521 111.361087) + (xy 160.049688 111.288617) (xy 160.049689 111.288617) (xy 160.0043 111.276455) (xy 159.909675 111.2511) + (xy 159.764725 111.2511) (xy 159.706271 111.266763) (xy 159.62471 111.288617) (xy 159.499189 111.361087) + (xy 159.396687 111.463589) (xy 159.324217 111.58911) (xy 159.2867 111.729125) (xy 159.2867 111.81541) + (xy 159.267793 111.873601) (xy 159.257704 111.885414) (xy 155.319514 115.823604) (xy 155.264997 115.851381) + (xy 155.24951 115.8526) (xy 139.402732 115.8526) (xy 139.344541 115.833693) (xy 139.332729 115.823604) + (xy 139.271715 115.762591) (xy 139.27171 115.762587) (xy 139.146188 115.690117) (xy 139.146189 115.690117) + (xy 139.116596 115.682187) (xy 139.006175 115.6526) (xy 138.861225 115.6526) (xy 138.79949 115.669141) + (xy 138.72121 115.690117) (xy 138.595689 115.762587) (xy 138.493187 115.865089) (xy 138.420717 115.99061) + (xy 138.3832 116.130625) (xy 111.919307 116.130625) (xy 110.488007 114.699325) (xy 138.6563 114.699325) + (xy 138.6563 114.844274) (xy 138.693817 114.984289) (xy 138.766287 115.10981) (xy 138.766289 115.109812) + (xy 138.766291 115.109815) (xy 138.868785 115.212309) (xy 138.868787 115.21231) (xy 138.868789 115.212312) + (xy 138.994311 115.284782) (xy 138.994312 115.284782) (xy 138.994315 115.284784) (xy 139.134325 115.3223) + (xy 139.134326 115.3223) (xy 139.279274 115.3223) (xy 139.279275 115.3223) (xy 139.419285 115.284784) + (xy 139.419287 115.284782) (xy 139.419289 115.284782) (xy 139.54481 115.212312) (xy 139.54481 115.212311) + (xy 139.544815 115.212309) (xy 139.647309 115.109815) (xy 139.719784 114.984285) (xy 139.7573 114.844275) + (xy 139.7573 114.75799) (xy 139.776207 114.699799) (xy 139.786296 114.687986) (xy 143.606286 110.867996) + (xy 143.660803 110.840219) (xy 143.67629 110.839) (xy 159.379068 110.839) (xy 159.437259 110.857907) + (xy 159.449071 110.867996) (xy 159.510084 110.929008) (xy 159.510089 110.929012) (xy 159.635611 111.001482) + (xy 159.635612 111.001482) (xy 159.635615 111.001484) (xy 159.775625 111.039) (xy 159.775626 111.039) + (xy 159.920574 111.039) (xy 159.920575 111.039) (xy 160.060585 111.001484) (xy 160.060587 111.001482) + (xy 160.060589 111.001482) (xy 160.18611 110.929012) (xy 160.18611 110.929011) (xy 160.186115 110.929009) + (xy 160.288609 110.826515) (xy 160.361084 110.700985) (xy 160.3986 110.560975) (xy 160.3986 110.416025) + (xy 160.361084 110.276015) (xy 160.361082 110.276012) (xy 160.361082 110.27601) (xy 160.288612 110.150489) + (xy 160.28861 110.150487) (xy 160.288609 110.150485) (xy 160.186115 110.047991) (xy 160.186112 110.047989) + (xy 160.18611 110.047987) (xy 160.060588 109.975517) (xy 160.060589 109.975517) (xy 160.030996 109.967587) + (xy 159.920575 109.938) (xy 159.775625 109.938) (xy 159.71389 109.954541) (xy 159.63561 109.975517) + (xy 159.510089 110.047987) (xy 159.510084 110.047991) (xy 159.449071 110.109004) (xy 159.394554 110.136781) + (xy 159.379068 110.138) (xy 143.443956 110.138) (xy 143.354812 110.161886) (xy 143.274888 110.20803) + (xy 139.290614 114.192304) (xy 139.236097 114.220081) (xy 139.22061 114.2213) (xy 139.134325 114.2213) + (xy 139.07259 114.237841) (xy 138.99431 114.258817) (xy 138.868789 114.331287) (xy 138.766287 114.433789) + (xy 138.693817 114.55931) (xy 138.6563 114.699325) (xy 110.488007 114.699325) (xy 107.912373 112.123691) + (xy 107.884596 112.069174) (xy 107.894167 112.008742) (xy 107.932878 111.96795) (xy 107.936281 111.965984) + (xy 107.936285 111.965984) (xy 108.061815 111.893509) (xy 108.098906 111.856418) (xy 108.122829 111.832496) + (xy 108.177346 111.804719) (xy 108.192832 111.8035) (xy 119.530642 111.8035) (xy 119.530644 111.8035) + (xy 119.619788 111.779614) (xy 119.654557 111.75954) (xy 119.699712 111.73347) (xy 122.153285 109.279895) + (xy 122.207802 109.252119) (xy 122.223289 109.2509) (xy 122.309574 109.2509) (xy 122.309575 109.2509) + (xy 122.449585 109.213384) (xy 122.449587 109.213382) (xy 122.449589 109.213382) (xy 122.57511 109.140912) + (xy 122.57511 109.140911) (xy 122.575115 109.140909) (xy 122.677609 109.038415) (xy 122.725588 108.955314) + (xy 127.929858 108.955314) (xy 127.929858 109.044686) (xy 127.949307 109.142461) (xy 127.981648 109.22054) + (xy 127.982963 109.224214) (xy 127.983507 109.225029) (xy 127.983508 109.22503) (xy 127.983508 109.225031) + (xy 128.015574 109.273021) (xy 128.038313 109.307054) (xy 128.038893 109.307921) (xy 128.102089 109.371117) + (xy 128.10209 109.371117) (xy 128.104418 109.373445) (xy 128.110197 109.376534) (xy 128.18498 109.426502) + (xy 128.184981 109.426502) (xy 128.184982 109.426503) (xy 128.207464 109.435815) (xy 128.267549 109.460703) + (xy 128.340282 109.478922) (xy 128.384968 109.483323) (xy 128.41001 109.484553) (xy 128.410027 109.484553) + (xy 129.326211 109.484553) (xy 129.326224 109.484553) (xy 129.35127 109.483322) (xy 129.366437 109.481828) + (xy 129.366436 109.481827) (xy 129.3774 109.480746) (xy 129.377401 109.480748) (xy 129.395946 109.478922) + (xy 129.415046 109.474136) (xy 129.41809 109.473468) (xy 129.418268 109.473416) (xy 129.422153 109.472357) + (xy 129.468692 109.4607) (xy 129.481415 109.455428) (xy 129.491354 109.45192) (xy 129.503417 109.448372) + (xy 129.504445 109.448084) (xy 129.504585 109.44803) (xy 129.52072 109.439579) (xy 129.528766 109.435815) + (xy 129.539851 109.431223) (xy 129.539852 109.431225) (xy 129.551248 109.426505) (xy 129.55126 109.4265) + (xy 129.571425 109.413025) (xy 129.592898 109.40178) (xy 129.602497 109.394037) (xy 129.601567 109.392884) + (xy 129.626036 109.376534) (xy 129.634144 109.371117) (xy 129.634145 109.371115) (xy 129.634149 109.371113) + (xy 129.643898 109.361362) (xy 129.651731 109.354325) (xy 129.662183 109.345894) (xy 129.719348 109.324082) + (xy 129.778417 109.340035) (xy 129.816827 109.387662) (xy 129.818551 109.392563) (xy 130.331006 110.981172) + (xy 130.331007 110.981174) (xy 130.331011 110.981185) (xy 130.33986 111.004618) (xy 130.342556 111.010819) + (xy 130.357743 111.04575) (xy 130.357782 111.045824) (xy 130.397447 111.109445) (xy 130.39745 111.10945) + (xy 130.402386 111.115255) (xy 130.406375 111.121751) (xy 130.406377 111.121755) (xy 130.425185 111.142064) + (xy 130.426544 111.143662) (xy 130.448308 111.169254) (xy 130.455343 111.177526) (xy 130.459406 111.180743) + (xy 130.470588 111.191091) (xy 130.474114 111.194899) (xy 130.5101 111.220994) (xy 130.5101 111.220995) + (xy 130.511803 111.22223) (xy 130.533501 111.23941) (xy 130.540287 111.242885) (xy 130.542906 111.244784) + (xy 130.546463 111.247364) (xy 130.546466 111.247366) (xy 130.569742 111.25807) (xy 130.573464 111.259879) + (xy 130.604302 111.275675) (xy 130.613045 111.280153) (xy 130.61305 111.280155) (xy 130.618028 111.28157) + (xy 130.618042 111.281574) (xy 130.625393 111.283663) (xy 130.637038 111.28902) (xy 130.654302 111.293148) + (xy 130.654584 111.291963) (xy 130.684298 111.300411) (xy 130.684301 111.300412) (xy 130.708944 111.307419) + (xy 130.709004 111.307429) (xy 130.723582 111.309744) (xy 130.723588 111.30972) (xy 130.723861 111.309782) + (xy 130.723955 111.309805) (xy 130.723968 111.309808) (xy 130.749625 111.310791) (xy 130.753765 111.311038) + (xy 130.780316 111.313185) (xy 130.780316 111.313186) (xy 130.798011 111.314617) (xy 130.798025 111.314618) + (xy 130.810775 111.313135) (xy 130.823586 111.313627) (xy 130.841119 111.310833) (xy 130.840927 111.309631) + (xy 130.897049 111.303108) (xy 130.897052 111.303106) (xy 130.899351 111.302608) (xy 130.906536 111.300983) + (xy 130.906514 111.300891) (xy 130.911834 111.299569) (xy 130.911843 111.299568) (xy 130.935905 111.290665) + (xy 130.939855 111.289298) (xy 130.965195 111.281124) (xy 130.965196 111.281125) (xy 130.979714 111.276442) + (xy 130.9815 111.275916) (xy 130.982101 111.275673) (xy 130.982101 111.275672) (xy 130.982108 111.275671) + (xy 130.98665 111.273139) (xy 131.000488 111.266769) (xy 131.00534 111.264975) (xy 131.020468 111.255685) + (xy 131.020467 111.255684) (xy 131.043196 111.241727) (xy 131.043206 111.241721) (xy 131.044974 111.240635) + (xy 131.069189 111.227141) (xy 131.074992 111.222205) (xy 131.081488 111.218217) (xy 131.081504 111.218207) + (xy 131.100319 111.20078) (xy 131.103442 111.198008) (xy 131.123732 111.180754) (xy 131.123733 111.180755) + (xy 131.137258 111.169254) (xy 131.137268 111.169245) (xy 131.145236 111.15918) (xy 131.154645 111.150467) + (xy 131.165066 111.136095) (xy 131.16408 111.13538) (xy 131.199151 111.091086) (xy 131.199155 111.091076) + (xy 131.199224 111.090972) (xy 131.205195 111.081243) (xy 131.205182 111.081235) (xy 131.207096 111.078139) + (xy 131.20951 111.073504) (xy 131.24174 111.011619) (xy 131.251533 110.983293) (xy 131.251532 110.983292) + (xy 131.254189 110.975611) (xy 131.256399 110.969222) (xy 131.256409 110.969186) (xy 131.256801 110.968053) + (xy 131.256802 110.96805) (xy 131.256807 110.968038) (xy 131.260269 110.958022) (xy 131.260269 110.958017) + (xy 131.262705 110.947605) (xy 131.263431 110.94512) (xy 131.459192 110.126477) (xy 131.491113 110.074283) + (xy 131.54762 110.050817) (xy 131.574784 110.052406) (xy 131.669331 110.071213) (xy 131.684284 110.072685) + (xy 131.719169 110.076122) (xy 131.719176 110.076122) (xy 131.880831 110.076122) (xy 131.912543 110.072998) + (xy 131.930669 110.071213) (xy 132.003866 110.056653) (xy 132.064625 110.063845) (xy 132.109555 110.105377) + (xy 132.119605 110.131326) (xy 132.244253 110.667313) (xy 132.245897 110.673087) (xy 132.245911 110.673134) + (xy 132.251118 110.69141) (xy 132.254127 110.700294) (xy 132.254191 110.700272) (xy 132.254845 110.702415) + (xy 132.265513 110.733913) (xy 132.265538 110.733971) (xy 132.269518 110.74173) (xy 132.299752 110.800675) + (xy 132.299756 110.80068) (xy 132.299758 110.800684) (xy 132.302352 110.804308) (xy 132.309541 110.815984) + (xy 132.311185 110.819122) (xy 132.311568 110.819872) (xy 132.311617 110.819948) (xy 132.311619 110.819951) + (xy 132.316915 110.826515) (xy 132.326907 110.838898) (xy 132.330367 110.843449) (xy 132.351761 110.873344) + (xy 132.351764 110.873347) (xy 132.351773 110.873358) (xy 132.363841 110.884673) (xy 132.37422 110.897537) + (xy 132.3865 110.907787) (xy 132.387374 110.906739) (xy 132.424496 110.941547) (xy 132.43412 110.947539) + (xy 132.442817 110.954799) (xy 132.442823 110.954804) (xy 132.46669 110.967818) (xy 132.469097 110.969317) + (xy 132.46912 110.96933) (xy 132.486774 110.980322) (xy 132.486774 110.980323) (xy 132.500358 110.988781) + (xy 132.50036 110.988782) (xy 132.515833 110.994616) (xy 132.530347 111.00253) (xy 132.545615 111.007301) + (xy 132.546022 111.005997) (xy 132.593642 111.023952) (xy 132.598049 111.024682) (xy 132.611391 111.027856) + (xy 132.615645 111.029186) (xy 132.615662 111.029191) (xy 132.639917 111.031783) (xy 132.64557 111.032554) + (xy 132.681063 111.038437) (xy 132.681763 111.038558) (xy 132.681809 111.038561) (xy 132.681811 111.03856) + (xy 132.681818 111.038562) (xy 132.691488 111.03825) (xy 132.705188 111.038759) (xy 132.714789 111.039786) + (xy 132.730724 111.03835) (xy 132.730723 111.038349) (xy 132.751405 111.036486) (xy 132.751417 111.036485) + (xy 132.754254 111.036229) (xy 132.781458 111.035354) (xy 132.792485 111.032788) (xy 132.799336 111.032172) + (xy 132.799337 111.032172) (xy 132.799343 111.032171) (xy 132.803778 111.031772) (xy 132.8038 111.03177) + (xy 132.827201 111.024882) (xy 132.832707 111.023434) (xy 132.852904 111.018737) (xy 132.852905 111.018738) + (xy 132.868487 111.015115) (xy 132.868498 111.015112) (xy 132.877307 111.011126) (xy 132.890169 111.006351) + (xy 132.89267 111.005615) (xy 132.899436 111.003624) (xy 132.913609 110.996199) (xy 132.913608 110.996197) + (xy 132.93199 110.986568) (xy 132.932 110.986563) (xy 132.934516 110.985244) (xy 132.959327 110.974021) + (xy 132.968543 110.967424) (xy 132.978592 110.962161) (xy 132.978598 110.962157) (xy 132.997555 110.946861) + (xy 133.002098 110.943408) (xy 133.03198 110.922023) (xy 133.031981 110.922021) (xy 133.031998 110.92201) + (xy 133.032003 110.922006) (xy 133.043317 110.90994) (xy 133.056185 110.899558) (xy 133.066437 110.887276) + (xy 133.065389 110.886401) (xy 133.100193 110.849285) (xy 133.102548 110.845501) (xy 133.110603 110.834367) + (xy 133.113451 110.830956) (xy 133.113452 110.830955) (xy 133.152538 110.766962) (xy 133.152546 110.766944) + (xy 133.164821 110.737995) (xy 133.164825 110.737984) (xy 133.166394 110.734283) (xy 133.166395 110.734284) + (xy 133.170059 110.725645) (xy 133.170066 110.725625) (xy 133.170507 110.724586) (xy 133.17056 110.724457) + (xy 133.173793 110.716831) (xy 133.176333 110.708562) (xy 133.17871 110.702092) (xy 133.614658 109.307052) + (xy 133.623924 109.293991) (xy 133.628808 109.278738) (xy 133.641183 109.269665) (xy 133.650061 109.257152) + (xy 133.665235 109.252031) (xy 133.678153 109.242561) (xy 133.693496 109.242494) (xy 133.708035 109.237589) + (xy 133.723321 109.242366) (xy 133.739338 109.242297) (xy 133.751633 109.251213) (xy 133.766435 109.255839) + (xy 133.788992 109.278048) (xy 133.789276 109.278436) (xy 133.807266 109.303328) (xy 133.808258 109.304345) + (xy 133.808265 109.304337) (xy 133.80969 109.30628) (xy 133.811037 109.307921) (xy 133.84016 109.337045) + (xy 133.840161 109.337045) (xy 133.840565 109.337449) (xy 133.869731 109.367335) (xy 133.869747 109.367351) + (xy 133.872041 109.368924) (xy 133.873227 109.37011) (xy 133.873227 109.370111) (xy 133.874235 109.371119) + (xy 133.913266 109.397198) (xy 133.951961 109.423736) (xy 133.953268 109.424296) (xy 133.953391 109.424007) + (xy 133.957126 109.426503) (xy 133.958456 109.427054) (xy 133.958458 109.427055) (xy 133.995144 109.44225) + (xy 133.996196 109.442693) (xy 134.034082 109.458931) (xy 134.034144 109.458957) (xy 134.034153 109.458959) + (xy 134.038298 109.460254) (xy 134.039641 109.460686) (xy 134.039668 109.460692) (xy 134.039671 109.460694) + (xy 134.112426 109.478922) (xy 134.157112 109.483323) (xy 134.182154 109.484553) (xy 134.182171 109.484553) + (xy 135.189972 109.484553) (xy 135.189989 109.484553) (xy 135.215031 109.483323) (xy 135.259717 109.478922) + (xy 135.33245 109.460703) (xy 135.410547 109.428354) (xy 135.414206 109.427045) (xy 135.415019 109.426502) + (xy 135.41502 109.426502) (xy 135.49791 109.371117) (xy 135.561106 109.307921) (xy 135.561106 109.30792) + (xy 135.561108 109.307916) (xy 135.563434 109.305591) (xy 135.566524 109.299811) (xy 135.579831 109.279896) + (xy 135.616491 109.22503) (xy 135.650692 109.142461) (xy 135.670141 109.044686) (xy 135.670141 108.955314) + (xy 135.650692 108.857539) (xy 135.618345 108.779448) (xy 135.617034 108.775783) (xy 135.616491 108.77497) + (xy 135.616491 108.774969) (xy 135.561106 108.692079) (xy 135.49791 108.628883) (xy 135.497909 108.628883) + (xy 135.49558 108.626554) (xy 135.489801 108.623465) (xy 135.415016 108.573496) (xy 135.332451 108.539297) + (xy 135.332448 108.539296) (xy 135.259713 108.521077) (xy 135.215039 108.516677) (xy 135.201675 108.516021) + (xy 135.189989 108.515447) (xy 135.189982 108.515447) (xy 134.577238 108.515447) (xy 134.519047 108.49654) + (xy 134.485319 108.453215) (xy 134.317727 108.034234) (xy 159.4745 108.034234) (xy 159.4745 108.185766) + (xy 159.494362 108.259891) (xy 159.51372 108.332139) (xy 159.589481 108.46336) (xy 159.589483 108.463362) + (xy 159.589485 108.463365) (xy 159.696635 108.570515) (xy 159.696637 108.570516) (xy 159.696639 108.570518) + (xy 159.827861 108.646279) (xy 159.827859 108.646279) (xy 159.827863 108.64628) (xy 159.827865 108.646281) + (xy 159.974234 108.6855) (xy 159.974236 108.6855) (xy 160.125764 108.6855) (xy 160.125766 108.6855) + (xy 160.272135 108.646281) (xy 160.272137 108.646279) (xy 160.272139 108.646279) (xy 160.40336 108.570518) + (xy 160.40336 108.570517) (xy 160.403365 108.570515) (xy 160.510515 108.463365) (xy 160.510518 108.46336) + (xy 160.586279 108.332139) (xy 160.586279 108.332137) (xy 160.586281 108.332135) (xy 160.6255 108.185766) + (xy 160.6255 108.034234) (xy 160.586281 107.887865) (xy 160.586279 107.887862) (xy 160.586279 107.88786) + (xy 160.510518 107.756639) (xy 160.510516 107.756637) (xy 160.510515 107.756635) (xy 160.403365 107.649485) + (xy 160.403362 107.649483) (xy 160.40336 107.649481) (xy 160.272138 107.57372) (xy 160.27214 107.57372) + (xy 160.215347 107.558503) (xy 160.125766 107.5345) (xy 159.974234 107.5345) (xy 159.884652 107.558503) + (xy 159.82786 107.57372) (xy 159.696639 107.649481) (xy 159.589481 107.756639) (xy 159.51372 107.88786) + (xy 159.491793 107.969693) (xy 159.4745 108.034234) (xy 134.317727 108.034234) (xy 134.082322 107.445722) + (xy 134.07188 107.42293) (xy 134.066398 107.412365) (xy 134.051203 107.383083) (xy 134.051201 107.383079) + (xy 134.051198 107.383074) (xy 134.03734 107.363904) (xy 134.037024 107.3633) (xy 134.037024 107.363299) + (xy 134.035859 107.361856) (xy 134.007274 107.322312) (xy 133.999031 107.313865) (xy 133.99138 107.306025) + (xy 133.99138 107.306024) (xy 133.988116 107.302679) (xy 133.974426 107.285711) (xy 133.95894 107.272784) + (xy 133.94485 107.258346) (xy 133.944847 107.258343) (xy 133.930719 107.248652) (xy 133.923281 107.243017) + (xy 133.905818 107.22844) (xy 133.905817 107.228439) (xy 133.883557 107.2163) (xy 133.862648 107.201957) + (xy 133.851799 107.197307) (xy 133.851217 107.198664) (xy 133.833345 107.188918) (xy 133.818303 107.180716) + (xy 133.818299 107.180714) (xy 133.803863 107.176202) (xy 133.794418 107.172713) (xy 133.78049 107.166745) + (xy 133.780487 107.166744) (xy 133.780484 107.166743) (xy 133.763704 107.163192) (xy 133.754677 107.160832) + (xy 133.732996 107.154057) (xy 133.73299 107.154056) (xy 133.712795 107.151895) (xy 133.702837 107.150313) + (xy 133.692652 107.148158) (xy 133.682964 107.146108) (xy 133.682968 107.146108) (xy 133.679806 107.146069) + (xy 133.671159 107.145964) (xy 133.671158 107.145964) (xy 133.660231 107.145831) (xy 133.65556 107.145773) + (xy 133.633875 107.143455) (xy 133.613775 107.145263) (xy 133.608718 107.145202) (xy 133.608717 107.145201) + (xy 133.593587 107.145018) (xy 133.576729 107.148158) (xy 133.567491 107.149431) (xy 133.544843 107.151471) + (xy 133.52538 107.157198) (xy 133.51557 107.159548) (xy 133.495618 107.163264) (xy 133.495606 107.163268) + (xy 133.474473 107.17172) (xy 133.470139 107.173453) (xy 133.449221 107.179609) (xy 133.43136 107.188963) + (xy 133.42667 107.19084) (xy 133.426664 107.190844) (xy 133.412607 107.196467) (xy 133.412594 107.196474) + (xy 133.398235 107.205817) (xy 133.390188 107.210529) (xy 133.370039 107.221084) (xy 133.370039 107.221085) + (xy 133.354243 107.233828) (xy 133.346083 107.239751) (xy 133.329058 107.25083) (xy 133.312766 107.266728) + (xy 133.309424 107.269989) (xy 133.292461 107.283676) (xy 133.279533 107.299161) (xy 133.275916 107.302692) + (xy 133.26509 107.313257) (xy 133.255389 107.327398) (xy 133.249759 107.334828) (xy 133.235174 107.352301) + (xy 133.235168 107.35231) (xy 133.21111 107.391699) (xy 133.209739 107.393943) (xy 133.208706 107.39545) + (xy 133.208437 107.396074) (xy 133.206497 107.399252) (xy 133.206493 107.39926) (xy 133.196103 107.416273) + (xy 133.196101 107.416275) (xy 133.178575 107.457606) (xy 133.169925 107.48116) (xy 132.893346 108.36621) + (xy 132.857943 108.416113) (xy 132.799969 108.435675) (xy 132.741569 108.417425) (xy 132.705049 108.368333) + (xy 132.702426 108.359106) (xy 132.679352 108.259887) (xy 132.271958 106.508087) (xy 132.265088 106.483977) + (xy 132.257766 106.462365) (xy 132.257765 106.462365) (xy 132.250311 106.440364) (xy 132.244555 106.434748) + (xy 132.239363 106.42309) (xy 132.232543 106.404659) (xy 132.230911 106.402001) (xy 132.230235 106.4009) + (xy 132.230224 106.400884) (xy 132.193176 106.353937) (xy 132.193175 106.353936) (xy 132.110287 106.298552) + (xy 132.110286 106.298551) (xy 132.110285 106.298551) (xy 132.012509 106.279102) (xy 131.58719 106.279102) + (xy 131.587185 106.279102) (xy 131.587175 106.279103) (xy 131.529309 106.285744) (xy 131.529303 106.285745) + (xy 131.438482 106.326837) (xy 131.43848 106.326839) (xy 131.370292 106.399563) (xy 131.368774 106.402001) + (xy 131.361855 106.420348) (xy 131.352868 106.43158) (xy 131.335745 106.481108) (xy 131.328731 106.505159) + (xy 131.093543 107.488671) (xy 130.938381 108.137529) (xy 130.93838 108.137534) (xy 130.860949 108.461336) + (xy 130.85538 108.477954) (xy 130.853813 108.481538) (xy 130.836723 108.513514) (xy 130.780046 108.650343) + (xy 130.779651 108.651248) (xy 130.759947 108.673437) (xy 130.740662 108.696017) (xy 130.739688 108.69625) + (xy 130.739025 108.696998) (xy 130.710047 108.703366) (xy 130.681167 108.7103) (xy 130.680242 108.709917) + (xy 130.679265 108.710132) (xy 130.652068 108.698246) (xy 130.624639 108.686885) (xy 130.62405 108.686002) + (xy 130.6232 108.685631) (xy 130.618781 108.678098) (xy 130.594716 108.641998) (xy 130.471456 108.259891) + (xy 130.337106 107.843406) (xy 130.328246 107.81995) (xy 130.32824 107.819934) (xy 130.304776 107.765981) + (xy 130.299821 107.761896) (xy 130.299419 107.761259) (xy 130.282897 107.734758) (xy 130.27923 107.72835) + (xy 130.277736 107.725496) (xy 130.277734 107.725493) (xy 130.276204 107.723161) (xy 130.271861 107.717054) + (xy 130.270669 107.715142) (xy 130.270668 107.715141) (xy 130.24659 107.686829) (xy 130.246376 107.686577) + (xy 130.245655 107.685723) (xy 130.221628 107.655935) (xy 130.217772 107.652715) (xy 130.214475 107.648812) + (xy 130.212771 107.647062) (xy 130.195035 107.63302) (xy 130.179613 107.620809) (xy 130.177628 107.619195) + (xy 130.145116 107.592046) (xy 130.142458 107.590596) (xy 130.142457 107.590596) (xy 130.139237 107.58884) + (xy 130.134615 107.58518) (xy 130.100388 107.567649) (xy 130.099248 107.567027) (xy 130.066635 107.549238) + (xy 130.062167 107.547343) (xy 130.062226 107.547202) (xy 130.059602 107.54613) (xy 130.059572 107.546208) + (xy 130.055049 107.544427) (xy 130.055046 107.544426) (xy 130.049588 107.542874) (xy 130.014467 107.532889) + (xy 130.011997 107.532152) (xy 129.990157 107.525323) (xy 129.971549 107.519504) (xy 129.971545 107.519503) + (xy 129.971534 107.519501) (xy 129.96485 107.518785) (xy 129.959184 107.517175) (xy 129.920882 107.514077) + (xy 129.919631 107.513944) (xy 129.919588 107.51394) (xy 129.88262 107.509983) (xy 129.877771 107.509942) + (xy 129.877772 107.509792) (xy 129.874879 107.509805) (xy 129.874881 107.50988) (xy 129.870018 107.509966) + (xy 129.828105 107.514844) (xy 129.825514 107.515111) (xy 129.783434 107.518888) (xy 129.783425 107.51889) + (xy 129.782558 107.519144) (xy 129.780522 107.519743) (xy 129.776934 107.520798) (xy 129.771074 107.521481) + (xy 129.734526 107.533269) (xy 129.733257 107.533643) (xy 129.733253 107.533645) (xy 129.697596 107.544133) + (xy 129.693091 107.545955) (xy 129.693034 107.545814) (xy 129.690423 107.546909) (xy 129.690456 107.546984) + (xy 129.685986 107.548928) (xy 129.649054 107.569509) (xy 129.646788 107.570734) (xy 129.609307 107.590359) + (xy 129.604076 107.594578) (xy 129.598933 107.597445) (xy 129.569681 107.62232) (xy 129.568636 107.623164) + (xy 129.568617 107.623181) (xy 129.539725 107.646486) (xy 129.539707 107.646503) (xy 129.538183 107.648154) + (xy 129.538184 107.648155) (xy 129.532439 107.654384) (xy 129.532246 107.654157) (xy 129.53079 107.655396) + (xy 129.526436 107.660894) (xy 129.523901 107.663644) (xy 129.523897 107.66365) (xy 129.503016 107.686299) + (xy 129.497037 107.689657) (xy 129.488119 107.702764) (xy 129.488111 107.702776) (xy 129.463762 107.738546) + (xy 129.463646 107.738725) (xy 129.450568 107.76013) (xy 129.450558 107.760148) (xy 129.066719 108.463853) + (xy 129.022255 108.505885) (xy 128.979807 108.515447) (xy 128.41001 108.515447) (xy 128.399993 108.515939) + (xy 128.384959 108.516677) (xy 128.340286 108.521077) (xy 128.340283 108.521077) (xy 128.26755 108.539296) + (xy 128.267547 108.539297) (xy 128.189477 108.571635) (xy 128.185796 108.572951) (xy 128.102092 108.62888) + (xy 128.036562 108.69441) (xy 128.033475 108.700186) (xy 127.983508 108.774969) (xy 127.983507 108.774969) + (xy 127.949307 108.857537) (xy 127.938298 108.912885) (xy 127.929858 108.955314) (xy 122.725588 108.955314) + (xy 122.750084 108.912885) (xy 122.7876 108.772875) (xy 122.7876 108.627925) (xy 122.750084 108.487915) + (xy 122.750082 108.487912) (xy 122.750082 108.48791) (xy 122.677612 108.362389) (xy 122.67761 108.362387) + (xy 122.677609 108.362385) (xy 122.575115 108.259891) (xy 122.575112 108.259889) (xy 122.57511 108.259887) + (xy 122.449588 108.187417) (xy 122.449589 108.187417) (xy 122.419996 108.179487) (xy 122.309575 108.1499) + (xy 122.164625 108.1499) (xy 122.10289 108.166441) (xy 122.02461 108.187417) (xy 121.899089 108.259887) + (xy 121.796587 108.362389) (xy 121.724117 108.48791) (xy 121.6866 108.627925) (xy 121.6866 108.71421) + (xy 121.667693 108.772401) (xy 121.657604 108.784214) (xy 119.368314 111.073504) (xy 119.313797 111.101281) + (xy 119.29831 111.1025) (xy 108.192832 111.1025) (xy 108.134641 111.083593) (xy 108.122829 111.073504) + (xy 108.061815 111.012491) (xy 108.06181 111.012487) (xy 107.936288 110.940017) (xy 107.936289 110.940017) + (xy 107.869086 110.92201) (xy 107.796275 110.9025) (xy 107.651325 110.9025) (xy 107.58959 110.919041) + (xy 107.51131 110.940017) (xy 107.4049 111.001454) (xy 107.345052 111.014176) (xy 107.289156 110.989289) + (xy 107.258563 110.936301) (xy 107.2564 110.915718) (xy 107.2564 110.379789) (xy 107.275307 110.321598) + (xy 107.28539 110.309791) (xy 107.60277 109.992412) (xy 107.648914 109.912488) (xy 107.657563 109.88021) + (xy 107.664403 109.854686) (xy 107.672799 109.823346) (xy 107.6728 109.823343) (xy 107.6728 109.473331) + (xy 107.691707 109.41514) (xy 107.70179 109.403333) (xy 107.762809 109.342315) (xy 107.764125 109.340035) + (xy 107.835282 109.216789) (xy 107.835282 109.216787) (xy 107.835284 109.216785) (xy 107.8728 109.076775) + (xy 107.8728 108.931825) (xy 107.835284 108.791815) (xy 107.835282 108.791812) (xy 107.835282 108.79181) + (xy 107.762812 108.666289) (xy 107.76281 108.666287) (xy 107.762809 108.666285) (xy 107.660315 108.563791) + (xy 107.660312 108.563789) (xy 107.66031 108.563787) (xy 107.534788 108.491317) (xy 107.534789 108.491317) + (xy 107.452774 108.469341) (xy 107.394775 108.4538) (xy 107.249825 108.4538) (xy 107.191826 108.469341) + (xy 107.10981 108.491317) (xy 106.984289 108.563787) (xy 106.881787 108.666289) (xy 106.809317 108.79181) + (xy 106.7718 108.931825) (xy 106.7718 109.0506) (xy 106.752893 109.108791) (xy 106.703393 109.144755) + (xy 106.6728 109.1496) (xy 106.532525 109.1496) (xy 106.520165 109.152912) (xy 106.39251 109.187117) + (xy 106.266989 109.259587) (xy 106.164487 109.362089) (xy 106.092017 109.48761) (xy 106.0545 109.627625) + (xy 106.0545 109.756197) (xy 106.051127 109.781818) (xy 106.0442 109.80767) (xy 106.0442 111.694799) + (xy 106.025293 111.75299) (xy 106.015204 111.764803) (xy 104.876503 112.903504) (xy 104.821986 112.931281) + (xy 104.806499 112.9325) (xy 103.687831 112.9325) (xy 103.62964 112.913593) (xy 103.617833 112.903509) + (xy 103.606815 112.892491) (xy 103.606812 112.892489) (xy 103.60681 112.892487) (xy 103.481288 112.820017) + (xy 103.481289 112.820017) (xy 103.451696 112.812087) (xy 103.341275 112.7825) (xy 103.196325 112.7825) + (xy 103.13459 112.799041) (xy 103.05631 112.820017) (xy 102.930789 112.892487) (xy 102.828287 112.994989) + (xy 102.755817 113.12051) (xy 102.755816 113.120515) (xy 102.7183 113.260525) (xy 102.7183 113.405475) + (xy 102.724734 113.429485) (xy 102.755817 113.545489) (xy 102.828287 113.67101) (xy 102.828289 113.671012) + (xy 102.828291 113.671015) (xy 102.930785 113.773509) (xy 102.930787 113.77351) (xy 102.930789 113.773512) + (xy 103.056311 113.845982) (xy 103.056312 113.845982) (xy 103.056315 113.845984) (xy 103.196325 113.8835) + (xy 103.196326 113.8835) (xy 103.341274 113.8835) (xy 103.341275 113.8835) (xy 103.481285 113.845984) + (xy 103.481287 113.845982) (xy 103.481289 113.845982) (xy 103.60681 113.773512) (xy 103.60681 113.773511) + (xy 103.606815 113.773509) (xy 103.617829 113.762494) (xy 103.672344 113.734719) (xy 103.687831 113.7335) + (xy 105.066125 113.7335) (xy 105.066127 113.7335) (xy 105.167988 113.706207) (xy 105.16799 113.706205) + (xy 105.167992 113.706205) (xy 105.259308 113.653483) (xy 105.259308 113.653482) (xy 105.259313 113.65348) + (xy 106.76518 112.147613) (xy 106.766463 112.145391) (xy 106.767828 112.144161) (xy 106.769131 112.142464) + (xy 106.769445 112.142705) (xy 106.811932 112.10445) (xy 106.872782 112.098053) (xy 106.922204 112.124886) + (xy 116.072788 121.27547) (xy 116.07279 121.275471) (xy 116.142077 121.315475) (xy 116.142086 121.315478) + (xy 116.142088 121.31548) (xy 116.152712 121.321614) (xy 116.241856 121.3455) (xy 129.653168 121.3455) + (xy 129.711359 121.364407) (xy 129.723171 121.374496) (xy 129.784184 121.435508) (xy 129.784189 121.435512) + (xy 129.909711 121.507982) (xy 129.909712 121.507982) (xy 129.909715 121.507984) (xy 129.909717 121.507984) + (xy 129.912252 121.509035) (xy 129.91375 121.510314) (xy 129.915334 121.511229) (xy 129.915164 121.511522) + (xy 129.958779 121.54877) (xy 129.973064 121.608264) (xy 129.949651 121.664793) (xy 129.897483 121.696764) + (xy 129.874369 121.6995) (xy 102.00355 121.6995) (xy 101.996485 121.699248) (xy 101.917222 121.693577) + (xy 101.765201 121.6827) (xy 101.751222 121.68069) (xy 101.716895 121.673222) (xy 101.528126 121.632154) + (xy 101.514574 121.628175) (xy 101.300644 121.548381) (xy 101.287796 121.542513) (xy 101.22049 121.505761) + (xy 101.087402 121.433087) (xy 101.075527 121.425456) (xy 100.892749 121.288629) (xy 100.882074 121.27938) + (xy 100.720619 121.117925) (xy 100.71137 121.10725) (xy 100.681594 121.067474) (xy 100.574541 120.924468) + (xy 100.566914 120.912601) (xy 100.457484 120.7122) (xy 100.451618 120.699355) (xy 100.446508 120.685656) + (xy 100.371824 120.485425) (xy 100.367845 120.471873) (xy 100.355567 120.415437) (xy 100.319307 120.248765) + (xy 100.317299 120.234808) (xy 100.300752 120.003514) (xy 100.3005 119.99645) (xy 100.3005 115.389774) + (xy 103.5995 115.389774) (xy 103.5995 115.610225) (xy 103.633984 115.827948) (xy 103.702102 116.037599) + (xy 103.702104 116.037602) (xy 103.702105 116.037606) (xy 103.802185 116.234022) (xy 103.931758 116.412365) + (xy 104.087635 116.568242) (xy 104.265978 116.697815) (xy 104.462394 116.797895) (xy 104.672049 116.866015) + (xy 104.75914 116.879809) (xy 104.889775 116.9005) (xy 104.889778 116.9005) (xy 105.110225 116.9005) + (xy 105.219086 116.883257) (xy 105.327951 116.866015) (xy 105.537606 116.797895) (xy 105.734022 116.697815) + (xy 105.912365 116.568242) (xy 106.068242 116.412365) (xy 106.197815 116.234022) (xy 106.297895 116.037606) + (xy 106.366015 115.827951) (xy 106.4005 115.610222) (xy 106.4005 115.389778) (xy 106.4005 115.389774) + (xy 106.372392 115.212312) (xy 106.366015 115.172049) (xy 106.297895 114.962394) (xy 106.197815 114.765978) + (xy 106.068242 114.587635) (xy 105.912365 114.431758) (xy 105.734022 114.302185) (xy 105.734021 114.302184) + (xy 105.734019 114.302183) (xy 105.618582 114.243365) (xy 105.537606 114.202105) (xy 105.537602 114.202104) + (xy 105.537599 114.202102) (xy 105.327948 114.133984) (xy 105.110225 114.0995) (xy 105.110222 114.0995) + (xy 104.889778 114.0995) (xy 104.889775 114.0995) (xy 104.672051 114.133984) (xy 104.4624 114.202102) + (xy 104.26598 114.302183) (xy 104.199457 114.350515) (xy 104.087635 114.431758) (xy 103.931758 114.587635) + (xy 103.866971 114.676806) (xy 103.802183 114.76598) (xy 103.702102 114.9624) (xy 103.633984 115.172051) + (xy 103.5995 115.389774) (xy 100.3005 115.389774) (xy 100.3005 112.342523) (xy 100.319407 112.284332) + (xy 100.367351 112.248889) (xy 100.524195 112.195045) (xy 100.713744 112.092466) (xy 100.883823 111.960088) + (xy 101.029794 111.801521) (xy 101.147675 111.621091) (xy 101.234251 111.423719) (xy 101.287159 111.214789) + (xy 101.304957 111) (xy 101.287159 110.785211) (xy 101.234251 110.576281) (xy 101.232036 110.571232) + (xy 103.049478 110.571232) (xy 103.049478 110.571238) (xy 103.0495 110.649905) (xy 103.0495 111.349931) + (xy 103.049478 111.428761) (xy 103.049478 111.428767) (xy 103.073461 111.549485) (xy 103.08021 111.583457) + (xy 103.095793 111.621095) (xy 103.140541 111.729177) (xy 103.225547 111.856418) (xy 103.228155 111.860322) + (xy 103.339678 111.971845) (xy 103.470822 112.059458) (xy 103.616543 112.11979) (xy 103.771237 112.150522) + (xy 103.850075 112.1505) (xy 103.850097 112.1505) (xy 104.949903 112.1505) (xy 104.949925 112.1505) + (xy 105.028763 112.150522) (xy 105.183457 112.11979) (xy 105.329178 112.059458) (xy 105.460322 111.971845) + (xy 105.571845 111.860322) (xy 105.659458 111.729178) (xy 105.71979 111.583457) (xy 105.750522 111.428763) + (xy 105.7505 111.349904) (xy 105.7505 110.649904) (xy 105.750522 110.571237) (xy 105.71979 110.416543) + (xy 105.659458 110.270822) (xy 105.571845 110.139678) (xy 105.460322 110.028155) (xy 105.40682 109.992412) + (xy 105.329177 109.940541) (xy 105.243788 109.905188) (xy 105.183457 109.88021) (xy 105.183452 109.880209) + (xy 105.028764 109.849478) (xy 105.028763 109.849478) (xy 104.989333 109.849489) (xy 104.949903 109.8495) + (xy 103.850097 109.8495) (xy 103.771238 109.849478) (xy 103.771232 109.849478) (xy 103.616547 109.880209) + (xy 103.616543 109.88021) (xy 103.470822 109.940541) (xy 103.339681 110.028152) (xy 103.228152 110.139681) + (xy 103.140541 110.270822) (xy 103.08021 110.416543) (xy 103.080209 110.416547) (xy 103.049478 110.571232) + (xy 101.232036 110.571232) (xy 101.147675 110.378909) (xy 101.147672 110.378904) (xy 101.029797 110.198483) + (xy 101.029795 110.198481) (xy 101.029794 110.198479) (xy 100.883823 110.039912) (xy 100.822791 109.992409) + (xy 100.713747 109.907536) (xy 100.713744 109.907534) (xy 100.524199 109.804957) (xy 100.524198 109.804956) + (xy 100.524195 109.804955) (xy 100.410086 109.765781) (xy 100.367354 109.751111) (xy 100.318456 109.714333) + (xy 100.3005 109.657475) (xy 100.3005 106.389774) (xy 103.5995 106.389774) (xy 103.5995 106.610225) + (xy 103.633984 106.827948) (xy 103.702102 107.037599) (xy 103.702104 107.037602) (xy 103.702105 107.037606) + (xy 103.756038 107.143455) (xy 103.79934 107.22844) (xy 103.802185 107.234022) (xy 103.931758 107.412365) + (xy 104.087635 107.568242) (xy 104.265978 107.697815) (xy 104.462394 107.797895) (xy 104.672049 107.866015) + (xy 104.75914 107.879809) (xy 104.889775 107.9005) (xy 104.889778 107.9005) (xy 105.110225 107.9005) + (xy 105.219086 107.883257) (xy 105.327951 107.866015) (xy 105.537606 107.797895) (xy 105.734022 107.697815) + (xy 105.912365 107.568242) (xy 106.068242 107.412365) (xy 106.197815 107.234022) (xy 106.297895 107.037606) + (xy 106.366015 106.827951) (xy 106.4005 106.610222) (xy 106.4005 106.389778) (xy 106.4005 106.389774) + (xy 106.366015 106.172051) (xy 106.366015 106.172049) (xy 106.297895 105.962394) (xy 106.197815 105.765978) + (xy 106.068242 105.587635) (xy 105.912365 105.431758) (xy 105.734022 105.302185) (xy 105.734021 105.302184) + (xy 105.734019 105.302183) (xy 105.644825 105.256736) (xy 105.537606 105.202105) (xy 105.537602 105.202104) + (xy 105.537599 105.202102) (xy 105.327948 105.133984) (xy 105.110225 105.0995) (xy 105.110222 105.0995) + (xy 104.889778 105.0995) (xy 104.889775 105.0995) (xy 104.672051 105.133984) (xy 104.4624 105.202102) + (xy 104.26598 105.302183) (xy 104.176806 105.366971) (xy 104.087635 105.431758) (xy 103.931758 105.587635) + (xy 103.866971 105.676806) (xy 103.802183 105.76598) (xy 103.702102 105.9624) (xy 103.633984 106.172051) + (xy 103.5995 106.389774) (xy 100.3005 106.389774) (xy 100.3005 102.003549) (xy 100.300752 101.996485) + (xy 100.303778 101.954185) (xy 100.317299 101.765189) (xy 100.319306 101.751236) (xy 100.367846 101.528121) + (xy 100.371824 101.514574) (xy 100.383784 101.482509) (xy 100.451621 101.300635) (xy 100.457481 101.287805) + (xy 100.566918 101.087391) (xy 100.574536 101.075537) (xy 100.711377 100.89274) (xy 100.720612 100.882081) + (xy 100.882081 100.720612) (xy 100.89274 100.711377) (xy 101.075537 100.574536) (xy 101.087391 100.566918) + (xy 101.287805 100.457481) (xy 101.300635 100.451621) (xy 101.514577 100.371822) (xy 101.528121 100.367846) + (xy 101.751236 100.319306) (xy 101.765189 100.317299) (xy 101.976514 100.30218) (xy 101.996486 100.300752) + (xy 102.00355 100.3005) (xy 155.706767 100.3005) + ) + ) + ) + (embedded_fonts no) +) diff --git a/hardware/calibrator/calibrator.kicad_pro b/hardware/calibrator/calibrator.kicad_pro new file mode 100644 index 0000000..53dc51e --- /dev/null +++ b/hardware/calibrator/calibrator.kicad_pro @@ -0,0 +1,329 @@ +{ + "board": { + "3dviewports": [], + "design_settings": { + "defaults": { + "apply_defaults_to_fp_fields": false, + "apply_defaults_to_fp_shapes": false, + "apply_defaults_to_fp_text": false, + "board_outline_line_width": 0.05, + "copper_line_width": 0.2, + "copper_text_italic": false, + "copper_text_size_h": 1.5, + "copper_text_size_v": 1.5, + "copper_text_thickness": 0.3, + "copper_text_upright": false, + "courtyard_line_width": 0.05, + "dimension_precision": 4, + "dimension_units": 3, + "dimensions": { + "arrow_length": 1270000, + "extension_offset": 500000, + "keep_text_aligned": true, + "suppress_zeroes": true, + "text_position": 0, + "units_format": 0 + }, + "fab_line_width": 0.1, + "fab_text_italic": false, + "fab_text_size_h": 1.0, + "fab_text_size_v": 1.0, + "fab_text_thickness": 0.15, + "fab_text_upright": false, + "other_line_width": 0.1, + "other_text_italic": false, + "other_text_size_h": 1.0, + "other_text_size_v": 1.0, + "other_text_thickness": 0.15, + "other_text_upright": false, + "pads": { + "drill": 0.8, + "height": 1.27, + "width": 2.54 + }, + "silk_line_width": 0.12, + "silk_text_italic": false, + "silk_text_size_h": 0.8, + "silk_text_size_v": 0.8, + "silk_text_thickness": 0.12, + "silk_text_upright": false, + "zones": { + "min_clearance": 0.5 + } + }, + "diff_pair_dimensions": [], + "drc_exclusions": [], + "meta": { + "version": 2 + }, + "rule_severities": { + "annular_width": "error", + "clearance": "error", + "connection_width": "warning", + "copper_edge_clearance": "error", + "copper_sliver": "warning", + "courtyards_overlap": "error", + "creepage": "error", + "diff_pair_gap_out_of_range": "error", + "diff_pair_uncoupled_length_too_long": "error", + "drill_out_of_range": "error", + "duplicate_footprints": "warning", + "extra_footprint": "warning", + "footprint": "error", + "footprint_filters_mismatch": "ignore", + "footprint_symbol_mismatch": "warning", + "footprint_type_mismatch": "ignore", + "hole_clearance": "error", + "hole_to_hole": "warning", + "holes_co_located": "warning", + "invalid_outline": "error", + "isolated_copper": "warning", + "item_on_disabled_layer": "error", + "items_not_allowed": "error", + "length_out_of_range": "error", + "lib_footprint_issues": "ignore", + "lib_footprint_mismatch": "ignore", + "malformed_courtyard": "error", + "microvia_drill_out_of_range": "error", + "mirrored_text_on_front_layer": "warning", + "missing_courtyard": "ignore", + "missing_footprint": "warning", + "net_conflict": "warning", + "nonmirrored_text_on_back_layer": "warning", + "npth_inside_courtyard": "ignore", + "padstack": "warning", + "pth_inside_courtyard": "ignore", + "shorting_items": "error", + "silk_edge_clearance": "warning", + "silk_over_copper": "warning", + "silk_overlap": "ignore", + "skew_out_of_range": "error", + "solder_mask_bridge": "error", + "starved_thermal": "error", + "text_height": "warning", + "text_on_edge_cuts": "error", + "text_thickness": "warning", + "through_hole_pad_without_hole": "error", + "too_many_vias": "error", + "track_angle": "error", + "track_dangling": "warning", + "track_segment_length": "error", + "track_width": "error", + "tracks_crossing": "error", + "unconnected_items": "error", + "unresolved_variable": "error", + "via_dangling": "warning", + "zones_intersect": "error" + }, + "rules": { + "allow_blind_buried_vias": false, + "allow_microvias": false, + "max_error": 0.005, + "min_clearance": 0.15, + "min_connection": 0.0, + "min_copper_edge_clearance": 0.3, + "min_groove_width": 0.0, + "min_hole_clearance": 0.25, + "min_hole_to_hole": 0.5, + "min_microvia_diameter": 0.2, + "min_microvia_drill": 0.1, + "min_resolved_spokes": 1, + "min_silk_clearance": 0.0, + "min_text_height": 0.6, + "min_text_thickness": 0.1, + "min_through_hole_diameter": 0.3, + "min_track_width": 0.15, + "min_via_annular_width": 0.15, + "min_via_diameter": 0.6, + "solder_mask_to_copper_clearance": 0.0, + "use_height_for_length_calcs": true + }, + "teardrop_options": [ + { + "td_onpthpad": true, + "td_onroundshapesonly": false, + "td_onsmdpad": true, + "td_ontrackend": false, + "td_onvia": true + } + ], + "teardrop_parameters": [ + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_on_pad_in_zone": false, + "td_target_name": "td_round_shape", + "td_width_to_size_filter_ratio": 0.9 + }, + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_on_pad_in_zone": false, + "td_target_name": "td_rect_shape", + "td_width_to_size_filter_ratio": 0.9 + }, + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_on_pad_in_zone": false, + "td_target_name": "td_track_end", + "td_width_to_size_filter_ratio": 0.9 + } + ], + "track_widths": [ + 0.2, + 0.3, + 0.4 + ], + "tuning_pattern_settings": { + "diff_pair_defaults": { + "corner_radius_percentage": 80, + "corner_style": 1, + "max_amplitude": 1.0, + "min_amplitude": 0.2, + "single_sided": false, + "spacing": 1.0 + }, + "diff_pair_skew_defaults": { + "corner_radius_percentage": 80, + "corner_style": 1, + "max_amplitude": 1.0, + "min_amplitude": 0.2, + "single_sided": false, + "spacing": 0.6 + }, + "single_track_defaults": { + "corner_radius_percentage": 80, + "corner_style": 1, + "max_amplitude": 1.0, + "min_amplitude": 0.2, + "single_sided": false, + "spacing": 0.6 + } + }, + "via_dimensions": [ + { + "diameter": 0.6, + "drill": 0.3 + } + ], + "zones_allow_external_fillets": false + }, + "ipc2581": { + "dist": "", + "distpn": "", + "internal_id": "", + "mfg": "", + "mpn": "" + }, + "layer_pairs": [], + "layer_presets": [], + "viewports": [] + }, + "boards": [], + "cvpcb": { + "equivalence_files": [] + }, + "libraries": { + "pinned_footprint_libs": [], + "pinned_symbol_libs": [] + }, + "meta": { + "filename": "calibrator.kicad_pro", + "version": 3 + }, + "net_settings": { + "classes": [ + { + "bus_width": 12, + "clearance": 0.16, + "diff_pair_gap": 0.25, + "diff_pair_width": 0.2, + "line_style": 0, + "microvia_diameter": 0.3, + "microvia_drill": 0.1, + "name": "Default", + "pcb_color": "rgba(0, 0, 0, 0.000)", + "priority": 2147483647, + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.2, + "via_diameter": 0.6, + "via_drill": 0.3, + "wire_width": 6 + }, + { + "bus_width": 12, + "clearance": 0.16, + "diff_pair_gap": 0.25, + "diff_pair_width": 0.2, + "line_style": 0, + "microvia_diameter": 0.3, + "microvia_drill": 0.1, + "name": "Power", + "pcb_color": "rgba(0, 0, 0, 0.000)", + "priority": 0, + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.3, + "via_diameter": 0.6, + "via_drill": 0.3, + "wire_width": 6 + } + ], + "meta": { + "version": 4 + }, + "net_colors": null, + "netclass_assignments": null, + "netclass_patterns": [ + { + "netclass": "Power", + "pattern": "VBUS" + }, + { + "netclass": "Power", + "pattern": "GND" + }, + { + "netclass": "Power", + "pattern": "VDD" + }, + { + "netclass": "Power", + "pattern": "BUZ_N" + } + ] + }, + "pcbnew": { + "last_paths": { + "gencad": "", + "idf": "", + "netlist": "", + "plot": "", + "pos_files": "", + "specctra_dsn": "", + "step": "", + "svg": "", + "vrml": "" + }, + "page_layout_descr_file": "" + }, + "schematic": { + "legacy_lib_dir": "", + "legacy_lib_list": [], + "page_layout_descr_file": "" + }, + "sheets": [], + "text_variables": {} +} \ No newline at end of file diff --git a/hardware/calibrator/calibrator.kicad_sch b/hardware/calibrator/calibrator.kicad_sch new file mode 100644 index 0000000..816f2f0 --- /dev/null +++ b/hardware/calibrator/calibrator.kicad_sch @@ -0,0 +1,3165 @@ +(kicad_sch (version 20250114) (generator "eeschema") (generator_version "9.0") (uuid "0d2859e4-133c-5efb-a230-be56cb52e344") (paper "A4") + (title_block (title "AVsync calibrator") (date "2026-11-08") (rev "0.3") + (comment 1 "v1 proposal - not built or tested yet") + (comment 2 "Generated by scripts/gen_sch.py from scripts/design.py") + (comment 3 "SPDX-License-Identifier: CERN-OHL-P-2.0")) + (lib_symbols +(symbol "calibrator:CH32X035G8R6" (pin_names (offset 1.016)) (exclude_from_sim no) (in_bom yes) (on_board yes) + (property "Reference" "U" (at -10.16 16.51 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "CH32X035G8R6" (at 2.54 16.51 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Package_SO:QSOP-28_3.9x9.9mm_P0.635mm" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "https://www.wch.cn/products/CH32X035.html" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "WCH CH32X035G8R6, RISC-V, 62 KB flash, USB FS, 3 comparators, QSOP-28; pins grouped by use" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (symbol "CH32X035G8R6_0_1" (rectangle (start -15.24 15.24) (end 15.24 -27.94) (stroke (width 0.254) (type default)) (fill (type background)))) + (symbol "CH32X035G8R6_1_1" + (pin bidirectional line (at -17.78 12.7 0) (length 2.54) (name "PC16/UDM" (effects (font (size 1.27 1.27)))) (number "2" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 10.16 0) (length 2.54) (name "PC17/UDP/BOOT" (effects (font (size 1.27 1.27)))) (number "3" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 2.54 0) (length 2.54) (name "PA13/CMP3+" (effects (font (size 1.27 1.27)))) (number "5" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 0.0 0) (length 2.54) (name "PA0/ADC0" (effects (font (size 1.27 1.27)))) (number "9" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -2.54 0) (length 2.54) (name "PA2/CMP3-/ADC2" (effects (font (size 1.27 1.27)))) (number "11" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -7.62 0) (length 2.54) (name "PC19/SWCLK" (effects (font (size 1.27 1.27)))) (number "1" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -10.16 0) (length 2.54) (name "PC18/SWDIO" (effects (font (size 1.27 1.27)))) (number "28" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -12.7 0) (length 2.54) (name "PC14/PA12" (effects (font (size 1.27 1.27)))) (number "4" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -15.24 0) (length 2.54) (name "PC3" (effects (font (size 1.27 1.27)))) (number "8" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -17.78 0) (length 2.54) (name "PA1" (effects (font (size 1.27 1.27)))) (number "10" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -20.32 0) (length 2.54) (name "PA3" (effects (font (size 1.27 1.27)))) (number "12" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -22.86 0) (length 2.54) (name "PA6" (effects (font (size 1.27 1.27)))) (number "13" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -25.4 0) (length 2.54) (name "PB0" (effects (font (size 1.27 1.27)))) (number "14" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 12.7 180) (length 2.54) (name "PA4" (effects (font (size 1.27 1.27)))) (number "15" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 10.16 180) (length 2.54) (name "PA5" (effects (font (size 1.27 1.27)))) (number "16" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 5.08 180) (length 2.54) (name "PA7" (effects (font (size 1.27 1.27)))) (number "17" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 2.54 180) (length 2.54) (name "PB3/CMP3 out" (effects (font (size 1.27 1.27)))) (number "18" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 0.0 180) (length 2.54) (name "PB4" (effects (font (size 1.27 1.27)))) (number "19" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -2.54 180) (length 2.54) (name "PB1/PB5" (effects (font (size 1.27 1.27)))) (number "20" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -5.08 180) (length 2.54) (name "PB6" (effects (font (size 1.27 1.27)))) (number "21" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -7.62 180) (length 2.54) (name "PB7" (effects (font (size 1.27 1.27)))) (number "22" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -10.16 180) (length 2.54) (name "PB8" (effects (font (size 1.27 1.27)))) (number "23" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -12.7 180) (length 2.54) (name "PB9" (effects (font (size 1.27 1.27)))) (number "24" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -15.24 180) (length 2.54) (name "PB10" (effects (font (size 1.27 1.27)))) (number "25" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -17.78 180) (length 2.54) (name "PB11" (effects (font (size 1.27 1.27)))) (number "26" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -20.32 180) (length 2.54) (name "PB12" (effects (font (size 1.27 1.27)))) (number "27" (effects (font (size 1.27 1.27))))) + (pin power_in line (at 0.0 17.78 270) (length 2.54) (name "VDD" (effects (font (size 1.27 1.27)))) (number "6" (effects (font (size 1.27 1.27))))) + (pin power_in line (at 0.0 -30.48 90) (length 2.54) (name "GND" (effects (font (size 1.27 1.27)))) (number "7" (effects (font (size 1.27 1.27))))) + ) + (embedded_fonts no) + )(symbol "Connector:USB_C_Receptacle_USB2.0_16P" + (pin_names + (offset 1.016) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "J" + (at 0 22.225 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "USB_C_Receptacle_USB2.0_16P" + (at 0 19.685 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 3.81 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "https://www.usb.org/sites/default/files/documents/usb_type-c.zip" + (at 3.81 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "USB 2.0-only 16P Type-C Receptacle connector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "usb universal serial bus type-C USB2.0" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "USB*C*Receptacle*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "USB_C_Receptacle_USB2.0_16P_0_0" + (rectangle + (start -0.254 -17.78) + (end 0.254 -16.764) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 15.494) + (end 9.144 14.986) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 10.414) + (end 9.144 9.906) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 7.874) + (end 9.144 7.366) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 2.794) + (end 9.144 2.286) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 0.254) + (end 9.144 -0.254) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -2.286) + (end 9.144 -2.794) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -4.826) + (end 9.144 -5.334) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -12.446) + (end 9.144 -12.954) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start 10.16 -14.986) + (end 9.144 -15.494) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "USB_C_Receptacle_USB2.0_16P_0_1" + (rectangle + (start -10.16 17.78) + (end 10.16 -17.78) + (stroke + (width 0.254) + (type default) + ) + (fill + (type background) + ) + ) + (polyline + (pts + (xy -8.89 -3.81) (xy -8.89 3.81) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (rectangle + (start -7.62 -3.81) + (end -6.35 3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (arc + (start -7.62 3.81) + (mid -6.985 4.4423) + (end -6.35 3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -7.62 3.81) + (mid -6.985 4.4423) + (end -6.35 3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (arc + (start -8.89 3.81) + (mid -6.985 5.7067) + (end -5.08 3.81) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -5.08 -3.81) + (mid -6.985 -5.7067) + (end -8.89 -3.81) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -6.35 -3.81) + (mid -6.985 -4.4423) + (end -7.62 -3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start -6.35 -3.81) + (mid -6.985 -4.4423) + (end -7.62 -3.81) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy -5.08 3.81) (xy -5.08 -3.81) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center -2.54 1.143) + (radius 0.635) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy -1.27 4.318) (xy 0 6.858) (xy 1.27 4.318) (xy -1.27 4.318) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + (polyline + (pts + (xy 0 -2.032) (xy 2.54 0.508) (xy 2.54 1.778) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -3.302) (xy -2.54 -0.762) (xy -2.54 0.508) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 -5.842) (xy 0 4.318) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 0 -5.842) + (radius 1.27) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (rectangle + (start 1.905 1.778) + (end 3.175 3.048) + (stroke + (width 0.254) + (type default) + ) + (fill + (type outline) + ) + ) + ) + (symbol "USB_C_Receptacle_USB2.0_16P_1_1" + (pin passive line + (at -7.62 -22.86 90) + (length 5.08) + (name "SHIELD" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "S1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -22.86 90) + (length 5.08) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -22.86 90) + (length 5.08) + (hide yes) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -22.86 90) + (length 5.08) + (hide yes) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -22.86 90) + (length 5.08) + (hide yes) + (name "GND" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B12" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 15.24 15.24 180) + (length 5.08) + (name "VBUS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 15.24 15.24 180) + (length 5.08) + (hide yes) + (name "VBUS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 15.24 15.24 180) + (length 5.08) + (hide yes) + (name "VBUS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B4" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 15.24 15.24 180) + (length 5.08) + (hide yes) + (name "VBUS" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B9" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 10.16 180) + (length 5.08) + (name "CC1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 7.62 180) + (length 5.08) + (name "CC2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B5" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 2.54 180) + (length 5.08) + (name "D-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 0 180) + (length 5.08) + (name "D-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B7" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -2.54 180) + (length 5.08) + (name "D+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -5.08 180) + (length 5.08) + (name "D+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B6" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -12.7 180) + (length 5.08) + (name "SBU1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "A8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin bidirectional line + (at 15.24 -15.24 180) + (length 5.08) + (name "SBU2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "B8" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + )(symbol "Switch:SW_Push" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "SW" + (at 1.27 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "SW_Push" + (at 0 -1.524 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 5.08 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Push button switch, generic, two pins" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "switch normally-open pushbutton push-button" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "SW_Push_0_1" + (circle + (center -2.032 0) + (radius 0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 1.27) (xy 0 3.048) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 2.032 0) + (radius 0.508) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 2.54 1.27) (xy -2.54 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (pin passive line + (at -5.08 0 0) + (length 2.54) + (name "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 5.08 0 180) + (length 2.54) + (name "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + )(symbol "Device:R" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "R" + (at 2.032 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "R" + (at 0 0 90) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at -1.778 0 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "R res resistor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "R_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "R_0_1" + (rectangle + (start -1.016 -2.54) + (end 1.016 2.54) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "R_1_1" + (pin passive line + (at 0 3.81 270) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 1.27) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + )(symbol "Device:C" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0.254) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "C" + (at 0.635 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "C" + (at 0.635 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 0.9652 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Unpolarized capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "cap capacitor" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "C_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "C_0_1" + (polyline + (pts + (xy -2.032 0.762) (xy 2.032 0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -2.032 -0.762) (xy 2.032 -0.762) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "C_1_1" + (pin passive line + (at 0 3.81 270) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 0 -3.81 90) + (length 2.794) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + )(symbol "Device:Buzzer" + (pin_names + (offset 0.0254) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "BZ" + (at 3.81 1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Buzzer" + (at 3.81 -1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at -0.635 2.54 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at -0.635 2.54 90) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Buzzer, polarized" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "quartz resonator ceramic" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "*Buzzer*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Buzzer_0_1" + (polyline + (pts + (xy -1.651 1.905) (xy -1.143 1.905) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.397 2.159) (xy -1.397 1.651) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (arc + (start 0 3.175) + (mid 3.1612 0) + (end 0 -3.175) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 3.175) (xy 0 -3.175) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Buzzer_1_1" + (pin passive line + (at -2.54 2.54 0) + (length 2.54) + (name "+" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at -2.54 -2.54 0) + (length 2.54) + (name "-" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + )(symbol "Device:D" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "D" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "D" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "TO-???* *_Diode_* *SingleDiode* D_*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "D_0_1" + (polyline + (pts + (xy -1.27 1.27) (xy -1.27 -1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 1.27) (xy 1.27 -1.27) (xy -1.27 0) (xy 1.27 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 0) (xy -1.27 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "D_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "K" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + )(symbol "Transistor_BJT:Q_NPN_BEC" + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "Q" + (at 5.08 1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Q_NPN_BEC" + (at 5.08 -1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 5.08 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "NPN transistor, base/emitter/collector" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Device" "NPN" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=B 2=E 3=C" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "BJT" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Q_NPN_BEC_0_1" + (polyline + (pts + (xy -2.54 0) (xy 0.635 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.635 1.905) (xy 0.635 -1.905) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 1.27 0) + (radius 2.8194) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "Q_NPN_BEC_1_1" + (polyline + (pts + (xy 0.635 0.635) (xy 2.54 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.635 -0.635) (xy 2.54 -2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 -1.778) (xy 1.778 -1.27) (xy 2.286 -2.286) (xy 1.27 -1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + (pin input line + (at -5.08 0 0) + (length 2.54) + (name "B" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 5.08 270) + (length 2.54) + (name "C" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "3" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 -5.08 90) + (length 2.54) + (name "E" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + )(symbol "Device:LED" + (pin_numbers + (hide yes) + ) + (pin_names + (offset 1.016) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "D" + (at 0 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Value" "LED" + (at 0 -2.54 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Light emitting diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Sim.Pins" "1=K 2=A" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "LED diode" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_fp_filters" "LED* LED_SMD:* LED_THT:*" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "LED_0_1" + (polyline + (pts + (xy -3.048 -0.762) (xy -4.572 -2.286) (xy -3.81 -2.286) (xy -4.572 -2.286) (xy -4.572 -1.524) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.778 -0.762) (xy -3.302 -2.286) (xy -2.54 -2.286) (xy -3.302 -2.286) (xy -3.302 -1.524) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 0) (xy 1.27 0) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 -1.27) (xy -1.27 1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 -1.27) (xy 1.27 1.27) (xy -1.27 0) (xy 1.27 -1.27) + ) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "LED_1_1" + (pin passive line + (at -3.81 0 0) + (length 2.54) + (name "K" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 3.81 0 180) + (length 2.54) + (name "A" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + )(symbol "Device:Q_Photo_NPN" + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "Q" + (at 5.08 1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Value" "Q_Photo_NPN" + (at 5.08 -1.27 0) + (effects + (font + (size 1.27 1.27) + ) + (justify left) + ) + ) + (property "Footprint" "" + (at 5.08 2.54 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "NPN phototransistor, collector/emitter" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "phototransistor NPN" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "Q_Photo_NPN_0_1" + (polyline + (pts + (xy -3.81 3.175) (xy -1.905 1.27) (xy -1.905 1.905) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -3.175 4.445) (xy -1.27 2.54) (xy -1.27 3.175) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.905 1.27) (xy -2.54 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy -1.27 2.54) (xy -1.905 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.635 1.905) (xy 0.635 -1.905) (xy 0.635 -1.905) + ) + (stroke + (width 0.508) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.635 0.635) (xy 2.54 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0.635 -0.635) (xy 2.54 -2.54) (xy 2.54 -2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (circle + (center 1.27 0) + (radius 2.8194) + (stroke + (width 0.254) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 1.27 -1.778) (xy 1.778 -1.27) (xy 2.286 -2.286) (xy 1.27 -1.778) (xy 1.27 -1.778) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type outline) + ) + ) + ) + (symbol "Q_Photo_NPN_1_1" + (pin passive line + (at 2.54 5.08 270) + (length 2.54) + (name "C" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + (pin passive line + (at 2.54 -5.08 90) + (length 2.54) + (name "E" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "2" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + )(symbol "power:PWR_FLAG" + (power) + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#FLG" + (at 0 1.905 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "PWR_FLAG" + (at 0 3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "~" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Special symbol for telling ERC where power comes from" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "flag power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "PWR_FLAG_0_0" + (pin power_out line + (at 0 0 90) + (length 0) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (symbol "PWR_FLAG_0_1" + (polyline + (pts + (xy 0 0) (xy 0 1.27) (xy -1.016 1.905) (xy 0 2.54) (xy 1.016 1.905) (xy 0 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (embedded_fonts no) + )(symbol "power:GND" + (power) + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -6.35 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "GND" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"GND\" , ground" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "GND_0_1" + (polyline + (pts + (xy 0 0) (xy 0 -1.27) (xy 1.27 -1.27) (xy 0 -2.54) (xy -1.27 -1.27) (xy 0 -1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "GND_1_1" + (pin power_in line + (at 0 0 270) + (length 0) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + )(symbol "power:VDD" + (power) + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "VDD" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"VDD\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "VDD_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "VDD_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + )(symbol "power:VBUS" + (power) + (pin_numbers + (hide yes) + ) + (pin_names + (offset 0) + (hide yes) + ) + (exclude_from_sim no) + (in_bom yes) + (on_board yes) + (property "Reference" "#PWR" + (at 0 -3.81 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Value" "VBUS" + (at 0 3.556 0) + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "Description" "Power symbol creates a global label with name \"VBUS\"" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (property "ki_keywords" "global power" + (at 0 0 0) + (effects + (font + (size 1.27 1.27) + ) + (hide yes) + ) + ) + (symbol "VBUS_0_1" + (polyline + (pts + (xy -0.762 1.27) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 2.54) (xy 0.762 1.27) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + (polyline + (pts + (xy 0 0) (xy 0 2.54) + ) + (stroke + (width 0) + (type default) + ) + (fill + (type none) + ) + ) + ) + (symbol "VBUS_1_1" + (pin power_in line + (at 0 0 90) + (length 0) + (name "~" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (number "1" + (effects + (font + (size 1.27 1.27) + ) + ) + ) + ) + ) + (embedded_fonts no) + ) + ) + (rectangle (start 15.24 25.4) (end 101.6 104.14) (stroke (width 0.254) (type dash) (color 72 110 150 1)) (fill (type none)) (uuid "6fc7bc45-86c4-580f-82f0-bc8efcb9d5f5")) + (text "USB-C: power + update" (exclude_from_sim no) (at 16.51 29.209999999999997 0) (effects (font (size 1.8 1.8) (bold yes)) (justify left bottom)) (uuid "a615eac8-2286-5151-b682-cbfda6a422d2")) + (rectangle (start 101.6 71.12) (end 162.56 154.94) (stroke (width 0.254) (type dash) (color 72 110 150 1)) (fill (type none)) (uuid "4d37aabf-a28d-5ae8-b14c-340b613227cd")) + (text "Light sensors (display mode)" (exclude_from_sim no) (at 102.86999999999999 74.93 0) (effects (font (size 1.8 1.8) (bold yes)) (justify left bottom)) (uuid "da3d9840-93c3-591e-8437-d1ae3ef701be")) + (rectangle (start 162.56 25.4) (end 210.82 154.94) (stroke (width 0.254) (type dash) (color 72 110 150 1)) (fill (type none)) (uuid "e481ec6f-fd7c-5522-8fe7-9965497151cf")) + (text "MCU" (exclude_from_sim no) (at 163.83 29.209999999999997 0) (effects (font (size 1.8 1.8) (bold yes)) (justify left bottom)) (uuid "5844e9f0-15f4-53b7-9c3e-22596859fee5")) + (rectangle (start 210.82 25.4) (end 279.4 154.94) (stroke (width 0.254) (type dash) (color 72 110 150 1)) (fill (type none)) (uuid "c7274ec8-f631-5968-b2d1-68cd0fbc813e")) + (text "Flash + click (camera and display mode)" (exclude_from_sim no) (at 212.09 29.209999999999997 0) (effects (font (size 1.8 1.8) (bold yes)) (justify left bottom)) (uuid "771c5b8a-73f5-504a-a360-ad0f41415e6e")) + (text "5.1k on CC1/CC2 asks the phone for 5 V." (exclude_from_sim no) (at 17.78 107.95 0) (effects (font (size 1.27 1.27)) (justify left bottom)) (uuid "b864ee15-c4bc-59d2-8f8c-a95ced2f54b4")) + (text "D+/D- go only to the MCU. The firmware never turns USB on," (exclude_from_sim no) (at 17.78 110.49 0) (effects (font (size 1.27 1.27)) (justify left bottom)) (uuid "bd799cf5-9e03-5555-ab96-fe0917cd635c")) + (text "so a phone sees no device. R3 + C2/C3 filter spikes; C2/C3 sit at U1." (exclude_from_sim no) (at 17.78 113.03 0) (effects (font (size 1.27 1.27)) (justify left bottom)) (uuid "60e4abe4-9bf9-5241-a089-5d8e3a9e13c9")) + (text "Update: hold SW1 while plugging into a PC. The ROM bootloader starts" (exclude_from_sim no) (at 17.78 118.11 0) (effects (font (size 1.27 1.27)) (justify left bottom)) (uuid "94489469-456f-5509-878f-8e5997d2e6ca")) + (text "only at power-on with PC17 (D+) high; R9 limits the current into D+." (exclude_from_sim no) (at 17.78 120.65 0) (effects (font (size 1.27 1.27)) (justify left bottom)) (uuid "ed2d5539-e252-5024-ac0e-4369b9b93855")) + (text "Reverse-gullwing parts look down through holes. CMP3 (hysteresis)" (exclude_from_sim no) (at 104.14 158.75 0) (effects (font (size 1.27 1.27)) (justify left bottom)) (uuid "c58643cb-d473-5833-b57e-eaf4aaf5ad9d")) + (text "flips where A and B see the same light; ADC0/ADC2 read dark / light." (exclude_from_sim no) (at 104.14 161.29 0) (effects (font (size 1.27 1.27)) (justify left bottom)) (uuid "91b1a545-fad5-5cb7-82b8-c552aed05c32")) + (text "Reverse-mount white LED shines through a hole (~12 mA)." (exclude_from_sim no) (at 213.36 158.75 0) (effects (font (size 1.27 1.27)) (justify left bottom)) (uuid "20ff00a1-19ee-5a21-bf1d-ed73576784fd")) + (text "PA4 and PA5 are set by one register write." (exclude_from_sim no) (at 213.36 161.29 0) (effects (font (size 1.27 1.27)) (justify left bottom)) (uuid "45f2d268-f548-574e-a586-7c7b61f7843b")) + (text "D2 catches the coil kick; R6 keeps Q1 off during reset." (exclude_from_sim no) (at 213.36 163.83 0) (effects (font (size 1.27 1.27)) (justify left bottom)) (uuid "af96e05e-a2e2-5599-b316-4e20d52b3d39")) + (wire (pts (xy 50.8 50.8) (xy 55.88 50.8)) (stroke (width 0) (type default)) (uuid "afb6b126-86c4-5d27-bc4e-c797f5432228")) + (wire (pts (xy 55.88 50.8) (xy 55.88 35.56)) (stroke (width 0) (type default)) (uuid "f092d3d6-dab9-54e4-8ec8-3c7846652b45")) + (wire (pts (xy 55.88 35.56) (xy 63.5 35.56)) (stroke (width 0) (type default)) (uuid "b02aa2c9-6cc6-5496-9b82-c06c08b73250")) + (wire (pts (xy 63.5 35.56) (xy 68.58 35.56)) (stroke (width 0) (type default)) (uuid "ed7fa30c-df5f-5443-88e6-f7ceb934236f")) + (wire (pts (xy 63.5 35.56) (xy 63.5 39.370000000000005)) (stroke (width 0) (type default)) (uuid "1b9519c8-e430-5ed1-b741-d40d4869d571")) + (wire (pts (xy 76.2 35.56) (xy 83.82 35.56)) (stroke (width 0) (type default)) (uuid "a9b83d8c-4519-57fc-a01f-a2d0e9852ca8")) + (wire (pts (xy 83.82 35.56) (xy 91.44 35.56)) (stroke (width 0) (type default)) (uuid "42941b4a-aaca-59cc-beb3-dd662b634d59")) + (wire (pts (xy 91.44 35.56) (xy 99.06 35.56)) (stroke (width 0) (type default)) (uuid "522cf288-5006-59e8-8430-de70b907f183")) + (wire (pts (xy 83.82 35.56) (xy 83.82 39.370000000000005)) (stroke (width 0) (type default)) (uuid "e0553ba1-d20f-5a9d-a3d7-0274ab67eeb0")) + (wire (pts (xy 91.44 35.56) (xy 91.44 39.370000000000005)) (stroke (width 0) (type default)) (uuid "828c8937-c5c8-51ca-919d-0c1e3d506006")) + (wire (pts (xy 63.5 46.99) (xy 63.5 48.260000000000005)) (stroke (width 0) (type default)) (uuid "e7204b53-69c2-5433-9228-070f80c714f9")) + (wire (pts (xy 83.82 46.99) (xy 83.82 48.260000000000005)) (stroke (width 0) (type default)) (uuid "90bddc26-1caa-50bc-8f14-0b55f4dcc9c8")) + (wire (pts (xy 91.44 46.99) (xy 91.44 48.260000000000005)) (stroke (width 0) (type default)) (uuid "ae3e0452-c480-5329-8bb2-1dfa5977f8c6")) + (wire (pts (xy 50.8 55.88) (xy 57.15 55.88)) (stroke (width 0) (type default)) (uuid "b6a90dfd-59b3-58f5-b084-d67d47c2e7ed")) + (wire (pts (xy 50.8 58.42) (xy 67.31 58.42)) (stroke (width 0) (type default)) (uuid "d6063e2f-2796-59f2-ac82-1c19624e5ffc")) + (wire (pts (xy 64.77 55.88) (xy 78.74 55.88)) (stroke (width 0) (type default)) (uuid "cb14f832-f874-582c-9168-766db31ed429")) + (wire (pts (xy 78.74 55.88) (xy 78.74 58.42)) (stroke (width 0) (type default)) (uuid "d40bc6cc-6a4b-50a1-a2f7-36314a65b741")) + (wire (pts (xy 74.93 58.42) (xy 78.74 58.42)) (stroke (width 0) (type default)) (uuid "e9e568ea-804c-5a4b-bec9-0bfc5f0bce48")) + (wire (pts (xy 50.8 63.5) (xy 53.34 63.5)) (stroke (width 0) (type default)) (uuid "a71f73d3-2997-532f-b4a4-60916605602b")) + (wire (pts (xy 50.8 66.04) (xy 53.34 66.04)) (stroke (width 0) (type default)) (uuid "d811dbc3-5991-586a-bede-8be4882a9421")) + (wire (pts (xy 53.34 63.5) (xy 53.34 66.04)) (stroke (width 0) (type default)) (uuid "a3187fec-5820-53dc-83ee-4303cf004c1f")) + (wire (pts (xy 53.34 66.04) (xy 167.64 66.04)) (stroke (width 0) (type default)) (uuid "d9fc82bc-04b8-548e-80f7-79b8a789a64a")) + (wire (pts (xy 50.8 68.58) (xy 55.88 68.58)) (stroke (width 0) (type default)) (uuid "ecef6ab4-c364-5dd9-a0ee-ed4438e05dd7")) + (wire (pts (xy 50.8 71.12) (xy 55.88 71.12)) (stroke (width 0) (type default)) (uuid "4d8e000a-66b0-5920-abf6-2e357724db06")) + (wire (pts (xy 55.88 68.58) (xy 55.88 71.12)) (stroke (width 0) (type default)) (uuid "e9839765-3648-5769-a98d-28d22dbeffed")) + (wire (pts (xy 55.88 68.58) (xy 78.74 68.58)) (stroke (width 0) (type default)) (uuid "fb09f983-985e-5782-b47d-086a622d1fed")) + (wire (pts (xy 78.74 68.58) (xy 167.64 68.58)) (stroke (width 0) (type default)) (uuid "9afe7496-2358-56ba-92c9-34c08413f9a4")) + (wire (pts (xy 78.74 76.2) (xy 78.74 78.74)) (stroke (width 0) (type default)) (uuid "3c5c611d-5ce8-520a-a9b0-9c6feb2d87b7")) + (wire (pts (xy 78.74 88.9) (xy 78.74 91.44)) (stroke (width 0) (type default)) (uuid "0cd112e6-90b1-504d-8e2e-eea0e0570f29")) + (wire (pts (xy 35.56 88.9) (xy 35.56 93.98)) (stroke (width 0) (type default)) (uuid "ec7ce095-ef39-57ab-976a-ae19ee447e36")) + (wire (pts (xy 27.94 88.9) (xy 27.94 93.98)) (stroke (width 0) (type default)) (uuid "a43dde37-cd08-5cd3-bb48-e38b5986c486")) + (wire (pts (xy 27.94 93.98) (xy 35.56 93.98)) (stroke (width 0) (type default)) (uuid "efd71ab0-7d13-5b4d-95c4-4a5909691805")) + (wire (pts (xy 116.84 83.82) (xy 116.84 81.28)) (stroke (width 0) (type default)) (uuid "ea32426d-bf09-5d90-8f27-55cefe958877")) + (wire (pts (xy 116.84 116.84) (xy 116.84 114.3)) (stroke (width 0) (type default)) (uuid "d59155ef-7644-5dbd-98ad-7efcbd0233bd")) + (wire (pts (xy 116.84 93.98) (xy 116.84 99.06)) (stroke (width 0) (type default)) (uuid "ae01d6bd-28b8-5648-a688-8c4f9591a527")) + (wire (pts (xy 116.84 99.06) (xy 127.0 99.06)) (stroke (width 0) (type default)) (uuid "2c82e7c0-e3b4-516d-bcff-46e072649896")) + (wire (pts (xy 127.0 99.06) (xy 137.16 99.06)) (stroke (width 0) (type default)) (uuid "1619efbd-7966-5c5a-a7ec-b7e2f47bda73")) + (wire (pts (xy 137.16 99.06) (xy 152.4 99.06)) (stroke (width 0) (type default)) (uuid "f831f211-72a7-5337-914e-04a719312214")) + (wire (pts (xy 127.0 99.06) (xy 127.0 102.87)) (stroke (width 0) (type default)) (uuid "a8c5b547-1426-50db-8458-d6924c768f92")) + (wire (pts (xy 137.16 99.06) (xy 137.16 102.87)) (stroke (width 0) (type default)) (uuid "c61cf63f-558e-5a9c-92c1-666cc2b7a0e4")) + (wire (pts (xy 127.0 110.49) (xy 127.0 113.03)) (stroke (width 0) (type default)) (uuid "9f12c09e-8d4a-5fd8-86de-77bf05ad20f1")) + (wire (pts (xy 137.16 110.49) (xy 137.16 113.03)) (stroke (width 0) (type default)) (uuid "5bc69f77-d032-5cb2-a53c-4a245fd120ea")) + (wire (pts (xy 116.84 127.0) (xy 116.84 132.08)) (stroke (width 0) (type default)) (uuid "4baef166-9e1e-57cc-895c-8f1a362a656b")) + (wire (pts (xy 116.84 132.08) (xy 127.0 132.08)) (stroke (width 0) (type default)) (uuid "fbd81d66-19bf-56b6-9d2f-1347b1364fe9")) + (wire (pts (xy 127.0 132.08) (xy 137.16 132.08)) (stroke (width 0) (type default)) (uuid "d3ba46c7-0813-5d00-9633-86d14ec669cd")) + (wire (pts (xy 137.16 132.08) (xy 157.48 132.08)) (stroke (width 0) (type default)) (uuid "8cda498c-d8a8-59dd-935f-d3ec2c05fff4")) + (wire (pts (xy 127.0 132.08) (xy 127.0 135.89)) (stroke (width 0) (type default)) (uuid "c0dce371-fe9a-5a53-91b1-87729dc6b4c7")) + (wire (pts (xy 137.16 132.08) (xy 137.16 135.89)) (stroke (width 0) (type default)) (uuid "07eee06d-03fa-562a-a7e2-0bbb5b9a8148")) + (wire (pts (xy 127.0 143.51) (xy 127.0 146.05)) (stroke (width 0) (type default)) (uuid "0a6507fa-730b-51e5-8b12-8b79a6ba9669")) + (wire (pts (xy 137.16 143.51) (xy 137.16 146.05)) (stroke (width 0) (type default)) (uuid "bfaf27e7-535f-54a6-a13d-5d69022b9769")) + (wire (pts (xy 152.4 99.06) (xy 152.4 78.74)) (stroke (width 0) (type default)) (uuid "d6664fdb-2186-502a-8a82-9f861c8f6323")) + (wire (pts (xy 152.4 78.74) (xy 152.4 76.2)) (stroke (width 0) (type default)) (uuid "d1746ee4-c69f-5c28-b806-ece2807be340")) + (wire (pts (xy 152.4 76.2) (xy 167.64 76.2)) (stroke (width 0) (type default)) (uuid "d686c184-bcdb-53dc-947b-6d947f1834fa")) + (wire (pts (xy 152.4 78.74) (xy 167.64 78.74)) (stroke (width 0) (type default)) (uuid "22bc56d5-bbc6-5208-af20-120ed72ca062")) + (wire (pts (xy 157.48 132.08) (xy 157.48 81.28)) (stroke (width 0) (type default)) (uuid "44c5f78c-033e-5bfa-a841-5dd56171398c")) + (wire (pts (xy 157.48 81.28) (xy 167.64 81.28)) (stroke (width 0) (type default)) (uuid "11183657-c79f-5fa3-978c-aeb8e950fc34")) + (wire (pts (xy 185.42 60.96) (xy 185.42 58.42)) (stroke (width 0) (type default)) (uuid "39a820ee-b84c-59ea-b97d-cb85702329c1")) + (wire (pts (xy 185.42 109.22) (xy 185.42 111.76)) (stroke (width 0) (type default)) (uuid "25f4638a-ad1a-5ae6-aec0-adb185253e5f")) + (wire (pts (xy 203.2 66.04) (xy 219.71 66.04)) (stroke (width 0) (type default)) (uuid "d0d61f90-1048-5f7c-98af-7b174b1fe443")) + (wire (pts (xy 227.33 66.04) (xy 234.95 66.04)) (stroke (width 0) (type default)) (uuid "e9687db0-93a8-5f69-af1f-69fc6761f311")) + (wire (pts (xy 242.57 66.04) (xy 247.65 66.04)) (stroke (width 0) (type default)) (uuid "6c8191db-2226-513c-ae6a-a8141aa4d347")) + (wire (pts (xy 247.65 66.04) (xy 247.65 68.58)) (stroke (width 0) (type default)) (uuid "f3ffb5fc-80a5-5bbf-bc26-0f2b3af83e90")) + (wire (pts (xy 203.2 68.58) (xy 208.28 68.58)) (stroke (width 0) (type default)) (uuid "cc200038-cd83-50b9-89e0-e14307b06901")) + (wire (pts (xy 208.28 68.58) (xy 208.28 104.14)) (stroke (width 0) (type default)) (uuid "ceb8a4dd-6bce-55c6-8b6f-6024b46fca47")) + (wire (pts (xy 208.28 104.14) (xy 219.71 104.14)) (stroke (width 0) (type default)) (uuid "d3122d8f-b3dc-53ad-a862-126c9897601a")) + (wire (pts (xy 227.33 104.14) (xy 231.14 104.14)) (stroke (width 0) (type default)) (uuid "cbdc16ef-60b7-5629-8c6d-81bfd945f0bb")) + (wire (pts (xy 231.14 104.14) (xy 233.68 104.14)) (stroke (width 0) (type default)) (uuid "0b7035d4-574a-5e72-a883-ccf6c423b4e6")) + (wire (pts (xy 231.14 104.14) (xy 231.14 107.95)) (stroke (width 0) (type default)) (uuid "c808b231-2079-5c1b-8eb3-a8b9f091d0ff")) + (wire (pts (xy 231.14 115.57) (xy 231.14 118.11)) (stroke (width 0) (type default)) (uuid "9f8c00c8-e410-519b-a8a0-fba8062ee5d5")) + (wire (pts (xy 241.3 109.22) (xy 241.3 111.76)) (stroke (width 0) (type default)) (uuid "5ab2bc0a-6322-51b0-a9db-113e79d717ed")) + (wire (pts (xy 241.3 99.06) (xy 241.3 96.52)) (stroke (width 0) (type default)) (uuid "1e56b115-3318-5929-88bc-ff2bcf4db38e")) + (wire (pts (xy 241.3 96.52) (xy 241.3 92.71)) (stroke (width 0) (type default)) (uuid "abe3f6cd-bc14-5555-933d-31afdc5411cc")) + (wire (pts (xy 241.3 96.52) (xy 251.46 96.52)) (stroke (width 0) (type default)) (uuid "9ceb1de7-eaa4-58ef-9c0c-ffb0392bf554")) + (wire (pts (xy 241.3 85.09) (xy 241.3 81.28)) (stroke (width 0) (type default)) (uuid "399baa67-72d5-550b-bbbb-bdbadace7306")) + (wire (pts (xy 241.3 81.28) (xy 246.38 81.28)) (stroke (width 0) (type default)) (uuid "ee2d9348-02a9-5aa4-9d5b-31a96011cb00")) + (wire (pts (xy 246.38 81.28) (xy 246.38 91.44)) (stroke (width 0) (type default)) (uuid "5d66e0a0-ec9d-597f-b46f-53ee70382d66")) + (wire (pts (xy 246.38 91.44) (xy 251.46 91.44)) (stroke (width 0) (type default)) (uuid "ca531f97-606b-5256-9071-6a16a7211d45")) + (junction (at 55.88 35.56) (diameter 0) (color 0 0 0 0) (uuid "a7d92d34-363d-5bc9-bcf6-2b5f7ddcf199")) + (junction (at 63.5 35.56) (diameter 0) (color 0 0 0 0) (uuid "a7639261-9b96-561c-92a0-e67c7e6ca6f4")) + (junction (at 83.82 35.56) (diameter 0) (color 0 0 0 0) (uuid "c6cdfbca-67e3-51f0-b507-1ce8e762f4c3")) + (junction (at 91.44 35.56) (diameter 0) (color 0 0 0 0) (uuid "b73b8bfd-97b2-5a3c-b556-27c9903798c0")) + (junction (at 53.34 66.04) (diameter 0) (color 0 0 0 0) (uuid "b3f1540d-4be4-50c3-a6db-fb332a3955bb")) + (junction (at 55.88 68.58) (diameter 0) (color 0 0 0 0) (uuid "63f4ecb9-79df-5500-bd50-0a762941c3ce")) + (junction (at 78.74 68.58) (diameter 0) (color 0 0 0 0) (uuid "156a2151-9317-5d5d-ba58-30d4cefe8375")) + (junction (at 78.74 58.42) (diameter 0) (color 0 0 0 0) (uuid "114ac67b-6e77-5102-b52a-c0cb3efd8cf2")) + (junction (at 127.0 99.06) (diameter 0) (color 0 0 0 0) (uuid "673c167c-dba6-50e6-8673-0eb79cba4386")) + (junction (at 137.16 99.06) (diameter 0) (color 0 0 0 0) (uuid "b0cae851-136d-5b5e-a5ae-aab2ace50bae")) + (junction (at 152.4 78.74) (diameter 0) (color 0 0 0 0) (uuid "38be1fce-082a-5a3d-af57-25282cac44bf")) + (junction (at 127.0 132.08) (diameter 0) (color 0 0 0 0) (uuid "f51ae364-48aa-51eb-8846-c7ff2197013e")) + (junction (at 137.16 132.08) (diameter 0) (color 0 0 0 0) (uuid "6e49bee5-2033-5fdd-8faa-4265d1bffb24")) + (junction (at 231.14 104.14) (diameter 0) (color 0 0 0 0) (uuid "3bb7eccc-5190-5c93-96a8-54bf46649e78")) + (junction (at 241.29999999999998 96.52) (diameter 0) (color 0 0 0 0) (uuid "ff655053-c0a1-526e-9177-1fb5eff6cf93")) + (no_connect (at 167.64 86.36) (uuid "404b6ba2-0005-533e-b90f-cc8123bd442a")) + (no_connect (at 167.64 88.9) (uuid "ca8768b6-b0cd-5248-ac47-312bfc00eceb")) + (no_connect (at 167.64 91.44) (uuid "d75dc062-c6f6-597c-b8a1-3aa25618fecd")) + (no_connect (at 167.64 93.98) (uuid "db1618ab-60c6-5e10-ba35-0fef6687dd8a")) + (no_connect (at 167.64 96.52) (uuid "e203de01-0999-5fc7-8f55-c22d601ce6e0")) + (no_connect (at 167.64 99.06) (uuid "d7bcdc23-66f6-5179-a29a-4c0c6d430387")) + (no_connect (at 167.64 101.6) (uuid "39751de3-5ecf-5f6d-a27b-182a732d8521")) + (no_connect (at 167.64 104.14) (uuid "8936f6ac-1b68-55b0-a3ff-ae119e4e5a12")) + (no_connect (at 203.2 73.66) (uuid "a29fe15d-9da0-5c82-ac58-63b8e6970a0d")) + (no_connect (at 203.2 76.2) (uuid "1345c163-0c3f-5d88-8e5d-406771d90123")) + (no_connect (at 203.2 78.74) (uuid "1dbacd2e-8ee6-583b-b44d-b75b4a04e7a2")) + (no_connect (at 203.2 81.28) (uuid "9d0ffbac-bfd3-5873-a8c1-66d19afc0f70")) + (no_connect (at 203.2 83.82) (uuid "0fbdfcae-021e-5efa-be63-d0ccebec9295")) + (no_connect (at 203.2 86.36) (uuid "f39ea6a3-3d4c-57e9-b228-0624ddae754e")) + (no_connect (at 203.2 88.9) (uuid "f1a721f6-d1c0-5a3a-9bf4-6188652e2d69")) + (no_connect (at 203.2 91.44) (uuid "e728c296-6725-5778-8efe-625825862108")) + (no_connect (at 203.2 93.98) (uuid "1dd6e8c0-e998-50fc-bf05-009225122070")) + (no_connect (at 203.2 96.52) (uuid "01e44cbf-40d6-5340-bb0e-5b42605b19dd")) + (no_connect (at 203.2 99.06) (uuid "bca11af6-db99-51a3-8e15-8d77658d0365")) + (no_connect (at 50.8 78.74) (uuid "892ce38e-f2aa-5eac-ab0b-1dbe22604cef")) + (no_connect (at 50.8 81.28) (uuid "6384c51b-b000-51d1-9857-22ab7963b13b")) + (symbol (lib_id "calibrator:CH32X035G8R6") (at 185.42 78.74 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "4222ac06-04ac-52aa-aca0-41f2a2666abd") + (property "Reference" "U1" (at 170.17999999999998 118.10999999999999 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "CH32X035G8R6" (at 170.17999999999998 120.64999999999999 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Package_SO:QSOP-28_3.9x9.9mm_P0.635mm" (at 185.42 78.74 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 185.42 78.74 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 185.42 78.74 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C49118551" (at 185.42 78.74 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "2" (uuid "7aefbe81-4b86-54e5-9047-ade20f4a1515")) + (pin "3" (uuid "85430bd6-7cfd-5163-a243-b11ac4a792f0")) + (pin "5" (uuid "b5bae18f-b4b2-5d6f-be62-a47cd281760f")) + (pin "9" (uuid "c841307b-494a-5c46-9c11-903e5fb45ca5")) + (pin "11" (uuid "c494acae-a1bc-535b-9534-f913ea975392")) + (pin "1" (uuid "a8e307bf-b0e4-5323-8b81-a20ceef8cad8")) + (pin "28" (uuid "e797c4c8-9372-551e-8fd3-e4c52b4f9ca7")) + (pin "4" (uuid "5acbda26-d559-5cb6-ae34-125e392b8fd1")) + (pin "8" (uuid "d4c26a90-a10d-5382-8ad0-fe6e45450545")) + (pin "10" (uuid "3a7710f2-1b9d-5eba-9569-9a857704f686")) + (pin "12" (uuid "c5fe7af6-d9f7-5c9a-baed-28e0bf3cab7e")) + (pin "13" (uuid "791324c0-bd80-52c2-b519-698bcf2e5e3f")) + (pin "14" (uuid "ca41f9f8-e717-5b13-a7e1-eaf6e8f79073")) + (pin "15" (uuid "223eb3a0-8d98-506e-9352-781a009dd413")) + (pin "16" (uuid "8f1cb4f3-cae5-520e-9806-9e14f4d2287a")) + (pin "17" (uuid "b7b65342-74a8-5a3f-a9bb-b3b13ce0608e")) + (pin "18" (uuid "787380d0-c143-5767-8377-d30636706acc")) + (pin "19" (uuid "1a577622-a4ce-55f3-b8cb-f69e02aed71e")) + (pin "20" (uuid "1935fe65-840f-58d1-aee2-5fa2f435b174")) + (pin "21" (uuid "44fd42f2-cbfe-5141-8b72-3b8677fcce68")) + (pin "22" (uuid "a9085eda-992a-5b06-955b-174420fdc218")) + (pin "23" (uuid "7e34cfbb-b3eb-5b2a-97c4-402220f7a680")) + (pin "24" (uuid "a2a23697-3eec-5207-9719-104a973dcbd8")) + (pin "25" (uuid "8e1a30b0-7654-5846-bac8-584937115171")) + (pin "26" (uuid "aa00d598-83ed-5018-8d15-c863ea447cac")) + (pin "27" (uuid "0be5d0c8-6dd5-57cf-a80c-3c951ea2e0a7")) + (pin "6" (uuid "80d88576-4fd5-5fe6-9a46-3ac593486a80")) + (pin "7" (uuid "83f83ba2-8906-51dd-b8cb-41442cb34e4d")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "U1") (unit 1)))) + ) + (symbol (lib_id "Connector:USB_C_Receptacle_USB2.0_16P") (at 35.56 66.04 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "1124327a-0935-5ec5-b378-84ab0296c0e4") + (property "Reference" "J1" (at 35.56 38.10000000000001 0) (effects (font (size 1.27 1.27)))) + (property "Value" "TYPE-C 16P" (at 35.56 40.64000000000001 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12" (at 35.56 66.04 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 35.56 66.04 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 35.56 66.04 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C393939" (at 35.56 66.04 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "S1" (uuid "a1de6b70-1980-5e70-8a31-4b9ae5950cdc")) + (pin "A1" (uuid "ad203bfc-8039-5ead-a880-e6603b70d356")) + (pin "A12" (uuid "9f93992a-75c0-5795-9e4d-89365e99675d")) + (pin "B1" (uuid "89a33519-f300-5221-b134-148e25d49006")) + (pin "B12" (uuid "0b748116-6859-52cf-affd-51517c12089a")) + (pin "A4" (uuid "6a7b01a0-3683-54ae-8f8c-849215439dec")) + (pin "A9" (uuid "51b00f67-71f6-5be9-87d5-4d41049f0624")) + (pin "B4" (uuid "9c86d820-5301-5f07-98ec-3e7cf4e6c045")) + (pin "B9" (uuid "02f539d6-2953-5173-9756-ec6873e8010d")) + (pin "A5" (uuid "80b992c9-9db1-5322-8eff-e1278162ae5d")) + (pin "B5" (uuid "89485fde-36cc-55be-8541-2faf8f68ffa8")) + (pin "A7" (uuid "1ea8d4a0-8b97-5d66-b77b-5e768c24ebf5")) + (pin "B7" (uuid "b7682997-3a17-509a-a68c-686a93c1f041")) + (pin "A6" (uuid "ff4d185c-c212-5ec5-825b-da8166e36515")) + (pin "B6" (uuid "6d16f07b-115c-5cda-ae3f-cfa985e113a1")) + (pin "A8" (uuid "1da6fb2d-13f6-5252-b8f4-8d008d000619")) + (pin "B8" (uuid "9872484c-71ce-5768-b3a7-cfa109bc8299")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "J1") (unit 1)))) + ) + (symbol (lib_id "Switch:SW_Push") (at 78.74 83.82 270) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "cc9ce13b-2c33-57ef-aa92-51d54ee14419") + (property "Reference" "SW1" (at 76.19999999999999 82.55 270) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "TS-1187A (BOOT)" (at 76.19999999999999 85.08999999999999 270) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Button_Switch_SMD:SW_Push_1P1T_XKB_TS-1187A" (at 78.74 83.82 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 78.74 83.82 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 78.74 83.82 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C318884" (at 78.74 83.82 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "538aa2d2-bc84-59ff-b509-b4a4d6d3df6d")) + (pin "2" (uuid "c8f4cddc-1c99-550e-b0d7-4252e69f2087")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "SW1") (unit 1)))) + ) + (symbol (lib_id "Device:R") (at 78.74 72.39 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "1ed47f11-8c6d-55cd-a6f7-1ea99411be78") + (property "Reference" "R9" (at 81.28 71.12 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "4.7k" (at 81.28 73.66 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Resistor_SMD:R_0402_1005Metric" (at 78.74 72.39 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 78.74 72.39 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 78.74 72.39 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C25900" (at 78.74 72.39 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "42449452-d59b-583f-863f-c23f59d2e315")) + (pin "2" (uuid "38fd6dd0-6ff2-5192-bd5b-2b0cbbdb6675")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "R9") (unit 1)))) + ) + (symbol (lib_id "Device:R") (at 60.96 55.88 90) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "5c65a1d8-9e1b-5114-9020-2ddadf94851a") + (property "Reference" "R1" (at 58.42 53.975 90) (effects (font (size 1.27 1.27)))) + (property "Value" "5.1k" (at 63.5 53.975 90) (effects (font (size 1.27 1.27)))) + (property "Footprint" "Resistor_SMD:R_0402_1005Metric" (at 60.96 55.88 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 60.96 55.88 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 60.96 55.88 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C25905" (at 60.96 55.88 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "52ba1824-639c-53f8-831a-9195258f6975")) + (pin "2" (uuid "276c20ac-026e-5779-8fe3-dcd5dec2c81b")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "R1") (unit 1)))) + ) + (symbol (lib_id "Device:R") (at 71.12 58.42 90) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "1491fe16-ca55-53ad-be4e-59be8e1cab04") + (property "Reference" "R2" (at 68.58 60.96 90) (effects (font (size 1.27 1.27)))) + (property "Value" "5.1k" (at 73.66000000000001 60.96 90) (effects (font (size 1.27 1.27)))) + (property "Footprint" "Resistor_SMD:R_0402_1005Metric" (at 71.12 58.42 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 71.12 58.42 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 71.12 58.42 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C25905" (at 71.12 58.42 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "feb0aed9-43d5-5466-82a3-80a193fae221")) + (pin "2" (uuid "2bdb82c4-998d-5543-b584-498e073ef27e")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "R2") (unit 1)))) + ) + (symbol (lib_id "Device:C") (at 63.5 43.18 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "dd3f72af-8d1a-5366-8668-8ee5f6dd763f") + (property "Reference" "C1" (at 66.04 41.91 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "10u" (at 66.04 44.45 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Capacitor_SMD:C_0805_2012Metric" (at 63.5 43.18 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 63.5 43.18 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 63.5 43.18 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C15850" (at 63.5 43.18 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "65165fb1-84ca-5dd3-90ad-6279cdeb45fa")) + (pin "2" (uuid "07d08b5f-df72-53c0-a219-1d2dc9353ac7")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "C1") (unit 1)))) + ) + (symbol (lib_id "Device:R") (at 72.39 35.56 90) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "36f4e2a4-4f94-578f-9e95-492d540d7427") + (property "Reference" "R3" (at 72.39 33.02 90) (effects (font (size 1.27 1.27)))) + (property "Value" "10" (at 72.39 38.1 90) (effects (font (size 1.27 1.27)))) + (property "Footprint" "Resistor_SMD:R_0402_1005Metric" (at 72.39 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 72.39 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 72.39 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C25077" (at 72.39 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "4bbefd40-0ee2-52aa-a269-edd643d401df")) + (pin "2" (uuid "6b066a8c-af93-58ed-b65c-027f8e0e77d0")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "R3") (unit 1)))) + ) + (symbol (lib_id "Device:C") (at 83.82 43.18 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "6b8c0561-4ca7-54ed-997b-33d6cf817e70") + (property "Reference" "C2" (at 86.36 41.91 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "1u" (at 86.36 44.45 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Capacitor_SMD:C_0402_1005Metric" (at 83.82 43.18 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 83.82 43.18 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 83.82 43.18 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C52923" (at 83.82 43.18 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "922bb6cf-ee37-56f9-bab6-5accff1c59d0")) + (pin "2" (uuid "8dae0ae5-9d28-5f08-85c8-46e7f31c3de1")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "C2") (unit 1)))) + ) + (symbol (lib_id "Device:C") (at 91.44 43.18 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "b6dd77ec-2530-5019-8ebf-82a63c3d4d68") + (property "Reference" "C3" (at 93.98 41.91 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "100n" (at 93.98 44.45 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Capacitor_SMD:C_0402_1005Metric" (at 91.44 43.18 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 91.44 43.18 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 91.44 43.18 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C1525" (at 91.44 43.18 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "83d10f56-2ec2-5291-88ac-7bc6bf9af6db")) + (pin "2" (uuid "df4e1157-e953-5cee-a701-49238701dae1")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "C3") (unit 1)))) + ) + (symbol (lib_id "Device:Buzzer") (at 254.0 93.98 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "fb7fbca3-a358-5579-a36c-b58b156c5167") + (property "Reference" "BZ1" (at 256.54 88.9 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "MLT-8530" (at 256.54 99.06 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "calibrator:Buzzer_MLT-8530" (at 254.0 93.98 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 254.0 93.98 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 254.0 93.98 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C94599" (at 254.0 93.98 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "1c8de77a-1a85-5578-8251-23acabd9fdf9")) + (pin "2" (uuid "2a22bf31-eb0b-576b-bf54-72042952c33b")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "BZ1") (unit 1)))) + ) + (symbol (lib_id "Device:D") (at 241.29999999999998 88.9 270) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "808bdec2-a711-510e-a9f3-8b2c29f0eb89") + (property "Reference" "D2" (at 238.76 87.63000000000001 270) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "1N4148WS" (at 238.76 90.17 270) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Diode_SMD:D_SOD-323" (at 241.29999999999998 88.9 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 241.29999999999998 88.9 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 241.29999999999998 88.9 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C2128" (at 241.29999999999998 88.9 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "f8fa2386-4124-5eba-9f56-7f1ac8b039e3")) + (pin "2" (uuid "c18ffb04-0702-517f-a521-c2a7212fe00d")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "D2") (unit 1)))) + ) + (symbol (lib_id "Transistor_BJT:Q_NPN_BEC") (at 238.76 104.14 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "b1451052-b7e6-5ad7-a23e-48c76ba5e66b") + (property "Reference" "Q1" (at 243.84 102.87 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "S8050" (at 243.84 105.41 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Package_TO_SOT_SMD:SOT-23" (at 238.76 104.14 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 238.76 104.14 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 238.76 104.14 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C2146" (at 238.76 104.14 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "0382b400-966f-5358-9b66-3df15245feb2")) + (pin "3" (uuid "73a0668d-e34a-568a-aee8-a636085a7184")) + (pin "2" (uuid "6b6b74ab-20b2-52ba-8890-8f03b586fca5")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "Q1") (unit 1)))) + ) + (symbol (lib_id "Device:R") (at 223.52 104.14 90) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "125a660e-15f3-5fdd-a22b-ff5656cbb085") + (property "Reference" "R5" (at 223.52 101.6 90) (effects (font (size 1.27 1.27)))) + (property "Value" "1k" (at 223.52 106.68 90) (effects (font (size 1.27 1.27)))) + (property "Footprint" "Resistor_SMD:R_0402_1005Metric" (at 223.52 104.14 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 223.52 104.14 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 223.52 104.14 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C11702" (at 223.52 104.14 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "9e4a73b3-e768-5dd0-8e15-7b9d63d160d3")) + (pin "2" (uuid "994498c2-c07e-51d9-aff4-11fd5f0712dd")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "R5") (unit 1)))) + ) + (symbol (lib_id "Device:R") (at 231.14 111.76 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "4d1fd7fe-d235-5769-928b-26097f2424fb") + (property "Reference" "R6" (at 233.67999999999998 110.49000000000001 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "100k" (at 233.67999999999998 113.03 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Resistor_SMD:R_0402_1005Metric" (at 231.14 111.76 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 231.14 111.76 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 231.14 111.76 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C25741" (at 231.14 111.76 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "274b48a5-8a9c-5c79-b9a7-a27b1c5b0356")) + (pin "2" (uuid "0564fed1-0528-5904-8509-7ef185ea0ec1")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "R6") (unit 1)))) + ) + (symbol (lib_id "Device:R") (at 223.52 66.04 90) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "23dd1b7b-5183-5c52-a0b3-b129887282e2") + (property "Reference" "R4" (at 223.52 63.50000000000001 90) (effects (font (size 1.27 1.27)))) + (property "Value" "150" (at 223.52 68.58000000000001 90) (effects (font (size 1.27 1.27)))) + (property "Footprint" "Resistor_SMD:R_0603_1608Metric" (at 223.52 66.04 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 223.52 66.04 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 223.52 66.04 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C22808" (at 223.52 66.04 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "4a959b02-3ee5-571d-a634-268e394eb8a9")) + (pin "2" (uuid "b30616cd-2404-545b-8540-2bda94ffaecc")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "R4") (unit 1)))) + ) + (symbol (lib_id "Device:LED") (at 238.76 66.04 180) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "afc5edbb-5c76-5319-a5e4-61bf316ff0d9") + (property "Reference" "D1" (at 238.76 59.690000000000005 0) (effects (font (size 1.27 1.27)))) + (property "Value" "XL-3216UWC-FB white" (at 238.76 62.230000000000004 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "calibrator:LED_1206_ReverseMount_XL-3216UWC-FB" (at 238.76 66.04 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 238.76 66.04 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 238.76 66.04 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C3646935" (at 238.76 66.04 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "96b5248a-846e-5ba3-b398-269ce50f2405")) + (pin "2" (uuid "03c20750-5e7e-5f5f-86e8-58b05cb82228")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "D1") (unit 1)))) + ) + (symbol (lib_id "Device:Q_Photo_NPN") (at 114.3 88.89999999999999 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "44d8e85b-ae32-5906-b67a-ac6836e6635b") + (property "Reference" "Q2" (at 119.38 87.63 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "VEMT2500X01" (at 119.38 90.16999999999999 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "calibrator:Vishay_VEMT2500X01_ReverseGullwing" (at 114.3 88.89999999999999 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 114.3 88.89999999999999 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 114.3 88.89999999999999 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C3210911" (at 114.3 88.89999999999999 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "19bbe42e-3ad5-5974-afa8-fbc14a16dfed")) + (pin "2" (uuid "b0fb1808-bc67-5307-a0c5-b219610b162b")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "Q2") (unit 1)))) + ) + (symbol (lib_id "Device:R") (at 127.0 106.67999999999999 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "58b2044a-3284-55c4-b4bc-ab3bfe0a4838") + (property "Reference" "R7" (at 129.54 105.41 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "22k" (at 129.54 107.94999999999999 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Resistor_SMD:R_0402_1005Metric" (at 127.0 106.67999999999999 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 127.0 106.67999999999999 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 127.0 106.67999999999999 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C25768" (at 127.0 106.67999999999999 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "e280e7b4-da28-58e8-b46a-e46c152e3d6f")) + (pin "2" (uuid "eaa675de-b0dd-5aaa-a735-f20a33e8a0db")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "R7") (unit 1)))) + ) + (symbol (lib_id "Device:C") (at 137.16 106.67999999999999 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "1c3c34bd-2c7e-5342-b666-947a8bf03312") + (property "Reference" "C4" (at 139.7 105.41 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "1n" (at 139.7 107.94999999999999 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Capacitor_SMD:C_0402_1005Metric" (at 137.16 106.67999999999999 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 137.16 106.67999999999999 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 137.16 106.67999999999999 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C1523" (at 137.16 106.67999999999999 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "9e7d7a06-68cf-574f-9ede-c8c3e3bf3f38")) + (pin "2" (uuid "1a7e2f2b-66ed-5e78-a8a5-1d9190f5e6c5")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "C4") (unit 1)))) + ) + (symbol (lib_id "Device:Q_Photo_NPN") (at 114.3 121.92 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "d00e3618-154d-52c9-897e-eed845b8807a") + (property "Reference" "Q3" (at 119.38 120.65 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "VEMT2500X01" (at 119.38 123.19 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "calibrator:Vishay_VEMT2500X01_ReverseGullwing" (at 114.3 121.92 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 114.3 121.92 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 114.3 121.92 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C3210911" (at 114.3 121.92 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "d3424aea-5975-500f-b0e0-48003e7c0b4b")) + (pin "2" (uuid "db501aa6-e322-52f5-b1b8-d3da7a57fbbe")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "Q3") (unit 1)))) + ) + (symbol (lib_id "Device:R") (at 127.0 139.70000000000002 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "95e9233e-a082-59f2-86a3-6582479cab74") + (property "Reference" "R8" (at 129.54 138.43 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "22k" (at 129.54 140.97000000000003 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Resistor_SMD:R_0402_1005Metric" (at 127.0 139.70000000000002 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 127.0 139.70000000000002 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 127.0 139.70000000000002 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C25768" (at 127.0 139.70000000000002 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "c3538d7c-cca6-5f0d-9857-3359c2b21c69")) + (pin "2" (uuid "8d7e2ef4-92c7-5d2b-853b-d5c58b172730")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "R8") (unit 1)))) + ) + (symbol (lib_id "Device:C") (at 137.16 139.70000000000002 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "86c2c6b3-663f-55f3-b398-c8f9014c8136") + (property "Reference" "C5" (at 139.7 138.43 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "1n" (at 139.7 140.97000000000003 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Capacitor_SMD:C_0402_1005Metric" (at 137.16 139.70000000000002 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 137.16 139.70000000000002 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 137.16 139.70000000000002 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "LCSC" "C1523" (at 137.16 139.70000000000002 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "8c0d8a63-832d-5688-bdbc-ea5153355d2e")) + (pin "2" (uuid "ff1aa9fa-57f3-5dee-9895-77b7f922bf04")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "C5") (unit 1)))) + ) + (symbol (lib_id "power:VBUS") (at 55.88 35.56 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "35ce0985-9bd4-5906-beb4-5a1d08fd597c") + (property "Reference" "#PWR001" (at 55.88 31.750000000000004 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "VBUS" (at 55.88 31.750000000000004 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 55.88 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 55.88 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 55.88 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "b822f5be-006a-51d7-9963-99fb5a01e430")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR001") (unit 1)))) + ) + (symbol (lib_id "power:VDD") (at 99.06 35.56 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "3b22c133-e347-5b7e-869d-5b45d9f3e2b4") + (property "Reference" "#PWR002" (at 99.06 31.750000000000004 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "VDD" (at 99.06 31.750000000000004 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 99.06 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 99.06 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 99.06 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "75ce5947-54c7-549a-9860-9590c56cae56")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR002") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 35.56 93.98 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "9f594c13-e5c1-5c2c-ac1e-4038fead92db") + (property "Reference" "#PWR003" (at 35.56 97.79 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 35.56 97.79 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 35.56 93.98 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 35.56 93.98 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 35.56 93.98 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "5d30f6da-5251-5dbd-a853-159c88e79f14")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR003") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 63.5 48.260000000000005 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "d0ab301a-fe07-5b74-ac55-b8837ba8e3af") + (property "Reference" "#PWR004" (at 63.5 52.07000000000001 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 63.5 52.07000000000001 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 63.5 48.260000000000005 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 63.5 48.260000000000005 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 63.5 48.260000000000005 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "361efd77-4fb5-5f65-807d-587cb952cf1b")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR004") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 83.82 48.260000000000005 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "30ad7f23-a6c4-59e5-a58d-91ba3328824a") + (property "Reference" "#PWR005" (at 83.82 52.07000000000001 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 83.82 52.07000000000001 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 83.82 48.260000000000005 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 83.82 48.260000000000005 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 83.82 48.260000000000005 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "4799f0eb-7c81-5fbe-9330-cf52ee35eda5")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR005") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 91.44 48.260000000000005 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "7ed3fe26-0f6b-5380-af40-099cdcd8b90d") + (property "Reference" "#PWR006" (at 91.44 52.07000000000001 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 91.44 52.07000000000001 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 91.44 48.260000000000005 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 91.44 48.260000000000005 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 91.44 48.260000000000005 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "7ec43f84-225c-53b2-b6a1-926c81df9452")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR006") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 78.74 58.42 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "f5ea70dc-7aa3-513e-9aa5-fb0a84d29558") + (property "Reference" "#PWR007" (at 78.74 62.230000000000004 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 78.74 62.230000000000004 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 78.74 58.42 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 78.74 58.42 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 78.74 58.42 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "5f280c57-60e9-5e9c-ac51-3f347a549335")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR007") (unit 1)))) + ) + (symbol (lib_id "power:VDD") (at 78.74 91.44 180) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "5f908e78-ab6f-5f87-9ad6-a0a23dbd69bc") + (property "Reference" "#PWR008" (at 78.74 95.25 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "VDD" (at 78.74 95.25 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 78.74 91.44 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 78.74 91.44 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 78.74 91.44 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "499ead3e-a04a-5847-8718-a0ba3e914542")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR008") (unit 1)))) + ) + (symbol (lib_id "power:VDD") (at 116.84 81.28 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "ea7660e1-9c31-5243-a740-02cbe5fd809c") + (property "Reference" "#PWR009" (at 116.84 77.47 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "VDD" (at 116.84 77.47 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 116.84 81.28 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 116.84 81.28 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 116.84 81.28 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "44077a3a-5279-5955-8461-7b43a3930b66")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR009") (unit 1)))) + ) + (symbol (lib_id "power:VDD") (at 116.84 114.3 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "24af1ae1-de34-565e-a565-68e4cbcf781e") + (property "Reference" "#PWR010" (at 116.84 110.49 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "VDD" (at 116.84 110.49 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 116.84 114.3 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 116.84 114.3 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 116.84 114.3 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "2f57fd87-52a8-5220-8db6-988e650349fa")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR010") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 127.0 113.03 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "3a7e1f97-d549-5a76-8b33-0d40f9359bb8") + (property "Reference" "#PWR011" (at 127.0 116.84 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 127.0 116.84 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 127.0 113.03 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 127.0 113.03 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 127.0 113.03 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "1cce39f4-c7a5-542c-bdef-d5c5bd1d8b91")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR011") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 137.16 113.03 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "45bdcfdf-a354-52c0-8521-5f7876ec5a27") + (property "Reference" "#PWR012" (at 137.16 116.84 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 137.16 116.84 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 137.16 113.03 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 137.16 113.03 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 137.16 113.03 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "5bd2d7cd-93f6-52d7-ab5b-1b4ac0c39594")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR012") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 127.0 146.05 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "3608bb45-5b95-57bc-b7ac-957a1e6cd581") + (property "Reference" "#PWR013" (at 127.0 149.86 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 127.0 149.86 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 127.0 146.05 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 127.0 146.05 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 127.0 146.05 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "ae388825-c422-5917-b484-685fca05ddec")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR013") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 137.16 146.05 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "3d0755ed-3554-5057-a852-c1126f4fbb87") + (property "Reference" "#PWR014" (at 137.16 149.86 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 137.16 149.86 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 137.16 146.05 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 137.16 146.05 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 137.16 146.05 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "dfb29ffc-9b25-5425-9963-9661ce624371")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR014") (unit 1)))) + ) + (symbol (lib_id "power:VDD") (at 185.42 58.42 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "66caed7d-2098-5c06-a04e-a305b59179a4") + (property "Reference" "#PWR015" (at 185.42 54.61 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "VDD" (at 185.42 54.61 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 185.42 58.42 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 185.42 58.42 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 185.42 58.42 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "d1c6a2bb-85eb-5095-91c3-8d6c633592cd")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR015") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 185.42 111.76 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "55a48d37-3727-5115-baa6-c3544aa83da0") + (property "Reference" "#PWR016" (at 185.42 115.57000000000001 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 185.42 115.57000000000001 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 185.42 111.76 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 185.42 111.76 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 185.42 111.76 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "235c6828-4e0a-5df2-bf5c-feb5d86b5312")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR016") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 247.65 68.58 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "c733c395-4900-55be-b8f6-9af03c02810f") + (property "Reference" "#PWR017" (at 247.65 72.39 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 247.65 72.39 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 247.65 68.58 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 247.65 68.58 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 247.65 68.58 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "caf28636-8355-5632-ba4c-8fbc216dcdf4")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR017") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 231.14 118.11 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "0f67ad0b-4231-5844-a959-4db95d727209") + (property "Reference" "#PWR018" (at 231.14 121.92 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 231.14 121.92 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 231.14 118.11 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 231.14 118.11 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 231.14 118.11 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "db4fe632-bc03-5dc5-86e0-f93d9a195c25")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR018") (unit 1)))) + ) + (symbol (lib_id "power:GND") (at 241.29999999999998 111.76 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "73825071-1950-5d69-a199-c234065752ca") + (property "Reference" "#PWR019" (at 241.29999999999998 115.57000000000001 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "GND" (at 241.29999999999998 115.57000000000001 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 241.29999999999998 111.76 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 241.29999999999998 111.76 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 241.29999999999998 111.76 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "065a5088-f6a1-578b-85fa-496cda7e2742")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR019") (unit 1)))) + ) + (symbol (lib_id "power:VBUS") (at 241.29999999999998 81.28 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "e7e02b90-095e-56d9-83bd-578aefaa8909") + (property "Reference" "#PWR020" (at 241.29999999999998 77.47 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "VBUS" (at 241.29999999999998 77.47 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 241.29999999999998 81.28 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 241.29999999999998 81.28 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 241.29999999999998 81.28 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "00be4ac7-4dbe-5d1d-8d26-7aecc9092898")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#PWR020") (unit 1)))) + ) + (symbol (lib_id "power:PWR_FLAG") (at 55.88 50.8 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "d53a2823-cd2d-5fc1-aafa-e722fe76b92f") + (property "Reference" "#FLG01" (at 55.88 46.989999999999995 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "PWR_FLAG" (at 55.88 46.989999999999995 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 55.88 50.8 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 55.88 50.8 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 55.88 50.8 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "52180f13-ad63-50e8-8039-17522c862c6c")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#FLG01") (unit 1)))) + ) + (symbol (lib_id "power:PWR_FLAG") (at 27.94 93.98 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "3fdbc089-d41b-5412-99d7-9ff3a09a7e32") + (property "Reference" "#FLG02" (at 27.94 90.17 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "PWR_FLAG" (at 27.94 90.17 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 27.94 93.98 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 27.94 93.98 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 27.94 93.98 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "78d0c7b0-0f60-5829-8165-eda3085bd092")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#FLG02") (unit 1)))) + ) + (symbol (lib_id "power:PWR_FLAG") (at 83.82 35.56 0) (unit 1) (exclude_from_sim no) (in_bom yes) (on_board yes) (dnp no) (uuid "927ad7fd-61d8-5f09-9851-96a3a653454c") + (property "Reference" "#FLG03" (at 83.82 31.750000000000004 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Value" "PWR_FLAG" (at 83.82 31.750000000000004 0) (effects (font (size 1.27 1.27)))) + (property "Footprint" "" (at 83.82 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "~" (at 83.82 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "" (at 83.82 35.56 0) (effects (font (size 1.27 1.27)) (hide yes))) + (pin "1" (uuid "ddd14f1d-03e6-5e45-bc29-ce3e2c646fb3")) + (instances (project "calibrator" (path "/0d2859e4-133c-5efb-a230-be56cb52e344" (reference "#FLG03") (unit 1)))) + ) + (sheet_instances (path "/" (page "1"))) + (embedded_fonts no) +) diff --git a/hardware/calibrator/calibrator.kicad_sym b/hardware/calibrator/calibrator.kicad_sym new file mode 100644 index 0000000..a7fe495 --- /dev/null +++ b/hardware/calibrator/calibrator.kicad_sym @@ -0,0 +1,41 @@ +(kicad_symbol_lib (version 20241209) (generator "calibrator-gen") (generator_version "9.0") + (symbol "CH32X035G8R6" (pin_names (offset 1.016)) (exclude_from_sim no) (in_bom yes) (on_board yes) + (property "Reference" "U" (at -10.16 16.51 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "CH32X035G8R6" (at 2.54 16.51 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "Package_SO:QSOP-28_3.9x9.9mm_P0.635mm" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Datasheet" "https://www.wch.cn/products/CH32X035.html" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (property "Description" "WCH CH32X035G8R6, RISC-V, 62 KB flash, USB FS, 3 comparators, QSOP-28; pins grouped by use" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes))) + (symbol "CH32X035G8R6_0_1" (rectangle (start -15.24 15.24) (end 15.24 -27.94) (stroke (width 0.254) (type default)) (fill (type background)))) + (symbol "CH32X035G8R6_1_1" + (pin bidirectional line (at -17.78 12.7 0) (length 2.54) (name "PC16/UDM" (effects (font (size 1.27 1.27)))) (number "2" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 10.16 0) (length 2.54) (name "PC17/UDP/BOOT" (effects (font (size 1.27 1.27)))) (number "3" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 2.54 0) (length 2.54) (name "PA13/CMP3+" (effects (font (size 1.27 1.27)))) (number "5" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 0.0 0) (length 2.54) (name "PA0/ADC0" (effects (font (size 1.27 1.27)))) (number "9" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -2.54 0) (length 2.54) (name "PA2/CMP3-/ADC2" (effects (font (size 1.27 1.27)))) (number "11" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -7.62 0) (length 2.54) (name "PC19/SWCLK" (effects (font (size 1.27 1.27)))) (number "1" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -10.16 0) (length 2.54) (name "PC18/SWDIO" (effects (font (size 1.27 1.27)))) (number "28" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -12.7 0) (length 2.54) (name "PC14/PA12" (effects (font (size 1.27 1.27)))) (number "4" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -15.24 0) (length 2.54) (name "PC3" (effects (font (size 1.27 1.27)))) (number "8" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -17.78 0) (length 2.54) (name "PA1" (effects (font (size 1.27 1.27)))) (number "10" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -20.32 0) (length 2.54) (name "PA3" (effects (font (size 1.27 1.27)))) (number "12" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -22.86 0) (length 2.54) (name "PA6" (effects (font (size 1.27 1.27)))) (number "13" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at -17.78 -25.4 0) (length 2.54) (name "PB0" (effects (font (size 1.27 1.27)))) (number "14" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 12.7 180) (length 2.54) (name "PA4" (effects (font (size 1.27 1.27)))) (number "15" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 10.16 180) (length 2.54) (name "PA5" (effects (font (size 1.27 1.27)))) (number "16" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 5.08 180) (length 2.54) (name "PA7" (effects (font (size 1.27 1.27)))) (number "17" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 2.54 180) (length 2.54) (name "PB3/CMP3 out" (effects (font (size 1.27 1.27)))) (number "18" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 0.0 180) (length 2.54) (name "PB4" (effects (font (size 1.27 1.27)))) (number "19" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -2.54 180) (length 2.54) (name "PB1/PB5" (effects (font (size 1.27 1.27)))) (number "20" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -5.08 180) (length 2.54) (name "PB6" (effects (font (size 1.27 1.27)))) (number "21" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -7.62 180) (length 2.54) (name "PB7" (effects (font (size 1.27 1.27)))) (number "22" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -10.16 180) (length 2.54) (name "PB8" (effects (font (size 1.27 1.27)))) (number "23" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -12.7 180) (length 2.54) (name "PB9" (effects (font (size 1.27 1.27)))) (number "24" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -15.24 180) (length 2.54) (name "PB10" (effects (font (size 1.27 1.27)))) (number "25" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -17.78 180) (length 2.54) (name "PB11" (effects (font (size 1.27 1.27)))) (number "26" (effects (font (size 1.27 1.27))))) + (pin bidirectional line (at 17.78 -20.32 180) (length 2.54) (name "PB12" (effects (font (size 1.27 1.27)))) (number "27" (effects (font (size 1.27 1.27))))) + (pin power_in line (at 0.0 17.78 270) (length 2.54) (name "VDD" (effects (font (size 1.27 1.27)))) (number "6" (effects (font (size 1.27 1.27))))) + (pin power_in line (at 0.0 -30.48 90) (length 2.54) (name "GND" (effects (font (size 1.27 1.27)))) (number "7" (effects (font (size 1.27 1.27))))) + ) + (embedded_fonts no) + ) +) diff --git a/hardware/calibrator/calibrator.pretty/Buzzer_MLT-8530.kicad_mod b/hardware/calibrator/calibrator.pretty/Buzzer_MLT-8530.kicad_mod new file mode 100644 index 0000000..874e7b9 --- /dev/null +++ b/hardware/calibrator/calibrator.pretty/Buzzer_MLT-8530.kicad_mod @@ -0,0 +1,34 @@ +(footprint "Buzzer_MLT-8530" + (version 20241229) + (generator "calibrator-gen") + (generator_version "9.0") + (layer "F.Cu") + (descr "Magnetic buzzer Huaneng MLT-8530 8.5x8.5x3mm SMD, sound port on +x side, datasheet LCSC C94599") + (property "Reference" "REF**" (at 0 -5.6 0) (layer "F.SilkS") (uuid "5ed8a1a8-43d8-5629-a3b0-17b97068fde5") (effects (font (size 0.8 0.8) (thickness 0.12)))) + (property "Value" "Buzzer_MLT-8530" (at 0 5.6 0) (layer "F.Fab") (uuid "5a27c249-d2b9-50a8-a023-7f95049753a3") (effects (font (size 0.8 0.8) (thickness 0.12)))) + (property "Datasheet" "" (at 0 0 0) (layer "F.Fab") (hide yes) (uuid "ab9c482c-fb0f-57b9-b24c-23b55a9caef2") (effects (font (size 0.8 0.8) (thickness 0.12)))) + (property "Description" "" (at 0 0 0) (layer "F.Fab") (hide yes) (uuid "57a56042-b401-5880-9437-5a9d535b9dd6") (effects (font (size 0.8 0.8) (thickness 0.12)))) + (attr smd) + (pad "1" smd roundrect (at -3.550 -3.550 0) (size 2.3 2.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15) (uuid "584b68b8-d41f-5c0d-a1ab-5ff5887b4765")) + (pad "2" smd roundrect (at -3.550 3.550 0) (size 2.3 2.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15) (uuid "f28dcd66-ab37-5cc5-a9b8-b00ecf441c52")) + (pad "" smd roundrect (at 3.550 -3.550 0) (size 2.3 2.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15) (uuid "8ea5a9c0-6347-5f1d-9c94-35edeca38640")) + (pad "" smd roundrect (at 3.550 3.550 0) (size 2.3 2.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15) (uuid "d4bfc07c-26e5-506d-b444-ec3b9179d5e6")) + (fp_line (start -4.250 -4.250) (end 4.250 -4.250) (stroke (width 0.1) (type solid)) (layer "F.Fab") (uuid "0b2e9760-3b52-5724-a89e-4b13279b513b")) + (fp_line (start 4.250 -4.250) (end 4.250 4.250) (stroke (width 0.1) (type solid)) (layer "F.Fab") (uuid "21dd30a6-b214-58de-b0e5-ac94b7803455")) + (fp_line (start 4.250 4.250) (end -4.250 4.250) (stroke (width 0.1) (type solid)) (layer "F.Fab") (uuid "774abf8f-f4dc-5c38-9138-720a4ffe56ca")) + (fp_line (start -4.250 4.250) (end -4.250 -4.250) (stroke (width 0.1) (type solid)) (layer "F.Fab") (uuid "d85e05c3-3ac1-56ce-9920-8cd443ddfc71")) + (fp_line (start -5.000 -5.000) (end 5.000 -5.000) (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (uuid "2aacef1d-5b8c-5434-ac99-a4394f78cf1b")) + (fp_line (start 5.000 -5.000) (end 5.000 5.000) (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (uuid "470c0a66-a440-512a-bee5-2f521f5d3142")) + (fp_line (start 5.000 5.000) (end -5.000 5.000) (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (uuid "31a61962-bc81-5c7a-a60b-316ee1fb0e7c")) + (fp_line (start -5.000 5.000) (end -5.000 -5.000) (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (uuid "9bb7e926-3010-5206-b335-2ecf120f2709")) + (fp_line (start -4.350 -2.200) (end -4.350 2.200) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "c69b93d7-bcea-5a17-9497-2c0910db8dde")) + (fp_line (start 4.350 -2.200) (end 4.350 2.200) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "99dc41c5-cca6-514f-9737-d6b81412db48")) + (fp_line (start -2.200 -4.350) (end 2.200 -4.350) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "1ab0d342-7b23-50dd-acaa-609af67e0a83")) + (fp_line (start -2.200 4.350) (end 2.200 4.350) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "2bde25aa-5def-5f57-9d74-f4525a3e964d")) + (fp_line (start -5.600 -3.550) (end -4.900 -3.550) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "6c80c8d6-05a3-5413-9280-6ac8abdcf829")) + (fp_line (start -5.250 -3.900) (end -5.250 -3.200) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "e829a112-568e-51cb-88b7-ddc19282b8c3")) + (fp_line (start 2.600 0.000) (end 3.600 0.000) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "3d4cb0a0-ae36-54f7-9089-e4e2a38e5b23")) + (fp_line (start 3.600 0.000) (end 3.100 -0.400) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "2c89aff9-5432-5646-8da7-2537c56cc10c")) + (fp_line (start 3.600 0.000) (end 3.100 0.400) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "8c97ecdc-c28a-5fb5-83f6-99ddf938b519")) + (model "${KIPRJMOD}/3d/MLT-8530.wrl" (offset (xyz 0 0 0.0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0))) +) diff --git a/hardware/calibrator/calibrator.pretty/LED_1206_ReverseMount_XL-3216UWC-FB.kicad_mod b/hardware/calibrator/calibrator.pretty/LED_1206_ReverseMount_XL-3216UWC-FB.kicad_mod new file mode 100644 index 0000000..f0b836f --- /dev/null +++ b/hardware/calibrator/calibrator.pretty/LED_1206_ReverseMount_XL-3216UWC-FB.kicad_mod @@ -0,0 +1,32 @@ +(footprint "LED_1206_ReverseMount_XL-3216UWC-FB" + (version 20241229) + (generator "calibrator-gen") + (generator_version "9.0") + (layer "F.Cu") + (descr "Reverse mount 1206 LED shining through a board cut-out, XINGLIGHT XL-3216UWC-FB (LCSC C3646935); Lite-On LTW-C230DS fits the same footprint") + (property "Reference" "REF**" (at 0 -1.8 0) (layer "F.SilkS") (uuid "d8fee894-bbb0-562e-8b13-d0de2454b437") (effects (font (size 0.8 0.8) (thickness 0.12)))) + (property "Value" "LED_1206_ReverseMount_XL-3216UWC-FB" (at 0 1.8 0) (layer "F.Fab") (uuid "c4277440-bb36-5f32-87e7-e61c8eac1cd7") (effects (font (size 0.8 0.8) (thickness 0.12)))) + (property "Datasheet" "" (at 0 0 0) (layer "F.Fab") (hide yes) (uuid "4782df8f-f463-5b75-af18-fe60ff0945f1") (effects (font (size 0.8 0.8) (thickness 0.12)))) + (property "Description" "" (at 0 0 0) (layer "F.Fab") (hide yes) (uuid "a2969006-da72-5e9e-a404-ca36b650990a") (effects (font (size 0.8 0.8) (thickness 0.12)))) + (attr smd) + (pad "1" smd roundrect (at -1.700 0.000 0) (size 0.7 1.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15) (uuid "50fbf83e-2c4a-5840-aaa6-b0f90b104782")) + (pad "2" smd roundrect (at 1.700 0.000 0) (size 0.7 1.5) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15) (uuid "739fb73f-3e0d-5098-b2a4-eff537723231")) + (fp_line (start -0.550 -0.850) (end 0.550 -0.850) (stroke (width 0.05) (type solid)) (layer "Edge.Cuts") (uuid "06cc8e72-97e0-5f39-9e23-1df9cd8599e5")) + (fp_line (start 1.050 -0.350) (end 1.050 0.350) (stroke (width 0.05) (type solid)) (layer "Edge.Cuts") (uuid "e93852e8-fcfa-5c44-bd49-80fe36bf73ae")) + (fp_line (start 0.550 0.850) (end -0.550 0.850) (stroke (width 0.05) (type solid)) (layer "Edge.Cuts") (uuid "812b1f4f-9dff-5512-adfc-708203d78b77")) + (fp_line (start -1.050 0.350) (end -1.050 -0.350) (stroke (width 0.05) (type solid)) (layer "Edge.Cuts") (uuid "18f31989-210f-55ed-82a0-cb30e98b1f4f")) + (fp_arc (start 0.5500 -0.8500) (mid 0.9036 -0.7036) (end 1.0500 -0.3500) (stroke (width 0.05) (type solid)) (layer "Edge.Cuts") (uuid "0f38c114-48e6-5ee8-93c6-9fc21ca5f9cc")) + (fp_arc (start 1.0500 0.3500) (mid 0.9036 0.7036) (end 0.5500 0.8500) (stroke (width 0.05) (type solid)) (layer "Edge.Cuts") (uuid "8ec0d955-1622-5337-9370-e98ab7af7aa8")) + (fp_arc (start -0.5500 0.8500) (mid -0.9036 0.7036) (end -1.0500 0.3500) (stroke (width 0.05) (type solid)) (layer "Edge.Cuts") (uuid "4a28de63-5a3d-52a5-9fca-7490bb33ae25")) + (fp_arc (start -1.0500 -0.3500) (mid -0.9036 -0.7036) (end -0.5500 -0.8500) (stroke (width 0.05) (type solid)) (layer "Edge.Cuts") (uuid "943aa0d1-dbbf-5801-a3d8-9a05e5fccd10")) + (fp_line (start -1.600 -0.800) (end 1.600 -0.800) (stroke (width 0.1) (type solid)) (layer "F.Fab") (uuid "4a2372a3-081e-560f-b1f4-0a547363fc02")) + (fp_line (start 1.600 -0.800) (end 1.600 0.800) (stroke (width 0.1) (type solid)) (layer "F.Fab") (uuid "9a8b29db-1e00-5c82-99a7-ed6583ea93ee")) + (fp_line (start 1.600 0.800) (end -1.600 0.800) (stroke (width 0.1) (type solid)) (layer "F.Fab") (uuid "8fe06ccb-9256-5226-8bc7-28da5961e6d2")) + (fp_line (start -1.600 0.800) (end -1.600 -0.800) (stroke (width 0.1) (type solid)) (layer "F.Fab") (uuid "1ba282ac-5f1d-5e0d-b08f-110b4751cb0d")) + (fp_line (start -2.300 -1.100) (end 2.300 -1.100) (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (uuid "eb97c25d-2719-5fed-8ccb-163bd30f84f9")) + (fp_line (start 2.300 -1.100) (end 2.300 1.100) (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (uuid "984e8138-2fe1-5851-94ea-d56c30f74240")) + (fp_line (start 2.300 1.100) (end -2.300 1.100) (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (uuid "0ec28024-5a23-5d6e-b90d-ed19dd0b950f")) + (fp_line (start -2.300 1.100) (end -2.300 -1.100) (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (uuid "ec543e23-6bbd-5ed5-916d-38c814c5f3ee")) + (fp_line (start -2.450 -1.000) (end -2.450 1.000) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "8d778bd8-b821-5480-883e-5f5fa6a2e4e1")) + (model "${KIPRJMOD}/3d/LED_reverse_1206.wrl" (offset (xyz 0 0 0.0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0))) +) diff --git a/hardware/calibrator/calibrator.pretty/Vishay_VEMT2500X01_ReverseGullwing.kicad_mod b/hardware/calibrator/calibrator.pretty/Vishay_VEMT2500X01_ReverseGullwing.kicad_mod new file mode 100644 index 0000000..fbe31ac --- /dev/null +++ b/hardware/calibrator/calibrator.pretty/Vishay_VEMT2500X01_ReverseGullwing.kicad_mod @@ -0,0 +1,27 @@ +(footprint "Vishay_VEMT2500X01_ReverseGullwing" + (version 20241229) + (generator "calibrator-gen") + (generator_version "9.0") + (layer "F.Cu") + (descr "Phototransistor Vishay VEMT2500X01 reverse gullwing, lens looks through a 2.3 mm hole; VEMT2000X01 is the same package") + (property "Reference" "REF**" (at 0 -2.0 0) (layer "F.SilkS") (uuid "93b72097-f54c-5997-99cf-6b37f64a2705") (effects (font (size 0.8 0.8) (thickness 0.12)))) + (property "Value" "Vishay_VEMT2500X01_ReverseGullwing" (at 0 2.0 0) (layer "F.Fab") (uuid "dfc45deb-66d6-5f0a-8a3b-0b7e16c7c241") (effects (font (size 0.8 0.8) (thickness 0.12)))) + (property "Datasheet" "" (at 0 0 0) (layer "F.Fab") (hide yes) (uuid "df1f2a35-fdda-5a8a-a62f-7e059aeddb36") (effects (font (size 0.8 0.8) (thickness 0.12)))) + (property "Description" "" (at 0 0 0) (layer "F.Fab") (hide yes) (uuid "5595095e-7015-5cc6-9b7e-a026aad45826") (effects (font (size 0.8 0.8) (thickness 0.12)))) + (attr smd) + (pad "1" smd roundrect (at -2.500 0.000 0) (size 1.7 0.75) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15) (uuid "7a3f1345-4e20-57ca-a77e-952e72f5c911")) + (pad "2" smd roundrect (at 2.500 0.000 0) (size 1.7 0.75) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15) (uuid "cb3c808d-2d3b-5546-a34d-f32610ea481a")) + (pad "" np_thru_hole circle (at 0 0) (size 2.3 2.3) (drill 2.3) (layers "*.Cu" "*.Mask") (uuid "cc2b6fd0-8452-5f10-b460-f6055e30d490")) + (fp_line (start -1.150 -1.150) (end 1.150 -1.150) (stroke (width 0.1) (type solid)) (layer "F.Fab") (uuid "c5cf1ebe-f6b9-5276-82bb-e0dc863ddf4a")) + (fp_line (start 1.150 -1.150) (end 1.150 1.150) (stroke (width 0.1) (type solid)) (layer "F.Fab") (uuid "bc457dea-e439-5349-9219-5a7e0e8680e0")) + (fp_line (start 1.150 1.150) (end -1.150 1.150) (stroke (width 0.1) (type solid)) (layer "F.Fab") (uuid "90a9d40e-aedd-5d74-9214-2252f011e298")) + (fp_line (start -1.150 1.150) (end -1.150 -1.150) (stroke (width 0.1) (type solid)) (layer "F.Fab") (uuid "52720ccf-84d9-5ed5-8e59-411cbd9ef65c")) + (fp_line (start -3.600 -1.600) (end 3.600 -1.600) (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (uuid "70238595-43b2-502b-9e26-0d00bf52dd55")) + (fp_line (start 3.600 -1.600) (end 3.600 1.600) (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (uuid "333408bc-c14e-57d6-a5be-d5bb0b688b04")) + (fp_line (start 3.600 1.600) (end -3.600 1.600) (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (uuid "513f4bd9-746d-5f9c-afe0-e6f992b84785")) + (fp_line (start -3.600 1.600) (end -3.600 -1.600) (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (uuid "b1bb75a3-264c-5066-9967-81d8c1dd5c43")) + (fp_line (start -1.250 -1.250) (end 1.250 -1.250) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "d54fc043-a91a-5f26-8555-7b42fff7c6d0")) + (fp_line (start -1.250 1.250) (end 1.250 1.250) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "9e94c318-e682-5878-bbdd-5caa370e2fd0")) + (fp_line (start -1.250 -1.250) (end -1.250 -0.600) (stroke (width 0.12) (type solid)) (layer "F.SilkS") (uuid "c8d80374-9e37-5bcd-a788-f985a75d1ba7")) + (model "${KIPRJMOD}/3d/VEMT2500X01_RGW.wrl" (offset (xyz 0 0 0.0)) (scale (xyz 1 1 1)) (rotate (xyz 0 0 0))) +) diff --git a/hardware/calibrator/fab/calibrator-bom-jlc.csv b/hardware/calibrator/fab/calibrator-bom-jlc.csv new file mode 100644 index 0000000..598a8c8 --- /dev/null +++ b/hardware/calibrator/fab/calibrator-bom-jlc.csv @@ -0,0 +1,20 @@ +Comment,Designator,Footprint,LCSC Part # +MLT-8530,BZ1,Buzzer_MLT-8530,C94599 +10u,C1,C_0805_2012Metric,C15850 +1u,C2,C_0402_1005Metric,C52923 +100n,C3,C_0402_1005Metric,C1525 +1n,"C4,C5",C_0402_1005Metric,C1523 +XL-3216UWC-FB white,D1,LED_1206_ReverseMount_XL-3216UWC-FB,C3646935 +1N4148WS,D2,D_SOD-323,C2128 +TYPE-C 16P,J1,USB_C_Receptacle_HRO_TYPE-C-31-M-12,C393939 +S8050,Q1,SOT-23,C2146 +VEMT2500X01,"Q2,Q3",Vishay_VEMT2500X01_ReverseGullwing,C3210911 +5.1k,"R1,R2",R_0402_1005Metric,C25905 +10,R3,R_0402_1005Metric,C25077 +150,R4,R_0603_1608Metric,C22808 +1k,R5,R_0402_1005Metric,C11702 +100k,R6,R_0402_1005Metric,C25741 +22k,"R7,R8",R_0402_1005Metric,C25768 +4.7k,R9,R_0402_1005Metric,C25900 +TS-1187A (BOOT),SW1,SW_Push_1P1T_XKB_TS-1187A,C318884 +CH32X035G8R6,U1,QSOP-28_3.9x9.9mm_P0.635mm,C49118551 diff --git a/hardware/calibrator/fab/calibrator-cpl-jlc.csv b/hardware/calibrator/fab/calibrator-cpl-jlc.csv new file mode 100644 index 0000000..363e5c7 --- /dev/null +++ b/hardware/calibrator/fab/calibrator-cpl-jlc.csv @@ -0,0 +1,24 @@ +Designator,Mid X,Mid Y,Layer,Rotation +BZ1,114.6000mm,-111.0000mm,Top,180 +C1,156.6000mm,-102.8000mm,Top,0 +C2,133.6000mm,-112.0000mm,Top,90 +C3,135.0000mm,-112.0000mm,Top,90 +C4,135.0000mm,-108.4000mm,Top,90 +C5,135.0000mm,-105.4000mm,Top,90 +D1,104.4000mm,-111.0000mm,Top,0 +D2,121.6000mm,-104.3000mm,Top,90 +J1,162.6500mm,-111.0000mm,Top,270 +Q1,121.6000mm,-117.6000mm,Top,270 +Q2,105.0000mm,-106.5000mm,Top,0 +Q3,105.0000mm,-115.5000mm,Top,0 +R1,156.6000mm,-107.0000mm,Top,90 +R2,156.6000mm,-115.0000mm,Top,90 +R3,134.3000mm,-102.4000mm,Top,0 +R4,123.2000mm,-109.6000mm,Top,90 +R5,124.4000mm,-115.4000mm,Top,90 +R6,124.4000mm,-119.6000mm,Top,0 +R7,133.6000mm,-108.4000mm,Top,90 +R8,133.6000mm,-105.4000mm,Top,90 +R9,140.5000mm,-116.6000mm,Top,90 +SW1,140.5000mm,-106.0000mm,Top,0 +U1,129.0000mm,-111.0000mm,Top,90 diff --git a/hardware/calibrator/fab/calibrator-gerbers.zip b/hardware/calibrator/fab/calibrator-gerbers.zip new file mode 100644 index 0000000..757a9e5 Binary files /dev/null and b/hardware/calibrator/fab/calibrator-gerbers.zip differ diff --git a/hardware/calibrator/firmware/.gitignore b/hardware/calibrator/firmware/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/hardware/calibrator/firmware/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/hardware/calibrator/firmware/Makefile b/hardware/calibrator/firmware/Makefile new file mode 100644 index 0000000..75d80a8 --- /dev/null +++ b/hardware/calibrator/firmware/Makefile @@ -0,0 +1,54 @@ +# AV Sync calibrator firmware (WCH CH32X035G8R6, RISC-V). Needs a RISC-V GCC in PATH. +# make xPack riscv-none-elf-gcc (default prefix) +# make CROSS=riscv64-unknown-elf- Ubuntu/Debian gcc-riscv64-unknown-elf +# make test host unit tests (plain cc) +# make clean + +CROSS ?= riscv-none-elf- +CC_RV := $(CROSS)gcc +OBJCOPY := $(CROSS)objcopy +SIZE := $(CROSS)size +HOSTCC ?= cc + +BUILD := build +SRCS := src/startup.c src/main.c src/cal_logic.c +OBJS := $(SRCS:src/%.c=$(BUILD)/%.o) + +# Plain RV32IMAC (no WCH vendor extensions), no C library. +ARCH := -march=rv32imac_zicsr -mabi=ilp32 -mcmodel=medlow +CFLAGS := $(ARCH) -Os -std=c11 -g \ + -ffunction-sections -fdata-sections -ffreestanding -fno-tree-loop-distribute-patterns \ + -Wall -Wextra -Werror -Isrc -Ivendor $(EXTRA_CFLAGS) +LDFLAGS := $(ARCH) -nostartfiles -nostdlib -Tsrc/ch32x035.ld \ + -Wl,--gc-sections -Wl,-Map=$(BUILD)/calibrator.map + +HOST_CFLAGS := -std=c11 -O1 -g -Wall -Wextra -Werror + +.PHONY: all test clean + +all: $(BUILD)/calibrator.bin $(BUILD)/calibrator.hex + $(SIZE) $(BUILD)/calibrator.elf + +$(BUILD)/%.o: src/%.c $(wildcard src/*.h) vendor/ch32x035_regs.h | $(BUILD) + $(CC_RV) $(CFLAGS) -c $< -o $@ + +$(BUILD)/calibrator.elf: $(OBJS) src/ch32x035.ld + $(CC_RV) $(OBJS) $(LDFLAGS) -o $@ + +$(BUILD)/calibrator.bin: $(BUILD)/calibrator.elf + $(OBJCOPY) -O binary $< $@ + +$(BUILD)/calibrator.hex: $(BUILD)/calibrator.elf + $(OBJCOPY) -O ihex $< $@ + +$(BUILD)/test_cal_logic: tests/test_cal_logic.c src/cal_logic.c src/cal_logic.h | $(BUILD) + $(HOSTCC) $(HOST_CFLAGS) tests/test_cal_logic.c src/cal_logic.c -o $@ + +test: $(BUILD)/test_cal_logic + ./$(BUILD)/test_cal_logic + +$(BUILD): + mkdir -p $(BUILD) + +clean: + rm -f $(BUILD)/*.o $(BUILD)/*.elf $(BUILD)/*.bin $(BUILD)/*.hex $(BUILD)/*.map $(BUILD)/test_cal_logic diff --git a/hardware/calibrator/firmware/README.md b/hardware/calibrator/firmware/README.md new file mode 100644 index 0000000..1dc641e --- /dev/null +++ b/hardware/calibrator/firmware/README.md @@ -0,0 +1,110 @@ +# Calibrator firmware + +**Status: builds and passes host tests. Not tested on hardware yet.** + +Firmware for the AV Sync calibrator board (WCH CH32X035G8R6, QSOP-28, RISC-V, +internal 48 MHz clock, no crystal). The signal contract (what the app sees and +must do) is in [`docs/calibrator.md`](../../../docs/calibrator.md). + +## What it does + +The board picks its mode from what the two light sensors see. No mode button. + +| Mode | When | What the board does | +| --- | --- | --- | +| Idle | power-up, or sensors lit but no swaps | nothing | +| Camera | both sensors dark for 1 s | pulse train: LED flash + buzzer click, started by one register write | +| Display | the comparator sees a real swap between sensor A and B | clicks at once on every swap, then ignores the sensors for 200 ms | + +Camera train: 3 start pulses at 0, 125 and 250 ms, then 20 timing pulses every 500 ms +(from 1000 ms), then 2 s pause, then it repeats. LED on 1.5 ms, click = 3 buzzer cycles at 2.7 kHz. +All numbers are fields of `cal_cfg_t` in `src/cal_logic.c` (`cal_default_cfg`). + +A swap only counts when an ADC sample in the last 100 ms showed the two sensors clearly +different (at least 80 mV and 25 % apart, not dark) and the comparator now flips the other way. +This stops noise near zero (dark screen, OLED PWM off-phase) from making clicks. + +## USB stays off + +The board has USB data lines only for firmware updates. **This firmware never turns USB on**: +the USB and USB-PD blocks get no clock, the D+/D− pull-ups stay off, and PC16/PC17 stay +floating inputs. A phone therefore never sees a USB device (no pop-ups, no change of the +audio route); it only gives 5 V, because of the 5.1 kΩ resistors on CC1/CC2. +Only the chip's ROM bootloader uses USB, and only in update mode (below). + +## Pins + +| Pin | Name | Use | +| --- | --- | --- | +| 15 | PA4 | LED (high = on) | +| 16 | PA5 | BUZ (high = transistor on) | +| 5 | PA13 | sensor A → comparator 3 + input (C3P0); bonded to PC15 inside the package | +| 9 | PA0 | sensor A (same net) → ADC channel 0 | +| 11 | PA2 | sensor B → comparator 3 − input (C3N0) and ADC channel 2 | +| 18 | PB3 | comparator 3 output (C3O). Read back for the edge interrupt (EXTI line 3, both edges). **Leave unconnected on the board.** | +| 2, 3 | PC16, PC17 | USB D−, D+. PC17 + button to VDD = update mode at power-on | +| 28, 1 | PC18, PC19 | SDI debug (SWDIO, SWCLK), left at reset default | + +Comparator 3 runs with hysteresis. Its output goes to PB3; the EXTI interrupt reads PB3 to know +which sensor is brighter and clicks right away (comparator → pin → interrupt is well under 1 µs). +All other pins are analog (off). A watchdog (about 250 ms) resets the chip if the code hangs, so +the buzzer and LED cannot stay on. + +## Files + +- `src/cal_logic.c/.h` – all mode and timing logic, plain C, no hardware. Same code runs in the tests. +- `src/main.c` – hardware: clock, GPIO, comparator + EXTI, ADC, SysTick timing, watchdog. +- `src/startup.c`, `src/ch32x035.ld` – our own startup code, vector table and linker script. +- `tests/test_cal_logic.c` – host unit tests. +- `vendor/` – minimal CH32X035 register header from ch32fun (MIT), see `vendor/README.md`. + +## Build and test + +Needs a RISC-V GCC in `PATH` and a normal `cc` for the tests. Plain RV32IMAC, no C library, +no WCH compiler extensions. + +```sh +make # xPack riscv-none-elf-gcc (default) +make CROSS=riscv64-unknown-elf- # Ubuntu: apt install gcc-riscv64-unknown-elf picolibc-riscv64-unknown-elf +make test # host unit tests +make clean +``` + +Output: `build/calibrator.bin` (flash this), `.hex`, `.elf`. + +## Update over USB (update mode) + +1. Unplug the board. +2. Hold the BOOT button and plug the board into a PC with a USB-C to USB-C + or USB-A to USB-C cable. +3. Release the button after about 1 s. The chip's ROM bootloader starts and shows up as a + WCH ISP device (USB ID `4348:55e0`, on some chips `1a86:55e0`). +4. Flash with an open-source tool: + + ```sh + wchisp flash build/calibrator.bin # https://github.com/ch32-rs/wchisp (GPL-2.0) + # or + python3 chprog.py build/calibrator.bin # wagiminator/MCU-Flash-Tools (MIT) + ``` + +5. Unplug and plug in again (without the button): the new firmware runs. + +The bootloader is only checked at power-on (not on reset): the button must be held while +power comes up. A blank chip (as delivered by JLCPCB) always starts the bootloader, so the +first flash needs no button. + +On Linux, allow access to the bootloader without root, e.g. `/etc/udev/rules.d/50-wch-isp.rules`: + +``` +SUBSYSTEM=="usb", ATTRS{idVendor}=="4348", ATTRS{idProduct}=="55e0", MODE="0666" +SUBSYSTEM=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55e0", MODE="0666" +``` + +then `sudo udevadm control --reload-rules` (or ask your admin). WCH's own WCHISPTool and +WCH-LinkUtility (closed source) work too. A WCH-LinkE probe on PC18/PC19 can be used for +debugging, but the board has no pads for it. + +## Licence + +MIT, like the rest of the repository (the board itself is CERN-OHL-P-2.0, see `../README.md`). +Vendored header: see `vendor/README.md`. diff --git a/hardware/calibrator/firmware/src/cal_logic.c b/hardware/calibrator/firmware/src/cal_logic.c new file mode 100644 index 0000000..4e9a9dd --- /dev/null +++ b/hardware/calibrator/firmware/src/cal_logic.c @@ -0,0 +1,185 @@ +/* AV Sync calibrator: mode and timing logic. See cal_logic.h and + * docs/calibrator.md for the signal contract. */ +#include "cal_logic.h" + +#include + +/* Wrap-safe "a - b" for a free-running 32-bit ms counter. */ +static int32_t since(uint32_t now, uint32_t then) { return (int32_t)(now - then); } + +void cal_default_cfg(cal_cfg_t *c) +{ + memset(c, 0, sizeof *c); + c->led_pulse_us = 1500; + c->click_cycles = 3; + c->click_half_period_us = 185; + + c->marker_ms[0] = 0; + c->marker_ms[1] = 125; + c->marker_ms[2] = 250; + c->timing_first_ms = 1000; + c->timing_period_ms = 500; + c->timing_count = CAL_TIMING_PULSES; + c->train_pause_ms = 2000; + c->blank_after_pulse_ms = 5; + + c->dark_mv = 150; + c->camera_enter_ms = 1000; + c->camera_exit_ms = 300; + c->display_exit_ms = 1500; + + c->arm_min_diff_mv = 80; + c->arm_min_diff_pct = 25; + c->arm_hold_ms = 100; + c->lockout_ms = 200; +} + +uint32_t cal_pulses_per_train(const cal_cfg_t *c) +{ + return CAL_MARKER_PULSES + c->timing_count; +} + +uint32_t cal_pulse_offset(const cal_cfg_t *c, uint32_t idx) +{ + if (idx < CAL_MARKER_PULSES) + return c->marker_ms[idx]; + return c->timing_first_ms + (idx - CAL_MARKER_PULSES) * c->timing_period_ms; +} + +uint32_t cal_train_length(const cal_cfg_t *c) +{ + return cal_pulse_offset(c, cal_pulses_per_train(c) - 1) + c->train_pause_ms; +} + +void cal_init(cal_state_t *s, const cal_cfg_t *cfg) +{ + memset(s, 0, sizeof *s); + s->cfg = *cfg; + s->mode = CAL_IDLE; +} + +cal_mode_t cal_mode(const cal_state_t *s) { return s->mode; } + +static void enter(cal_state_t *s, cal_mode_t m, uint32_t now) +{ + s->mode = m; + s->dark_valid = false; + s->lit_valid = false; + if (m == CAL_CAMERA) { + s->train_start = now; + s->pulse_idx = 0; + } +} + +/* True while a camera pulse runs or shortly after it (sensor data is unreliable). */ +static bool blanked(const cal_state_t *s, uint32_t now) +{ + if (s->pulse_active) + return true; + return s->blank_valid && since(now, s->blank_until) < 0; +} + +void cal_on_sample(cal_state_t *s, uint32_t now, uint32_t a_mv, uint32_t b_mv) +{ + const cal_cfg_t *c = &s->cfg; + if (blanked(s, now)) + return; + + uint32_t hi = a_mv > b_mv ? a_mv : b_mv; + uint32_t diff = a_mv > b_mv ? a_mv - b_mv : b_mv - a_mv; + bool dark = hi < c->dark_mv; + + /* Arm the edge check: the two sensors clearly see different light. */ + uint32_t need = hi * c->arm_min_diff_pct / 100; + if (need < c->arm_min_diff_mv) + need = c->arm_min_diff_mv; + if (!dark && diff >= need) { + s->armed_sign = a_mv > b_mv ? 1 : -1; + s->armed_until = now + c->arm_hold_ms; + } + + switch (s->mode) { + case CAL_IDLE: + if (!dark) { + s->dark_valid = false; + } else { + if (!s->dark_valid) { + s->dark_valid = true; + s->dark_since = now; + } + if (since(now, s->dark_since) >= (int32_t)c->camera_enter_ms) + enter(s, CAL_CAMERA, now); + } + break; + case CAL_CAMERA: + if (dark) { + s->lit_valid = false; + } else { + if (!s->lit_valid) { + s->lit_valid = true; + s->lit_since = now; + } + if (since(now, s->lit_since) >= (int32_t)c->camera_exit_ms) + enter(s, CAL_IDLE, now); + } + break; + case CAL_DISPLAY: + break; + } +} + +bool cal_on_edge(cal_state_t *s, uint32_t now, int out) +{ + const cal_cfg_t *c = &s->cfg; + if (blanked(s, now)) + return false; + if (s->clicked && since(now, s->last_click) < (int32_t)c->lockout_ms) + return false; + if (s->armed_sign == 0 || since(now, s->armed_until) > 0) + return false; + /* The comparator must have flipped away from the armed state. */ + int new_sign = out ? 1 : -1; + if (new_sign == s->armed_sign) + return false; + + s->armed_sign = 0; + if (s->mode != CAL_DISPLAY) + enter(s, CAL_DISPLAY, now); + s->last_edge = now; + s->clicked = true; + s->last_click = now; + return true; +} + +cal_action_t cal_tick(cal_state_t *s, uint32_t now) +{ + const cal_cfg_t *c = &s->cfg; + if (s->mode == CAL_DISPLAY) { + if (since(now, s->last_edge) >= (int32_t)c->display_exit_ms) + enter(s, CAL_IDLE, now); + return CAL_NONE; + } + if (s->mode != CAL_CAMERA || s->pulse_active) + return CAL_NONE; + + if (s->pulse_idx >= cal_pulses_per_train(c)) { + /* Pause is over when the next train starts. */ + if (since(now, s->train_start) < (int32_t)cal_train_length(c)) + return CAL_NONE; + s->train_start += cal_train_length(c); + s->pulse_idx = 0; + } + if (since(now, s->train_start) < (int32_t)cal_pulse_offset(c, s->pulse_idx)) + return CAL_NONE; + + s->pulse_idx++; + s->pulse_active = true; + return CAL_PULSE; +} + +void cal_pulse_done(cal_state_t *s, uint32_t now) +{ + s->pulse_active = false; + s->blank_valid = true; + s->blank_until = now + s->cfg.blank_after_pulse_ms; +} diff --git a/hardware/calibrator/firmware/src/cal_logic.h b/hardware/calibrator/firmware/src/cal_logic.h new file mode 100644 index 0000000..3e95426 --- /dev/null +++ b/hardware/calibrator/firmware/src/cal_logic.h @@ -0,0 +1,89 @@ +/* AV Sync calibrator: mode and timing logic. + * + * Plain C with no hardware headers, so it builds for the MCU and for the + * host unit tests. All times are milliseconds from a free-running counter + * (wrap-safe), unless the name ends in _us. + */ +#ifndef CAL_LOGIC_H +#define CAL_LOGIC_H + +#include +#include + +#define CAL_MARKER_PULSES 3 +#define CAL_TIMING_PULSES 20 + +typedef enum { CAL_IDLE = 0, CAL_CAMERA = 1, CAL_DISPLAY = 2 } cal_mode_t; +typedef enum { CAL_NONE = 0, CAL_PULSE = 1 } cal_action_t; + +typedef struct { + /* Pulse and click shape */ + uint32_t led_pulse_us; /* LED on-time per camera pulse */ + uint32_t click_cycles; /* buzzer cycles per click */ + uint32_t click_half_period_us; /* 185 us = 2.7 kHz buzzer resonance */ + + /* Camera pulse train (times from the train start) */ + uint32_t marker_ms[CAL_MARKER_PULSES]; /* start pattern */ + uint32_t timing_first_ms; /* first timing pulse */ + uint32_t timing_period_ms; /* gap between timing pulses */ + uint32_t timing_count; /* number of timing pulses (<= CAL_TIMING_PULSES) */ + uint32_t train_pause_ms; /* pause after the last pulse, then repeat */ + uint32_t blank_after_pulse_ms; /* ignore sensors until pulse end + this */ + + /* Mode entry and exit */ + uint32_t dark_mv; /* dark = both sensors below this */ + uint32_t camera_enter_ms; /* dark this long (in IDLE) -> CAMERA */ + uint32_t camera_exit_ms; /* not dark this long (in CAMERA) -> IDLE */ + uint32_t display_exit_ms; /* no valid edge this long -> IDLE */ + + /* Edge checks */ + uint32_t arm_min_diff_mv; /* |A-B| must be at least this ... */ + uint32_t arm_min_diff_pct; /* ... and at least this % of max(A,B) */ + uint32_t arm_hold_ms; /* an arming sample is valid this long */ + uint32_t lockout_ms; /* ignore edges this long after a click */ +} cal_cfg_t; + +typedef struct { + cal_cfg_t cfg; + cal_mode_t mode; + + bool dark_valid; uint32_t dark_since; /* start of the current dark run */ + bool lit_valid; uint32_t lit_since; /* start of the current lit run (camera) */ + + int armed_sign; uint32_t armed_until; /* +1: A brighter, -1: B brighter, 0: none */ + + bool clicked; uint32_t last_click; + uint32_t last_edge; /* last valid edge (display) */ + + uint32_t train_start; + uint32_t pulse_idx; /* next pulse in the train */ + bool pulse_active; /* pulse running: ignore sensors */ + bool blank_valid; uint32_t blank_until; +} cal_state_t; + +/* Defaults as documented in docs/calibrator.md */ +void cal_default_cfg(cal_cfg_t *cfg); + +void cal_init(cal_state_t *s, const cal_cfg_t *cfg); + +/* One ADC sample of both sensor nodes (mV, more light = higher). */ +void cal_on_sample(cal_state_t *s, uint32_t now, uint32_t a_mv, uint32_t b_mv); + +/* Comparator changed. out = 1 when A is brighter than B. + * Returns true when the board must click right now. */ +bool cal_on_edge(cal_state_t *s, uint32_t now, int out); + +/* Call often (every ms). Returns CAL_PULSE when a camera pulse is due. */ +cal_action_t cal_tick(cal_state_t *s, uint32_t now); + +/* Call when the pulse (LED + click) has finished. */ +void cal_pulse_done(cal_state_t *s, uint32_t now); + +cal_mode_t cal_mode(const cal_state_t *s); + +/* Time of pulse number idx inside one train (ms from the train start). */ +uint32_t cal_pulse_offset(const cal_cfg_t *cfg, uint32_t idx); +uint32_t cal_pulses_per_train(const cal_cfg_t *cfg); +uint32_t cal_train_length(const cal_cfg_t *cfg); + +#endif diff --git a/hardware/calibrator/firmware/src/ch32x035.ld b/hardware/calibrator/firmware/src/ch32x035.ld new file mode 100644 index 0000000..a7b3301 --- /dev/null +++ b/hardware/calibrator/firmware/src/ch32x035.ld @@ -0,0 +1,54 @@ +/* CH32X035G8R6: 62 KB code flash at 0x00000000, 20 KB SRAM at 0x20000000 + * (same map as WCH's EVT Ld/Link.ld for the CH32X035). */ +ENTRY(_start) + +__stack_size = 1024; + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 62K + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K +} + +SECTIONS +{ + .init : { + KEEP(*(.init)) /* reset jump + vector table (startup.c) */ + . = ALIGN(4); + } >FLASH + + .text : { + . = ALIGN(4); + *(.text .text.*) + *(.rodata .rodata.*) + *(.srodata .srodata.*) + . = ALIGN(4); + } >FLASH + + .data : { + . = ALIGN(4); + _data_vma = .; + *(.data .data.*) + . = ALIGN(8); + PROVIDE(__global_pointer$ = . + 0x800); + *(.sdata .sdata.*) + . = ALIGN(4); + _edata = .; + } >RAM AT>FLASH + _data_lma = LOADADDR(.data); + + .bss (NOLOAD) : { + . = ALIGN(4); + _sbss = .; + *(.sbss .sbss.*) + *(.bss .bss.*) + *(COMMON) + . = ALIGN(4); + _ebss = .; + } >RAM + + _eusrstack = ORIGIN(RAM) + LENGTH(RAM); + ASSERT(_ebss + __stack_size <= _eusrstack, "RAM full: no room for the stack") + + /DISCARD/ : { *(.comment) *(.riscv.attributes) *(.note*) } +} diff --git a/hardware/calibrator/firmware/src/main.c b/hardware/calibrator/firmware/src/main.c new file mode 100644 index 0000000..0691924 --- /dev/null +++ b/hardware/calibrator/firmware/src/main.c @@ -0,0 +1,242 @@ +/* AV Sync calibrator firmware for the WCH CH32X035G8R6 (QSOP-28). + * + * Pins (see hardware/calibrator schematic): + * PA4 (pin 15) LED high = white LED on + * PA5 (pin 16) BUZ high = NPN on = buzzer coil current + * PA13 (pin 5) SENS_A comparator 3 positive input (C3P0) + * PA0 (pin 9) SENS_A same net, ADC channel 0 + * PA2 (pin 11) SENS_B comparator 3 negative input (C3N0), ADC channel 2 + * PB3 (pin 18) CMP3 output (C3O). Driven by the comparator, read back + * for the edge interrupt. Must stay unconnected on the board. + * PC16/PC17 (pins 2/3) USB D-/D+ to the USB-C receptacle. Button PC17 -> VDD + * enters the WCH ROM bootloader at power-on (update mode). + * PC18/PC19 SDI debug (SWDIO/SWCLK), left at reset default. + * + * USB IS NEVER ENABLED BY THIS FIRMWARE. The USB and USB-PD blocks get no + * clock, AFIO->CTLR keeps the D+/D- pull-ups off, and PC16/PC17 (and PC10/PC11, + * bonded to them inside the package) stay floating inputs. With no pull-up on + * D+ or D-, a phone never sees a USB device: it only supplies 5 V (asked for + * by the 5.1 kohm resistors on CC1/CC2). Only the ROM bootloader, entered with + * the button held at power-on, talks USB. + * + * Package notes (datasheet V2.2, QSOP-28): PA13 is bonded to PC15 and PA12 to + * PC14, PB1 to PB5. Those twins are never outputs here. + * + * All decisions (modes, timing, lock-out) are in cal_logic.c. This file only + * talks to the hardware. NOT TESTED ON HARDWARE YET. + */ +#include "ch32x035_regs.h" +#include "cal_logic.h" + +#define LED_PIN (1u << 4) /* PA4 */ +#define BUZ_PIN (1u << 5) /* PA5 */ +#define CMP_OUT_PIN 3u /* PB3 */ + +#define HCLK_HZ 48000000u +#define TICKS_PER_US (HCLK_HZ / 1000000u) +#define TICKS_PER_MS (HCLK_HZ / 1000u) + +/* The ADC is ratiometric to VDD. VDD is USB VBUS minus a 10 ohm drop, so we + * assume 5000 mV. The thresholds are rough, so this is good enough. */ +#define VDD_MV 5000u + +static volatile uint32_t ms_now; +static cal_state_t cal; + +static inline void irq_off(void) { __asm__ volatile("csrc mstatus, 8" ::: "memory"); } +static inline void irq_on(void) { __asm__ volatile("csrs mstatus, 8" ::: "memory"); } + +/* ---- clock: HSI 48 MHz, no crystal --------------------------------------- */ +/* After reset the core runs from HSI 48 MHz divided by 6. Set 2 flash wait + * states first (WCH TRM / ch32fun SystemInit for CH32X03x), then HCLK = 48 MHz. */ +static void clock_init(void) +{ + FLASH->ACTLR = (FLASH->ACTLR & ~FLASH_ACTLR_LATENCY) | FLASH_ACTLR_LATENCY_2; + RCC->CFGR0 &= ~RCC_HPRE; /* AHB prescaler /1 */ +} + +/* ---- time: SysTick runs free at HCLK (64-bit counter, low word used) ----- */ +static void time_init(void) +{ + SysTick->CTLR = 0; + SysTick->CNTL = 0; + SysTick->CNTH = 0; + SysTick->CTLR = 5u; /* STE (enable) + STCLK (HCLK), no interrupt */ +} + +static inline uint32_t ticks(void) { return SysTick->CNTL; } + +/* Called from the main loop: advances ms_now from the free-running counter. */ +static void time_update(void) +{ + static uint32_t last; + while ((uint32_t)(ticks() - last) >= TICKS_PER_MS) { + last += TICKS_PER_MS; + ms_now++; + } +} + +/* ---- watchdog: about 250 ms ---------------------------------------------- */ +/* IWDG clock = HSI / 1024 = ~46.9 kHz (datasheet clock tree). /32 -> ~1.46 kHz, + * reload 366 -> ~250 ms. */ +static void iwdg_init(void) +{ + IWDG->CTLR = 0x5555u; /* unlock PSCR/RLDR */ + IWDG->PSCR = 3u; /* /32 */ + IWDG->RLDR = 366u; + IWDG->CTLR = 0xAAAAu; /* reload */ + IWDG->CTLR = 0xCCCCu; /* start */ +} + +static void iwdg_feed(void) { IWDG->CTLR = 0xAAAAu; } + +/* ---- GPIO ---------------------------------------------------------------- */ +static void set_mode(GPIO_TypeDef *g, uint32_t pin, uint32_t mode) +{ + volatile uint32_t *reg = pin < 8 ? &g->CFGLR : pin < 16 ? &g->CFGHR : &g->CFGXR; + uint32_t sh = (pin & 7u) * 4u; + *reg = (*reg & ~(0xFu << sh)) | (mode << sh); +} + +static void gpio_init(void) +{ + RCC->APB2PCENR |= RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | + RCC_APB2Periph_GPIOC; + + /* USB stays off: no D+/D- pull-up, USB pin function off (reset values, + * written again on purpose). */ + AFIO->CTLR &= ~(AFIO_CTLR_UDP_PUE | AFIO_CTLR_UDM_PUE | AFIO_CTLR_USB_IOEN | AFIO_CTLR_USB_PHY_V33); + + /* Port A and B: everything analog (off) first. PC16/PC17 (USB/boot), + * PC18/PC19 (debug) and PC3 (reset pin option) keep their reset modes. */ + GPIOA->BCR = LED_PIN | BUZ_PIN; + GPIOA->CFGLR = 0; + GPIOA->CFGHR = 0; + GPIOA->CFGXR = 0; + GPIOB->CFGLR = 0; + GPIOB->CFGHR = 0; + GPIOB->CFGXR = 0; + set_mode(GPIOC, 14, GPIO_MODE_ANALOG); /* PC14 = PA12 twin, unused */ + set_mode(GPIOC, 15, GPIO_MODE_ANALOG); /* PC15 = PA13 twin (SENS_A) */ + + set_mode(GPIOA, 4, GPIO_MODE_OUT_PP_50M); /* LED */ + set_mode(GPIOA, 5, GPIO_MODE_OUT_PP_50M); /* BUZ */ + set_mode(GPIOB, CMP_OUT_PIN, GPIO_MODE_AF_PP_50M); /* CMP3 output */ + /* PA0, PA2, PA13 stay analog (sensor inputs). */ +} + +/* ---- pulse and click ----------------------------------------------------- */ +/* LED (optional) and buzzer start with ONE store to BSHR, so they begin less + * than 1 us apart. Then the buzzer toggles every half period for `cycles` + * cycles and ends low. The LED goes off after led_us. Busy-waits; the whole + * thing is a few ms at most. */ +static void burst(int use_led, uint32_t led_us, uint32_t cycles, uint32_t half_us) +{ + uint32_t t0 = ticks(); + GPIOA->BSHR = use_led ? (LED_PIN | BUZ_PIN) : BUZ_PIN; + + uint32_t edges = cycles ? 2u * cycles - 1u : 0u; /* last edge turns BUZ off */ + uint32_t i = 1; + int led_on = use_led; + while (i <= edges || led_on) { + uint32_t el = (ticks() - t0) / TICKS_PER_US; + if (i <= edges && el >= i * half_us) { + GPIOA->BSHR = (i & 1u) ? (BUZ_PIN << 16) : BUZ_PIN; + i++; + } + if (led_on && el >= led_us) { + GPIOA->BSHR = LED_PIN << 16; + led_on = 0; + } + } + GPIOA->BSHR = BUZ_PIN << 16; /* safety: buzzer always ends low */ +} + +/* ---- comparator 3: A (PA13, P0) vs B (PA2, N0), hysteresis on ------------ */ +/* The comparator output goes to its pin C3O = PB3 (MODE = IO). EXTI line 3 + * watches PB3 on both edges; the interrupt reads the pin to know which sensor + * is now brighter. Comparator -> pin -> EXTI adds well under 1 us. */ +static void cmp_init(void) +{ + OPA->CMPKEY = OPA_KEY1; /* unlock the comparator control */ + OPA->CMPKEY = OPA_KEY2; + OPA->CTLR2 = CMP_FIELD(2, CMP_EN) | CMP_FIELD(2, CMP_MODE_IO) | CMP_FIELD(2, CMP_HYEN); + /* NSEL = 0 (N0 = PA2), PSEL = 0 (P0 = PA13) */ + + AFIO->EXTICR1 = (AFIO->EXTICR1 & ~(3u << (CMP_OUT_PIN * 2))) | (1u << (CMP_OUT_PIN * 2)); /* port B */ + EXTI->RTENR |= 1u << CMP_OUT_PIN; + EXTI->FTENR |= 1u << CMP_OUT_PIN; + EXTI->INTFR = 1u << CMP_OUT_PIN; + EXTI->INTENR |= 1u << CMP_OUT_PIN; + PFIC->IENR[EXTI7_0_IRQn / 32u] = 1u << (EXTI7_0_IRQn % 32u); +} + +void EXTI7_0_IRQHandler(void) __attribute__((interrupt)); +void EXTI7_0_IRQHandler(void) +{ + int out = (GPIOB->INDR >> CMP_OUT_PIN) & 1u; /* 1 = A brighter */ + EXTI->INTFR = 1u << CMP_OUT_PIN; + if (cal_on_edge(&cal, ms_now, out)) + burst(0, 0, cal.cfg.click_cycles, cal.cfg.click_half_period_us); /* click now */ +} + +/* ---- ADC: one software-triggered conversion per channel ------------------ */ +static void adc_init(void) +{ + RCC->APB2PCENR |= RCC_APB2Periph_ADC1; + RCC->APB2PRSTR |= RCC_ADC1RST; + RCC->APB2PRSTR &= ~RCC_ADC1RST; + ADC1->CTLR3 = (ADC1->CTLR3 & ~ADC_CTLR3_CLK_DIV) | ADC_CTLR3_CLK_DIV_3; /* as ch32fun example */ + ADC1->SAMPTR2 = 0x3FFFFFFFu; /* longest sample time on channels 0-9 (high-impedance nodes) */ + ADC1->RSQR1 = 0; /* one conversion per sequence */ + ADC1->CTLR2 = ADC_ADON | ADC_EXTSEL | ADC_EXTTRIG; +} + +static uint32_t adc_read_mv(uint32_t ch) +{ + ADC1->RSQR3 = ch; + ADC1->CTLR2 |= ADC_SWSTART; + while (!(ADC1->STATR & ADC_EOC)) { + } + return (ADC1->RDATAR & 0xFFFu) * VDD_MV / 4095u; +} + +int main(void) +{ + clock_init(); + gpio_init(); + iwdg_init(); + time_init(); + + cal_cfg_t cfg; + cal_default_cfg(&cfg); + cal_init(&cal, &cfg); + + adc_init(); + cmp_init(); + + uint32_t last = ms_now; + for (;;) { + iwdg_feed(); + do { + time_update(); + } while (ms_now == last); + last = ms_now; + + uint32_t a = adc_read_mv(0); /* PA0 = SENS_A */ + uint32_t b = adc_read_mv(2); /* PA2 = SENS_B */ + + irq_off(); + cal_on_sample(&cal, last, a, b); + cal_action_t act = cal_tick(&cal, last); + irq_on(); + + if (act == CAL_PULSE) { + burst(1, cal.cfg.led_pulse_us, cal.cfg.click_cycles, cal.cfg.click_half_period_us); + time_update(); + irq_off(); + cal_pulse_done(&cal, ms_now); + irq_on(); + } + } +} diff --git a/hardware/calibrator/firmware/src/startup.c b/hardware/calibrator/firmware/src/startup.c new file mode 100644 index 0000000..a8fc1e2 --- /dev/null +++ b/hardware/calibrator/firmware/src/startup.c @@ -0,0 +1,105 @@ +/* Startup for the CH32X035 (QingKe V4C RISC-V core), written for this project. + * + * Layout follows WCH's EVT startup and ch32fun (MIT): address 0 holds a jump + * to the reset code, then a table of handler addresses indexed by interrupt + * number. mtvec points to the table with mode 3 (vectored, absolute + * addresses). Handlers use GCC's standard `interrupt` attribute, so the + * hardware register stack (HPE) and nesting are switched off (CSR 0x804 = 0). + */ +#include + +#include "ch32x035_regs.h" + +extern uint32_t _data_lma, _data_vma, _edata, _sbss, _ebss; +int main(void); + +void Default_Handler(void) __attribute__((interrupt)); +void EXTI7_0_IRQHandler(void) __attribute__((interrupt, weak, alias("Default_Handler"))); + +/* Any unexpected interrupt: stop here, the watchdog then resets the chip with + * all pins back to inputs (LED and buzzer off). */ +void Default_Handler(void) +{ + for (;;) { + } +} + +void handle_reset(void) __attribute__((naked, noreturn)); +void c_reset(void) __attribute__((noreturn, used)); + +/* Reset jump (offset 0) followed by the vector table. Entry n = handler of + * interrupt n. Entry 0 is the reset entry itself, like in WCH's table. */ +__attribute__((naked, section(".init"))) void _start(void) +{ + __asm__ volatile( + ".option push\n" + ".option norvc\n" + "j handle_reset\n" + ".option pop\n" + ".balign 4\n" + ".global _vector_base\n" + "_vector_base:\n" + ".word _start\n" /* 0 */ + ".word 0\n" /* 1 */ + ".word Default_Handler\n" /* 2 NMI */ + ".word Default_Handler\n" /* 3 HardFault / exception */ + ".rept 16\n" /* 4-19 */ + ".word Default_Handler\n" + ".endr\n" + ".word EXTI7_0_IRQHandler\n" /* 20 EXTI lines 0-7 (comparator output on PB3) */ + ".rept 28\n" /* 21-48 */ + ".word Default_Handler\n" + ".endr\n"); +} + +void handle_reset(void) +{ + __asm__ volatile( + ".option push\n" + ".option norelax\n" + "la gp, __global_pointer$\n" + ".option pop\n" + "la sp, _eusrstack\n" + "li t0, 0x1f\n" + "csrw 0xbc0, t0\n" /* pipeline + branch prediction on (as WCH EVT) */ + "csrw 0x804, zero\n" /* INTSYSCR: no hardware stack, no nesting */ + "li t0, 0x1880\n" + "csrw mstatus, t0\n" /* stay in machine mode, MPIE set */ + "la t0, _vector_base\n" + "ori t0, t0, 3\n" + "csrw mtvec, t0\n" + "j c_reset\n"); +} + +/* Normal C (stack is set up now): copy .data, clear .bss, enter main. */ +void c_reset(void) +{ + uint32_t *src = &_data_lma; + for (uint32_t *dst = &_data_vma; dst < &_edata;) + *dst++ = *src++; + for (uint32_t *dst = &_sbss; dst < &_ebss;) + *dst++ = 0; + + /* mret into main: interrupts become enabled (MIE = MPIE). */ + __asm__ volatile("csrw mepc, %0\n mret\n" ::"r"(main)); + for (;;) { + } +} + +/* We link without a C library; GCC may still call these for struct copies. */ +void *memset(void *d, int c, unsigned int n) +{ + unsigned char *p = d; + while (n--) + *p++ = (unsigned char)c; + return d; +} + +void *memcpy(void *d, const void *s, unsigned int n) +{ + unsigned char *p = d; + const unsigned char *q = s; + while (n--) + *p++ = *q++; + return d; +} diff --git a/hardware/calibrator/firmware/tests/test_cal_logic.c b/hardware/calibrator/firmware/tests/test_cal_logic.c new file mode 100644 index 0000000..d334229 --- /dev/null +++ b/hardware/calibrator/firmware/tests/test_cal_logic.c @@ -0,0 +1,256 @@ +/* Host unit tests for cal_logic.c. Run with: make test */ +#include "../src/cal_logic.h" + +#include +#include + +static int checks, failures; +#define CHECK(cond) \ + do { \ + checks++; \ + if (!(cond)) { \ + failures++; \ + printf("FAIL %s:%d: %s\n", __FILE__, __LINE__, #cond); \ + } \ + } while (0) + +static cal_cfg_t cfg; +static cal_state_t st; + +static void reset(void) +{ + cal_default_cfg(&cfg); + cal_init(&st, &cfg); +} + +/* Feed one sample per ms from t0 to t1 (inclusive), with ticks. Any due pulse + * is finished at once. Returns the number of pulses. */ +static int run(uint32_t t0, uint32_t t1, uint32_t a, uint32_t b) +{ + int pulses = 0; + for (uint32_t t = t0; t <= t1; t++) { + cal_on_sample(&st, t, a, b); + if (cal_tick(&st, t) == CAL_PULSE) { + pulses++; + cal_pulse_done(&st, t); + } + } + return pulses; +} + +/* Bring the logic into DISPLAY: armed with A brighter, then edge to B brighter. */ +static uint32_t go_display(uint32_t t) +{ + cal_on_sample(&st, t, 3000, 100); + CHECK(cal_on_edge(&st, t + 1, 0)); + CHECK(cal_mode(&st) == CAL_DISPLAY); + return t + 1; +} + +static void test_power_up_idle(void) +{ + reset(); + CHECK(cal_mode(&st) == CAL_IDLE); + CHECK(cal_tick(&st, 0) == CAL_NONE); + CHECK(run(0, 5000, 2000, 2000) == 0); /* lit, no edges: stays silent */ + CHECK(cal_mode(&st) == CAL_IDLE); +} + +static void test_camera_entry(void) +{ + reset(); + run(0, 998, 10, 10); + cal_on_sample(&st, 999, 10, 10); + CHECK(cal_mode(&st) == CAL_IDLE); /* dark for 999 ms */ + cal_on_sample(&st, 1000, 10, 10); + CHECK(cal_mode(&st) == CAL_CAMERA); /* dark for 1000 ms */ + + /* a lit sample in between restarts the dark run */ + reset(); + run(0, 500, 10, 10); + run(501, 501, 2000, 2000); + run(502, 1499, 10, 10); + CHECK(cal_mode(&st) == CAL_IDLE); + run(1500, 1502, 10, 10); + CHECK(cal_mode(&st) == CAL_CAMERA); +} + +static void test_camera_schedule(void) +{ + reset(); + run(0, 999, 10, 10); + cal_on_sample(&st, 1000, 10, 10); + CHECK(cal_mode(&st) == CAL_CAMERA); + const uint32_t start = 1000; + + uint32_t times[64]; + int n = 0; + for (uint32_t t = start; t < start + 2 * 12500 && n < 64; t++) { + cal_on_sample(&st, t, 10, 10); + if (cal_tick(&st, t) == CAL_PULSE) { + times[n++] = t - start; + cal_pulse_done(&st, t); + } + } + CHECK(n == 46); + CHECK(times[0] == 0 && times[1] == 125 && times[2] == 250); + for (int k = 0; k < 20; k++) + CHECK(times[3 + k] == 1000u + 500u * (uint32_t)k); + CHECK(times[22] == 10500); + CHECK(times[23] == 12500); /* 2000 ms pause, then the marker again */ + CHECK(times[24] == 12625 && times[25] == 12750); + CHECK(cal_train_length(&cfg) == 12500); +} + +static void test_blanking(void) +{ + reset(); + run(0, 999, 10, 10); + cal_on_sample(&st, 1000, 10, 10); + CHECK(cal_tick(&st, 1000) == CAL_PULSE); + /* during the pulse: samples and edges are ignored */ + cal_on_sample(&st, 1000, 3000, 100); + CHECK(!cal_on_edge(&st, 1001, 0)); + CHECK(cal_tick(&st, 1001) == CAL_NONE); /* no second pulse while active */ + cal_pulse_done(&st, 1002); + /* until pulse end + 5 ms */ + cal_on_sample(&st, 1006, 3000, 100); + CHECK(!cal_on_edge(&st, 1006, 0)); + CHECK(cal_mode(&st) == CAL_CAMERA); + /* after the blanking: arming works again */ + cal_on_sample(&st, 1007, 3000, 100); + CHECK(cal_on_edge(&st, 1008, 0)); + CHECK(cal_mode(&st) == CAL_DISPLAY); +} + +static void test_valid_edge(void) +{ + reset(); + run(0, 100, 3000, 100); /* lit, A brighter: armed, still idle */ + CHECK(cal_mode(&st) == CAL_IDLE); + CHECK(cal_on_edge(&st, 101, 0)); /* flips to B brighter: click */ + CHECK(cal_mode(&st) == CAL_DISPLAY); + + /* B brighter armed, edge to A brighter */ + reset(); + run(0, 10, 100, 3000); + CHECK(cal_on_edge(&st, 11, 1)); +} + +static void test_chatter_rejected(void) +{ + reset(); + /* both sensors see the same light: never armed */ + run(0, 100, 2000, 1950); + CHECK(!cal_on_edge(&st, 101, 1)); + CHECK(!cal_on_edge(&st, 102, 0)); + /* dark: never armed, even with a large relative difference */ + run(103, 200, 100, 0); + CHECK(!cal_on_edge(&st, 201, 0)); + /* small absolute difference below 80 mV */ + run(202, 300, 300, 230); + CHECK(!cal_on_edge(&st, 301, 0)); + CHECK(cal_mode(&st) == CAL_IDLE); +} + +static void test_same_sign_rejected(void) +{ + reset(); + run(0, 10, 3000, 100); /* A brighter */ + CHECK(!cal_on_edge(&st, 11, 1)); /* says A brighter again: not a swap */ + CHECK(cal_on_edge(&st, 12, 0)); +} + +static void test_lockout(void) +{ + reset(); + uint32_t t = go_display(0); /* click at t = 1 */ + cal_on_sample(&st, t + 150, 100, 3000); + CHECK(!cal_on_edge(&st, t + 199, 1)); /* 199 ms: locked */ + cal_on_sample(&st, t + 199, 100, 3000); + CHECK(cal_on_edge(&st, t + 200, 1)); /* 200 ms, re-armed: click */ + + /* edge after lockout without re-arming is rejected */ + reset(); + t = go_display(0); + CHECK(!cal_on_edge(&st, t + 300, 1)); +} + +static void test_arm_expiry(void) +{ + reset(); + cal_on_sample(&st, 0, 3000, 100); + CHECK(cal_on_edge(&st, 100, 0)); /* exactly 100 ms: still armed */ + reset(); + cal_on_sample(&st, 0, 3000, 100); + CHECK(!cal_on_edge(&st, 101, 0)); /* 101 ms: expired */ +} + +static void test_display_exit(void) +{ + reset(); + uint32_t t = go_display(0); /* last valid edge at 1 */ + CHECK(run(t + 1, t + 1499, 3000, 3000) == 0); + CHECK(cal_mode(&st) == CAL_DISPLAY); + cal_tick(&st, t + 1500); + CHECK(cal_mode(&st) == CAL_IDLE); +} + +static void test_camera_exit(void) +{ + reset(); + run(0, 1000, 10, 10); + CHECK(cal_mode(&st) == CAL_CAMERA); + /* The pulse at 1000 blanks samples until 1005, so the lit run starts at + * 1005. Lit (no difference, so no arming) for 299 ms: stays. */ + run(1001, 1303, 2000, 2000); + CHECK(cal_mode(&st) == CAL_CAMERA); + run(1304, 1304, 2000, 2000); + CHECK(cal_mode(&st) == CAL_CAMERA); + run(1305, 1305, 2000, 2000); + CHECK(cal_mode(&st) == CAL_IDLE); +} + +static void test_edge_in_camera(void) +{ + reset(); + run(0, 1000, 10, 10); + CHECK(cal_mode(&st) == CAL_CAMERA); + run(1001, 1100, 10, 10); /* after the marker pulse blanking */ + cal_on_sample(&st, 1101, 3000, 100); + CHECK(cal_on_edge(&st, 1102, 0)); + CHECK(cal_mode(&st) == CAL_DISPLAY); + /* no more camera pulses, even at the next scheduled time */ + for (uint32_t t = 1103; t < 2500; t++) + CHECK(cal_tick(&st, t) == CAL_NONE); +} + +static void test_wraparound(void) +{ + reset(); + uint32_t t0 = 0xFFFFFF00u; /* counter wraps during the dark run */ + for (uint32_t i = 0; i < 1000; i++) + cal_on_sample(&st, t0 + i, 10, 10); + CHECK(cal_mode(&st) == CAL_IDLE); + cal_on_sample(&st, t0 + 1000, 10, 10); + CHECK(cal_mode(&st) == CAL_CAMERA); +} + +int main(void) +{ + test_power_up_idle(); + test_camera_entry(); + test_camera_schedule(); + test_blanking(); + test_valid_edge(); + test_chatter_rejected(); + test_same_sign_rejected(); + test_lockout(); + test_arm_expiry(); + test_display_exit(); + test_camera_exit(); + test_edge_in_camera(); + test_wraparound(); + printf("%d checks, %d failures\n", checks, failures); + return failures ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/hardware/calibrator/firmware/vendor/LICENSE-MIT-ch32fun.txt b/hardware/calibrator/firmware/vendor/LICENSE-MIT-ch32fun.txt new file mode 100644 index 0000000..551399c --- /dev/null +++ b/hardware/calibrator/firmware/vendor/LICENSE-MIT-ch32fun.txt @@ -0,0 +1,26 @@ +MIT License + +Copyright (c) 2023-2024 CNLohr , et. al. +Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +Copyright (c) 2023-2024 E. Brombaugh +Copyright (c) 2023-2024 A. Mandera +Copyright (c) 2005-2020 Rich Felker, et al. +Copyright (c) 2013,2014 Michal Ludvig + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/hardware/calibrator/firmware/vendor/README.md b/hardware/calibrator/firmware/vendor/README.md new file mode 100644 index 0000000..1fb3e24 --- /dev/null +++ b/hardware/calibrator/firmware/vendor/README.md @@ -0,0 +1,9 @@ +# Vendored files + +| File | What | Source | Licence | +| --- | --- | --- | --- | +| `ch32x035_regs.h` | Minimal CH32X035 register map (only the registers this firmware uses) | Structs, base addresses and bit values taken from `ch32fun/ch32x03xhw.h` of [cnlohr/ch32fun](https://github.com/cnlohr/ch32fun), commit `b28d285460ce052a179dba8f4a22c6f73ff8e328` (2026-10-31), downloaded 2026-11-08. The comparator bit positions in `OPA->CTLR2` follow `OPA_CMP_Init()` in WCH's [openwch/ch32x035](https://github.com/openwch/ch32x035) EVT (`ch32x035_opa.c` V1.0.1); no WCH code is copied. | MIT, see `LICENSE-MIT-ch32fun.txt` | +| `LICENSE-MIT-ch32fun.txt` | Licence text of ch32fun | same repository | MIT | + +The MIT licence fits this MIT firmware. Keep the licence notice with the header. +No scripts or build files from those repositories are used. diff --git a/hardware/calibrator/firmware/vendor/ch32x035_regs.h b/hardware/calibrator/firmware/vendor/ch32x035_regs.h new file mode 100644 index 0000000..dc8c7ad --- /dev/null +++ b/hardware/calibrator/firmware/vendor/ch32x035_regs.h @@ -0,0 +1,163 @@ +/* Minimal CH32X035 register map for the AV Sync calibrator. + * + * Extracted (structs, base addresses, bit values) from ch32fun's + * ch32fun/ch32x03xhw.h, https://github.com/cnlohr/ch32fun, commit + * b28d285460ce052a179dba8f4a22c6f73ff8e328 (2026-10-31). MIT licence, see + * LICENSE-MIT-ch32fun.txt (copyright CNLohr et al. and Nanjing Qinheng + * Microelectronics). Comparator bit layout of OPA->CTLR2 follows WCH's + * OPA_CMP_Init() in openwch/ch32x035 EVT (ch32x035_opa.c V1.0.1); only the + * bit positions were taken, no code. + * + * Only what the calibrator firmware uses is here. + */ +#ifndef CH32X035_REGS_H +#define CH32X035_REGS_H + +#include + +#define __I volatile const +#define __O volatile +#define __IO volatile + +typedef struct { + __IO uint32_t CTLR, CFGR0, INTR, APB2PRSTR, APB1PRSTR, AHBPCENR, APB2PCENR, APB1PCENR; + __IO uint32_t RESERVED1, RSTSCKR, AHBRSTR; +} RCC_TypeDef; + +typedef struct { + __IO uint32_t ACTLR, KEYR, OBKEYR, STATR, CTLR, ADDR, RESERVED, OBR, WPR, MODEKEYR, BOOT_MODEKEYR; +} FLASH_TypeDef; + +typedef struct { + __IO uint32_t CFGLR; /* pins 0-7, 4 bits each */ + __IO uint32_t CFGHR; /* pins 8-15 */ + __I uint32_t INDR; + __IO uint32_t OUTDR; + __IO uint32_t BSHR; /* low half sets, high half resets */ + __IO uint32_t BCR; + __IO uint32_t LCKR; + __IO uint32_t CFGXR; /* pins 16-23 */ + __IO uint32_t BSXR; +} GPIO_TypeDef; + +typedef struct { + uint32_t RESERVED0; + __IO uint32_t PCFR1, EXTICR1, EXTICR2; + uint32_t RESERVED1, RESERVED2; + __IO uint32_t CTLR; /* USB pin options (UDP pull-up, USB IO enable) */ +} AFIO_TypeDef; + +typedef struct { + __IO uint32_t INTENR, EVENR, RTENR, FTENR, SWIEVR, INTFR; +} EXTI_TypeDef; + +typedef struct { + __IO uint32_t STATR, CTLR1, CTLR2, SAMPTR1, SAMPTR2, IOFR1, IOFR2, IOFR3, IOFR4; + __IO uint32_t WDHTR, WDLTR, RSQR1, RSQR2, RSQR3, ISQR, IDATAR1, IDATAR2, IDATAR3, IDATAR4; + __IO uint32_t RDATAR, CTLR3, WDTR1, WDTR2, WDTR3; +} ADC_TypeDef; + +typedef struct { + __IO uint32_t CTLR, PSCR, RLDR, STATR; +} IWDG_TypeDef; + +typedef struct { + __IO uint16_t CFGR1, CFGR2; + __IO uint32_t CTLR1, CTLR2, OPAKEY, CMPKEY, POLLKEY; +} OPA_TypeDef; + +typedef struct { + __IO uint32_t CTLR, SR, CNTL, CNTH, CMPL, CMPH; +} SysTick_Type; + +typedef struct { + __I uint32_t ISR[8]; + __I uint32_t IPR[8]; + __IO uint32_t ITHRESDR, RESERVED, CFGR; + __I uint32_t GISR; + __IO uint8_t VTFIDR[4]; + uint8_t RESERVED0[12]; + __IO uint32_t VTFADDR[4]; + uint8_t RESERVED1[0x90]; + __O uint32_t IENR[8]; + uint8_t RESERVED2[0x60]; + __O uint32_t IRER[8]; + uint8_t RESERVED3[0x60]; + __O uint32_t IPSR[8]; + uint8_t RESERVED4[0x60]; + __O uint32_t IPRR[8]; + uint8_t RESERVED5[0x60]; + __IO uint32_t IACTR[8]; + uint8_t RESERVED6[0xE0]; + __IO uint8_t IPRIOR[256]; +} PFIC_Type; + +#define PERIPH_BASE 0x40000000u +#define APB1PERIPH_BASE (PERIPH_BASE) +#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000u) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000u) +#define CORE_PERIPH_BASE 0xE0000000u + +#define IWDG ((IWDG_TypeDef *)(APB1PERIPH_BASE + 0x3000u)) +#define AFIO ((AFIO_TypeDef *)(APB2PERIPH_BASE + 0x0000u)) +#define EXTI ((EXTI_TypeDef *)(APB2PERIPH_BASE + 0x0400u)) +#define GPIOA ((GPIO_TypeDef *)(APB2PERIPH_BASE + 0x0800u)) +#define GPIOB ((GPIO_TypeDef *)(APB2PERIPH_BASE + 0x0C00u)) +#define GPIOC ((GPIO_TypeDef *)(APB2PERIPH_BASE + 0x1000u)) +#define ADC1 ((ADC_TypeDef *)(APB2PERIPH_BASE + 0x2400u)) +#define RCC ((RCC_TypeDef *)(AHBPERIPH_BASE + 0x1000u)) +#define FLASH ((FLASH_TypeDef *)(AHBPERIPH_BASE + 0x2000u)) +#define OPA ((OPA_TypeDef *)(AHBPERIPH_BASE + 0x6000u)) +#define PFIC ((PFIC_Type *)(CORE_PERIPH_BASE + 0xE000u)) +#define SysTick ((SysTick_Type *)(CORE_PERIPH_BASE + 0xF000u)) + +/* RCC */ +#define RCC_HPRE 0x000000F0u /* AHB prescaler field (reset: /6) */ +#define RCC_APB2Periph_AFIO 0x00000001u +#define RCC_APB2Periph_GPIOA 0x00000004u +#define RCC_APB2Periph_GPIOB 0x00000008u +#define RCC_APB2Periph_GPIOC 0x00000010u +#define RCC_APB2Periph_ADC1 0x00000200u +#define RCC_ADC1RST 0x00000200u + +/* FLASH */ +#define FLASH_ACTLR_LATENCY 0x00000003u +#define FLASH_ACTLR_LATENCY_2 0x00000002u /* 2 wait states, needed at 48 MHz */ + +/* GPIO 4-bit pin modes (CFGLR/CFGHR/CFGXR) */ +#define GPIO_MODE_ANALOG 0x0u +#define GPIO_MODE_IN_FLOAT 0x4u +#define GPIO_MODE_OUT_PP_50M 0x3u +#define GPIO_MODE_AF_PP_50M 0xBu + +/* AFIO->CTLR USB pin options: must stay 0 (no pull-up on D+, USB pins off) */ +#define AFIO_CTLR_UDP_PUE 0x0000000Cu +#define AFIO_CTLR_UDM_PUE 0x00000003u +#define AFIO_CTLR_USB_PHY_V33 0x00000040u +#define AFIO_CTLR_USB_IOEN 0x00000080u + +/* ADC */ +#define ADC_EOC 0x00000002u +#define ADC_ADON 0x00000001u +#define ADC_EXTSEL 0x000E0000u /* 111 = SWSTART */ +#define ADC_EXTTRIG 0x00100000u +#define ADC_SWSTART 0x00400000u +#define ADC_CTLR3_CLK_DIV 0x0000000Fu +#define ADC_CTLR3_CLK_DIV_3 0x00000008u + +/* OPA->CTLR2 comparator fields, CMPn (n = 0, 1, 2) at bit 5n: + * +0 EN, +1 MODE (0 = output to TIM2, 1 = output to the CnO pin), + * +2 NSEL (0 = N0, 1 = N1), +3 PSEL (0 = P0, 1 = P1), +4 HYEN (hysteresis). */ +#define CMP_FIELD(n, bit) (1u << (5u * (n) + (bit))) +#define CMP_EN 0u +#define CMP_MODE_IO 1u +#define CMP_NSEL 2u +#define CMP_PSEL 3u +#define CMP_HYEN 4u +#define OPA_KEY1 0x45670123u +#define OPA_KEY2 0xCDEF89ABu + +/* Interrupt numbers used here (PFIC) */ +#define EXTI7_0_IRQn 20u + +#endif diff --git a/hardware/calibrator/fp-lib-table b/hardware/calibrator/fp-lib-table new file mode 100644 index 0000000..f9440bb --- /dev/null +++ b/hardware/calibrator/fp-lib-table @@ -0,0 +1,4 @@ +(fp_lib_table + (version 7) + (lib (name "calibrator")(type "KiCad")(uri "${KIPRJMOD}/calibrator.pretty")(options "")(descr "AVsync calibrator custom footprints")) +) diff --git a/hardware/calibrator/renders/calibrator-3d.png b/hardware/calibrator/renders/calibrator-3d.png new file mode 100644 index 0000000..d940d7a Binary files /dev/null and b/hardware/calibrator/renders/calibrator-3d.png differ diff --git a/hardware/calibrator/renders/calibrator-bottom.png b/hardware/calibrator/renders/calibrator-bottom.png new file mode 100644 index 0000000..a527e86 Binary files /dev/null and b/hardware/calibrator/renders/calibrator-bottom.png differ diff --git a/hardware/calibrator/renders/calibrator-schematic.pdf b/hardware/calibrator/renders/calibrator-schematic.pdf new file mode 100644 index 0000000..4b52eea Binary files /dev/null and b/hardware/calibrator/renders/calibrator-schematic.pdf differ diff --git a/hardware/calibrator/renders/calibrator-top.png b/hardware/calibrator/renders/calibrator-top.png new file mode 100644 index 0000000..d8831e9 Binary files /dev/null and b/hardware/calibrator/renders/calibrator-top.png differ diff --git a/hardware/calibrator/renders/calibrator.svg b/hardware/calibrator/renders/calibrator.svg new file mode 100644 index 0000000..5fabaeb --- /dev/null +++ b/hardware/calibrator/renders/calibrator.svg @@ -0,0 +1,55106 @@ + + + +SVG Image created as calibrator.svg date 2026/11/08 20:41:01 + Image generated by Eeschema-SVG + + + + + + + + + + + + + + +1 +1 + + + + + +2 +2 + + + + + + + + + + +3 +3 + + + + + + + + + + + + + +4 +4 + + + +5 +5 + + + + + + + + + + + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + +2 +2 + + + + + + + + + + +3 +3 + + + + + + + + + + + + + +4 +4 + + + +5 +5 + + + + + + + + + + + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + + + + +A +A + + + +B +B + + + + + + + + + + + + + + + + + + +C +C + + + + + + + + + + + + + + + +D +D + + + + + + + + + + + + + + + +A +A + + + +B +B + + + + + + + + + + + + + + + + + + +C +C + + + + + + + + + + + + + + + +D +D + + + + + + + + + + + + +Date: 2026-11-08 +Date: 2026-11-08 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +KiCad E.D.A. 9.0.9 +KiCad E.D.A. 9.0.9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Rev: 0.3 +Rev: 0.3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Size: A4 +Size: A4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Id: 1/1 +Id: 1/1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Title: AVsync calibrator +Title: AVsync calibrator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +File: calibrator.kicad_sch +File: calibrator.kicad_sch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sheet: / +Sheet: / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +v1 proposal - not built or tested yet +v1 proposal - not built or tested yet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Generated by scripts/gen_sch.py from scripts/design.py +Generated by scripts/gen_sch.py from scripts/design.py + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SPDX-License-Identifier: CERN-OHL-P-2.0 +SPDX-License-Identifier: CERN-OHL-P-2.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R4 +R4 + + + + + + + + + + + + + + +150 +150 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +D1 +D1 + + + + + + + + + + + + + + + + + +XL-3216UWC-FB white +XL-3216UWC-FB white + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VDD +VDD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PC16/UDM +PC16/UDM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +PC17/UDP/BOOT +PC17/UDP/BOOT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + + + + +PA13/CMP3+ +PA13/CMP3+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5 +5 + + + + + + + + + + + + + + + + + + + + +PA0/ADC0 +PA0/ADC0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +9 +9 + + + + + + + + + + + + + + + + + + + + + + + + + + +PA2/CMP3-/ADC2 +PA2/CMP3-/ADC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +11 +11 + + + + + + + + + + + + + + + +PC19/SWCLK +PC19/SWCLK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +PC18/SWDIO +PC18/SWDIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +28 +28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PC14/PA12 +PC14/PA12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 +4 + + + + + + + + +PC3 +PC3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +8 +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA1 +PA1 + + + + + + + + + + + + + + + + + + + + +10 +10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA3 +PA3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +12 +12 + + + + + + + + + + + + + + + + + + + + +PA6 +PA6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +13 +13 + + + + + + + + + + + + + + + + + + + + + + + +PB0 +PB0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +14 +14 + + + + + + + + + + + + + + +VDD + +VDD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +6 + +6 + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +7 + +7 + + + + + + + +PA4 +PA4 + + + + + + + + + + + + + + + + + + +15 +15 + + + + + + + + + + + + + + + + + + + + + + + + + +PA5 +PA5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +16 +16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA7 +PA7 + + + + + + + + + + + + + + + + + +17 +17 + + + + + + + + + + + + +PB3/CMP3_out +PB3/CMP3_out + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +18 +18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB4 +PB4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +19 +19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB1/PB5 +PB1/PB5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +20 +20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB6 +PB6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +21 +21 + + + + + + + + + + + + + + + + + + + + +PB7 +PB7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +22 +22 + + + + + + + + + + + + + + + + + + + + + + + + + +PB8 +PB8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +23 +23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB9 +PB9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +24 +24 + + + + + + + + + + + + + + + + + + +PB10 +PB10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +25 +25 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB11 +PB11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +26 +26 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB12 +PB12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +27 +27 + + + + + + + + + + + + + + +U1 +U1 + + + + + + + + + + + + + + +CH32X035G8R6 +CH32X035G8R6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C5 +C5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1n +1n + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R6 +R6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +100k +100k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R8 +R8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +22k +22k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + +1 + + + + + + + + + + + +2 + +2 + + + + + + + + + + + + +Q2 +Q2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VEMT2500X01 +VEMT2500X01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VDD +VDD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VDD +VDD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R7 +R7 + + + + + + + + + + + + + +22k +22k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C4 +C4 + + + + + + + + + + + + + + + + + + +1n +1n + + + + + + + + + + + + + + + + + + + + +C2 +C2 + + + + + + + + + + + + + + + + + + + + + + + + + +1u +1u + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PWR_FLAG +PWR_FLAG + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R1 +R1 + + + + + + + + + + + + + + + + +5.1k +5.1k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VBUS +VBUS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R3 +R3 + + + + + + + + + + + + + + + + + + + + + + + + +10 +10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C1 +C1 + + + + + + + + + + + + + + + + + + + + +10u +10u + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PWR_FLAG +PWR_FLAG + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + +1 + + + + + + + + + + + +2 + +2 + + + + + + + + + + + + +Q3 +Q3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VEMT2500X01 +VEMT2500X01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + + +3 + +3 + + + + + + + + + + + + + + + + + + + +2 + +2 + + + + + + + + + + + + +Q1 +Q1 + + + + + + + + + + + + + + + + + + + + + + + + + + +S8050 +S8050 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R5 +R5 + + + + + + + + + + + + + + + + + + + + + + + + + + +1k +1k + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +2 +2 + + + + + + + + + + + + +BZ1 +BZ1 + + + + + + + + + + + + + + + + + + + + + + + + + + +MLT-8530 +MLT-8530 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VBUS +VBUS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +D2 +D2 + + + + + + + + + + + + + + + + + + + + + + +1N4148WS +1N4148WS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VDD +VDD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SHIELD + +SHIELD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +S1 + +S1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A1 + +A1 + + + + + + + + + + + + + +VBUS +VBUS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A4 +A4 + + + + + + + + + + + +CC1 +CC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A5 +A5 + + + + + + + + + + + + + + + + + + + + + + + +CC2 +CC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +B5 +B5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +D- +D- + + + + + + + + + + + + + + + +A7 +A7 + + + + + + + + + + +D- +D- + + + + + + + + + + + + + + + +B7 +B7 + + + + + + + + + + + + + + + + + + + + + + + + + +D+ +D+ + + + + + + + + + + + + + + + + +A6 +A6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +D+ +D+ + + + + + + + + + + + + + + + + +B6 +B6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SBU1 +SBU1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A8 +A8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SBU2 +SBU2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +B8 +B8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J1 +J1 + + + + + + + + + + +TYPE-C 16P +TYPE-C 16P + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PWR_FLAG +PWR_FLAG + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R9 +R9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4.7k +4.7k + + + + + + + + + + + + + + + + + + + + + + +R2 +R2 + + + + + + + + + + + + + + + + + + + + + +5.1k +5.1k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VDD +VDD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SW1 +SW1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TS-1187A (BOOT) +TS-1187A (BOOT) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C3 +C3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +100n +100n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Reverse-gullwing parts look down through holes. CMP3 (hysteresis) +Reverse-gullwing parts look down through holes. CMP3 (hysteresis) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +D2 catches the coil kick; R6 keeps Q1 off during reset. +D2 catches the coil kick; R6 keeps Q1 off during reset. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA4 and PA5 are set by one register write. +PA4 and PA5 are set by one register write. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Reverse-mount white LED shines through a hole (~12 mA). +Reverse-mount white LED shines through a hole (~12 mA). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +so a phone sees no device. R3 + C2/C3 filter spikes; C2/C3 sit at U1. +so a phone sees no device. R3 + C2/C3 filter spikes; C2/C3 sit at U1. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +D+/D- go only to the MCU. The firmware never turns USB on, +D+/D- go only to the MCU. The firmware never turns USB on, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5.1k on CC1/CC2 asks the phone for 5 V. +5.1k on CC1/CC2 asks the phone for 5 V. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +USB-C: power + update +USB-C: power + update + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +flips where A and B see the same light; ADC0/ADC2 read dark / light. +flips where A and B see the same light; ADC0/ADC2 read dark / light. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +MCU +MCU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +only at power-on with PC17 (D+) high; R9 limits the current into D+. +only at power-on with PC17 (D+) high; R9 limits the current into D+. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Flash + click (camera and display mode) +Flash + click (camera and display mode) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Light sensors (display mode) +Light sensors (display mode) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Update: hold SW1 while plugging into a PC. The ROM bootloader starts +Update: hold SW1 while plugging into a PC. The ROM bootloader starts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J1 +J1 + + + + + + + + + + +TYPE-C 16P +TYPE-C 16P + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SHIELD + +SHIELD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +S1 + +S1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A1 + +A1 + + + + + + + + + + + + + +VBUS +VBUS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A4 +A4 + + + + + + + + + + + +CC1 +CC1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A5 +A5 + + + + + + + + + + + + + + + + + + + + + + + +CC2 +CC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +B5 +B5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +D- +D- + + + + + + + + + + + + + + + +A7 +A7 + + + + + + + + + + +D- +D- + + + + + + + + + + + + + + + +B7 +B7 + + + + + + + + + + + + + + + + + + + + + + + + + +D+ +D+ + + + + + + + + + + + + + + + + +A6 +A6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +D+ +D+ + + + + + + + + + + + + + + + + +B6 +B6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SBU1 +SBU1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A8 +A8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SBU2 +SBU2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +B8 +B8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PWR_FLAG +PWR_FLAG + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Q3 +Q3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VEMT2500X01 +VEMT2500X01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + +1 + + + + + + + + + + + +2 + +2 + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +U1 +U1 + + + + + + + + + + + + + + +CH32X035G8R6 +CH32X035G8R6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PC16/UDM +PC16/UDM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2 +2 + + + + + + + + + + + + + + + +PC17/UDP/BOOT +PC17/UDP/BOOT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 +3 + + + + + + + + + + + + + + + + + + +PA13/CMP3+ +PA13/CMP3+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5 +5 + + + + + + + + + + + + + + + + + + + + +PA0/ADC0 +PA0/ADC0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +9 +9 + + + + + + + + + + + + + + + + + + + + + + + + + + +PA2/CMP3-/ADC2 +PA2/CMP3-/ADC2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +11 +11 + + + + + + + + + + + + + + + +PC19/SWCLK +PC19/SWCLK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + +PC18/SWDIO +PC18/SWDIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +28 +28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PC14/PA12 +PC14/PA12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 +4 + + + + + + + + +PC3 +PC3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +8 +8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA1 +PA1 + + + + + + + + + + + + + + + + + + + + +10 +10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA3 +PA3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +12 +12 + + + + + + + + + + + + + + + + + + + + +PA6 +PA6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +13 +13 + + + + + + + + + + + + + + + + + + + + + + + +PB0 +PB0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +14 +14 + + + + + + + + + + + + + + +VDD + +VDD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +6 + +6 + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND + +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +7 + +7 + + + + + + + +PA4 +PA4 + + + + + + + + + + + + + + + + + + +15 +15 + + + + + + + + + + + + + + + + + + + + + + + + + +PA5 +PA5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +16 +16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PA7 +PA7 + + + + + + + + + + + + + + + + + +17 +17 + + + + + + + + + + + + +PB3/CMP3_out +PB3/CMP3_out + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +18 +18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB4 +PB4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +19 +19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB1/PB5 +PB1/PB5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +20 +20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB6 +PB6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +21 +21 + + + + + + + + + + + + + + + + + + + + +PB7 +PB7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +22 +22 + + + + + + + + + + + + + + + + + + + + + + + + + +PB8 +PB8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +23 +23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB9 +PB9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +24 +24 + + + + + + + + + + + + + + + + + + +PB10 +PB10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +25 +25 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB11 +PB11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +26 +26 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PB12 +PB12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +27 +27 + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +D1 +D1 + + + + + + + + + + + + + + + + + +XL-3216UWC-FB white +XL-3216UWC-FB white + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R4 +R4 + + + + + + + + + + + + + + +150 +150 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R6 +R6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +100k +100k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Q1 +Q1 + + + + + + + + + + + + + + + + + + + + + + + + + + +S8050 +S8050 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + + + + + + + +3 + +3 + + + + + + + + + + + + + + + + + + + +2 + +2 + + + + + + + + + + + + +C1 +C1 + + + + + + + + + + + + + + + + + + + + +10u +10u + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R3 +R3 + + + + + + + + + + + + + + + + + + + + + + + + +10 +10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R1 +R1 + + + + + + + + + + + + + + + + +5.1k +5.1k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PWR_FLAG +PWR_FLAG + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hardware/calibrator/scripts/build.sh b/hardware/calibrator/scripts/build.sh new file mode 100755 index 0000000..5ce7978 --- /dev/null +++ b/hardware/calibrator/scripts/build.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# Rebuild footprints, schematic, placed board, autorouted board, ERC and DRC. +# Needs docker; KiCad 9.0.9 and Freerouting 2.1.0 images are pinned here. +set -e +cd "$(dirname "$0")/.." +python3 scripts/gen_footprints.py +scripts/kicad.sh sh -c 'cd scripts && python3 gen_sch.py && cd .. && + kicad-cli sch export netlist --format kicadsexpr -o /tmp/cal.net calibrator.kicad_sch > /dev/null && + python3 scripts/check_netlist.py /tmp/cal.net' +# The autorouter is not deterministic; retry until the ground fill has no islands left. +for try in 1 2 3 4 5; do + scripts/kicad.sh sh -c 'cd scripts && python3 gen_pcb.py place' > /dev/null + docker run --rm -u "$(id -u):$(id -g)" -e HOME=/tmp -v "$PWD:/work" -w /work --entrypoint java \ + ghcr.io/freerouting/freerouting:2.1.0 -jar /app/freerouting-executable.jar \ + -de /work/calibrator.dsn -do /work/calibrator.ses -mp 15 --gui.enabled=false > /dev/null + if scripts/kicad.sh sh -c 'cd scripts && python3 gen_pcb.py import && python3 gen_pcb.py finish' | tee /dev/stderr | grep -q "unconnected after fill: 0"; then + break + fi +done +rm -f calibrator.dsn calibrator.ses +scripts/kicad.sh kicad-cli sch erc --severity-all -o /work/erc.rpt calibrator.kicad_sch +scripts/kicad.sh kicad-cli pcb drc --severity-all -o /work/drc.rpt calibrator.kicad_pcb diff --git a/hardware/calibrator/scripts/check_netlist.py b/hardware/calibrator/scripts/check_netlist.py new file mode 100644 index 0000000..87a8d9d --- /dev/null +++ b/hardware/calibrator/scripts/check_netlist.py @@ -0,0 +1,35 @@ +"""Checks that the drawn schematic has exactly the connections in design.py. + +Usage (inside the KiCad image, after gen_sch.py): + kicad-cli sch export netlist --format kicadsexpr -o /tmp/cal.net calibrator.kicad_sch + python3 scripts/check_netlist.py /tmp/cal.net +""" +import re +import sys + +sys.path.insert(0, __file__.rsplit("/", 1)[0]) +import design as D # noqa: E402 + +text = open(sys.argv[1]).read() +drawn = set() +for chunk in text.split("(net (code")[1:]: + name = re.search(r'\(name "([^"]*)"', chunk).group(1) + nodes = frozenset(n for n in re.findall(r'\(node \(ref "([^"]+)"\) \(pin "([^"]+)"\)', chunk) + if not n[0].startswith("#")) + if nodes and not name.startswith("unconnected"): + drawn.add(nodes) +want = {} +for ref, p in D.PARTS.items(): + for pin, net in p[4].items(): + if net: + want.setdefault(net, set()).add((ref, pin)) +want = {frozenset(v) for v in want.values()} +drawn = {d for d in drawn if len(d) > 0} +missing = want - drawn +extra = drawn - want +for s in missing: + print("in design.py but not drawn:", sorted(s)) +for s in extra: + print("drawn but not in design.py:", sorted(s)) +print("netlist check:", "OK" if not missing and not extra else "MISMATCH") +sys.exit(1 if missing or extra else 0) diff --git a/hardware/calibrator/scripts/design.py b/hardware/calibrator/scripts/design.py new file mode 100644 index 0000000..3b60dbe --- /dev/null +++ b/hardware/calibrator/scripts/design.py @@ -0,0 +1,73 @@ +"""AVsync calibrator: one place for parts, nets and placement. + +gen_sch.py (schematic) and gen_pcb.py (board) both read this file, so the +schematic and the board always have the same parts and the same nets. +Units: mm. Board origin is the top-left corner of the board outline. +""" + +# Board outline (mm). End A (x = 0) carries the LED and the two sensors. +# End B (x = BOARD_W) carries the USB-C receptacle. +BOARD_W = 66.0 +BOARD_H = 22.0 +CORNER_R = 2.0 +SPLIT_Y = BOARD_H / 2 # sensor split line runs along the board at this y +NOTCH_R = 1.0 # half-round notch in end A, on the split line +PCB_THICKNESS = 1.2 # makes the reverse-gullwing sensor lenses flush with the bottom + +# KiCad shows the board at this offset on the page. +ORIGIN = (100.0, 100.0) + +FP_R0402 = "Resistor_SMD:R_0402_1005Metric" +FP_R0603 = "Resistor_SMD:R_0603_1608Metric" +FP_C0402 = "Capacitor_SMD:C_0402_1005Metric" +FP_C0805 = "Capacitor_SMD:C_0805_2012Metric" + +# ref: (lib_id, value, footprint, LCSC, {pin: net}, pcb (x, y, rot, side)) +# The schematic drawing (positions and wires) is in gen_sch.py. +PARTS = { + "U1": ("calibrator:CH32X035G8R6", "CH32X035G8R6", "Package_SO:QSOP-28_3.9x9.9mm_P0.635mm", "C49118551", + {"6": "VDD", "7": "GND", "3": "DP", "2": "DM", "5": "SENS_A", "9": "SENS_A", "11": "SENS_B", + "15": "LED_DRV", "16": "BUZ_DRV", + "1": None, "4": None, "8": None, "10": None, "12": None, "13": None, "14": None, "17": None, + "18": None, "19": None, "20": None, "21": None, "22": None, "23": None, "24": None, "25": None, + "26": None, "27": None, "28": None}, + (29.0, 11.0, 180, "F")), + "J1": ("Connector:USB_C_Receptacle_USB2.0_16P", "TYPE-C 16P", + "Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12", "C393939", + {"A4": "VBUS", "A9": "VBUS", "B4": "VBUS", "B9": "VBUS", "A1": "GND", "A12": "GND", "B1": "GND", + "B12": "GND", "S1": "GND", "A5": "CC1", "B5": "CC2", "A6": "DP", "B6": "DP", "A7": "DM", "B7": "DM", + "A8": None, "B8": None}, + (BOARD_W - 3.35, SPLIT_Y, 90, "F")), + "SW1": ("Switch:SW_Push", "TS-1187A (BOOT)", "Button_Switch_SMD:SW_Push_1P1T_XKB_TS-1187A", "C318884", + {"1": "BOOT", "2": "VDD"}, (40.5, 6.0, 0, "F")), + "R9": ("Device:R", "4.7k", FP_R0402, "C25900", {"1": "DP", "2": "BOOT"}, (40.5, 16.6, 90, "F")), + "R1": ("Device:R", "5.1k", FP_R0402, "C25905", {"1": "CC1", "2": "GND"}, (56.6, 7.0, 90, "F")), + "R2": ("Device:R", "5.1k", FP_R0402, "C25905", {"1": "CC2", "2": "GND"}, (56.6, 15.0, 90, "F")), + "C1": ("Device:C", "10u", FP_C0805, "C15850", {"1": "VBUS", "2": "GND"}, (56.6, 2.8, 0, "F")), + "R3": ("Device:R", "10", FP_R0402, "C25077", {"1": "VBUS", "2": "VDD"}, (34.3, 2.4, 0, "F")), + "C2": ("Device:C", "1u", FP_C0402, "C52923", {"1": "VDD", "2": "GND"}, (33.6, 12.0, 90, "F")), + "C3": ("Device:C", "100n", FP_C0402, "C1525", {"1": "VDD", "2": "GND"}, (35.0, 12.0, 90, "F")), + "BZ1": ("Device:Buzzer", "MLT-8530", "calibrator:Buzzer_MLT-8530", "C94599", + {"1": "VBUS", "2": "BUZ_N"}, (14.6, SPLIT_Y, 180, "F")), + "D2": ("Device:D", "1N4148WS", "Diode_SMD:D_SOD-323", "C2128", + {"1": "VBUS", "2": "BUZ_N"}, (21.6, 4.3, 90, "F")), + "Q1": ("Transistor_BJT:Q_NPN_BEC", "S8050", "Package_TO_SOT_SMD:SOT-23", "C2146", + {"1": "BUZ_B", "2": "GND", "3": "BUZ_N"}, (21.6, 17.6, 0, "F")), + "R5": ("Device:R", "1k", FP_R0402, "C11702", {"1": "BUZ_DRV", "2": "BUZ_B"}, (24.4, 15.4, 90, "F")), + "R6": ("Device:R", "100k", FP_R0402, "C25741", {"1": "BUZ_B", "2": "GND"}, (24.4, 19.6, 0, "F")), + "R4": ("Device:R", "150", FP_R0603, "C22808", {"1": "LED_DRV", "2": "LED_A"}, (23.2, 9.6, 90, "F")), + "D1": ("Device:LED", "XL-3216UWC-FB white", "calibrator:LED_1206_ReverseMount_XL-3216UWC-FB", + "C3646935", {"1": "GND", "2": "LED_A"}, (4.4, SPLIT_Y, 0, "F")), + "Q2": ("Device:Q_Photo_NPN", "VEMT2500X01", "calibrator:Vishay_VEMT2500X01_ReverseGullwing", "C3210911", + {"1": "VDD", "2": "SENS_A"}, (5.0, SPLIT_Y - 4.5, 0, "F")), + "R7": ("Device:R", "22k", FP_R0402, "C25768", {"1": "SENS_A", "2": "GND"}, (33.6, 8.4, 90, "F")), + "C4": ("Device:C", "1n", FP_C0402, "C1523", {"1": "SENS_A", "2": "GND"}, (35.0, 8.4, 90, "F")), + "Q3": ("Device:Q_Photo_NPN", "VEMT2500X01", "calibrator:Vishay_VEMT2500X01_ReverseGullwing", "C3210911", + {"1": "VDD", "2": "SENS_B"}, (5.0, SPLIT_Y + 4.5, 0, "F")), + "R8": ("Device:R", "22k", FP_R0402, "C25768", {"1": "SENS_B", "2": "GND"}, (33.6, 5.4, 90, "F")), + "C5": ("Device:C", "1n", FP_C0402, "C1523", {"1": "SENS_B", "2": "GND"}, (35.0, 5.4, 90, "F")), +} + + +NETS = sorted({n for p in PARTS.values() for n in p[4].values() if n}) +POWER_NETS = ["VBUS", "GND", "VDD", "BUZ_N"] diff --git a/hardware/calibrator/scripts/fab.sh b/hardware/calibrator/scripts/fab.sh new file mode 100755 index 0000000..b892768 --- /dev/null +++ b/hardware/calibrator/scripts/fab.sh @@ -0,0 +1,28 @@ +#!/bin/sh +# Export JLCPCB files: gerbers + drill (zipped), BOM and CPL (pick and place), +# 3D renders and the schematic as PDF/SVG. Needs docker (pinned KiCad image). +set -e +cd "$(dirname "$0")/.." +mkdir -p fab/gerbers renders +rm -f fab/gerbers/* fab/calibrator-gerbers.zip +scripts/kicad.sh sh -c ' +kicad-cli pcb export gerbers --layers F.Cu,B.Cu,F.Paste,F.SilkS,B.SilkS,F.Mask,B.Mask,Edge.Cuts \ + --subtract-soldermask -o fab/gerbers/ calibrator.kicad_pcb && +kicad-cli pcb export drill --format excellon --excellon-units mm --excellon-oval-format alternate \ + --excellon-separate-th -o fab/gerbers/ calibrator.kicad_pcb && +kicad-cli pcb export pos --side front --format csv --units mm --exclude-dnp -o fab/calibrator-pos.csv calibrator.kicad_pcb && +kicad-cli sch export pdf -o renders/calibrator-schematic.pdf calibrator.kicad_sch && +kicad-cli sch export svg -o renders/ calibrator.kicad_sch && +kicad-cli pcb render --side top --width 1600 --height 700 --background opaque --quality high --zoom 1.8 -o renders/calibrator-top.png calibrator.kicad_pcb && +kicad-cli pcb render --side bottom --width 1600 --height 700 --background opaque --quality high --zoom 1.8 -o renders/calibrator-bottom.png calibrator.kicad_pcb && +kicad-cli pcb render --side top --width 1600 --height 1000 --background opaque --quality high --perspective --rotate "-45,0,25" --zoom 1.3 -o renders/calibrator-3d.png calibrator.kicad_pcb +' > /dev/null +python3 scripts/jlc_files.py +python3 -c ' +import os, zipfile +d = "fab/gerbers" +with zipfile.ZipFile("fab/calibrator-gerbers.zip", "w", zipfile.ZIP_DEFLATED) as z: + for n in sorted(os.listdir(d)): + z.write(os.path.join(d, n), n) +' +echo "fab files:"; ls fab diff --git a/hardware/calibrator/scripts/gen_footprints.py b/hardware/calibrator/scripts/gen_footprints.py new file mode 100644 index 0000000..e198268 --- /dev/null +++ b/hardware/calibrator/scripts/gen_footprints.py @@ -0,0 +1,235 @@ +"""Writes the four custom footprints and simple box 3D models. + +Run: python3 gen_footprints.py (plain Python, no KiCad needed) +Sources of the dimensions are in each footprint's description. +""" +import math +import os +import uuid + +HERE = os.path.dirname(os.path.abspath(__file__)) +LIB = os.path.join(HERE, "..", "calibrator.pretty") +MODELS = os.path.join(HERE, "..", "3d") +# KiCad resolves ${KIPRJMOD} to the project folder. +MODEL_DIR = "${KIPRJMOD}/3d" + + +def u(): + return str(uuid.uuid5(uuid.NAMESPACE_URL, f"calibrator-{next(_n)}")) + + +def _counter(): + i = 0 + while True: + i += 1 + yield i + + +_n = _counter() + + +def stroke(w): + return f'(stroke (width {w}) (type solid))' + + +def line(x1, y1, x2, y2, layer, w=0.12): + return f' (fp_line (start {x1:.3f} {y1:.3f}) (end {x2:.3f} {y2:.3f}) {stroke(w)} (layer "{layer}") (uuid "{u()}"))\n' + + +def rect(x1, y1, x2, y2, layer, w=0.05): + return (line(x1, y1, x2, y1, layer, w) + line(x2, y1, x2, y2, layer, w) + + line(x2, y2, x1, y2, layer, w) + line(x1, y2, x1, y1, layer, w)) + + +def arc(cx, cy, r, a0, a1, layer, w=0.1): + """Arc from angle a0 to a1 (degrees, screen coordinates, y down).""" + def pt(a): + return cx + r * math.cos(math.radians(a)), cy + r * math.sin(math.radians(a)) + s, m, e = pt(a0), pt((a0 + a1) / 2), pt(a1) + return (f' (fp_arc (start {s[0]:.4f} {s[1]:.4f}) (mid {m[0]:.4f} {m[1]:.4f}) (end {e[0]:.4f} {e[1]:.4f}) ' + f'{stroke(w)} (layer "{layer}") (uuid "{u()}"))\n') + + +def circle(cx, cy, r, layer, w=0.12): + return f' (fp_circle (center {cx} {cy}) (end {cx + r} {cy}) {stroke(w)} (fill no) (layer "{layer}") (uuid "{u()}"))\n' + + +def rounded_cutout(w, h, r): + """Closed rounded rectangle on Edge.Cuts, centred on 0,0.""" + x, y = w / 2, h / 2 + s = "" + s += line(-x + r, -y, x - r, -y, "Edge.Cuts", 0.05) + s += line(x, -y + r, x, y - r, "Edge.Cuts", 0.05) + s += line(x - r, y, -x + r, y, "Edge.Cuts", 0.05) + s += line(-x, y - r, -x, -y + r, "Edge.Cuts", 0.05) + s += arc(x - r, -y + r, r, 270, 360, "Edge.Cuts", 0.05) + s += arc(x - r, y - r, r, 0, 90, "Edge.Cuts", 0.05) + s += arc(-x + r, y - r, r, 90, 180, "Edge.Cuts", 0.05) + s += arc(-x + r, -y + r, r, 180, 270, "Edge.Cuts", 0.05) + return s + + +def smd(name, x, y, w, h, rot=0): + return (f' (pad "{name}" smd roundrect (at {x:.3f} {y:.3f} {rot}) (size {w} {h}) ' + f'(layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.15) (uuid "{u()}"))\n') + + +def text(kind, value, y, layer, hide=False): + h = " (hide yes)" if hide else "" + return (f' (property "{kind}" "{value}" (at 0 {y} 0) (layer "{layer}"){h} (uuid "{u()}") ' + f'(effects (font (size 0.8 0.8) (thickness 0.12))))\n') + + +def model(name, z=0.0, rot=0): + return (f' (model "{MODEL_DIR}/{name}.wrl" (offset (xyz 0 0 {z})) (scale (xyz 1 1 1)) ' + f'(rotate (xyz 0 0 {rot})))\n') + + +def footprint(name, descr, body, ref_y, val_y, attr="smd"): + s = (f'(footprint "{name}"\n (version 20241229)\n (generator "calibrator-gen")\n (generator_version "9.0")\n' + f' (layer "F.Cu")\n (descr "{descr}")\n') + s += text("Reference", "REF**", ref_y, "F.SilkS") + s += text("Value", name, val_y, "F.Fab") + s += text("Datasheet", "", 0, "F.Fab", hide=True) + s += text("Description", "", 0, "F.Fab", hide=True) + s += f' (attr {attr})\n' + s += body + s += ")\n" + with open(os.path.join(LIB, name + ".kicad_mod"), "w") as f: + f.write(s) + + +def buzzer(): + # Huaneng MLT-8530 datasheet (LCSC C94599): 8.5 x 8.5 x 3.0 mm, 4 pads 2.3 x 2.3, + # 4.8 mm gap -> pad centres at +-3.55. Pad 1 (+) top left, pad 2 (-) bottom left, + # two dummy pads on the right. The sound port is on the right side (+x). + b = "" + b += smd("1", -3.55, -3.55, 2.3, 2.3) + b += smd("2", -3.55, 3.55, 2.3, 2.3) + b += smd("", 3.55, -3.55, 2.3, 2.3) + b += smd("", 3.55, 3.55, 2.3, 2.3) + b += rect(-4.25, -4.25, 4.25, 4.25, "F.Fab", 0.1) + b += rect(-5.0, -5.0, 5.0, 5.0, "F.CrtYd", 0.05) + # silkscreen: body sides between the pads, "+" mark and an arrow for the sound port + b += line(-4.35, -2.2, -4.35, 2.2, "F.SilkS") + b += line(4.35, -2.2, 4.35, 2.2, "F.SilkS") + b += line(-2.2, -4.35, 2.2, -4.35, "F.SilkS") + b += line(-2.2, 4.35, 2.2, 4.35, "F.SilkS") + b += line(-5.6, -3.55, -4.9, -3.55, "F.SilkS") + b += line(-5.25, -3.9, -5.25, -3.2, "F.SilkS") + b += line(2.6, 0, 3.6, 0, "F.SilkS") + b += line(3.6, 0, 3.1, -0.4, "F.SilkS") + b += line(3.6, 0, 3.1, 0.4, "F.SilkS") + b += model("MLT-8530") + footprint("Buzzer_MLT-8530", + "Magnetic buzzer Huaneng MLT-8530 8.5x8.5x3mm SMD, sound port on +x side, datasheet LCSC C94599", + b, -5.6, 5.6) + + +def led_reverse(): + # XINGLIGHT XL-3216UWC-FB (LCSC C3646935): 3.2 x 1.6 mm substrate, lens 1.86 x 1.4 x 0.52 mm + # sits in a board cut-out and shines through the board. Pad 1 = cathode (-), pad 2 = anode (+). + # Cut-out 2.1 x 1.7 mm (r 0.5, router bit); pads 0.3 mm from the cut-out edge (JLC copper-to-edge). + b = "" + b += smd("1", -1.7, 0, 0.7, 1.5) + b += smd("2", 1.7, 0, 0.7, 1.5) + b += rounded_cutout(2.1, 1.7, 0.5) + b += rect(-1.6, -0.8, 1.6, 0.8, "F.Fab", 0.1) + b += rect(-2.3, -1.1, 2.3, 1.1, "F.CrtYd", 0.05) + b += line(-2.45, -1.0, -2.45, 1.0, "F.SilkS") # cathode side mark + b += model("LED_reverse_1206") + footprint("LED_1206_ReverseMount_XL-3216UWC-FB", + "Reverse mount 1206 LED shining through a board cut-out, XINGLIGHT XL-3216UWC-FB (LCSC C3646935); " + "Lite-On LTW-C230DS fits the same footprint", + b, -1.8, 1.8) + + +def phototransistor_rgw(): + # Vishay VEMT2500X01 (doc 81134), reverse gullwing: body above the board, dome lens (D 1.8 mm) + # looks down through a D 2.3 mm hole. Solder pad proposal 1.7 x 0.75 at 6.7 mm overall. + # Pad 1 = collector, pad 2 = emitter (tape drawing: lead I collector, lead II emitter). + b = "" + b += smd("1", -2.5, 0, 1.7, 0.75) + b += smd("2", 2.5, 0, 1.7, 0.75) + b += (f' (pad "" np_thru_hole circle (at 0 0) (size 2.3 2.3) (drill 2.3) ' + f'(layers "*.Cu" "*.Mask") (uuid "{u()}"))\n') + b += rect(-1.15, -1.15, 1.15, 1.15, "F.Fab", 0.1) + b += rect(-3.6, -1.6, 3.6, 1.6, "F.CrtYd", 0.05) + b += line(-1.25, -1.25, 1.25, -1.25, "F.SilkS") + b += line(-1.25, 1.25, 1.25, 1.25, "F.SilkS") + b += line(-1.25, -1.25, -1.25, -0.6, "F.SilkS") # collector side mark + b += model("VEMT2500X01_RGW") + footprint("Vishay_VEMT2500X01_ReverseGullwing", + "Phototransistor Vishay VEMT2500X01 reverse gullwing, lens looks through a 2.3 mm hole; " + "VEMT2000X01 is the same package", + b, -2.0, 2.0) + + +def usb_c_6p(): + # SHOU HAN TYPE-C 6P (LCSC C456012) recommended layout: signal pads at +-0.5 (CC), +-1.5 (VBUS), + # +-2.7 (GND); shell slots 0.6 x 1.4 (pad 1.0 x 1.8) at +-4.32, 3.8 mm apart, front slots 2.6 mm + # behind the product edge. Origin = body centre, like KiCad's GCT USB4125 6P footprint (same family). + b = "" + py, pl = -3.35, 1.4 + for name, x, w in [("A5", -0.5, 0.6), ("B5", 0.5, 0.6), ("B9", -1.5, 0.7), ("A9", 1.5, 0.7), + ("B12", -2.7, 0.8), ("A12", 2.7, 0.8)]: + b += smd(name, x, py, w, pl) + for x in (-4.32, 4.32): + for y in (-3.0, 0.8): + b += (f' (pad "S1" thru_hole oval (at {x} {y}) (size 1.0 1.8) (drill oval 0.6 1.4) ' + f'(layers "*.Cu" "*.Mask") (remove_unused_layers no) (uuid "{u()}"))\n') + b += rect(-4.47, -3.4, 4.47, 3.4, "F.Fab", 0.1) + b += rect(-5.2, -4.4, 5.2, 3.9, "F.CrtYd", 0.05) + b += line(-4.6, -1.9, -4.6, -0.3, "F.SilkS") + b += line(4.6, -1.9, 4.6, -0.3, "F.SilkS") + b += line(-4.6, 1.9, -4.6, 2.7, "F.SilkS") + b += line(4.6, 1.9, 4.6, 2.7, "F.SilkS") + b += line(-5.0, 3.1, 5.0, 3.1, "Dwgs.User", 0.1) # board edge + b += (" (model \"${KICAD9_3DMODEL_DIR}/Connector_USB.3dshapes/" + "USB_C_Receptacle_GCT_USB4125-xx-x_6P_TopMnt_Horizontal.step\" (offset (xyz 0 0 0)) " + "(scale (xyz 1 1 1)) (rotate (xyz 0 0 0)))\n") + footprint("USB_C_Receptacle_ShouHan_TYPE-C-6P", + "USB-C receptacle 6 pin power only, SHOU HAN TYPE-C 6P (LCSC C456012), top mount horizontal; " + "board edge 3.1 mm in front of the body centre", + b, -5.0, 4.6) + + +# ---- simple VRML box models (KiCad VRML unit = 0.1 inch) ---- +def vrml(name, boxes): + k = 1 / 2.54 + s = "#VRML V2.0 utf8\n" + for (cx, cy, cz, sx, sy, sz, rgb) in boxes: + s += (f"Transform {{ translation {cx * k:.4f} {cy * k:.4f} {cz * k:.4f} children [ Shape {{ " + f"appearance Appearance {{ material Material {{ diffuseColor {rgb} }} }} " + f"geometry Box {{ size {sx * k:.4f} {sy * k:.4f} {sz * k:.4f} }} }} ] }}\n") + with open(os.path.join(MODELS, name + ".wrl"), "w") as f: + f.write(s) + + +def models(): + # VRML y is up on screen = -y in KiCad; boxes are symmetric so it does not matter here. + vrml("MLT-8530", [(0, 0, 1.5, 8.5, 8.5, 3.0, "0.08 0.08 0.08"), (-4.35, 0, 1.5, 0.3, 1.2, 1.0, "0.3 0.3 0.3")]) + vrml("LED_reverse_1206", [(0, 0, 0.14, 3.2, 1.6, 0.28, "0.9 0.9 0.85"), (0, 0, -0.26, 1.86, 1.4, 0.52, "1 1 0.6")]) + # KiCad QSOP-28 footprint: pin rows along y at x = +-2.64, pitch 0.635, pin 1 top left. + # (VRML y points the other way than KiCad's y.) + qsop = [(0, 0, 0.85, 3.9, 9.9, 1.5, "0.12 0.12 0.12"), (-1.15, 4.3, 1.62, 0.5, 0.5, 0.05, "0.6 0.6 0.6")] + for i in range(14): + y = 4.1275 - 0.635 * i + qsop += [(-2.45, y, 0.25, 1.1, 0.25, 0.2, "0.8 0.8 0.8"), (2.45, y, 0.25, 1.1, 0.25, 0.2, "0.8 0.8 0.8")] + vrml("QSOP-28", qsop) + # XKB TS-1187A: 5.1 x 5.1 body, pads at x = +-3, y = +-1.875 + vrml("TS-1187A", [(0, 0, 0.75, 5.1, 5.1, 1.5, "0.85 0.85 0.85"), (0, 0, 1.6, 3.0, 3.0, 0.3, "0.15 0.15 0.15")] + + [(sx * 2.9, sy * 1.875, 0.1, 1.2, 0.7, 0.2, "0.8 0.8 0.8") for sx in (-1, 1) for sy in (-1, 1)]) + vrml("VEMT2500X01_RGW", [(0, 0, 0.8, 2.3, 2.3, 1.6, "0.75 0.8 0.85"), (0, 0, -0.58, 1.8, 1.8, 1.17, "0.7 0.75 0.8"), + (-2.5, 0, 0.1, 1.2, 0.4, 0.2, "0.8 0.8 0.8"), (2.5, 0, 0.1, 1.2, 0.4, 0.2, "0.8 0.8 0.8")]) + + +if __name__ == "__main__": + os.makedirs(LIB, exist_ok=True) + os.makedirs(MODELS, exist_ok=True) + buzzer() + led_reverse() + phototransistor_rgw() + + models() + print("footprints and models written") diff --git a/hardware/calibrator/scripts/gen_pcb.py b/hardware/calibrator/scripts/gen_pcb.py new file mode 100644 index 0000000..582a82f --- /dev/null +++ b/hardware/calibrator/scripts/gen_pcb.py @@ -0,0 +1,606 @@ +"""Builds calibrator.kicad_pcb from design.py (placement, nets, outline, zones, silkscreen). + +Steps (all inside the KiCad image, see scripts/build.sh): + python3 gen_pcb.py place -> unrouted board + calibrator.dsn for Freerouting + python3 gen_pcb.py finish -> imports calibrator.ses, fills zones, saves the board +""" +import os +import sys + +import faulthandler +import pcbnew + +faulthandler.enable() + +import design as D + +HERE = os.path.dirname(os.path.abspath(__file__)) +PRJ = os.path.abspath(os.path.join(HERE, "..")) +PCB = os.path.join(PRJ, "calibrator.kicad_pcb") +DSN = os.path.join(PRJ, "calibrator.dsn") +SES = os.path.join(PRJ, "calibrator.ses") +STOCK = "/usr/share/kicad/footprints" + +OX, OY = D.ORIGIN + + +def mm(x, y): + return pcbnew.VECTOR2I(pcbnew.FromMM(OX + x), pcbnew.FromMM(OY + y)) + + +def seg(board, layer, x1, y1, x2, y2, w=0.12): + s = pcbnew.PCB_SHAPE(board, pcbnew.SHAPE_T_SEGMENT) + s.SetLayer(layer) + s.SetStart(mm(x1, y1)) + s.SetEnd(mm(x2, y2)) + s.SetWidth(pcbnew.FromMM(w)) + board.Add(s) + + +def arc(board, layer, a, m, b, w=0.12): + s = pcbnew.PCB_SHAPE(board, pcbnew.SHAPE_T_ARC) + s.SetLayer(layer) + s.SetArcGeometry(mm(*a), mm(*m), mm(*b)) + s.SetWidth(pcbnew.FromMM(w)) + board.Add(s) + + +def circle(board, layer, cx, cy, r, w=0.15): + s = pcbnew.PCB_SHAPE(board, pcbnew.SHAPE_T_CIRCLE) + s.SetLayer(layer) + s.SetCenter(mm(cx, cy)) + s.SetEnd(mm(cx + r, cy)) + s.SetWidth(pcbnew.FromMM(w)) + s.SetFilled(False) + board.Add(s) + + +def text(board, layer, s, x, y, size=0.8, angle=0, bold=False): + t = pcbnew.PCB_TEXT(board) + t.SetText(s) + t.SetLayer(layer) + t.SetPosition(mm(x, y)) + t.SetTextSize(pcbnew.VECTOR2I(pcbnew.FromMM(size), pcbnew.FromMM(size))) + t.SetTextThickness(pcbnew.FromMM(max(0.155, size * 0.15 * (1.4 if bold else 1.0)))) + t.SetTextAngleDegrees(angle) + if layer == pcbnew.B_SilkS: + t.SetMirrored(True) + board.Add(t) + + +def outline(board): + W, H, r, n, sy = D.BOARD_W, D.BOARD_H, D.CORNER_R, D.NOTCH_R, D.SPLIT_Y + e = pcbnew.Edge_Cuts + c = 0.7071 * r + seg(board, e, r, 0, W - r, 0, 0.05) + arc(board, e, (W - r, 0), (W - r + c, r - c), (W, r), 0.05) + seg(board, e, W, r, W, H - r, 0.05) + arc(board, e, (W, H - r), (W - r + c, H - r + c), (W - r, H), 0.05) + seg(board, e, W - r, H, r, H, 0.05) + arc(board, e, (r, H), (r - c, H - r + c), (0, H - r), 0.05) + seg(board, e, 0, H - r, 0, sy + n, 0.05) + arc(board, e, (0, sy + n), (n, sy), (0, sy - n), 0.05) # alignment notch on the split line + seg(board, e, 0, sy - n, 0, r, 0.05) + arc(board, e, (0, r), (r - c, r - c), (r, 0), 0.05) + + +def zone(board, net, layer): + z = pcbnew.ZONE(board) + z.SetLayer(layer) + z.SetNet(net) + z.SetLocalClearance(pcbnew.FromMM(0.25)) + z.SetMinThickness(pcbnew.FromMM(0.2)) + z.SetPadConnection(pcbnew.ZONE_CONNECTION_FULL) + z.SetThermalReliefGap(pcbnew.FromMM(0.25)) + z.SetThermalReliefSpokeWidth(pcbnew.FromMM(0.3)) + z.SetAssignedPriority(0) + z.SetIslandRemovalMode(pcbnew.ISLAND_REMOVAL_MODE_ALWAYS) + pts = [(0.2, 0.2), (D.BOARD_W - 0.2, 0.2), (D.BOARD_W - 0.2, D.BOARD_H - 0.2), (0.2, D.BOARD_H - 0.2)] + poly = z.Outline() + poly.NewOutline() + for x, y in pts: + poly.Append(pcbnew.FromMM(OX + x), pcbnew.FromMM(OY + y)) + board.Add(z) + + +def keepout(board, x1, y1, x2, y2, layer=None, tracks=True): + """No tracks or vias here (optical holes, gold logo copper).""" + z = pcbnew.ZONE(board) + z.SetIsRuleArea(True) + if layer is None: + z.SetLayerSet(pcbnew.LSET.AllCuMask()) + else: + z.SetLayer(layer) + z.SetDoNotAllowTracks(tracks) + z.SetDoNotAllowVias(True) + z.SetDoNotAllowPads(False) + z.SetDoNotAllowFootprints(False) + z.SetDoNotAllowCopperPour(False) + poly = z.Outline() + poly.NewOutline() + for x, y in [(x1, y1), (x2, y1), (x2, y2), (x1, y2)]: + poly.Append(pcbnew.FromMM(OX + x), pcbnew.FromMM(OY + y)) + board.Add(z) + + +# ---------------------------------------------------------------- artwork +ICON_S = 1.2427184466 # scale of the artwork group in assets/app-icon.svg +JLC_TEXT = 1.0 # JLC minimum silkscreen text height (mm) +JLC_LINE = 0.153 # JLC minimum silkscreen line width (mm) + + +def shape_poly(board, layer, pts, w): + for a, b in zip(pts, pts[1:]): + seg(board, layer, a[0], a[1], b[0], b[1], w) + + +def disc(board, layer, cx, cy, r): + s = pcbnew.PCB_SHAPE(board, pcbnew.SHAPE_T_CIRCLE) + s.SetLayer(layer) + s.SetCenter(mm(cx, cy)) + s.SetEnd(mm(cx + r, cy)) + s.SetWidth(0) + s.SetFilled(True) + board.Add(s) + + +def box(board, layer, x1, y1, x2, y2): + s = pcbnew.PCB_SHAPE(board, pcbnew.SHAPE_T_RECT) + s.SetLayer(layer) + s.SetStart(mm(x1, y1)) + s.SetEnd(mm(x2, y2)) + s.SetWidth(0) + s.SetFilled(True) + board.Add(s) + + +def logo(board, cx, cy, size, side): + """AVsync mark from assets/app-icon.svg (CERN-OHL-P-2.0 on this board). + + Cyan/white strokes -> silkscreen. Orange parts (waveform, ring of the centre dot) -> + bare copper with a solder-mask opening and no paste, so ENIG makes them gold. + The copper has no net and is kept clear of tracks by a keep-out. On the bottom the + mark is mirrored so it reads correctly from below.""" + silk, cu, mask = ((pcbnew.F_SilkS, pcbnew.F_Cu, pcbnew.F_Mask) if side == "F" + else (pcbnew.B_SilkS, pcbnew.B_Cu, pcbnew.B_Mask)) + k = size / 149.2 * ICON_S # mm per SVG unit (the artwork spans 149.2 scaled units) + sx = -1 if side == "B" else 1 + + def P(u, v): + return cx + sx * (u - 128) * k, cy + (v - 128) * k + + def W(w): + return max(JLC_LINE, w * k) + + for poly in ([(68, 91), (68, 68), (91, 68)], [(165, 68), (188, 68), (188, 91)], + [(68, 165), (68, 188), (91, 188)], [(165, 188), (188, 188), (188, 165)]): + shape_poly(board, silk, [P(*q) for q in poly], W(9)) + # meter panel: rounded rectangle 84,88 - 172,168, r 9 + x1, y1, x2, y2, r = 84, 88, 172, 168, 9 + c = 0.7071 * r + shape_poly(board, silk, [P(x1 + r, y1), P(x2 - r, y1)], W(3)) + shape_poly(board, silk, [P(x2, y1 + r), P(x2, y2 - r)], W(3)) + shape_poly(board, silk, [P(x2 - r, y2), P(x1 + r, y2)], W(3)) + shape_poly(board, silk, [P(x1, y2 - r), P(x1, y1 + r)], W(3)) + for (ax, ay), (mx, my), (bx, by) in [((x2 - r, y1), (x2 - r + c, y1 + r - c), (x2, y1 + r)), + ((x2, y2 - r), (x2 - r + c, y2 - r + c), (x2 - r, y2)), + ((x1 + r, y2), (x1 + r - c, y2 - r + c), (x1, y2 - r)), + ((x1, y1 + r), (x1 + r - c, y1 + r - c), (x1 + r, y1))]: + arc(board, silk, P(ax, ay), P(mx, my), P(bx, by), W(3)) + # Dashed centre line like the original (y 74..181, dasharray 4 7). In the SVG the + # centre dot is drawn on top, so dash parts under the dot/ring are hidden there too. + dashes = [] + v = 74.0 + while v < 181: + lo, hi = v, min(v + 4, 181) + if hi <= 128 - 9 - 1.5 or lo >= 128 + 9 + 1.5: # outside the ring (+ room for the round ends) + dashes.append((lo, hi)) + v += 11 + dw = W(2.5) + for lo, hi in dashes: + # dash drawn without its round caps going past lo/hi (SVG dashes are butt-ended) + cap = dw / 2 / k + shape_poly(board, silk, [P(128, lo + cap), P(128, max(lo + cap, hi - cap))], dw) + shape_poly(board, silk, [P(94, 199), P(162, 199)], W(4)) + + # Gold copper: waveform + ring as one polygon. White silkscreen (dashes, centre dot) + # sits on top in the original; JLC removes silk from bare copper, so the copper (and + # its mask opening) is cut away under every dash and inside the ring. + err = pcbnew.FromMM(0.005) + gold = pcbnew.SHAPE_POLY_SET() + pts = [(91, 128), (102, 128), (108, 113), (118, 145), (128, 102), + (139, 148), (149, 117), (155, 128), (165, 128)] + tmp = [] + for (x1, y1), (x2, y2) in zip(pts, pts[1:]): + s = pcbnew.PCB_SHAPE(board, pcbnew.SHAPE_T_SEGMENT) + s.SetStart(mm(*P(x1, y1))) + s.SetEnd(mm(*P(x2, y2))) + s.SetWidth(pcbnew.FromMM(5 * k)) + tmp.append(s) + ring = pcbnew.PCB_SHAPE(board, pcbnew.SHAPE_T_CIRCLE) + ring.SetCenter(mm(*P(128, 128))) + ring.SetEnd(mm(*P(128 + 7, 128))) + ring.SetWidth(pcbnew.FromMM(4 * k)) + ring.SetFilled(False) + tmp.append(ring) + for s in tmp: + s.TransformShapeToPolygon(gold, cu, 0, err, pcbnew.ERROR_INSIDE) + gold.Simplify() + cut = pcbnew.SHAPE_POLY_SET() + clear = 0.1 # copper stays 0.1 mm from white silk (mask opening then 0.05 mm) + for lo, hi in dashes: + xa, ya = P(128, lo) + xb, yb = P(128, hi) + hw = dw / 2 + clear + o = cut.NewOutline() + for cx_, cy_ in ((xa - hw, ya - clear), (xa + hw, ya - clear), (xb + hw, yb + clear), (xb - hw, yb + clear)): + cut.Append(pcbnew.FromMM(OX + cx_), pcbnew.FromMM(OY + cy_), o) + inner = pcbnew.PCB_SHAPE(board, pcbnew.SHAPE_T_CIRCLE) # inside of the ring stays white + inner.SetCenter(mm(*P(128, 128))) + inner.SetEnd(mm(*P(128 + 5, 128))) + inner.SetFilled(True) + inner.SetWidth(0) + inner.TransformShapeToPolygon(cut, cu, 0, err, pcbnew.ERROR_OUTSIDE) + cut.Simplify() + gold.BooleanSubtract(cut) + gold.Fracture() + mask_poly = pcbnew.SHAPE_POLY_SET(gold) + mask_poly.Inflate(pcbnew.FromMM(0.05), pcbnew.CORNER_STRATEGY_ROUND_ALL_CORNERS, err) + mask_poly.Fracture() + for layer, poly in ((cu, gold), (mask, mask_poly)): + s = pcbnew.PCB_SHAPE(board, pcbnew.SHAPE_T_POLY) + s.SetLayer(layer) + s.SetPolyShape(poly) + s.SetFilled(True) + s.SetWidth(0) + board.Add(s) + # white centre dot: fills the inside of the gold ring, clear of the mask opening + disc(board, silk, *P(128, 128), 5 * k - 0.05 - 0.05) + + +def clip_outside(x1, y1, x2, y2, r): + """Parts of the segment (x1,y1)-(x2,y2) that lie outside the circle of radius r at 0,0.""" + dx, dy = x2 - x1, y2 - y1 + a = dx * dx + dy * dy + b = 2 * (x1 * dx + y1 * dy) + c = x1 * x1 + y1 * y1 - r * r + disc_ = b * b - 4 * a * c + if disc_ <= 0: + return [(x1, y1, x2, y2)] + s = disc_ ** 0.5 + t1, t2 = (-b - s) / (2 * a), (-b + s) / (2 * a) + out = [] + if t1 > 0: + e = min(t1, 1) + out.append((x1, y1, x1 + dx * e, y1 + dy * e)) + if t2 < 1: + st = max(t2, 0) + out.append((x1 + dx * st, y1 + dy * st, x2, y2)) + return [o for o in out if (o[2] - o[0]) ** 2 + (o[3] - o[1]) ** 2 > 1e-6] + + +def qr(board, x0, y0, module): + """QR code on the bottom silkscreen: white quiet zone + white light modules on the + dark mask, mirrored so it reads correctly when you look at the bottom.""" + rows = [r for r in open(os.path.join(HERE, "qr_matrix.txt")).read().split() if r[0] in "01"] + n = len(rows) + q = 4 # quiet zone in modules + tot = n + 2 * q + for ry in range(tot): + run = None + for cxm in range(tot + 1): + r_, c_ = ry - q, cxm - q + light = cxm < tot and not (0 <= r_ < n and 0 <= c_ < n and rows[r_][c_] == "1") + if light and run is None: + run = cxm + if not light and run is not None: + # mirror in x: module column c is drawn at tot-1-c + xa = x0 + (tot - cxm) * module + xb = x0 + (tot - run) * module + box(board, pcbnew.B_SilkS, xa, y0 + ry * module, xb, y0 + (ry + 1) * module) + run = None + return tot * module + + +def silk(board): + F, B = pcbnew.F_SilkS, pcbnew.B_SilkS + sy = D.SPLIT_Y + lx, ly = D.PARTS["D1"][5][0], D.PARTS["D1"][5][1] + q2 = D.PARTS["Q2"][5] + q3 = D.PARTS["Q3"][5] + for layer in (F, B): + circle(board, layer, lx, ly, 2.7, 0.2) # LED spot: put this on the camera lens + text(board, layer, "A", q2[0], q2[1] - 2.7, 1.3, bold=True) + text(board, layer, "B", q3[0], q3[1] + 2.7, 1.3, bold=True) + # split line: on top it stops at the LED pads and continues behind the buzzer + for x1, x2 in ((1.5, 2.05), (6.75, 9.3), (19.8, 22.4)): + seg(board, F, x1, sy, x2, sy, 0.25) + seg(board, F, 22.4, sy - 0.7, 22.4, sy + 0.7, 0.25) + for x1, x2 in ((1.5, 3.1), (5.7, 10.6)): + seg(board, B, x1, sy, x2, sy, 0.25) + seg(board, B, 10.6, sy - 0.7, 10.6, sy + 0.7, 0.25) + + # Top: logo, name, licence, centred in the column between MCU and USB-C. + cx = TOP_LOGO[0] + logo(board, cx, TOP_LOGO[1], TOP_LOGO[2], "F") + ty = TOP_LOGO[1] + TOP_LOGO[2] / 2 + text(board, F, "AVsync", cx, ty + 2.8, 2.0, bold=True) + text(board, F, "calibrator", cx, ty + 5.2, 1.2) + text(board, F, "CERN-OHL-P-2.0", 32.8, 20.7, JLC_TEXT) # small, below the MCU + # BOOT button label (top, centred under the button) + sx, sy_ = D.PARTS["SW1"][5][:2] + text(board, F, "BOOT", sx, sy_ + 4.5, 1.2, bold=True) + + # Bottom (this side touches the phone or the screen). + # logo in the middle of the board, right beside the QR code + bx, by, bs = BOT_LOGO + logo(board, bx, by, bs, "B") + text(board, B, "AVsync", bx, by + bs / 2 + 2.2, 1.8, bold=True) + text(board, B, "calibrator v0.3", bx, by + bs / 2 + 4.3, JLC_TEXT) + # how to use it, next to the LED / sensor end + ix = 16.8 + text(board, B, "CAMERA", ix, 4.0, 1.2, bold=True) + text(board, B, "LED on lens", ix, 5.8, JLC_TEXT) + text(board, B, "SCREEN", ix, 14.0, 1.2, bold=True) + text(board, B, "A|B on line", ix, 15.8, JLC_TEXT) + text(board, B, "not a toy", ix, 18.8, JLC_TEXT) + qr(board, QR[0], QR[1], QR[2]) + + +# Artwork places (board mm): logo (centre x, centre y, size), QR (left x, top y, module) +TOP_LOGO = (50.3, 8.8, 9.0) +BOT_LOGO = (31.8, 9.0, 11.0) +QR = (40.0, 2.675, 0.45) +QR_SIZE = (29 + 8) * QR[2] + + +def stackup(path): + """1.2 mm board, black mask, white silk, ENIG (KiCad's Python API has no stackup calls).""" + s = open(path).read() + st = ('\t\t(stackup\n' + '\t\t\t(layer "F.SilkS" (type "Top Silk Screen") (color "White"))\n' + '\t\t\t(layer "F.Paste" (type "Top Solder Paste"))\n' + '\t\t\t(layer "F.Mask" (type "Top Solder Mask") (color "Black") (thickness 0.01))\n' + '\t\t\t(layer "F.Cu" (type "copper") (thickness 0.035))\n' + '\t\t\t(layer "dielectric 1" (type "core") (thickness 1.11) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02))\n' + '\t\t\t(layer "B.Cu" (type "copper") (thickness 0.035))\n' + '\t\t\t(layer "B.Mask" (type "Bottom Solder Mask") (color "Black") (thickness 0.01))\n' + '\t\t\t(layer "B.Paste" (type "Bottom Solder Paste"))\n' + '\t\t\t(layer "B.SilkS" (type "Bottom Silk Screen") (color "White"))\n' + '\t\t\t(copper_finish "ENIG")\n\t\t\t(dielectric_constraints no)\n\t\t)\n') + if "(stackup" not in s: + s = s.replace("\t(setup\n", "\t(setup\n" + st, 1) + open(path, "w").write(s) + + +def place(): + with open(PCB, "w") as f: + f.write('(kicad_pcb (version 20241229) (generator "pcbnew") (generator_version "9.0"))\n') + board = pcbnew.LoadBoard(PCB) + ds = board.GetDesignSettings() + ds.SetBoardThickness(pcbnew.FromMM(D.PCB_THICKNESS)) + + nets = {} + for n in D.NETS: + ni = pcbnew.NETINFO_ITEM(board, n) + board.Add(ni) + nets[n] = ni + + for ref, (lib_id, value, fpid, lcsc, netmap, (x, y, rot, side)) in D.PARTS.items(): + lib, name = fpid.split(":") + path = os.path.join(PRJ, "calibrator.pretty") if lib == "calibrator" else os.path.join(STOCK, lib + ".pretty") + fp = pcbnew.FootprintLoad(path, name) + fp.SetFPID(pcbnew.LIB_ID(lib, name)) + fp.SetReference(ref) + fp.SetValue(value) + board.Add(fp) + fp.SetPosition(mm(x, y)) + fp.SetOrientationDegrees(rot) + if side == "B": + fp.Flip(fp.GetPosition(), pcbnew.FLIP_DIRECTION_LEFT_RIGHT) + if ref.startswith("TP"): + fp.SetAttributes(fp.GetAttributes() | pcbnew.FP_EXCLUDE_FROM_POS_FILES | pcbnew.FP_EXCLUDE_FROM_BOM) + fp.Reference().SetVisible(False) + if lcsc: + f = pcbnew.PCB_FIELD(fp, fp.GetNextFieldId(), "LCSC") + f.SetText(lcsc) + f.SetVisible(False) + f.SetLayer(pcbnew.F_Fab) + fp.Add(f) + for pad in fp.Pads(): + num = pad.GetNumber() + if num in netmap and netmap[num]: + pad.SetNet(nets[netmap[num]]) + # small reference text, kept on the fab layer so the top stays clean for the logo + fp.Reference().SetLayer(pcbnew.F_Fab if side == "F" else pcbnew.B_Fab) + # The KiCad image ships no 3D model for these three; use stand-ins for the renders. + stand_in = {"J1": "${KICAD9_3DMODEL_DIR}/Connector_USB.3dshapes/" + "USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.step", + "U1": "${KIPRJMOD}/3d/QSOP-28.wrl", "SW1": "${KIPRJMOD}/3d/TS-1187A.wrl"} + if ref in stand_in: + fp.Models().clear() + m = pcbnew.FP_3DMODEL() + m.m_Filename = stand_in[ref] + fp.Models().push_back(m) + if ref == "J1": # the stock USB-C footprint's silkscreen runs past the board edge + for item in list(fp.GraphicalItems()): + if item.GetLayer() == pcbnew.F_SilkS: + fp.Remove(item) + + outline(board) + # keep tracks and vias off the optical holes (LED cut-out and sensor holes) + lx, ly = D.PARTS["D1"][5][:2] + keepout(board, lx - 1.35, ly - 1.15, lx + 1.35, ly + 1.15) + keepout(board, 0.0, D.SPLIT_Y - 1.9, 2.3, D.SPLIT_Y + 1.9) # alignment notch + keepout(board, QR[0], QR[1], QR[0] + QR_SIZE, QR[1] + QR_SIZE, tracks=False) # no via holes in the QR code + for q in ("Q2", "Q3"): + qx, qy = D.PARTS[q][5][:2] + keepout(board, qx - 1.45, qy - 1.45, qx + 1.45, qy + 1.45) + tx, ty, ts = TOP_LOGO + keepout(board, tx - ts / 2 - 0.5, ty - ts / 2 - 0.5, tx + ts / 2 + 0.5, ty + ts / 2 + 0.5, pcbnew.F_Cu) + keepout(board, tx - ts / 2 - 1.0, ty - ts / 2 - 1.0, tx + ts / 2 + 1.0, ty + ts / 2 + 6.0, tracks=False) # no via holes in the top logo or its text + bx, by, bs = BOT_LOGO + keepout(board, bx - bs / 2 - 0.5, by - bs / 2 - 0.5, bx + bs / 2 + 0.5, by + bs / 2 + 0.5, pcbnew.B_Cu) + keepout(board, bx - bs / 2 - 1.0, by - bs / 2 - 1.0, bx + bs / 2 + 1.0, by + bs / 2 + 5.5, tracks=False) # no via holes in the bottom logo or its text + silk(board) + pcbnew.SaveBoard(PCB, board) + stackup(PCB) + board = pcbnew.LoadBoard(PCB) + # Export for the router *before* the ground fills exist, so it also routes GND + # with real tracks (with fills it treats GND as a plane and leaves islands). + ok = pcbnew.ExportSpecctraDSN(board, DSN) + gnd = board.FindNet("GND") + zone(board, gnd, pcbnew.F_Cu) + zone(board, gnd, pcbnew.B_Cu) + pcbnew.SaveBoard(PCB, board) + print("placed, DSN export:", ok) + + +def add_via(board, net, x, y): + v = pcbnew.PCB_VIA(board) + v.SetPosition(mm(x, y)) + v.SetWidth(pcbnew.FromMM(0.6)) + v.SetDrill(pcbnew.FromMM(0.3)) + v.SetNet(net) + board.Add(v) + + +# Areas kept free of stitching vias so the silkscreen text stays whole (x1, y1, x2, y2). +NO_STITCH = [(43.5, 0.0, 57.0, 22.0), (36.5, 2.5, 44.5, 13.5), (25.0, 2.0, 39.6, 20.5), (11.0, 2.5, 25.0, 21.5), + (39.7, 2.4, 56.9, 19.6), (0.0, 9.8, 23.0, 12.2), (24.0, 19.6, 39.0, 21.9)] + + +def stitch(board, net, step=2.5, margin=0.7): + """Put GND vias on a grid wherever both ground fills have room for one. + + This ties every piece of the top fill to the bottom fill.""" + fills = [z.GetFilledPolysList(z.GetLayer()) for z in board.Zones() + if not z.GetIsRuleArea() and z.GetNetname() == "GND"] + n = 0 + y = 1.4 + while y < D.BOARD_H - 1.2: + x = 10.5 # no vias on the optics end: open via holes could let light through + while x < D.BOARD_W - 1.2: + if any(a <= x <= c and b <= y <= d for a, b, c, d in NO_STITCH): + x += step + continue + pts = [(x, y)] + [(x + margin * dx, y + margin * dy) for dx, dy in + [(1, 0), (-1, 0), (0, 1), (0, -1), (0.7, 0.7), (-0.7, 0.7), (0.7, -0.7), (-0.7, -0.7)]] + if all(f.Contains(mm(px, py)) for f in fills for (px, py) in pts): + add_via(board, net, x, y) + n += 1 + x += step + y += step + return n + + +# Silkscreen art on the bottom: no vias at all here. +ART = [(39.7, 2.4, 56.9, 19.6), (25.0, 2.0, 39.6, 20.5), (43.5, 0.0, 57.0, 22.0), (11.0, 2.5, 25.0, 21.5)] + + +def fix_islands(board, net, margin=0.31): + """Give every top-fill island that has no via one via, at the first spot that fits.""" + zs = {z.GetLayer(): z for z in board.Zones() if not z.GetIsRuleArea() and z.GetNetname() == "GND"} + top = zs[pcbnew.F_Cu].GetFilledPolysList(pcbnew.F_Cu) + bot = zs[pcbnew.B_Cu].GetFilledPolysList(pcbnew.B_Cu) + vias = [t.GetPosition() for t in board.GetTracks() if isinstance(t, pcbnew.PCB_VIA)] + added = 0 + for i in range(top.OutlineCount()): + isl = top.Outline(i) + if any(isl.PointInside(v) for v in vias): + continue + bb = isl.BBox() + x0, y0 = pcbnew.ToMM(bb.GetX()) - OX, pcbnew.ToMM(bb.GetY()) - OY + found = None + steps = int(pcbnew.ToMM(bb.GetWidth()) / 0.1) + 1, int(pcbnew.ToMM(bb.GetHeight()) / 0.1) + 1 + for iy in range(steps[1]): + for ix in range(steps[0]): + x, y = x0 + ix * 0.1, y0 + iy * 0.1 + ring = [(x, y)] + [(x + margin * dx, y + margin * dy) for dx, dy in + [(1, 0), (-1, 0), (0, 1), (0, -1), (0.7, 0.7), (-0.7, 0.7), (0.7, -0.7), (-0.7, -0.7)]] + if any(a <= x <= c and b <= y <= d for a, b, c, d in ART): + continue + if all(isl.PointInside(mm(px, py)) and bot.Contains(mm(px, py)) for px, py in ring): + found = (x, y) + break + if found: + break + if found: + add_via(board, net, *found) + added += 1 + else: + print("no room for a via in island at", round(x0, 2), round(y0, 2)) + return added + + +def remove_stubs(board): + """Delete duplicate segments and short dead-end pieces the router sometimes leaves behind.""" + items = list(board.GetTracks()) # one snapshot; the board's list proxy breaks after Remove() + tracks = [t for t in items if t.GetClass() == "PCB_TRACK"] + vias = {(v.GetPosition().x, v.GetPosition().y) for v in items if v.GetClass() == "PCB_VIA"} + pads = list(board.GetPads()) + dead = [] + seen = set() # the same segment written twice (once each way) + for t in tracks: + a_, b_ = (t.GetStart().x, t.GetStart().y), (t.GetEnd().x, t.GetEnd().y) + key = (int(t.GetLayer()), int(t.GetNetCode())) + tuple(sorted([a_, b_])) + if key in seen: + dead.append(t) + seen.add(key) + tracks = [t for t in tracks if t not in dead] + while True: + ends = {} + for t in tracks: + for p in (t.GetStart(), t.GetEnd()): + ends.setdefault((p.x, p.y, int(t.GetLayer())), []).append(t) + new = [] + for t in tracks: + for p in (t.GetStart(), t.GetEnd()): + if len(ends[(p.x, p.y, int(t.GetLayer()))]) > 1 or (p.x, p.y) in vias: + continue + if any(pad.HitTest(p) and pad.IsOnLayer(t.GetLayer()) for pad in pads): + continue + new.append(t) + break + if not new: + break + dead += new + tracks = [t for t in tracks if t not in new] + for t in dead: + board.Remove(t) + return len(dead) + + +def unconnected(board): + board.BuildConnectivity() + return board.GetConnectivity().GetUnconnectedCount(False) + + +def import_routes(): + """Separate step (own process): the Python board object is unsafe after Remove().""" + board = pcbnew.LoadBoard(PCB) + ok = pcbnew.ImportSpecctraSES(board, SES) + print("SES import:", ok) + print("removed stubs:", remove_stubs(board)) + pcbnew.SaveBoard(PCB, board) + + +def finish(): + board = pcbnew.LoadBoard(PCB) + gnd = board.FindNet("GND") + board.BuildConnectivity() + filler = pcbnew.ZONE_FILLER(board) + filler.Fill(board.Zones()) + print("stitching vias:", stitch(board, gnd)) + board.BuildConnectivity() + filler.Fill(board.Zones()) + print("island vias:", fix_islands(board, gnd)) + board.BuildConnectivity() + filler.Fill(board.Zones()) + print("unconnected after fill:", unconnected(board)) + pcbnew.SaveBoard(PCB, board) + print("finished") + + +if __name__ == "__main__": + {"place": place, "import": import_routes, "finish": finish}[sys.argv[1]]() diff --git a/hardware/calibrator/scripts/gen_qr.py b/hardware/calibrator/scripts/gen_qr.py new file mode 100644 index 0000000..b63afac --- /dev/null +++ b/hardware/calibrator/scripts/gen_qr.py @@ -0,0 +1,16 @@ +"""Writes qr_matrix.txt (1 = dark module) for the bottom-side QR code. + +Needs the 'segno' package (pip install segno); the matrix is committed, so the +board build does not need it. URL: the project's GitHub Pages site. +""" +import os + +import segno + +URL = "https://leeo86.github.io/mxl-avsync/" +q = segno.make(URL, error="m", micro=False) +rows = ["".join("1" if c else "0" for c in row) for row in q.matrix] +with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "qr_matrix.txt"), "w") as f: + f.write(f"# {URL} version {q.version}-{q.error}, {len(rows)}x{len(rows)}, no quiet zone\n") + f.write("\n".join(rows) + "\n") +print(q.version, q.error, len(rows)) diff --git a/hardware/calibrator/scripts/gen_sch.py b/hardware/calibrator/scripts/gen_sch.py new file mode 100644 index 0000000..3bc8fdb --- /dev/null +++ b/hardware/calibrator/scripts/gen_sch.py @@ -0,0 +1,362 @@ +"""Writes calibrator.kicad_sch (and the custom MCU symbol calibrator.kicad_sym). + +Drawn for people: power symbols at the top, GND at the bottom, signals left to right, +real wires inside each block, net labels only for the programming pads. +Parts, values, footprints and LCSC numbers come from design.py; check_netlist.py +compares the drawn connections with design.py. +Run inside the KiCad image (needs /usr/share/kicad/symbols): python3 gen_sch.py +""" +import math +import os +import re +import uuid + +import design as D + +HERE = os.path.dirname(os.path.abspath(__file__)) +PRJ = os.path.join(HERE, "..") +OUT = os.path.join(PRJ, "calibrator.kicad_sch") +SYMLIB = os.path.join(PRJ, "calibrator.kicad_sym") +SYMDIR = os.environ.get("KICAD_SYMBOL_DIR", "/usr/share/kicad/symbols") +ROOT = str(uuid.uuid5(uuid.NAMESPACE_URL, "calibrator-root")) +_n = [0] + + +def u(): + _n[0] += 1 + return str(uuid.uuid5(uuid.NAMESPACE_URL, f"calibrator-sch-{_n[0]}")) + + +# ---------------------------------------------------------------- custom MCU symbol +# Pins grouped by job: inputs left, outputs right, power top, ground bottom. +MCU_PINS = [ # (number, name, type, x, y, angle) + ("2", "PC16/UDM", "bidirectional", -17.78, 12.7, 0), + ("3", "PC17/UDP/BOOT", "bidirectional", -17.78, 10.16, 0), + ("5", "PA13/CMP3+", "bidirectional", -17.78, 2.54, 0), + ("9", "PA0/ADC0", "bidirectional", -17.78, 0.0, 0), + ("11", "PA2/CMP3-/ADC2", "bidirectional", -17.78, -2.54, 0), + ("1", "PC19/SWCLK", "bidirectional", -17.78, -7.62, 0), + ("28", "PC18/SWDIO", "bidirectional", -17.78, -10.16, 0), + ("4", "PC14/PA12", "bidirectional", -17.78, -12.7, 0), + ("8", "PC3", "bidirectional", -17.78, -15.24, 0), + ("10", "PA1", "bidirectional", -17.78, -17.78, 0), + ("12", "PA3", "bidirectional", -17.78, -20.32, 0), + ("13", "PA6", "bidirectional", -17.78, -22.86, 0), + ("14", "PB0", "bidirectional", -17.78, -25.4, 0), + ("15", "PA4", "bidirectional", 17.78, 12.7, 180), + ("16", "PA5", "bidirectional", 17.78, 10.16, 180), + ("17", "PA7", "bidirectional", 17.78, 5.08, 180), + ("18", "PB3/CMP3 out", "bidirectional", 17.78, 2.54, 180), + ("19", "PB4", "bidirectional", 17.78, 0.0, 180), + ("20", "PB1/PB5", "bidirectional", 17.78, -2.54, 180), + ("21", "PB6", "bidirectional", 17.78, -5.08, 180), + ("22", "PB7", "bidirectional", 17.78, -7.62, 180), + ("23", "PB8", "bidirectional", 17.78, -10.16, 180), + ("24", "PB9", "bidirectional", 17.78, -12.7, 180), + ("25", "PB10", "bidirectional", 17.78, -15.24, 180), + ("26", "PB11", "bidirectional", 17.78, -17.78, 180), + ("27", "PB12", "bidirectional", 17.78, -20.32, 180), + ("6", "VDD", "power_in", 0.0, 17.78, 270), + ("7", "GND", "power_in", 0.0, -30.48, 90), +] + + +def mcu_symbol(name): + s = (f' (symbol "{name}" (pin_names (offset 1.016)) (exclude_from_sim no) (in_bom yes) (on_board yes)\n' + f' (property "Reference" "U" (at -10.16 16.51 0) (effects (font (size 1.27 1.27)) (justify left)))\n' + f' (property "Value" "{name}" (at 2.54 16.51 0) (effects (font (size 1.27 1.27)) (justify left)))\n' + f' (property "Footprint" "Package_SO:QSOP-28_3.9x9.9mm_P0.635mm" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes)))\n' + f' (property "Datasheet" "https://www.wch.cn/products/CH32X035.html" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes)))\n' + f' (property "Description" "WCH CH32X035G8R6, RISC-V, 62 KB flash, USB FS, 3 comparators, QSOP-28; pins grouped by use" (at 0 0 0) (effects (font (size 1.27 1.27)) (hide yes)))\n' + f' (symbol "{name}_0_1" (rectangle (start -15.24 15.24) (end 15.24 -27.94) ' + f'(stroke (width 0.254) (type default)) (fill (type background))))\n' + f' (symbol "{name}_1_1"\n') + for num, pname, typ, x, y, a in MCU_PINS: + s += (f' (pin {typ} line (at {x} {y} {a}) (length 2.54) (name "{pname}" (effects (font (size 1.27 1.27)))) ' + f'(number "{num}" (effects (font (size 1.27 1.27)))))\n') + s += ' )\n (embedded_fonts no)\n )\n' + return s + + +def write_symlib(): + with open(SYMLIB, "w") as f: + f.write('(kicad_symbol_lib (version 20241209) (generator "calibrator-gen") (generator_version "9.0")\n') + f.write(mcu_symbol("CH32X035G8R6")) + f.write(')\n') + + +# ---------------------------------------------------------------- library helpers +def block(text, start): + d = 0 + for j in range(start, len(text)): + if text[j] == "(": + d += 1 + elif text[j] == ")": + d -= 1 + if d == 0: + return text[start:j + 1] + raise ValueError("unbalanced") + + +def lib_symbol(lib_id): + lib, name = lib_id.split(":") + path = SYMLIB if lib == "calibrator" else os.path.join(SYMDIR, lib + ".kicad_sym") + t = open(path).read() + b = block(t, t.find(f'(symbol "{name}"')) + if "(extends" in b: + raise ValueError(f"{lib_id} uses extends; pick a base symbol") + return b.replace(f'(symbol "{name}"', f'(symbol "{lib_id}"', 1) + + +def pins(sym): + out = {} + for m in re.finditer(r'\(pin \w+ \w+\s*\(at ([-\d.]+) ([-\d.]+) (\d+)\).*?\(number "([^"]*)"', sym, re.S): + out.setdefault(m.group(4), (float(m.group(1)), float(m.group(2)), int(m.group(3)))) + return out + + +def to_sheet(sx, sy, rot, px, py): + a = math.radians(rot) + x = px * math.cos(a) - py * math.sin(a) + y = px * math.sin(a) + py * math.cos(a) + return round(sx + x, 2), round(sy - y, 2) + + +def eff(size=1.27, hide=False, justify=None, bold=False): + j = f" (justify {justify})" if justify else "" + h = " (hide yes)" if hide else "" + b = " (bold yes)" if bold else "" + return f"(effects (font (size {size} {size}){b}){j}{h})" + + +def prop(name, value, x, y, hide=False, justify=None, angle=0): + return f' (property "{name}" "{value}" (at {x} {y} {angle}) {eff(hide=hide, justify=justify)})\n' + + +# ---------------------------------------------------------------- drawing +# Schematic position of every part: (x, y, rotation). Grid 1.27 mm. +SCH = { + # USB-C: power + update + "J1": (35.56, 66.04, 0), "C1": (63.5, 43.18, 0), "R3": (72.39, 35.56, 90), + "C2": (83.82, 43.18, 0), "C3": (91.44, 43.18, 0), "R1": (60.96, 55.88, 90), "R2": (71.12, 58.42, 90), + "R9": (78.74, 72.39, 0), "SW1": (78.74, 83.82, 270), + # Light sensors + "Q2": (114.3, 88.89999999999999, 0), "R7": (127.0, 106.67999999999999, 0), "C4": (137.16, 106.67999999999999, 0), + "Q3": (114.3, 121.92, 0), "R8": (127.0, 139.70000000000002, 0), "C5": (137.16, 139.70000000000002, 0), + # MCU + "U1": (185.42, 78.74, 0), + # Flash + click + "R4": (223.52, 66.04, 90), "D1": (238.76, 66.04, 180), + "R5": (223.52, 104.14, 90), "R6": (231.14, 111.76, 0), "Q1": (238.76, 104.14, 0), + "D2": (241.29999999999998, 88.9, 270), "BZ1": (254.0, 93.98, 0), +} + +# Reference / value text position per part: (dx, dy, justify) twice. +FIELDS = { + "J1": ((0, -27.94, None), (0, -25.4, None)), + "U1": ((-15.24, 39.37, "left"), (-15.24, 41.91, "left")), + "D1": ((0, -6.35, None), (0, -3.81, None)), + "D2": ((-2.54, -1.27, "left"), (-2.54, 1.27, "left")), + "SW1": ((-2.54, -1.27, "left"), (-2.54, 1.27, "left")), + "Q1": ((5.08, -1.27, "left"), (5.08, 1.27, "left")), + "Q2": ((5.08, -1.27, "left"), (5.08, 1.27, "left")), + "Q3": ((5.08, -1.27, "left"), (5.08, 1.27, "left")), + "BZ1": ((2.54, -5.08, "left"), (2.54, 5.08, "left")), + "R1": ((-2.54, -1.905, None), (2.54, -1.905, None)), + "R2": ((-2.54, 2.54, None), (2.54, 2.54, None)), + "R3": ((0, -2.54, None), (0, 2.54, None)), + "R4": ((0, -2.54, None), (0, 2.54, None)), + "R5": ((0, -2.54, None), (0, 2.54, None)), +} + +# Wires (polylines). Every T is drawn as segments meeting at one point. +WIRES = [ + # --- USB-C: power + update + [(50.8, 50.8), (55.88, 50.8)], [(55.88, 50.8), (55.88, 35.56)], # VBUS from J1 + [(55.88, 35.56), (63.5, 35.56)], [(63.5, 35.56), (68.58, 35.56)], # VBUS rail + [(63.5, 35.56), (63.5, 39.370000000000005)], # C1 + [(76.2, 35.56), (83.82, 35.56)], [(83.82, 35.56), (91.44, 35.56)], # VDD rail + [(91.44, 35.56), (99.06, 35.56)], + [(83.82, 35.56), (83.82, 39.370000000000005)], [(91.44, 35.56), (91.44, 39.370000000000005)], + [(63.5, 46.99), (63.5, 48.260000000000005)], [(83.82, 46.99), (83.82, 48.260000000000005)], + [(91.44, 46.99), (91.44, 48.260000000000005)], + [(50.8, 55.88), (57.15, 55.88)], [(50.8, 58.42), (67.31, 58.42)], # CC1 -> R1, CC2 -> R2 + [(64.77, 55.88), (78.74, 55.88)], [(78.74, 55.88), (78.74, 58.42)], [(74.93, 58.42), (78.74, 58.42)], + [(50.8, 63.5), (53.34, 63.5)], [(50.8, 66.04), (53.34, 66.04)], # D- (A7, B7) + [(53.34, 63.5), (53.34, 66.04)], [(53.34, 66.04), (167.64, 66.04)], + [(50.8, 68.58), (55.88, 68.58)], [(50.8, 71.12), (55.88, 71.12)], # D+ (A6, B6) + [(55.88, 68.58), (55.88, 71.12)], [(55.88, 68.58), (78.74, 68.58)], + [(78.74, 68.58), (167.64, 68.58)], + [(78.74, 76.2), (78.74, 78.74)], [(78.74, 88.9), (78.74, 91.44)], # boot: D+ - R9 - SW1 - VDD + [(35.56, 88.9), (35.56, 93.98)], [(27.94, 88.9), (27.94, 93.98), (35.56, 93.98)], # GND + shield + # --- Light sensors + [(116.84, 83.82), (116.84, 81.28)], + [(116.84, 116.84), (116.84, 114.3)], + [(116.84, 93.98), (116.84, 99.06)], + [(116.84, 99.06), (127.0, 99.06)], + [(127.0, 99.06), (137.16, 99.06)], + [(137.16, 99.06), (152.4, 99.06)], + [(127.0, 99.06), (127.0, 102.87)], + [(137.16, 99.06), (137.16, 102.87)], + [(127.0, 110.49), (127.0, 113.03)], + [(137.16, 110.49), (137.16, 113.03)], + [(116.84, 127.0), (116.84, 132.08)], + [(116.84, 132.08), (127.0, 132.08)], + [(127.0, 132.08), (137.16, 132.08)], + [(137.16, 132.08), (157.48, 132.08)], + [(127.0, 132.08), (127.0, 135.89)], + [(137.16, 132.08), (137.16, 135.89)], + [(127.0, 143.51), (127.0, 146.05)], + [(137.16, 143.51), (137.16, 146.05)], + [(152.4, 99.06), (152.4, 78.74)], + [(152.4, 78.74), (152.4, 76.2)], + [(152.4, 76.2), (167.64, 76.2)], + [(152.4, 78.74), (167.64, 78.74)], + [(157.48, 132.08), (157.48, 81.28), (167.64, 81.28)], + # --- MCU + [(185.42, 60.96), (185.42, 58.42)], [(185.42, 109.22), (185.42, 111.76)], + # --- Flash + click + [(203.2, 66.04), (219.71, 66.04)], + [(227.33, 66.04), (234.95, 66.04)], + [(242.57, 66.04), (247.65, 66.04), (247.65, 68.58)], + [(203.2, 68.58), (208.28, 68.58), (208.28, 104.14), (219.71, 104.14)], + [(227.33, 104.14), (231.14, 104.14)], + [(231.14, 104.14), (233.68, 104.14)], + [(231.14, 104.14), (231.14, 107.95)], + [(231.14, 115.57), (231.14, 118.11)], + [(241.3, 109.22), (241.3, 111.76)], + [(241.3, 99.06), (241.3, 96.52)], + [(241.3, 96.52), (241.3, 92.71)], + [(241.3, 96.52), (251.46, 96.52)], + [(241.3, 85.09), (241.3, 81.28)], + [(241.3, 81.28), (246.38, 81.28)], + [(246.38, 81.28), (246.38, 91.44), (251.46, 91.44)], +] + +JUNCTIONS = [(55.88, 35.56), (63.5, 35.56), (83.82, 35.56), (91.44, 35.56), (53.34, 66.04), (55.88, 68.58), + (78.74, 68.58), (78.74, 58.42), (127.0, 99.06), (137.16, 99.06), (152.4, 78.74), + (127.0, 132.08), (137.16, 132.08), (231.14, 104.14), (241.29999999999998, 96.52)] + +POWER = [ # (lib_id, x, y, rotation) + ("power:VBUS", 55.88, 35.56, 0), ("power:VDD", 99.06, 35.56, 0), + ("power:GND", 35.56, 93.98, 0), ("power:GND", 63.5, 48.260000000000005, 0), ("power:GND", 83.82, 48.260000000000005, 0), + ("power:GND", 91.44, 48.260000000000005, 0), ("power:GND", 78.74, 58.42, 0), ("power:VDD", 78.74, 91.44, 180), + ("power:VDD", 116.84, 81.28, 0), ("power:VDD", 116.84, 114.3, 0), + ("power:GND", 127.0, 113.03, 0), ("power:GND", 137.16, 113.03, 0), + ("power:GND", 127.0, 146.05, 0), ("power:GND", 137.16, 146.05, 0), + ("power:VDD", 185.42, 58.42, 0), ("power:GND", 185.42, 111.76, 0), + ("power:GND", 247.65, 68.58, 0), ("power:GND", 231.14, 118.11, 0), ("power:GND", 241.29999999999998, 111.76, 0), + ("power:VBUS", 241.29999999999998, 81.28, 0), +] +FLAGS = [(55.88, 50.8), (27.94, 93.98), (83.82, 35.56)] # VBUS, GND, VDD + +LABELS = [] # everything is wired + +BLOCKS = [ # (title, x1, y1, x2, y2) + ("USB-C: power + update", 15.24, 25.4, 101.6, 104.14), + ("Light sensors (display mode)", 101.6, 71.12, 162.56, 154.94), + ("MCU", 162.56, 25.4, 210.82, 154.94), + ("Flash + click (camera and display mode)", 210.82, 25.4, 279.4, 154.94), +] + +NOTES = [ + (17.78, 107.95, "5.1k on CC1/CC2 asks the phone for 5 V."), + (17.78, 110.49, "D+/D- go only to the MCU. The firmware never turns USB on,"), + (17.78, 113.03, "so a phone sees no device. R3 + C2/C3 filter spikes; C2/C3 sit at U1."), + (17.78, 118.11, "Update: hold SW1 while plugging into a PC. The ROM bootloader starts"), + (17.78, 120.65, "only at power-on with PC17 (D+) high; R9 limits the current into D+."), + (104.14, 158.75, "Reverse-gullwing parts look down through holes. CMP3 (hysteresis)"), + (104.14, 161.29, "flips where A and B see the same light; ADC0/ADC2 read dark / light."), + (213.36, 158.75, "Reverse-mount white LED shines through a hole (~12 mA)."), + (213.36, 161.29, "PA4 and PA5 are set by one register write."), + (213.36, 163.83, "D2 catches the coil kick; R6 keeps Q1 off during reset."), +] + + +def symbol_instance(lib_id, ref, value, fp, lcsc, x, y, rot, sym, in_bom=True, hide_ref=False, fields=None): + s = (f' (symbol (lib_id "{lib_id}") (at {x} {y} {rot}) (unit 1) (exclude_from_sim no) ' + f'(in_bom {"yes" if in_bom else "no"}) (on_board yes) (dnp no) (uuid "{u()}")\n') + (rx, ry, rj), (vx, vy, vj) = fields or ((2.54, -1.27, "left"), (2.54, 1.27, "left")) + fa = rot if rot in (90, 270) else 0 # keep text horizontal on turned parts + s += prop("Reference", ref, x + rx, y + ry, hide=hide_ref, justify=rj, angle=fa) + s += prop("Value", value, x + vx, y + vy, justify=vj, angle=fa) + s += prop("Footprint", fp, x, y, hide=True) + s += prop("Datasheet", "~", x, y, hide=True) + s += prop("Description", "", x, y, hide=True) + if lcsc: + s += prop("LCSC", lcsc, x, y, hide=True) + for num in pins(sym): + s += f' (pin "{num}" (uuid "{u()}"))\n' + s += f' (instances (project "calibrator" (path "/{ROOT}" (reference "{ref}") (unit 1))))\n )\n' + return s + + +def main(): + write_symlib() + libs = {} + for ref, p in D.PARTS.items(): + libs.setdefault(p[0], lib_symbol(p[0])) + for lib_id in ("power:PWR_FLAG", "power:GND", "power:VDD", "power:VBUS"): + libs[lib_id] = lib_symbol(lib_id) + + body = "" + nc = "" + for ref, (lib_id, value, fp, lcsc, netmap, _pcb) in D.PARTS.items(): + x, y, rot = SCH[ref] + sym = libs[lib_id] + body += symbol_instance(lib_id, ref, value, fp, lcsc, x, y, rot, sym, + in_bom=not ref.startswith("TP"), fields=FIELDS.get(ref, None) or ( + ((2.54, -1.27, "left"), (2.54, 1.27, "left")) if lib_id in ("Device:R", "Device:C") + else None)) + for num, (px, py, _a) in pins(sym).items(): + if netmap.get(num, "x") is None: + nx, ny = to_sheet(x, y, rot, px, py) + nc += f' (no_connect (at {nx} {ny}) (uuid "{u()}"))\n' + + for i, (lib_id, x, y, rot) in enumerate(POWER): + name = lib_id.split(":")[1] + body += symbol_instance(lib_id, f"#PWR0{i + 1:02d}", name, "", "", x, y, rot, libs[lib_id], + hide_ref=True, fields=((0, 3.81 if name == "GND" else -3.81, None), + (0, 3.81 if name == "GND" else -3.81, None)) if rot == 0 else + ((0, 3.81, None), (0, 3.81, None))) + for i, (x, y) in enumerate(FLAGS): + body += symbol_instance("power:PWR_FLAG", f"#FLG0{i + 1}", "PWR_FLAG", "", "", x, y, 0, + libs["power:PWR_FLAG"], hide_ref=True, fields=((0, -3.81, None), (0, -3.81, None))) + + wires = "" + for poly in WIRES: + for a, b in zip(poly, poly[1:]): + wires += (f' (wire (pts (xy {a[0]} {a[1]}) (xy {b[0]} {b[1]})) (stroke (width 0) (type default)) ' + f'(uuid "{u()}"))\n') + for x, y in JUNCTIONS: + wires += f' (junction (at {x} {y}) (diameter 0) (color 0 0 0 0) (uuid "{u()}"))\n' + for net, x, y, a in LABELS: + just = "right bottom" if a in (180, 270) else "left bottom" + wires += f' (label "{net}" (at {x} {y} {a}) {eff(justify=just)} (uuid "{u()}"))\n' + + art = "" + for title, x1, y1, x2, y2 in BLOCKS: + art += (f' (rectangle (start {x1} {y1}) (end {x2} {y2}) (stroke (width 0.254) (type dash) ' + f'(color 72 110 150 1)) (fill (type none)) (uuid "{u()}"))\n') + art += (f' (text "{title}" (exclude_from_sim no) (at {x1 + 1.27} {y1 + 3.81} 0) ' + f'{eff(size=1.8, bold=True, justify="left bottom")} (uuid "{u()}"))\n') + for x, y, s in NOTES: + art += f' (text "{s}" (exclude_from_sim no) (at {x} {y} 0) {eff(justify="left bottom")} (uuid "{u()}"))\n' + + out = ( + f'(kicad_sch (version 20250114) (generator "eeschema") (generator_version "9.0") (uuid "{ROOT}") (paper "A4")\n' + ' (title_block (title "AVsync calibrator") (date "2026-11-08") (rev "0.3")\n' + ' (comment 1 "v1 proposal - not built or tested yet")\n' + ' (comment 2 "Generated by scripts/gen_sch.py from scripts/design.py")\n' + ' (comment 3 "SPDX-License-Identifier: CERN-OHL-P-2.0"))\n' + ' (lib_symbols\n' + "".join(libs.values()) + '\n )\n' + + art + wires + nc + body + + ' (sheet_instances (path "/" (page "1")))\n (embedded_fonts no)\n)\n' + ) + with open(OUT, "w") as f: + f.write(out) + print("wrote", OUT) + + +if __name__ == "__main__": + main() diff --git a/hardware/calibrator/scripts/jlc_files.py b/hardware/calibrator/scripts/jlc_files.py new file mode 100644 index 0000000..a911ad9 --- /dev/null +++ b/hardware/calibrator/scripts/jlc_files.py @@ -0,0 +1,59 @@ +"""Writes the JLCPCB BOM and CPL files from design.py and the KiCad position file. + +fab/calibrator-bom-jlc.csv : Comment, Designator, Footprint, LCSC Part # +fab/calibrator-cpl-jlc.csv : Designator, Mid X, Mid Y, Layer, Rotation +JLC's 0° for a part is the orientation of its own (EasyEDA) footprint, which is not always +KiCad's. ROTATION_OFFSET adds the known differences for the stock KiCad footprints used here +(values as in the community list of JLC corrections, e.g. matthewlai/JLCKicadTools +cpl_rotations_db.csv: SSOP/TSSOP/SOIC 270, SOT-23 -90, HRO TYPE-C-31-M-12 180). +Still check every part in JLC's placement preview before ordering (or pay for +"Confirm Parts Placement"); JLC also places by the pin-1 / polarity marks in the silkscreen. +""" + +# footprint name prefix -> degrees added to KiCad's rotation for JLC +ROTATION_OFFSET = { + "QSOP-28": 270, + "SOT-23": -90, + "USB_C_Receptacle_HRO_TYPE-C-31-M-12": 180, +} +import csv +import os +import sys + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +import design as D # noqa: E402 + +FAB = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "fab") + + +def main(): + groups = {} + for ref, p in D.PARTS.items(): + lcsc = p[3] + if not lcsc: + continue # test pads are bare copper, nothing to assemble + key = (p[1], p[2].split(":")[1], lcsc) + groups.setdefault(key, []).append(ref) + with open(os.path.join(FAB, "calibrator-bom-jlc.csv"), "w", newline="") as f: + w = csv.writer(f) + w.writerow(["Comment", "Designator", "Footprint", "LCSC Part #"]) + for (value, fp, lcsc), refs in sorted(groups.items(), key=lambda kv: kv[1][0]): + w.writerow([value, ",".join(sorted(refs)), fp, lcsc]) + + rows = list(csv.DictReader(open(os.path.join(FAB, "calibrator-pos.csv")))) + with open(os.path.join(FAB, "calibrator-cpl-jlc.csv"), "w", newline="") as f: + w = csv.writer(f) + w.writerow(["Designator", "Mid X", "Mid Y", "Layer", "Rotation"]) + for r in rows: + if not D.PARTS.get(r["Ref"], ("",) * 4)[3]: + continue + side = "Top" if r["Side"].lower() == "top" else "Bottom" + fp = D.PARTS[r["Ref"]][2].split(":")[1] + off = next((v for k, v in ROTATION_OFFSET.items() if fp.startswith(k)), 0) + rot = (float(r["Rot"]) + off) % 360 + w.writerow([r["Ref"], f'{float(r["PosX"]):.4f}mm', f'{float(r["PosY"]):.4f}mm', side, f"{rot:g}"]) + print("wrote BOM and CPL") + + +if __name__ == "__main__": + main() diff --git a/hardware/calibrator/scripts/kicad.sh b/hardware/calibrator/scripts/kicad.sh new file mode 100755 index 0000000..5ed1b0c --- /dev/null +++ b/hardware/calibrator/scripts/kicad.sh @@ -0,0 +1,7 @@ +#!/bin/sh +# Run a command inside the pinned KiCad image with this folder mounted at /work. +# Usage: scripts/kicad.sh +set -e +HERE=$(cd "$(dirname "$0")/.." && pwd) +exec docker run --rm -u "$(id -u):$(id -g)" -e HOME=/tmp -v "$HERE:/work" -w /work kicad/kicad:9.0.9-full \ + sh -c 'mkdir -p "$HOME/.config/kicad/9.0" && cp /usr/share/kicad/template/sym-lib-table /usr/share/kicad/template/fp-lib-table "$HOME/.config/kicad/9.0/" && exec "$@"' sh "$@" diff --git a/hardware/calibrator/scripts/qr_matrix.txt b/hardware/calibrator/scripts/qr_matrix.txt new file mode 100644 index 0000000..ea1c914 --- /dev/null +++ b/hardware/calibrator/scripts/qr_matrix.txt @@ -0,0 +1,30 @@ +# https://leeo86.github.io/mxl-avsync/ version 3-M, 29x29, no quiet zone +11111110111010010111101111111 +10000010111110101100101000001 +10111010001101010010101011101 +10111010101110000101001011101 +10111010010001110001101011101 +10000010010000100111001000001 +11111110101010101010101111111 +00000000110011110111100000000 +10110111011011101101001001011 +10111101111010001111101010001 +11000010110100100010001010110 +00011000111101110011101110001 +11001110110010000100110001100 +00000101000001011001011000111 +01110011110110100011011100111 +00000101101101010000011110010 +00000011000110011011100111010 +01111000000111010110100101110 +10111111111100011010001110100 +00111101001110010100001000100 +01101110011001000111111111100 +00000000111101101111100011111 +11111110110001000111101011010 +10000010100010010000100011001 +10111010000000111110111110100 +10111010101110111001110111001 +10111010101010000011100100101 +10000010011011010000100011010 +11111110100010100011111010010 diff --git a/hardware/calibrator/sym-lib-table b/hardware/calibrator/sym-lib-table new file mode 100644 index 0000000..5706a6c --- /dev/null +++ b/hardware/calibrator/sym-lib-table @@ -0,0 +1,4 @@ +(sym_lib_table + (version 7) + (lib (name "calibrator")(type "KiCad")(uri "${KIPRJMOD}/calibrator.kicad_sym")(options "")(descr "AVsync calibrator custom symbols")) +) diff --git a/mobile-app/calibration/README.md b/mobile-app/calibration/README.md index 100b13a..907d178 100644 --- a/mobile-app/calibration/README.md +++ b/mobile-app/calibration/README.md @@ -1,5 +1,7 @@ # Calibration rig +New (in development): a small USB-C powered calibrator board with camera and display modes, see [`hardware/calibrator/`](../../hardware/calibrator/README.md) and [`docs/calibrator.md`](../../docs/calibrator.md). + A phone's camera and microphone are not assumed to be in sync. The rig is the reference: one microcontroller pin drives an LED and a piezo at the same instant (well under 0.1 ms apart), pulsing at the event rate (default 2 Hz). The app measures that pulse, stores the capture offset per device model and OS version, and subtracts it from later measurements. A measurement with no record, a record older than 90 days, or a record from another OS version is shown uncalibrated, in orange, with no grade colour.