component
MLX90614ESF-BCI-000-TU - 3 V Digital IR Thermometer, 5 deg FOV
Public Made by Adomby adom
Melexis MLX90614ESF-BCI-000-TU: factory-calibrated non-contact infrared thermometer, 3 V supply, 5 degree field of view (long collimator cap), gradient compensated, SMBus and PWM output, TO-39 4-lead can.
← Commit history
Add KiCad symbol and footprint, viewers, provenance, README, models.json and verification log
21 files changed
+5923−2
LICENSE+19PROVENANCE.md+50README.md+178−2artwork/MLX90614ESF-BCI-000-TU-3d-outline-dark-named.svg+1mlx90614esf-bci-000-tu.kicad_mod+211mlx90614esf-bci-000-tu.kicad_sym+112models.json+227provenance/3d-model.json+203provenance/footprint.json+62provenance/model-dims.json+60provenance/tools/billboard.py+80provenance/tools/build_to39_bci.py+127provenance/tools/glbtool.py+108provenance/tools/lod.mjs+34provenance/tools/materials_to39.py+32provenance/tools/overlay.py+72provenance/tools/pin1_proof.py+77provenance/tools/render.py+120verification.json+216viewers/footprint.html+210viewers/symbol.html+3724LICENSEadded+19@@ -0,0 +1,19 @@+Licenses for the files on this page++Adom-authored files (README, page.json, models.json, verification.json, provenance records and tools, the+datasheet-built 3D models (STEP, GLB and LOD GLBs), the hero GLB and image, the KiCad symbol, the Fusion/EAGLE+library, the Altium libraries and adom-lbr JSON, the overlay and pin-1 proof images, the chip outline artwork):++ Creative Commons Attribution 4.0 International (CC-BY-4.0)+ https://creativecommons.org/licenses/by/4.0/+ Attribution: Adom, https://wiki.adom.inc/adom/mlx90614esf-bci-000-tu++Third-party material keeps its own terms:++ - mlx90614esf-bci-000-tu.kicad_mod is the KiCad library footprint Package_TO_SOT_THT:TO-39-4 with the changes+ listed in provenance/footprint.json. KiCad libraries: CC-BY-SA 4.0 with the KiCad library exception+ (https://www.kicad.org/libraries/license/). The KiCad library authors are credited.+ - docs/mlx90614esf-bci-000-tu-datasheet.pdf and the page images under docs/figures/ are from the Melexis+ MLX90614 datasheet (Rev 021), copyright Melexis. They are reproduced unmodified as the cited source for this+ page's data. Melexis' terms apply; the latest version is at https://www.melexis.com/MLX90614.+ - The BCI laser-mark text follows Melexis' marking convention (datasheet p.50).
PROVENANCE.mdadded+50@@ -0,0 +1,50 @@+# MLX90614ESF-BCI-000-TU: CAD provenance++Written by Claude (AI) on 2026-10-21. Classification: **AI-derived: datasheet-built 3D model and Adom-authored library files; not manufacturer CAD and not a manufacturer certification.** Machine-readable records: [provenance/3d-model.json](provenance/3d-model.json), [provenance/footprint.json](provenance/footprint.json), [verification.json](verification.json).++## Sources++| Data | Source | Pages |+|---|---|---|+| Pinout and bottom view | Melexis MLX90614 datasheet Rev 021 (02-Jun-2026, DOC#3901090614) | p.6 Table 2, Figure 1 |+| Electrical figures (3 V version) | same | p.7 Table 3, p.9 Tables 6 and 7 |+| Field of view | same | p.37 Table 19, p.40 Figure 33 |+| Package (xCI can) | same | p.49 Figure 45 |+| Other cans (variants) | same | p.47 to p.49 Figures 41 to 46 |+| Laser marking | same | p.50 Table 20 |+| Ordering code | same | p.2 Table 1 |+| Land pattern | KiCad library Package_TO_SOT_THT:TO-39-4 (the datasheet gives none) | |++Datasheet file: [docs/mlx90614esf-bci-000-tu-datasheet.pdf](docs/mlx90614esf-bci-000-tu-datasheet.pdf), SHA-256 `5baade0b66aac94e8dc4bd3adebc464aa4d33258da9126a05672bc3390ad7f78`, from https://www.melexis.com/-/media/files/documents/datasheets/mlx90614-datasheet-melexis.pdf.++## Why the 3D model is datasheet-built++1. Melexis STEP: not obtained (melexis.com refused a scripted request with HTTP 403 on 2026-10-21).+2. KiCad library: the TO-39-4 footprint references `TO-39-4.step`, which does not exist in KiCad 10.0 or in kicad-packages3D master. The nearest model, TO-39-3.step, is a 3-lead short can: 6.5 mm from header to top, header 9.4 mm. The MLX90614xCI can is 20.20 mm (p.49). Rejected.+3. Built from the p.49 drawing with CadQuery ([provenance/tools/build_to39_bci.py](provenance/tools/build_to39_bci.py)), proven by an orthographic overlay at the drawing's scale ([docs/proof/mlx90614esf-bci-000-tu-overlay-p49.png](docs/proof/mlx90614esf-bci-000-tu-overlay-p49.png)).++## Files++| File | Origin | SHA-256 |+|---|---|---|+| [mlx90614esf-bci-000-tu.kicad_sym](mlx90614esf-bci-000-tu.kicad_sym) | adom-symbol 1.2.6 from the datasheet pin table (p.6), chip outline from the marked model baked in the body | `10853a602f335712bdf7151351a840bbbbccde3b168aaa52931eb27feab441d9` |+| [mlx90614esf-bci-000-tu.kicad_mod](mlx90614esf-bci-000-tu.kicad_mod) | KiCad Package_TO_SOT_THT:TO-39-4 with name, F.Fab header circle and model path changed (provenance/footprint.json) | `31a5f115a7026865451a389c3773c407332eec475aefcde2a1569aaa98736810` |+| [mlx90614esf-bci-000-tu.lbr](mlx90614esf-bci-000-tu.lbr) | adom-lbr 2.47.5 generate from the symbol, footprint and page.json; pin names made visible (see README) | `9098cefea774cfd774533e6e64fc760e1a08912812869b40c9da82b5f36e8120` |+| [altium/MLX90614ESF-BCI-000-TU.SchLib](altium/MLX90614ESF-BCI-000-TU.SchLib) | adom-lbr 2.47.5 import-kicad + assemble-altium --no-dedupe | `ac5ad9c605f68758d7b66abe1581b332c1230c890283293570caa3ce47dda901` |+| [altium/MLX90614ESF-BCI-000-TU.PcbLib](altium/MLX90614ESF-BCI-000-TU.PcbLib) | adom-lbr 2.47.5 assemble-altium, the marked STEP embedded as the 3D body | `d5d7d702b95b6adeb0fc05e7b9aba42106f50e8aa9017eb30578bf7362c5b7e4` |+| [altium/MLX90614ESF-BCI-000-TU.adom-lbr.json](altium/MLX90614ESF-BCI-000-TU.adom-lbr.json) | adom-lbr 2.47.5 import-kicad (the hub JSON) | `e0ecdef571cae01ddfefb7346a9a6efb654986d5c7817c18464fd7cd8d1455ab` |+| [mlx90614esf-bci-000-tu.step](mlx90614esf-bci-000-tu.step) | provenance/tools/build_to39_bci.py (CadQuery 2.8.0) from datasheet p.49 | `efcf25aab0e24ac15f6767d644fc4de84f1cfbcbf6b3fce04807cc7593fa5951` |+| [mlx90614esf-bci-000-tu-etched.step](mlx90614esf-bci-000-tu-etched.step) | the same build with the BCI device code on the side wall (Adom.LaserEtch) | `6bfd4fbdf7717c84eb433fa32b41f1895b415b19a84cf273da06e1c9d5d2669c` |+| [mlx90614esf-bci-000-tu.glb](mlx90614esf-bci-000-tu.glb) | step2glb convert + lod.mjs batching + materials_to39.py | `d5086e82df825f6436497a48f565b7b5adad6939bcbe789139c1dc606155686d` |+| [mlx90614esf-bci-000-tu-etched.glb](mlx90614esf-bci-000-tu-etched.glb) | step2glb convert + lod.mjs batching + materials_to39.py (board use) | `3aacd3ec6e8221cde862b0627717265de0b59085140690ee5fcb3f63dba024ce` |+| [mlx90614esf-bci-000-tu-hero.glb](mlx90614esf-bci-000-tu-hero.glb) | adom/component-hero hero_glb.py (adom-hero 1.4), display only | `b0e9df68093389cbc00e3a13ed8d4e93f99906a871309eeaf45f0287c81f6e18` |+| [docs/hero.png](docs/hero.png) | billboard.py over a render.py image of the marked GLB | `aadaa1ba9033852dc4cea574fb6dc131cf8015c368911ba693926ecd71dff3c8` |+| [artwork/MLX90614ESF-BCI-000-TU-3d-outline-dark-named.svg](artwork/MLX90614ESF-BCI-000-TU-3d-outline-dark-named.svg) | adom-aiflow-etch outline of the plain and marked STEP | `b3921f3fc12bebe06cffd4fde92da9f59d78a287df5294427828b18adc7a5cd4` |+| [docs/mlx90614esf-bci-000-tu-datasheet.pdf](docs/mlx90614esf-bci-000-tu-datasheet.pdf) | Melexis MLX90614 datasheet Rev 021 (02-Jun-2026), unmodified | `5baade0b66aac94e8dc4bd3adebc464aa4d33258da9126a05672bc3390ad7f78` |++## What was checked++- Model against the drawing: side and bottom views blended over p.49 Figure 45 at 44.5 px/mm.+- Pin 1: model leads on footprint pad centres (0.000 mm), model bottom view against p.6 Figure 1 ([docs/proof/mlx90614esf-bci-000-tu-pin1-bottom-view.png](docs/proof/mlx90614esf-bci-000-tu-pin1-bottom-view.png)).+- Hero: hero_glb.py alignment check `align OK (offset 0.1 mm)`; the LODs carry no helper nodes (lod/manifest.json).+- Not checked: native KiCad, Fusion and Altium imports; the live page viewers; the real position of Melexis' laser mark.
README.md+178−2@@ -1,3 +1,179 @@-# MLX90614ESF-BCI-000-TU - 3 V Digital IR Thermometer, 5 deg FOV+# MLX90614ESF-BCI-000-TU -Melexis MLX90614ESF-BCI-000-TU: factory-calibrated non-contact infrared thermometer, 3 V supply, 5 degree field of view (long collimator cap), gradient compensated, SMBus and PWM output, TO-39 4-lead can.+**Melexis** · Digital infrared thermometer, 3 V, 5 degree field of view · TO-39 4-lead can++The MLX90614ESF-BCI-000-TU is a factory-calibrated non-contact infrared thermometer. A thermopile detector and a signal-conditioning ASSP share one TO-39 can, and the part reports object and ambient temperature over an SMBus-compatible two-wire interface or as a PWM output (datasheet Rev 021 p.1). The ordering code breaks down as E (-40 to 85 °C), SF (TO-39), B (3 V supply), C (thermal gradient compensated), I (5 degree field of view), 000 (standard), TU (tube) (p.2, p.50). The 5 degree version has a tall collimator cap: 20.20 mm from the top of the cap to the bottom of the header (p.49).++::adom-verified{src="/adom/mlx90614esf-bci-000-tu/render/verification.json"}++## Key specifications++| Parameter | Value | Source |+|---|---|---|+| Supply voltage | 2.6 to 3.6 V (3.0 V typical) | p.9 Table 6 |+| Supply voltage, absolute maximum | 5 V (< 24 h) | p.7 Table 3 |+| Supply current | 1.3 mA typical, 2.5 mA max | p.9 Table 7 |+| Sleep current | 2 uA typical, 6 uA max | p.9 Table 7 |+| Operating temperature (E) | -40 to 85 °C | p.7 Table 3 |+| Object temperature range | -70 to 380 °C | p.1 |+| Accuracy | 0.5 °C from 0 to 50 °C (Ta and To) | p.1 |+| Resolution | 0.02 °C (SMBus) | p.1, p.9 Table 7 |+| Field of view (50 percent points) | 5 degrees | p.37 Table 19, p.40 Figure 33 |+| Interface | SMBus compatible, 10 to 100 kHz, default address 0x5A; or 10-bit PWM | p.9 Table 7 |+| Power-up default | SMBus | p.1 |+| Output valid after power-on | 250 ms typical | p.9 Table 7 |+| Package | TO-39 4-lead can, MLX90614xCI collimator cap: 9.00 mm cap, 9.15 mm header, 20.20 mm tall, 13.00 mm leads | p.49 Figure 45 |++## Pinout++| Pin | Name | Type | Function |+|---|---|---|---|+| 1 | SCL | input | SMBus serial clock. The 5.7 V zener (Vz) on this pin exists on the 5 V Axx versions only, not on this 3 V part |+| 2 | SDA/PWM | bidirectional | SMBus serial data, or the PWM output when configured |+| 3 | VDD | power | External supply |+| 4 | VSS | power | Negative supply (ground) |++Source: p.6 Table 2 and Figure 1 (bottom view: tab up, pin 1 upper right, then 2, 3, 4 clockwise). The footprint shows the same pins from the top, which is the bottom view mirrored: pad 1 (the oval pad) left, 2 bottom, 3 right, 4 top, with the tab between pins 1 and 4.++++## Ordering variants++The MLX90614 is sold in many combinations of temperature range (E, K), supply and accuracy (A 5 V, B 3 V, D 3 V medical), zones and gradient compensation (A single, B dual, C compensated) and field of view (p.2 Table 1, p.50 Table 20). This page is the exact part **MLX90614ESF-BCI-000-TU**. Every TO-39 drawing in the datasheet (p.47 to p.49, Figures 41 to 46) shows the same lead pattern (0.45 mm leads on a 5.08 mm circle, 13.00 mm long, tab at 45 degrees between pins 1 and 4) and p.6 gives one pinout for all of them, so:++| Variant group | Field of view | Can (drawing) | Symbol | Footprint | 3D model on this page |+|---|---|---|---|---|---|+| **MLX90614ESF-BCI-000-TU** (this page) | 5 deg | xCI: 9.00 cap, 20.20 tall (p.49 Fig. 45) | fits | fits | fits |+| MLX90614ESF-BCI-000-SP | 5 deg | xCI | fits | fits | fits (same can, other packing) |+| MLX90614ESF-DCI-000-TU / -SP (3 V medical accuracy) | 5 deg | xCI | fits | fits | fits |+| xAA, xBA (single or dual zone, standard can) | 90 deg / 70 deg | xxA: 8.20 cap, 4.10 tall (p.47 Fig. 41) | fits | fits | no |+| xCC | 35 deg | 10.20 cap, 8.10 tall (p.47 Fig. 42) | fits | fits | no |+| xCF (Fresnel lens) | 10 deg | 9.00 cap, 17.20 tall (p.48 Fig. 43) | fits | fits | no (3 mm shorter) |+| xCH (refractive lens) | 10 deg (p.37), 12 deg (p.50) | 8.20 cap, 8.35 tall (p.48 Fig. 44) | fits | fits | no |+| xCK | 13 deg | 9.30 cap, 8.10 tall (p.49 Fig. 46) | fits | fits | no |++Notes: the symbol's supply description (2.6 to 3.6 V) is for the B and D versions; the A versions take 4.5 to 5.5 V and have the zener on pin 1 (p.8 Tables 4 and 5). The datasheet gives two widths for the xCH option (10 degrees in Table 19, 12 degrees in Table 20). Distributor listings found on 2026-10-21: Mouser 482-90614ESFBCI000SP, 482-90614ESFDCI000SP; DigiKey MLX90614ESF-DCI-000-TU-ND, MLX90614ESF-DCI-000-SP-ND.++## Sourcing++| Distributor | Part number | Stock (2026-10-21) |+|---|---|---|+| Mouser | [482-90614ESFBCI000TU](https://www.mouser.com/en/ProductDetail/Melexis/MLX90614ESF-BCI-000-TU?qs=KuGPmAKtFKXB55OHcItFHA%3D%3D) | 859 |+| DigiKey | [MLX90614ESF-BCI-000-TU-ND](https://www.digikey.com/en/products/detail/melexis-technologies-nv/MLX90614ESF-BCI-000-TU/2666249) | 1426 |+| LCSC / JLCPCB | not listed (adom-parts-search, 2026-10-21) | |++## CAD++| Tool | Files |+|---|---|+| KiCad | Symbol [mlx90614esf-bci-000-tu.kicad_sym](mlx90614esf-bci-000-tu.kicad_sym) (two columns, SMBus / PWM and Power groups, chip outline in the body, MPN / Manufacturer / Mouser / DigiKey properties); footprint [mlx90614esf-bci-000-tu.kicad_mod](mlx90614esf-bci-000-tu.kicad_mod); model [mlx90614esf-bci-000-tu-etched.step](mlx90614esf-bci-000-tu-etched.step) |+| Fusion / EAGLE | [mlx90614esf-bci-000-tu.lbr](mlx90614esf-bci-000-tu.lbr) (symbol, package and connects; MPN, MANUFACTURER, MOUSER_PN, DIGIKEY_PN attributes) |+| Altium | [altium/MLX90614ESF-BCI-000-TU.SchLib](altium/MLX90614ESF-BCI-000-TU.SchLib), [altium/MLX90614ESF-BCI-000-TU.PcbLib](altium/MLX90614ESF-BCI-000-TU.PcbLib) (STEP body embedded), hub [altium/MLX90614ESF-BCI-000-TU.adom-lbr.json](altium/MLX90614ESF-BCI-000-TU.adom-lbr.json) |+| Any | STEP and GLB, below |++Footprint: KiCad's own `Package_TO_SOT_THT:TO-39-4` land pattern (the datasheet gives none): 1.20 mm pads with 0.70 mm drills on the 5.08 mm lead circle, pad 1 oval, the tab drawn on the silkscreen between pads 1 and 4. Changed from KiCad's file: the name, the F.Fab body circle (now the datasheet's 9.15 mm header) and the 3D model path. KiCad's footprint points at `TO-39-4.step`, which is not in KiCad's 3D library; this footprint points at `${KIPRJMOD}/mlx90614esf-bci-000-tu-etched.step`, so put the STEP beside your project (or edit the path). Details: [provenance/footprint.json](provenance/footprint.json).++Fusion library note: adom-lbr 2.47.5 treated this four-pin symbol as a glyph and hid the pin names; the published .lbr has the names made visible again (the `visible="pad"` attribute removed from the four pins), and it lints clean.++## 3D models++::adom-models{src="/adom/mlx90614esf-bci-000-tu/render/models.json"}++| File | What it is |+|---|---|+| [mlx90614esf-bci-000-tu-etched.step](mlx90614esf-bci-000-tu-etched.step) | **The library model** for board CAD: the xCI can built from the datasheet, with the device code BCI on the side wall in an `Adom.LaserEtch` group. |+| [mlx90614esf-bci-000-tu.step](mlx90614esf-bci-000-tu.step) | The same package, unmarked. |+| [mlx90614esf-bci-000-tu-etched.glb](mlx90614esf-bci-000-tu-etched.glb) | The marked model as GLB, clean for boards and digital twins (no pad outlines, labels or silkscreen), nickel can and tin leads. |+| [mlx90614esf-bci-000-tu-hero.glb](mlx90614esf-bci-000-tu-hero.glb) | The annotated page hero (adom-hero 1.4): the marked part plus teal dashed pad outlines, silkscreen with pin 1 and pad signal names. Display only, never for a board. |+| [lod/](lod/manifest.json) | Board-use detail levels (below). |++Frame for every file: Z up, millimetres in STEP, origin on footprint pad 1 (KiCad's TO-39 convention), can axis at x = 2.54, binds with zero offset and rotation. The seating plane z = 0 is the bottom of the glass lead beads, which stand 0.38 mm below the header (p.49); the header bottom is at z = 0.38, the top of the cap at z = 20.58, the lead ends at z = -12.62.++### Why the model is built from the datasheet++- **Melexis STEP:** not obtained (melexis.com refused a scripted download on 2026-10-21).+- **KiCad's model:** KiCad's TO-39-4 footprint references `TO-39-4.step`, which does not exist in KiCad 10.0 or in the kicad-packages3D repository. The nearest KiCad model, TO-39-3, is a 3-lead **short can: 6.5 mm** from header to top. The 5 degree MLX90614xCI has the long collimator cap: **20.20 mm** (p.49). So the model is built from the p.49 drawing.++**This model is AI-generated from the datasheet drawing** ([provenance/tools/build_to39_bci.py](provenance/tools/build_to39_bci.py), CadQuery).++### Model proof: overlay on the datasheet drawing++The model was rendered orthographically at the drawing's own scale (44.5 px/mm at 400 dpi, calibrated on the printed 9.00 and 20.20) and blended over p.49 Figure 45, side view and bottom view. Blue fill and red outline: the model. Black: the datasheet.++++| Dimension (mm) | Datasheet (p.49) | Model |+|---|---|---|+| Cap top to header bottom | 20.20 ±0.15 | 20.20 |+| Cap top to header top line | 19.50 ±0.10 | 19.50 |+| Cap diameter | 9.00 ±0.10 | 9.00 |+| Top chamfer | 0.50 x 45 deg | 0.50 x 45 deg |+| Groove | 1.50 diameter, centre 0.20 outside the wall, 1.58 below the top | as printed |+| Header diameter | 9.15 +0.20 / -0.10 | 9.15 |+| Tab width | 0.80 ±0.10 | 0.80 |+| Leads | 0.45 ±0.04 on a 5.08 circle, 13.00 ±0.50 below the header | as printed |+| Lead beads | 1.20 diameter, 0.38 below the header | as printed |+| Top opening | M5 thread | 4.13 bore (M5 minor diameter) |+| Header flange thickness | not printed | 0.40 (measured off the drawing) |+| Header step at 9.00 | not printed | 0.29 (measured) |+| Tab tip from the can axis | not printed | 5.46 (measured) |+| Bore depth | not given | 2.00 (assumed) |++Marking: Melexis lasers ten symbols, the device code (here BCI) followed by a 7-digit lot number (p.50 Table 20). The models carry **BCI** only, since the lot digits differ per part, on the side wall facing +Y. The datasheet does not say where on the can the marking sits or which font it uses, so the position and font are Adom's choice.++### Pin 1++Footprint pad 1, the model's lead 1 and the symbol's pin 1 agree, and the model seen from below matches the datasheet's bottom view (tab up, pin 1 upper right). The leads sit on the pad centres with a 0.000 mm offset ([check](docs/proof/mlx90614esf-bci-000-tu-pin1-check.json)).++++## Detail levels for board and digital-twin viewers++::adom-component-lod{src="/adom/mlx90614esf-bci-000-tu/render/lod/manifest.json"}++| Level | File | Triangles | Size | Marking |+|---|---|---|---|---|+| high | [mlx90614esf-bci-000-tu-high.glb](lod/mlx90614esf-bci-000-tu-high.glb) | 2960 | 89 KiB | yes |+| medium | [mlx90614esf-bci-000-tu-medium.glb](lod/mlx90614esf-bci-000-tu-medium.glb) | 2960 | 66 KiB | yes |+| low | [mlx90614esf-bci-000-tu-low.glb](lod/mlx90614esf-bci-000-tu-low.glb) | 1602 | 37 KiB | no |+| super-low | [mlx90614esf-bci-000-tu-super-low.glb](lod/mlx90614esf-bci-000-tu-super-low.glb) | 908 | 24 KiB | no |++All four come from the datasheet-built model, share its frame and bounds, carry no footprint or silkscreen artwork and keep the four leads, beads, tab and cap groove. Status: candidate; the cached previews were inspected, a streaming LOD viewer has not qualified them.++## Design notes from the datasheet++- Keep other nets off the metal can: Melexis recommends no electrical connection to the can except through VSS (p.6), and the can is not isolated (p.44).+- Accuracy holds in thermal equilibrium. Narrow-FOV parts such as this one see less energy from the object, so heat sources near the can (regulators, heaters, a warm object close by) still disturb the reading even with the gradient compensation of the C versions (p.35).+- Bus activity on SCL couples into the sensor input inside the can and can corrupt readings, more so on narrow-FOV devices: keep SDA and SCL quiet for longer than the refresh and settling time before a read, or use the PWM output (p.22).+- Up to 127 devices can share one SMBus by setting the address in EEPROM; resistive pull-ups are the simple choice, current-source pull-ups help with heavy bus capacitance (p.41).+- Lead forming and assembly: follow Melexis' TO-package guidance and limit thermal shock on the glass beads; robotic soldering is recommended (p.50).++## Manufacturer and resources++| Resource | Link |+|---|---|+| Product page | [melexis.com MLX90614](https://www.melexis.com/en/product/MLX90614/Digital-Plug-Play-Infrared-Thermometer-TO-Can) |+| Datasheet | Rev 021, 02-Jun-2026, DOC#3901090614: [PDF on this page](docs/mlx90614esf-bci-000-tu-datasheet.pdf), [melexis.com](https://www.melexis.com/-/media/files/documents/datasheets/mlx90614-datasheet-melexis.pdf) |+| Filter application note | "Understanding MLX90614 on-chip digital signal filters", named on p.15, from melexis.com |+| Evaluation board | EVB90614 with PC software, named on p.15 |+| Handling and assembly | [melexis.com/ic-handling-and-assembly](https://www.melexis.com/ic-handling-and-assembly) (p.50) |++## Symbol chip outline++The symbol body carries an outline of the 3D model ([artwork/MLX90614ESF-BCI-000-TU-3d-outline-dark-named.svg](artwork/MLX90614ESF-BCI-000-TU-3d-outline-dark-named.svg), drawn by `adom-aiflow-etch outline` from the plain and marked STEP), so the schematic shows the same tall can as the 3D view.++## Cited datasheet pages++++++++++++## Provenance and license++[PROVENANCE.md](PROVENANCE.md) lists every file with its origin and SHA-256; [provenance/3d-model.json](provenance/3d-model.json) records each model dimension against the datasheet, the KiCad library check and the frame; [verification.json](verification.json) is the verification log. Adom-authored files are CC-BY-4.0; the KiCad-derived footprint and the Melexis datasheet keep their own terms ([LICENSE](LICENSE)).
artwork/MLX90614ESF-BCI-000-TU-3d-outline-dark-named.svgadded+1@@ -0,0 +1 @@+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 320"><polyline points="125.56,184.72 125.57,184.62 125.59,184.53 125.60,184.44 125.62,184.34 125.64,184.25 125.65,184.16 125.67,184.06 125.69,183.97 125.71,183.88 125.73,183.78 125.75,183.69 125.78,183.60 125.80,183.50 125.82,183.41 125.85,183.32 125.87,183.22 125.90,183.13 125.92,183.04 125.95,182.94 125.98,182.85 126.01,182.76 126.04,182.66" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="201.37,182.66 201.43,182.84 201.48,183.02 201.53,183.20 201.58,183.38 201.62,183.56 201.67,183.74 201.71,183.93 201.74,184.11 201.78,184.29 201.81,184.47 201.84,184.65 201.87,184.83 201.89,185.01 201.92,185.20 201.93,185.38 201.95,185.56 201.97,185.74 201.98,185.92 201.99,186.11 201.99,186.29 202.00,186.47 202.00,186.65" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="202.00,186.65 201.63,189.71 200.53,192.71 198.73,195.60 196.24,198.31 193.14,200.80 189.47,203.01 185.30,204.91 180.71,206.46 175.80,207.63 170.66,208.39 165.38,208.74 160.07,208.66 154.83,208.16 149.76,207.24 144.96,205.93 140.52,204.25 136.52,202.23 133.05,199.91 130.17,197.33 127.93,194.55 126.39,191.61 125.56,188.58" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="125.56,188.58 125.56,191.32" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="125.56,191.32 126.39,194.35 127.93,197.28 130.17,200.06 133.05,202.64 136.52,204.96 140.52,206.98 144.96,208.67 149.76,209.98 154.83,210.89 160.07,211.40 165.38,211.47 170.66,211.13 175.80,210.36 180.71,209.19 185.30,207.65 189.47,205.74 193.14,203.53 196.24,201.04 198.73,198.33 200.53,195.45 201.63,192.45 202.00,189.39" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="125.56,184.72 118.00,184.72" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="118.00,184.72 118.00,188.58" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="118.00,191.32 118.00,188.58" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="118.00,188.58 125.56,188.58" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="126.04,186.65 126.42,189.75 127.56,192.78 129.44,195.69 132.02,198.41 135.24,200.89 139.04,203.09 143.34,204.95 148.06,206.43 153.09,207.52 158.34,208.18 163.70,208.40 169.06,208.18 174.32,207.52 179.35,206.43 184.07,204.95 188.37,203.09 192.17,200.89 195.39,198.41 197.97,195.69 199.84,192.78 200.99,189.75 201.37,186.65" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="127.02,62.13 126.93,62.35 126.85,62.57 126.77,62.79 126.70,63.02 126.63,63.24 126.56,63.46 126.50,63.69 126.44,63.91 126.38,64.13 126.33,64.36 126.28,64.58 126.24,64.81 126.20,65.03 126.17,65.26 126.14,65.48 126.11,65.71 126.09,65.94 126.07,66.16 126.06,66.39 126.05,66.62 126.04,66.84 126.04,67.07" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="126.04,67.07 126.42,70.16 127.56,73.20 129.44,76.10 132.02,78.83 135.24,81.31 139.04,83.50 143.34,85.36 148.06,86.85 153.09,87.94 158.34,88.59 163.70,88.82 169.06,88.59 174.32,87.94 179.35,86.85 184.07,85.36 188.37,83.50 192.17,81.31 195.39,78.83 197.97,76.10 199.84,73.20 200.99,70.16 201.37,67.07" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="201.37,67.07 201.37,66.84 201.36,66.62 201.35,66.39 201.34,66.16 201.32,65.94 201.30,65.71 201.27,65.48 201.24,65.26 201.21,65.03 201.17,64.81 201.12,64.58 201.08,64.36 201.03,64.13 200.97,63.91 200.91,63.69 200.85,63.46 200.78,63.24 200.71,63.02 200.64,62.79 200.56,62.57 200.47,62.35 200.39,62.13" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="126.04,57.19 126.42,60.28 127.56,63.32 129.44,66.22 132.02,68.95 135.24,71.43 139.04,73.62 143.34,75.48 148.06,76.97 153.09,78.05 158.34,78.71 163.70,78.94 169.06,78.71 174.32,78.05 179.35,76.97 184.07,75.48 188.37,73.62 192.17,71.43 195.39,68.95 197.97,66.22 199.84,63.32 200.99,60.28 201.37,57.19" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="137.07,39.37 136.14,39.93 135.24,40.51 134.37,41.10 133.55,41.72 132.76,42.35 132.02,42.99 131.31,43.65 130.64,44.33 130.02,45.01 129.44,45.71 128.90,46.43 128.41,47.15 127.96,47.88 127.56,48.62 127.21,49.37 126.90,50.13 126.64,50.89 126.42,51.65 126.25,52.42 126.13,53.20 126.06,53.97 126.04,54.75" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="126.04,54.75 126.42,57.84 127.56,60.87 129.44,63.78 132.02,66.51 135.24,68.99 139.04,71.18 143.34,73.04 148.06,74.53 153.09,75.61 158.34,76.27 163.70,76.49 169.06,76.27 174.32,75.61 179.35,74.53 184.07,73.04 188.37,71.18 192.17,68.99 195.39,66.51 197.97,63.78 199.84,60.87 200.99,57.84 201.37,54.75" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="201.37,54.75 201.35,53.97 201.27,53.20 201.15,52.42 200.99,51.65 200.77,50.89 200.51,50.13 200.20,49.37 199.84,48.62 199.44,47.88 199.00,47.15 198.50,46.43 197.97,45.71 197.39,45.01 196.76,44.33 196.10,43.65 195.39,42.99 194.64,42.35 193.86,41.72 193.03,41.10 192.17,40.51 191.27,39.93 190.34,39.37" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="190.34,39.37 187.38,37.66" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="187.38,37.66 185.63,36.72 183.77,35.86 181.81,35.07 179.75,34.36 177.61,33.75 175.40,33.22 173.14,32.78 170.82,32.44 168.47,32.20 166.09,32.05 163.70,32.00 161.32,32.05 158.94,32.20 156.59,32.44 154.27,32.78 152.00,33.22 149.80,33.75 147.66,34.36 145.60,35.07 143.64,35.86 141.78,36.72 140.03,37.66" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="140.03,37.66 135.54,40.88 132.33,44.58 130.56,48.58 130.31,52.71 131.58,56.78 134.32,60.59 138.40,63.99 143.64,66.81 149.80,68.91 156.59,70.22 163.70,70.66 170.82,70.22 177.61,68.91 183.77,66.81 189.01,63.99 193.09,60.59 195.83,56.78 197.10,52.71 196.84,48.58 195.07,44.58 191.87,40.88 187.38,37.66" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="175.93,44.27 176.35,44.53 176.77,44.80 177.16,45.07 177.54,45.35 177.90,45.64 178.24,45.94 178.57,46.24 178.87,46.55 179.16,46.86 179.43,47.19 179.67,47.51 179.90,47.84 180.10,48.18 180.29,48.52 180.45,48.86 180.59,49.21 180.71,49.56 180.81,49.91 180.89,50.26 180.94,50.62 180.98,50.97 180.99,51.33" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="180.99,51.33 180.81,52.75 180.29,54.14 179.43,55.48 178.24,56.73 176.77,57.87 175.02,58.87 173.05,59.73 170.88,60.41 168.57,60.91 166.16,61.21 163.70,61.31 161.24,61.21 158.83,60.91 156.52,60.41 154.36,59.73 152.38,58.87 150.64,57.87 149.16,56.73 147.98,55.48 147.12,54.14 146.59,52.75 146.42,51.33" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="146.42,51.33 146.52,50.26 146.81,49.21 147.30,48.18 147.98,47.19 148.84,46.24 149.87,45.35 151.05,44.53 152.38,43.79 153.85,43.13 155.42,42.57 157.09,42.11 158.83,41.76 160.63,41.51 162.47,41.38 164.32,41.36 166.16,41.45 167.98,41.66 169.74,41.98 171.44,42.41 173.05,42.94 174.55,43.56 175.93,44.27" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="118.00,191.32 125.56,191.32" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="175.87,57.64 174.94,57.14 173.94,56.68 172.90,56.26 171.80,55.89 170.65,55.57 169.47,55.30 168.26,55.08 167.02,54.91 165.77,54.80 164.50,54.74 163.23,54.73 161.96,54.78 160.71,54.88 159.46,55.03 158.25,55.24 157.06,55.50 155.90,55.81 154.79,56.16 153.73,56.57 152.72,57.01 151.78,57.50 150.89,58.03" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="176.51,58.03 176.49,58.01 176.46,57.99 176.43,57.98 176.40,57.96 176.37,57.94 176.34,57.92 176.31,57.90 176.28,57.88 176.25,57.87 176.22,57.85 176.20,57.83 176.17,57.81 176.14,57.79 176.11,57.78 176.08,57.76 176.05,57.74 176.02,57.72 175.99,57.71 175.96,57.69 175.93,57.67 175.90,57.65 175.87,57.64" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="146.79,286.91 146.81,287.07 146.86,287.22 146.96,287.36 147.09,287.50 147.25,287.62 147.44,287.73 147.65,287.83 147.89,287.90 148.14,287.96 148.40,287.99 148.67,288.00 148.94,287.99 149.20,287.96 149.45,287.90 149.69,287.83 149.90,287.73 150.09,287.62 150.25,287.50 150.38,287.36 150.48,287.22 150.53,287.07 150.55,286.91" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="176.85,286.91 176.87,287.07 176.93,287.22 177.02,287.36 177.15,287.50 177.31,287.62 177.50,287.73 177.72,287.83 177.96,287.90 178.21,287.96 178.47,287.99 178.74,288.00 179.01,287.99 179.27,287.96 179.52,287.90 179.76,287.83 179.97,287.73 180.16,287.62 180.32,287.50 180.45,287.36 180.54,287.22 180.60,287.07 180.62,286.91" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="202.00,186.65 202.00,189.39" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="126.04,67.07 126.04,186.65" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="201.37,67.07 201.37,186.65" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="126.04,54.75 126.04,57.19" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="201.37,54.75 201.37,57.19" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="140.03,37.66 137.07,39.37" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="146.79,209.22 146.79,286.91" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="150.55,210.15 150.55,286.91" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="176.85,210.15 176.85,286.91" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="180.62,209.22 180.62,286.91" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="176.85,210.15 176.85,269.55" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/><polyline points="180.62,209.22 180.62,269.55" fill="none" stroke="#e6edf3" stroke-width="1.5" stroke-linejoin="round" stroke-linecap="round"/></svg>
mlx90614esf-bci-000-tu.kicad_modadded+211@@ -0,0 +1,211 @@+(footprint "mlx90614esf-bci-000-tu"+ (version 20260206)+ (generator "kicad-footprint-generator")+ (layer "F.Cu")+ (descr "Melexis MLX90614ESF-BCI-000-TU, TO-39 4-lead can (5 deg FOV, 20.2 mm collimator cap), leads 0.45 mm on a 5.08 mm circle. KiCad TO-39-4 land pattern, F.Fab outline set to the datasheet header diameter 9.15 mm (Melexis MLX90614 datasheet Rev 021 p.49)")+ (tags "TO-39-4 TO-39 MLX90614 IR thermometer")+ (property "Reference" "REF**"+ (at 2.54 -5.81 0)+ (layer "F.SilkS")+ (effects+ (font+ (size 1 1)+ (thickness 0.15)+ )+ )+ )+ (property "Value" "MLX90614ESF-BCI-000-TU"+ (at 2.54 5.81 0)+ (layer "F.Fab")+ (effects+ (font+ (size 1 1)+ (thickness 0.15)+ )+ )+ )+ (property "KiLib_Generator" "package/TO_SOT/THT"+ (at 0 0 0)+ (layer "F.SilkS")+ (hide yes)+ (effects+ (font+ (size 1 1)+ (thickness 0.15)+ )+ )+ )+ (attr through_hole)+ (duplicate_pad_numbers_are_jumpers no)+ (fp_line+ (start -2.034693 -3.811018)+ (end -1.22152 -2.997844)+ (stroke+ (width 0.12)+ (type solid)+ )+ (layer "F.SilkS")+ )+ (fp_line+ (start -1.271018 -4.574693)+ (end -2.034693 -3.811018)+ (stroke+ (width 0.12)+ (type solid)+ )+ (layer "F.SilkS")+ )+ (fp_line+ (start -0.457844 -3.76152)+ (end -1.271018 -4.574693)+ (stroke+ (width 0.12)+ (type solid)+ )+ (layer "F.SilkS")+ )+ (fp_arc+ (start -0.457844 -3.76152)+ (mid 5.941184 3.401184)+ (end -1.22152 -2.997844)+ (stroke+ (width 0.12)+ (type solid)+ )+ (layer "F.SilkS")+ )+ (fp_line+ (start -2.231499 -3.809834)+ (end -1.407827 -2.986162)+ (stroke+ (width 0.05)+ (type solid)+ )+ (layer "F.CrtYd")+ )+ (fp_line+ (start -1.269834 -4.771499)+ (end -2.231499 -3.809834)+ (stroke+ (width 0.05)+ (type solid)+ )+ (layer "F.CrtYd")+ )+ (fp_line+ (start -0.446162 -3.947827)+ (end -1.269834 -4.771499)+ (stroke+ (width 0.05)+ (type solid)+ )+ (layer "F.CrtYd")+ )+ (fp_arc+ (start -0.446162 -3.947827)+ (mid 6.040179 3.500179)+ (end -1.407827 -2.986162)+ (stroke+ (width 0.05)+ (type solid)+ )+ (layer "F.CrtYd")+ )+ (fp_line+ (start -1.879621 -3.81151)+ (end -1.07352 -3.005408)+ (stroke+ (width 0.1)+ (type solid)+ )+ (layer "F.Fab")+ )+ (fp_line+ (start -1.27151 -4.419621)+ (end -1.879621 -3.81151)+ (stroke+ (width 0.1)+ (type solid)+ )+ (layer "F.Fab")+ )+ (fp_line+ (start -0.465408 -3.61352)+ (end -1.27151 -4.419621)+ (stroke+ (width 0.1)+ (type solid)+ )+ (layer "F.Fab")+ )+ (fp_arc+ (start -0.465408 -3.61352)+ (mid 5.863402 3.323402)+ (end -1.07352 -3.005408)+ (stroke+ (width 0.1)+ (type solid)+ )+ (layer "F.Fab")+ )+ (fp_circle+ (center 2.54 0)+ (end 7.115 0)+ (stroke+ (width 0.1)+ (type solid)+ )+ (fill no)+ (layer "F.Fab")+ )+ (fp_text user "${REFERENCE}"+ (at 2.54 -5.81 0)+ (layer "F.Fab")+ (effects+ (font+ (size 1 1)+ (thickness 0.15)+ )+ )+ )+ (pad "1" thru_hole oval+ (at 0 0)+ (size 1.6 1.2)+ (drill 0.7)+ (layers "*.Cu" "*.Mask")+ (remove_unused_layers no)+ )+ (pad "2" thru_hole circle+ (at 2.54 2.54)+ (size 1.2 1.2)+ (drill 0.7)+ (layers "*.Cu" "*.Mask")+ (remove_unused_layers no)+ )+ (pad "3" thru_hole circle+ (at 5.08 0)+ (size 1.2 1.2)+ (drill 0.7)+ (layers "*.Cu" "*.Mask")+ (remove_unused_layers no)+ )+ (pad "4" thru_hole circle+ (at 2.54 -2.54)+ (size 1.2 1.2)+ (drill 0.7)+ (layers "*.Cu" "*.Mask")+ (remove_unused_layers no)+ )+ (embedded_fonts no)+ (model "${KIPRJMOD}/mlx90614esf-bci-000-tu-etched.step"+ (offset+ (xyz 0 0 0)+ )+ (scale+ (xyz 1 1 1)+ )+ (rotate+ (xyz 0 0 0)+ )+ )+)
mlx90614esf-bci-000-tu.kicad_symadded+112@@ -0,0 +1,112 @@+(kicad_symbol_lib+ (version 20231120)+ (generator "adom")+ (symbol "MLX90614ESF-BCI-000-TU"+ (pin_names (offset 1.016))+ (exclude_from_sim no)+ (in_bom yes)+ (on_board yes)+ (property "Reference" "U"+ (at 0.00 8.89 0)+ (effects (font (size 1.27 1.27)))+ )+ (property "Value" "MLX90614ESF-BCI-000-TU"+ (at 0.00 -13.43 0)+ (effects (font (size 1.27 1.27)))+ )+ (property "Footprint" "mlx90614esf-bci-000-tu:mlx90614esf-bci-000-tu"+ (at 0 -18.51 0)+ (effects (font (size 1.27 1.27)) (hide yes))+ )+ (property "Datasheet" "https://www.melexis.com/-/media/files/documents/datasheets/mlx90614-datasheet-melexis.pdf"+ (at 0 -21.05 0)+ (effects (font (size 1.27 1.27)) (hide yes))+ )+ (property "Description" "Digital IR thermometer, 3 V, 5 deg FOV, gradient compensated, SMBus / PWM, TO-39 4-lead can. 2-column symbol, pins grouped by function."+ (at 0 -23.59 0)+ (effects (font (size 1.27 1.27)) (hide yes))+ )+ (property "Manufacturer" "Melexis"+ (at 0 -26.13 0)+ (effects (font (size 1.27 1.27)) (hide yes))+ )+ (property "MPN" "MLX90614ESF-BCI-000-TU"+ (at 0 -28.67 0)+ (effects (font (size 1.27 1.27)) (hide yes))+ )+ (property "Adom Wiki" "https://wiki.adom.inc/adom/mlx90614esf-bci-000-tu"+ (at 0 -31.21 0)+ (effects (font (size 1.27 1.27)) (hide yes))+ )+ (property "DigiKey" "MLX90614ESF-BCI-000-TU-ND"+ (at 0 -33.75 0)+ (effects (font (size 1.27 1.27)) (hide yes))+ )+ (property "Mouser" "482-90614ESFBCI000TU"+ (at 0 -36.29 0)+ (effects (font (size 1.27 1.27)) (hide yes))+ )+ (property "Adom_Chip_Outline" "asset:MLX90614ESF-BCI-000-TU-3d-outline-dark-named.svg@large"+ (at 0 -38.83 0)+ (effects (font (size 1.27 1.27)) (hide yes))+ )+ (symbol "MLX90614ESF-BCI-000-TU_0_1"+ (rectangle (start -17.78 6.35) (end 17.78 -10.89)+ (stroke (width 0.254) (type default))+ (fill (type background))+ )+ (text "SMBus / PWM" (at -16.76 0.00 0)+ (effects (font (size 0.762 0.762) (color 132 0 0 1)) (justify left))+ )+ (text "Power" (at 16.76 0.00 0)+ (effects (font (size 0.762 0.762) (color 132 0 0 1)) (justify right))+ )+ (polyline (pts (xy 1.850 -3.096) (xy 1.853 -3.077) (xy 1.857 -3.058) (xy 1.862 -3.040) (xy 1.866 -3.027)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 4.382 -3.027) (xy 4.387 -3.045) (xy 4.392 -3.063) (xy 4.396 -3.081) (xy 4.399 -3.099) (xy 4.401 -3.118) (xy 4.402 -3.136) (xy 4.403 -3.154) (xy 4.403 -3.160)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 4.403 -3.160) (xy 4.391 -3.262) (xy 4.354 -3.363) (xy 4.294 -3.459) (xy 4.211 -3.550) (xy 4.107 -3.633) (xy 3.984 -3.707) (xy 3.845 -3.770) (xy 3.692 -3.822) (xy 3.528 -3.861) (xy 3.356 -3.886) (xy 3.180 -3.898) (xy 3.002 -3.895) (xy 2.827 -3.879) (xy 2.658 -3.848) (xy 2.498 -3.804) (xy 2.349 -3.748) (xy 2.216 -3.681) (xy 2.100 -3.603) (xy 2.004 -3.517) (xy 1.929 -3.424) (xy 1.877 -3.326) (xy 1.850 -3.225)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.850 -3.225) (xy 1.850 -3.316)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.850 -3.316) (xy 1.877 -3.417) (xy 1.929 -3.515) (xy 2.004 -3.608) (xy 2.100 -3.694) (xy 2.216 -3.772) (xy 2.349 -3.839) (xy 2.498 -3.896) (xy 2.658 -3.939) (xy 2.827 -3.970) (xy 3.002 -3.987) (xy 3.180 -3.989) (xy 3.356 -3.978) (xy 3.528 -3.952) (xy 3.692 -3.913) (xy 3.845 -3.862) (xy 3.984 -3.798) (xy 4.107 -3.724) (xy 4.211 -3.641) (xy 4.294 -3.550) (xy 4.354 -3.454) (xy 4.391 -3.354) (xy 4.403 -3.252)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.850 -3.096) (xy 1.597 -3.096)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.597 -3.096) (xy 1.597 -3.225)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.597 -3.316) (xy 1.597 -3.225)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.597 -3.225) (xy 1.850 -3.225)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.866 -3.160) (xy 1.878 -3.264) (xy 1.916 -3.365) (xy 1.979 -3.462) (xy 2.065 -3.553) (xy 2.173 -3.636) (xy 2.300 -3.709) (xy 2.444 -3.771) (xy 2.601 -3.821) (xy 2.769 -3.857) (xy 2.945 -3.879) (xy 3.124 -3.887) (xy 3.303 -3.879) (xy 3.478 -3.857) (xy 3.646 -3.821) (xy 3.804 -3.771) (xy 3.948 -3.709) (xy 4.075 -3.636) (xy 4.182 -3.553) (xy 4.268 -3.462) (xy 4.331 -3.365) (xy 4.369 -3.264) (xy 4.382 -3.160)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.898 0.999) (xy 1.890 0.977) (xy 1.883 0.955) (xy 1.877 0.932) (xy 1.872 0.910) (xy 1.869 0.887) (xy 1.867 0.864) (xy 1.866 0.842) (xy 1.866 0.834)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.866 0.834) (xy 1.878 0.731) (xy 1.916 0.629) (xy 1.979 0.532) (xy 2.065 0.441) (xy 2.173 0.358) (xy 2.300 0.285) (xy 2.444 0.223) (xy 2.601 0.173) (xy 2.769 0.137) (xy 2.945 0.115) (xy 3.124 0.108) (xy 3.303 0.115) (xy 3.478 0.137) (xy 3.646 0.173) (xy 3.804 0.223) (xy 3.948 0.285) (xy 4.075 0.358) (xy 4.182 0.441) (xy 4.268 0.532) (xy 4.331 0.629) (xy 4.369 0.731) (xy 4.382 0.834)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 4.382 0.834) (xy 4.381 0.857) (xy 4.380 0.880) (xy 4.377 0.902) (xy 4.372 0.925) (xy 4.366 0.947) (xy 4.360 0.969) (xy 4.352 0.992) (xy 4.349 0.999)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.866 1.164) (xy 1.878 1.061) (xy 1.916 0.959) (xy 1.979 0.862) (xy 2.065 0.771) (xy 2.173 0.688) (xy 2.300 0.615) (xy 2.444 0.553) (xy 2.601 0.503) (xy 2.769 0.467) (xy 2.945 0.445) (xy 3.124 0.438) (xy 3.303 0.445) (xy 3.478 0.467) (xy 3.646 0.503) (xy 3.804 0.553) (xy 3.948 0.615) (xy 4.075 0.688) (xy 4.182 0.771) (xy 4.268 0.862) (xy 4.331 0.959) (xy 4.369 1.061) (xy 4.382 1.164)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 2.234 1.759) (xy 2.203 1.741) (xy 2.173 1.721) (xy 2.144 1.702) (xy 2.117 1.681) (xy 2.090 1.660) (xy 2.065 1.638) (xy 2.042 1.616) (xy 2.019 1.594) (xy 1.999 1.571) (xy 1.979 1.548) (xy 1.961 1.524) (xy 1.945 1.499) (xy 1.930 1.475) (xy 1.916 1.450) (xy 1.905 1.425) (xy 1.894 1.400) (xy 1.886 1.375) (xy 1.878 1.349) (xy 1.873 1.323) (xy 1.869 1.297) (xy 1.866 1.272) (xy 1.866 1.246)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.866 1.246) (xy 1.878 1.142) (xy 1.916 1.041) (xy 1.979 0.944) (xy 2.065 0.853) (xy 2.173 0.770) (xy 2.300 0.697) (xy 2.444 0.635) (xy 2.601 0.585) (xy 2.769 0.549) (xy 2.945 0.527) (xy 3.124 0.519) (xy 3.303 0.527) (xy 3.478 0.549) (xy 3.646 0.585) (xy 3.804 0.635) (xy 3.948 0.697) (xy 4.075 0.770) (xy 4.182 0.853) (xy 4.268 0.944) (xy 4.331 1.041) (xy 4.369 1.142) (xy 4.382 1.246)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 4.382 1.246) (xy 4.381 1.272) (xy 4.379 1.297) (xy 4.375 1.323) (xy 4.369 1.349) (xy 4.362 1.375) (xy 4.353 1.400) (xy 4.343 1.425) (xy 4.331 1.450) (xy 4.317 1.475) (xy 4.303 1.499) (xy 4.286 1.524) (xy 4.268 1.548) (xy 4.249 1.571) (xy 4.228 1.594) (xy 4.206 1.616) (xy 4.182 1.638) (xy 4.157 1.660) (xy 4.131 1.681) (xy 4.103 1.702) (xy 4.075 1.721) (xy 4.044 1.741) (xy 4.013 1.759)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 4.013 1.759) (xy 3.915 1.816)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 3.915 1.816) (xy 3.856 1.848) (xy 3.794 1.877) (xy 3.729 1.903) (xy 3.660 1.927) (xy 3.588 1.947) (xy 3.514 1.965) (xy 3.439 1.979) (xy 3.361 1.991) (xy 3.283 1.999) (xy 3.203 2.004) (xy 3.124 2.006) (xy 3.044 2.004) (xy 2.965 1.999) (xy 2.886 1.991) (xy 2.809 1.979) (xy 2.733 1.965) (xy 2.659 1.947) (xy 2.588 1.927) (xy 2.519 1.903) (xy 2.454 1.877) (xy 2.391 1.848) (xy 2.333 1.816)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 2.333 1.816) (xy 2.183 1.709) (xy 2.076 1.585) (xy 2.017 1.452) (xy 2.008 1.314) (xy 2.051 1.178) (xy 2.142 1.051) (xy 2.279 0.937) (xy 2.454 0.843) (xy 2.659 0.773) (xy 2.886 0.729) (xy 3.124 0.714) (xy 3.361 0.729) (xy 3.588 0.773) (xy 3.794 0.843) (xy 3.969 0.937) (xy 4.105 1.051) (xy 4.197 1.178) (xy 4.239 1.314) (xy 4.231 1.452) (xy 4.171 1.585) (xy 4.065 1.709) (xy 3.915 1.816)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 3.532 1.596) (xy 3.560 1.578) (xy 3.586 1.560) (xy 3.609 1.540) (xy 3.630 1.520) (xy 3.649 1.498) (xy 3.665 1.476) (xy 3.678 1.454) (xy 3.688 1.431) (xy 3.695 1.407) (xy 3.699 1.384) (xy 3.701 1.360)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 3.701 1.360) (xy 3.695 1.312) (xy 3.678 1.266) (xy 3.649 1.221) (xy 3.609 1.179) (xy 3.560 1.141) (xy 3.502 1.108) (xy 3.436 1.079) (xy 3.363 1.057) (xy 3.286 1.040) (xy 3.206 1.030) (xy 3.124 1.026) (xy 3.041 1.030) (xy 2.961 1.040) (xy 2.884 1.057) (xy 2.812 1.079) (xy 2.745 1.108) (xy 2.687 1.141) (xy 2.638 1.179) (xy 2.599 1.221) (xy 2.570 1.266) (xy 2.552 1.312) (xy 2.546 1.360)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 2.546 1.360) (xy 2.550 1.396) (xy 2.559 1.431) (xy 2.576 1.465) (xy 2.599 1.498) (xy 2.627 1.530) (xy 2.662 1.560) (xy 2.701 1.587) (xy 2.745 1.612) (xy 2.795 1.634) (xy 2.847 1.652) (xy 2.903 1.668) (xy 2.961 1.680) (xy 3.021 1.688) (xy 3.083 1.692) (xy 3.144 1.693) (xy 3.206 1.690) (xy 3.267 1.683) (xy 3.325 1.672) (xy 3.382 1.658) (xy 3.436 1.640) (xy 3.486 1.619) (xy 3.532 1.596)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.597 -3.316) (xy 1.850 -3.316)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 3.530 1.149) (xy 3.499 1.166) (xy 3.466 1.181) (xy 3.431 1.195) (xy 3.394 1.208) (xy 3.356 1.218) (xy 3.316 1.227) (xy 3.276 1.235) (xy 3.234 1.240) (xy 3.193 1.244) (xy 3.150 1.246) (xy 3.108 1.246) (xy 3.065 1.245) (xy 3.024 1.241) (xy 2.982 1.236) (xy 2.942 1.229) (xy 2.902 1.221) (xy 2.863 1.210) (xy 2.826 1.199) (xy 2.791 1.185) (xy 2.757 1.170) (xy 2.725 1.154) (xy 2.696 1.136)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 3.551 1.136) (xy 3.537 1.145) (xy 3.530 1.149)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 2.559 -6.509) (xy 2.569 -6.529) (xy 2.587 -6.540) (xy 2.604 -6.544) (xy 2.622 -6.546) (xy 2.639 -6.544) (xy 2.656 -6.540) (xy 2.674 -6.529) (xy 2.684 -6.514) (xy 2.684 -6.509)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 3.563 -6.509) (xy 3.573 -6.529) (xy 3.592 -6.540) (xy 3.608 -6.544) (xy 3.626 -6.546) (xy 3.644 -6.544) (xy 3.660 -6.540) (xy 3.679 -6.529) (xy 3.688 -6.514) (xy 3.689 -6.509)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 4.403 -3.160) (xy 4.403 -3.252)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.866 0.834) (xy 1.866 -3.160)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 4.382 0.834) (xy 4.382 -3.160)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 1.866 1.246) (xy 1.866 1.164)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 4.382 1.246) (xy 4.382 1.164)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 2.333 1.816) (xy 2.234 1.759)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 2.559 -3.914) (xy 2.559 -6.509)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 2.684 -3.945) (xy 2.684 -6.509)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 3.563 -3.945) (xy 3.563 -6.509)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 3.689 -3.914) (xy 3.689 -6.509)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 3.563 -3.945) (xy 3.563 -5.929)) (stroke (width 0.025) (type default)) (fill (type none)))+ (polyline (pts (xy 3.689 -3.914) (xy 3.689 -5.929)) (stroke (width 0.025) (type default)) (fill (type none)))+ )+ (symbol "MLX90614ESF-BCI-000-TU_1_1"+ (pin input line (at -20.32 -2.00 0) (length 2.54) (name "SCL") (number "1"))+ (pin bidirectional line (at -20.32 -4.54 0) (length 2.54) (name "SDA/PWM") (number "2"))+ (pin power_in line (at 20.32 -2.00 180) (length 2.54) (name "VDD") (number "3"))+ (pin power_in line (at 20.32 -4.54 180) (length 2.54) (name "VSS") (number "4"))+ )+ )+)
models.jsonadded+227@@ -0,0 +1,227 @@+{+ "schema": "adom/models@1",+ "part": "MLX90614ESF-BCI-000-TU",+ "models": [+ {+ "path": "lod/mlx90614esf-bci-000-tu-high.glb",+ "format": "glb",+ "title": "MLX90614ESF-BCI-000-TU LOD high",+ "status": "current",+ "slot": null,+ "variant": "lod",+ "use": [+ "render",+ "board-insertion"+ ],+ "unique": "Board LOD high: the marked model, primitives batched per part (lossless)",+ "marking": {+ "text": "BCI",+ "surface": "side wall (+Y), upright; position not given by the datasheet",+ "colour": "dark laser mark on nickel can"+ },+ "sha256": "3aacd3ec6e8221cde862b0627717265de0b59085140690ee5fcb3f63dba024ce",+ "git_blob": "24d21c214aa1b471a15cf26837a34a9bcd820321",+ "bytes": 90888,+ "role": "derived",+ "colours": true,+ "derived_from": "mlx90614esf-bci-000-tu-etched.glb",+ "source": "provenance/tools/lod.mjs (glTF Transform 4.1.1 + meshoptimizer)",+ "thumb": "docs/models/mlx90614esf-bci-000-tu-high-glb-top.png"+ },+ {+ "path": "lod/mlx90614esf-bci-000-tu-low.glb",+ "format": "glb",+ "title": "MLX90614ESF-BCI-000-TU LOD low",+ "status": "current",+ "slot": null,+ "variant": "lod",+ "use": [+ "render",+ "board-insertion"+ ],+ "unique": "Board LOD low: unmarked, error-bounded simplification (ratio 0.5), quantized",+ "marking": null,+ "sha256": "8645403b62ed60ad4ae60515f8c8af7714e8225946f9001143a33031ec4fe1e3",+ "git_blob": "123e91764be14acf90e66c3fa1853535807acc22",+ "bytes": 38384,+ "role": "derived",+ "colours": true,+ "derived_from": "mlx90614esf-bci-000-tu.glb",+ "source": "provenance/tools/lod.mjs (glTF Transform 4.1.1 + meshoptimizer)",+ "thumb": "docs/models/mlx90614esf-bci-000-tu-low-glb-top.png"+ },+ {+ "path": "lod/mlx90614esf-bci-000-tu-medium.glb",+ "format": "glb",+ "title": "MLX90614ESF-BCI-000-TU LOD medium",+ "status": "current",+ "slot": null,+ "variant": "lod",+ "use": [+ "render",+ "board-insertion"+ ],+ "unique": "Board LOD medium: the marked model, quantized",+ "marking": {+ "text": "BCI",+ "surface": "side wall (+Y), upright; position not given by the datasheet",+ "colour": "dark laser mark on nickel can"+ },+ "sha256": "043a3ccdac7cdc6830c53ef368079f0b12adee33984ae2a901179a54af1d97dd",+ "git_blob": "8e52dd193e65f19ebca72f9bb70a11adac2965b1",+ "bytes": 68064,+ "role": "derived",+ "colours": true,+ "derived_from": "mlx90614esf-bci-000-tu-etched.glb",+ "source": "provenance/tools/lod.mjs (glTF Transform 4.1.1 + meshoptimizer)",+ "thumb": "docs/models/mlx90614esf-bci-000-tu-medium-glb-top.png"+ },+ {+ "path": "lod/mlx90614esf-bci-000-tu-super-low.glb",+ "format": "glb",+ "title": "MLX90614ESF-BCI-000-TU LOD super-low",+ "status": "current",+ "slot": null,+ "variant": "lod",+ "use": [+ "render",+ "board-insertion"+ ],+ "unique": "Board LOD super-low: unmarked, simplification ratio 0.2, quantized",+ "marking": null,+ "sha256": "30e8505a861d7a714acb9f15538cf84e3f94120513ba727525ebaa23dea94baa",+ "git_blob": "fba6555f06e5ddd1f32e6a05771b25c477219685",+ "bytes": 24152,+ "role": "derived",+ "colours": true,+ "derived_from": "mlx90614esf-bci-000-tu.glb",+ "source": "provenance/tools/lod.mjs (glTF Transform 4.1.1 + meshoptimizer)",+ "thumb": "docs/models/mlx90614esf-bci-000-tu-super-low-glb-top.png"+ },+ {+ "path": "mlx90614esf-bci-000-tu-etched.glb",+ "format": "glb",+ "title": "MLX90614ESF-BCI-000-TU, BCI device code (GLB, board use)",+ "status": "current",+ "slot": "model_3d_plain",+ "variant": "etched",+ "use": [+ "render",+ "board-insertion"+ ],+ "unique": "Web and board-viewer copy of the marked STEP, clean (no pad outlines, labels or silkscreen), nickel can and tin lead materials",+ "marking": {+ "text": "BCI",+ "surface": "side wall (+Y), upright; position not given by the datasheet",+ "colour": "dark laser mark on nickel can"+ },+ "sha256": "3aacd3ec6e8221cde862b0627717265de0b59085140690ee5fcb3f63dba024ce",+ "git_blob": "24d21c214aa1b471a15cf26837a34a9bcd820321",+ "bytes": 90888,+ "role": "derived",+ "colours": true,+ "derived_from": "mlx90614esf-bci-000-tu-etched.step",+ "source": "step2glb convert + glTF Transform 4.1.1 batching + materials_to39.py",+ "thumb": "docs/models/mlx90614esf-bci-000-tu-etched-glb-top.png"+ },+ {+ "path": "mlx90614esf-bci-000-tu-etched.step",+ "format": "step",+ "title": "MLX90614ESF-BCI-000-TU, BCI device code (library model)",+ "status": "current",+ "slot": "model_3d_step",+ "variant": "etched",+ "use": [+ "board-cad"+ ],+ "unique": "The board-CAD model: built from the Melexis xCI drawing (p.49), long 20.2 mm collimator cap, 4 leads with glass beads, Melexis device code BCI on the side wall (Adom.LaserEtch)",+ "marking": {+ "text": "BCI",+ "surface": "side wall (+Y), upright; position not given by the datasheet",+ "colour": "dark laser mark on nickel can"+ },+ "sha256": "6bfd4fbdf7717c84eb433fa32b41f1895b415b19a84cf273da06e1c9d5d2669c",+ "git_blob": "2c1705eb0015b8e83a400d2fc1dccd7b36f0744b",+ "bytes": 395773,+ "role": "datasheet-built",+ "colours": true,+ "derived_from": "mlx90614esf-bci-000-tu.step",+ "source": "provenance/tools/build_to39_bci.py (CadQuery 2.8.0) from Melexis MLX90614 datasheet Rev 021 p.49",+ "thumb": "docs/models/mlx90614esf-bci-000-tu-etched-step-top.png",+ "thumb_bottom": "docs/models/mlx90614esf-bci-000-tu-etched-step-bottom.png"+ },+ {+ "path": "mlx90614esf-bci-000-tu-hero.glb",+ "format": "glb",+ "title": "MLX90614ESF-BCI-000-TU, annotated hero",+ "status": "current",+ "slot": "model_3d",+ "variant": "hero",+ "use": [+ "wiki-hero"+ ],+ "unique": "The marked part plus nonphysical reference art: teal dashed pad outlines, silkscreen with pin 1, pad signal names (adom-hero 1.4); never for a board",+ "marking": {+ "text": "BCI",+ "surface": "side wall (+Y), upright; position not given by the datasheet",+ "colour": "dark laser mark on nickel can"+ },+ "sha256": "b0e9df68093389cbc00e3a13ed8d4e93f99906a871309eeaf45f0287c81f6e18",+ "git_blob": "0b070843ec1d90aada0c2ee8ddb61967a96fd2d8",+ "bytes": 165812,+ "role": "derived",+ "colours": true,+ "derived_from": "mlx90614esf-bci-000-tu-etched.glb",+ "source": "adom/component-hero hero_glb.py",+ "thumb": "docs/models/mlx90614esf-bci-000-tu-hero-glb-top.png"+ },+ {+ "path": "mlx90614esf-bci-000-tu.glb",+ "format": "glb",+ "title": "MLX90614ESF-BCI-000-TU, unmarked (GLB)",+ "status": "current",+ "slot": null,+ "variant": "plain",+ "use": [+ "render"+ ],+ "unique": "GLB of the unmarked STEP",+ "marking": null,+ "sha256": "d5086e82df825f6436497a48f565b7b5adad6939bcbe789139c1dc606155686d",+ "git_blob": "51373e518ef81fc81562711ff7258e33b580b840",+ "bytes": 69252,+ "role": "derived",+ "colours": true,+ "derived_from": "mlx90614esf-bci-000-tu.step",+ "source": "step2glb convert + glTF Transform 4.1.1 batching + materials_to39.py",+ "thumb": "docs/models/mlx90614esf-bci-000-tu-glb-top.png"+ },+ {+ "path": "mlx90614esf-bci-000-tu.step",+ "format": "step",+ "title": "MLX90614ESF-BCI-000-TU, unmarked",+ "status": "current",+ "slot": "model_3d_step_plain",+ "variant": "plain",+ "use": [+ "board-cad"+ ],+ "unique": "The same datasheet-built package without the laser mark",+ "marking": null,+ "sha256": "efcf25aab0e24ac15f6767d644fc4de84f1cfbcbf6b3fce04807cc7593fa5951",+ "git_blob": "17dcc0bf7e44c72fbf26c211f19ae888216a3287",+ "bytes": 103801,+ "role": "datasheet-built",+ "colours": true,+ "source": "provenance/tools/build_to39_bci.py (CadQuery 2.8.0) from Melexis MLX90614 datasheet Rev 021 p.49",+ "thumb": "docs/models/mlx90614esf-bci-000-tu-step-top.png",+ "thumb_bottom": "docs/models/mlx90614esf-bci-000-tu-step-bottom.png"+ }+ ],+ "updated": "2026-10-21",+ "front": [+ 0,+ 1,+ 0+ ]+}
provenance/3d-model.jsonadded+203@@ -0,0 +1,203 @@+{+ "schema": "adom/3d-model-provenance@1",+ "mpn": "MLX90614ESF-BCI-000-TU",+ "classification": "AI-derived: datasheet-built 3D model produced by Claude (AI); not manufacturer CAD and not a manufacturer certification",+ "datasheet": {+ "title": "MLX90614 Single and dual zone IR sensor in TO39, Datasheet",+ "revision": "Datasheet Rev 021, Doc server Rev 012, 02-Jun-2026, DOC#3901090614",+ "url": "https://www.melexis.com/-/media/files/documents/datasheets/mlx90614-datasheet-melexis.pdf",+ "file": "docs/mlx90614esf-bci-000-tu-datasheet.pdf",+ "sha256": "5baade0b66aac94e8dc4bd3adebc464aa4d33258da9126a05672bc3390ad7f78",+ "pages": 58,+ "pages_used": {+ "6": "Table 2 and Figure 1: pins, bottom view",+ "49": "Figure 45: mechanical drawing of MLX90614xCI",+ "50": "Table 20: laser marking convention"+ }+ },+ "manufacturer_cad": {+ "looked_for": "Melexis STEP for the MLX90614xCI can",+ "result": "not obtained: melexis.com returned HTTP 403 to a scripted request on 2026-10-21; browser sessions were out of scope for this build"+ },+ "kicad_library_check": {+ "footprint": "Package_TO_SOT_THT.pretty/TO-39-4.kicad_mod (KiCad 10.0 library, identical to kicad-footprints master on 2026-10-21), sha256 d9f579fa10f86acb9a6be0a43ca537e34c7619520000a1da5dd4789a3ff3809a",+ "footprint_model_reference": "${KICAD10_3DMODEL_DIR}/Package_TO_SOT_THT.3dshapes/TO-39-4.step",+ "model_exists": false,+ "model_note": "TO-39-4.step is not in the KiCad 10.0 install nor in kicad-packages3D master (2026-10-21); only TO-39-2 and TO-39-3 (plus _Window) exist",+ "nearest_model": {+ "file": "Package_TO_SOT_THT.3dshapes/TO-39-3.step",+ "sha256": "ff9359c11599478b9000c8ca9c2d36c92c7a8e3d7a34e8aca5a9330e8fa773b2",+ "header_bottom_z_mm": 5.0,+ "can_top_z_mm": 11.5,+ "can_height_mm": 6.5,+ "header_diameter_mm": 9.4,+ "leads": 3+ },+ "verdict": "rejected: the KiCad TO-39 can is 6.5 mm tall above its header, the MLX90614xCI collimator can is 20.20 mm (p.49); the 4-lead model does not exist"+ },+ "frame": {+ "units": "mm (STEP), metres (GLB)",+ "up": "Z",+ "origin": "KiCad TO-39-4 footprint pad 1",+ "xy": "x = KiCad x, y = -KiCad y; can axis at (2.54, 0)",+ "seating": "z = 0 at the bottom of the lead beads; header bottom at z = 0.38; can top at z = 20.58; lead ends at z = -12.62",+ "binding": "footprint model offset 0, rotation 0, scale 1"+ },+ "calibration": "page 49 rendered at 400 dpi: 44.5 px/mm, from the printed 9.00 (401 px) and 20.20 (899 px); 19.50 and 5.08 measured true within 1 px",+ "dimensions": [+ {+ "feature": "Cap diameter",+ "basis": "printed",+ "datasheet": "9.00 +/-0.10",+ "model": 9.0+ },+ {+ "feature": "Top chamfer",+ "basis": "printed",+ "datasheet": "0.50 x 45 deg",+ "model": 0.5+ },+ {+ "feature": "Groove diameter (semicircular)",+ "basis": "printed",+ "datasheet": "1.50",+ "model": 1.5+ },+ {+ "feature": "Groove centre outside the cap wall",+ "basis": "printed",+ "datasheet": "0.20",+ "model": 0.2+ },+ {+ "feature": "Groove centre below the top",+ "basis": "printed",+ "datasheet": "1.58",+ "model": 1.58+ },+ {+ "feature": "Top to header bottom (overall can height)",+ "basis": "printed",+ "datasheet": "20.20 +/-0.15",+ "model": 20.2+ },+ {+ "feature": "Top to header top line",+ "basis": "printed",+ "datasheet": "19.50 +/-0.10",+ "model": 19.5+ },+ {+ "feature": "Header diameter",+ "basis": "printed",+ "datasheet": "9.15 +0.20/-0.10",+ "model": 9.15+ },+ {+ "feature": "Tab width",+ "basis": "printed",+ "datasheet": "0.80 +/-0.10",+ "model": 0.8+ },+ {+ "feature": "Tab angle",+ "basis": "printed",+ "datasheet": "45 deg between pins (between pins 1 and 4, p.6)",+ "model": "135 deg in the top view"+ },+ {+ "feature": "Lead diameter",+ "basis": "printed",+ "datasheet": "0.45 +/-0.04",+ "model": 0.45+ },+ {+ "feature": "Lead circle",+ "basis": "printed",+ "datasheet": "5.08",+ "model": 5.08+ },+ {+ "feature": "Lead length below the header",+ "basis": "printed",+ "datasheet": "13.00 +/-0.50",+ "model": 13.0+ },+ {+ "feature": "Lead bead diameter",+ "basis": "printed",+ "datasheet": "1.20",+ "model": 1.2+ },+ {+ "feature": "Lead bead height below the header",+ "basis": "printed",+ "datasheet": "0.38",+ "model": 0.38+ },+ {+ "feature": "Thread in the top",+ "basis": "printed",+ "datasheet": "M5",+ "model": "bore at the M5 minor diameter 4.13"+ },+ {+ "feature": "Header flange thickness",+ "basis": "measured off the drawing",+ "datasheet": "not printed",+ "model": 0.4+ },+ {+ "feature": "Upper header step height (at 9.00)",+ "basis": "measured off the drawing",+ "datasheet": "not printed (19.50 - 20.20 leaves 0.70 = 0.40 + 0.29 + 0.01)",+ "model": 0.29+ },+ {+ "feature": "Tab tip from the can axis",+ "basis": "measured off the drawing",+ "datasheet": "not printed",+ "model": 5.46+ },+ {+ "feature": "Bore depth",+ "basis": "assumed",+ "datasheet": "not given anywhere in the datasheet",+ "model": 2.0+ }+ ],+ "marking": {+ "text": "BCI",+ "source": "Table 20 p.50: 10 laser-marked symbols, the 3-letter device code (B = 3 V, C = gradient compensated, I = 5 deg FOV) then a 7-digit lot number",+ "placed": "side wall facing +Y, 1.6 mm cap height, 30 um proud, conforming to the cylinder, group Adom.LaserEtch",+ "not_from_datasheet": "the mark's position on the can and its font; the lot digits are omitted because they differ per lot"+ },+ "builder": {+ "tool": "provenance/tools/build_to39_bci.py",+ "engine": "CadQuery 2.8.0 (OCP)"+ },+ "proofs": {+ "overlay": "docs/proof/mlx90614esf-bci-000-tu-overlay-p49.png",+ "pin1": "docs/proof/mlx90614esf-bci-000-tu-pin1-bottom-view.png",+ "pin1_check": "docs/proof/mlx90614esf-bci-000-tu-pin1-check.json"+ },+ "files": {+ "mlx90614esf-bci-000-tu.step": "efcf25aab0e24ac15f6767d644fc4de84f1cfbcbf6b3fce04807cc7593fa5951",+ "mlx90614esf-bci-000-tu-etched.step": "6bfd4fbdf7717c84eb433fa32b41f1895b415b19a84cf273da06e1c9d5d2669c",+ "mlx90614esf-bci-000-tu.glb": "d5086e82df825f6436497a48f565b7b5adad6939bcbe789139c1dc606155686d",+ "mlx90614esf-bci-000-tu-etched.glb": "3aacd3ec6e8221cde862b0627717265de0b59085140690ee5fcb3f63dba024ce",+ "mlx90614esf-bci-000-tu-hero.glb": "b0e9df68093389cbc00e3a13ed8d4e93f99906a871309eeaf45f0287c81f6e18",+ "mlx90614esf-bci-000-tu.kicad_mod": "31a5f115a7026865451a389c3773c407332eec475aefcde2a1569aaa98736810",+ "mlx90614esf-bci-000-tu.kicad_sym": "10853a602f335712bdf7151351a840bbbbccde3b168aaa52931eb27feab441d9",+ "mlx90614esf-bci-000-tu.lbr": "9098cefea774cfd774533e6e64fc760e1a08912812869b40c9da82b5f36e8120"+ },+ "tools": {+ "step2glb": "convert --compress none (service-step2glb)",+ "gltf-transform": "4.1.1",+ "meshoptimizer": "0.22.0",+ "hero": "adom/component-hero hero_glb.py (adom-hero 1.4)",+ "adom-symbol": "1.2.6",+ "adom-lbr": "2.47.5"+ },+ "date": "2026-10-21"+}
provenance/footprint.jsonadded+62@@ -0,0 +1,62 @@+{+ "schema": "adom/footprint-provenance@1",+ "mpn": "MLX90614ESF-BCI-000-TU",+ "file": "mlx90614esf-bci-000-tu.kicad_mod",+ "sha256": "31a5f115a7026865451a389c3773c407332eec475aefcde2a1569aaa98736810",+ "source": {+ "library": "KiCad official footprint library (CC-BY-SA 4.0 with the KiCad library exception)",+ "footprint": "Package_TO_SOT_THT.pretty/TO-39-4.kicad_mod",+ "url": "https://gitlab.com/kicad/libraries/kicad-footprints/-/raw/master/Package_TO_SOT_THT.pretty/TO-39-4.kicad_mod",+ "sha256": "d9f579fa10f86acb9a6be0a43ca537e34c7619520000a1da5dd4789a3ff3809a",+ "same_as_kicad_10_0_install": true+ },+ "changes": [+ "footprint name, descr, tags and Value set to this part",+ "F.Fab body circle radius 4.25 -> 4.575 (the datasheet's 9.15 mm header, p.49)",+ "3D model path: KiCad's ${KICAD10_3DMODEL_DIR}/.../TO-39-4.step does not exist in the library; points at ${KIPRJMOD}/mlx90614esf-bci-000-tu-etched.step (copy the STEP next to the project or edit the path)"+ ],+ "unchanged": "pads, drills, silkscreen, courtyard, pin-1 tab mark and the origin (pad 1)",+ "datasheet_check": {+ "datasheet": "Melexis MLX90614 Rev 021 p.6 Figure 1, p.47 to p.49 Figures 41 to 46",+ "checks": [+ {+ "item": "lead circle",+ "datasheet": "5.08 mm",+ "footprint": "pads on a 5.08 mm circle (2.54 from the centre at 2.54, 0)",+ "result": "pass"+ },+ {+ "item": "lead diameter vs drill",+ "datasheet": "0.45 +/-0.04 (max 0.49)",+ "footprint": "0.70 drill (0.21 diametral clearance at the largest lead)",+ "result": "pass"+ },+ {+ "item": "pad size",+ "datasheet": "no land pattern given",+ "footprint": "1.20 round, pad 1 1.60 x 1.20 oval (KiCad TO-39 generator)",+ "result": "note: KiCad pattern used, the datasheet gives none"+ },+ {+ "item": "pin order",+ "datasheet": "bottom view: 1 SCL, 2 SDA/PWM, 3 VDD, 4 VSS, tab between 1 and 4",+ "footprint": "top view: 1 left, 2 bottom, 3 right, 4 top, tab mark upper left (between 1 and 4); the datasheet bottom view mirrored",+ "result": "pass"+ },+ {+ "item": "courtyard vs header",+ "datasheet": "header 9.15 +0.20 (radius up to 4.675), tab tip about 5.46 from the axis",+ "footprint": "courtyard radius 4.95, tab outline to about 6.1",+ "result": "pass"+ },+ {+ "item": "fits other variants",+ "datasheet": "every MLX90614 drawing (xxA, xCC, xCF, xCH, xCI, xCK) shows 0.45 leads on a 5.08 circle with the 45 deg tab",+ "footprint": "same land pattern",+ "result": "pass"+ }+ ]+ },+ "pin1_proof": "docs/proof/mlx90614esf-bci-000-tu-pin1-bottom-view.png",+ "date": "2026-10-21"+}
provenance/model-dims.jsonadded+60@@ -0,0 +1,60 @@+{+ "cap_d": 9.0,+ "chamfer": 0.5,+ "groove_d": 1.5,+ "groove_off": 0.2,+ "groove_from_top": 1.58,+ "overall": 20.2,+ "top_to_header_top": 19.5,+ "header_d": 9.15,+ "header_t": 0.4,+ "header_step_t": 0.29,+ "tab_w": 0.8,+ "tab_tip_r": 5.46,+ "tab_angle_deg": 135.0,+ "bore_d": 4.13,+ "bore_depth": 2.0,+ "lead_d": 0.45,+ "lead_circle_d": 5.08,+ "lead_len_below_header": 13.0,+ "bead_d": 1.2,+ "bead_h": 0.38,+ "z_header_bottom": 0.38,+ "z_header_top": 0.78,+ "z_cap_bottom": 1.0799999999999983,+ "z_top": 20.58,+ "groove_centre_z": 19.0,+ "lead_bottom_z": -12.62,+ "can_bbox_mm": [+ -2.035,+ -4.575,+ 0.38,+ 7.115000000000001,+ 4.575000000000001,+ 20.58+ ],+ "pins": {+ "1": [+ 0.0,+ 0.0+ ],+ "2": [+ 2.54,+ -2.54+ ],+ "3": [+ 5.08,+ 0.0+ ],+ "4": [+ 2.54,+ 2.54+ ]+ },+ "mark": {+ "text": "BCI",+ "size_mm": 1.6,+ "wall": "+Y",+ "proud_mm": 0.03+ }+}
provenance/tools/billboard.pyadded+80@@ -0,0 +1,80 @@+#!/usr/bin/env python3+"""Component-page billboard hero (docs/hero.png, 4000x2500) rebuilt around a new chip render.+Same layout as the pages' earlier billboards: gradient bar, COMPONENT eyebrow, MPN title, category,+"<maker> * <package>" line, provenance footer, and the chip on the right over a teal glow disc.+The chip is a depth-buffered render of the page's board-use GLB (render.py --alpha).+usage: billboard.py chip.png out.png --title T --category "C[|second line]" --meta "M" [--footer F]"""+import argparse+import numpy as np+from PIL import Image, ImageDraw, ImageFont, ImageFilter++FONTS = "/home/adom/.claude/skills/adom-wiki-hero-image/assets/fonts/"+MONO = "/home/adom/.claude/skills/adom-theme/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2"+W, H = 4000, 2500++ap = argparse.ArgumentParser()+ap.add_argument("chip"); ap.add_argument("out")+ap.add_argument("--title", required=True); ap.add_argument("--category", required=True)+ap.add_argument("--meta", required=True)+ap.add_argument("--footer", default="Manufacturer datasheet · KiCad package generator CAD · Adom Wiki")+ap.add_argument("--chip-box", default="2120,560,3860,1980", help="x0,y0,x1,y1 the chip is fitted into")+A = ap.parse_args()++# background: near-black blue, a teal glow to the right, a faint disc behind the chip+y, x = np.mgrid[0:H, 0:W].astype(np.float64)+base = np.array([11, 15, 21.0]) + (y / H)[..., None] * np.array([0.5, 1.5, 1.5])+glow = np.exp(-(((x - 3700) / 1700) ** 2 + ((y - 1150) / 1300) ** 2))[..., None] * np.array([3, 15, 15.0])+disc = (np.hypot(x - 3220, y - 1250) < 1240)[..., None] * np.array([2, 4, 4.0])+img = Image.fromarray(np.clip(base + glow + disc, 0, 255).astype(np.uint8)).convert("RGBA")++# gradient bar along the top+stops = [(0, (0, 229, 220)), (0.25, (26, 209, 236)), (0.5, (52, 188, 252)), (0.75, (94, 149, 251)), (1, (140, 107, 247))]+t = np.linspace(0, 1, W)+bar = np.stack([np.interp(t, [s for s, _ in stops], [c[i] for _, c in stops]) for i in range(3)], 1)+img.paste(Image.fromarray(np.repeat(bar[None], 24, 0).astype(np.uint8)), (0, 0))++# chip, fitted into the box by its alpha extent, with a soft contact shadow+chip = Image.open(A.chip).convert("RGBA")+chip = chip.crop(chip.getchannel("A").getbbox())+bx0, by0, bx1, by1 = [int(v) for v in A.chip_box.split(",")]+k = min((bx1 - bx0) / chip.width, (by1 - by0) / chip.height)+chip = chip.resize((round(chip.width * k), round(chip.height * k)), Image.LANCZOS)+cx, cy = (bx0 + bx1 - chip.width) // 2, (by0 + by1 - chip.height) // 2+sh = Image.new("RGBA", img.size, (0, 0, 0, 0))+sa = chip.getchannel("A").point(lambda v: int(v * 0.55))+sh.paste(Image.new("RGBA", chip.size, (0, 0, 0, 255)), (cx + 30, cy + 70), sa)+img.alpha_composite(sh.filter(ImageFilter.GaussianBlur(60)))+img.alpha_composite(chip, (cx, cy))++d = ImageDraw.Draw(img)+def font(f, s): return ImageFont.truetype(f, s)+def ink_top(text, fnt, x, top, fill, spacing=0):+ """draw so the ink's top edge lands on `top` (the measured billboards are ink-anchored)"""+ if spacing:+ cx_ = x+ for ch in text:+ b = d.textbbox((0, 0), ch, font=fnt)+ d.text((cx_, top - d.textbbox((0, 0), text, font=fnt)[1]), ch, font=fnt, fill=fill)+ cx_ += d.textlength(ch, font=fnt) + spacing+ return+ b = d.textbbox((0, 0), text, font=fnt)+ d.text((x - b[0], top - b[1]), text, font=fnt, fill=fill)+ return d.textbbox((x - b[0], top - b[1]), text, font=fnt)++ink_top("COMPONENT", font(MONO, 64), 260, 312, (0, 230, 220), spacing=12)+# title: Familjen Grotesk 700, cap height about 180 px, shrunk to fit left of the chip+size = 250+tf = font(FONTS + "familjen-grotesk-700-normal.woff2", size)+while d.textlength(A.title, font=tf) > 1900 and size > 120:+ size -= 4; tf = font(FONTS + "familjen-grotesk-700-normal.woff2", size)+tb = ink_top(A.title, tf, 262, 560, (238, 243, 248))+yy = tb[3] + 110+sf = font("/home/adom/.claude/skills/adom-theme/fonts/familjen-grotesk/FamiljenGrotesk-Variable.woff2", 112)+lines = A.category.split("|")+for i, ln in enumerate(lines):+ d.text((258, yy + i * 140), ln, font=sf, fill=(196, 205, 216))+yy += 140 * len(lines) + 20+d.text((258, yy), A.meta, font=font("/home/adom/.claude/skills/adom-theme/fonts/familjen-grotesk/FamiljenGrotesk-Variable.woff2", 84), fill=(139, 148, 158))+ink_top(A.footer, font(MONO, 56), 258, 2294, (91, 102, 117))+img.convert("RGB").save(A.out, optimize=True)+print("OK:", A.out, img.size, "title", size, "px")
provenance/tools/build_to39_bci.pyadded+127@@ -0,0 +1,127 @@+#!/usr/bin/env python3+"""Build the MLX90614xCI (5 degree FOV, long collimator cap) TO-39 4-lead model from the Melexis datasheet.++Source: Melexis MLX90614 datasheet, Datasheet Rev 021 (02-Jun-2026), DOC#3901090614,+p.49 Figure 45 (Mechanical drawing of MLX90614xCI) and p.6 Figure 1 (pin description, bottom view).++Frame (Adom / KiCad 3D): Z up, millimetres, origin = KiCad TO-39-4 footprint pad 1,+x = KiCad x, y = -KiCad y. Can axis at (2.54, 0). Seating plane z = 0 is the bottom of the+Ø1.20 lead beads (they stand 0.38 below the header); the header bottom is at z = 0.38.++Printed dimensions (p.49): cap Ø9.00 ±0.1, 0.50x45 top chamfer, Ø1.50 groove whose centre lies 0.20 outside+the cap wall and 1.58 below the top, overall 20.20 ±0.15 (top to header bottom), 19.50 ±0.1 (top to+header top line), header Ø9.15 +0.20/-0.10, tab 0.80 ±0.1 wide at 45 deg between pins 1 and 4,+M5 thread in the top, leads Ø0.45 ±0.04 on a Ø5.08 circle, 13.00 ±0.5 long below the header,+Ø1.20 lead beads 0.38 below the header.+Measured off the drawing (400 dpi render, 44.5 px/mm calibrated on Ø9.00 and 20.20; both read true):+header flange thickness 0.40, upper header step 0.29 at Ø9.00, tab tip 5.46 from the can axis,+M5 minor-diameter bore Ø4.13 (thread convention: full circle = minor diameter).+Not given anywhere in the datasheet: bore depth (modelled 2.00, assumption) and where the laser marking sits.++usage: build_to39_bci.py out_dir+writes: mlx90614esf-bci-000-tu.step (plain), mlx90614esf-bci-000-tu-etched.step (with the BCI device code),+ dims.json+"""+import json, math, sys, os+import cadquery as cq++OUT = sys.argv[1]+os.makedirs(OUT, exist_ok=True)+CX, CY = 2.54, 0.0++D = dict(+ cap_d=9.00, chamfer=0.50, groove_d=1.50, groove_off=0.20, groove_from_top=1.58,+ overall=20.20, top_to_header_top=19.50, header_d=9.15, header_t=0.40, header_step_t=0.29,+ tab_w=0.80, tab_tip_r=5.46, tab_angle_deg=135.0, bore_d=4.13, bore_depth=2.00,+ lead_d=0.45, lead_circle_d=5.08, lead_len_below_header=13.00, bead_d=1.20, bead_h=0.38,+)+Z_HDR_BOT = D['bead_h'] # 0.38+Z_TOP = Z_HDR_BOT + D['overall'] # 20.58+Z_HDR_TOP = Z_HDR_BOT + D['header_t'] # 0.78 (flange)+Z_CAP_BOT = Z_TOP - D['top_to_header_top'] # 1.08+assert abs(Z_CAP_BOT - (Z_HDR_TOP + D['header_step_t'])) < 0.02, (Z_CAP_BOT, Z_HDR_TOP)++PINS = { # pad number -> (x, y) in the model frame (KiCad y flipped)+ '1': (0.0, 0.0), '2': (2.54, -2.54), '3': (5.08, 0.0), '4': (2.54, 2.54)}+++def cyl(d, z0, z1, x=CX, y=CY):+ return cq.Workplane('XY').workplane(offset=z0).center(x, y).circle(d / 2).extrude(z1 - z0)+++# ---- can (header flange + tab + header step + cap with chamfer, groove and M5 bore)+flange = cyl(D['header_d'], Z_HDR_BOT, Z_HDR_TOP)+a = math.radians(D['tab_angle_deg'])+tab_len = D['tab_tip_r']+tab = (cq.Workplane('XY').workplane(offset=Z_HDR_BOT)+ .center(CX + math.cos(a) * tab_len / 2, CY + math.sin(a) * tab_len / 2)+ .rect(tab_len, D['tab_w']).extrude(D['header_t'])+ .rotate((CX + math.cos(a) * tab_len / 2, CY + math.sin(a) * tab_len / 2, 0),+ (CX + math.cos(a) * tab_len / 2, CY + math.sin(a) * tab_len / 2, 1), D['tab_angle_deg']))+step = cyl(D['cap_d'], Z_HDR_TOP, Z_CAP_BOT)+cap = cyl(D['cap_d'], Z_CAP_BOT, Z_TOP).faces('>Z').edges().chamfer(D['chamfer'])+groove_r = D['cap_d'] / 2 + D['groove_off']+groove_z = Z_TOP - D['groove_from_top']+torus = cq.Workplane('XY').add(cq.Solid.makeTorus(groove_r, D['groove_d'] / 2,+ pnt=cq.Vector(CX, CY, groove_z), dir=cq.Vector(0, 0, 1)))+cap = cap.cut(torus)+bore = cyl(D['bore_d'], Z_TOP - D['bore_depth'], Z_TOP + 0.1)+cap = cap.cut(bore)+can = flange.union(tab).union(step).union(cap)++# dark optics floor at the bottom of the bore (the window/lens seen from the top; its detail is not drawn)+window = cyl(D['bore_d'] - 0.02, Z_TOP - D['bore_depth'], Z_TOP - D['bore_depth'] + 0.05)++# ---- leads and glass beads+lead_bot = Z_HDR_BOT - D['lead_len_below_header']+leads = None+beads = None+for n, (x, y) in PINS.items():+ l = cyl(D['lead_d'], lead_bot, Z_HDR_TOP - 0.05, x, y)+ b = cyl(D['bead_d'], 0.0, Z_HDR_BOT + 0.01, x, y).cut(cyl(D['lead_d'], -0.1, 0.5, x, y))+ leads = l if leads is None else leads.union(l)+ beads = b if beads is None else beads.union(b)++NICKEL = cq.Color(0.80, 0.80, 0.78)+TIN = cq.Color(0.86, 0.86, 0.85)+GLASS = cq.Color(0.42, 0.52, 0.48)+OPTIC = cq.Color(0.06, 0.06, 0.07)+MARK = cq.Color(0.30, 0.30, 0.32)+++def assembly(with_mark):+ asm = cq.Assembly(name='MLX90614ESF-BCI-000-TU')+ asm.add(can, name='body', color=NICKEL)+ asm.add(window, name='window', color=OPTIC)+ asm.add(beads, name='beads', color=GLASS)+ asm.add(leads, name='pins', color=TIN)+ if with_mark:+ asm.add(mark_solid(), name='Adom.LaserEtch', color=MARK)+ return asm+++def mark_solid(text='BCI', size=1.6, zc=None):+ """The Melexis device code (Table 20, p.50) on the +Y wall, conforming to the cylinder (30 um proud)."""+ zc = zc if zc is not None else (Z_CAP_BOT + groove_z) / 2 + 2.0+ r0 = D['cap_d'] / 2+ # text lying in an XZ plane, extruded through the wall along +Y+ wp = cq.Workplane(cq.Plane(origin=(CX, CY + r0 - 1.0, zc), xDir=(-1, 0, 0), normal=(0, 1, 0)))+ txt = wp.text(text, size, 2.0, combine=True, halign='center', valign='center', kind='bold')+ shell = cyl(2 * (r0 + 0.03), zc - 3, zc + 3).cut(cyl(2 * r0 - 0.002, zc - 4, zc + 4))+ return txt.intersect(shell)+++assembly(False).save(os.path.join(OUT, 'mlx90614esf-bci-000-tu.step'), exportType='STEP')+assembly(True).save(os.path.join(OUT, 'mlx90614esf-bci-000-tu-etched.step'), exportType='STEP')++bb = can.val().BoundingBox()+summary = dict(D, z_header_bottom=Z_HDR_BOT, z_header_top=Z_HDR_TOP, z_cap_bottom=Z_CAP_BOT, z_top=Z_TOP,+ groove_centre_z=groove_z, lead_bottom_z=lead_bot,+ can_bbox_mm=[bb.xmin, bb.ymin, bb.zmin, bb.xmax, bb.ymax, bb.zmax], pins=PINS,+ mark=dict(text='BCI', size_mm=1.6, wall='+Y', proud_mm=0.03))+json.dump(summary, open(os.path.join(OUT, 'dims.json'), 'w'), indent=1)+print('OK', json.dumps(summary['can_bbox_mm']), 'top', Z_TOP, 'leads to', lead_bot)++if os.environ.get('BBOX'):+ for nm, o in (('can', can), ('window', window), ('beads', beads), ('leads', leads), ('mark', mark_solid())):+ b = o.val().BoundingBox(); print(nm, round(b.xmin, 3), round(b.ymin, 3), round(b.zmin, 3), round(b.xmax, 3), round(b.ymax, 3), round(b.zmax, 3))
provenance/tools/glbtool.pyadded+108@@ -0,0 +1,108 @@+#!/usr/bin/env python3+"""GLB stats + preview render (numpy/PIL, flat shading), reading quantized accessors correctly.+usage: glbtool.py stats a.glb [...] -> JSON per file+ glbtool.py render a.glb out.png [view=iso|top] [size=400]"""+import sys, json, hashlib, math, struct+import numpy as np+from pygltflib import GLTF2+from PIL import Image, ImageDraw+CT = {5120: np.int8, 5121: np.uint8, 5122: np.int16, 5123: np.uint16, 5125: np.uint32, 5126: np.float32}+NC = {"SCALAR": 1, "VEC2": 2, "VEC3": 3, "VEC4": 4, "MAT4": 16}+def acc(g, blob, i):+ a = g.accessors[i]; bv = g.bufferViews[a.bufferView]; dt = np.dtype(CT[a.componentType]); n = NC[a.type]+ off = (bv.byteOffset or 0) + (a.byteOffset or 0); stride = bv.byteStride or dt.itemsize * n+ raw = np.frombuffer(blob, dtype=np.uint8, count=stride * (a.count - 1) + dt.itemsize * n, offset=off)+ arr = np.lib.stride_tricks.as_strided(raw, shape=(a.count, n * dt.itemsize), strides=(stride, 1)).copy().view(dt).reshape(a.count, n).astype(np.float64)+ if a.normalized:+ arr = {np.int8: lambda x: np.maximum(x / 127, -1), np.uint8: lambda x: x / 255, np.int16: lambda x: np.maximum(x / 32767, -1), np.uint16: lambda x: x / 65535}[dt.type](arr)+ return arr+def node_mat(n):+ if n.matrix: return np.array(n.matrix).reshape(4, 4).T+ M = np.eye(4)+ if n.scale: M = np.diag(list(n.scale) + [1]) @ M+ if n.rotation:+ x, y, z, w = n.rotation+ R = np.array([[1-2*(y*y+z*z), 2*(x*y-z*w), 2*(x*z+y*w)], [2*(x*y+z*w), 1-2*(x*x+z*z), 2*(y*z-x*w)], [2*(x*z-y*w), 2*(y*z+x*w), 1-2*(x*x+y*y)]])+ R4 = np.eye(4); R4[:3, :3] = R; M = R4 @ M+ if n.translation:+ T = np.eye(4); T[:3, 3] = n.translation; M = T @ M+ return M+def walk(g):+ out = []+ def rec(i, P, path):+ n = g.nodes[i]; M = P @ node_mat(n); p = path + [n.name or str(i)]+ if n.mesh is not None: out.append((n, M, p))+ for c in n.children or []: rec(c, M, p)+ for r in g.scenes[g.scene or 0].nodes: rec(r, np.eye(4), [])+ return out+def load(f):+ g = GLTF2().load(f); return g, g.binary_blob()+def tris(f):+ g, blob = load(f); res = []+ for n, M, path in walk(g):+ for pr in g.meshes[n.mesh].primitives:+ P = acc(g, blob, pr.attributes.POSITION); P = (M @ np.c_[P, np.ones(len(P))].T).T[:, :3]+ I = acc(g, blob, pr.indices).astype(int).reshape(-1, 3) if pr.indices is not None else np.arange(len(P)).reshape(-1, 3)+ mat = g.materials[pr.material] if pr.material is not None else None+ col = mat.pbrMetallicRoughness.baseColorFactor if mat and mat.pbrMetallicRoughness else [0.6, 0.6, 0.6, 1]+ res.append(dict(path="/".join(path), P=P, I=I, col=col))+ return g, res+def stats(f):+ g, res = tris(f); data = open(f, "rb").read()+ allP = np.vstack([r["P"] for r in res])+ dec = 0+ for a in g.accessors: dec += a.count * NC[a.type] * np.dtype(CT[a.componentType]).itemsize+ names = [n.name or "" for n in g.nodes]+ helpers = [n for n in names if any(k in n.lower() for k in ("pad outline", "silkscreen", "signal name", "reference artwork", "footprint pads", "courtyard"))]+ mark = [r for r in res if "LaserEtch" in r["path"]]+ chip = [r for r in res if "LaserEtch" not in r["path"]]+ mz = None+ if mark:+ mp = np.vstack([r["P"] for r in mark]); top = max(r["P"][:, 2].max() for r in chip)+ mz = dict(mark_z_min_mm=round(mp[:, 2].min() * 1000, 4), mark_z_max_mm=round(mp[:, 2].max() * 1000, 4), chip_top_mm=round(top * 1000, 4),+ lift_um=round((mp[:, 2].min() - top) * 1e6, 2))+ return dict(file=f.split("/")[-1], sha256=hashlib.sha256(data).hexdigest(), bytes=len(data), triangles=int(sum(len(r["I"]) for r in res)),+ primitives=len(res), decodedBytes=int(dec), boundsMm=[round(v * 1000, 3) for v in (*allP.min(0), *allP.max(0))],+ helperNodes=helpers, mark=mz, extensions=g.extensionsUsed or [])+def render(f, out, view="iso", size=400):+ g, res = tris(f)+ allP = np.vstack([r["P"] for r in res]); c = (allP.min(0) + allP.max(0)) / 2+ if view == "top":+ R = np.eye(3)+ elif view.startswith("hero"):+ # pose: reading direction (-Y in the board frame) turned to +X, then a 3/4 view from the front, above+ P90 = np.array([[0, -1, 0], [1, 0, 0], [0, 0, 1]])+ a = math.radians(28); b = math.radians(-48)+ Rz = np.array([[math.cos(a), -math.sin(a), 0], [math.sin(a), math.cos(a), 0], [0, 0, 1]])+ Rx = np.array([[1, 0, 0], [0, math.cos(b), -math.sin(b)], [0, math.sin(b), math.cos(b)]])+ R = Rx @ Rz @ P90+ else: # iso: rotate -45 about z then tilt 55 about x (camera from front-left-up, pin-1 side)+ a = math.radians(-35); b = math.radians(-55)+ Rz = np.array([[math.cos(a), -math.sin(a), 0], [math.sin(a), math.cos(a), 0], [0, 0, 1]])+ Rx = np.array([[1, 0, 0], [0, math.cos(b), -math.sin(b)], [0, math.sin(b), math.cos(b)]])+ R = Rx @ Rz+ light = np.array([0.3, -0.5, 0.8]); light /= np.linalg.norm(light)+ polys = []+ for r in res:+ Q = (r["P"] - c) @ R.T+ for t in r["I"]:+ v = Q[t]; nrm = np.cross(v[1] - v[0], v[2] - v[0]); ln = np.linalg.norm(nrm)+ if ln == 0: continue+ nrm /= ln+ if nrm[2] < 0: nrm = -nrm+ sh = 0.35 + 0.65 * max(0, float(nrm @ light))+ col = tuple(int(255 * min(1, (x ** (1 / 2.2)) * sh)) for x in r["col"][:3])+ polys.append(((1 if "LaserEtch" in r["path"] else 0), v[:, 2].mean(), v[:, :2], col))+ polys.sort(key=lambda p: (p[0], p[1]))+ polys = [(p[1], p[2], p[3]) for p in polys]+ Q = np.vstack([p[1] for p in polys]); ext = (Q.max(0) - Q.min(0)).max()+ s = size * 0.86 / ext; S = 3+ im = Image.new("RGBA", (size * S, size * S), (0, 0, 0, 0) if view.startswith("hero") else (36, 40, 46, 255)); d = ImageDraw.Draw(im)+ for _, v, col in polys:+ d.polygon([(size * S / 2 + x * s * S, size * S / 2 - y * s * S) for x, y in v], fill=col)+ im.resize((size, size), Image.LANCZOS).save(out)+if __name__ == "__main__":+ if sys.argv[1] == "stats":+ print(json.dumps([stats(f) for f in sys.argv[2:]], indent=1))+ else:+ render(sys.argv[2], sys.argv[3], *(sys.argv[4:5] or ["iso"]), *(map(int, sys.argv[5:6])))
provenance/tools/lod.mjsadded+34@@ -0,0 +1,34 @@+// LOD derivation for a chip GLB (glTF Transform 4.1 + meshoptimizer), per wiki-component-lod:+// batch: join primitives per material inside each named part (body, pins, mark, Adom.LaserEtch stay+// separate nodes), dedup, prune; geometry unchanged (lossless batching)+// simplify: weld then error-bounded meshopt simplification to a target ratio (lower levels only)+// quantize: KHR_mesh_quantization+// usage: node lod.mjs in.glb out.glb [--simplify ratio:error] [--quantize]+import { NodeIO } from '@gltf-transform/core';+import { ALL_EXTENSIONS } from '@gltf-transform/extensions';+import { dedup, join, prune, weld, simplify, quantize } from '@gltf-transform/functions';+import { MeshoptSimplifier } from 'meshoptimizer';++const [, , src, out, ...opts] = process.argv;+const io = new NodeIO().registerExtensions(ALL_EXTENSIONS);+const doc = await io.read(src);+const before = count(doc);+const steps = [dedup(), join({ keepNamed: true }), prune()];+const si = opts.indexOf('--simplify');+if (si >= 0) {+ const [ratio, error] = opts[si + 1].split(':').map(Number);+ await MeshoptSimplifier.ready;+ steps.push(weld(), simplify({ simplifier: MeshoptSimplifier, ratio, error, lockBorder: false }), prune());+}+if (opts.includes('--quantize')) steps.push(quantize());+await doc.transform(...steps);+await io.write(out, doc);+console.log(JSON.stringify({ out, before, after: count(doc), nodes: doc.getRoot().listNodes().filter(n => n.getMesh()).map(n => n.getName()) }));++function count(d) {+ let prims = 0, tris = 0;+ for (const m of d.getRoot().listMeshes()) for (const p of m.listPrimitives()) {+ prims++; const i = p.getIndices(); tris += (i ? i.getCount() : p.getAttribute('POSITION').getCount()) / 3;+ }+ return { prims, tris };+}
provenance/tools/materials_to39.pyadded+32@@ -0,0 +1,32 @@+#!/usr/bin/env python3+"""Physical materials for the MLX90614 TO-39 GLB, per part (node names come from the STEP assembly).+step2glb writes base colours only (glTF then defaults to metallic 1, roughness 1).+ body -> "Adom.Can (nickel-plated steel)": metallic 1.0, roughness 0.30+ pins -> "Adom.Leads (tin)": metallic 1.0, roughness 0.35+ beads -> "Adom.Glass beads": metallic 0.0, roughness 0.15+ window -> "Adom.Optics (dark)": metallic 0.0, roughness 0.4+ Adom.LaserEtch -> "Adom.LaserEtch (dark laser mark)": metallic 0.2, roughness 0.8+Geometry and node transforms are untouched. usage: materials_to39.py in.glb [out.glb]"""+import sys+from pygltflib import GLTF2+SPEC = {"body": ("Adom.Can (nickel-plated steel)", 1.0, 0.30, [0.62, 0.62, 0.60, 1.0]),+ "pins": ("Adom.Leads (tin)", 1.0, 0.35, [0.72, 0.72, 0.70, 1.0]),+ "beads": ("Adom.Glass beads", 0.0, 0.15, None),+ "window": ("Adom.Optics (dark)", 0.0, 0.40, None),+ "Adom.LaserEtch": ("Adom.LaserEtch (dark laser mark)", 0.2, 0.80, None)}+src = sys.argv[1]; out = sys.argv[2] if len(sys.argv) > 2 else src+g = GLTF2().load(src)+seen = set()+for n in g.nodes:+ if n.mesh is None: continue+ key = next((k for k in SPEC if (n.name or "").startswith(k)), None)+ if key is None: continue+ for p in g.meshes[n.mesh].primitives:+ name, metal, rough, col = SPEC[key]+ m = g.materials[p.material]; pbr = m.pbrMetallicRoughness+ pbr.metallicFactor, pbr.roughnessFactor = metal, rough+ if col: pbr.baseColorFactor = col+ m.name = name; seen.add(key)+missing = [k for k in ("body", "pins") if k not in seen]+if missing: sys.exit(f"ERROR: no {missing} node in {src}")+g.save(out); print("OK", out, sorted(seen))
provenance/tools/overlay.pyadded+72@@ -0,0 +1,72 @@+#!/usr/bin/env python3+"""Overlay proof: the model rendered orthographically at the datasheet drawing's own scale, blended over the+Melexis MLX90614 datasheet Rev 021 p.49 Figure 45 (MLX90614xCI): side view and bottom view.+Red outline + blue fill = model silhouette; black = datasheet drawing.++usage: overlay.py model.step page49_400dpi.png out.png+Scale: 44.5 px/mm at 400 dpi, calibrated on the printed Ø9.00 (401 px) and 20.20 (899 px) dimensions.+"""+import sys+import numpy as np+import cadquery as cq+from PIL import Image, ImageDraw, ImageFilter, ImageChops, ImageFont++step, page, out = sys.argv[1:4]+K = 44.5+CX, CY, ZTOP = 2.54, 0.0, 20.58+SIDE_AXIS_X, SIDE_TOP_Y = 1616.5, 936.0 # drawing side view: can axis column, top row+BOT_C = (264 + 325 * 2944 / 2000, 654 + 413 * 2944 / 2000) # drawing bottom view centre (page px)++shape = cq.importers.importStep(step).val()+verts, tris = shape.tessellate(0.01, 0.2)+V = np.array([[v.x, v.y, v.z] for v in verts])+T = np.array(tris)+img = Image.open(page).convert('RGB')+W, H = img.size+++def silhouette(proj):+ m = Image.new('L', (W, H), 0)+ d = ImageDraw.Draw(m)+ P = proj(V)+ for t in T:+ d.polygon([tuple(P[i]) for i in t], fill=255)+ return m+++def side(Vv):+ return np.stack([SIDE_AXIS_X + (Vv[:, 0] - CX) * K, SIDE_TOP_Y + (ZTOP - Vv[:, 2]) * K], 1)+++def bottom(Vv):+ dx, dy = Vv[:, 0] - CX, Vv[:, 1] - CY+ u, v = dy, dx # mirror for the bottom view, then turn so the tab sits where Melexis drew it+ return np.stack([BOT_C[0] + u * K, BOT_C[1] - v * K], 1)+++def blend(mask, base):+ fill = Image.new('RGB', (W, H), (60, 110, 255))+ a = mask.point(lambda p: 70 if p else 0)+ base = Image.composite(fill, base, a)+ edge = ImageChops.subtract(mask.filter(ImageFilter.MaxFilter(5)), mask)+ red = Image.new('RGB', (W, H), (230, 30, 30))+ base = Image.composite(red, base, edge)+ # keep the drawing's black lines on top+ dark = img.convert('L').point(lambda p: 255 if p < 110 else 0)+ return Image.composite(Image.new('RGB', (W, H), (0, 0, 0)), base, dark)+++# bottom view: only the part below the header (leads cut at the seating plane, header, tab)+Vb = V.copy()+base = blend(silhouette(side), img)+base = blend(silhouette(bottom), base)+crop = base.crop((240, 640, 3230, 2560))+dr = ImageDraw.Draw(crop)+try:+ f = ImageFont.truetype('DejaVuSans.ttf', 34)+except Exception:+ f = ImageFont.load_default()+dr.text((20, 1870), 'Model (blue fill, red outline) over Melexis MLX90614 datasheet Rev 021 p.49 Figure 45 (xCI), 44.5 px/mm',+ fill=(200, 20, 20), font=f)+crop.save(out)+print('OK', out, crop.size)
provenance/tools/pin1_proof.pyadded+77@@ -0,0 +1,77 @@+#!/usr/bin/env python3+"""Pin-1 proof: footprint pads vs model leads, and the model's bottom view next to the datasheet's Figure 1.++1. Reads the KiCad footprint pads and the model's lead solids (STEP), maps KiCad (x, y-down) to the model frame+ (x, -y) and checks every lead centre sits on its pad centre.+2. Draws the model seen from BELOW, turned so the tab points up as in Melexis datasheet Rev 021 p.6 Figure 1,+ labels each lead with the footprint pad number and the symbol pin name, and places it beside the datasheet+ figure (page crop) for comparison.+usage: pin1_proof.py model.step footprint.kicad_mod page6_png out.png out.json+"""+import json, math, re, sys+import cadquery as cq+from PIL import Image, ImageDraw, ImageFont++step, fp, p6, out_png, out_json = sys.argv[1:6]+NAMES = {'1': 'SCL', '2': 'SDA/PWM', '3': 'VDD', '4': 'VSS'}+CX, CY = 2.54, 0.0++pads = {m.group(1): (float(m.group(2)), float(m.group(3)))+ for m in re.finditer(r'\(pad "(\d+)" thru_hole \w+\s*\(at ([-\d.]+) ([-\d.]+)\)', open(fp).read())}+shape = cq.importers.importStep(step)+solids = shape.solids().vals()+leads = []+for s in solids:+ b = s.BoundingBox()+ if b.zmin < -10 and (b.xmax - b.xmin) < 0.6: # a lead: thin and reaching below the board+ leads.append(((b.xmin + b.xmax) / 2, (b.ymin + b.ymax) / 2))+if len(leads) != 4: # leads fused into one solid: split by connected faces is overkill; use the bbox of each lead face+ leads = []+ for f in shape.faces().vals():+ b = f.BoundingBox()+ if abs(b.zmin - b.zmax) < 1e-6 and b.zmin < -12 and (b.xmax - b.xmin) < 0.6:+ leads.append(((b.xmin + b.xmax) / 2, (b.ymin + b.ymax) / 2))+res = {'pads_kicad': pads, 'leads_model': leads, 'pairs': {}, 'max_offset_mm': 0.0}+for n, (px, py) in pads.items():+ mx, my = px, -py+ d = min(math.hypot(mx - lx, my - ly) for lx, ly in leads)+ res['pairs'][n] = {'pad_model_xy': [mx, my], 'nearest_lead_offset_mm': round(d, 4)}+ res['max_offset_mm'] = max(res['max_offset_mm'], round(d, 4))+res['leads_on_pads'] = res['max_offset_mm'] < 0.01 and len(leads) == 4++# bottom view, tab up: mirror x (seen from below), then turn +45 deg (the tab at 135 deg in the top view goes to 90)+def bv(x, y):+ dx, dy = -(x - CX), (y - CY)+ a = math.radians(45)+ return dx * math.cos(a) - dy * math.sin(a), dx * math.sin(a) + dy * math.cos(a)++S, K = 900, 70.0+im = Image.new('RGB', (S, S), (255, 255, 255))+d = ImageDraw.Draw(im)+f = ImageFont.truetype('DejaVuSans.ttf', 30)+fs = ImageFont.truetype('DejaVuSans.ttf', 24)+def P(u, v): return (S / 2 + u * K, S / 2 + 40 - v * K)+# header + tab (from the model's dims)+dims = dict(header_r=4.575, tab_w=0.8, tab_tip=5.46, tab_angle=135)+d.ellipse([P(-dims['header_r'], dims['header_r']), P(dims['header_r'], -dims['header_r'])], outline=(0, 0, 0), width=3)+ta = math.radians(dims['tab_angle'])+tx, ty = CX + math.cos(ta) * dims['tab_tip'], CY + math.sin(ta) * dims['tab_tip']+u, v = bv(tx, ty)+d.rectangle([P(u - 0.4, v), P(u + 0.4, v - 0.9)], outline=(0, 0, 0), width=3)+for n, (px, py) in pads.items():+ u, v = bv(px, -py)+ d.ellipse([P(u - 0.6, v + 0.6), P(u + 0.6, v - 0.6)], outline=(40, 40, 40), width=3, fill=(200, 200, 200))+ d.text(P(u - 0.9, v + 1.5), f'{n} - {NAMES[n]}', fill=(200, 0, 0), font=f)+d.text((20, 15), 'Model bottom view (tab up), pad numbers from the footprint', fill=(0, 0, 0), font=fs)+d.text((20, S - 40), 'pin 1 = footprint pad 1 (oval pad); leads on pads: ' + ('PASS' if res['leads_on_pads'] else 'FAIL'),+ fill=(0, 120, 0) if res['leads_on_pads'] else (200, 0, 0), font=fs)+ds = Image.open(p6).convert('RGB')+W, H = ds.size+ds = ds.crop((int(W * 0.30), int(H * 0.27), int(W * 0.70), int(H * 0.56)))+ds = ds.resize((S, int(ds.height * S / ds.width)))+canvas = Image.new('RGB', (2 * S + 40, max(S, ds.height) + 60), (255, 255, 255))+canvas.paste(ds, (0, 50)); canvas.paste(im, (S + 40, 0))+ImageDraw.Draw(canvas).text((20, 10), 'Melexis MLX90614 datasheet Rev 021 p.6 Figure 1 (bottom view)', fill=(0, 0, 0), font=fs)+canvas.save(out_png)+json.dump(res, open(out_json, 'w'), indent=1)+print('OK', res['leads_on_pads'], res['max_offset_mm'])
provenance/tools/render.pyadded+120@@ -0,0 +1,120 @@+#!/usr/bin/env python3+"""Depth-buffered orthographic render of a chip GLB (or STEP), for LOD previews and close-ups.+Reads geometry with the page's glbtool loader (quantized accessors handled), shades with a key + fill+light, Lambert plus a Blinn specular that follows each material's metallic/roughness (so matte tin+reads as tin and epoxy as epoxy). Orthographic, 3x supersampled.+usage: render.py model.glb|model.step out.png [--view iso|top|front|side|corner] [--size 400]+ [--box x0,x1,y0,y1,z0,z1 (mm: frame only this region)] [--bg 36,40,46] [--alpha]+views: top, bottom, iso = from front-left-up (pin-1 side); corner = low 3/4 view onto a lead corner;+front = along +Y; side = along -X."""+import sys, math, argparse+import numpy as np+from PIL import Image+sys.path.insert(0, sys.argv[0].rsplit("/", 1)[0])++def load(path):+ if path.lower().endswith((".step", ".stp")):+ import cadquery as cq+ s = cq.importers.importStep(path).val()+ v, t = s.tessellate(0.002, 0.1)+ P = np.array([[p.x, p.y, p.z] for p in v]) / 1000.0+ return [dict(path="step", P=P, I=np.array(t), col=[0.6, 0.6, 0.6, 1], metal=0.0, rough=0.6)]+ from pygltflib import GLTF2+ import importlib.util+ spec = importlib.util.spec_from_file_location("glbtool", ARGS.glbtool)+ gt = importlib.util.module_from_spec(spec); spec.loader.exec_module(gt)+ g, res = gt.tris(path)+ # attach metallic/roughness per primitive (glbtool keeps only the colour)+ i = 0+ for n, M, p in gt.walk(g):+ for pr in g.meshes[n.mesh].primitives:+ m = g.materials[pr.material] if pr.material is not None else None+ pbr = m.pbrMetallicRoughness if m else None+ res[i]["metal"] = (pbr.metallicFactor if pbr and pbr.metallicFactor is not None else 1.0)+ res[i]["rough"] = (pbr.roughnessFactor if pbr and pbr.roughnessFactor is not None else 1.0)+ i += 1+ return res++def view_matrix(name):+ def rz(a): a = math.radians(a); return np.array([[math.cos(a), -math.sin(a), 0], [math.sin(a), math.cos(a), 0], [0, 0, 1]])+ def rx(a): a = math.radians(a); return np.array([[1, 0, 0], [0, math.cos(a), -math.sin(a)], [0, math.sin(a), math.cos(a)]])+ if name == "top": return np.eye(3)+ if name == "bottom": return rx(180) # from below, X still to the right+ if name == "front": return rx(-90) # look along +Y: X right, Z up+ if name == "side": return rx(-90) @ rz(-90) # look along -X: Y right, Z up+ if name == "corner": return rx(-68) @ rz(-38) # low 3/4 onto the -X/-Y lead corner+ return rx(-55) @ rz(-35) # iso++ap = argparse.ArgumentParser()+ap.add_argument("model"); ap.add_argument("out")+ap.add_argument("--view", default="iso"); ap.add_argument("--size", type=int, default=400)+ap.add_argument("--box"); ap.add_argument("--bg", default="36,40,46")+ap.add_argument("--turn", type=float, default=0.0, help="extra turn about Z before the view (deg)")+ap.add_argument("--alpha", action="store_true", help="transparent background (RGBA PNG)")+ap.add_argument("--glbtool", default=sys.argv[0].rsplit("/", 1)[0] + "/glbtool.py")+ARGS = ap.parse_args()+parts = load(ARGS.model)+R = view_matrix(ARGS.view)+if ARGS.turn:+ _a = math.radians(ARGS.turn)+ R = R @ np.array([[math.cos(_a), -math.sin(_a), 0], [math.sin(_a), math.cos(_a), 0], [0, 0, 1]])+allP = np.vstack([p["P"] for p in parts]) * 1000.0+if ARGS.box:+ b = [float(v) for v in ARGS.box.split(",")]+ corners = np.array([[x, y, z] for x in b[0:2] for y in b[2:4] for z in b[4:6]])+else:+ corners = allP+Q = corners @ R.T+lo, hi = Q.min(0), Q.max(0); ctr = (lo + hi) / 2; ext = max(hi[0] - lo[0], hi[1] - lo[1]) * 1.08+SS = 3; N = ARGS.size * SS; s = N / ext+img = np.zeros((N, N, 3)); zb = np.full((N, N), -1e9)+L1 = np.array([0.35, 0.45, 0.82]); L1 /= np.linalg.norm(L1) # key, in view space+L2 = np.array([-0.6, -0.2, 0.5]); L2 /= np.linalg.norm(L2) # fill+V = np.array([0, 0, 1.0])+for p in parts:+ X = (p["P"] * 1000.0) @ R.T+ sx = (X[:, 0] - ctr[0]) * s + N / 2; sy = N / 2 - (X[:, 1] - ctr[1]) * s; z = X[:, 2]+ col = np.array(p["col"][:3]); metal, rough = p.get("metal", 0.0), max(p.get("rough", 0.6), 0.08)+ shin = 2.0 / (rough ** 4) - 2.0+ for t in p["I"]:+ a, b2, c = t+ v0, v1, v2 = X[a], X[b2], X[c]+ nrm = np.cross(v1 - v0, v2 - v0); ln = np.linalg.norm(nrm)+ if ln == 0: continue+ nrm /= ln+ if nrm[2] < 0: nrm = -nrm+ diff = 0.18 + 0.62 * max(0, nrm @ L1) + 0.2 * max(0, nrm @ L2)+ H = (L1 + V); H /= np.linalg.norm(H)+ spec = max(0, nrm @ H) ** min(shin, 400) * (0.9 if metal > 0.5 else 0.25) * (1 - rough * 0.6)+ base = col * (0.55 + 0.45 * (1 - metal)) if metal > 0.5 else col+ shade = np.clip(base * diff + spec * (col if metal > 0.5 else np.ones(3)), 0, 1)+ shade = shade ** (1 / 2.2)+ xs = np.array([sx[a], sx[b2], sx[c]]); ys = np.array([sy[a], sy[b2], sy[c]]); zs = np.array([z[a], z[b2], z[c]])+ x0, x1 = int(max(0, np.floor(xs.min()))), int(min(N - 1, np.ceil(xs.max())))+ y0, y1 = int(max(0, np.floor(ys.min()))), int(min(N - 1, np.ceil(ys.max())))+ if x0 > x1 or y0 > y1: continue+ gx, gy = np.meshgrid(np.arange(x0, x1 + 1) + 0.5, np.arange(y0, y1 + 1) + 0.5)+ d = (ys[1] - ys[2]) * (xs[0] - xs[2]) + (xs[2] - xs[1]) * (ys[0] - ys[2])+ if abs(d) < 1e-12: continue+ w0 = ((ys[1] - ys[2]) * (gx - xs[2]) + (xs[2] - xs[1]) * (gy - ys[2])) / d+ w1 = ((ys[2] - ys[0]) * (gx - xs[2]) + (xs[0] - xs[2]) * (gy - ys[2])) / d+ w2 = 1 - w0 - w1+ m = (w0 >= -1e-6) & (w1 >= -1e-6) & (w2 >= -1e-6)+ if not m.any(): continue+ zz = w0 * zs[0] + w1 * zs[1] + w2 * zs[2]+ sub = zb[y0:y1 + 1, x0:x1 + 1]+ upd = m & (zz > sub)+ sub[upd] = zz[upd]+ img[y0:y1 + 1, x0:x1 + 1][upd] = shade+bg = np.array([int(v) for v in ARGS.bg.split(",")]) / 255.0+img[zb < -1e8] = bg+if ARGS.alpha:+ a = (zb > -1e8).astype(np.float64)[..., None]+ rgba = np.concatenate([img * a, a], 2) # premultiplied so the LANCZOS edge stays clean+ out = np.asarray(Image.fromarray((rgba * 255).astype(np.uint8), "RGBA").resize((ARGS.size, ARGS.size), Image.LANCZOS)).astype(np.float64)+ al = out[..., 3:] / 255.0+ out[..., :3] = np.where(al > 0, out[..., :3] / np.maximum(al, 1e-6), 0)+ Image.fromarray(np.clip(out, 0, 255).astype(np.uint8), "RGBA").save(ARGS.out)+else:+ Image.fromarray((img * 255).astype(np.uint8)).resize((ARGS.size, ARGS.size), Image.LANCZOS).save(ARGS.out)+print("wrote", ARGS.out)
verification.jsonadded+216@@ -0,0 +1,216 @@+{+ "schema": "adom/verification@1",+ "part": "MLX90614ESF-BCI-000-TU",+ "variants": [+ {+ "mpn": "MLX90614ESF-BCI-000-TU",+ "note": "This page: 3 V, standard accuracy, gradient compensated, 5 deg FOV, tube",+ "stocked": false+ },+ {+ "mpn": "MLX90614ESF-BCI-000-SP",+ "note": "Same device and can, other packing (SP); symbol, footprint and 3D fit",+ "stocked": false+ },+ {+ "mpn": "MLX90614ESF-DCI-000-TU",+ "note": "3 V medical accuracy, 5 deg; same xCI can: symbol, footprint and 3D fit",+ "stocked": false+ },+ {+ "mpn": "MLX90614ESF-DCI-000-SP",+ "note": "3 V medical accuracy, 5 deg, SP packing; symbol, footprint and 3D fit",+ "stocked": false+ },+ {+ "mpn": "Other MLX90614 TO-39 options (AAA, BAA, BCC, BCF, BCH, BCK, ...)",+ "note": "Same pinout and land pattern: symbol and footprint fit; the 3D model does not (other cap)",+ "stocked": false+ }+ ],+ "entries": [+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI)",+ "handle": ""+ },+ "status": "verified",+ "title": "Pinout and pin 1 match the datasheet",+ "scope": [+ "symbol",+ "footprint",+ "3d"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "Symbol pins 1 SCL, 2 SDA/PWM, 3 VDD, 4 VSS match Table 2 (p.6)",+ "result": "pass"+ },+ {+ "text": "Footprint top view is the datasheet bottom view mirrored: 1 left, 2 bottom, 3 right, 4 top, tab between 1 and 4 (p.6 Figure 1)",+ "result": "pass"+ },+ {+ "text": "Model leads sit on footprint pad centres, max offset 0.000 mm",+ "result": "pass"+ },+ {+ "text": "Model tab between pin 1 and pin 4, as Figure 1",+ "result": "pass"+ }+ ],+ "evidence": [+ {+ "label": "bottom view vs Figure 1",+ "href": "docs/proof/mlx90614esf-bci-000-tu-pin1-bottom-view.png"+ },+ {+ "label": "pad and lead check",+ "href": "docs/proof/mlx90614esf-bci-000-tu-pin1-check.json"+ },+ {+ "label": "datasheet p.6",+ "href": "docs/figures/mlx90614esf-bci-000-tu-ds-p6.png"+ }+ ],+ "files": {+ "mlx90614esf-bci-000-tu.kicad_sym": "10853a602f335712bdf7151351a840bbbbccde3b168aaa52931eb27feab441d9",+ "mlx90614esf-bci-000-tu.kicad_mod": "31a5f115a7026865451a389c3773c407332eec475aefcde2a1569aaa98736810",+ "mlx90614esf-bci-000-tu-etched.step": "6bfd4fbdf7717c84eb433fa32b41f1895b415b19a84cf273da06e1c9d5d2669c"+ }+ },+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI)",+ "handle": ""+ },+ "status": "verified",+ "title": "3D model matches the MLX90614xCI drawing, including the 20.2 mm collimator cap",+ "scope": [+ "3d"+ ],+ "variants": [+ "MLX90614ESF-BCI-000-TU",+ "MLX90614ESF-BCI-000-SP",+ "MLX90614ESF-DCI-000-TU",+ "MLX90614ESF-DCI-000-SP"+ ],+ "checks": [+ {+ "text": "Overall 20.20 (top to header bottom), 19.50 (top to header top), cap 9.00, header 9.15, 0.50x45 chamfer, 1.50 groove 1.58 below the top: modelled as printed (p.49 Figure 45)",+ "result": "pass"+ },+ {+ "text": "Side and bottom views overlaid on Figure 45 at 44.5 px/mm: outline coincides",+ "result": "pass"+ },+ {+ "text": "KiCad has no TO-39-4.step; its TO-39-3 can is 6.5 mm tall, so the model was built from the drawing",+ "result": "note"+ },+ {+ "text": "bore depth (2.00) and the laser-mark position are not in the datasheet",+ "result": "note"+ }+ ],+ "evidence": [+ {+ "label": "overlay on p.49",+ "href": "docs/proof/mlx90614esf-bci-000-tu-overlay-p49.png"+ },+ {+ "label": "datasheet p.49",+ "href": "docs/figures/mlx90614esf-bci-000-tu-ds-p49.png"+ },+ {+ "label": "dimension record",+ "href": "provenance/3d-model.json"+ }+ ],+ "files": {+ "mlx90614esf-bci-000-tu.step": "efcf25aab0e24ac15f6767d644fc4de84f1cfbcbf6b3fce04807cc7593fa5951",+ "mlx90614esf-bci-000-tu-etched.step": "6bfd4fbdf7717c84eb433fa32b41f1895b415b19a84cf273da06e1c9d5d2669c",+ "mlx90614esf-bci-000-tu-etched.glb": "3aacd3ec6e8221cde862b0627717265de0b59085140690ee5fcb3f63dba024ce"+ }+ },+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI)",+ "handle": ""+ },+ "status": "verified",+ "title": "Footprint checked against the datasheet lead circle",+ "scope": [+ "footprint"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "Leads 0.45 on a 5.08 circle (p.49): KiCad TO-39-4 pads on a 5.08 circle, 0.70 drills",+ "result": "pass"+ },+ {+ "text": "Courtyard radius 4.95 clears the 9.15 header",+ "result": "pass"+ },+ {+ "text": "the datasheet gives no land pattern; KiCad's TO-39-4 pattern is used unchanged",+ "result": "note"+ }+ ],+ "evidence": [+ {+ "label": "footprint record",+ "href": "provenance/footprint.json"+ }+ ],+ "files": {+ "mlx90614esf-bci-000-tu.kicad_mod": "31a5f115a7026865451a389c3773c407332eec475aefcde2a1569aaa98736810"+ }+ },+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI)",+ "handle": ""+ },+ "status": "open",+ "title": "Not yet checked",+ "scope": [+ "3d",+ "library"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "native KiCad, Fusion and Altium imports of these files",+ "result": "note"+ },+ {+ "text": "the published page's 3D, symbol and footprint viewers (not opened in a browser for this build)",+ "result": "note"+ },+ {+ "text": "where Melexis lasers the marking on the xCI can (the datasheet gives text only); a product photo would settle it",+ "result": "note"+ },+ {+ "text": "Melexis STEP (melexis.com refused a scripted request)",+ "result": "note"+ }+ ],+ "evidence": [],+ "files": {}+ }+ ]+}
viewers/footprint.htmladded+210@@ -0,0 +1,210 @@+<!doctype html><html><head><meta charset="utf-8">+<title>mlx90614esf-bci-000-tu - adom-footprint</title>+<meta name="viewport" content="width=device-width,initial-scale=1">+<style>+/* ── adom-footprint shared viewer core (CSS) ───────────────────────────────+ Included VERBATIM by both the live app (app.html) and the static embed+ (embed.html) so the canvas, zoom toolbar and layer-panel rows look identical+ and cannot drift. Self-contained literal colours (no dependency on either+ file's CSS vars). Class prefix: av- */++.av-vp{position:absolute;inset:0;overflow:hidden;cursor:grab;background:radial-gradient(circle at 50% 42%,#121a26 0%,#0d1117 72%)}+.av-vp.grab{cursor:grabbing}+/* DIRECT child only, the zoom-toolbar button icons (.av-tools svg) also live+ inside .av-vp; without '>' they'd inherit position:absolute and stack at 0,0. */+.av-vp > svg{position:absolute;left:0;top:0;width:100%;height:100%;transform-origin:0 0;display:block}++/* zoom toolbar */+/* Grouped translucent toolbar (matches adom-symbol's .tools): one container, borderless+ buttons that highlight on hover, instead of individually-boxed buttons. */+.av-tools{position:absolute;left:10px;top:10px;display:flex;gap:3px;padding:3px;z-index:5;background:rgba(22,27,34,.82);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid #222b38;border-radius:9px}+.av-tools button{width:30px;height:30px;border-radius:6px;border:none;background:transparent;color:#cfd8e2;cursor:pointer;display:grid;place-items:center;transition:background .15s ease,color .15s ease}+.av-tools button svg{width:16px;height:16px;display:block}+.av-tools button:hover{background:#222b38;color:#37c8a6}+.av-tools button:focus,.av-tools button:focus-visible{outline:none}+.av-panhint{position:absolute;right:10px;bottom:9px;color:#8b949e;font-size:11px;z-index:5;pointer-events:none;user-select:none;-webkit-user-select:none}++/* layer panel rows */+.av-lrow{display:flex;align-items:center;gap:9px;padding:8px 9px;border-radius:8px;cursor:pointer}+.av-lrow:hover{background:#161c27}+.av-lrow .sw{width:13px;height:13px;border-radius:3px;border:1px solid rgba(255,255,255,.15);flex:0 0 13px}+.av-lrow .sw.ring{background:transparent!important}+.av-lrow .ln{flex:1;font-size:13px}+.av-lrow .meta{font-size:10px;color:#8b949e}+.av-lrow .chk{width:16px;height:16px;border-radius:4px;border:1.5px solid #3a4757;display:grid;place-items:center;color:#0b0f17;font-size:11px}+.av-lrow.on .chk{background:#37c8a6;border-color:#37c8a6}+.av-lrow.off .ln,.av-lrow.off .sw{opacity:.4}+.av-lrow.special{background:linear-gradient(100deg,rgba(55,200,166,.10),transparent);border:1px solid rgba(55,200,166,.25);margin-top:4px}+.av-lrow.special .ln{color:#7ef0d2;font-weight:600}++:root{--bg:#0d1117;--panel:#11161f;--border:#222b38;--text:#e6edf3;--muted:#8b949e;--accent:#37c8a6}+*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%}+body{background:var(--bg);color:var(--text);font-family:'Satoshi','Segoe UI',system-ui,sans-serif;display:flex;flex-direction:column;overflow:hidden}+header{display:flex;align-items:center;gap:9px;padding:9px 14px;border-bottom:1px solid var(--border);flex:0 0 auto}+header .dot{width:9px;height:9px;border-radius:50%;background:var(--accent);box-shadow:0 0 10px var(--accent)}+header .b{font-weight:700;font-size:14px}header .b span{color:var(--muted);font-weight:400}+header .nm{margin-left:auto;font-weight:600;font-size:13px;color:#cfd8e2}+main{flex:1;display:flex;min-height:0}+.vpwrap{flex:1;position:relative;min-width:0}+aside{flex:0 0 248px;border-left:1px solid var(--border);background:var(--panel);display:flex;flex-direction:column;min-height:0}+aside .ah{padding:9px 12px;border-bottom:1px solid var(--border);font-size:12px;color:var(--muted)}+.layers{padding:6px}+.note{font-size:11px;color:var(--muted);line-height:1.45;padding:8px 11px}+.note b{color:#7ef0d2}+</style></head>+<body>+ <header><span class="dot"></span><span class="b">adom-footprint <span>· interactive</span></span><span class="nm">mlx90614esf-bci-000-tu</span></header>+ <main>+ <div class="vpwrap">+ <div class="av-vp" id="vp">+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-1.800 -4.140 8.480 8.280" preserveAspectRatio="xMidYMid meet"><g class="adom-layer-courtyard"></g><g class="adom-layer-fab"></g><g class="adom-layer-copper"><g data-pad="1" data-shape="oval" data-size="1.600x1.200" data-mount="thru_hole"><rect x="-0.800" y="-0.600" width="1.600" height="1.200" rx="0.600" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="2" data-shape="circle" data-size="1.200x1.200" data-mount="thru_hole"><circle cx="2.540" cy="2.540" r="0.600" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="3" data-shape="circle" data-size="1.200x1.200" data-mount="thru_hole"><circle cx="5.080" cy="0.000" r="0.600" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g><g data-pad="4" data-shape="circle" data-size="1.200x1.200" data-mount="thru_hole"><circle cx="2.540" cy="-2.540" r="0.600" fill="#C83434" stroke="#ef5350" stroke-width="0.04"/></g></g><g class="adom-layer-heatsink"></g><g class="adom-layer-drill"><circle cx="0.000" cy="0.000" r="0.350" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="2.540" cy="2.540" r="0.350" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="5.080" cy="0.000" r="0.350" fill="#0d1117" stroke="#666" stroke-width="0.05"/><circle cx="2.540" cy="-2.540" r="0.350" fill="#0d1117" stroke="#666" stroke-width="0.05"/></g><g class="adom-layer-silk"></g><g class="adom-layer-padnum"><text x="0.000" y="0.000" text-anchor="middle" dominant-baseline="central" font-size="0.504" fill="#fff" font-family="sans-serif" style="pointer-events:none">1</text><text x="2.540" y="2.540" text-anchor="middle" dominant-baseline="central" font-size="0.504" fill="#fff" font-family="sans-serif" style="pointer-events:none">2</text><text x="5.080" y="0.000" text-anchor="middle" dominant-baseline="central" font-size="0.504" fill="#fff" font-family="sans-serif" style="pointer-events:none">3</text><text x="2.540" y="-2.540" text-anchor="middle" dominant-baseline="central" font-size="0.504" fill="#fff" font-family="sans-serif" style="pointer-events:none">4</text></g><g class="adom-layer-paste-apertures"></g><g class="adom-layer-paste-dots"></g></svg>+ </div>+ </div>+ <aside>+ <div class="ah">Layers</div>+ <div class="layers" id="layers"></div>+ <div class="note">The <b>solder paste jet</b> layer shows the 300µm paste-dispensing dots that travel with the footprint. Off by default, toggle it on.</div>+ </aside>+ </main>+<script>/* ── adom-footprint shared viewer core (window.AV) ─────────────────────────+ Single source of truth for the layer list, toggle behaviour, defaults,+ pan/zoom and toolbar icons. Included VERBATIM by both app.html (live) and+ embed.html (static) so the two viewers cannot drift. Pure client-side; works+ on any SVG that carries the <g class="adom-layer-*"> groups. */+(function(){+ var ICON_ZIN='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10.5" cy="10.5" r="6.5"/><path d="M20 20l-4.5-4.5M10.5 8v5M8 10.5h5"/></svg>';+ var ICON_ZOUT='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10.5" cy="10.5" r="6.5"/><path d="M20 20l-4.5-4.5M8 10.5h5"/></svg>';+ // Zoom-to-FIT = a magnifier with a small square inside (fit content to view).+ // Deliberately NOT the four-corner expand/"fullscreen" glyph.+ var ICON_FIT='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10.5" cy="10.5" r="6.5"/><path d="M20 20l-4.5-4.5"/><rect x="7.6" y="7.6" width="5.8" height="5.8" rx="1.2"/></svg>';++ // The canonical layer list. Every layer is a <g class="adom-layer-*"> in the+ // self-rendered SVG, so toggling is group-based (robust), never colour-match.+ // `kind:'group'` on every entry: all layers are toggled by their <g> group+ // (robust), never by colour-match. (app.html still reads def.kind.)+ var LAYER_DEFS=[+ {key:'copper', name:'Copper', kind:'group', sel:'.adom-layer-copper', sw:'#C83434'},+ // Auto-generated thermal-via array under the exposed pad, only present (and+ // listed) when the footprint has an exposed thermal pad.+ {key:'heatsink', name:'Heatsink vias', kind:'group', sel:'.adom-layer-heatsink', sw:'#e8a13a'},+ {key:'padnum', name:'Pad numbers', kind:'group', sel:'.adom-layer-padnum', sw:'#ffffff', ring:true},+ {key:'silk', name:'Silkscreen', kind:'group', sel:'.adom-layer-silk', sw:'#00cccc'},+ {key:'fab', name:'Fab (F.Fab)', kind:'group', sel:'.adom-layer-fab', sw:'#6e7681', ring:true},+ {key:'courtyard', name:'Courtyard', kind:'group', sel:'.adom-layer-courtyard', sw:'#FF26E2', ring:true},+ {key:'drill', name:'Drill', kind:'group', sel:'.adom-layer-drill', sw:'#888888', ring:true},+ {key:'paste-ap', name:'Paste apertures', kind:'group', sel:'.adom-layer-paste-apertures', sw:'#8aa0b8', ring:true},+ // Generic name, the 300µm solder-paste dispensing dots. Off by default.+ {key:'paste-dots',name:'Solder paste jet', kind:'group', sel:'.adom-layer-paste-dots', sw:'#37c8a6', special:true},+ ];++ // True only if the group actually holds drawn geometry (not an empty <g>), so+ // layers with nothing in THIS footprint aren't listed as dead, dim rows.+ function groupHasGeo(svg,def){+ if(!svg) return false; var n=0,g=svg.querySelectorAll(def.sel);+ for(var i=0;i<g.length;i++){ n+=g[i].querySelectorAll('path,rect,circle,line,polygon,polyline,text').length; }+ return n>0;+ }+ function layerPresent(svg,def){ return groupHasGeo(svg,def); }+ function applyLayer(svg,def,on){+ if(!svg) return; var g=svg.querySelectorAll(def.sel);+ for(var i=0;i<g.length;i++) g[i].style.display=on?'':'none';+ }++ // Build layer rows into a container. opts:+ // svg, container, state {key:bool}, meta {pasteDots,pasteApertures},+ // onToggle(key,on). Missing state key -> special OFF, others ON. Skips empty+ // non-special groups. Returns the keys actually shown.+ function buildLayers(opts){+ var svg=opts.svg, box=opts.container, state=opts.state||{}, meta=opts.meta||{}, shown=[];+ box.innerHTML='';+ LAYER_DEFS.forEach(function(def){+ if(!def.special && !groupHasGeo(svg,def)) return;+ var on = def.special ? (state[def.key]===true) : (state[def.key]!==false);+ var m = def.key==='paste-dots' ? ((meta.pasteDots||0)+' @ 300µm')+ : def.key==='paste-ap' ? ((meta.pasteApertures||0)+' openings') : '';+ var row=document.createElement('div');+ row.className='av-lrow '+(on?'on':'off')+(def.special?' special':'');+ row.innerHTML='<span class="sw'+(def.ring?' ring':'')+'" style="'+(def.ring?('border-color:'+def.sw):('background:'+def.sw))+'"></span>'+ +'<span class="ln">'+def.name+'</span>'+(m?'<span class="meta">'+m+'</span>':'')+ +'<span class="chk">'+(on?'✓':'')+'</span>';+ row.onclick=function(){+ var nv=!row.classList.contains('on');+ row.classList.toggle('on',nv); row.classList.toggle('off',!nv);+ row.querySelector('.chk').textContent=nv?'✓':'';+ state[def.key]=nv; applyLayer(svg,def,nv);+ if(opts.onToggle) opts.onToggle(def.key,nv);+ };+ box.appendChild(row); applyLayer(svg,def,on); shown.push(def.key);+ });+ return shown;+ }++ // Wire pan + zoom on a viewport element (the box that contains the <svg>).+ // Returns a controller {fit, zoomIn, zoomOut, apply}.+ function initViewport(vp){+ var svg=vp.querySelector('svg');+ if(svg){ svg.removeAttribute('width'); svg.removeAttribute('height'); }+ var s=1,tx=0,ty=0;+ function apply(){ var el=vp.querySelector('svg'); if(el) el.style.transform='translate('+tx+'px,'+ty+'px) scale('+s+')'; }+ function zoomAt(cx,cy,f){ tx=cx-(cx-tx)*f; ty=cy-(cy-ty)*f; s*=f; apply(); }+ function fit(){ s=1;tx=0;ty=0;apply(); }+ // Smooth, delta-PROPORTIONAL zoom (matches adom-symbol). A fixed per-event+ // factor makes the trackpad leap, one gentle two-finger nudge fires a burst+ // of tiny wheel events and a fixed 1.12× compounds. Instead derive the factor+ // from how much actually scrolled (exp → smooth + reversible), normalise+ // device units, and clamp one event so a chunky mouse notch can't jump.+ var ZOOM_K=0.0022; // sensitivity: lower = gentler+ vp.addEventListener('wheel',function(e){+ e.preventDefault();+ var d=e.deltaY;+ if(e.deltaMode===1) d*=16; else if(e.deltaMode===2) d*=vp.clientHeight;+ d=Math.max(-50,Math.min(50,d));+ var r=vp.getBoundingClientRect();+ zoomAt(e.clientX-r.left,e.clientY-r.top,Math.exp(-d*ZOOM_K));+ },{passive:false});+ var drag=false,lx=0,ly=0;+ vp.addEventListener('pointerdown',function(e){ if(e.target.closest('.av-tools'))return; drag=true;lx=e.clientX;ly=e.clientY;vp.classList.add('grab');vp.setPointerCapture(e.pointerId); });+ vp.addEventListener('pointermove',function(e){ if(!drag)return; tx+=e.clientX-lx;ty+=e.clientY-ly;lx=e.clientX;ly=e.clientY;apply(); });+ vp.addEventListener('pointerup',function(){ drag=false;vp.classList.remove('grab'); });+ fit();+ return {+ fit:fit,+ zoomIn:function(){ var r=vp.getBoundingClientRect(); zoomAt(r.width/2,r.height/2,1.2); },+ zoomOut:function(){ var r=vp.getBoundingClientRect(); zoomAt(r.width/2,r.height/2,1/1.2); },+ apply:apply+ };+ }++ // Inject the standard zoom toolbar (+ / − / fit) + pan hint into a viewport,+ // wired to a controller from initViewport. Idempotent.+ function addToolbar(vp,ctl){+ if(vp.querySelector('.av-tools')) return;+ var t=document.createElement('div'); t.className='av-tools';+ t.innerHTML='<button data-z="in" title="Zoom in">'+ICON_ZIN+'</button>'+ +'<button data-z="out" title="Zoom out">'+ICON_ZOUT+'</button>'+ +'<button data-z="fit" title="Zoom to fit">'+ICON_FIT+'</button>';+ vp.appendChild(t);+ t.querySelector('[data-z="in"]').onclick=ctl.zoomIn;+ t.querySelector('[data-z="out"]').onclick=ctl.zoomOut;+ t.querySelector('[data-z="fit"]').onclick=ctl.fit;+ var h=document.createElement('div'); h.className='av-panhint'; h.textContent='drag to pan · scroll to zoom'; vp.appendChild(h);+ }++ window.AV={+ LAYER_DEFS:LAYER_DEFS, groupHasGeo:groupHasGeo, layerPresent:layerPresent,+ applyLayer:applyLayer, buildLayers:buildLayers, initViewport:initViewport,+ addToolbar:addToolbar, ICON_FIT:ICON_FIT, ICON_ZIN:ICON_ZIN, ICON_ZOUT:ICON_ZOUT+ };+})();+</script>+<script>+var META={"pasteApertures":0,"pasteDots":0};+(function(){+ var vp=document.getElementById('vp');+ var svg=vp.querySelector('svg');+ var ctl=AV.initViewport(vp);+ AV.addToolbar(vp,ctl);+ AV.buildLayers({ svg:svg, container:document.getElementById('layers'), state:{}, meta:META });+})();+</script>+</body></html>
viewers/symbol.htmladded+3724@@ -0,0 +1,3724 @@+<!doctype html><html><head><meta charset="utf-8">+<title>MLX90614ESF-BCI-000-TU - adom-symbol</title>+<meta name="viewport" content="width=device-width,initial-scale=1">+<style>+@font-face{font-family:'Satoshi';font-weight:400;font-display:swap;src:url(data:font/woff2;base64,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) format('woff2')}@font-face{font-family:'Satoshi';font-weight:500;font-display:swap;src:url(data:font/woff2;base64,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) format('woff2')}@font-face{font-family:'Familjen Grotesk';font-weight:700;font-display:swap;src:url(data:font/woff2;base64,d09GMgABAAAAACrYABAAAAAAZ3wAACp1AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoEQG6omHId+BmA/U1RBVEQAhRYRCAr2KN5rC4QsAAE2AiQDiFQEIAWFEAeJNQwHG3pYE+4wbBwQgO12lyhK2Sj3KKQVlFOQ7L9e4HCIYMwLuAsLtC3GSm1KVU3btDK9WTZtb3qi3yc8uzbugS1YSA6cI04c+R1/jxORO2dg28if5OTl+fr9Is/t/juzCGH2AEQqjlwcgpDsUpFRgI7e8bStn/c2WHaXKG1cV48DRMRCBS8I4594adSFUSeih3Bd9bM8f0UwRHPWXAtbg1SwxQJEnAQJCRKBJJBkkyAJEDEShxQKKSoBarRo2ucoVbtCjaqd9UzhvL1rv/Xznv/fml/3VQdm3k0NONIk3B7PDgs6v4ZZ7XLHduxnHkCyAf7p/2Lvzl/ZE1bOAWguaZMAsP9mnteBVnVEk4GNI1Auh8t/u5s8hwOTRiaByhbn9DP+zt3u2gNDgUactv7z+6m2r2dvQOkdgpxbhCugG5CS6b8/e0tuMuDsD4ha/pzCQBEJNyGZFaA0M2pOz5r9n02z3W9b76Rj+QKHoISP+gDV4RqwptH81WlmZzeWV3JiWQbJVt5JRh3LCmllVgCgyrsqCNKhDyMFmEuGKi0VVYqiQy7qKoGn9kvzFtAcmGt1qEWDBLf+1W97yzXudWTvtkGCBJFBBnmEQWQosn/9qi++0/bkAmlALnmtA+S6mQIDuvvK0sNFunxBBwVNuX2HwAwArAYIAlh5/18ioKggUghHA9HRQwQmSLociJ0dks8N8SqGlPJBRqqG1KqDNGiBdJoM8ZsC6dMHCZsOmWkODAGLpcqBDznMVwHyay4MBUCOBIyfALn60mAAGKCAwP0aenh3Bi4GSNBbzDoryAGMiGJHYZdxcum3nP6PxiQ6lfXBDu+NPhXZH2wTxHC6YGZOxsb8Ik4Uhv+cYvbaYqLnUS2GwhzQBIzYpujkmgyW0ZJKJBXx3TQsLOJlyJUgj0MKz4sGq91jNEGL4cg27Ww6oSyh5GxXncZ0k1gePCvPqwbke8e7hvr4NP1wn/qcK+pj8sJiku8jcHgujg42wAqnHDFyiZWXzMlXgOJIlvLyQcqTJSZohXQQEszyfF5AJmwa2gxzSBZEeh0kSJAgFYn4ppiCBkELySUST08SJiJkpNhnk4PkBgWUmrZwAUEGBAQGKizBEkU5r+EYggIFCpSi/jQDr7oACy87KgCseGj5cBkGFbJkoZaOlcBp1WglixQSDbvmyG4o7xDB/pZTmiELN6VhRZoODx8SvpIYEgPAYtLZdqtFGZiaI/8t1zNdTLBNjeK4eEhYPoI1nyyNWL7oQForygRgfyDupjLz079jhvnhC12xe5NBLCsv94xdAPWwiC0nAQJ3vQ5lMCRRC5aRCt6+llOEKxmJ6Mzhjr1W9zsKy8lxJtN2hg6E4O0J94KC3OwaxNy7usiKg9ytaiGSsQTdTrhg08Ve5fxnw2TA34YoorWrOlo2Mgm5RSvtKHbnSsUFm1MqHtgXUMAm7F8JvZFdXnC75s0flzHepWkGN3WEbE2yc+NqYMLTsA24FKx3pl4FiHYni7P3nK3Y9clFYyp6LkHZiu4NMbwq2+phPCbK1YAEFTivuWkpphG8zw6NZreYcGdcJHMfvBg5wFX2aVhGjaIrZAZjcGQtM4uiEyB7E3m7Fb4k3HKPlcRIJkbxsYlZwJ1qtoU09vwCmah0Je6i5+8KFhtsI2QgbjgxMmFdTFeLxmQUN8xvTAWg8gxZzY1cotThF5VYCA+soMO32RlN9zlmOulconl5WZQaJd0YY+Sapnb1xsvT+no3hw5dnLrNMMwqI+SuUihxD9J5cGy9pzyroeXGJLSho9DpK8jv20d1Ry2kACy31Z2WxUJkz0KiJEPM0iDpEGIlVkaxouGdGs3OnslDYtpeME21nFwI5RBvJMmMEUkuBYk2SK+TJCaTnD9ZrdsUlCCl6CONUHKqsGmkpouujS/wVkGxVhPGGkqwlqKtoyjrKd4GirORIm2SmEa76XLXzQh3E1rulrwBD0tAC9eAQwUaNOhjaV/4EmrDFS1Dsf1+PQ6PpaCBaWkl0dGRSZQojp6enIkJZmYmQIUCSuhAIBlRlYuCpKJiHR8SMBKmqo0yysIstHiQCIkinQ5G5ErjdOFgg0Y6YspbFT98hgQQQQMVeOBAARlYEBCBaImwWA4Kql5Ff+xguSJWWHuAikZIKRVIIKSGPm2ledaMsGE4BCxOgh8/kOrf7/oK5sCzigS4enBOxUS7D1aOWXh0Tt2YjmNH+cZ+e1JBefaUiTEjTxlbJjkfVEv1GAQSNcNK1r3cWz22etLqMdWTVKTVRl0L15tIcKosD1Ze3OgPwcOLbd29cPt558uXVPV0w9n/CPYCOHxNeXsj7L1mVbMfti+wEauxFPObzLwu3B2E0A2hOQRumhoMQMctgzSlE5WFDkpIQYEEAQwaSKlzjZhdxVoBYg04VSMqL8xd6XC27pmb3jRMr9aCEA1/mrNbqVJWUmFq3FYcjfUh7CvfePchxePm0LbosQj4gz3ZgQPWjkkk5kWOn14wpBo40zzVEOSWAAyd2N8FioFMjJl4cwp1Zk802oyp5WYhnDoz7dTRENSJ0z56/G6euC8dAXyXrrbYyQw12MxhsEsibz3KimjabKvlVwlajeW0175zgHQ8nVb5arxJj59ASzvppo894XxrmY2KQqPlO8hrkHvm+a2IXj4JmMqto+aEYE5upaDy0fCYzuAAMdRiNk4KT+D10slaVrcFgl6KXwHOep993pQSVv3EDwA7Alfr9LBjfSNgv+Bt3uR7/z8DiNczciH0MkCd0TyArRCQiHxgrZG229ftl3eEEAb4IzE34vAIMmgYDg+g5b4smeHbAApoQQn0tpK18Nm3HwFJTyZDgbkiZVAmVd2up+rtencrE3/HP+JfQpygF0TBIGQLDsErhITTyWLyhuRNolrURSJgGYGNw/7Y9VKOeAoxQsJmZQkFX7MWACcARlkhkL0Or/Nep75OmTs2d2ju4NxJAACYm5wbnZue2z7nnmPPZc9eoewP/LOeb2fffxsQsA9whg8BeVW/HfNM1ru1bzvnKw9941/fetfzXvDAj0676aprSvI/0VdeeOmCbyAsjoyClk6UaAkS6SURiMws0lllsMlllyefw8ue8Iq/3Q0LTh5exUqVG2mU0arVqlOvwQRtOnSazK9bUJ+QsOle9IWX/GXaeQ9852vf+9KHkcJH5nrDn275OAr41B8OOBgO/jHrXpQd1+FNZx1xzEUQjMSgSEjxNJRU1OLFiBVHLplBilRGg/yMKEemLNkKpOkyTKEhXIYazq2Iz2NGKFNlrHEqlBivyUSTtGj0C5spAnr0mqrdNCatHhnwqtf1ew2CRsRmQNYF1C6Bf4AVGwdrLwRYsDboVwAUPEyVKsLaaz2Jm1wTu3KQ06NkDl5PBgEH47cxnRw2KcrpMQnalqbMzXDdrFMCIhpoHDk6Z7yG70jaxPhgjt5J2J6hxpmrI0/snHwNuTWZQdwbIzTiWEDCA4lDrxLWwd6Y5MhQrnNoIguMDRCPXCHZl0R2qpQyCVKOZ1N4UqaglfwpZaxcpuI4qUyq5KloI2xj1Kz6GtLxWbxkZHFdahMfLYkWeR3JKbhBS/IzVCYbzNP0KqxMt2l0Vn+0WsNfmaJPwSal8IwhWcYnZPvE2LWUPDQ5nufjCMNoXsXzpOexrxBvTCDpB/UoU63WbGYYlUoqpYfx6SyvcMiUyjilY9I6U17NNBkRR6YqSZu5LymSaoW/sv+tEcPwJB3HxrfJRahyLqZZ+eSNIakaaTGb+5RU1jfTTbbOc2iW/RN6QPfFaL3BvJpxZbHuRNgM1mWruig6P6E7nZsGtvvS6qmicUi1sezB+gvyrdhrrxYuOyi6l+LIzpMmdKagQ3sgZY0CGrA3zk2laSx7WTQ1zE5FhlnEnu6wzmEZwdEswWPx0xVy0xojVY6c3+nsDZgDV08cOw4d0KlCZr0E2XgetDWWYhsaB7Rikt0KvYkvjHrn6TiSVceERZJ6fceF+CbsLAXRu9cRljjT6+ghJl/TVZw4R6c38T1T2WNAy9KYUFhcYLVKsyp4pHxqMsEQZQQtXdBsj4K1gb4q6NBd0TxKYyr/gJ5THRnOrkGt2h6+ZLOEZB2/PceWKRRZrv+cdhpZVWUzJKhCGY3MuJwfcH8J9/Mg8cdQtcacGgd0HyUNCJsid82b3txmj8/aj10TOXOPj0RuKCevyjRpyGYcW2VGWHBNOoWVslAa8qVWlpzgRd3ndIwuvKjerAQ3GnnyJ7HTGdwm68sBxeNIKrN2zkfBGquVVoWS4ODchNTBUuJ7zteWJsWYuk3PWDM+vKY3jNWFlSBX1nOzcGiri37xYUBsTbVoPS71bDa460jtWi5T4bM5tTDslBsAoUow1WsX4ziGsfCKTv5bY7Udv4C6XgFX0CAYze7YGlZZ8YKycLTUCNY0QcF1c9OrTdil4sukmT8wRpQcT5zlmCi/pZW/fXuzyv3911+I3b80jhgzitLRg9FdV5g+8fFGx26ZYvSJgQarYUSgLaVSOE6E5XcOb1LT/nWDm0Bjpte2jKQ8fO1EA4vsmpChiMgvlVbvMfysRE3E0XJN5176SDj3vYerRiheTdjtxR0al98g97WfqECteqBY+jpUAEEuCBKAApNIKfWKEqGIOyA8bd9etWfBxoDmsmznYVYcAXi2JcZP6Ur2+0l1bwcsN9urNFoaYmdcRVpYJCirv7EUGtp3MvqpbkvUEmyJoMD1SGPB5Xv2na+rTMM3D5PHU1ghCLE4rqry8eulFNYo/f6wAufUTMXRDlY8gnwTYQ8VnNPupSpepYNT6XEAMU21nCTyUWREiVWFSSIscNSs/ti/VpNFw/Eq/HHyfm+HjZwffzyNWIWKZ0zLlURP1L3ISbqrwdRTRSqrli/1eFtoHIp6rUuyVL56FSdXbfVLGa2DIWvOpyscPNy/bxSw9hJTjZVGvKMlZTYP36fiaSKeFvfSXkqkHSBHfSzfapoKwoskfcH+V4hX8/PIPloU3tu9lLbuRjda8CzOF305MMVmJKl54k9bmCJyF1c7fUvj4OYoR94ECKab58FMwtfrmzx5QPIyO5SD+9VAqU6j+CnLy/9ycrVJG9lH6+CHLYEzWFZL4+vRrPxN/OHLWljTlLjCeO2LfyDO6c+9tvPlXZUP2suP6+SochwfeX6105WS2MSBYLV87GPYEJ5P0D49Dw/3wiQ6VBHvAOrKdnIpPtgxRhKfm87qw1WZtmPZGOJSNGjPuGMsr3PMrpVksF+E1G1r3OTWRZyOMi5qXHaj6+bUrJGnTeFLIcPDfwn/RCoJalGujaFA1WIhsNm7FS55/BvCBT3EKw+k1gUvbz2woFv4mofacEFQNVdE7DJLFZS4TPGczxRi5lt5tLRMvrwPRNV1zslj0f2VdQutEB0VfYmtJcheXZtNXIOY+xyKsh636xBDJBw8okQJQu9QSnZebSazZR2ns+3ekpmKTXGctWZK21R3nAcn8QjqnPfxq+WJgAP9+fBxTpyxSYSOXozeZMY+g6p2khYeMTnDU5mAZbwxkygGk1rFGsDR9BevVUzRE+ESpMRcormtQCkeX52n7uHLhffQdlP+Hm07c9KuOmDpOU0sNOngtnuK7irhhPuQWhiO1RLXqLViNWU0A2LRzJyEYjhFHyZN0cSbsTnUp53clvs6a1/yfXrwjgZRvMJQGUNcf8bSkvCml5nQ3dovmRE9rEJ3ZOZYQN545NAM/muz/3WE28TiiPoo7VHcWzAPJf083IbFFZrwYLUj3+59VByyjiQtHl6Sl5wSztsfknr7uiO9L85J8R0clSNyHhcvyEUcwuGo4JBy1L54TMqh68Vnx9IzYqjieuk5fAdIpol62Ufm657A5V+y5StKx4YAnFqjLZr7NIUs01FkdOHkcf2410mcmvMnol/DscxoOEHToj+oZdpzx3V1UZUtwUFRYrpGzjHXrDNVnMJk7dhl48TekYU2UGwn9uzlUBzd4EpacOkFPb55N/agWHiJdIZNZmBzWRcQYoezSVvzTxBaJg00fwVCbt3PvP9NQbekGyyEUNPQAtQ1CDp8fi18cS3uKqYNwrTZXhKpVwk97T5gAU1joOkBvrInxwfkQSnDXeW6TLa4E5Ytyy9Ruvpa3zzSsEUu5KRlyViiLfV9GQJ6iqW1D3SjDp795NKF058ddg3Ji/oh9b4FRVqDRK8f6ltvWqeWacxQ/r6ODKkG5UAeFH7v3DszM5rqXmWXXeGkp1bb7UpSocJejw31VR2Oao76ttb1wznPZzi+sHmhEawK9vjtBaeaW5XT2y31zrW5iubFhduXiEtkUotp0NdvHbIUqU0BhV831W9u0sHsMv7B0H6ynLx/KtHL9VtZBYHAMchLyAu3Krr3dxeFlSeIY2qL303jzFLPQsHmjG3Q7X8TxxBPX5Pn2E8a7Me910YKmuiOGugKL4zq3sgY87QfXrMlCPekP2IN2BTcuttaeLKltfBE6tvatsvqam1Z81052mEa7Os1bXI41NXbh33fvNepeXkqCQ9RC/Fri2NPlVcddyRPuWtW4eJSZdKboCiCbw/fexThzoY3jsIzU+//ur5TVaff1JfAAfvfe+xuznvx3ewjP7X8NMftju7kLuYqnIzUGpudWeOin69hnn9tu8ezpmPzdvbJfpGczuXIk0T9JXONbt8e2rly5ZrOqMnoXqGMwefrsSXsLck32Y+BEzcv+y9DQB4ks7emZ1pzEIVHFn5UD01NSnuR6wM5EmpGppSSPQAqUPrWJHkBzpQ4EULMKSBzcn6kkm3vVeOLrEx+qSgvz9yaXORuyGVVaCeid25LZiuwhMrZarzFksbTSCrHW0Hgml989b5f1oBNqAO7j+66c/B6mcRjNIk9Zdf33tm16yh4vmkagg5eaIHPteyEclZgYEEIBO029MOr+sOr+2F9/zhU6JhVgz9aYBn00+brLmh6QwC8JuAwdM31w2bo7C4mvIcJgOiPK9BJy/Tnu6+EfrD7tml6N/THNQHADArryn86APf4SgZFddqXB+BjPhC2pNhTmDqgMzLXexRKfmGSBM73a/z5cG5BamgNV1KhN0jKuWye1WbjWcFfmyxtFr22197bhErj5HIIv5XjNtrTjeUZRfl61mn4jCFNXuyVZA44sRvfKMhVZTCJo8Nhut7V5cIK5nN4zC3g1lA/opMjalLFGAaeWrLwBSpLms7OkYBtS4QFqblwvj9+52JYJSNnFlYomOuNutSB8sKOmsLvfzZXUm7QSyoAD7V+6MDQ/8Z3+Br624JWbq9oo2VyXRYLx5WZ2F6+PbhiTQdYvkRZflyvpwpFYRZCVsGLd8af/XqTomw9kuxenYbZUyEtTJcRvPD8VMmzwcSw7NsDAfBHhpPQkYcz77YQQ3NKv9gDy/IVMzX+4cOjHgHXZFLJy7hsXqHNxDUBEWrj6IFhq2B9p8zYt3HHVsyWAJmoNIvR7xvv4xpXZXze/Nd8YRaSzhbkAe/Pxd5iHBMnLSXKYqeqvg/FvJOAtnqtPwPxp8VOUqU5YlI+y+ZxJUIx/KUsiVfXvHONOq3PIyviIfQIWOKntvb3b9ZlCWwlJQJrFjtbbzBl6wASv3MZnJaXxLfb2la27bTyqIKUTL5OJAKIZqcGLLkFfRCnFRh2VorjFAMxH42jSft+Ogy9s/zHDOjC0T9tf4GWS+GFgsqdBnlC8XkIIBq/Dl4s5ebxlKwiOEaWJbSYM90vlyhMZKfrhaK1hZUh05nHIFlSx5FS1NjwwcFB1cY0FS7C5XZxnQKYM5AcAypCXv2eX9AVHusSUSivOJyC/vnNZGvgsOMcgbSiOjyBBnv3iDfs/kLRA6/e9WzDwR/Ytc5WhdFAOkrfWsDbaDTyNqS73Cg2MB6G/KNnSErdXFbZisok7Lr5sjxtJqNsx7rw4o5Kt9SSdnjFeUOayMPnulw7/E5+Ngfm0vkWL3qxcKSKzZcD6a3Gogjb0bANegNzQ9dM2ZH2JrZIYtTuN9wWo/DWra4EIWc1crahIFYieyrb/5ESE9vm96dEM1oFGwOE8Rnxw7QSeUlpPCCj7PU8lpk/Ll3sIiYNRsFlF8QRyWoKU8gqbLJWFzmTU5XJo8JwKrEyKmroiDicX0pJFbGL2x1AAit4TRvzGtVVmPuwIJ5OERQlvg//bWNlaLLL1lY30IuC7zRQcpdimefolAxdws12ZVhJTjIlhy7QiEoUS8DOiiiZPFXpLfZv81u8FkwBVrUOAktQdkejGE4VJmfxM9IM6+CHBVlg5nARtLvzI7jrozHoNyXo0pW+4c+bhZWz894MjlEb3tCVLiz+HuauBkHQyeSdkdBx8zSsn94FbQk7ngadqPkArvwAVN2atybDU/huEbSdO/1rrAWFwCcS2a+L59cW6PR/2GOCjQ6A6/oS4MNfw6HeL7u+AHjCa5jmBcfHpSKPUiVyS+M3n4OpVe4qKnxu8yJjLEQiB8aGjmVkjIGvxo06m1arsxn1vgzKaAqfT4keZQ6UzTPj+4Hn+bXd7L6+4QPNQBU8vvmTixc77/ibfpH8ET1iQf+aNWhi/NsAdhM67bZPPvYOBAGaT8lrsc/kcAU2dspGFpebn+Mv4jY1C/RdG7o9ioLO/Dy0MnsdrPYBcZC8moyIsdrkyRyRXJTNFybxbKISbJXauCKHA4vbX/uOH4WtKK/HhIgruzggdqov98Oj0GvXy2gnfKr536kn5OWBKwGPgWiJopySI4yTL5/Evz1AFvJKhLm5BTzsn1erxumn77UXhc3AHFE8W16ZzanLLxa3+fKAJtjULRW2F/DxVVmO4OW3Dj2WXoAIxqpMhOvAwcFt9GxXJqdSphC2dor1DXxJfq5YKucJEGU2ES18AHTQfw+GNp+EJ3xJ6/hdQBU8NNlqkZSYc0Ph1UJldmaWoYGl69m42pCdXbgLloQqy8R8ka0v09YgEotYbLFQJJQI2SyJSODK+JzB+Dwj/T6DcR/shViG4m2cWPifdsYcszgrZfnCli6x0dzl6Wp4+FVZdpQe1nQgNSS04AHDswwQOXi80GX31dbae1xuW09tnf5H1OWQjoxICRhEIsVIwbcSJYJp4ed75wDNuX7L1aKdgmj4UWyCGF9bZDCYdKZ8EYEiIq8O4cL3rODhApGWRMsNao70YnHm8LjHKVEKyt3um/D7Zo2tSgN/inAzRZ5CkOCwfAT3Bex55/uAR3C4fsoxGtDqaZ8/DH6D8oromJzo5hQkBuvB48sxsf+saogLTTd+EqSF770VJyvQ5Kk8ZvBsg8XmlDKp+qj2/y4MQ0crtr2/6X24f2kMqwRBpDarWYfbhyfsw+LPYuLagQUaWZwwbYIDrXWuS43g8UJ7uSKDfncvHP6allKiKNObJBnUd8TwqRkGy17o1hG6Y2K7CISu2Jhu/IfxlMjI6IQ4JCoyE6yG3h+4ONt2EfYnxbJKEKnUZi2z2pxIKkX3dwdqIPIJ4TAG3UHG/Q+LPwgeBSYIFzRDCUII+AMZoVRaCIPxnEZ9AdLGoPF48QRxGZYSQqdHpCdjGz4FmkDadyTyHI12mUy6ErRZ5/UoUBMcNot+C30ryQmh7utNpd0LfAD005/ct30EtZE+D+8/PqAvxUfTaSY2Mc63zP9GTqanjq+v29hYYaqq06GV4pdRdeIlq9VcVcsGD+WX4KmDSEt7444gL6e0V7dJ5YW5uYpCCSJLRDMHE035GZk9qaXT2cv/Qhv//HQgMWt+DsaJCSFZ4tafH3yyvzZD06WpI5Q9nSPiM1FnxMAUf8uyos4Ss8s6+a2x0x1nfQQNZloy04a/LKTO/JV1XBY/knArMX0SfWQSBNqg5cJ2360XRNqCDvmwbzCmpJ7H4c5TsSrAeO5b6Mutlj7vLHC37msd+GxakzNEPOZwdGRIoZmA1gtHSAfNZgizWQ8BxvSDsgl3dkQiGbpB5bs2ZyIOSWSsKCNRTwlqBaeo5Aujf35OZE6azctuw2FWqMgUAtIL9xIQCnmFEotrY4O0d73plTjsCuX+aBUGV5nutTtox+oS6SvKyFlJJImxRMSRCFTHz9NqJz6eqAXY47qOdh6MnWsm71E7tC5BPEFYjqXMB2lXmpH/5fkbt14hPzRzEg77QCCtcqX49/3aAYYrKCp6EI2igmU967+oaHlnZLj53lerhoZuVTjP1Bo4/Q4pP3PPDDySQ2XyivikakmVsc9I/2QpzPMiMSExmPlR2ozJ0wd3Nh7Qa/d6azT79uprCwdJf0Blnw7iVqdS2UqplK2kEunygny6AnCCSxqy+NYsRGMToOFYegErLUXtSiusXmWRJiWKkeQdsNNyjuiBf1wuY77rrWnZQzt3ErpToIaj3JkpLdQvG+9cDjtDYqvykltPfEZJqKDSj2IxpWCRra8geXLzSHPz5pFJerXv1dRXwF35nv+0MfFHZb81kZL+S9hRd6SFFK8mK+gpXMkUHMImShot1UWO5NQi/lj2KyrRFMFQRTUTGKUUZnZSSoa0B57/C0Hebkutqu6IPpj1JvrysphUVRS4E9x52mE50dBoPTXj7OzKvU82NKQ64+xQOTYVyjeZzUpSBwfdxWWOqgbXylpvmdqlWSTtTHHFksi5OQKyiIh2J3culri0gFqC1AoEtYhMsJq+iGy1oK8MEdSeLSJSWx1qdZdHip4M008mhFtcTFugNlEH64figiJQS0lL4kD7LvdK9zvBOrqOFuye4j5ewXl8pmBA/PzH3fwu9RPwejBNw2Rq0lhMNQSmzjZqVhpTow7ZCDYq9YqUNUi8oqJuHdxaQwW1t+633we1vePt420KThmQIj9QdL7bLbFLgFumVqtUjDA5laqMMZNVZHHxc1kohSLsuVC7hR9KROXD+kwWljrs2ZiEIaaQZIwkEpL6MugSSt8kBkm2GIBu+Mf+D8ataUySFmC/YNric6TkdO7uXVF4cSVeYE3lXneC1ZCWoRZ7xtrBCdTeE59cujD12T77BnnBTy+GqQyi0tKR2nVKsdKV39+Y8i+8+qx6Znx8loOkzpRsZkZCSBGsC9FTHGu9HeZ6fkbNPNl4dJqUl+pixS3NC5UsleKKpHCtT8spvV0KgszP90I7zdOf+47Dx0dvG6fHocf7jRnb1XPq2TdL50rBctsPv7b/+oNvmBYQhT6NDwx7NJrLz4S4WEAUt2paKY/eAA5P3bXVCBCvtWva1X+OkYDY0/21F+6m9Kk3/Qg6ei4E4dtJA0JuXnzY/PB252256y56DjRrmsGjbftutovwIAvNjivL5WSScqOuIDD8UWInC10m4mYSRfEO6+DIl1QQ0Qu92/HFvQ5ocnMIPBQCxLfid1q5NGEq7zPsGzbm4bmU8OBZGIML2dDSUCl/vDXm+I7xTVTktOD2i21/BoCCAo+n/EkcmS8WBPwJvwDRsUbB/gidg2vbCRUYbDmBUI7FVBwiNMduTfgTAOrEG0VkxIj+COSXqh+cG4EuLj+0dAHt7Hcf+dBdZt8pdMNZbkAdMVndi+V1RQMkcltR3SK57RTRxREJmUwVXMzRp4vD1oeGrg8L83RP9wDzdlKolEHDc4+EhyyOdi76I6i/A8atYcs0saBhxu12g0vTkOOIlzcNbH9ZB60g90oCVTGo4FOfaXv8dr/t+HgzgRn1vGhy251qnjh2ouY54vYmzNshBMyDYYbLxowklFUgGogsGASJXSl7nobi9szCiHWQkeo7Pa9wihqbZiDA3EBkfFDkX0TPiCMHZyAioYSInQbFEKbSsJAfYhmGjQYzENDSQGTBILDnaTtsl2LYhBkIaE2I2DkgL5+fBpXKuWjGmmqbBGGqJzJD0D/FlE1owDuQ+QSl9XBJgoitJzIs6BsZ4812iJwxo2iPVRGGGog0DAxHEVfXGs41+FhqwYTzsG+TIPT1RGYI+lFoG7rPwzVIEOZ6IsOC/kU4gW1TRLZAlZ80V571xtjR0ivHdDu5MuDnQ4bN1RlLnzETAzA43MK2msFKZ8tXL77DmoFrF8i6zcD1Bm7YAhvvtQmoOWwGstugt+itepvernfonXqX3l28Jw/9t/4bfzeyMqKLRo44nYeA5fbaDNjwod7eb1vF/w+/Ch03Ws7fotAouTYALxgD/FDrngK7LBOuOdciJzzSjzCgB/CWfgtv67fxLt51dvSZLpmx9Didi7QFvgMGAQo0JP3ubwZg/6d+fHKg+KPgicZL1S/78XsuvQIx/nAlMOMFgwDc/wDAQlA/9b8q2f/mevzQYzJk80fo4Zv+jk8L6tfmwQe/zJIAHX5QruyHZQk3weSntiTc3d9peuX5gn783PMkASX7AbZ/JBhffZsIBT8gvADUa+wyzPi13F2azAlTEDzDfFNe7b6fShNmoAInZecF/mx+I0D2PJLxgFwLvPwEiyPMZv8D/BzEj/y4KIXw5AHeBDqZ07R6uMGUAAVONLAjf/IxrjM96CLEAdPqw1ePQPd6yFIfji2On6uv47Lzm2hsGL9UbfOQAn+UETnj12q0/lytvLAG1/BU4T6r1QJYHGmDdb61rY6FFW5J/IQME4MzBSK/wLCM4J3iVsfPwHOBg1xc84tYjaHRPOBX6IcX8C48hH544eu3uiyC13CiSbStYE/oYLqNnsJuwO/xSyLF6RrX5jFZd5a6DmnOeQvBw1WutgwN1M78bwf2h/PzMN+2wMrM2EQ0QV6Lhml1IB+1s4MNm7O7SwF18P/ddaoW5kwHTapd+fMITa+b+bDF7o/ddkCAsmi15KyPovC3YT55HuDHT7l/I91Xe45G6pquoslgA1qFFI7uKeyWhvlvTgi5fB1n3dxTVt9jbuhzOFBv82VFT/Q5a2ebtTVKLvx20paYe2U4WQal2QhO8Vj1h0WqcU1WenTD5hPSS/+46h7d6zX0A26LKSR1K+pvYKqSkGqUtd8C2o5PEWsq0PclUIOUnwhq46OsT/1YGYSu/TDDkNjz5o2w7LPq57uW/U/hkbY2Q+KotP8NsSMw3+aAvvagHzLNH5dPlZYjbf1fqdvkAkztx3c/g55cNViUOEqVq3AqRdJZ6qZ0t3/OwDnKwJUACwiANTGBAzigCUxcPppXOSqmJqEFJc5KK+kDmZPqYDUlTQRkgFXLNQ8tYxxj+P5cHvWqtVrZinUeqK96+B3elQzIbtnz3SoI+E6s1FG/GilGpNK0fRIzJyHMtxtEXkvDLIoN5rqnT+m6cKw6lwgkAQ5YUIx5HK4yMcktTWeXYfZcZaN2GLnakf1vSa3jqXgLe0tOp2Huw9B5HafNrbZqa9zCaqyaL7H2W+5Dd7jMFAosgz1pJILMDUICjg+uqfZXzZnSu4h+gNvhe9OncBZcoL2l4I7wl1VjGqbbUAenYBJM3/994JJYKvbxE0BDIOsqQxmKhFzK5rKW2mo+NEkBfBXzZhQiZPEojAkeRRjqiVEks52jKHHmj6IZ1YyUsxPXgDDwolQ6PwTnaiaWLhYFTtKjW6OAx4S6sf06NavWWtOuQ+iGdLa9+jhk2CXcLKiz4KGeW+M17+Rn1SOoXYZRivkUa9RtvVdM1iqgRFCPkFZ9uqRz6+HXokqrYHoir36AIIuVjU3WIplAXYS4+NzZ15TzGbFquXPnokWuuKdr6DVDUBTqKXXIM2deUUBrCz0Woxc0RDSn97mEBRY9EpB1cqPYvnadod6wpiiaayt5hhNfunExDoY/JJEPFSa4PyGQJL58ErMusJ1ng+FpTc6wOWsQnkGLwb5i1OoZz3meiVkaixe86CUvdyi88ZnaZHnFq9q9boNj3pLqOzldDbPr90iHAQUcnAp9YwgvosvnsQO67ZereNoSXyvVK482pRvfsn3eEDLVtBAQVh6yg+KDOcZ0Y80wy2wzHdDmApXvVahUZQW1GnPN16WjK+ON+9ZNxlCIRhK474E9JoV0mZS7G/5Sj5eQhUiKWMQhHsmQHCmQ0nIrhAgVJlwEWKQo0WLEQosTLwEGFg4eAREJudteeOlVKKgRsUhET0Uhkd4pAQ7BOOiaZYLR1IaFkTJJXTRNgMObYJKhhnvCky476ZTTDjjooksCsVJILddnvXU26EmmlCb60mIXLEh2S/iTk9wPfnRGvGRJNtnNwpXcmNixpcuQKQsHFw9fdlzWElrjc+95y9vejzueeFM0c10UbJ3aKu3cw9/T7K8YWyYJX9dpy8rOI5znt1Hqntg51v2SP71zKn8b3XNd61AP3W4Ipj9be69ITnKL2n3l1LD8viun48l86Rz75qXz/MCVASHNi34/X2EYl5QpBMvIQso4Q8Y4lBHI8hpZjkQZITP9Nj8FLikQMpAROEMgKHDmADICgcAZSlVmcxcsTFk52dNn2fJysPCkqWbbX+SymaLg0LDfXjXqxL9ac4/PWA9lHldFZI+XPmmySvcdrJC/mx7Tl2Vl5hZF0niWm4I908K9Utq/L87Ksm35OGKe9F8z69j6f4KRtu/icIgdMGVpdnUOLmnoSn/LIi+nT1Yer2fn/tNhcjspcXuUBz1vq3usy1NWVGHNzClQ9yFteDj1dRRZErkGAAAA) format('woff2')}+ /* Canonical Adom dark-theme tokens (adom/guides/brand.md) */+ :root{+ --bg:#0d1117;--surface:#161b22;--elevated:#1c2128;--overlay:#21262d;+ --border:#30363d;--border-muted:#21262d;+ --text:#e6edf3;--text2:#8b949e;--text3:#484f58;+ --accent:#00b8b0;--accent-bright:#00e6dc;--purple:#8c6bf7;+ /* aliases used by the viewport + pin-list rules further down */+ --panel:#161b22;--panel2:#1c2128;--muted:#8b949e;+ }+ *{box-sizing:border-box;margin:0;padding:0}+ html,body{height:100%}+ body{background:var(--bg);color:var(--text);font:13px/1.4 'Satoshi','Segoe UI',system-ui,sans-serif;display:flex;flex-direction:column;overflow:hidden}+ /* ── Canonical Adom app header (adom/guides/adom-app-header.md) ── */+ header{display:flex;align-items:center;gap:12px;padding:0 16px;height:44px;flex:0 0 44px;border-bottom:1px solid var(--border-muted);background:var(--surface);position:relative;font-family:'Familjen Grotesk',sans-serif}+ header .brand{display:flex;align-items:center;gap:8px;color:var(--accent);font-size:13px;font-weight:600;letter-spacing:.01em;cursor:default;flex-shrink:0;outline:none}+ header .brand svg.logo{width:16px;height:16px;flex-shrink:0}+ header .brand:hover .app-name{text-decoration:underline;text-decoration-color:var(--accent);text-underline-offset:3px}+ header .brand .app-name{color:var(--accent)}+ header .brand .app-subtitle{color:var(--text2);font-weight:500}+ header .brand .sep{color:var(--text3);font-weight:400}+ header .vsep{width:1px;height:18px;background:var(--border);flex-shrink:0}+ header .subject{display:flex;align-items:center;gap:8px;min-width:0;flex:1;cursor:default}+ header .subject-name{color:var(--text);font-family:'Familjen Grotesk',sans-serif;font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}+ header .subject-meta{display:flex;align-items:center;gap:6px;color:var(--text2);font-family:'JetBrains Mono',ui-monospace,monospace;font-size:11px;white-space:nowrap}+ header .subject-meta .sep{color:var(--text3)}+ @media(max-width:720px){header .subject-meta{display:none}}+ /* Floating in-canvas viewer toolbar (frosted, matches the app's glass cards) */+ .tools{position:absolute;left:12px;top:12px;z-index:5;display:flex;gap:3px;padding:3px;background:rgba(22,27,34,.82);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid var(--border);border-radius:9px}+ .tools button{width:30px;height:30px;display:grid;place-items:center;background:transparent;border:none;border-radius:6px;color:var(--text2);cursor:pointer;transition:background .15s ease,color .15s ease}+ .tools button:hover{background:var(--elevated);color:var(--accent-bright)}+ .tools button svg{width:16px;height:16px;display:block}+ header .hover-popover{position:absolute;top:calc(100% + 6px);left:16px;background:var(--elevated);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.5);padding:12px 14px;min-width:300px;max-width:420px;font-family:'Satoshi',sans-serif;font-size:12px;color:var(--text);z-index:99999;opacity:0;transform:translateY(-2px);pointer-events:none;transition:opacity .12s ease,transform .12s ease}+ header .hover-popover.show{opacity:1;transform:none;pointer-events:auto}+ header .hover-popover .popover-title{font-family:'Familjen Grotesk',sans-serif;font-size:14px;font-weight:700;color:var(--text);margin-bottom:8px}+ header .hover-popover .popover-row{display:flex;gap:12px;padding:3px 0;align-items:baseline}+ header .hover-popover .popover-row .k{color:var(--text3);font-family:'JetBrains Mono',ui-monospace,monospace;font-size:10px;text-transform:lowercase;width:64px;flex-shrink:0}+ header .hover-popover .popover-row .v{color:var(--text);font-family:'Satoshi',sans-serif;font-size:12px;flex:1}+ header .hover-popover .popover-actions{margin-top:10px;padding-top:10px;border-top:1px solid var(--border-muted);display:flex;gap:12px}+ header .hover-popover .popover-link{color:var(--accent);text-decoration:none;font-family:'Familjen Grotesk',sans-serif;font-size:12px;font-weight:600}+ header .hover-popover .popover-link:hover{text-decoration:underline}+ main{flex:1;display:flex;min-height:0}+ .vpwrap{flex:1;position:relative;min-width:0}+ /* Schematic-workbench grid, identical to the main app's #stage. */+ .vp{position:absolute;inset:0;overflow:hidden;cursor:grab;background:+ radial-gradient(120% 120% at 50% 30%,rgba(0,184,177,.05),transparent 60%),+ linear-gradient(rgba(255,255,255,.025) 1px,transparent 1px) 0 0/22px 22px,+ linear-gradient(90deg,rgba(255,255,255,.025) 1px,transparent 1px) 0 0/22px 22px}+ .vp.grab{cursor:grabbing}+ /* Only the DIRECT-CHILD symbol svg gets the pan/zoom transform, scoping to+ `.vp > svg` (not `.vp svg`) keeps it off any nested icon svgs. */+ .vp > svg{position:absolute;left:0;top:0;width:100%;height:100%;transform-origin:0 0;display:block}+ .hint{position:absolute;right:10px;bottom:9px;color:var(--muted);font-size:11px;z-index:5;pointer-events:none;user-select:none;-webkit-user-select:none}+ aside{flex:0 0 268px;border-left:1px solid var(--border);background:var(--panel);display:flex;flex-direction:column;min-height:0}+ aside .ah{padding:9px 12px;border-bottom:1px solid var(--border);font-size:12px;color:var(--muted);display:flex;align-items:center;gap:8px}+ aside input{flex:1;background:var(--panel2);border:1px solid var(--border);border-radius:8px;color:var(--text);font-size:12px;padding:5px 8px;outline:none}+ aside input:focus{border-color:var(--accent)}+ .pins{flex:1;overflow:auto}+ .pin{padding:7px 12px;border-bottom:1px solid #1a212c;cursor:pointer}+ .pin:hover{background:var(--panel2)}+ .pin.on{background:#15202e}+ .pin .row{display:flex;align-items:center;gap:8px}+ .pin .num{font-family:'JetBrains Mono',ui-monospace,monospace;font-size:11px;color:#8fa0b4;min-width:22px;text-align:right}+ .pin .nme{font-weight:600;font-size:13px}+ .pin .ty{margin-left:auto;font-size:10px;padding:1px 6px;border-radius:5px;border:1px solid;white-space:nowrap}+ .pin .d{font-size:11.5px;color:#aeb6c2;line-height:1.45;margin:5px 0 1px 30px;display:none}+ .pin.on .d{display:block}+ .empty{color:var(--muted);font-size:12px;padding:14px}+ @media(max-width:620px){aside{flex-basis:200px}}+ /* pin panel header, reads like a studio section */+ aside .ah .atitle{font-family:'Familjen Grotesk',sans-serif;font-weight:600;font-size:12px;color:var(--text);white-space:nowrap}+ aside .ah .acount{margin-left:5px;font-family:'JetBrains Mono',ui-monospace,monospace;font-size:11px;color:var(--text3)}+ /* bottom info bar, mirrors the main app footer */+ footer{flex:0 0 auto;display:flex;align-items:center;height:26px;border-top:1px solid var(--border);background:var(--surface);font-size:11px;color:var(--text2);padding:0 14px;overflow:hidden}+ footer .it{display:flex;align-items:center;gap:6px;white-space:nowrap;min-width:0}+ footer .it+.it::before{content:"";width:1px;height:13px;background:var(--border);margin:0 12px;flex:0 0 1px}+ footer .k{color:var(--text3);text-transform:uppercase;font-size:9px;letter-spacing:.4px;flex:0 0 auto}+ footer .v{color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}+ footer .descit{min-width:0;overflow:hidden}+ /* pin hover, highlight + tooltip, parity with the live SymView */+ .vp > svg text,.vp > svg g.stroked-text{pointer-events:none}+ .hit{fill:rgba(0,230,220,0);stroke:none;cursor:pointer}+ .vp > svg g.stroked-text.hl path{stroke:var(--accent-bright)!important;fill:var(--accent-bright)!important}+ .vp > svg path.hl{stroke:var(--accent-bright)!important;stroke-width:.22!important}+ #pinmark{pointer-events:none;fill:rgba(0,230,220,.18);stroke:var(--accent-bright);stroke-width:.12;opacity:0;transition:opacity .1s}+ #tip{position:fixed;z-index:9999;max-width:300px;background:rgba(22,27,34,.97);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid rgba(0,184,177,.34);border-radius:10px;padding:9px 12px;color:var(--text);font-size:12px;line-height:1.5;pointer-events:none;opacity:0;transition:opacity .12s;box-shadow:0 12px 40px rgba(0,0,0,.55)}+ #tip.show{opacity:1}+ #tip .r1{display:flex;align-items:baseline;gap:8px;justify-content:space-between}+ #tip .nm{font-weight:700;font-size:13px}+ #tip .pn{font-family:'JetBrains Mono',ui-monospace,monospace;font-size:11px;color:var(--muted);white-space:nowrap}+ #tip .badge{display:inline-block;margin-top:5px;font-size:10px;font-weight:700;padding:2px 7px;border-radius:5px;letter-spacing:.2px}+ #tip .desc{margin-top:6px;color:#aeb6c2;font-size:11.5px}+</style></head>+<body>+ <header>+ <div class="brand" data-tooltip-target="app-info" tabindex="0">+ <svg class="logo" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="7" y="4" width="10" height="16" rx="1.5"/><path d="M7 8H3M7 12H3M7 16H3M21 8h-4M21 12h-4M21 16h-4"/></svg>+ <span class="app-name">adom-symbol</span>+ <span class="sep">·</span>+ <span class="app-subtitle">symbol viewer</span>+ </div>+ <div class="vsep" aria-hidden="true"></div>+ <div class="subject">+ <span class="subject-name">MLX90614ESF-BCI-000-TU</span>+ <span class="subject-meta"><span class="sep">·</span><span>4 pins</span><span class="sep">·</span><span>mlx90614esf-bci-000-tu</span></span>+ </div>+ <div class="hover-popover" id="app-info" role="dialog" aria-label="About adom-symbol">+ <div class="popover-title">adom-symbol</div>+ <div class="popover-row"><span class="k">about</span><span class="v">Interactive KiCad schematic-symbol viewer: pan/zoom, per-pin hover, and a filterable pin list.</span></div>+ <div class="popover-row"><span class="k">version</span><span class="v">v1.2.6</span></div>+ <div class="popover-row"><span class="k">engine</span><span class="v">service-kicad</span></div>+ <div class="popover-row"><span class="k">mfr</span><span class="v">Melexis</span></div>+ <div class="popover-row"><span class="k">author</span><span class="v">Adom Inc · adom.inc</span></div>+ <div class="popover-actions">+ <a class="popover-link" href="https://wiki.adom.inc/adom/adom-symbol" target="_blank" rel="noopener">Open wiki ↗</a>+ </div>+ </div>+ </header>+ <main>+ <div class="vpwrap">+ <div class="vp" id="vp">+ <div class="tools">+ <button id="zout" title="Zoom out" aria-label="Zoom out"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10.5" cy="10.5" r="6.5"/><path d="M20 20l-4.5-4.5M8 10.5h5"/></svg></button>+ <button id="zin" title="Zoom in" aria-label="Zoom in"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10.5" cy="10.5" r="6.5"/><path d="M20 20l-4.5-4.5M10.5 8v5M8 10.5h5"/></svg></button>+ <button id="fit" title="Fit to window" aria-label="Fit to window"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><rect x="8" y="9" width="8" height="6" rx="1"/></svg></button>+ </div>+ <div class="hint">drag to pan · scroll to zoom</div>+ <svg+ xmlns:svg="http://www.w3.org/2000/svg"+ xmlns="http://www.w3.org/2000/svg"+ xmlns:xlink="http://www.w3.org/1999/xlink"+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+ version="1.1"+ width="53.720mm" height="33.320mm" viewBox="73.1400 85.6100 53.7200 33.3200">++<defs>+ <linearGradient id="adom-body-grad" x1="0" y1="0" x2="0" y2="1">+ <stop offset="0%" stop-color="#1a2332"/>+ <stop offset="100%" stop-color="#141c27"/>+ </linearGradient>+</defs>+<style><![CDATA[+ /* Stroked text groups (KiCad renders text as paths in <g class="stroked-text">) */+ g.stroked-text path {+ stroke: #ffffff !important;+ fill: #ffffff !important;+ }+ text[opacity="0"] {+ fill: #ffffff !important;+ }+ .pin-highlight path {+ stroke: #00e6dc !important;+ }+ .pin-highlight g.stroked-text path {+ stroke: #00e6dc !important;+ }+ .group-highlight g.stroked-text path {+ stroke: #FFD180 !important;+ }+]]></style>+<defs>+ <radialGradient id="adom-canvas-glow" cx="100" cy="102.27" r="37.604" gradientUnits="userSpaceOnUse">+ <stop offset="0%" stop-color="#00b8b0" stop-opacity="0.06"/>+ <stop offset="70%" stop-color="#00b8b0" stop-opacity="0"/>+ </radialGradient>+ <pattern id="adom-canvas-grid" x="0" y="0" width="2.54" height="2.54" patternUnits="userSpaceOnUse">+ <line x1="0" y1="0" x2="2.54" y2="0" stroke="rgba(255,255,255,0.025)" stroke-width="0.06"/>+ <line x1="0" y1="0" x2="0" y2="2.54" stroke="rgba(255,255,255,0.025)" stroke-width="0.06"/>+ </pattern>+</defs>+<rect x="73.14" y="85.61" width="53.72" height="33.32" fill="#0d1117"/>+<rect x="73.14" y="85.61" width="53.72" height="33.32" fill="url(#adom-canvas-grid)"/>+<rect x="73.14" y="85.61" width="53.72" height="33.32" fill="url(#adom-canvas-glow)"/>++ +<g style="fill:none; fill-opacity:1.0000;stroke:#000000; stroke-opacity:1.0000;+stroke-linecap:round; stroke-linejoin:round;"+ transform="translate(0 0) scale(1 1)">+</g>+<g style="fill:none; fill-opacity:1.0000; +stroke:none; stroke-width:0.0001; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<rect x="0.000000" y="0.000000" width="297.002200" height="210.007200" rx="0.000000" />+</g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">++++++++++<g class="stroked-text">++++++</g>+<g class="stroked-text">+++++++++++</g>+<g class="stroked-text">++++++++++++++</g>+<g class="stroked-text">++++</g>+<g class="stroked-text">++++++++++++++++</g>+<g class="stroked-text">++++++++++++++++++++++</g>++++++<g class="stroked-text">++++++</g>+<g class="stroked-text">+++++++++++</g>+<g class="stroked-text">++++++++++++++</g>+<g class="stroked-text">++++</g>+<g class="stroked-text">++++++++++++++++</g>+<g class="stroked-text">++++++++++++++++++++++</g>++++<g class="stroked-text">++++</g>+<g class="stroked-text">+++++++++++++++++++</g>+<g class="stroked-text">++++++++++++++++</g>+<g class="stroked-text">+++++++++++++</g>++++<g class="stroked-text">++++</g>+<g class="stroked-text">+++++++++++++++++++</g>+<g class="stroked-text">++++++++++++++++</g>+<g class="stroked-text">+++++++++++++</g>+<g class="stroked-text">++++++++++++++++++++++++++++++++++++++++++++++++++++++</g>++<g class="stroked-text">++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</g>+</g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.3000; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">++<g class="stroked-text">++++++++++++++++++++++++++++++++++++</g></g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">++<g class="stroked-text">+++++++++++++++++++++++++++++++++++++++++++++++++++++++++</g>+<g class="stroked-text">+++++++++++++++++++++++++++++++++++</g>+</g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.4000; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">++<g class="stroked-text">+++++++++++++++++++++++++++++++++++++++</g></g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">++<g class="stroked-text">+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</g>++<g class="stroked-text">+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</g></g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.3000; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">++<g class="stroked-text">+</g></g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">++<g class="stroked-text">+</g>+<g class="stroked-text">+</g>+<g class="stroked-text">+</g>+<g class="stroked-text">+</g>++</g>+<g style="fill:url(#adom-body-grad); fill-opacity:1.0000; stroke:none;">+<rect x="82.220000" y="93.650000" width="35.560000" height="17.240000" rx="0.000000" />+</g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.2540; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<rect x="82.220000" y="93.650000" width="35.560000" height="17.240000" rx="0.000000" />+<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.5970,103.0960+101.5970,103.2250+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.5970,103.2250+101.8500,103.2250+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.5970,103.3160+101.5970,103.2250+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.5970,103.3160+101.8500,103.3160+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.8500,103.0960+101.5970,103.0960+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.8500,103.0960+101.8530,103.0770+101.8570,103.0580+101.8620,103.0400+101.8660,103.0270+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.8500,103.2250+101.8500,103.3160+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.8500,103.3160+101.8770,103.4170+101.9290,103.5150+102.0040,103.6080+102.1000,103.6940+102.2160,103.7720+102.3490,103.8390+102.4980,103.8960+102.6580,103.9390+102.8270,103.9700+103.0020,103.9870+103.1800,103.9890+103.3560,103.9780+103.5280,103.9520+103.6920,103.9130+103.8450,103.8620+103.9840,103.7980+104.1070,103.7240+104.2110,103.6410+104.2940,103.5500+104.3540,103.4540+104.3910,103.3540+104.4030,103.2520+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.8660,98.7540+101.8660,98.8360+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.8660,98.7540+101.8780,98.8580+101.9160,98.9590+101.9790,99.0560+102.0650,99.1470+102.1730,99.2300+102.3000,99.3030+102.4440,99.3650+102.6010,99.4150+102.7690,99.4510+102.9450,99.4730+103.1240,99.4810+103.3030,99.4730+103.4780,99.4510+103.6460,99.4150+103.8040,99.3650+103.9480,99.3030+104.0750,99.2300+104.1820,99.1470+104.2680,99.0560+104.3310,98.9590+104.3690,98.8580+104.3820,98.7540+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.8660,98.8360+101.8780,98.9390+101.9160,99.0410+101.9790,99.1380+102.0650,99.2290+102.1730,99.3120+102.3000,99.3850+102.4440,99.4470+102.6010,99.4970+102.7690,99.5330+102.9450,99.5550+103.1240,99.5620+103.3030,99.5550+103.4780,99.5330+103.6460,99.4970+103.8040,99.4470+103.9480,99.3850+104.0750,99.3120+104.1820,99.2290+104.2680,99.1380+104.3310,99.0410+104.3690,98.9390+104.3820,98.8360+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.8660,99.1660+101.8660,103.1600+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.8660,99.1660+101.8780,99.2690+101.9160,99.3710+101.9790,99.4680+102.0650,99.5590+102.1730,99.6420+102.3000,99.7150+102.4440,99.7770+102.6010,99.8270+102.7690,99.8630+102.9450,99.8850+103.1240,99.8920+103.3030,99.8850+103.4780,99.8630+103.6460,99.8270+103.8040,99.7770+103.9480,99.7150+104.0750,99.6420+104.1820,99.5590+104.2680,99.4680+104.3310,99.3710+104.3690,99.2690+104.3820,99.1660+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.8660,103.1600+101.8780,103.2640+101.9160,103.3650+101.9790,103.4620+102.0650,103.5530+102.1730,103.6360+102.3000,103.7090+102.4440,103.7710+102.6010,103.8210+102.7690,103.8570+102.9450,103.8790+103.1240,103.8870+103.3030,103.8790+103.4780,103.8570+103.6460,103.8210+103.8040,103.7710+103.9480,103.7090+104.0750,103.6360+104.1820,103.5530+104.2680,103.4620+104.3310,103.3650+104.3690,103.2640+104.3820,103.1600+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 101.8980,99.0010+101.8900,99.0230+101.8830,99.0450+101.8770,99.0680+101.8720,99.0900+101.8690,99.1130+101.8670,99.1360+101.8660,99.1580+101.8660,99.1660+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 102.2340,98.2410+102.2030,98.2590+102.1730,98.2790+102.1440,98.2980+102.1170,98.3190+102.0900,98.3400+102.0650,98.3620+102.0420,98.3840+102.0190,98.4060+101.9990,98.4290+101.9790,98.4520+101.9610,98.4760+101.9450,98.5010+101.9300,98.5250+101.9160,98.5500+101.9050,98.5750+101.8940,98.6000+101.8860,98.6250+101.8780,98.6510+101.8730,98.6770+101.8690,98.7030+101.8660,98.7280+101.8660,98.7540+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 102.3330,98.1840+102.2340,98.2410+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 102.3330,98.1840+102.1830,98.2910+102.0760,98.4150+102.0170,98.5480+102.0080,98.6860+102.0510,98.8220+102.1420,98.9490+102.2790,99.0630+102.4540,99.1570+102.6590,99.2270+102.8860,99.2710+103.1240,99.2860+103.3610,99.2710+103.5880,99.2270+103.7940,99.1570+103.9690,99.0630+104.1050,98.9490+104.1970,98.8220+104.2390,98.6860+104.2310,98.5480+104.1710,98.4150+104.0650,98.2910+103.9150,98.1840+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 102.5460,98.6400+102.5500,98.6040+102.5590,98.5690+102.5760,98.5350+102.5990,98.5020+102.6270,98.4700+102.6620,98.4400+102.7010,98.4130+102.7450,98.3880+102.7950,98.3660+102.8470,98.3480+102.9030,98.3320+102.9610,98.3200+103.0210,98.3120+103.0830,98.3080+103.1440,98.3070+103.2060,98.3100+103.2670,98.3170+103.3250,98.3280+103.3820,98.3420+103.4360,98.3600+103.4860,98.3810+103.5320,98.4040+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 102.5590,103.9140+102.5590,106.5090+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 102.5590,106.5090+102.5690,106.5290+102.5870,106.5400+102.6040,106.5440+102.6220,106.5460+102.6390,106.5440+102.6560,106.5400+102.6740,106.5290+102.6840,106.5140+102.6840,106.5090+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 102.6840,103.9450+102.6840,106.5090+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 103.5300,98.8510+103.4990,98.8340+103.4660,98.8190+103.4310,98.8050+103.3940,98.7920+103.3560,98.7820+103.3160,98.7730+103.2760,98.7650+103.2340,98.7600+103.1930,98.7560+103.1500,98.7540+103.1080,98.7540+103.0650,98.7550+103.0240,98.7590+102.9820,98.7640+102.9420,98.7710+102.9020,98.7790+102.8630,98.7900+102.8260,98.8010+102.7910,98.8150+102.7570,98.8300+102.7250,98.8460+102.6960,98.8640+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 103.5320,98.4040+103.5600,98.4220+103.5860,98.4400+103.6090,98.4600+103.6300,98.4800+103.6490,98.5020+103.6650,98.5240+103.6780,98.5460+103.6880,98.5690+103.6950,98.5930+103.6990,98.6160+103.7010,98.6400+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 103.5510,98.8640+103.5370,98.8550+103.5300,98.8510+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 103.5630,103.9450+103.5630,105.9290+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 103.5630,103.9450+103.5630,106.5090+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 103.5630,106.5090+103.5730,106.5290+103.5920,106.5400+103.6080,106.5440+103.6260,106.5460+103.6440,106.5440+103.6600,106.5400+103.6790,106.5290+103.6880,106.5140+103.6890,106.5090+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 103.6890,103.9140+103.6890,105.9290+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 103.6890,103.9140+103.6890,106.5090+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 103.7010,98.6400+103.6950,98.6880+103.6780,98.7340+103.6490,98.7790+103.6090,98.8210+103.5600,98.8590+103.5020,98.8920+103.4360,98.9210+103.3630,98.9430+103.2860,98.9600+103.2060,98.9700+103.1240,98.9740+103.0410,98.9700+102.9610,98.9600+102.8840,98.9430+102.8120,98.9210+102.7450,98.8920+102.6870,98.8590+102.6380,98.8210+102.5990,98.7790+102.5700,98.7340+102.5520,98.6880+102.5460,98.6400+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 103.9150,98.1840+103.8560,98.1520+103.7940,98.1230+103.7290,98.0970+103.6600,98.0730+103.5880,98.0530+103.5140,98.0350+103.4390,98.0210+103.3610,98.0090+103.2830,98.0010+103.2030,97.9960+103.1240,97.9940+103.0440,97.9960+102.9650,98.0010+102.8860,98.0090+102.8090,98.0210+102.7330,98.0350+102.6590,98.0530+102.5880,98.0730+102.5190,98.0970+102.4540,98.1230+102.3910,98.1520+102.3330,98.1840+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 104.0130,98.2410+103.9150,98.1840+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 104.3820,98.7540+104.3820,98.8360+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 104.3820,98.7540+104.3810,98.7280+104.3790,98.7030+104.3750,98.6770+104.3690,98.6510+104.3620,98.6250+104.3530,98.6000+104.3430,98.5750+104.3310,98.5500+104.3170,98.5250+104.3030,98.5010+104.2860,98.4760+104.2680,98.4520+104.2490,98.4290+104.2280,98.4060+104.2060,98.3840+104.1820,98.3620+104.1570,98.3400+104.1310,98.3190+104.1030,98.2980+104.0750,98.2790+104.0440,98.2590+104.0130,98.2410+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 104.3820,99.1660+104.3820,103.1600+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 104.3820,99.1660+104.3810,99.1430+104.3800,99.1200+104.3770,99.0980+104.3720,99.0750+104.3660,99.0530+104.3600,99.0310+104.3520,99.0080+104.3490,99.0010+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 104.3820,103.0270+104.3870,103.0450+104.3920,103.0630+104.3960,103.0810+104.3990,103.0990+104.4010,103.1180+104.4020,103.1360+104.4030,103.1540+104.4030,103.1600+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 104.4030,103.1600+104.4030,103.2520+" /> +<path style="fill:none; +stroke:#4a5568; stroke-width:0.0847; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;fill:none"+d="M 104.4030,103.1600+104.3910,103.2620+104.3540,103.3630+104.2940,103.4590+104.2110,103.5500+104.1070,103.6330+103.9840,103.7070+103.8450,103.7700+103.6920,103.8220+103.5280,103.8610+103.3560,103.8860+103.1800,103.8980+103.0020,103.8950+102.8270,103.8790+102.6580,103.8480+102.4980,103.8040+102.3490,103.7480+102.2160,103.6810+102.1000,103.6030+102.0040,103.5170+101.9290,103.4240+101.8770,103.3260+101.8500,103.2250+" /> +</g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<text x="83.2400" y="100.3810"+textLength="8.4330" font-size="1.0160" lengthAdjust="spacingAndGlyphs"+text-anchor="start" opacity="0" stroke-opacity="0">SMBus / PWM</text>+<g class="stroked-text">+<path d="M83.4853 100.3083+L83.5942 100.3445+" />+<path d="M83.5942 100.3445+L83.7756 100.3445+" />+<path d="M83.7756 100.3445+L83.8482 100.3083+" />+<path d="M83.8482 100.3083+L83.8844 100.2720+" />+<path d="M83.8844 100.2720+L83.9207 100.1994+" />+<path d="M83.9207 100.1994+L83.9207 100.1268+" />+<path d="M83.9207 100.1268+L83.8844 100.0543+" />+<path d="M83.8844 100.0543+L83.8482 100.0180+" />+<path d="M83.8482 100.0180+L83.7756 99.9817+" />+<path d="M83.7756 99.9817+L83.6304 99.9454+" />+<path d="M83.6304 99.9454+L83.5579 99.9091+" />+<path d="M83.5579 99.9091+L83.5216 99.8728+" />+<path d="M83.5216 99.8728+L83.4853 99.8003+" />+<path d="M83.4853 99.8003+L83.4853 99.7277+" />+<path d="M83.4853 99.7277+L83.5216 99.6551+" />+<path d="M83.5216 99.6551+L83.5579 99.6188+" />+<path d="M83.5579 99.6188+L83.6304 99.5825+" />+<path d="M83.6304 99.5825+L83.8119 99.5825+" />+<path d="M83.8119 99.5825+L83.9207 99.6188+" />+<path d="M84.2473 100.3445+L84.2473 99.5825+" />+<path d="M84.2473 99.5825+L84.5013 100.1268+" />+<path d="M84.5013 100.1268+L84.7553 99.5825+" />+<path d="M84.7553 99.5825+L84.7553 100.3445+" />+<path d="M85.3722 99.9454+L85.4810 99.9817+" />+<path d="M85.4810 99.9817+L85.5173 100.0180+" />+<path d="M85.5173 100.0180+L85.5536 100.0905+" />+<path d="M85.5536 100.0905+L85.5536 100.1994+" />+<path d="M85.5536 100.1994+L85.5173 100.2720+" />+<path d="M85.5173 100.2720+L85.4810 100.3083+" />+<path d="M85.4810 100.3083+L85.4085 100.3445+" />+<path d="M85.4085 100.3445+L85.1182 100.3445+" />+<path d="M85.1182 100.3445+L85.1182 99.5825+" />+<path d="M85.1182 99.5825+L85.3722 99.5825+" />+<path d="M85.3722 99.5825+L85.4448 99.6188+" />+<path d="M85.4448 99.6188+L85.4810 99.6551+" />+<path d="M85.4810 99.6551+L85.5173 99.7277+" />+<path d="M85.5173 99.7277+L85.5173 99.8003+" />+<path d="M85.5173 99.8003+L85.4810 99.8728+" />+<path d="M85.4810 99.8728+L85.4448 99.9091+" />+<path d="M85.4448 99.9091+L85.3722 99.9454+" />+<path d="M85.3722 99.9454+L85.1182 99.9454+" />+<path d="M86.2068 99.8365+L86.2068 100.3445+" />+<path d="M85.8802 99.8365+L85.8802 100.2357+" />+<path d="M85.8802 100.2357+L85.9165 100.3083+" />+<path d="M85.9165 100.3083+L85.9890 100.3445+" />+<path d="M85.9890 100.3445+L86.0979 100.3445+" />+<path d="M86.0979 100.3445+L86.1705 100.3083+" />+<path d="M86.1705 100.3083+L86.2068 100.2720+" />+<path d="M86.5333 100.3083+L86.6059 100.3445+" />+<path d="M86.6059 100.3445+L86.7510 100.3445+" />+<path d="M86.7510 100.3445+L86.8236 100.3083+" />+<path d="M86.8236 100.3083+L86.8599 100.2357+" />+<path d="M86.8599 100.2357+L86.8599 100.1994+" />+<path d="M86.8599 100.1994+L86.8236 100.1268+" />+<path d="M86.8236 100.1268+L86.7510 100.0905+" />+<path d="M86.7510 100.0905+L86.6422 100.0905+" />+<path d="M86.6422 100.0905+L86.5696 100.0543+" />+<path d="M86.5696 100.0543+L86.5333 99.9817+" />+<path d="M86.5333 99.9817+L86.5333 99.9454+" />+<path d="M86.5333 99.9454+L86.5696 99.8728+" />+<path d="M86.5696 99.8728+L86.6422 99.8365+" />+<path d="M86.6422 99.8365+L86.7510 99.8365+" />+<path d="M86.7510 99.8365+L86.8236 99.8728+" />+<path d="M88.3114 99.5463+L87.6582 100.5260+" />+<path d="M89.1460 100.3445+L89.1460 99.5825+" />+<path d="M89.1460 99.5825+L89.4363 99.5825+" />+<path d="M89.4363 99.5825+L89.5088 99.6188+" />+<path d="M89.5088 99.6188+L89.5451 99.6551+" />+<path d="M89.5451 99.6551+L89.5814 99.7277+" />+<path d="M89.5814 99.7277+L89.5814 99.8365+" />+<path d="M89.5814 99.8365+L89.5451 99.9091+" />+<path d="M89.5451 99.9091+L89.5088 99.9454+" />+<path d="M89.5088 99.9454+L89.4363 99.9817+" />+<path d="M89.4363 99.9817+L89.1460 99.9817+" />+<path d="M89.8354 99.5825+L90.0168 100.3445+" />+<path d="M90.0168 100.3445+L90.1620 99.8003+" />+<path d="M90.1620 99.8003+L90.3071 100.3445+" />+<path d="M90.3071 100.3445+L90.4886 99.5825+" />+<path d="M90.7789 100.3445+L90.7789 99.5825+" />+<path d="M90.7789 99.5825+L91.0329 100.1268+" />+<path d="M91.0329 100.1268+L91.2869 99.5825+" />+<path d="M91.2869 99.5825+L91.2869 100.3445+" />+</g><text x="116.7600" y="100.3810"+textLength="3.6793" font-size="1.0160" lengthAdjust="spacingAndGlyphs"+text-anchor="end" opacity="0" stroke-opacity="0">Power</text>+<g class="stroked-text">+<path d="M113.4667 100.3445+L113.4667 99.5825+" />+<path d="M113.4667 99.5825+L113.7570 99.5825+" />+<path d="M113.7570 99.5825+L113.8295 99.6188+" />+<path d="M113.8295 99.6188+L113.8658 99.6551+" />+<path d="M113.8658 99.6551+L113.9021 99.7277+" />+<path d="M113.9021 99.7277+L113.9021 99.8365+" />+<path d="M113.9021 99.8365+L113.8658 99.9091+" />+<path d="M113.8658 99.9091+L113.8295 99.9454+" />+<path d="M113.8295 99.9454+L113.7570 99.9817+" />+<path d="M113.7570 99.9817+L113.4667 99.9817+" />+<path d="M114.3375 100.3445+L114.2650 100.3083+" />+<path d="M114.2650 100.3083+L114.2287 100.2720+" />+<path d="M114.2287 100.2720+L114.1924 100.1994+" />+<path d="M114.1924 100.1994+L114.1924 99.9817+" />+<path d="M114.1924 99.9817+L114.2287 99.9091+" />+<path d="M114.2287 99.9091+L114.2650 99.8728+" />+<path d="M114.2650 99.8728+L114.3375 99.8365+" />+<path d="M114.3375 99.8365+L114.4464 99.8365+" />+<path d="M114.4464 99.8365+L114.5190 99.8728+" />+<path d="M114.5190 99.8728+L114.5553 99.9091+" />+<path d="M114.5553 99.9091+L114.5915 99.9817+" />+<path d="M114.5915 99.9817+L114.5915 100.1994+" />+<path d="M114.5915 100.1994+L114.5553 100.2720+" />+<path d="M114.5553 100.2720+L114.5190 100.3083+" />+<path d="M114.5190 100.3083+L114.4464 100.3445+" />+<path d="M114.4464 100.3445+L114.3375 100.3445+" />+<path d="M114.8455 99.8365+L114.9907 100.3445+" />+<path d="M114.9907 100.3445+L115.1358 99.9817+" />+<path d="M115.1358 99.9817+L115.2809 100.3445+" />+<path d="M115.2809 100.3445+L115.4261 99.8365+" />+<path d="M116.0067 100.3083+L115.9341 100.3445+" />+<path d="M115.9341 100.3445+L115.7890 100.3445+" />+<path d="M115.7890 100.3445+L115.7164 100.3083+" />+<path d="M115.7164 100.3083+L115.6801 100.2357+" />+<path d="M115.6801 100.2357+L115.6801 99.9454+" />+<path d="M115.6801 99.9454+L115.7164 99.8728+" />+<path d="M115.7164 99.8728+L115.7890 99.8365+" />+<path d="M115.7890 99.8365+L115.9341 99.8365+" />+<path d="M115.9341 99.8365+L116.0067 99.8728+" />+<path d="M116.0067 99.8728+L116.0430 99.9454+" />+<path d="M116.0430 99.9454+L116.0430 100.0180+" />+<path d="M116.0430 100.0180+L115.6801 100.0905+" />+<path d="M116.3695 100.3445+L116.3695 99.8365+" />+<path d="M116.3695 99.9817+L116.4058 99.9091+" />+<path d="M116.4058 99.9091+L116.4421 99.8728+" />+<path d="M116.4421 99.8728+L116.5146 99.8365+" />+<path d="M116.5146 99.8365+L116.5872 99.8365+" />+</g><path d="M82.2200 102.0000+L79.6800 102.0000+" />+</g>+<g style="fill:none; +stroke:#484f58; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<text x="83.2360" y="102.6350"+textLength="3.7108" font-size="1.6933" lengthAdjust="spacingAndGlyphs"+text-anchor="start" opacity="0" stroke-opacity="0">SCL</text>+<g class="stroked-text">+<path d="M83.5781 102.5191+L83.7595 102.5795+" />+<path d="M83.7595 102.5795+L84.0619 102.5795+" />+<path d="M84.0619 102.5795+L84.1828 102.5191+" />+<path d="M84.1828 102.5191+L84.2433 102.4586+" />+<path d="M84.2433 102.4586+L84.3038 102.3376+" />+<path d="M84.3038 102.3376+L84.3038 102.2167+" />+<path d="M84.3038 102.2167+L84.2433 102.0957+" />+<path d="M84.2433 102.0957+L84.1828 102.0352+" />+<path d="M84.1828 102.0352+L84.0619 101.9748+" />+<path d="M84.0619 101.9748+L83.8200 101.9143+" />+<path d="M83.8200 101.9143+L83.6990 101.8538+" />+<path d="M83.6990 101.8538+L83.6385 101.7933+" />+<path d="M83.6385 101.7933+L83.5781 101.6724+" />+<path d="M83.5781 101.6724+L83.5781 101.5514+" />+<path d="M83.5781 101.5514+L83.6385 101.4305+" />+<path d="M83.6385 101.4305+L83.6990 101.3700+" />+<path d="M83.6990 101.3700+L83.8200 101.3095+" />+<path d="M83.8200 101.3095+L84.1223 101.3095+" />+<path d="M84.1223 101.3095+L84.3038 101.3700+" />+<path d="M85.5737 102.4586+L85.5133 102.5191+" />+<path d="M85.5133 102.5191+L85.3318 102.5795+" />+<path d="M85.3318 102.5795+L85.2109 102.5795+" />+<path d="M85.2109 102.5795+L85.0295 102.5191+" />+<path d="M85.0295 102.5191+L84.9085 102.3981+" />+<path d="M84.9085 102.3981+L84.8480 102.2771+" />+<path d="M84.8480 102.2771+L84.7876 102.0352+" />+<path d="M84.7876 102.0352+L84.7876 101.8538+" />+<path d="M84.7876 101.8538+L84.8480 101.6119+" />+<path d="M84.8480 101.6119+L84.9085 101.4910+" />+<path d="M84.9085 101.4910+L85.0295 101.3700+" />+<path d="M85.0295 101.3700+L85.2109 101.3095+" />+<path d="M85.2109 101.3095+L85.3318 101.3095+" />+<path d="M85.3318 101.3095+L85.5133 101.3700+" />+<path d="M85.5133 101.3700+L85.5737 101.4305+" />+<path d="M86.7228 102.5795+L86.1180 102.5795+" />+<path d="M86.1180 102.5795+L86.1180 101.3095+" />+</g></g>+<g style="fill:none; +stroke:#ffffff; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<text x="80.9500" y="101.7460"+textLength="1.4127" font-size="1.6933" lengthAdjust="spacingAndGlyphs"+text-anchor="middle" opacity="0" stroke-opacity="0">1</text>+<g class="stroked-text">+<path d="M81.3129 101.5825+L80.5872 101.5825+" />+<path d="M80.9500 101.5825+L80.9500 100.3125+" />+<path d="M80.9500 100.3125+L80.8291 100.4940+" />+<path d="M80.8291 100.4940+L80.7081 100.6149+" />+<path d="M80.7081 100.6149+L80.5872 100.6754+" />+</g></g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<path d="M82.2200 104.5400+L79.6800 104.5400+" />+</g>+<g style="fill:none; +stroke:#484f58; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<text x="83.2360" y="105.1750"+textLength="9.2746" font-size="1.6933" lengthAdjust="spacingAndGlyphs"+text-anchor="start" opacity="0" stroke-opacity="0">SDA/PWM</text>+<g class="stroked-text">+<path d="M83.5781 105.0591+L83.7595 105.1195+" />+<path d="M83.7595 105.1195+L84.0619 105.1195+" />+<path d="M84.0619 105.1195+L84.1828 105.0591+" />+<path d="M84.1828 105.0591+L84.2433 104.9986+" />+<path d="M84.2433 104.9986+L84.3038 104.8776+" />+<path d="M84.3038 104.8776+L84.3038 104.7567+" />+<path d="M84.3038 104.7567+L84.2433 104.6357+" />+<path d="M84.2433 104.6357+L84.1828 104.5752+" />+<path d="M84.1828 104.5752+L84.0619 104.5148+" />+<path d="M84.0619 104.5148+L83.8200 104.4543+" />+<path d="M83.8200 104.4543+L83.6990 104.3938+" />+<path d="M83.6990 104.3938+L83.6385 104.3333+" />+<path d="M83.6385 104.3333+L83.5781 104.2124+" />+<path d="M83.5781 104.2124+L83.5781 104.0914+" />+<path d="M83.5781 104.0914+L83.6385 103.9705+" />+<path d="M83.6385 103.9705+L83.6990 103.9100+" />+<path d="M83.6990 103.9100+L83.8200 103.8495+" />+<path d="M83.8200 103.8495+L84.1223 103.8495+" />+<path d="M84.1223 103.8495+L84.3038 103.9100+" />+<path d="M84.8480 105.1195+L84.8480 103.8495+" />+<path d="M84.8480 103.8495+L85.1504 103.8495+" />+<path d="M85.1504 103.8495+L85.3318 103.9100+" />+<path d="M85.3318 103.9100+L85.4528 104.0310+" />+<path d="M85.4528 104.0310+L85.5133 104.1519+" />+<path d="M85.5133 104.1519+L85.5737 104.3938+" />+<path d="M85.5737 104.3938+L85.5737 104.5752+" />+<path d="M85.5737 104.5752+L85.5133 104.8171+" />+<path d="M85.5133 104.8171+L85.4528 104.9381+" />+<path d="M85.4528 104.9381+L85.3318 105.0591+" />+<path d="M85.3318 105.0591+L85.1504 105.1195+" />+<path d="M85.1504 105.1195+L84.8480 105.1195+" />+<path d="M86.0576 104.7567+L86.6623 104.7567+" />+<path d="M85.9366 105.1195+L86.3599 103.8495+" />+<path d="M86.3599 103.8495+L86.7833 105.1195+" />+<path d="M88.1138 103.7891+L87.0252 105.4219+" />+<path d="M88.5371 105.1195+L88.5371 103.8495+" />+<path d="M88.5371 103.8495+L89.0209 103.8495+" />+<path d="M89.0209 103.8495+L89.1419 103.9100+" />+<path d="M89.1419 103.9100+L89.2024 103.9705+" />+<path d="M89.2024 103.9705+L89.2628 104.0914+" />+<path d="M89.2628 104.0914+L89.2628 104.2729+" />+<path d="M89.2628 104.2729+L89.2024 104.3938+" />+<path d="M89.2024 104.3938+L89.1419 104.4543+" />+<path d="M89.1419 104.4543+L89.0209 104.5148+" />+<path d="M89.0209 104.5148+L88.5371 104.5148+" />+<path d="M89.6862 103.8495+L89.9886 105.1195+" />+<path d="M89.9886 105.1195+L90.2305 104.2124+" />+<path d="M90.2305 104.2124+L90.4724 105.1195+" />+<path d="M90.4724 105.1195+L90.7748 103.8495+" />+<path d="M91.2585 105.1195+L91.2585 103.8495+" />+<path d="M91.2585 103.8495+L91.6819 104.7567+" />+<path d="M91.6819 104.7567+L92.1052 103.8495+" />+<path d="M92.1052 103.8495+L92.1052 105.1195+" />+</g></g>+<g style="fill:none; +stroke:#ffffff; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<text x="80.9500" y="104.2860"+textLength="1.4127" font-size="1.6933" lengthAdjust="spacingAndGlyphs"+text-anchor="middle" opacity="0" stroke-opacity="0">2</text>+<g class="stroked-text">+<path d="M80.5872 102.9735+L80.6476 102.9130+" />+<path d="M80.6476 102.9130+L80.7686 102.8525+" />+<path d="M80.7686 102.8525+L81.0710 102.8525+" />+<path d="M81.0710 102.8525+L81.1919 102.9130+" />+<path d="M81.1919 102.9130+L81.2524 102.9735+" />+<path d="M81.2524 102.9735+L81.3129 103.0944+" />+<path d="M81.3129 103.0944+L81.3129 103.2154+" />+<path d="M81.3129 103.2154+L81.2524 103.3968+" />+<path d="M81.2524 103.3968+L80.5267 104.1225+" />+<path d="M80.5267 104.1225+L81.3129 104.1225+" />+</g></g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<path d="M117.7800 102.0000+L120.3200 102.0000+" />+</g>+<g style="fill:none; +stroke:#484f58; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<text x="116.7640" y="102.6350"+textLength="3.8318" font-size="1.6933" lengthAdjust="spacingAndGlyphs"+text-anchor="end" opacity="0" stroke-opacity="0">VDD</text>+<g class="stroked-text">+<path d="M113.1561 101.3095+L113.5794 102.5795+" />+<path d="M113.5794 102.5795+L114.0028 101.3095+" />+<path d="M114.4261 102.5795+L114.4261 101.3095+" />+<path d="M114.4261 101.3095+L114.7285 101.3095+" />+<path d="M114.7285 101.3095+L114.9099 101.3700+" />+<path d="M114.9099 101.3700+L115.0309 101.4910+" />+<path d="M115.0309 101.4910+L115.0914 101.6119+" />+<path d="M115.0914 101.6119+L115.1518 101.8538+" />+<path d="M115.1518 101.8538+L115.1518 102.0352+" />+<path d="M115.1518 102.0352+L115.0914 102.2771+" />+<path d="M115.0914 102.2771+L115.0309 102.3981+" />+<path d="M115.0309 102.3981+L114.9099 102.5191+" />+<path d="M114.9099 102.5191+L114.7285 102.5795+" />+<path d="M114.7285 102.5795+L114.4261 102.5795+" />+<path d="M115.6961 102.5795+L115.6961 101.3095+" />+<path d="M115.6961 101.3095+L115.9985 101.3095+" />+<path d="M115.9985 101.3095+L116.1799 101.3700+" />+<path d="M116.1799 101.3700+L116.3009 101.4910+" />+<path d="M116.3009 101.4910+L116.3614 101.6119+" />+<path d="M116.3614 101.6119+L116.4218 101.8538+" />+<path d="M116.4218 101.8538+L116.4218 102.0352+" />+<path d="M116.4218 102.0352+L116.3614 102.2771+" />+<path d="M116.3614 102.2771+L116.3009 102.3981+" />+<path d="M116.3009 102.3981+L116.1799 102.5191+" />+<path d="M116.1799 102.5191+L115.9985 102.5795+" />+<path d="M115.9985 102.5795+L115.6961 102.5795+" />+</g></g>+<g style="fill:none; +stroke:#ffffff; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<text x="119.0500" y="101.7460"+textLength="1.4127" font-size="1.6933" lengthAdjust="spacingAndGlyphs"+text-anchor="middle" opacity="0" stroke-opacity="0">3</text>+<g class="stroked-text">+<path d="M118.6267 100.3125+L119.4129 100.3125+" />+<path d="M119.4129 100.3125+L118.9895 100.7963+" />+<path d="M118.9895 100.7963+L119.1710 100.7963+" />+<path d="M119.1710 100.7963+L119.2919 100.8568+" />+<path d="M119.2919 100.8568+L119.3524 100.9173+" />+<path d="M119.3524 100.9173+L119.4129 101.0382+" />+<path d="M119.4129 101.0382+L119.4129 101.3406+" />+<path d="M119.4129 101.3406+L119.3524 101.4616+" />+<path d="M119.3524 101.4616+L119.2919 101.5221+" />+<path d="M119.2919 101.5221+L119.1710 101.5825+" />+<path d="M119.1710 101.5825+L118.8081 101.5825+" />+<path d="M118.8081 101.5825+L118.6872 101.5221+" />+<path d="M118.6872 101.5221+L118.6267 101.4616+" />+</g></g>+<g style="fill:none; +stroke:#4a5568; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<path d="M117.7800 104.5400+L120.3200 104.5400+" />+</g>+<g style="fill:none; +stroke:#484f58; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<text x="116.7640" y="105.1750"+textLength="3.7108" font-size="1.6933" lengthAdjust="spacingAndGlyphs"+text-anchor="end" opacity="0" stroke-opacity="0">VSS</text>+<g class="stroked-text">+<path d="M113.2771 103.8495+L113.7004 105.1195+" />+<path d="M113.7004 105.1195+L114.1238 103.8495+" />+<path d="M114.4867 105.0591+L114.6681 105.1195+" />+<path d="M114.6681 105.1195+L114.9705 105.1195+" />+<path d="M114.9705 105.1195+L115.0914 105.0591+" />+<path d="M115.0914 105.0591+L115.1519 104.9986+" />+<path d="M115.1519 104.9986+L115.2124 104.8776+" />+<path d="M115.2124 104.8776+L115.2124 104.7567+" />+<path d="M115.2124 104.7567+L115.1519 104.6357+" />+<path d="M115.1519 104.6357+L115.0914 104.5752+" />+<path d="M115.0914 104.5752+L114.9705 104.5148+" />+<path d="M114.9705 104.5148+L114.7286 104.4543+" />+<path d="M114.7286 104.4543+L114.6076 104.3938+" />+<path d="M114.6076 104.3938+L114.5471 104.3333+" />+<path d="M114.5471 104.3333+L114.4867 104.2124+" />+<path d="M114.4867 104.2124+L114.4867 104.0914+" />+<path d="M114.4867 104.0914+L114.5471 103.9705+" />+<path d="M114.5471 103.9705+L114.6076 103.9100+" />+<path d="M114.6076 103.9100+L114.7286 103.8495+" />+<path d="M114.7286 103.8495+L115.0309 103.8495+" />+<path d="M115.0309 103.8495+L115.2124 103.9100+" />+<path d="M115.6962 105.0591+L115.8776 105.1195+" />+<path d="M115.8776 105.1195+L116.1800 105.1195+" />+<path d="M116.1800 105.1195+L116.3009 105.0591+" />+<path d="M116.3009 105.0591+L116.3614 104.9986+" />+<path d="M116.3614 104.9986+L116.4219 104.8776+" />+<path d="M116.4219 104.8776+L116.4219 104.7567+" />+<path d="M116.4219 104.7567+L116.3614 104.6357+" />+<path d="M116.3614 104.6357+L116.3009 104.5752+" />+<path d="M116.3009 104.5752+L116.1800 104.5148+" />+<path d="M116.1800 104.5148+L115.9381 104.4543+" />+<path d="M115.9381 104.4543+L115.8171 104.3938+" />+<path d="M115.8171 104.3938+L115.7566 104.3333+" />+<path d="M115.7566 104.3333+L115.6962 104.2124+" />+<path d="M115.6962 104.2124+L115.6962 104.0914+" />+<path d="M115.6962 104.0914+L115.7566 103.9705+" />+<path d="M115.7566 103.9705+L115.8171 103.9100+" />+<path d="M115.8171 103.9100+L115.9381 103.8495+" />+<path d="M115.9381 103.8495+L116.2404 103.8495+" />+<path d="M116.2404 103.8495+L116.4219 103.9100+" />+</g></g>+<g style="fill:none; +stroke:#ffffff; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<text x="119.0500" y="104.2860"+textLength="1.4127" font-size="1.6933" lengthAdjust="spacingAndGlyphs"+text-anchor="middle" opacity="0" stroke-opacity="0">4</text>+<g class="stroked-text">+<path d="M119.2919 103.2759+L119.2919 104.1225+" />+<path d="M118.9895 102.7921+L118.6872 103.6992+" />+<path d="M118.6872 103.6992+L119.4733 103.6992+" />+</g></g>+<g style="fill:none; +stroke:#484f58; stroke-width:0.1524; stroke-opacity:1; +stroke-linecap:round; stroke-linejoin:round;">+<text x="100.0000" y="91.7450"+textLength="2.6223" font-size="1.6933" lengthAdjust="spacingAndGlyphs"+text-anchor="middle" opacity="0" stroke-opacity="0">U?</text>+<g class="stroked-text">+<path d="M99.0928 90.4195+L99.0928 91.4476+" />+<path d="M99.0928 91.4476+L99.1533 91.5686+" />+<path d="M99.1533 91.5686+L99.2138 91.6291+" />+<path d="M99.2138 91.6291+L99.3347 91.6895+" />+<path d="M99.3347 91.6895+L99.5766 91.6895+" />+<path d="M99.5766 91.6895+L99.6976 91.6291+" />+<path d="M99.6976 91.6291+L99.7581 91.5686+" />+<path d="M99.7581 91.5686+L99.8185 91.4476+" />+<path d="M99.8185 91.4476+L99.8185 90.4195+" />+<path d="M100.6048 91.5686+L100.6652 91.6291+" />+<path d="M100.6652 91.6291+L100.6048 91.6895+" />+<path d="M100.6048 91.6895+L100.5443 91.6291+" />+<path d="M100.5443 91.6291+L100.6048 91.5686+" />+<path d="M100.6048 91.5686+L100.6048 91.6895+" />+<path d="M100.3629 90.4800+L100.4838 90.4195+" />+<path d="M100.4838 90.4195+L100.7862 90.4195+" />+<path d="M100.7862 90.4195+L100.9071 90.4800+" />+<path d="M100.9071 90.4800+L100.9676 90.6010+" />+<path d="M100.9676 90.6010+L100.9676 90.7219+" />+<path d="M100.9676 90.7219+L100.9071 90.8429+" />+<path d="M100.9071 90.8429+L100.8467 90.9033+" />+<path d="M100.8467 90.9033+L100.7257 90.9638+" />+<path d="M100.7257 90.9638+L100.6652 91.0243+" />+<path d="M100.6652 91.0243+L100.6048 91.1452+" />+<path d="M100.6048 91.1452+L100.6048 91.2057+" />+</g><text x="100.0000" y="114.0650"+textLength="27.1754" font-size="1.6933" lengthAdjust="spacingAndGlyphs"+text-anchor="middle" opacity="0" stroke-opacity="0">MLX90614ESF-BCI-000-TU</text>+<g class="stroked-text">+<path d="M86.8162 114.0095+L86.8162 112.7395+" />+<path d="M86.8162 112.7395+L87.2396 113.6467+" />+<path d="M87.2396 113.6467+L87.6629 112.7395+" />+<path d="M87.6629 112.7395+L87.6629 114.0095+" />+<path d="M88.8724 114.0095+L88.2676 114.0095+" />+<path d="M88.2676 114.0095+L88.2676 112.7395+" />+<path d="M89.1748 112.7395+L90.0214 114.0095+" />+<path d="M90.0214 112.7395+L89.1748 114.0095+" />+<path d="M90.5657 114.0095+L90.8076 114.0095+" />+<path d="M90.8076 114.0095+L90.9286 113.9491+" />+<path d="M90.9286 113.9491+L90.9890 113.8886+" />+<path d="M90.9890 113.8886+L91.1100 113.7071+" />+<path d="M91.1100 113.7071+L91.1705 113.4652+" />+<path d="M91.1705 113.4652+L91.1705 112.9814+" />+<path d="M91.1705 112.9814+L91.1100 112.8605+" />+<path d="M91.1100 112.8605+L91.0495 112.8000+" />+<path d="M91.0495 112.8000+L90.9286 112.7395+" />+<path d="M90.9286 112.7395+L90.6867 112.7395+" />+<path d="M90.6867 112.7395+L90.5657 112.8000+" />+<path d="M90.5657 112.8000+L90.5052 112.8605+" />+<path d="M90.5052 112.8605+L90.4448 112.9814+" />+<path d="M90.4448 112.9814+L90.4448 113.2838+" />+<path d="M90.4448 113.2838+L90.5052 113.4048+" />+<path d="M90.5052 113.4048+L90.5657 113.4652+" />+<path d="M90.5657 113.4652+L90.6867 113.5257+" />+<path d="M90.6867 113.5257+L90.9286 113.5257+" />+<path d="M90.9286 113.5257+L91.0495 113.4652+" />+<path d="M91.0495 113.4652+L91.1100 113.4048+" />+<path d="M91.1100 113.4048+L91.1705 113.2838+" />+<path d="M91.9566 112.7395+L92.0776 112.7395+" />+<path d="M92.0776 112.7395+L92.1985 112.8000+" />+<path d="M92.1985 112.8000+L92.2590 112.8605+" />+<path d="M92.2590 112.8605+L92.3195 112.9814+" />+<path d="M92.3195 112.9814+L92.3800 113.2233+" />+<path d="M92.3800 113.2233+L92.3800 113.5257+" />+<path d="M92.3800 113.5257+L92.3195 113.7676+" />+<path d="M92.3195 113.7676+L92.2590 113.8886+" />+<path d="M92.2590 113.8886+L92.1985 113.9491+" />+<path d="M92.1985 113.9491+L92.0776 114.0095+" />+<path d="M92.0776 114.0095+L91.9566 114.0095+" />+<path d="M91.9566 114.0095+L91.8357 113.9491+" />+<path d="M91.8357 113.9491+L91.7752 113.8886+" />+<path d="M91.7752 113.8886+L91.7147 113.7676+" />+<path d="M91.7147 113.7676+L91.6543 113.5257+" />+<path d="M91.6543 113.5257+L91.6543 113.2233+" />+<path d="M91.6543 113.2233+L91.7147 112.9814+" />+<path d="M91.7147 112.9814+L91.7752 112.8605+" />+<path d="M91.7752 112.8605+L91.8357 112.8000+" />+<path d="M91.8357 112.8000+L91.9566 112.7395+" />+<path d="M93.4685 112.7395+L93.2266 112.7395+" />+<path d="M93.2266 112.7395+L93.1057 112.8000+" />+<path d="M93.1057 112.8000+L93.0452 112.8605+" />+<path d="M93.0452 112.8605+L92.9242 113.0419+" />+<path d="M92.9242 113.0419+L92.8638 113.2838+" />+<path d="M92.8638 113.2838+L92.8638 113.7676+" />+<path d="M92.8638 113.7676+L92.9242 113.8886+" />+<path d="M92.9242 113.8886+L92.9847 113.9491+" />+<path d="M92.9847 113.9491+L93.1057 114.0095+" />+<path d="M93.1057 114.0095+L93.3476 114.0095+" />+<path d="M93.3476 114.0095+L93.4685 113.9491+" />+<path d="M93.4685 113.9491+L93.5290 113.8886+" />+<path d="M93.5290 113.8886+L93.5895 113.7676+" />+<path d="M93.5895 113.7676+L93.5895 113.4652+" />+<path d="M93.5895 113.4652+L93.5290 113.3443+" />+<path d="M93.5290 113.3443+L93.4685 113.2838+" />+<path d="M93.4685 113.2838+L93.3476 113.2233+" />+<path d="M93.3476 113.2233+L93.1057 113.2233+" />+<path d="M93.1057 113.2233+L92.9847 113.2838+" />+<path d="M92.9847 113.2838+L92.9242 113.3443+" />+<path d="M92.9242 113.3443+L92.8638 113.4652+" />+<path d="M94.7990 114.0095+L94.0733 114.0095+" />+<path d="M94.4361 114.0095+L94.4361 112.7395+" />+<path d="M94.4361 112.7395+L94.3152 112.9210+" />+<path d="M94.3152 112.9210+L94.1942 113.0419+" />+<path d="M94.1942 113.0419+L94.0733 113.1024+" />+<path d="M95.8875 113.1629+L95.8875 114.0095+" />+<path d="M95.5851 112.6791+L95.2828 113.5862+" />+<path d="M95.2828 113.5862+L96.0689 113.5862+" />+<path d="M96.5527 113.3443+L96.9761 113.3443+" />+<path d="M97.1575 114.0095+L96.5527 114.0095+" />+<path d="M96.5527 114.0095+L96.5527 112.7395+" />+<path d="M96.5527 112.7395+L97.1575 112.7395+" />+<path d="M97.6413 113.9491+L97.8227 114.0095+" />+<path d="M97.8227 114.0095+L98.1251 114.0095+" />+<path d="M98.1251 114.0095+L98.2460 113.9491+" />+<path d="M98.2460 113.9491+L98.3065 113.8886+" />+<path d="M98.3065 113.8886+L98.3670 113.7676+" />+<path d="M98.3670 113.7676+L98.3670 113.6467+" />+<path d="M98.3670 113.6467+L98.3065 113.5257+" />+<path d="M98.3065 113.5257+L98.2460 113.4652+" />+<path d="M98.2460 113.4652+L98.1251 113.4048+" />+<path d="M98.1251 113.4048+L97.8832 113.3443+" />+<path d="M97.8832 113.3443+L97.7622 113.2838+" />+<path d="M97.7622 113.2838+L97.7017 113.2233+" />+<path d="M97.7017 113.2233+L97.6413 113.1024+" />+<path d="M97.6413 113.1024+L97.6413 112.9814+" />+<path d="M97.6413 112.9814+L97.7017 112.8605+" />+<path d="M97.7017 112.8605+L97.7622 112.8000+" />+<path d="M97.7622 112.8000+L97.8832 112.7395+" />+<path d="M97.8832 112.7395+L98.1855 112.7395+" />+<path d="M98.1855 112.7395+L98.3670 112.8000+" />+<path d="M99.3346 113.3443+L98.9112 113.3443+" />+<path d="M98.9112 114.0095+L98.9112 112.7395+" />+<path d="M98.9112 112.7395+L99.5160 112.7395+" />+<path d="M99.9998 113.5257+L100.9675 113.5257+" />+<path d="M101.9956 113.3443+L102.1770 113.4048+" />+<path d="M102.1770 113.4048+L102.2375 113.4652+" />+<path d="M102.2375 113.4652+L102.2979 113.5862+" />+<path d="M102.2979 113.5862+L102.2979 113.7676+" />+<path d="M102.2979 113.7676+L102.2375 113.8886+" />+<path d="M102.2375 113.8886+L102.1770 113.9491+" />+<path d="M102.1770 113.9491+L102.0560 114.0095+" />+<path d="M102.0560 114.0095+L101.5722 114.0095+" />+<path d="M101.5722 114.0095+L101.5722 112.7395+" />+<path d="M101.5722 112.7395+L101.9956 112.7395+" />+<path d="M101.9956 112.7395+L102.1165 112.8000+" />+<path d="M102.1165 112.8000+L102.1770 112.8605+" />+<path d="M102.1770 112.8605+L102.2375 112.9814+" />+<path d="M102.2375 112.9814+L102.2375 113.1024+" />+<path d="M102.2375 113.1024+L102.1770 113.2233+" />+<path d="M102.1770 113.2233+L102.1165 113.2838+" />+<path d="M102.1165 113.2838+L101.9956 113.3443+" />+<path d="M101.9956 113.3443+L101.5722 113.3443+" />+<path d="M103.5679 113.8886+L103.5075 113.9491+" />+<path d="M103.5075 113.9491+L103.3260 114.0095+" />+<path d="M103.3260 114.0095+L103.2051 114.0095+" />+<path d="M103.2051 114.0095+L103.0237 113.9491+" />+<path d="M103.0237 113.9491+L102.9027 113.8281+" />+<path d="M102.9027 113.8281+L102.8422 113.7071+" />+<path d="M102.8422 113.7071+L102.7818 113.4652+" />+<path d="M102.7818 113.4652+L102.7818 113.2838+" />+<path d="M102.7818 113.2838+L102.8422 113.0419+" />+<path d="M102.8422 113.0419+L102.9027 112.9210+" />+<path d="M102.9027 112.9210+L103.0237 112.8000+" />+<path d="M103.0237 112.8000+L103.2051 112.7395+" />+<path d="M103.2051 112.7395+L103.3260 112.7395+" />+<path d="M103.3260 112.7395+L103.5075 112.8000+" />+<path d="M103.5075 112.8000+L103.5679 112.8605+" />+<path d="M104.1122 114.0095+L104.1122 112.7395+" />+<path d="M104.7170 113.5257+L105.6847 113.5257+" />+<path d="M106.5313 112.7395+L106.6523 112.7395+" />+<path d="M106.6523 112.7395+L106.7732 112.8000+" />+<path d="M106.7732 112.8000+L106.8337 112.8605+" />+<path d="M106.8337 112.8605+L106.8942 112.9814+" />+<path d="M106.8942 112.9814+L106.9547 113.2233+" />+<path d="M106.9547 113.2233+L106.9547 113.5257+" />+<path d="M106.9547 113.5257+L106.8942 113.7676+" />+<path d="M106.8942 113.7676+L106.8337 113.8886+" />+<path d="M106.8337 113.8886+L106.7732 113.9491+" />+<path d="M106.7732 113.9491+L106.6523 114.0095+" />+<path d="M106.6523 114.0095+L106.5313 114.0095+" />+<path d="M106.5313 114.0095+L106.4104 113.9491+" />+<path d="M106.4104 113.9491+L106.3499 113.8886+" />+<path d="M106.3499 113.8886+L106.2894 113.7676+" />+<path d="M106.2894 113.7676+L106.2290 113.5257+" />+<path d="M106.2290 113.5257+L106.2290 113.2233+" />+<path d="M106.2290 113.2233+L106.2894 112.9814+" />+<path d="M106.2894 112.9814+L106.3499 112.8605+" />+<path d="M106.3499 112.8605+L106.4104 112.8000+" />+<path d="M106.4104 112.8000+L106.5313 112.7395+" />+<path d="M107.7408 112.7395+L107.8618 112.7395+" />+<path d="M107.8618 112.7395+L107.9827 112.8000+" />+<path d="M107.9827 112.8000+L108.0432 112.8605+" />+<path d="M108.0432 112.8605+L108.1037 112.9814+" />+<path d="M108.1037 112.9814+L108.1642 113.2233+" />+<path d="M108.1642 113.2233+L108.1642 113.5257+" />+<path d="M108.1642 113.5257+L108.1037 113.7676+" />+<path d="M108.1037 113.7676+L108.0432 113.8886+" />+<path d="M108.0432 113.8886+L107.9827 113.9491+" />+<path d="M107.9827 113.9491+L107.8618 114.0095+" />+<path d="M107.8618 114.0095+L107.7408 114.0095+" />+<path d="M107.7408 114.0095+L107.6199 113.9491+" />+<path d="M107.6199 113.9491+L107.5594 113.8886+" />+<path d="M107.5594 113.8886+L107.4989 113.7676+" />+<path d="M107.4989 113.7676+L107.4385 113.5257+" />+<path d="M107.4385 113.5257+L107.4385 113.2233+" />+<path d="M107.4385 113.2233+L107.4989 112.9814+" />+<path d="M107.4989 112.9814+L107.5594 112.8605+" />+<path d="M107.5594 112.8605+L107.6199 112.8000+" />+<path d="M107.6199 112.8000+L107.7408 112.7395+" />+<path d="M108.9503 112.7395+L109.0713 112.7395+" />+<path d="M109.0713 112.7395+L109.1922 112.8000+" />+<path d="M109.1922 112.8000+L109.2527 112.8605+" />+<path d="M109.2527 112.8605+L109.3132 112.9814+" />+<path d="M109.3132 112.9814+L109.3737 113.2233+" />+<path d="M109.3737 113.2233+L109.3737 113.5257+" />+<path d="M109.3737 113.5257+L109.3132 113.7676+" />+<path d="M109.3132 113.7676+L109.2527 113.8886+" />+<path d="M109.2527 113.8886+L109.1922 113.9491+" />+<path d="M109.1922 113.9491+L109.0713 114.0095+" />+<path d="M109.0713 114.0095+L108.9503 114.0095+" />+<path d="M108.9503 114.0095+L108.8294 113.9491+" />+<path d="M108.8294 113.9491+L108.7689 113.8886+" />+<path d="M108.7689 113.8886+L108.7084 113.7676+" />+<path d="M108.7084 113.7676+L108.6480 113.5257+" />+<path d="M108.6480 113.5257+L108.6480 113.2233+" />+<path d="M108.6480 113.2233+L108.7084 112.9814+" />+<path d="M108.7084 112.9814+L108.7689 112.8605+" />+<path d="M108.7689 112.8605+L108.8294 112.8000+" />+<path d="M108.8294 112.8000+L108.9503 112.7395+" />+<path d="M109.9179 113.5257+L110.8856 113.5257+" />+<path d="M111.3089 112.7395+L112.0346 112.7395+" />+<path d="M111.6718 114.0095+L111.6718 112.7395+" />+<path d="M112.4579 112.7395+L112.4579 113.7676+" />+<path d="M112.4579 113.7676+L112.5184 113.8886+" />+<path d="M112.5184 113.8886+L112.5789 113.9491+" />+<path d="M112.5789 113.9491+L112.6998 114.0095+" />+<path d="M112.6998 114.0095+L112.9417 114.0095+" />+<path d="M112.9417 114.0095+L113.0627 113.9491+" />+<path d="M113.0627 113.9491+L113.1232 113.8886+" />+<path d="M113.1232 113.8886+L113.1836 113.7676+" />+<path d="M113.1836 113.7676+L113.1836 112.7395+" />+</g></g> +</svg>+ </div>+ </div>+ <aside>+ <div class="ah"><span class="atitle">Pins <span class="acount">4</span></span><input id="q" placeholder="Filter…"></div>+ <div class="pins" id="pins"></div>+ </aside>+ </main>+ <footer><span class="it"><span class="k">MFR</span><span class="v">Melexis</span></span><span class="it"><span class="k">PKG</span><span class="v">mlx90614esf-bci-000-tu</span></span><span class="it"><span class="k">PINS</span><span class="v">4</span></span><span class="it descit"><span class="k">DESC</span><span class="v">Digital IR thermometer, 3 V, 5 deg FOV, gradient compensated, SMBus / PWM, TO-39 4-lead can. 2-column symbol, pins group…</span></span></footer>+ <div id="tip"></div>+<script>// viewer_core.js, the ONE symbol-viewer engine, compiled into BOTH the live+// adom-symbol app (SymView) AND the standalone embed export. Neither file should+// reimplement pan/zoom or pin-hover; they call into here so they can never drift.+window.AdomSymViewer = (function(){+ var ZOOM_K = 0.0022; // wheel sensitivity (lower = gentler). The feel.+ var MIN_SCALE = 0.05, MAX_SCALE = 60;++ function clampScale(s){ return Math.max(MIN_SCALE, Math.min(s, MAX_SCALE)); }++ // Device-independent wheel zoom: normalize deltaMode + cap one notch, then hand+ // the pointer-anchored factor to the host's zoomAt(cx, cy, factor). This is the+ // exact math the app has always used, the embed now shares it verbatim.+ function attachWheelZoom(el, zoomAt){+ el.addEventListener('wheel', function(e){+ e.preventDefault();+ var d = e.deltaY;+ if(e.deltaMode === 1) d *= 16; // lines -> px+ else if(e.deltaMode === 2) d *= el.clientHeight; // pages -> px+ d = Math.max(-50, Math.min(50, d)); // cap one event's contribution+ var r = el.getBoundingClientRect();+ zoomAt(e.clientX - r.left, e.clientY - r.top, Math.exp(-d * ZOOM_K));+ }, { passive: false });+ }++ // ---- shared pin-hover engine (glyph pairing + hit-box geometry) ----+ function norm(s){ return String(s || '').replace(/[~{}]/g, '').trim(); }++ // Pair each invisible <text opacity="0"> with the visible <g class="stroked-text">+ // glyph that follows it in document order (handles rotated top/bottom pins).+ function glyphLabels(svg){+ var out = [], pending = null;+ if(!svg) return out;+ svg.querySelectorAll('text, g.stroked-text').forEach(function(n){+ if(n.classList && n.classList.contains('stroked-text')){+ if(pending){ var k = norm(pending.textContent); if(k) out.push({ k: k, group: n }); pending = null; }+ } else if(n.getAttribute && n.getAttribute('opacity') === '0'){ pending = n; }+ });+ return out;+ }++ // Build one transparent hit-rect per pin label (number + name), matched to each+ // pin's glyph by proximity to the pin tip (so duplicate names resolve to the+ // right pin). Rects are appended to `svg` in user space so they pan/zoom with it.+ // pins: [{number,name,x,y,angle,length,...}]+ // offset: {x,y} symbol->svg-unit origin (state.offset)+ // NS: the svg namespace+ // cb: { enter(pin,ev), move(ev), leave(), click(pin,ev)? }+ // Returns { textMap } so the host can highlight a pin's glyphs on demand.+ function buildPinHits(svg, pins, offset, NS, cb){+ var textMap = new Map();+ if(!svg || !offset || !pins || !pins.length) return { textMap: textMap };+ cb = cb || {};+ var gl = glyphLabels(svg);+ gl.forEach(function(o){ if(!textMap.has(o.k)) textMap.set(o.k, []); textMap.get(o.k).push(o.group); });+ var labels = [];+ gl.forEach(function(o){ var b; try { b = o.group.getBBox(); } catch(e){ return; }+ if(!b || !b.width) return;+ labels.push({ k: o.k, box: b, cx: b.x + b.width/2, cy: b.y + b.height/2, used: false }); });+ function pick(k, ax, ay){ k = norm(k); var best = null, bd = 1e9;+ labels.forEach(function(l){ if(l.used || l.k !== k) return; var d = Math.hypot(l.cx - ax, l.cy - ay); if(d < bd){ bd = d; best = l; } });+ if(best) best.used = true; return best; }+ function addBox(b, p){+ var pad = 0.45, r = document.createElementNS(NS, 'rect');+ r.setAttribute('class', 'hit');+ r.setAttribute('x', b.x - pad); r.setAttribute('y', b.y - pad);+ r.setAttribute('width', b.width + pad*2); r.setAttribute('height', b.height + pad*2); r.setAttribute('rx', .3);+ r.addEventListener('mouseenter', function(ev){ if(cb.enter) cb.enter(p, ev); });+ r.addEventListener('mousemove', function(ev){ if(cb.move) cb.move(ev); });+ r.addEventListener('mouseleave', function(){ if(cb.leave) cb.leave(); });+ if(cb.click) r.addEventListener('click', function(ev){ cb.click(p, ev); });+ svg.appendChild(r);+ }+ pins.forEach(function(p){+ var tipX = offset.x + p.x, tipY = offset.y - p.y, L = p.length || 2.54, dx = 0, dy = 0;+ if(p.angle === 0) dx = 1; else if(p.angle === 180) dx = -1; else if(p.angle === 90) dy = -1; else if(p.angle === 270) dy = 1;+ var nl = pick(p.number, tipX + dx*L*0.5, tipY + dy*L*0.5 - (dx !== 0 ? 0.9 : 0)); // number: over the wire+ var ml = pick(p.name, tipX + dx*(L+2), tipY + dy*(L+2)); // name: inside the body+ if(nl) addBox(nl.box, p);+ if(ml) addBox(ml.box, p);+ if(!nl && !ml){ // discrete parts: no glyphs+ var ex = tipX + dx*L, ey = tipY + dy*L, HT = 1.0;+ addBox({ x: Math.min(tipX, ex) - (dx === 0 ? HT : 0.3), y: Math.min(tipY, ey) - (dy === 0 ? HT : 0.3),+ width: Math.abs(ex - tipX) + (dx === 0 ? HT*2 : 0.6), height: Math.abs(ey - tipY) + (dy === 0 ? HT*2 : 0.6) }, p);+ }+ });+ return { textMap: textMap };+ }++ return {+ ZOOM_K: ZOOM_K, clampScale: clampScale, attachWheelZoom: attachWheelZoom,+ norm: norm, glyphLabels: glyphLabels, buildPinHits: buildPinHits+ };+})();+</script>+<script>+var PINS=[{"angle":0,"color":"#66bb6a","desc":"","length":2.54,"name":"SCL","number":"1","type":"Input","x":-20.32,"y":-2.0},{"angle":0,"color":"#ab47bc","desc":"","length":2.54,"name":"SDA/PWM","number":"2","type":"Bidirectional","x":-20.32,"y":-4.54},{"angle":180,"color":"#ef5350","desc":"","length":2.54,"name":"VDD","number":"3","type":"Power Input","x":20.32,"y":-2.0},{"angle":180,"color":"#ef5350","desc":"","length":2.54,"name":"VSS","number":"4","type":"Power Input","x":20.32,"y":-4.54}], OFF={"x":100,"y":100};+(function(){+ // The symbol svg is the DIRECT child of #vp; querySelector('svg') alone would+ // grab a toolbar button's zoom icon (also broke pan/zoom before this fix).+ var vp=document.getElementById('vp'), svg=vp.querySelector(':scope > svg')||vp.querySelector('svg');+ if(svg){ svg.removeAttribute('width'); svg.removeAttribute('height'); }+ var scale=1,tx=0,ty=0;+ function apply(){ if(svg) svg.style.transform='translate('+tx+'px,'+ty+'px) scale('+scale+')'; }+ // pointer-anchored zoom with the SHARED scale clamp (same limits as the app).+ function zoomAt(cx,cy,f){ var ns=AdomSymViewer.clampScale(scale*f); var r=ns/scale; tx=cx-(cx-tx)*r; ty=cy-(cy-ty)*r; scale=ns; apply(); }+ function fit(){ scale=1;tx=0;ty=0;apply(); }+ // Wheel/trackpad zoom feel comes from the SHARED engine, identical to SymView.+ AdomSymViewer.attachWheelZoom(vp, zoomAt);+ var drag=false,lx=0,ly=0;+ vp.addEventListener('pointerdown',function(e){ if(e.target.closest('.tools'))return; /* let toolbar buttons receive their click */ drag=true;lx=e.clientX;ly=e.clientY;vp.classList.add('grab');vp.setPointerCapture(e.pointerId); });+ vp.addEventListener('pointermove',function(e){ if(!drag)return; tx+=e.clientX-lx;ty+=e.clientY-ly;lx=e.clientX;ly=e.clientY;apply(); });+ vp.addEventListener('pointerup',function(e){ drag=false;vp.classList.remove('grab'); });+ document.getElementById('zin').onclick=function(){ var r=vp.getBoundingClientRect();zoomAt(r.width/2,r.height/2,1.2); };+ document.getElementById('zout').onclick=function(){ var r=vp.getBoundingClientRect();zoomAt(r.width/2,r.height/2,1/1.2); };+ document.getElementById('fit').onclick=fit;+ // pin panel+ var box=document.getElementById('pins');+ function render(filter){+ box.innerHTML='';+ var f=(filter||'').toLowerCase();+ var shown=PINS.filter(function(p){ return !f || (p.name+' '+p.number+' '+p.type).toLowerCase().indexOf(f)>=0; });+ if(!shown.length){ box.innerHTML='<div class="empty">No pins match.</div>'; return; }+ shown.forEach(function(p){+ var el=document.createElement('div'); el.className='pin';+ var col=p.color||'#8b949e';+ el.innerHTML='<div class="row"><span class="num">'+esc(p.number)+'</span>'+ +'<span class="nme">'+esc(p.name)+'</span>'+ +'<span class="ty" style="color:'+col+';border-color:'+col+'66">'+esc(p.type||'')+'</span></div>'+ +(p.desc?'<div class="d">'+esc(p.desc)+'</div>':'');+ el.onclick=function(){ el.classList.toggle('on'); };+ el.addEventListener('mouseenter',function(){ highlightPin(p); });+ el.addEventListener('mouseleave',function(){ clearHL(); });+ box.appendChild(el);+ });+ }+ function esc(s){ return String(s==null?'':s).replace(/[&<>"]/g,function(c){return{'&':'&','<':'<','>':'>','"':'"'}[c];}); }+ document.getElementById('q').addEventListener('input',function(e){ render(e.target.value); });+ render('');++ // ── pin hover: highlight + tooltip on the SVG, parity with the live SymView ──+ var NS='http://www.w3.org/2000/svg';+ var tip=document.getElementById('tip');+ var textMap=new Map();+ function highlightPin(p){+ clearHL();+ [p.name,p.number].forEach(function(k){ var a=textMap.get(AdomSymViewer.norm(k)); if(a) a.forEach(function(g){ g.classList.add('hl'); }); });+ var m=document.getElementById('pinmark');+ if(m && OFF){ m.setAttribute('cx',OFF.x+p.x); m.setAttribute('cy',OFF.y-p.y); m.setAttribute('r',0.7); m.style.opacity='1'; }+ }+ function clearHL(){+ if(svg) svg.querySelectorAll('.hl').forEach(function(e){ e.classList.remove('hl'); });+ var m=document.getElementById('pinmark'); if(m) m.style.opacity='0';+ }+ function showTip(p,x,y){+ var col=p.color||'#8b949e';+ var h='<div class="r1"><span class="nm">'+esc(p.name||'(unnamed)')+'</span><span class="pn">Pin '+esc(p.number)+'</span></div>';+ if(p.type) h+='<span class="badge" style="background:'+col+'22;color:'+col+';border:1px solid '+col+'44">'+esc(p.type)+'</span>';+ if(p.desc) h+='<div class="desc">'+esc(p.desc)+'</div>';+ tip.innerHTML=h; tip.classList.add('show'); posTip(x,y);+ }+ function posTip(x,y){+ var w=tip.offsetWidth||260, hh=tip.offsetHeight||110, tx=x+14, ty=y+14;+ if(tx+w>innerWidth-14) tx=x-w-14;+ if(ty+hh>innerHeight-14) ty=y-hh-14;+ tip.style.left=Math.max(8,tx)+'px'; tip.style.top=Math.max(8,ty)+'px';+ }+ function hideTip(){ tip.classList.remove('show'); clearHL(); }+ // Build the pin hit-zones with the SHARED engine, the exact glyph-pairing ++ // hit-box code the app's SymView uses. The embed only supplies the tooltip.+ if(svg && OFF){+ if(!document.getElementById('pinmark')){ var pm=document.createElementNS(NS,'circle'); pm.id='pinmark'; svg.appendChild(pm); }+ var hideT=null;+ var hits=AdomSymViewer.buildPinHits(svg, PINS, OFF, NS, {+ enter:function(p,ev){ clearTimeout(hideT); showTip(p,ev.clientX,ev.clientY); highlightPin(p); },+ move:function(ev){ if(tip.classList.contains('show')) posTip(ev.clientX,ev.clientY); },+ leave:function(){ clearTimeout(hideT); hideT=setTimeout(hideTip,45); }+ });+ textMap=hits.textMap;+ }++ apply();+})();++// ── app-info header popover: interactive hover you can move into (600ms show,+// 220ms hide-grace) so the wiki link stays reachable. Per adom-app-header.md. ──+(function(){+ var SHOW_DELAY=600, HIDE_GRACE=220;+ document.querySelectorAll('header [data-tooltip-target]').forEach(function(trigger){+ var target=document.getElementById(trigger.dataset.tooltipTarget);+ if(!target) return;+ var showTimer=null, hideTimer=null;+ function show(){ clearTimeout(hideTimer); if(target.classList.contains('show')) return; clearTimeout(showTimer); showTimer=setTimeout(function(){ target.classList.add('show'); }, SHOW_DELAY); }+ function queueHide(){ clearTimeout(showTimer); clearTimeout(hideTimer); hideTimer=setTimeout(function(){ target.classList.remove('show'); }, HIDE_GRACE); }+ trigger.addEventListener('mouseenter',show); trigger.addEventListener('mouseleave',queueHide);+ trigger.addEventListener('focus',show); trigger.addEventListener('blur',queueHide);+ target.addEventListener('mouseenter',show); target.addEventListener('mouseleave',queueHide);+ trigger.addEventListener('click',function(e){ clearTimeout(showTimer); target.classList.toggle('show'); e.stopPropagation(); });+ document.addEventListener('click',function(e){ if(!target.contains(e.target) && !trigger.contains(e.target)) target.classList.remove('show'); });+ });+})();+</script>+</body></html>