From 2a21eae4358ca9e7d0c90e2b8794f5a99eedc389 Mon Sep 17 00:00:00 2001 From: wmantly Date: Tue, 1 Sep 2026 19:24:00 +0000 Subject: [PATCH] Hardware: Add MSI CMP 50HX VBIOS ROM and document the 100% Video Engine Pinning bug and cross-flash idle power drop --- README.md | 2 ++ docs/HARDWARE_LEARNINGS.md | 29 +++++++++++++++------------ vbios/msi_cmp50hx_90.02.60.00.17.rom | Bin 0 -> 1047040 bytes 3 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 vbios/msi_cmp50hx_90.02.60.00.17.rom diff --git a/README.md b/README.md index d2a2d6e..113c88b 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,8 @@ Total VRAM: 32 GB GDDR6 across 3 GPUs (Shared PCIe Root Complex) │ ├── llama-server.service # Systemd unit with NUMA socket pinning │ ├── ollama-proxy.service # Systemd unit for API proxy │ └── gpu-power-governor.service # Systemd unit for automated power governor +├── vbios/ +│ └── msi_cmp50hx_90.02.60.00.17.rom # Tuned MSI VBIOS ROM (31W idle & 25% min fan curve) └── docs/ ├── SETUP_GUIDE.md # Complete step-by-step setup guide on any Linux server ├── PROXMOX_LXC_GUIDE.md # GPU passthrough & NVML permissions in Proxmox LXC diff --git a/docs/HARDWARE_LEARNINGS.md b/docs/HARDWARE_LEARNINGS.md index c213f11..898a6e7 100644 --- a/docs/HARDWARE_LEARNINGS.md +++ b/docs/HARDWARE_LEARNINGS.md @@ -6,21 +6,24 @@ This document details the practical hardware behaviors, quirks, and engineering ## 1. NVIDIA CMP 50HX Mining GPUs: VBIOS & Power States -### Why CMP 50HX Mining Cards Idle at ~75W–85W Stock -* **No Display / Headless Architecture**: CMP 50HX mining cards lack display outputs and display engines. -* **Missing Deep P8 VBIOS Tables**: Standard GeForce VBIOSes drop to P8 state (405 MHz GDDR6 / ~10W) when no display is active. Mining VBIOSes lock the cards in P0 state (1,890 MHz core / 7,000 MHz GDDR6) by default. +### Why CMP 50HX Mining Cards Idle at ~75W–85W Stock (The 100% Video Engine Pinning Bug) +* **No Display / Headless Architecture**: CMP 50HX mining cards lack physical display outputs and raster display engines. +* **The 100% Video Engine Pinning Bug**: The `.17` (and newer `.1A`) CMP mining VBIOSes have a firmware bug where the GPU's hardware **Video Engine (NVDEC)** registers as 100% utilized at all times. This prevents the GPU power controller from automatically dropping into its lowest P8 sleep state, trapping stock idle power at roughly **75W–85W per card**. +* **The Fix**: + * **On Windows**: Use *NVIDIA Inspector's Multi-Display Power Saver*. Add AI backends (e.g., `ollama_server.exe` or `python.exe`) to the high-performance threshold list to force the cards into true ~5W–8W idle states when inactive. + * **On Linux**: Use our custom dynamic power governor ([`power-governor.py`](../scripts/power-governor.py)) with `nvidia-smi` script wrappers to manually clamp idle clocks to **300 MHz** (`-lgc 300,300`) and apply a **150W power limit** (`-pl 150`). -### OEM Reference VBIOS vs. MSI VBIOS -Comparing the hardware profiles of two CMP 50HX cards on the exact same rig: -* **GPU 2 (MSI Board `0x1462`, VBIOS `90.02.60.00.17`)**: - * Idles at **`~31.8W`** when core is locked to 300–600 MHz. - * Minimum fan speed: **`25%`**. +### OEM Reference VBIOS vs. MSI VBIOS (`90.02.60.00.17`) +Comparing the hardware profiles and the cross-flashing outcome: +* **GPU 2 (Original MSI Board `0x1462`, VBIOS `90.02.60.00.17`)**: + * Idles at **`~31.8W – 33.7W`** when core is locked to 300 MHz. + * Minimum fan speed floor: **`25%`**. * Aggressive P3 voltage gating tables. -* **GPU 1 (NVIDIA Reference OEM `0x10DE`, VBIOS `90.02.60.00.01`)**: - * Idles at **`~61.2W`** when core is locked to 300–600 MHz. - * Minimum fan speed: **`40%`** (locked in VBIOS). - * Higher static VRM voltage rail leakage. -* **Actionable Solution**: Cross-flash GPU 2's MSI VBIOS (`90.02.60.00.17`) onto GPU 1 using `nvflash -6` to cut GPU 1's idle draw by ~30W and match fan curves. +* **GPU 1 (Original NVIDIA Reference OEM `0x10DE`, VBIOS `90.02.60.00.01`)**: + * Idled at **`~61.2W – 61.8W`** stock (locked 40% fan curve floor, higher static VRM leakage). +* **Cross-Flashing Result**: + * Cross-flashed GPU 1 with the MSI VBIOS ROM (`vbios/msi_cmp50hx_90.02.60.00.17.rom`) using `nvflash -6`. + * **Verified Outcome**: GPU 1 idle power immediately dropped from **`61.8W` down to `31.89W`** (a **~30W direct reduction!**), and fan curve synchronized to 25% minimum floor across both cards. --- diff --git a/vbios/msi_cmp50hx_90.02.60.00.17.rom b/vbios/msi_cmp50hx_90.02.60.00.17.rom new file mode 100644 index 0000000000000000000000000000000000000000..ab8d72c20c5cb88dce45d547cbc7ebf2ed4a992e GIT binary patch literal 1047040 zcmeFacUV(P@G!h536Ky%0wRQtiU?Rhii%=DMHCx$QL*S5!1W&`=W;QEY?+ zP#_Rg6j2fEMrk6bQGuvI2?%-T1oV3A`~Lp;zUO(r@8;3u?4I43+1Z)dnb~ueNi)az z?I7Bsenf;88(9w~5D>CO_=og3$OmCGL_*h-8DVPp;I-E=1HzB%TgeP)-TA3CM1-cU zHrJ9FcqMi-nGyP64MKb27cYn7^%z12k{RrB{HlY5*!l=-AsmO>Qnk|go@#N2AI6ED zAmATY6EMG}SSuf^Txx`jq_X2`wc@3%2{NjH#y0JI5_H1a`C0;*v`Q+gR;%gi_9jws z>}F0Zrr^@Exkl|t_|2U51d@{4=10~mi$&0f0bP~m6pA-19AOlnGCryVfJPmYFixv8 zr_q9y4U{6}EKw=c?J?5Wqa;)=`K}PiIgO;$Rwen(Br;akh%|Is@DjCn2|7GJnHQ@q zxy1NXr^YyHbxb_j52@Q#BBJ zd=Fuw^ogO^6P#O*;mhC=PTI)*7;80#xz-`a)IufIC{>~)(^G{?rmng!hUJ4{>iU>g z8LG=st6NtgPTo)QzX18I4k#Q(0K~(9Qa>rld8|Dc)>@6Ah82ck6Zd2JN&x+-Ye0Nm zUJ`|uNR{Czz#&HQ!tgDgyYb(IMyheOOo(8z$WcaT(ug;ny+kCX}1uM z1GG;{wK^P{WpkNuql=Xtafl75TF}HHSXmXS1}y6Eg%|>DcpF=B`9C%mw;f(!*dYohz8&krYf$Z6f2f-#az16 zq_J3;9QlKg^GS*rLaQ8A0kjUk37ER74)hGvQ4PvTQYSsBvcT0>o*iSMH195hdOA*# zKrQ0}CV`x7jv=-+1{m^F;J?xjfzBg;2Igm>2g=_wl^XE^XrngkG9I@BsI z0MWrsUD$5+reANvV7#S=A*>>~a9{55fgw`?pU_K*wvEId+kwk{m6(`snH^vYeBf$*-nU zZ3yDxEhkEEc-^73KXWBVy)#|mQN`I=FTB+4{)WNvi#A8tEL$7A=QqXqa|>%&;-c&- z*XfcCH-ZkMU1c-k$OX+C^F8Wz&6TmDTBoR&$}%5L8t5`(gs@k66=O;0mAzGFo5D7% zIa_x7oWo|#-lrC)zDxqPr~Rzcj}!@)bY&v;BC zwvL)uckKmz>!~dNh=ST%SFFajKfPq0(rRI@SXQ_A;+f2)QHS>@?lbs0x99{t(Y#Eq zb8EZqp}V86Z5*E4Lc2bB(uBOr(e1SDRXbPoU(;=3V3ki{SdmAnb^fxLN!!-->6vU6 zJd!kfkYmZ>MOGHx?JB{l`?mtGx(JVa`_R8(=a~~*>;`8jxvw{F$yl7*>NtMFvgpQb z8*Vrm=Dhh<^S;U6<$l`h6^*(>h3mF1*)yQgIz(yU(R#Kj{J3R`3srmX*|dqSOQ_ZJ z_tYggMn|6T--XA-(y!E=9%$k|J@Y1cQ*W&ScXIvSV9BRyPK?@da#WP# z4dVH=L!W%TJ~fwrP;1~D?TuR)RzmUdkERdiPdQy}c4NHf`v}vxNAgnan@OSRb;rI# zLRZoAG3`9tXG@h8E3`JHU7*U@uSeW%m2L_zO`aEsreCkwmet@C@~OhuYS;FOiZTzK zVYOFWZyo*CbkR4m;^q+@_x!QsQ%MOo4sV_^V3?~7?E<6jq3;!K2TDWXEPwTr6D7W- z59enTjvpT~pyxa7sG@^UzGfy3{XUpzIQ~@7;wv+2kCjU;1Zfq~cPyz!A3eEecbJWO zTzdc9TIV*ZT}j=IQ}=YkH(apcJ$jZjbi$#B0|_MwEA*?%4oAOMUUKS_2&vv5B&K)x~ZqM7tM7@EzgIrVQTfEqP_nYkg{qlVV-&O@(@wq9F z93LksKQqKcNZ)zpHmg}UIBy;^bVBITdfQ>veP>5Z^1C@{(#BE)`L zd0%gq-w>~tjco>od6UJNXX9?tC4z)|(pMJiKKfibzxIp6u~F}PANgp#$bC+0ObqAD z-kPLMrezD)7o2qseta+K3Ux}H5k+1lmKdd4EZ>bv^n?k}v1XYVJRkxX%4}3Mn-!$#o=UNKe}S)D?#UA3Vnb zw)LyozVvgbNTez;&$7ivL^Q_KCXURg*{S<@-P%PH#x7nR7Wc*X{?eZIo87rtN4>&w zE-qYj)jzi74CywlzYrA;$R{O72 zMrP%C%l4wyM@#}YYQ@)pK9^4R=y*_gnB*5fHTbjswaEjUqZSRxRwgbyeD3bo{((CV zMO%I!b|W28g9xmpW@EUC;bUA|Dg)n+@bF()v#-xmqrCJb`>xgYs-9~y>1|8xiuy}S zK2PXLJ-@t9w|#e~`Q)u$+T-1buR}~K502BKhBl-J8~5t9ly*3@>7`A5ZfK7+e7bFq z^WIy(e%=0P+KB^So~6b!)iqBS58By!Wa^EZT7x!>lCKI~<`wT0He=WM@jXQ&Lc6Da zxKX}hu*1;gyY#W&j3@tf8o1KAYT^f z+jG~Pc^g`|>j*EYXCFPAC$INld)DvQBG2}erul7NpYUe&DA!eUrw?3k-nTsQYH5OL zwdibO&j9;7>oc5vE53$l)tP*#tM@MQKM`*!@Yu7}xlyVA`6Tm+z(1`26RW_ZJ9vr#p`hlA(zj8p*ffH>(m5UzsoG@2wR_IAaql}E+V z<)`CkT`^huR`F!56Qv<8!o<1{b#Eius4Ht>~J8MPn z;vZj*Nvhm--47oV8|eOxX>e-{NfD-c5uCL@q_V_k@5^noxHIO(&0GH2f7%+Bq)oMI zzuvyJed^qs-P&f(KiHD&Ro=hJizRH{=Dx?uisbxQ{bB3JZ8js-vNw4<2JQ48G&x`{ z)yHGaDLu=8e#4me*R8Z@dUZ0u`01QY(QOl+&+j)(yMNNoyz(I8fmVZQfiv=7MVt4Y zyQOxip>Y4KrkaD>?cY>qv#RE7FqksVPWPz6P43IYt>YKERju%`+jV2zprpcc7k>*F zn?3JiQBHL~%t;Z)j`!|vz9Ojb#-&RS#>W08)@di|t?g^!k+?yUR&D;xVB|KFD9VQ& zy3_OC-aICDs;sE+(s>dZoXV4(qD5}98>C1061`{#cW^@+(Mkvym(JUMd~@=yGma&5Wl2KwmI(^LC zp8X!>znZ<{L3IArUW@N;`t2q9vRl-PtJo9wep!T*LFUC&z1s|tx?N#Bul-6Zcfz5@ z$@}s@9(4Y`?nurn@v84mQO^2W^{z$CM z2>Ce8>pbPq@+EE?b&vIXZ>~J@aaDcWiVLkLF9lvYGU9Aeyu~5Uj=4r8>$+9-eNMZ+ zUT-n>d$-zqvYGj!ZkHeQ{sE5oyR_|mmY}UAJ zCy&viYxl1pthjU5ExFCK;cbzX&FRd;Vde5goYO`=r3;3JA1@kpHeEEXUwQA@ejWqY zESeh^x6jEieW=!i9h>QK`R;Pz)Iq5?$N3nuXQZADc_7e1TNAfm+q!nv4IQhvnD^d_ zK3JoiQOkHU)3|umobeUwTw-UvtqT>JR0neoH$T5)<-6lvW99(Sob?R`s=F*->WP-K z`}RcVrgsZ_mUX!Qy`dhD?zjywp7p@=p5?byoW_}c zL6$3bI~}UJXTE#JgsCsbA_ zjJ>yYcw@NZnKdfUMUL3IHGxg#TcghRcy&F_sj*~7|0??YEa_YdBXrQ(1oMU4J_Ntr z$UZ-~X_43At=MjjWDh)?G7uSy5!!v@Q+g;q3|&k1=~IE zZVXGAbcgr|9k?BJ$nLXI#hmI*12agvt1E1&E+ae+n+6BY_6+T3Ls%4gY-!QLk!;d# z?_Smq1~1*Bdbf=pxYe;|-WI2XCss1*nXC7nZXUSV@0iQk9{#DPu0Au|E4cl(p!E3- zomu;)t?e}C0 zG%9J7nse9PVD&d@)H!*U&eu|#(9!!wpSi*EZecmGUTP&K9B=k}XHva>{~E`|PsaFV zy@)n`97Jj=REAS%wik<@H?LWwo~8D>M{8eYQSBUdy5@1rJ==K%_r6D8b<A-Sq1j~KxTC6y;63@6q9i7B353X+Px>1jDDmaPfpw%^qlu_==_mGU!k=o z7ZtfKp9;nhk9hQoc6a@Xc8)GhRoFFRcL&bApZ;K!B)X-4L-%!AmS0aeWEU_NP;BGV z8@nIR`kJR&)nMZGKrmJNu1pF= zcj?sYe&-`M^qw1(B#Ja|@{7A|tk=EbeXoseoBCT??y>Yty)lA@&2^%dRb?@#5%*@8 z+_JgzxYpO76Bv17l!zkGZ7M(yTl{r7y4?Ck z_IeCXPF=ja!_C6x;o-f4E3tj|3=ey~C2oOmh0V|&M|>w3=I!0Oj2?1+$at5d?!7)Q z=%_gS_L%p&vm0K{KhwJX+?5M`y;i-O{F>5jt-|zhty+ORHJ;tP$PtGr zO$Ti{o?Ua#Fl<^qZO~d9yA}FdY#!V$aNGQ{*~&xUWu6{(rOkd&|7-7b4sZFerp3Zr$H{o=shLadD1lVxI_B zl(|*f@_3Y4YZmwL==Ki^esf};=@jGqs_%EO*OxjH7FhUyxFs^b9Xd_u?fcAY*5kr$ zza`%YDi%G+DI7u^R{Q3Ye&fn}5j)4jn?zrh5>)(2295i8N zKCBPi?)SB6*l6#X)n5}&E#Jt^KePRd=fGXfqq3Km-C6Z?>udGmtp^H&bBuBtK9?R{ z>LQxS8qf79*}oyha>C6E!2uckk@KDIOdb4rEOS(L`ujOoLL(R~rif%*pI1JFy?mi{fgE-ZH-Oc^F=M~1?+{Y3g5%uh@^nHDF z(fLsd=B~I@E@_Fg&&3hzWL}23y*|v!J<~%kft-~;Ib}zd<-M2pEiJJGpEjNQ6}78x zbQc6RGAG)fO`9*<-=p>*_4}Ol_03K6%zEYKe#GnHb^dFvj~QU)J!M{Z<8!+f8t(jB z-&Z9%hY<${y+1hM<>yCN7VUf`xoX~W=*UI&jT_|bDUIbQ*y-!@kMY4LXIN6V7bF@k z?bGk+rafZG`-t*L#T&kgX3lOF5h)0at7Tk9&~1NP1(zxy6dWQ z)LN%|O<38hbVUEy6^$`lx9zv@;dy0u(2>%)cc=H9o)CL3JE*sm8)!X?czW&Y4WaRB z>3YTI`~7=8+&S>#(j~x#H6Hv*N&&jmsnDR_7FV+FH#|iQ^xfNTsd4fSr5pmb9$k zVZfAb*VH+06MY)v-O8={JwIw?;QRROt97>XMk{B|(l-$#eY`ni@JZ(d6IU%cb!n%~ z1G=B^rn7HU*v!WFYeEV#Z1y~xTf*o|uMylT%b&(`JlC-7!qaruRP8gyLGO4k=#<1T z|IOo1DL4z7)1q6d(+%oMo5DYMy3ABQSaP!LYx26Hhuv4L)qBDiLcL)!y2!TDe5me} z^S1M^#3bi+9K0duzV*r2yG@IQV~suxz}9_AJH0ZN_BQ(Bp|KmbZ+X{ODo!wm%9j+|(6a{jH-DSZxxemRl(I!F=SyeYZCK5Ovok>V8P{s}sf5xv=>EXkG0 z51EGMRLPh6*A*GW{XI5^3`d;Lg$4B|v;zA+Q0(>HHFx-T@%!DI{a0*XFZ(V0x0ZpQ zd-5M7oPCf@C}K6P(D7-NdA(UsZ&i?{C9$fTmYwr*WNt1aees);+kI_rj~sLELIkhX z^G$icQvb+@b&tY)L~$2v0=_ZaW=(l|__q!x^|OOiqaBQE)4g|Jr5rsf>M2=yoUI!9 z+0R~j( zkzq~_X@@R&SdWOW_&g)&Sr))MdULAPv;m|j3{lcA^)d?39?Z?-D zXK#N$S3Y;^$&k&P65cL7bM^Y96R*a5O3ml9a&-=Md^)!3QLasc&j`E6P2|msH{Jqp^WvW+z{B_&>aUO(Y}^_aK{A-xqJoMw&moP2Og%QTO) znmsXR>qdULlsD({2bVAIL3{St4~cdfEPJ?(hk4|v z6;`3!MBf%Y(%Bn3<*bhpe}Bcsd!yff&ovF2)&87rQLv$YMMvQEoXhvqzVGCnAa9Dd zxUehnZjN`isjE=P{(_7k(+yu#%FBIEOkHp5;P;Kc z9XD2we=&L~L4Cx`{FLEN*WuGdBXdr?8g=wjO(T+v^rs!!(w|W)9y5g3ZR4(YP0t?H zxNRZH-G3uAjlaLYY2L8X!8ymqP$uX22_xDm%H0zyT!)jh6}lByd>R~kMjNL2gvG~7 zA}^8G^?F3VKk#g?={eTpzw%@DPT_r4%pLx1X7JX6L$|h^v3Gp6IQiXS_4eAZWZ0k$Mh{AqkHW3_`t6sFB~B9??eY%kJL=Op zy?5G-RhL#r-kx(ita$0W%Nt52&KbLXa$TA&gw?3Mz zvFf3ieDd8Ozv}P$wBNFrNv;p~6sQk<+a7zqb^p8qXQOAQE#BFjrtZlaJ+!<+IA_(h zBO`a7I~vztKAQG^caLkEoF?vlG|Y4PhuFtKn|%gzSJEu2y_H&njKXJH`_<@X91m>1 zV5{Ue?Q>A?Nbc4gxcZ3cRNaSs?dCd*X=E453tIR1=T^e|6S8g;A7EwG*0?XRZyLRJ zX3~K9{Wm}T%uHY3XJ;P+Meeo<6>+0KJV-0}p7XLfA|qpeP-|xPmyX8W_ESDI+n%=5 zo?=#m^>O*qI{KP;R=>l2^Qx}!&ZIvJn%*}hy)-D=-lW#OFn`kZ+x_`V_w`&oW>Ij< zo1)W=5y!H!(%s)p3yX4#+2gxHYAxFvlw|Ym@WZ*gFYkG}_4Bu3rTKZ?8~sbP9Y3tK z<1E|OvBdRR_NN}#WP`?B{B7tAr`FgKlOa7FXvfayPrNg4M}2>PTkFS+g7$0jyZ-O{ zQe0Oh-!z_9Sv7CkCd%#mzdbc<>o+HA{*M0D11I&%6*+rdp(al9Ua1agsM(i!Ri|vs z#y(9;ny>83cTpS|hiTE8r6X z>-hQV;nFY5!J~paUw0rdZl=FuU-Cj|8 zWAGjF<$!2;WKZ@FC zoKEV!W_Y{t`5kZW9F*y#lh1`f-mNE*nquQ6*D6 zpG~ncxwa{_+t=xR-?(i}KHWTr=`gxf?{xJl>%}|tJe#t&+g|6d=TqlVPbj{uEc}+O zQ(G^b&9iiPymo3?MMOmbC2XhJ!a$GO!g~>WsxJ#;Lf1|SI2bl+Z;ec_3LBfg;krZ7 zjBnG&j*Vv7oLabVZE?R{tAxJmEIZcRJj{Q#Xu~Dzwq{}V#**#5?}z2=9x|>q(RjGW z*p2rqmiD=!?n$`c@80H|F9U~PI(a^Jbum!(^?hOiVd zyPjuLEvD`}Bd3#{IyW)y(`Bo;K-N4^6&wGs7OSS*h*8GuAp7&_EbznxWkLR6| zgg$C*;@}6XO+FBl`dqxRb+7PSw^Tu&2+sYAglF~EISYgO3?6>?)8Wvh)4ms`C_jC> zC!RL=;m2oBx{a(ESsw05#Hw6cWQT6(P))mg^5zUYA79+3raGF(TkO3c;n8ZlFE`_j zW)H1P89B3IVvw$WH2B|9L)>&6J93ue_b1H7>Z{-q9vgrIS-mPpBKnZ9n{O z)3tbBe39{nFTR)#H?IrNMpp$0%F1lMqzP;{QGad7WdwhLgup4Si zUU$3owBG{1&(@E2>1lKZW;yTl+uful|&vQok5Jd{WIlS;y7BnOi!} z<~sa2jqs=RRYB+<8jz8+r%`p~DTk-0mJgZxh0->iJXw7p#Cq)KEqf0pA8aCo{5gL$ z)z^0#hV&q#h8QV>I@b9h!Y#x3I;%e{n0Vah_LvJZY}ZAoACKRC?9TqgKcM=r@E-^M zTksap3>Y99W3-Z6uU)8?b%GU(gQ3TQ|e*R`}A8!RFs@6%9Q&6gI2$7cMXU zgx^=d{RQ{wHU;%BH!c_vs7N^zv=F~vsN$P$g!?UU|GIb6y|N8UZ|~F}RJ`r``}O#J zfd{h$zmNBSe`eI(xVTLNUoY`r)SJ5JE8I6J*+#W#b5SDsp) zqv7{!DkE;-_woK^a|d51lrAUE4hi0$)+hcZejlwhZp827_;sR9HX;#ku70@ zT&n4RZnJY)SAVO^M^A0>&+}D0FXmES9u?sC7oyTY1J~mk{Pv3s$3@#;T)}9pVvE*9 zQStjWwS%_c_i_9;%fGg6A@3U1Q5DuoyU0k>;IF%S7{8C>ALMkRS7u^}_TFtWcYFM z_m!*g69VwQHc~l2ffxUeLBXquqP9~tQ~MEQ%vyLGIaXA&M>)I>Ua+QX-f8E?lXVrW zhEPlzyVnRgM|@P5DWZ`izDDv&^M*U$ixOp^CuzXTdv#E``r{M0vg0eMK2li(898Ui zFeGwLdmKrU$Z1c|lE%g)F@pJZDz!SBOF7Pj(*$yad*7+cBvPST5+lhFI=?|mYcA_t z7)DX2<}_2IFqs}^U?k#8V_6P+F{w(y)mEDS>C^%$9S$QvVekStYuaAys0CcZ>*&(^ z0VTwMG6GOs2d}D2l8_JwZiMF+LevzcTF#Y7ktC-^^GbhpD2|3F`l6P_P#EU=7-*lB~_**n?Q~FX>(_ZNfCIl zs`p}ofpuwWHRn7g*a5HQJHvSZa58~3_Bek2KqX1iR3q?9tx=NCvJAs8K@(K5OvA7$ z93vb-@E9qi0|Fd~IOCJbe;tCXa|q=yga8N4`|Oxz)}ST4LS9`6{RJwHn#9@?hV8}i zc1~LC5&Yza4>bZ6eky@nM#AwFRdEnBPms#-x92Mn)M;Kr*Ki-IW$-pT>v7bd5&SBqL>z*wN+Z8=%?-_|1-KOAM;!>{ZF^;cjopl-amD8iT9D>i z|s*+!C@7mgt8Kp z$0uZ*cuQ2$zG~)FE$=SFdkP|dI4=D210RNr z0N>9t^d&+2A7%WA2GFNJl=0R-?&DW_zqHpt$ICVNozBmyS3j=)_`7m7hRO#ZbU6P> zAP|T$afai>cAhGsX-q`jHfq5Cv1?a}hyrFz8|ga>#x)Y`v)V?}G}K1xFRi841elip z_dZJJ?<&Iw-r8V>Ogp?W4k8OE>>f2pN|%~;9?CIe32N*9k0dE=gh*)ZR> z82Y>R%CY~m_I>p_+y5E(-@#r#;~!zS{D0w7t(p1`5Cb@nMUW&-lB!bW_*pD4?Mi1- z3oeO&#}|*TIr=LPJ4!G(#7B67t~BqabYViVJyyFT0pZj4>s+(hM3`abp8??bkcy$Q zQ8}x;Rg+Z771KrXYzo5l*#WcHmGIkJBE1z*}Il?lrJ$d^vW!I?)I z#_?rjuw7EVfFBi067aK*g4#(nDIU~R?r?+cXtrmi`T3YhQA#{Q595ReH6n7|M#auK}#HSc`@b#1~ zhMoV!N{lKaIU!8I&sWMwFfaih&PA!x(_BgAxKYE;nGwiYaU>+>Vhi(&07Akq5Q=_4 zNYM0>Hp%egbfk$IPX$h*5j2S(BYl6GeiwMaL)JhS7h!H)xRnD9arm78G^=e$;C#E(mdYC3+Yf?6x43WFaLri$Qv0x1%xiWAta zIE;m~;K-VP#v92UYS_7Joa#EBJ{nJn}K z52dCl_2|_t!{MGPHBL$MWcSy{%JH`16wIF8QGsN(8d=dG$gdOVbJQ>=GQ5W%iIt>< zD42kP{|Z`Vx8VVtkk~rDT3x3?!cAPHn{ULb(n3&Tz#&*rxTA&Gk_`yMy4rr?A{!-@ z!rmBw*V#HF?2$cud2t^0gC7>sMiQrU?Au>41_dkP=tw<^=xPut^N*UgohLDAVc=yv z#bj>22;;>P#9Ty|ap4*Si-WW=tWrZ(Rh=A>l~fCv1wK}Oom~BGp$x;s3Z%>a@B{TEXHj z8|mumE@e;DMY8F@cMTWx*sC`q)^QzFARkAf!njAo(OyD4YKyc2fkQlWR&kC4TpIL>m_>(RbH{x8mPxz6A^(R!)*qTI9;P{ zb)VI0U}tyPj33H}3u!tTvE#y!Y$xIM5K23{1#It`DF znSuGyCG*nAU5C>r#1Clf(ih|+CH&ud21pp4f9EksDjOjRbsV=J4*dgFv zYNXP9NIqAf`rQbzC=~Q!ER5kLK0rMic5ed&vqoWneqhep;Dl3HMiexhB;6pLjcdXa z*+ZAEc{cbdrXc7vHuVtR6NFf73mQ>0uxnmt6*<6d9rm}msK|kUU-jq?S1`vGGH-m2 zV>NS3&re}<7IZ=Qy*K06>K`;r{av)jDYy)fmcJPS5b~2g5ONB8#>wC9fPxE@(Aa~< zcOmSA+-%;rLly{PERE&3VyPZVn!d;}-;Hgih1AL2#g>TL!STU_zFN&RLWjr^uLoTq zvqvn)@_q8%aLMSDyPpF3yLcY>A)b{JNDRV{g;81^?uFFc%i3_Z9)6@=IC#!*EFCNv z^uqQIE&SLqI5vs|fhV!^$iL2D3|BRAif%U$8(g7mnr!$iu`ZZK8#xg0SL~Yg{HJ;- zRAJBYDTk&VW58lNclcl(zF=ja;DW>1){o<3&slEEs-~if?Vz5LN)816Ts{E~{F8P- zhC))pUW%jh^hQ$y%TT^N07C@;KG2YWJv-ihC_(b z!`K;%agMM4VJtWZ3;}Kj9^tC>5SKxzhtvsh6h&I6S~pWUNV>j=qCReoAlIM`ITCe} zmPnVK@CC+?dP$w6ELJuZNsjYUDN3p#M}-yfty4Rc<_cCj6-j3UAUG{iFdH9>bf4f=HH>+Bv(c;EX1PfqpUVK?=DM4%xWiPskE}b z6J)ppf&lP$ zCaQup^KT>IOVdOG1y@I$i0uaR0L~)!7iZDuhqK7#>5xI7>+}$hPL?r&s^UF{F<&es z(eH{sO_JF_1=o-uiC!tGoh&W~566}@pN@(sbPbteH_W(N7az(e9xSt-DpS@2eN;{A ztP$yo%=3$&KL0V?VUOxYkOtnQlJM134JkWu5pogCl`Q565_ohPPoI1ywyT*?PU%GQD{yJ%G zTS&Zga%Vu)2;!t7bSW)<0Auqvz#|f5rITTuUCY5uye`a;gMOzB{EZ&9X_0=9G*m7S zUUAe6feKVflq?cUPZh_~n#~Jg(bM4xFfo_Nq_n6VxWJtJOhFoZz(&LhVjz%{B$!vS z(tMeS1Jc6zMOsKdq=i%La9BxY#0+DI%-BZ~z?NdOdDdi@QC+fHRi~sHfXXq{s+cTO zGOHDUk}wE2aCRgCJD?AYf~9MK@=5=Q0U8w!$2zXY+ko&&4 zhlJ-*FI53ou8CV>Z}s#!X_5o5J|m?{M5Qw6fAG8 z3YKnH1*8UJVK(v8J_R0~WBVH>{K5D9AxnIbP;}Q7JYd%p%$+G)?8-p{q|%CGxPL(l zxi3RT48o^om>S56Pj19GmDs}jf*b)&7h~-)>zs zmDJ&QYCgEN3P;7^d&j6?_~s$<5u!ap=qWN?Lc8!VrbX^HcCdHaR>Xa zprM;G$}GBq{tAg|9?!88T}*~yblc@ zonhQ1!VF#ED~jk`OcYa8EP5(^5#>M-o**e{dSaWN6mfss16XkiC+0MB`cUom6fMo9 zCxb$Q=gl+4iepBJ=aJ4Kp0!@F3X&?sW?CGARfrB&yqO9qa7^q#I)ZpscVucT3kv8!=#so(-5pVGTb1A3U+!kX})A{nlbA$;kv$!csNKf9g@ zQbLvbfs-om>(XI?2R?W}bd-x&t4&Zf8ApWg|A=;q)(Cb;RidM!c@VL#>Ks|DU^aVv zH+)Rq;5hqN;uxxM#G@cVn7Oasb3g$tK8Gy5ni>9!HRd|qYD_tW! zDxD|YDH_1m>xMu8JVi9Nqai-l0GtdQwg#*Q!KWCoS{~q|HiBggkqP_-EY@@r*uq(> z;1ZS8LAX`xoP93=U(-XH6e8nTV|dHSvDiYHbcE1YN2#X=MpuP3n|JTfm;}$ilQD=A z@%(!%?)CX&uvx>+D$$nafIm&kO3)TaSQkx@Kq9#K&z7sp^hhuNh`N9QW<0sJAPr#2 zwWa4_l!k&_mI}s+!~IiIQuO|36!*tC>bt6^hHUUdMHwQ2=x(QB@}d+~!13-ZArryU zCE?e|WM<%`%4@v9>!+tCD5(L=CW6F)t2V7HYE`q+n7}!Vn@-A3Ar!~r9*!hkAp2+q z9?=m10oS|Dp?{iymxiS#D$N;UA?nFXBWA}yE`Z5QBNxS~0kf1Thu}x8G>_=g*uQaB z+j{@9bX4sCvQ&m%HJU+?i!P`Id~S{wS4x1h)MaCh0H;d9YbP*2>A8{+!(GvXkp=-K zOKA#jiaII@%GUOqJ9U8V{6 zyfhN;5*EW}xYnS4pbW)wI9Xqikt#t-nq9GM6j*$l(sT)A{Y*J&5{NTci_DNT4Pu~d zE0Gz*K`jeDta6vpNO^bQYfSq@ketknZF)vMvB{D-@pwc+mT%siD%&!3RGyh3& zp_S+|oDZ%BSnjTc$mw409&S2;o2CPMuaY=UYP^!F4LjYE_n*P{P9Oohz$X?|vzX=x z@<*~?vFKudi^VJNhqk#2(R8m%MLFu>b&^;GE-o5W}O3S8pBDP&EC%N)E_8sXnk(_QL5oU3$hQH|92B;DO9m^+1F zLj%G&u}qOzR3y3}s?B7OL3MT6ZsxcF4Pw#>!|Nc-&}c2ET0m)&qZB!eCn^YNI%)K!6j2`^Hqxp72U1psD!v_znc8pbhPm5BC2 zLr9Y)>T0B+^MB8&pZi(TG*~9K&=qR_V?3C~B(n0BlRQvPFZ6p6E~k49dHyGa~uILqx=Zat8gLQX+KZL(62Ax4qn2qEgb_RaklOW>JgXT1wXuLxw3wX1& za29|awK457V+)w31g0emg8%H^t3#2yEa$LtwBYu*Z+$Uns@n96t)I2D5Rd!)V|>O$X6Z%bU$TJ6gzDmPQ(D zYyVdp2Mb)=7V_^}tO^rlKwHr%JQTPIE1i&eg`BU%bL!fPJ^NXHy$Z?JEl%j(yE}K zgBL_|MC0`^mp$z6Oe8uD3rK&jG^RCqPz=eAuVfl(aAT%`lZ3a1IvN!UT6iJAlqjOJ zba6@;u3Vx%Z#XflzcwocC~(jhbCDB|MdUfrH0d_=8!k90yjZd(yOuRTAF^o0u`BVX z1R>4lKm%BG5)Mo3hI_7nmT3(@F?ZfjqN|crd)--@aPgOLVdvyq`yVgD1zsf}00TM5bqI7wCbA# zlEldd%nmo9bA^AFXgvm%M^Tmu1D z6z|Swu;=watiHAg;%ChtXwevO9$!0)uALQyn@CRV-^hB~Xy#8F*%`pd^kCtW^2JI` z7NdixDMLyca@4R7$$|Asnj~n=>L3dE%ryKjwMf;9m{9jLtP9Q`*YH0B*YxMJN^Oy5 zgWa40F32NW#8VRiq2m9*Z~Ec3!E6-AzWL$Z)N}?Rok0w2PvR#161iAr0E-=1g@oRS z*F=KU%Qwg^K>9<`Ot_gw%1YPQ@E^=qmK>%Rb`~Zn&HVr}Ofc9$@1i8NtPrL)yG{$@ zBVLmhF0AUC4J24lf0@st}{3WzmJ8iYX|NV9SG31 zaODuRb&dbI|L-hSP1WRbnW9qyl_-;)4Wo3RxSWYeWX2?E13b_-%@!`ti7btVR3EMPNeMTiQn?z(fxq(}qNQ#QYTop(cHgMIZB-l?p z32u@P>h6^e^R9~x;}aCzP*_E5fUm@&1!{PV5+1#bB*8S;p*-%N?uH4n%_&i_b1RjiC_`rCpbRy#F@=`GqfG8ot;HRLm3-5GzV{_9ZEH zQ(+wvo**dJQpKB*zIZ7ta=EN=eNap;k&Jnn=98#u$+^j_cYV;0)v2&E7APt7Dq+Gi zzFfK_oLd(S-p}d&tXF+-_srE>>!;J*DTJ)EeSSLKHJy?HveQ6>-I4yhCQOpf$%`VS zepc#fOQP{ehH0D{1A(HbToli0=!4+90={X?CbFm;oIyUb1cNM6kQ!(vix(oD>`bCY znQh_EF=x_dQxfL6UrbrOgb6n;it%qDDqHC{5V+@jHio10@KDGcfj3P-|V3$G0TC-dJR`} zqTsl616~1F3q>3;37ue(0R@2v>m8tmo&3kFD*MijkH0tCzX%0EBNQZj<3n2{&}<$W zk|6?~EW-y1k{9TJ8zqjCs^4jjzOo`6@NKVR6-{a0ho`R%yDu1ST_JU=tJy@-Jh+Qs zCoxN3o0SHX>B64OEPFgbwx2?PH5cER`K(LOOxXW!XGWt1ymT7q9PCBv6~~%_O6nJ@ z-WkI4P6`J!{9m4T`su8E)Fe8Euc(|@x6B&4fS;)_kmxEe+SP6 z;ziA-7wfPi?CR%5kuq!a)be)qjzrj9HwTj*+ZTa;^@h=l&?6m4 zWdK?}iBpDeh`X-bTPm(5D?NceDffW zV$3?z7p2};nwtV;#-bOjbA6F$9R3Y^8Sp($(kY*Ae`5p>82yyba#fhpS*a1xKzI}o zPd#~YGdZT23NvAHcVUK+Fw!8CV=nx}$W&MeuXPhf(%m@Qg`f0=4-7@=qSp$gPUd7w z=g7hN`*qa9PkJnq0m#r7D_W@L(g|FOmPA$4nKZ)}GD6)B$b-Q<8Tpu0&P&8K7&4AJ zVh-xYl-sx|2HWu!AE~Tm{ZM`#mqOsuwIuxCb8afF)aYjOFbIfgz@}#Eb}UoT4Vc1& zAXc+GqD99tIfl3>%)>!b#BwwP+AuOX^h{y*%t9mKCzM%Zkg3oYMq)*))uQ3TPXspX z6T?=68)5=FKnjvjt;zE7IRPh0Vh3c1!7yMjc#1}IL#2T18t)U>WwkKUIM_t&jA&d_ zVkSdRV#*j!V#)iXB7HUF?I8K~3;nRVBy^5g)j48S*N7{qtXchGSKdy$nHquq(vOFa zTWP+jbJ$Ai>dsM{6qo#Q)JpToFlaJJgWq3LkU(&z!Wh>BSRNfRIWU>@%tB*e20Rat z$~0V(NIIp89*Bi_nnJW1*L&Uu zOuCA>&`or?SUpPk$qe4OF^nQY+7()q$|d*eB^x6LKvPim%{2p@lQ(Rt0VSP*31?~p ztu18Wl+YM~NC{tAgsAG`TGZkiM4Oz91$SdT7=R|H=}b=6-W}soWUHoNyJJ4*aY+i2 zdgG@a!bnSfZH_-th#A5k1hgfqg|AG7pA1;V&LBXhlBrRt@@8@^wj6fq8JiUYHi5em ztYBF=A#Vw=(+rnJJ=#<&Y~!netieubvNg8x(?F0-kU@Q{&P)x0gWNb9MC0=xYorKc zFVQ2^Swa0P zObC!sLTb21lBj6d34$#F6jW?MZKWP-we^bH)^jw_R$J-uGQ^4QBqXz`m^LUR?qR5r ziJKmWrnD-kXdMC>YGdoDkkC#l10?f(-nD0v2?S_8=a1j#*N#eS+4cpgs z*x~xr8EQy0T^+MowtFUt@KAG^EfMc;J?7ZnJ2??=z}h0FH7l_WK_eHzLI{hr)s0uI zx%kI!!=Lt1;!leh{&JbfW?kakDR_?N7yKq>`iUr94262TC%cQ`cnn65Z$CUXSmmLG zJHEBa5wndFuf3S9xvV`Ota(EbYtKiZ-_)4368s6wzZJY#v-hKR*V)g%M^Zo zJ~FtNX(`_-uB6r-cBIdbJ5T7YxTKv50QA`VT@>~2paXdQWlF+1xF+@T+A=oW=J%+p1S$3Y7Q zJ3ZLAIoRL*N)ul>545t(ezbl%r!1{^BJilRPG8!n2_5J2vZQ=OP$3WyFz2@xq3V=f zr)-_m3|p}6xCv+2`*T=%7Ip_Wz{r|J+$QFK-UzIeNXlFebWN_*{?NZK!DTVq`Y|2`S6ZYRWPs z)ZpAA_;BgPqtiXL(rzjCf{dpu^(c&J>+g5`obv~ucr zX_|?*(|SL1KkUA<`=&&~rdRIaMmx-gk_E9BCCl%`H$!P*8R|_bz?#9IG}%HMm4W1i zd3-=-ci>tGu7&K{mJKDgdsQM4m}Lt@h4N@QP1Pkavf;XW${&WbIaRCi5IGMtKLTt! zE}yBi$5dKp601r`!7Q!QmETz!HI+^)%hJPogw}9QWYMR^z*}u*5|d^)50UQNy(y7U zmUx}Upq)B(U4~A&#w^*4($yx%u24=nVkVb429Qw-YhC|dgExm?iQC(8=$d2RUSY?6 z7cx4vyKw_%qic5AQwd?9zrjGZr^N0oSXj&m^m>X72&up>BWzGz>(FxbC?Vjs2S3SS z#;jy7wNI(gCN&zkLD>c~*6ye-5YK>}NSbZSGBOjX@Nq-a;lA9i{=lp;Nt@7&VcaK` zVsrBGGb=4y2>TT&Ar@+o@n-BQlv(cvK1ER|LOSj8vic6*!nwI3T^(kbTSj) z$6DNFxX1sN@mVI0x`c7Bgjd#kHyL13I!IoUc5iT^(_s|vyo7NdMVOo`$s!I0VaH(r z55`le)_9Qo7I+4=rS3;T8$&e*$?Jl&9#lewa8A_e_`1=z9TVC-LgY<650i@nCMvXP zHpA|Yg4q3Dm^r~(aY~ZuW1Vua{pEx$p|YW5HTIl`c2A7@4*D{c`=SD{YRG3(cqfpe83E{MDk<1-0G5aUZaI_1o_xF{O$57+7jq$^kSC`2_||UES2q|F#4Pp`>r2E-#9ddwRU)WPGOR5{ zJSU_D*eNGt$&kO#n(cyHHqVl@Mm4a<>0lxw6y{NSRc>~(d-H(t=h=uUw!NU&gN*2t2fqV7hu`)6Q z@}9%=_)O9oxK3HEWWXY5XY&&p-)^K8;8}+G*ZLT!&WDKl!*`spea$PWo+^BB5x%KT zm)Qu$_l=@UbkLltkRj|WMxdTR>1&fKP&)*83edf&D(fo@JP=);j^Q;GVq`9xL0Qrp zN+gHkZ10OZM8>@u z@Pd37hRJ_UCEqVl4ESo-te%ZZkGKLA54U>;MP^O};zIeB(i0}C5AKwHc!F?*%Dr+! z@)>+Uyb_d=eN-xC!hi9M3jc@-5jv5qicKZ|wD|S%WhnT5+7Rt@jjzM*P4+L zvrYAzbr(a@$2zbfuywjY{8>338(Jau8z&jW-1+#+o@r>!utV4Nn={wy{C1ncARfMw z`I%$2-|qZEFA5dRRjw2g9`H0% z(Z(tMBSO1AvWUw9%)v#6;s#-ho_Z;*%78v-fl$4w0@5FODut@e?+Vf?os#8mV90E8 z@^aVe5jK8dSfc#SI?8K(rRn#uEI1++B)%LATnptwLS(OpS*2A5tnJ*ivRTe&mcPN8 zTKeqs^wM%8gtt*xK&vvcoX|+ni@