From 64b38efe90acb8d649475e948dd277483f93da8e Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint Date: Sun, 19 Jul 2026 22:29:51 -0400 Subject: [PATCH] feat: add triangulate-tangents example witnessing the mikktspace contract A game engine's normal mapping lives or dies by the tangent frame: the basis must be unit and orthogonal, follow the UVs, and carry a consistent bitangent sign. This example verifies all of it on a machined buckler with three UV chart styles, against the independently derived edge/UV formula, plus the two hazards that actually bite: calc_tangents aborting on any ngon, and a MeshUVLoopLayer handle dangling across the call on 4.5 (471 phantom flips, silent exit 0) while the mikktspace math is byte-identical on 4.5.11 and 5.1.2. Signed-off-by: fOuttaMyPaint --- .cursor-plugin/plugin.json | 1 + .github/workflows/blender-smoke.yml | 12 + README.md | 23 +- ROADMAP.md | 3 +- .../assets/triangulate-tangents-hero.webp | Bin 0 -> 18278 bytes .../triangulate-tangents-contact-sheet.webp | Bin 0 -> 40320 bytes docs/gallery/index.html | 11 + docs/gallery/triangulate-tangents/index.html | 678 ++++++++++++++++++ examples/gallery.json | 72 +- examples/triangulate-tangents/README.md | 70 ++ examples/triangulate-tangents/preview.webp | Bin 0 -> 15886 bytes .../triangulate_tangents.py | 431 +++++++++++ 12 files changed, 1267 insertions(+), 34 deletions(-) create mode 100644 docs/gallery/assets/triangulate-tangents-hero.webp create mode 100644 docs/gallery/contact-sheets/triangulate-tangents-contact-sheet.webp create mode 100644 docs/gallery/triangulate-tangents/index.html create mode 100644 examples/triangulate-tangents/README.md create mode 100644 examples/triangulate-tangents/preview.webp create mode 100644 examples/triangulate-tangents/triangulate_tangents.py diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index 7382844..f24c4b9 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -80,6 +80,7 @@ "examples/swatch-grid", "examples/temp-override-join", "examples/text-version-stamp", + "examples/triangulate-tangents", "examples/turntable", "examples/uv-layer-grid", "examples/vertex-weight-limit", diff --git a/.github/workflows/blender-smoke.yml b/.github/workflows/blender-smoke.yml index 86d7bf5..13ad5ca 100644 --- a/.github/workflows/blender-smoke.yml +++ b/.github/workflows/blender-smoke.yml @@ -404,3 +404,15 @@ jobs: # deform layer, and a pinned Root mount. Exits non-zero on failure. xvfb-run -a "$BLENDER" --background \ --python examples/vertex-weight-limit/vertex_weight_limit.py -- + + - name: Shipped example - triangulate + tangents (mikktspace contract) + run: | + set -euo pipefail + # Check only (no render): a lathed buckler with polar/strip/planar + # UV charts; asserts closed-form loop-triangle count, unit and + # orthogonal tangent frames, bitangent == sign*(n x t), tangents + # matching the independent edge/UV-delta formula on smooth-field + # triangles, zero flips off seams, and the re-fetched UV layer + # surviving calc_tangents. Exits non-zero on failure. + xvfb-run -a "$BLENDER" --background \ + --python examples/triangulate-tangents/triangulate_tangents.py -- diff --git a/README.md b/README.md index ab4aaac..9fcfdda 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@

- 12 skills  •  6 rules  •  2 templates  •  17 snippets  •  26 examples + 12 skills  •  6 rules  •  2 templates  •  17 snippets  •  27 examples

@@ -36,7 +36,7 @@ ## Overview -This repository ships **12 skills, 6 rules, 2 templates, 17 snippets, and 26 runnable examples** for Blender Python development targeting Blender 5.1 (current stable) with Blender 4.5 LTS fallback support. +This repository ships **12 skills, 6 rules, 2 templates, 17 snippets, and 27 runnable examples** for Blender Python development targeting Blender 5.1 (current stable) with Blender 4.5 LTS fallback support. The content is consumed by AI coding agents (Cursor, Claude Code, any MCP-capable client) when working on Blender add-ons, geometry nodes scripts, batch pipelines, or animation tooling. There is no build step. Edit the markdown and Python files directly. @@ -472,7 +472,7 @@ round-trips through the raw `POINT` buffer.

-Game asset pipeline — 3 examples +Game asset pipeline — 4 examples @@ -525,6 +525,23 @@ boots really carry five influences, no vertex ends over the cap, weights still sum to one, the pose survives pruning, and the modifier is still exact linear blend skinning read back from the mesh's own deform layer. + + + + +
+Triangulate and tangents: a machined steel buckler on a dark cradle - brushed grooves circulating the boss with an anisotropic sweep - proving the mikktspace tangent field a normal map depends on + + +### [triangulate-tangents](examples/triangulate-tangents/) + +The normal-mapping tangent-space contract: deterministic triangulation +(`calc_tangents` aborts on any ngon), unit orthogonal tangent frames, +`bitangent == sign * (n x t)`, and mikktspace matching the independent +edge/UV-delta formula on smooth fields. Documents the planar-on-cylinder UV +degeneracy (tangent collapses onto the normal) and the stale layer-handle +hazard that silently corrupts measurements on 4.5. +
diff --git a/ROADMAP.md b/ROADMAP.md index f4ffecd..bc03253 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -106,7 +106,8 @@ Not committed; target list for the next content version. (v0.3.0 shipped the smo - ~~glTF export round-trip witness~~ **SHIPPED** as `examples/gltf-export-roundtrip/` — `export_yup` bakes `(x,y,z)→(x,z,−y)` into vertex data with no node rotation (probed identical on 4.5.11 and 5.1.2), `export_apply` ships the evaluated mesh (one disk vertex per evaluated loop), TEXCOORD_0 is V-flipped on disk, per-triangle material bindings survive; exporter/importer RNA signatures byte-identical between 4.5.11 and 5.1.2 (guarded against future renames); `Mesh.calc_normals()` removal on 5.x surfaced during authoring - ~~LOD decimate chain witness~~ **SHIPPED** as `examples/lod-decimate-chain/` — Decimate COLLAPSE evaluated through the depsgraph is non-destructive (obj.data keeps closed-form counts), evaluated tris hit `ratio × base` within 5% (measured 0.0–0.44%), silhouette bbox survives within 1e-3 (measured 7.7e-6); a stacked Decimate halves the effective ratio, an aggressive 0.02 ratio collapses the nose tip — both caught failure modes - ~~Vertex weight limit witness~~ **SHIPPED** as `examples/vertex-weight-limit/` — the 4-influence engine cap enforced via the data API (`v.groups` + `VertexGroup.remove` + renormalize); unit sums (measured 3e-8), pose preserved (4.9e-3), exact LBS from the mesh's own deform layer (2.7e-7), Root mount pinned -- Triangulate + tangent-space witness: `mesh.calc_loop_triangles` + `calc_tangents` producing the deterministic loop topology and orthonormal tangent basis a game engine's normal mapping depends on — the fourth direction of the game-pipeline arc, identified but not built +- ~~Triangulate + tangent-space witness~~ **SHIPPED** as `examples/triangulate-tangents/` — `calc_tangents` aborts on any ngon (back cap must be an explicit fan); mikktspace matches the edge/UV-delta formula within welding tolerance on smooth fields (2.3e-6 measured); planar UVs on a cylindrical wall collapse tangents onto normals (dot 0.998); `MeshUVLoopLayer` handle dangles across `calc_tangents()` on 4.5 (471 phantom flips, silent exit 0) while the mikktspace math is byte-identical on 4.5.11 and 5.1.2 +- UV-handle lifetime snippet: re-fetch attribute/UV layers by name after any CustomData-reallocating call (`calc_tangents`, `VertexGroup.add`, modifier edits) — held handles dangle silently on 4.5, survive by luck on 5.1 (found authoring `triangulate-tangents`) - glTF skinned-mesh export witness: follow-up to `gltf-export-roundtrip` + `vertex-weight-limit` — export a rigged mesh (weights + joints) to glTF and round-trip the skin, asserting influence counts and joint bindings survive the format - Degenerate-bevel weld hazard (snippet or rule): bevel width ≥ half a box dimension creates zero-area faces whose loops weld on glTF export (found authoring `gltf-export-roundtrip`, where the count check caught a 36-vertex weld) - GAMMA_CROSS blend-curve witness: the cross blend is not the naive linear mix (mid-cross measured (0.341, 0.349, 0.463) from crimson (0.85, 0.10, 0.22) and teal (0.06, 0.75, 0.80)) — derive and assert the gamma-space closed form per frame; follow-up to `vse-cut-list` diff --git a/docs/gallery/assets/triangulate-tangents-hero.webp b/docs/gallery/assets/triangulate-tangents-hero.webp new file mode 100644 index 0000000000000000000000000000000000000000..58d434e308e31b421dca93ae6af7acdca7dbc21f GIT binary patch literal 18278 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 literal 0 HcmV?d00001 diff --git a/docs/gallery/contact-sheets/triangulate-tangents-contact-sheet.webp b/docs/gallery/contact-sheets/triangulate-tangents-contact-sheet.webp new file mode 100644 index 0000000000000000000000000000000000000000..d1eb493bc861e1e6bdbb25c5e0ee57e1bfeefc00 GIT binary patch literal 40320 zcmV)AK*YaNNk&F^od5t=MM6+kP&goLod5tZ@B*CyDgX*-0X|VCkw&AUDkh^4sUbiL z31@Eqyg5szHEfz3GQz#l?|eS#QrjgZ@+ZbK47} ze4_fN;yru6t>Q<=|JCyE_7CU3@PC>7*!jQy+xDm3U+Itjf95}b{(-+-|787ee{g-_ ze}w;&>Oc0c_Xpn_{?Dv$_r9b*;J@+z|MvLxar7+x()98D>G*;D)BWG~JpXzB|Fg5D zpSK_Ey*PP&`#%kQIpm&Slw$I z#@ygw^x{X=@RxB(Av#J1-Fr&t(>&#OO$0!W@bqnu*toO6!b|8fRBc26(=G-D?|wf?P%3DNP>0kJDm3dl9exY1yJuNba1@;;ZpqbtQwnmx@l`~Kg-G~V5O&3C z-g0$m{@BqOq}Vp$Wae1wTXvXQi0ExqMyCank?O1;;Q{ z5N4BcXskF4&lSeVAX}{-$#`bqinex=6kWam00!ou9_5rG$Iu zXsN!Ls8CEW$2bxt5!@wKlc^H%?I$r7Vp}=q6W_>(xjVHUKo6ngJ=?#_ZbwamUn6-5 zT>hj4X&2RXc_80L0>JEEoGv&LG>MA02VuLftt;)!`F)VKQM!*s4PhEzOCUV?SCp%vkIH+fX;fG*`1qwS!w?iXK)*N^}ztPGuvLqrvuwQ{+** zDDu6Fk3e07b*2o#rhwBxX`E(_s@F?XcIBlw)n!ZDqk1LwMv{|;a@h4?2Dx{uH(??S zS1baqxuzG|$WPg%k2?*rC-h5MnvRsKwk8n}E61CX6tS@R4PQk}X!PHki}Nn);<#1z zN8ZGe(QA@!t63QCsBY~32#ryabd{!(5)W0U?sug&+%xaK);0HSZ#--A+9L_o2;Rr9 zKRfyD;ksnZhbYe0GIT(7;AtMeT+$knoJQB?Zbc!7t@WpcQRsU1vnkj0SuCwV=UR3r ze#^C3k%lAJq>*kWH?B&P(Tbz&X4<5=0lL)6p|rB-$$?y#wO%!c4TC~Bu-V#5tn)>F zj9fzkz)T*Qy7OGg9nr@7epQIMTHYSI`_QET2RZz5{c$@P`U61zDKIwVO!;>a4Q8>k zOiR;1Sq7qkc!*f=O6|Hn7~VZ*gxuhQINHbiCHvyEBg)5ff4w+V?~ z|K{36h%D9rEkPIM!rNzzO_Tk9l%fyMW!!`p+POFDjYUWPnfDXW#Gn8FL(Vmu`2RNN z=ezIyc6&8VTUz+(3VXN<;eF%d?d$Yhz!GIDoJ}>D9Ww$5Ox)Tpu*p@E*zYM-q^ito(V;a1Lhf+Nq-kR8Y@eQr%!R#ad0xjqQ{NAWMc9g=gy- z=Pd2bLUL4as3`SvBfobNPU{-Ijv+35J;}l5`(J@0zGu|!K`$}L*L1bu<@PK-$t8*k zr(*@t#QOhU_chbdVd=z*Th)Rt-#pZ3-Y~Q=4w$5{lhMK7^zE{{y=DZ`!pTC-p*Dzj zkmxr0vCdkWcpR?Ud>^w>aZ`W(MkW2OJ|oJmTDwWUIr?CE=rCc!L$CR9XTd1fjXCsT zs%DZ+GKaH8mf>1aoKX+=LC-h9!Caqd&ab*nVZ&h1ji_~s+O~-p6s;?W(Ul*|U(r;D zd#%@MAAIn^s;{2uMOAcjj(11 z-LyR1Yt~N;sM9x@QS#A0_#0C?jV8gNo@4bYhIe=azk8)@X^I8*Y`UT+3n-DE*2x1j zFM?D0w}FGxx>=%*#1yMBUA<%6Vd&U19|g|C8%~nkRwww+A8ngVWSSvEg-yacJ=}l@ zVQmLtC1s#88v`E8cN;#TsXTH6vAV^=@Kf^x42|FP0kV_j41bX0*4f5#uadJlKc&k3 zD^?sf4G7}HT^>=d3?-zRWRXjZz>O_2+e_CgOYT}VkIL@)565C}s+)l0J;uw>zdIId znMY&^Z{5L?DCQ6AqGK_rNLxs4n*chW9*1|DpeFHv12I_5ME*#Huc$AQv^wzhr(o<$ zO26Lxt|$w}Y7JaG2PX$FgEX5NV!shIxS??wvn13@@MM#Onde-$ax{xsg~e5U76fy$ zIM55^auuI9{+(`UiT1W#kmC^V1q=SjwI zE+T>7bDS{ivNrZV^vr)i_~pKnQl9$&n4+x&Wsdy-G}g#o@Ali+P!FNobXz_lOK~e1 z%`z+1n3@HGve9-a4iogv}G*qED57m)3eJfx`I4dz^QjD@dSEuM8it1)@zPJGNJvRxtbsg2`) z>C_-S5zNoi0gt}h?hEDETkVo=Od1fi7=|!ba#sWiWTZ~n$y!4rn)?X-N>U|8>uzSl z`V|#{`lEDcZ5=me?7xn4;SNq9kb&I17e>0MyothqgHj6ypwL!FjP-GG-a+$TZtUhu zLQnCi4q@07zjbPo%>mJ}sKboTG@PUZUYmT+XADqzK=-fKwoB~1qf#pDJhAaF%povl z4KxKBfM~dJUnsJz{ckO$X&c03_iZmw7AajTq$Uj{hNy*3_xuYEorkYraU(IcmVVR5a>~v64SzpQ@q%Qo{)!fZ zVQx37ivZu9 z$)m9^=^jKxsNK)o$ojvJ%pQ>TdcU}_g`e_uD#u_`=Dm<8Vynj2-#R;95LszvgHcZO zV8X2pO?_~C){R&EEK=4Vb;AXqD8gwU+dB#lSo&JwzlYWPBREhmEv&j$#k|9>#_(?b z5)fVa0~g_7(Y}n{S)DzNww0vIEQ7~ikyu;i{|@7c61|1-NnM)@_pE`=!vJb`Ie=)%QuNgFJrV5sMOBMvS@z89m!e z)CG!HO6dhyxjm>+txO*b+)p_TO}-IRa9+4_UG13Mm9V+!d>-fA2Q7F6m?Swg{{SDl z8*20{Qo3C>Tsu*=`Rpv;WL-2Gzv0%wwI_26t0!TXv?GAb%IM@>5*CI zaPOqt8y7b~#2j}A#=O{Ww>m18f@lM_nHu_Od`AK&VigrpU{yTO z5r07jx)xXN-GA1N?|Gw4SUZb5j$kN6K*^6z3qB5eMk4+GT4}_S*BgEJ{^JFb!$%S) z^xfu#r)O7Ie8$zH3+ot=^L>}ne&Ut7bGmm<^_pfCh*pn>72OVy@#9!Aw7#-dcJ8T4StQZkK@YXcM9WY@Kcc6 zl5@~?uI}=!HdwWF*?l`-j<>j66YjzkF8TstXpr z)%-m>^izZyzC850+OxAj&zt^>5OO09W2U*d4m#`O?B9q5T&4>*H!TkUgORXF4}y>R z_l&Odtg&wM38B~BYe$>??yvmg!B__V2ZI~TA|b1+gzWYG3_C=(F-jX&BRh>Jrz96< z0A>KOyZ7JVbkWgNf!2hdd1}pjRa!-4u)-oJshAaRq$@7aH%AP>TK+1*>+)uFyB&Sw58?z*t$fJQ{59Cb4fp_4x#>@YmGhksf#gfE zMPqaFmCxwS|NoJf``Juz_*45Bpn(M9T0?0UX`#NwE+cHn>hU3>BhH@QUItC6BWgib z4nw#th^FtB2(!QB7wV0jp3$r8&wDz*;w5r#p$K6*y_O!$fbV^oz*;d9rFxnQuwnjg*)o;x@U3#jjAKY0oTyG)U@Bqbh1^!1-~}U1y5d5?xAm;nejz#x+!)5Riy#0M?jr`WL31wOH{k~ z3THU%QV)-RBx+DYW@J%iLIJ(xK)AK3fI5SW$q9&FC2}{k*qDHd_CiBJiu&|HRW8l{}2kCK)<;)_htLAyv}$tTNtGS(A|Cijt!|wgo?8?sqlYe_=`qMJBLCNkmcN# zc_*pr(&g{jsDmP$a^sjedgXB==xs#6RYLZ$B=)D!J=mhqpL`ZqTn5m6>A6z|4}avd z{g`c0D)G^F%y0sXA8%S*j&TV)Z*fJ9a9N#H(Xf7fo?Rzbb^)xs1+0{EgHkMwCf~kJ z(J0UQ^!6mq2AxwV$dTH;6hVrScLB@njTfu%Y6(67J?BZ`cq`}lEDfy4G(W=?DP(LZ z>>!9JYeaaf3IjKDHyZB%k6RUddqhfu@xtlCRwj%sKou?xai4c?-${nQlq;alJ zfztNeLI*p^q_3|$-~8kv#bI!GtmQ8pDNLL(DxuUDgI;$(*2dq)dk>|@0#$TY2}>uz+fSsog0u%k)*F-vsZX8XrJa< z`JcXrPISRzj!m1elIhl|k)PD(3R1eYF4?x%;!{mYP5Y`?5w8kYVRLQ1nB3mm3Wp_9 z&emfS)lP?xs^A2Dnf%)kt`1<~M^Tfed!CxNl?evfId!|3n`T0BI{$ZIK5#s&oK$b> z3$VWb@EuWG9eg`T6gWS@?Xb_q?@JmB4IndmT`o*3fKKIgK#xP_48zjUu{yFxQ%_V^ z7jPWD$kJ^y@0polzYU5D`i6$q7Oz8f`MDxgZoe`7KPmy}LX8#!@L3W!mk^$G;hj5| zA8y9!bJW(*Ylo8#U9#{=fKeww@|?gKACwdh+I`xuEWXKf&k_G+(;hfG|NsARV%lu; z?BE)x6m=h+Ec|N9_%=C*rc%qNLMWLqdUxUOOb19l7nTJYZf}?pz=+g7{62@c!p=g7 zvh4Y0=p&vz!b*@;SwVD{b@{m=!Q%c$Tj|0)!R_jYYj{06@Pb;?*)juh)x4iPiBKp$ zX2kteqL@cXh6FGcez&{i&h-SnW0dbPgYW+P0tS9)ew%UN_7dFDdZ4TQ1$LMip=PE` z@E)zZa+~__xizeAwT;%Y*jz9%fB^pc3TtC)Am0Of+4cqBF-&~FKi5!b@(j%X1ay8S zrn__7s`NAOzH;>g6<8$LgqxxH1yhXfGOV63)v&iV^B~XyCd?ena&t!~=3RX_VfFX(_;5fieBx zu0lq~#9F*IQu2_gm)n|WtdcfA?%y`GpF>Oo#1!{$w`_vavBJXss_Yb-Vl;K+1BGBM zE2-pxZQV|7#D~}&;4E}4lY))Ut8D8Pdn`QEPS0!S`;ydeAQ`F6rXUOLkLlCk=0w_4V?8ASP7 zW_bZN36xKxqoAGJ{QVgXYgdg5$Djq2NuQ%0u^u!0SDXRCk@xla_$wk6`&`^Gxm}S!%!`Yo`JDV`EYPh zeu)xhvA86>Q}VfZeR5Mq(>QpJ#KJ!)tK~dJ{f5-Ki=I3oHj~%WW}y!+W)Qa0Jf_pO z;UctM0snlis_-Mn+v^HNNBE)PP1l~7QYU)z#oiV+tUL(1yRd?PfknXx3QTkx&Hk=) zM$*bG7Ng`o$XVWCNs1>$DpCAan-K^UHxn%cutk#0?Z)3z={X8{r6X_V98%5=l5ayg zh9CRTcWh`Ki=~xc@c29)VSoW_3W7TN7}rTYW~SoQfqU1Z~tcNZ=7> z(zO=B>}JI|sWlffN=@YSLLdNPjcV1|VU`tap{-VA3z={*-m-*};PtyMHYfq*LV~fy zuQ)O|`slP5kuU7k_=2WBf8xVA*nMZOh06xL90=~DOR3;JXDhxt%>32L9h~YE=g!3R zO?Z?RISnUQtj2#SH%IK|qTP9JsJwfYrl|}1`16oIgRiGl{7{5i`>bxY{rlupqgwiT zkqb>^?Lr5f`a?%l@JRj8!xunbvt;{kw)Zv7Pl!LzH7gP>uf0atW7-UA`W~StZ990g ztga+OCy^Ll*vD}GTY$yUpIpuO^-DtvuXLYQy{ne|N0tbZsq6Rlw*tBfvC+lp8p9T` zozBkve{Q~S^c{-qbh8C<;8SoHnVb{=h^XvzP0)BE^fpToO`z9-AIr!Ldu)BO;RhPc zu*DX+>FVM2ntneadR5Cu<9I$~Wd{dsdUoj}3@0ixrBt`_B6NzX6$HyqeM9}4Zk3n}a!Qvip2O^WAqLXh) z;y0Z=h;dlmx>lKk=Ewj500jTzg*__MXxL%O(e3ZG7ap2sGNV)Nf!*C@RAHh}LXR<0 z>Y4s_1?ooM4ZMM=@w=$yx``0rklyuHtbpo2w^yv8;wq1_#qUmedd=EV`uPTzWYBZBBMgmnl9Vpu@1?p|r{)Aohf$GT!T^g+vWv&5HF$Qvlj0~Be&6-qqI7+X zZVoUjNA|FSYJ6wvdQ7i_brTvD2j%37N0dKU(RvUdugQFDTl>c0OB_Z?8H?A(^J=_E z>o(>fGSq?}#cfl1a<31)dOyl_qm5!WfLrCAYVe(w*{71mH$Ooe-ohlf-JEI&_qRVu zBg_8eq#ut>X)IxJ)~^~!>JJ|`E5;f)!u3B{^vnQz0VwTBZe%itH9&gzsy}v44VBIt zhKOJy>8{m~15Uzkl%odww1QM<2V$Ql&kOJ9yll*FNSQf)-HX;RRrdusjP!la8schL z9UY`ktmrdU)C#cgai7c!!Tj$fTeD>79|#X*k)3of$KJWrQI&gAqNeryoJnKv36hG; z-9Y?yM24b0g|13Z*2>e?bo{b6-%c=7&9E0F2wFc;4Quh7OlU|Hbo``Q2O-}3>SWZJ zo;&(TCN>l4(fqJ=UwSHcaYZ+OX`mtUTlvzr*E0`n*yT2NW(W`%10*SxeSOs7jkm56 zC2TmM=xhocb|q`F%qN#;z>Jm06OjYUHi5duF7cjqv=?qnp3y1;fP?|SiwvF55(PxI z-u)8wuc|pvuEmBKwfrjW*o~Wmn^A%u5AchSgl7{=NDlzG%EOeWg_7xmp3k5s;;X3BigA3&7t#`t<#=W9-F%|Krxm-qf zpi4plY0kL>+8={$p!5p86SN>?0;c(8REJkYxxbR@`IxpTgxwTQrVrDuovO9CjoWw3 zHIXjD4A&u8tL_91Er0ka5U4U_RWqpl373d-ze)m-9152LwdYT|LO>FYUzk#m(E7xN zw+zi5OEZ5drR2x$vTMJ(gX#Y$gjv!?1SP1p{_8Th~!aU#|;u4&haqRzufq7l(l67K6uL z;cVl|CE%yGsMkVUNbN@hQ|hJNGY&d-D&y=-I95kIjy(yL_V3k!3&%Rp(+KbHVR+`i ztHk-xIYO$*RQJXXEmF{wj|7nM(4lq!`;Q?eHfXlvJQ&o4LY)ia5cOX@k;#>MvtF+_ zy4^1|=&sGNbbBU!|6_sB(eZZF_SL3Plr>YJrjVd0R<+n1$HgR=65*YrxmWO?a_RS8 z`{=RF!~jK9MS`H22%)<7?d$LCMggtfA?M2D2SV|NF=L_sST>Ky!`I|=BPc)Qn3cN^ zLv`d5u2$Bb;=e~H9&ZxgCaziSZ#e}D3$*sxTf0;~nQp+r+CBzhtoLvFwbDT2%b5DG=ew|Jzi8A&ow- zl?jPeI@Swcn((`zOjDyQO5`{5=(FSs@0v4xArOY&$;yPEIb%dzgP>s5k_0@w@b{=D zOz9DZYUMrpdTm+=-L)*q&)cux$+*mso#xt}lrOMN)6iN_nl7Vg__TxQRf&YfOR!=< zv}XMIl-!YWtwi^^|F1vgzMOhvel9%#0Sr*EP=ln6@m-?^x=rVzQa+LdSi&{J$tN5- z2!X!TL>~Y^2mk^N#&}YX9#j5e?5EV<&r*V@vB-}I-)W$pFEz{x&deft*u8%JG#)5i8=k2?^724tnpFbJia*Mr!Z;Eb=x+61p$uwM6=&`8Q~+ zTxmo}K`q;o7+kek<;2M8AdbgvD1YtZ=^moPfoZ-OIE2P_g3!zYi>M$1#x3Fwisn?B z{0_sNQbl|JVH}XXU%koR9$tWpGHQ_j>?4-u z0%K$ho&N%UAK)@@i<%UW6a~Ktt6#`$3a{#IptFCVIdTjG!V1F~!RxM5t<(D?%n$3d z`|Zz@VBiJ91c=%N?!eUI^(%Na*kn8A$)x z_y;G1?UtaOkJe|sg9vK6I>c7ge@|$sS)cFGBfXHG^Z9cz67&o!VlkjT@HxIYZ(}D- z)cM}N^A&P4ew!}3ljMez9F{E4H+Dx1YQ78|?+>9gTmmvj^3kN1Q}}9prrunLEVvDJ zZl${gfeWaR?;8`WW1A2hJN-%WPS^E-==jy%tk;HjW=cf2w&jcc`G+2J^+zqxAy6|Z zZ21`bcbw#O7of1ymR#f-en(7U)=L{K+b<*aQ|>g9n7s)w^uFC}D2wjdGrgF?{)7e! z35PUcW8rI8Lv(36-@NNIg2{tZ-n=BRj2C6|xT|C) zD&2xZQCK`UETbhslZF3U*6DnEPmMWJxOp>yD{9{37&_Jaqu!t~^ znFMF9*+#+&P=Gt%M0#B?ys?jwc3A;4sWQL;t#;Lh;HaH83pub)HVO^u61fM|%)rlS zE{m%)LulD6S3d5W7&^(Q3n|V8IV&v>rMY$RV^0DtSDgqObVTHdy zFK@8%^nyr1BE3G2*Di;A;=7e?%?Nw&JN;tj(ybgqAD^K1Vc;iFeieN+_COTKOt{W) zgr%^xNf3MMZptN`4IOzoS0Q_g)#e8$fn646Nf4}nD}c0(`LKvEY%kn4I$Smg~Z?GH_6LaH}*p!zTM=rTYk7UPzKP2u%Okf>>YEC+(8k`TB%;e z)&=3ukfPDQ=sc0JU}zU~`2h53sEW>oVos=L~Ss5x0bMerzww zxq9U9B$zi0>)%~twq;J{<5S)*$T(P{!52tIiEyplDDR%T8|J3w~m ztP-Ok_XwGA1YH$xE_wP6PbhA~ULg>1j{oa`)`YJQ;Qv-+{n}N{a7F5n2d)rMdaLbH z)nc~-f&D$UkEDu~ul$SkU%XNIS!pWc1aQRcSn5K^x@6elWnHZ$!ZI#MAi67a9 z)`kD>yOy+UY;qL`!>64&r8%j{_uu0S1_}ob(w^dXg0@xN!EYw0PVTnz;5a5>hpoN* z3m@VU$H+)QmrFco`~3B1q`hYD^(R~b?hl*)9D=M)$mE91`|@r#TZgLEr`&%|?Qe^{ zE~pBcyiNgF_aqTqDu%tUcQ(T|DOibV4g}M_3;I;6bg0V6HrX?uw4xLi=+}kGrh*3i z#DC1L1j&&14|F=})&Ql09XOWW!%Z)cuTb@IZLm#Iy+{u2B^A8;95)Ts^w19@DtFK% zqa1FHu1w`V4?{s4@ZYO1=)@=DR*-bAtz5dl{Qd#Y7;*?;AQ|plkS4%Ui^MCVuf)8!kjS`5=RnRTV2}TbklFwuDfW&@*LLQu2k1OxW`hg_!?r(9eR= z(dXe^1w1afO1T)b<1bzM4faJwebbtPd(b#pbK9+VM)~Vc+`RrLLrmX#c1sN);P3j+ z#y>y63M)%)hl}nHEyhm2-EqP@s>~oeGL1uZ#-?aH^TjViE(-5GM2lQOsY3kq3DUIA zOnCTQl*s#Y8DOHNoqCFGD_V7Bk7?z{;B-Jx#A5BJ%UAje?+cLr>uy<)jLe_wZN1Ys@D!Ok}y$)=##r5QK$SXqV*GjCyvI?4T zJkDmBT|%w9appSaBY6#_c~ZqHt(4cXm`<~v?-Z8u_+6a0?0EQ`5Yoj?dBH3-v&-Ub zr4!A6lNc@cmfIpvdw23S+XfMLed;5{YzfJLk1UIp4}67b?q~ib5&|)f9xrA?r2-6< z-wc2dyQOt``-VA|A1rkk^8#l}9Cg=kMi3smt<@eaF8*ZU)EkLhPUiJILWP*Ej(jEm zgMV>bifa3&DdmEA?8?Ja58wE*gxQh8OQJHhbi~U2y=3dDXX-t%DtKZtTuE+WKD|dmr18FCXE6RgVHPD%q-v$?dbbd*H0Xj5LC0EB0m?B5 zS9r13%kYd1X>E%{}aQO4&2@G7!kNwl}uS@y4 zN<*FkQU>nMWTNJM)+=$7i|=1j0FLH9fMDC1sR*ZriiRbyVkict@cO3>Y_!Or1O`ndT!gh5RwzkA84cybaZ^!s^_|c_f7> zTyK3$%xMrmgv1RUg(DpdMB}lsKa6dJFp+vj8!sLEKgW-9QJA5azJ9?ZQ5+B1>S6-N zTQw2HMcMVJ(lot~q;LW8DHq?gf|OOK?e^c$MsHjFXBJn3GOAlN9i`vzpl z^n5P8`?Bkp`sj7D^DcdP-$j_Filb%w3k(-$VqicDC;$Sb{WBWzNleAVUz2XWo%;qq z^+tXvh*$c+A21wsN1J+Ao0Z@wtov9+_K|gdN|OVu2C@LYU7Zw2u;^SNV?+aLMO!?f zm(KAVuT<|n>q#;h)%%Jw%n2`F0U!TU_5SHlU|P)Q;2=%-J92Gb>m@whT-974V{wxH!(3fA zl$y|TU8;YJ#GtiOD~w>WOQ7k+56i@8)r>BpiQeQBZ6|guOWmYcq$(5-+c10VWNBK=hvFj_AosFYq>wDXPcr>Sqt^>8( zN+8pMBHat*rs)tU<)laQL23uhX?U1@%206Pb3x#mK3{)|FSe_^c|CEC8~~kIT0E{c zJeT(;(Cx|kLcPp*KYrdCiU9vX7^4>ljcgOV9RF8X%W-1d5XlFX{w}+^6^lR+n|||h zDe=3Lbu3q6856H&Pk1<$>L;Is8o1kzLu=g1pG9Z{(+6b#XhWCSsT7hP7>B=qOSJ=^ z?w-VZg0??K*>RD}Wsw+kE^@{=6#ffEweBkLh-{XB>;gFvogv9lQ-i`Bzl&D|CibkI zDsS!h{>5z2GP>bw`^TVsvoLzET*nnvs*cF!kv|}qyT?l7`h^hyxd!i%2n$%U-J9yn z0W$0ZOT0Dl&>52WW>>nlgcVrXxJ4r6!0?)}@ehlW=^?_g2jy(NsP!9P=u_`G;@`&S z0n~O+1FGy2ab1BN6os`@eSht^c4J}xv+edg%aF4qa>KVgVfvv8=MZq}Pk0E|S~p(m zM&-LH^!ZAsZWQB2RJzpV-fdhOA(u7H6W?HMMzuL&I}H`kC`GhPx`t|I=X9BVu4xQXP$}634cD_?t$@(0UlBTuF$g zQL~Uz+?3;ip+6@325op<{zi3Wpx{}Jr3Dw(`!@x|Eg5O*B`6iL(2*HNCL%@)1O~+_ zGy9F?o0>>)fB6jGR8%$_5eP>0!L2lTy@eT54NjSLKA9_F^H#liNX?% zEK@)r5U8&nkE+Nv6}b9XE(3}(TOB(mLpkRI8eRo+PP_ltWp?COFPlw89USVyoo*%` zW}WkARRr=BpWg5_jpu;=Ymms5?fHFEMkY6v72%OAF7T(twn_itbx4n%YGJ`Y3lKJc z{lI!n2}{KK_fn~38JbzpRbixSa|XIqJp6Ac=o0ym;mfQwzoMNpALShxKKUxUQ9M_{(!yEmYcIsOgtgVl zvVO9EY%of4+}FA(_GLEFnSuwCnU2E=aqGkEqRcls`J?-n7@pn7`27b|srjZ5T z!8i)>JkC3w-MY;{uRKczl5p_*W-!!2-%#&-JzupRGO>3-T9hbgg~xafMT~1?mtCDy zhlIc=;-o>_+I^NcAZ_|SLb{DIOLpxEi8Go7wigO}Bi~ok#T7kXxBbVF2zyxVZjZ=$ z^a-7+&jD(l311Z=Fm{{X|2I|a5YyKxLlCkTvsb?FJ*N6v6mO2EC~Z)8y)uM?J*3Ml zs=)*@%;q|n0>{5q%wlr93O8xr3XTMO5dF2~-u+>WVRrrwD)WbZLohbL2zg$X(#hg_ z1{z`cv6wN%088RK!#%`xzb9`qaI})(Ygz?TMumT2rTh{~OI2f3@l=Ff%Ye`RV#aai zP4c-{d5mHtl_W)Ey(foTGYD0V8}8UG4B6Er@xt_5Png9+JG(vzd_Rs{?rtv)UKnq; zL`bF37P^%=@tqMMdt2c?;PrVJyi$^ihqIJo0s(9U748lyn00=5EjnBp3ieX`uFJ6h zjz%mZqdh=K>#OdU6WVp&!Fx`ilG{y!?u++6092CCh(jcS)bhyau) z4gf6$_T0^OKy08CXR*)goX1z7B+ibiTauPi9H{MItv zSHS>3-!{AwiwG%+Sq!`z*Y?{{K1z=y8j<~)wdUtejzc4wl{00Kt}WD;gv&|cJmW0R zY>a&T0!F2;3M-IXQaV&8EWnCDSI82Os;#?e1;jS2h=E};>KEU@qB0CrZ`GaEUk7^yK5Z2`uiGg-WBuka^HgDBk zOA)_fjn`!RiBT&nvw~;gcT4;qR&eWylQQa#@+k88>HZsxT^A^uQp$>_N;IbMOiA4D z2uXb|)|Rq~XW$9*)7tS0<10|?f`oB^wcQ7&>o>IRWtgU|4GQIg#oM1gz%_+OP2>k> zZfFk$A5Y$MB9%Pt%)p3BcPB1^U1di^seC!-KT1><@mJ-^84fFDPEv zccKiu_jv}%y??I=_)WR;ogRWl*Zz;z%78G?jFerDjJ8D4JAvDwxuexWh0N-IG0E}S z=M8jmU(NNENbRAa51)FOi=^EzWH95XHH+tv*5#E`UO;PxHPF8P;4!73%)bb%fp%65 zBP{*z)O4HP;3)iu@qT%RTL#r6E-yXVsk$q@Ve;CAEMnkdUy9yAYM^hTcoCrQvw9dk;-1u~S0ueuD!6-t0RiI!qVo8!Q)Lc{W> zF8fK4XoiZUGhz!90+5y0U&NLnB@1R>G#xuE;^H{4Q59 z;kVhFEX|cY5TK>2XisBIjTo&cGJDH&Sa<(nCdP}U>S?5faG2(CGq6fF?Hg+QvQS-I z2Yk{4A4Zaj5B;_ls!RT{7A(=#UN)(B>eNGUBr7m}{J5904m%UGQfC;Zr1*LTYKqyk z8ha{g<0&n>88XBJJuH->Z&|CIN&Soy$1ic7s;AIZ)qQIjor?&p1kEui0#f&IhoH#O zF!U$*-VcBki!;Hms4aUJ?3^VdaS-)<{hD=q!+o;MioRlcBBKb)x{(iZb=xH+yWHc} z14e%iYbdQ6P*C^jSGUc0`Hip|G0xN4Dz2Z0Vn~@`qxTGcsK+QUBDh zsXY?5;D@mtfYd~ab8gu}@J_HhXFXy!Zt;-+A+SMHc!$T$82yQpNJtDmMD@^x-r#3` zk|(ndVs2qC-g^UjDJUTEx^%a|)6?c6micx4`UTO??vI$$Np4179Eg49b-dI;N{N~s zc2TUd;oN3FYMT5B`MEltGSh>MftfLSTEdnwh`Ec~4t9e=d!6X>{%5_6S=?QqOl()v z?zxK`_2WCmfs)U!2VB-mz*){R+gi8AS?Rn|5ZIR5Go*gAl@H5=t$h9$qPtXbYyEMN1O{=&RxRey}=?VDg6j^g)M#g(tjaR`W^`l|HB(>GJr8=SRZfq?2x8T`S(XRf2|fooWM$)ix~~CIo}kf zf6ugjQTIwF7t%GFBnq7X1p9QQdQDbVpN$-&36N@=qP`?Da#EtN_vx}RMO zVmd&01&4SHI#=*PDmmn_9KDSg2>$QC=~s&wl#OCFTmGls3tN5z-3jKD)3&bG#D}3A z1NcL1FN|HIyxY>LPTnl*oTo*HFoOsTl{+McN%yPEYgqHHyGf(~Ckph6u-_mKC&|40 z(rozdZG)_TzAlaLk%*4{&2c(T$dG5+J);< zz7ugdw`=#j>CjC7m7UouX3$4VXW%ran)f`62?n(N^p%mvNN|*vBW>&wxBBE58<(+l zKq^hu9a}NUXUhIy4kiP&^=CH-Vz-d`XP3%-aP}W*nl9KtOjh$Kjy3a|Y(=6Ji31i$K0qI8LgXMJ>Z@f50bU<9rIVBS;CwoY5jJx8J zg5z^m@nCpqvN#Yat79ui?CNym^B02B#B_<}J|idJT~n}pF;UZs#Z6e@ns_`I)YJx` z@jP;wUl!2m#Z5^GjUMqRb=8-?xJ>{kK-a$~#SB+ySC>0E5_U2DIDe?d0|2HEM_dNE{xS7F z2S621q0dWcp;mo%YzRt6xJsSiyD2AL1{^8g-MaP2*g3ulk`768JaVwbkc(T)X}vsT zmg@?or_9U@?nJSCR-FqX4P7tfrXVe>t^!yql35whl%bZ#L3Pa959C_SIh{j_%nt>0BXxq2iGEHK_wmpXE9W#*uJMu!Q~P|CP9#o z84fS0jXLc+{(3ai_II1=rhEO;$N&M0(yW%aTnbzZe$R^L>%RBaxBS+A*qSZW@2!<0 z1&GJcn=^T}UnW6crtSjKZR>89aZMFmP|ZHNRL2BK4IE8r#GAEs3jUBnQ??1n7mLBj zyQ!b3)|ie>IYW^Rm=e?IT{ZfoM7xnR9jrV}CU?mN@W3KOG-KT@$A8HSB&t05_FWwj ztTdc=f8RSBpANGxcKwl z3CzH}A4Z~LQ=$VWsT+-1(9jL`1+)O8wtV}~p5iGQ-VjNXWyh9ydi$TWZv#5{hHl`^ z8F<^f35ub(8Sz+gBSY3R$ab(SB~}EW2^!2yUqrtxQ{*AsJ*4CyZ2f@{)xh)TgmEdX zc;b>nsx;@s40Q*45sc<3AM=`|sk56b6~gI1vwu{*S3DW-7(R6*l;SRMf{sr0UY-Rg z8>b=|uJ)0R@QuJKkoZdU4$L4pck*@fHB^=<_*N!c%rKn+WA40${Y7pN!svg;5!*Pj1btKuWpntn!!AH=|n}5ZTy| zQm&{&eR(0phS^|=+m&-8f8G!q(8m^AU;VZsooluGGB(}qxx4(p{&k<&qdooJZ~%i4 zEoj6BEKB!?qF`P9<-;F{Tp+CoH+JhMC&+X-hT%2B^g1 zQN=rerr~^#njHfqXL=H(&*Sr@T8k;rdLMuG(}FQ;TRs!8L8p8ZrZbW>KvbtoDL1X0ZI(< za88}d`c}cv#4HWYZ|YM|BmI^GFE6(+M{&i0r8wlJ2}=E>RObpRQ88sJmE#(9f+DcM zO}(7jbk&Vz+RVDg5BwbtY<@=&6ILlqDUE_uLiM=H! zOaY&1ZjwE~msp^!R~KZ@`ksbAk~h|?iwb|OODeD7aNu2VPDSXqs`7ak#b zOgto__?JxqN`&MRef1*6zsj|xcfZ$G?b3~!S(P|Hnu%r>z&O~@CH(cB&$*7MVFV8r zbH(S!4{cmUkzIXcBud;ThJ>AvP%f40mT&C*-^_zr(+fNvCS6-BsM0Ce7yxRx^!YP5^5SsIKRo~d@c#y57C9hZz`ONE)RB^v4DYrqVD{7rZf{$(FF z6bt=TA*zNQ`>o2Q!Uo0Pp_Ku=qXd_?KiHjAyTWoRWrKWBebn=6JElR5&KBJ_)T^R^ zBn%)hl>9Ld0yQ;NOX)%gt_@~S=+>ZQ+)>)89T|S7k~>R{C$MV;7p5pfWks8w28o1P z<@+lz%}sG)v?9ZI9-T*p>|MBX#Zd?F$y?W+4)AMIc92@FQN2;Ki=d_e19P;*`LDp?^G070y*DYa$uRMGbA1Jr_6w5z4 zYW&gBumcg6VmeRVLY|p?|F99m0ewxNdE%KV5GHe5M_@EtYq^rsiCB;3x`WaTpjU3b zS0=+q13I&IwOx=&pUrC5#1eks>?M#X&m|Sf?C(k-vey&~0v8)g|4*y7A|LH#M`=l! z2%X1&Mrn3NSI3}g@;X)~7@>%HnL91Z8RuEb39eCpWqZQID@5Li>qZt1Ny>lsQ5U1- zlP!z$sjNi=la^zuji-+PJtpxs70bVaUI&`xuoPZVrb%hzi;ouuU!3DEU(2TT>w{N* zo4ZwJ%7p2zg5hTsHMMd9eh4|N0lRKN%jZ!BFopV()#+?e%jtPA_^CGW<|<(@M#6V7 zE#Oz$C8y`(GFo#;yMXhB-=8oV^yParUNTHk8PWjko*lyf738vYdw(ekiW*VrBL)a2 zE`6P$XYoTUDOU5q2uGMI!NTNIw@Jhag59xN>?m`B()SY*$HhB1{oz@Tv`?+YdJE2) zoKoTr$>PQoKUMh@al(ZqlHUZqdJl=_-0fI$M%?7WVs;Nt3{jB2cL69ohGy>$Vu@BS zJ$kO+e=Nxq#xAR!Em{^vFu~!8d1(=;db;=d_-@jVE-ipsBF9t*z;+-_kuE3YlS8OW z6T(~I!I0WZlgOmb<^P=)qL3|4nGV8m8MzoZ<7Usob>a8ZzcV?+-sd;uYy!Ps}KIo8UbaXPN<&F~WTv-&Ca0zq)fQ zC?+_An&cmYP~&Ev#D&nRxL zhmmqXVI-gBYTwA3+;Qik>Q3NUMfBz~#BEtc2@)-({7OjBFih}*Fp@-IzT?&7z;Hh0 z+EmqsM(aIcl6L$eL?s_wLd2~?0F!F4krNU7#IlbQZ(bc*I>x#&c5e>%Tj&Yvp`-=Q zjZcey0gz9;mcf*b_NhHaw}9O5Jr?2%j`n3^E@!pi+Z0zkgYx-i!`{$xoi{C{_HJml zKGG8=`t{-)a`;D38yUg@desM6Pz!W+?c++^54CNaGQx#vDvTVX5td^KOuARq)h#!D zchfw5hXnN*{?@22o+tv|8VDbn%b4$F%fk6_zvFcf)1`jqNwS}EXiae$WAiTThdnXl zyH)|tqRUIy3%P|Oukk_Mb8hmYR`S5L8KSEBym#ff(fKIiPQ(TjegCi<>2=}xUd|1* zX-q2f$e?4%mY@p;pPFYO>3zITnF79zB0i_q{+ZK2b|zjH=_Hwoy->m9>j?>O@3;zD zv?>E71QA~2s9%V)^kC&zm1`MhHET99Z)*;|s#PS;$N2-6btf=}J+E(&PGo%Ce?2V~ z0)UIeR`y&-7{c2(zP7jpG?+r(CQ(s#LJ_x>^|dbOQfI|%Ip&y1@h7r_F;4Mv{ge@d zd;MIANkTF`fY@6f@y_9ZG(vlXy~1^xSGa>Vl$i?sfvdSe3A<&02u=YvCws0u<-}if zA+rZqT8SW!hn>s|b(DZuU1v)mEosgiHaQV0&2%9IDxJw=>?!-UxUt`*u{s!#vf$Jr zW{xc8k7c%&A+jvYRv&US(ARZ8O=MV1pFx>daIpYR=SgLv!9JgmC9WGgXA%eRr6H|J z5rOF=aL+UfEVa;^$*2*4k=B4sEln1UsUi9+9{W~ru6@lg(ii}T40bIZ9b4Wn(%IjB zz&X=66?E!-Nu|j|_u=?eF#}~TOh`uQ)#m)1Od(+UkCF>4nV7fMoS%!!KzaCnpqdb?G=23uj+`)flCBzi(MIzZQ;Fhq)5o-RVAsGGA1d%j0^Jki`bu-^;3_^xMFpnIQkx{p!B{&DvYcmg__1`10a#C35gd zA2lPS?DLr^KLAK~5a>-=@y-hwbns0>dplC4k4LX2eO&-$<@O4kRHMsOT z5zgWy9D#l|41$slXJm_-kVRXnIETe@2Om8-48%QHEKVt*s*=WZOrCl^$VGYZCl$B~ zfq&sU*p?>zm%Cs8a{0kNX{^_SAR_$PtCY7k?_W0xzP-8uvmCeX_lJ@@BgmaIvOTZH zq;Wlzste7of3X&zRQ*YWLKF=zDyZtuEvc3N?3hNGf*{`5#GuvZemP^dHMbl z?T3Av+mXxp^m2~#-@JVoG7`?!)6vVX^-evUf~vC{+i?F&^Rm*yAM;zb5q=?)2Vrec z4iHtUszIH|%GFmO_p_rrGZI;Ecowktfru3q9z)%q6R1rw7g703>7#!Dkg2dg2wcrS zcWX2FRO7N|G*2pbDW31RRQp!vQ2trD+t^#~c|T+6$UE#gm3vQ+&gY{L-a4YZf~Rnb z9^!4K6Zza8bH@jij5%P4_WB&2kM2fWgGVoW82h2}c!@~2%<8mZ#C@^MpPpan5f>nf zU1WMOZgb!Qi znpWp&Dy{O|POFqsxUt&(kx-N7YR^(kTDa&xz^WIV1$m}W_&rA_N*UOfGS;Z=4gG6K zOFsYpvHtP%QI=M{`ly;d{KG5&{kjdtW{NF?S&+!t^v_0_|;yPj^_0nnf+M0<9|+izgqmdQK!n?wz} zqt^SSM4|3jDF1^sg*Sj(4G{78D;uo$Gpqwnh1LBYVRvqB@`VTo!T+#de|Amrcfwsq zo_i8EE|K1Z`&nGyJ?_7bc<=(M_czzmudH1d`8J=6u!$2AjsJru0S2sUT>dLcF{kZpNZZ-D6G4%fR1LlO@e+5GYf;F_27Ltj!owD?mj7c7^|(n2u21X)1K z)YRX~TWlRBNFct(qjFCJx^Mr9%(F;^l3!O+_;tmQIz7bDmvJWQm^P%du$~f+i!xZ; zb5lC+_UrmoOwcCol=zJAC4&#CJW3XhLo8jLU8?7%hFf!tpc+6S%jS0J@CoK>OI{Jh z=S3v@8m~wmOiR*W_*6_4C;%DWQ+s5uek;AMFYr|V>sK7Xad(;Z4;Jt1g5IvQ2}Qy| z@j}3t1-23Xrdg-{Hgj`BSPx47gnVO0X4UO_d6bBCU`Sa2xYF6HQl1B_LU6iJ8HHUT z!Sr0J9_X#G>+4}&7P68HyvE?NhngtBZD^-*&4Egx7hF~phHFPdNzxGg!k=f#w0NAv zf6A4=(K#5ra(xG}w-3F^EpAiUqWfybBbCxXTkw!0b-*N3uu=MrSydO1=7{1g3an{; z-asO-;cEhS`4(EV)^zvNnD-KKNhXa(XJ{lsv!cUGr1)!2G(m9V#Pu6^t{J`qAV+5jT*raXFN{}IEva`)=xrr6uNH zJ4jiE(snymz!`Ul~Y+TH5p}_^!HEdW@bnh7!8Q9Pw$4K&?{@k)4xbi-zscR zji=ih|IxaEN^8Z&eU){xZ(3OFsiF-5vqGpN;Y3qymDImLazq4dN@R#{hA|4MnU_X} z1x4UN^68EtFBC&=j)cXUg$!QLg9ao5cK;(9a%!O$n@1f)0y7;Z>5<5$QsJNJp}*zX$X1N?oZE6{8!S(PrRrerKFZ6Ng&(fst~M#(KV~4A>*ti7YL_ryPYyn)GKjhF{X&3lN_H zGg?OSUS+A(zHSMvjc`wZRe-?6b{Zi+4vvwBFN zX(E|B8~JkcM5l82vAkx9JvP)_PJFsIBp!R-gRu8>>7IeOli|X%$_1rjw&@mB!DvNV zqVG_{tocL^&HzwZ1JqxW`_o}}oX4j|-cBWk*p}p?#P$iM9>|M{XxafQP}knf3zFc@ zZ|j6ci7EmozBF>gGou+PAq_hDpClR9q2hxiLjNe}Ce(Ki#j$O(9PR*`*H1f_0uCPa z*tr6TrN%FD9|}(d+E&X4d&?C@O8{fphY+(`G<)oR@hcmHaMG5mDN(h|-QpK#Bdu(fjcxa#8ZZ-)!NP$VBx zI-^i2PXmoQ27YgNThgqVb8!zjUjTv=ccV@}U5sj#jE+e0d zMVniHg|#^JC78FBX48v}Wbn4f(?s}=i=j#1FyImwwX4?lFg$>cd zm4pNQeQjnRgKW@gN{93pc2w4u3B`16NK?fmCup$z2A*iF@ z6ZUHSMbFEAm=DT=j{KFedT+QB_r#2+Asz>qO^ptf7a1$#R};M<0pSvH#3pL%zo5lV z_lAN<%uY7>w@BN$zE#9rB1&eIX(Ip@)HGa}J4gb%02QlJ14M#ojUu%Vh?#9I_g2hy?KvF%c*Glwgl)kWgSV z&x!dtPodfy5FcHXpRl{s_^r6vk6B;v26Sc|s3vpk&QHE`Tus?O4aM)v9iBwD8J=_b zn0fqTUbIPEapYn_^D7J31&%!K*o79^&3k`FRTCW}Jx@4|OC4p4?Cn{1kjzc!%RrUl; z4~KQ|w;iWVH)8{S#7D1}-8Z;qAH<{By5aD0-x}q2_&#Wp!jX0FQO;zPk#nk~TR>KA z8RBR@l6jHC&z@bRKqfW|sFLUcaYO4W_i~vE^rinM%%+Z0YW+3r`rpwyR@VufG|XaN zABpV+8G_M1XL3_8JydOEV(enlMNapebP1P^@$W~N#*Afn`$|s4o@W2G4eKK#S>cWF zC43ij+yMuPgpzw@1TCY$$13;K#Mf8YExiV&I|B3qBg`ZA<}X=a*p6}TZRj7QJKeN_ zY~|ail1&%VlxcFrmWxWW8c$&MW1YQ+Fm-w(8{6$%w;j}5Ns3<7AUgW_`O~$rjFvak z=AWgGMoG0B1P?m!f%1Lw23S7vnFPu!nFS@bClq+H@dF{*9BFunshrQo;0@IB4NB=D zyMq}&JbS1E1{{$6Qo~FYh{YWSgIP4_;Gk#giGlZXGs4mc>I@MP=I7X}R_eGVCL-g` zuuz;hMDt=pg9UhZ{V)zb;0>@gHQ7?YB>l%9|gU%O2N4 z&~TZjTV;kK94%$HtA&(nq1#%I@1@P;(Yoi?IevLYUdlY#yri#Ed|!5yY$a%w`0-af z_T>>;6#4bg1rOcas-aYr=Dbd}a^VCq8U>*Iuu-;9vBPTqTcCM=mlMdXOaV<@j97$p zj?%{$vFzJdLjzS<9ajrZQ4TZ^jtX6m=CD;yfLciqg4 zDpe4}-`MLgLnD=S@sc!=9>4AS>#?L2?OpT)^x(pNF?2I%WlKhW8 z10>0-I@E!GD%SI5lc7zpUj7D`;+JLVl=}l(D+)dX1ae_H*Pt5p#nFec9Q93-ZmZHE zqh5GO2gPeLql7L@^^Gk(T={wyO2mSBcdzg^E+nq}zrpRN_Mz6aPwKIC>M>iV*TyY# z5Y}wmF%!J$qDF_l7d*B5QiCedI^juXhH`Bvt1*GJV5*Mg)9_1Q!8nmUB;=sBDt(Gr z6u7?)W@bA{;z4cV^81KwKQPIL-wfm0ftwM}1F*digb{s#b z$2{~z84f*>104FTcQb;=aVA3!z8!GF*FH?tSN?|6NN^4BO-?REeAJ3)GwBD4Mw#@Z z0MSY~8i3_-=$$ZmvwfqALojU`UfLNWL}|?Kt!dX}>ct(kASV%*9bu>F6Xuk?=CoiDFUt8-ir}b zaY#TW4b6{eeYP;+q{z4V17C+yi#*V-jZR+k(6|=vHhldN%AM+i7WV9_fec>EM@Gt^ z%c?}X0kR3mXxV}HTm5&rTp=CJBMp_}m(Dh|a{dK0lVT; z7yi`|oxtf%HHWXE|K~*40nxeeQGH3Xum8&F0c2%+CBlK#U$)E6Q@{=E{yJ{E2`IzQ zN{*z;Ver_%x0a{7wY0KDOQ$*?4lH2QhZ#PSqn`R05`SNC#FAo4ntQrLMiOsVzJZ^0 z=y#u(>$_In6zrR9Fe^d(taZYk|LSva1uB+`KD#lijl|=lv<2mtr85S9;CFw@GK=Gz ze!;&)-AW}Wl9QshzT%+Xo^;<(8%<+uIzSF^_1x#sQC;zl@1Ht-=v9J3gk8aP8lj90 zPC4a*nd1i1YB%2JX@ZeOsdefx2ND$A^%KgccH|nMMF43&^5>^sw4AQurLmMP%MVtI zX?u1j+>w7XaMFa;^v7zibUncDz3%9Y=>xuA2l|)z%r&g6O+=IOCh%vw*70w|CEC#f zoMp($HTnKN_CSF$5(9pr=^*}n-GD0F?=ETt9(KWA*@qc$5z{5ZjLN5?BI0Dj%i}~f zk-NF$UvDzxuNspK&Y#(EeIO>1RG@gcEEOO#z%u;F{LjIrnF)XY7i*|7Wjz$tMg996 zN7TgIGi1RiR>0uocIn&Dj<^rv5O3XCn?#)aU!{HYI6Dt>7=hKyLSIv2c#wA%FR6+O z$xuk*ByL5VjQH9CCzNppY}X4=ui+wD@qVnL3gbk^g}i=ph*o|53Lvjd_jx>|Bk~CR zVV?E3Iz;QJn>x_u6@@Y(5ay|3>N1kr0xL#UNEoZ$x}kI5C8}M{5qX1M~*4S~%>v zt{c=L{CWvb12vi}9es(G;<^4-0v8t~{sYK9EPtsAi(hr7q?JEnk;}&pzfpqdYoeUG zWBpN6iolIwp1H2mT1L4?8rDROb^CKm=+V=0p2+^q2VMxEJu!;`Q=78J(=2v5o5L7V z3|eZl!3vvj%>3PU0t>1iOko zv%GQ40SA^QbPl<{4(Z)H`A@_dNQn1xA4cgDM096V@LccbviKD|+D z?r0%r*6iibW$f_>UtMZ!s5~!DfJfU37~%w%Rwv|z!`S*B6`5{?4y0U}DMtKclN%_? zK01Irni>44`A}!GD1Ch+!R`I!m>BrJec#RMmezQ-+x@-0u|Ym6ofy&$4wk&+liTiv zg*fpwkg&~gDEvsyw(^}MvYNbyUQo7o`bi%QbYY}w0{QoF0~` z2fe5YZ1Z?dHr6O(*NHGVa;95p(>HSSr@Ctit4n>ROGnOO`FY()1sH_td*;bQ8K`DQ z7@1`vsAnoe7k4uSXZAVVjtFplZFv-;UvJ%Icvr)DDLQ%W(r&E!XD5ADpkQ9|9CiJ=v4T*jyI)%PxNEugO zI8^eGYUmn~$K+3K4tD}v_n}2GX_fkcy+^HJ(XtguVJ!wxdXm<=;?WP7M&Ptq z|Gv&bv*i))cBm}^L2iY^zc5B=8^Kb<4YzGOY}xGvJmkN4zI_(WO%`1V?&lHM^&b2a zaKX1tRXW}|>Fvrs;sNfaHj#D;nNv+zMj-GyOUmY#mW**i!U-#u_hL^q3D)xkZDy?q zh+2W2pXL#9T7s4|=UmH|?$wrv`cKf;0iOKL~bCdJFa>JnjU zQ9QGiI0Z+uhqk>~y*^(aOpxJ5J==8d4EgrrUdR+i?#iMYelnNDcek8DiL;Hr`5zQY zc@fjGdAZ+OAj;l8d9z3bC5}-gBgIqcU<^PbD$HypJA!E~dMtDJBmf+%GWx5CaI%<~ zMupezgp>F+{N~alu(uoQ;)o*j;Fb>kbG@`vrd(VfiBSm@f2Dg^Wq}<_r0{y#8?X(w z#D`vp9r*a4CTw}=SPA&H{jnVc2*Uh*n0H$;NE;!O*qd;^$+P(Z+J$Y*w^bwl9}Vw@ zlbqIFJbYdU$QjxV!O@YE0IJE{c*%GAOqMr24U+FzdoXErg+S{Ny3c==Cszf0{FJso z3OaZ?G`kpRMDuG=#2dBpPY)et*i`h1v<6%oT76uMoo29S5VUSBg{a?$&QM#>tqMf} za3p|-DPxL8{$GLZnZyVo)jHY-0|FB=m*NLy0G};1BqxcT8`23p`M}HXy@$of0c_0* zjf|{at7Qw-ERD!RgD@C!OjcIc8!@^5EFkp+rM0e1j1+QhSJ@b!k0!^*R9oXrERgoF zTK93cdU<8UI7`R<(Gn_>(59X2;hgRTp1i( zg#^$h3GA|SmMEdw4}f|^ollKm=5%)zSG-0ge9+8#O}VZnkRbQaUFh9eRrHrg9HJNw zlkf0d3MTruZ66al>4?P+gW|9g57yt&r#0`<8`1=!p&F&W1s~H~%V{nhl)N5EpdG4Q zA|v7%pM=d4`qQdC-<@y|NYjCsS=FFjbyBXUt+Fg>vmymgOoeFG+SY^WBDo0f7g_`BV`6ds83Ca!l$ zyc1Oh-l+fQ|IE4W)kpT%&jPMYoP5DOJKIp2Hsa84K9@?jFZ({93J)t6fLkalo}L2O z=mce$J8}ul`auH^n9Drb6GfJLNkKnPaSYzUWyKC7a&K5w3oO)j38$6;GMZc0om?(x zPtN4~;qL_3fAQncmJHTDqn!mmPqF!UbZAbVofY`vr1l@~7G|S5*FQ@`A4~#3X-7Dz zE`9AGK3Ct!kcPEQV&8P%=M(0EmD8>L9_-Vl-g8^^(2^inY71t*=iY4H_y4L!10Hux zK%Xq<@bQ7Q0eJqHoUt4om*XA@)eX=h1FKY^V3qjT$6&gOS;yGoQ8RhNUDcvCGL=KJ*7qmBk?=w?*USSjj>9eh@{Vf*D=uh3q*%^gzBS~Eop{q<(mk~^y-)2wYWJ1r zdXvWK91ljv2g}hPsKsQdK{xsoGubH{vjec}Xok$AzAMtyDVYUsfgfk%zXvhm{t+IH zG#k*Tg&ypeHDQ|$DAPKvC+kE2jYuq1#1sa0E;h=&fu@84AfU3m1~=U;uf#rcbC;}7 z4buFiBV_3s1aYC#CKGwPdKTzXOPDo+hT&mXicAM(oT;|iC@bH(p!hW@{lMC$|Jtg( z^%h66+uf&o%AOi3DQ}U~lm&$cH4uG6+-kM7esBeiMu5ODhbFt{FxA;Bu;p@X*g{w&v^B9Y}Ng~Z7|MsAztWMZqe~`d&70uU~IqvC!(EY@wQ#y~5ilnkyd?YvPN2xdCn|+(_cCe| z7`>S{oN?n#geh%OiZ4L)sz6w0GHo=GG9-Jo;cgPySz@7IaNf;DmY^K=o(g$>crsGD z#i4O$1+;(l2H}BrA3WD0O7KoiTYYmr078s-;+F!tn#(XMju)3{zQPZvNeX;oS<`17 zAXKz}3qv9WESPuK%F?_RoU4J-ULtxz%YWO(0+)fd^WJQnNd%R0)H9RI%F|GO#Npb* ziR%Rjq6?$SQ3`tyR^kdOn5c~_oDw9#Y&|wC!GFw87KR&I_ifXDN0qHgBJ8C$~&NeLg zKyAY+9S?EYJQd0QxP~HFs^^4-z-E8p_T|GSJQ1SQ<4rCZdA=fXC~)8#Oxqo;|(U*rVc*`6#?LGZw#N>?1~e6U8?h{XP80%~re0Mc&}#BV^?2kvM& zAxZ7wg;`*)oD7=}v&=O?*sj4UiO6it4l6{DmiVWjS~XTSN*H+`%rpmlM&t-gtamT5 z)hYN}zP{}W_{|hAnlaP`pj_1mgv9M&&wpe&{&1#3RKyIKw5*=u0ugy}Tm@vAJQ=fK zgvk)EZt1IL$9nzeqJHa_O`1zXkk{ePpswol<^zLN?H|aHSDg0=!glrK6d5g6%d&t| zM1ZBv8ZU5Q<@1DDv-~cm@0=`NbeM0DLz>JjK;Uc$Lr95)UTW_3KS}FkEU(ge`>|I9 z-o(a&S|;>WTU2IX`i$Qy3 zgA?Nie`(7y2BQd;VfNalIlVhIOTbnL@6%zjX3SkatS`?J&oLh?s@h&e0=gK38os(Cl~zRXoqk{ukUU@ zBY6cm9tkpt=(<@L>j~4WQNP)~y1#_}e~q^PuuGKr2jsUd0Ysc+#sJ3fPSmfILX|t` ziDb!y=^uVB*m-vZj`ga$t1WpF&O?C28bn+z%ytGbnoXSJqsxvsin#1e{^&vT*V6RR zfj>TwVggoj)W^ane(T2qrk~tnzh^Cb#Z3N$bEa@OE3No9OXpo31~w)g z4T*qTw1=XdsBPCy_Rh5EJy{c|;etpv8uWd)q3qUKho);%$8SNOkh@VcD{gaPkYZ=< zN?W}PkB<`HXq#e90L7Ux85z8=dQQpBJL^o)Fa=E|5@=;8n4s>U7=SDV-1cPoj?dKt zPpN8FiJ+?aItJps2-q|b(qdCD!(!Ywmh60vz6^vsX&1R+UzOdJbs)?G3;FF=^TOGV z&YouV=+4_AuRpNl4%*QXS+ol(c;IUR!({rkdCK_1_uZS30j{~Cg+M#9GiDva-l2w6 z^l~|D5e|SFg!-5EkRgqGnIIPbsiJ~#)oB)HR5AAvrpCjJ#5vidNVvacmqx&B&9wPs zb*zmlzL2zVX`)+Qq;notP3WYSaEX&2mJ zg}vy8%W1v*reNoxYdDHdTv6q=#G>6)f-+|%Mm+0TXe!^#=x=e{U0p3pKfI~1luOhS zYFcyzU)j?z2h?JrbE5=V6GWiz5LFDS%_jF>W4?Yb+*m3<(7ar5h%VY7`vKe zzL{d)m4bJ!KYfV3(1}pYP$?;Cn=Mi3Ku{h&6S93Q#bZ!|bF&)if`n1R3hoauQqo$C z@5LeFci~d*#zMp8H5`3%$jrXEoB{*=36o8RNEh^h)v`6@i!9W+sq5f3!+OKpfBj3_ zwBw5Xs|bKY(zmBhj|B6TOGbefaG*fspIS1V{RMh0fziM93)0|k5C$&A|J3DF;27ec z#Kbh+OkY_M;r@PF51Jdja%c+!CBKyJiX=7PgW1$a=0h@{ZQVY#NXUH|^Rz=!4s?@$ z6?!)_@KA;lmo+Hri}h>KI}?>K*0EGx>MaKbCgcYYDr~ueaMvVHmIly>f!X3ZPfXIW z`gPR=A#;^#)Kde_ABQRm=oIj4$piB+$8A*N;d}lkDDo234&lcL0Cy} znS5Pt24=`%W~4VEn058%BH6vur&)9@^w>$_ASjuclehyH5&ip)GXH(xnF|y{ENdnm zcBxZaR&2gGObF%J4=H>vU)=uASHLd_%JBgAPBZWLMl9}cR&-TV?-RF#{Y{V+q6Jjj zc5-a3UeobE&Eb0j<9-;BZ}9*;8am08y=ZwtAzuzSsdBy zb%f)`4rjU?C49@bKfr9Z*uDaV+}534#d@9nbmj5DsQ$e+wb z*m~1rMh;{SI^s)l7QPM}6pblvKwFePJw5=+W@g||C;~eMF-wY)39ZEMYZiM#)5TzE z+$3RDapJP{t{g=wttpvar#revYcsui3!{uNT*0G_t01C@gu##a?S=uke?B;N=L}13 z0D0>WJp17?V!RJeA&QfZm`=?JkUTReA+FOaI`?9~i5L2qx05Pfcr%kvj38?nXOP2# zFs3=z&ad$GNypP^L(vS@#Cd}^>ktSyYz7J(`KnV7d%;kr<-I%vP{(A(%Ec@e*;^|G7h2)jvExdPs@x|a$me(#^<~fo|MNYd>+7(w2+s$Uf?rMF^`a(dZPRghzW>yF>h!ZCGU2 zQIZ(8LsKn3ax|$Agf|_!OsqxGiw0%ZnuEZ{IPg6vY1}HGJl%vp+*|U2<>@u!UQ!dm z-Z^z&wbI#s7uphSIwA^hVlTq+LC}Tk}gWM z%w($gKrT$I{Y^2C<^41U2!K)~Pd*A-c0n8*0S*cnKf468E}ZB<-){d0#`$Bx5fc40 zLSQ>a`VN&XvW9vOwl2u2I06_>nWRjWV!&hvzvf%c{gqO?r!!w z`M2J>R28vz+py8xmfz6t-qZpf6-#|&ogk0K`{0+uhKzwzR zLt!(08CHTaaa0g~1Sq*0#f}M1)UKuo|2;e<2g%)lbb$vV)Sp8dsT>knNd1?)9CMw% z$eE+Ro9?)=t6aq6l)uqAJdaLFlyQ?~R-Zd0M;! z$?(Ox{ZOIk1Ez97TChQK2$9#?#wNJOTJ~jjpI7$37_Qq+@UFR&&0KS-+e@Z(;fep~ z8GcjSPhPAPX?@PlXSF#23W(M$)N1)A@CxUR_#Tl{kZeJb&aAq|&kxdHoQ*es@#chb zzb1IJk=M^QKrD!uxuvinS&~U~pI5ry;?U_(XedE2&NzC^OkUSRU7yxXPtEHCd zzDsA_$CKdS{)&?Lj(-(yN@FeJLRA&0$21YXNx>zH@`rqp?5zsfY@+HD{6;IRGyRO~ zW&S78g6fW+ctSk)xk5Y?e{Bfo_xC2$^hWOm(}iw%jDN(YH?P}h$0JNi*fYZ^6i4sr z$42c{Zj?wAXLQ!qix3-T0JMOlZZXVg$|Bci_zXa&Is4p(u=NE$w-=@@{WFA3{upUR ztuW|Uu0&icNS_Vi*j{i9bTS<`nD<`y3V4n?s~)um=dOfHLB|FL>xK-|k7s^=I{Mv2 zk#Qp*TnZ+Mnqw8$EMBfNxV~?3o7Irf&uOtpXGhv?W~JFCf3kHw&~Q(B<$UUGqVUY) zCuD9E$7lz0|EY}U6v;dx21p}Nf-Z)m&rS4RhEcD0!U=|D1c-kwU)0RBkErE1{@r-k z0!FY`sVZDBAP@^$_FmU80Bd&Y=>qsxM^oy!A&q*We1{3u-zf)X@95b3Ns3#q&%wff3@MmW8BtJ>diIeDVT4?@nrDbfBJF;b5bJfv z-DtkHJmcDGl_)#&yOqsjbna%RS1jhuc}wYY34YuQXWAkk<>eIONHj4z*BCdu8&rp- zA7IiB$yduIT!P7OxR424K=Tw5h8~i!9axt{fYnJ^;+6jiSTskUFobzADx+bn(5WEX z8E^J6s}YiISlG0IAky@A(!~nTIBPgusCa`Vk)r8^_P+;WEnHLSJ*Ft@*YkRX7Anqxm-y26gJSBK4Vo(G4Vb@c zI>r(R(|PFi6v9z9z}j*u30*MH>w~CGcpD5&*Z~c}31_o

v!0`R&HdnZyuXQN@`v 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 View example +

+ + triangulate-tangents — A machined buckler verifying the tangent-space contract a game engine's normal mapping depends on. + +
+

triangulate-tangents

+

A machined buckler verifying the tangent-space contract a game engine's normal mapping depends on. Deterministic triangulation, unit orthogonal tangent frames, and the edge/UV-delta formula matching mikktspace within welding tolerance.

+

witnesses calc_tangents aborts on any ngon; planar UVs on a cylindrical wall collapse tangents onto normals; a MeshUVLoopLayer handle held across calc_tangents dangles on 4.5 (471 phantom flips, silent exit 0) while the mikktspace math is byte-identical on both versions.

+ View example +
+