From 90702e715063d78605c365246b9dbdc779169040 Mon Sep 17 00:00:00 2001
From: Brice Goglin The Portable Hardware Locality (hwloc) software package provides a
portable abstraction (across OS, versions, architectures, ...) of the
hierarchical topology of modern architectures, including NUMA memory
-nodes, sockets, shared caches, cores and simultaneous
+nodes (DRAM, HBM, non-volatile memory, CXL, etc.),
+sockets, shared caches, cores and simultaneous
multithreading. It also gathers various system attributes such as
cache and memory information as well as the locality of I/O devices
such as network interfaces, InfiniBand HCAs or GPUs.
@@ -77,20 +78,20 @@
hwloc supports the following operating systems:
-
Additionally hwloc can detect the locality PCI devices as well as OpenCL, -CUDA and Xeon Phi accelerators, network and InfiniBand interfaces, -etc. +
Additionally hwloc can detect the locality PCI devices +as well as software devices to manipulate accelerators +(OpenCL, NVIDIA CUDA, AMD ROCm, Intel LevelZero, NEC Vector Engine, etc.), +network and InfiniBand interfaces, etc. See the Best of lstopo for more examples of supported platforms. The topologies of many existing platforms are also available in the XML topology database @@ -104,7 +105,7 @@ about the hardware, bind processes, and much more.
Since it uses standard Operating System information, hwloc's support is -almost always independent from the processor type (x86, powerpc, ia64, ...), +almost always independent from the processor type (x86, ARM, RISC-V, POWER, etc), and just relies on the Operating System support. Whenever the OS does not support topology information (e.g. some BSDs), hwloc uses an x86-only CPUID-based backend.
From c63f616a07a34e943640d7f96bd0452b127107c3 Mon Sep 17 00:00:00 2001 From: Brice GoglinAdditionally hwloc can detect the locality PCI devices @@ -157,6 +158,9 @@ (at least Debian/Ubuntu, Fedora/RHEL, SUSE, ArchLinux, Slackware, Gentoo and their derivatives), as well as NetBSD, FreeBSD, Cygwin, Mac OS X ports, and HP-UX. It is also available as EasyBuild and Spack packages. +The lstopo Android app is available in the + Play Store + and in F-Droid.
From 7dec99d38e4200b5646a5f57e99f9d36e90912e8 Mon Sep 17 00:00:00 2001 From: Brice GoglinPnWM&GBqf1e#5CG`PJ z6BzNqc73bo;C48dDb#f!k-#$J1iKQb=v*}z>M%^j7SI2jNM}`Y1SuZsx|EN};aqg& z(-4FqKZKsPVfM*JI7I=f@4m_mr-QA*vPe|~?fVH5++eSq&t0|MDspKlNh0Em_*cD_ z_!!SOv<1gVUi2@P=)M)lvqj8InESyc;(vse!KKf9e`3^6+U1>)|1<7Mo80X^9WAb4 zEpYagPr2wC`Q!NG_53c&=iS}(QDy0M_C=S&f}GX@1=cS4^2?#*l_%HbN!5KuyEMAJ zUNK+noELHsD7r{Jbc3D1+!vmK@*Rmq=L6fsQ)gz@Dp+kj`{}~uORt$PW@>Bh1uED! z3B*~ctLZWUXvQ9m?p3(V*uR)Z|CG^XpxIfopDt8~I;09{X09rT6C54Xp^$OVvVOC{ z;`q}KT_Zz6j>k zsPM`(5habCeL wu}F&1fV4sCu>E3&13o6ctiERwbw(Cy3NsH6<`;rUI996mbceR zP(Up)&_xQ`H(#&8%JOej$5}mZE}p+cLFQFp7C$)bO}UDv6gmcdd!Y`jfzHXO#_PF$ zOqNWmoFL-4b+(9*+Lvp$f%Vi~qn7*D8l^h2Dy~6q)mR&M2&? C=`` O*-Jf$sll;$L{O5s=b%KIxEGkFW>vJpXJ=7MaGkyF3m{yyeR3Z zI!$DWz azU*uQqX@+L!B7cliRH*!khB`k(VayeN1Ec$^qU z<(v46znJa+zxFNnrtH*aP`L2m{{N6rF^#+2Y`(?;dAGKBe#>KM;8>-_{o%8A>q~a8 zKk>{AJ_lt`oyyGS1+3h60MDhXDPd;#pbZ)>5qJB(z2chZu^r%ZCxz&SsGhgC5HL zdo$F3>9^V_F?J ZEE)^a5ymM%pFz@($|tFJQ`Pa1^!d*@7;J=>^3#277CIZ zO#X1cPO&g{WeRh8R`o)<{8MA;8c2b%+sH)V@57 a_2KY&4)!9!MRoebt zU3#eE9(HFh3Si55-zX($w#|aEOe^zd7+2#=zWlGXKTx}_$`&7x06#}UwjQW!# +d|UFb7E?3jQqjpRDnv-&2 r$E#?aKz+88A2~bqavLgLti-3>L!^v``ZuA}ilY2~WLpi(zZWoI z)Kh8Id(-V-k8OwbEu(<(ov-y-UF-OvLf!mgAKBcr8Ab}hHGU!ia!C1_9fkc59IHCE z58gqLxp7Fn$;_^hs%TX?yzAv=Pjl!#)yR{2Of9lO*wmW;f42}D!K|4Y9<|}-qqVkNk*^e&oycHlQ=8(v zWM`rgzHZCf>7yBM_26Ti* lP73A$0 zTcy;cv@pQa4~ug0p#VIfO_COSkjTB#>sIs-i`YH{`xNvY{`8PNzL0(^+~mV{K^NY( zAq$G2JN1#7WP-P@4fPQ$s&?rp8FFjLuvrIpT8SdD;z%kc8HetpxsyQjK9nZK4Hw6+ zy$baMh Mp3Z^ z+F^YB4g7x8BU>sAJ|-Q3ie?ior>*k^{HTE2tddNXRB6XoORgJDIn%1K3&4|z`5m1I zeK9*W>%%HrI4ENuUa+-`*7{_=A1rj+0_;WlK-lTMf3HE~ss*2Con1H8q49?)M97uA zgNV@Txa#6PC#l5#feRhQGW s%y(0*Nlw6>=D_UBwO~*7P9v)WQULy${tzSJ1a@{&Ys!hJ>K{A z|NO&s?{9p^InVQ)=lsG{l%(%slVYQxq1~00kx)ZJyTJ &a#S m3rNaBL ;53@xs37){6V=G-G<5 z9x&U9xc=Tv_eaV8F)Fnu@7%9%V6143uExrDCW;7Rkd4h^3Phf_lh6es{Fxke$w`do z7$+8D(UkF@ASGh{YxgM=E?J_Rv^X0cwlB$1O^MhnS%~t_Vj8YG!k1$te;FC^fqAcR zvxz-lRq_=LB1 iT@=*_w2LW Du-8xxvqnLSiv+Dqh5ZIKdeU|8~y zC?eC 3r{C^_jY+ FOTYxF!B&XIR=axykD@;=|~q!4r+ z V5H5UoqB1S9da&UjC7OJ(IJv^jpeejbiPID%+#&nT*s_GGgMy z_wTtK=G#QC&i|vPehH(5d7pCQcWHK0(^c|+<|*8kT=uiyVfFFx@kvNYiFh8rqYnMg z{09k6a8VH}JNwrF%=>H3-%3h2+%A{ h{lN`0jRzLs#skDZ-!$~C& z%<*#O<|{BUK_MaAlePQJ0hs-%yo|D3jEs36|JJ0V$!pzq=WCr-`pow0-S=74^N~bE zt_OdI+9QZ{SQEy}&1dRfzs<@&IB<@UQO}mT8`u4_$;T%~h5(7Aj*y88R3rl#uZYTZXZ2Y*#z z4)5N6+MB?Z`OwMHaqsBpt7hr^(Too}QABxJ+2O|c!s_Y+0)oZ)d2!YE;+e33EL~lz zva_>?ENrIhPZm1g4mI_g!A@iQXhBa9(GE+k!SiIV;mwiA@$AhsrPpwdU_)J9UA1S= z@bU3GqbVkewEjz0Sl-^Afj7<0&cY1bzkfe{1s2_(uLe!`C $hJ)l~=->7AH?!Ywz(76?x#xAVln8_Vyg)sb$Cef`|F!Azvu lV-6kymH`(DYT7Lfg`ORg0 zy2c^EkOXEkGBUC^k$vp*b9sh1nm|u4uWGxQ%fCa}A3l)Bb+_$%zIyd#)T+O`d(K_I zaCA>7BOzgV>-tN-&UJHZs_yLc6c1x=aj~t;#?|!@CK2W`H6|ugg^5zg4T*~zla{8J zDSj)Wz09~Xy3y;*C=wqJZ*poXz~4VBJG)rpVQ<;x zGAf0mDp>S*-T&6dMuvxlgoR<0zL^hDii(QnsJUOBp9BU5=I7_XdxuOg)k^3e7=Y!; z%ljfnE&lcVgdwIlLiOVGU*YpYBG!;tlqCmA3Xkn)jY3hFWNB$>QPHN`cS%18xO|3T zWYey&n5fzuEqnocT3lRw(b2uZ;~#{yCr^AMBIJv;D>V~rf0tyA+kDY)@PMVqYx8^O zcz1z_P5T|HK!r&uLu7Mf<3mzXjonP+;pPPFa#3z>XIMHkG&I*6@ztwGiX)qUDzh!W z!6JunpeQGo!fAY4am2B 9s`9k;z9=^dP81n$bW~J>_l1XyOjjr_-A6o+H*Y%I z+YKW_?vlCw9i&Ogg`?^esO7AWeLXuldHz{_6+%vPb2DsDbCO)RytBj2J2*H5B9o0$ zR-F@=MdzY!JHEdwtzTSSUNm>?1nb{UfZ#!iqNjIR9hQ8l!k}|y9SFh8e)dV8Qrd?P zAEqJYlsrXK|29?k`pVYorW23m=EpxDTj-y0q{N|Qkr OyTqHl$ZX`^-73Z9t0wL z%U)Ld-mx0}{2Z2S;VAZPoEkiRjDIs#G``iosy9e+jtMXQ=~Ze}Yim={8cvX<#LXU>)dd<6B0F{om%?9DE+(-)VPOwG*b&cYig zw$XH_U^9QnWaK7|vb411=s5Ag6hp!ahGfx_>@OFJD}^YYDS32$=spvk9vLrom>f&7 zgdQnrq-rH6l}6gX+@E%TB;*e9qavN^FOEw+SKI$oP BBWcjTx~hBEv0pEj zBj9uCX=B4$wySg5X|IkV>NTM)Q0U g zC1R96Mi{U-A7Y4=u!e9lVEKQNp=pzqA=aGfBvB>M%1zRC !SE?SCv6o0#+cg9V}tVWBQ+ON^k6N{pGA!C{H zje@ASpSNO7Wx&deB=|Ygr_d)1*+DC%n&J`d6{9WUd5rO4QMd0nd!S@D{&?nkjdd7t z7OQvD*$L+|#eV7vj~9BuHZHIF(|3+4_7kAP1%BTi>Ug>P6aoZ9L>iDmrW@YKqww+> z?^6o#+0XhaFr59(etUj#p_M=wCczLVTcExtWXDa4 wPEZ#DVGV?jGU@ z%gEjS^|yEn8N#6oh^ABD-26aBOAIlIX>W2|%GUjQP4T?ErRjSS-9LIdNmf?YzUtN3 zaq8T`{IZzNw!&)mP!_MCTg&GapS#;p{2iYuk(!11^7kK#BJ1hiJSwChlw`Q=`r8jV z&!<$Zu|3^zHrpJan9B2 w%`i)*;Md$lM2;mOH~zP^6b<*Bu|x3`p32i%NB z3ZxZRXXgqD+Dyw+7*0rF!K*nksGfm=CeM?y=9kp6djLovd&tSksxlGW4w!?RCyffu z%7 #)ndnUqT#IU_Cdh?$M*%yFXcFI zw%Yoc_eI4Zt_boMBK$u}9<+8HPudiZw)}OGie3nb+U()jXtZ77PoUeJ`bcqw(bpU) zwGecNSn4h1RH?Bvq+F+!A0v6nI>j0gH&mDaR1RlJMwFD40K9@!S_x_P_10vq_r A_KfDsjgaF~*Qy~oD8p|s~#C(DmJD@j{Jv8K{*6!q zPrpsqJ|J^nFO^_Xa*NF!C1DP4BXJ-f*ca-x7a^Qn oNk zAVJHStgv%rx*Q0xoSZ#Q9+uf>$BzRSp*7E>U-jwltxlzu5=a_R!ZuW7h)^;{6sdAD z%Euv(Hrkrk2_#)NC>@uN6~iPxjV0p<;P;l$;x28j3m9sPCd^sj)~LjhclHvh<;Yc; zub=#umKExRHQLTKS^m=|5TPy6O{kVVBtG6B?|P2U+WW1hCSUz?x%t4aFM4De277yZ z3Jh@&tx0h7zBwm9wk8t)JJ%XAJw06_k(`*An3`Is&hpR0OJ6@-DK9`a1#X1|ho7I{ zto(s^LwR}m{{DWvTn<237}1|rkNXJS(?e1c;^N{G6Z6K_=dfPAdIj)ML_~zO7eFv@ z1?j?3i1P*pGf7EFfLNoX7M7O}{VS7+i5wy+$m6kd`YbAH-tgDf3fk!T#G+&~!e6od z89j0BvD5jL_R-?Ab%xp0DbLKeLy6YhQL4$PCO3hWA=#k{7hA M!ovg6K4`yK`px!#ml{)vc=Emc?t2sS9u7I5J>Wr|Dx1~O!bG(K^} &x#;Ol zfrxRiFd&R3Ya9S9$90>qC*fbxrQ2`SYhAjW-2e0V=W3+N4L8cCY#*7z4K*X$S>j}o z; ^i-y!tKF$&o9_0bsg_g75Nk|OOBhB)1tf^mHsBff`{vn+*Eunml z5s9rMx!qtYQk<(c5QP ~v$z%BflnlsscGTo7qq|^P8%=xV8A%CbhPF3 zPsd1(WlqT$*4D6g+UO+{Z03$6l#FeoVSARIM_PgFMGxil53}s{amjw;J|`iTB>gz0 zA1pG?Zgd? %aSE20E~L67e2lhCvo>u=^CJDT}KFH8x2& IhB2yb%?oPf6H9E`vP6s16jW(LH zgJA&C9G6LXp}!0Y{ef7R1Udz?u9n8z+7)&2NTe(hr*&)GQ{=zrbaAq7=|0Ij;+eZ8 zuPt2b(MaM@mOMIXQ-l}N75EX7?CCzfc7HA}&S1B!&(3mqpSw{}Q6bBnU0pi>wX8sN zs@456w%%`69v6qNE+2?g90AywqvoenFO_}ciYq+pLt5H>DiLyW@{P5%9tU#1Hor#< zHJPjbJPOpqv2W2n$+-k{0F2RNZ!rwGV?4`qlHizb6ORVU+}s=m-<89_q)#&C)9-eu z3zh5MdU-Vz5fyrwSag!1cW9!BOwATI1Zt-~@^(*tVs9iNG6TXXU^)EB>+DccQc|qM zPG5f-WF?D~bPmH75Q;#48vz^wx#6o`9gnc^)YurY@dwbB%=(hxGwq$74++9mv!yOB z&$dAiiwq0v?(Ll@F${p+0lEzyK0c(g{bo!m2r3^;wF*bSfpGR#^zs<67J??A8A(W( zGq%pC^a1hM9q64#p$nW*RaF(BBg6~q$(qt}n@2hC48mGfDUBJ;Ll~mgUL5Q*KdY>2 zjpn*x%t{n7GE)9yQpj(&DWAWYG+Tmp^=HAzJDR7YJT`o$Jp>>C#C7x7P2=F{Uz29n zjo&4Pt?)a1@cMVV>3RS(haj4vx*@NA5Pba#G%eWELXL|v78VvjSV2W#BZ|n#FaTPv zm7rH@BnjY+m`(ctaNC thIk}#pZ0YQ*EPsE07LB66 zD=X3?2N^z>{5HQ!K0hzKTsMkj`%8S@;qYPl<>30=Lph7i)SDfetY!xuH+##jzCF76 zUuk`P{ovpr(EHUExJY*W4bUw$3j2TjpcL_RD>v)cDAL3wA^DxBoB{cf0fqYcMXwGJ z0dQ}dp{yWS8-Q686JNkm#1#jP4rmR0K`O{p=`!KsAS`3m$&rhfi)ZnRqNMqxRsc)x zyY}C?xgmg7p!aojbg&R$=fL|}3e^jSAz{YQNdx^K1rf@9e|Zo;f#KF);wyz%l#Q__ zsw|sY2!p1@Y%^bGGGsGeQt3~y1lE7cv~@n%=7DcA$ljZt_0iHWN)lD3*NM@xRDIA} z{CzkR+lUaM9A{nm6F?(>KfMzrsfNNxygXZ@D5|um)DAYBMKdl^VFHQn@_b)8d+6`> zwh!oUkF9@w%FBEGcW~}tb%Y^~nU{CWgllPONsE=JSmO+`SWs{ H zm)A{n^p@7vue!CvFmc0qPb||~s4HGD#Eb97%AhdBfF$LUfCQbzRG=>RjDSESS>g6s zmh4Mqu5?C(I756ahN}IAXyV&IVVri_7+Wl&A5Q}j@4ZuUEmMLk*6>#h+BY7UDtp04-J)qtO#NVtin1V z0;#DJAiCa(LeD|h>sd$mmz3E!YNxzSBo;#!SPtlZNGmHVe=e7!`)Hu6?|rvPt-Jd@ zt4i%0BdtRR-4Ce|5#pI{3CYYvVIRmT9t4NUD;zk#CJvKWO-{y!)Ei$$Za(q$L6lU$ z(BJtD-N8&;4As9Sg+r_LLP9TB`PmJg#$tdXmb~F;VUZI~2(nFaWPI-GhsnvBK#U-9 z)oks@kq)o)Da8@S8}l2US94DTL)S*p4V@M7Of+11#E{(u1wwDve}0xlwiVaC-rw85 zc&PEd*M#$J1~qyuAOCYKL|5;?{RW3@*Zvf_oIP1_^q JiQ&~hr^4shC_n!ymX#&nKi+%;$PIP}N zb4?TYk-}?GpmKZcOB6>!XgdjwKQ+0Y9^KZoUiIo*CEE#Lc>X9!g7%UkwSsyFL8H~r z&!37su;5Is6qrg#6U2{;RhL_u!)LsjY*=}vu0A4lSJJ37yL{iD%16k4 5f5=Ga-l zrLznVOe)=cb0j6~d9ZHR 0=@6l1qvwz!P<(LEVU0Ux6{4=rv`C OYv7h5AAIG80v%lNQ0rPJYz!3+MuSbJ^k^o`17l}9n z1B02ld9~$;)bEHabzvHXFt_N!=MAUL#+|9WmRTxYxMHF0MsCSTxmbZhlT-V9dle5J zgmue8+OUdeS>81cd?%Hy=yCe9f3#9crBZ(E%fGi#&za*LlermqTrXp(I6C%oy;@5r zj|*lBr+qLGp=O{bua -No5~lDu-$(X3eIN9r7LhxH$68vQ8` zBBkEYdpg-WILz_=u;5lBSel=2;fR#V_PfM9m!TjhM~b_
;-h95sRjF59fOdZ=Ygf0u zkh1FgZksQ&3v`LyN*6A2b{s#y;`i;I?>@_u#yLfucE_FFr>e5~!_D#0G2U0s+Ghrm zg?svy?fS3uG{JK6v$HB&lvst$pP%F1yI;#!T&aXe{{4-C8da@f>#xVwnhBC5#(m{x z5pe-eXDFu%G1SEow=}+ZZv3>QG$uA*IY0M| gGPxNX8s5 V_(^GmRk~{-jj_k)@h(+7Y-c#K>yXT=y(E<6g0K9v9D0&taDk{u(R8arV!-9 z3E)iVHo?Ne0wnna@o#HNkd18 SC5~Fg9-4rcCJdYQqX!7H$DTs{qo{HHX|Eyko{i4z}@*fv^p?Wfx;rUPY#=$jb z4wOpQ677rX$c>E*A3d+dMT4`q Yqne+wri(VrSPE);5I9j!V3S-#pSU zo!<$IdvlLM#QpHYkC#s{#6wH89~7u-QwK=K2@NQxiux?DHx+4C|LE+s9y#3f`J(gY z{NRBcYqZz-Zwv0qli7d>;zudPzdpS=`Vtf(-Ps`^D4 V4&P#$z8j&$l&`M!o6AY)_sCMW-}@$AJF_2UVcJcwL-jU`Q8yy> J40GUw6H%~U>~hr>DLiH~Ufb<1rEqzcpiO=W$0 zPtY(u`%&Zm=1kLeUdE$z-fDgO&Gz0GF9RnkY`RM)ho3*xOVh)VdO8+OaYV&W>anj8 zW#u VjURREv;|d4+U2OmitlI?TxL{=npaZ-nhw7iGoDqvo#KCUOcv>k>lRq%%_Q8 zwI;rr4?J5La3VM7ATeh@O{Weuiz167h>uP9m9MXtU^o*abous%IFr@b7h#J*>On4f z8JQ%|0>LZ*qUz`uJwbnJSo6Pt$be8vf^!?tL1M3qKw7&I7B;pAW+y{V8a@}!!qVJs ze;d1Va&my^WxiD9ljwzSuh$koYIHJ+Pz*OU#bqzN$6D}eXz;mmdA_+e3TQ~tEKY(J zt4J+qrDl7j4-&FduF?=0j;(eTUzK%UMEO4B#cA_5pUx^<{`6-ogxrz 9lt!UClgQTS9Xf>(Zok36p={+eL4#`7Vr&r+s3?3L@;qGS zh*!&$mCt7S{Cp&rwYQXf{i8;;-Bb#-tUvW1pB+D?!skqjQEQ_UF0)TkiP+#$t)G9L zF3=M!R$4JAHL7HJE?8w NMMd2MT%XLWyITWab>*HYS_N_j;^MOpbXqXUb$?t^>FM?Pp6Vw%MoK0ZF6 zgH&oi2*! NQYSx~ZjBoIs` zkWuSn)tbd3pkum?!W{+-b(L-Sig-aWk@T*3o3!v7+CW9Kh;}2(iO ewP_Wu| zo0MhV#H0 lW2p)Z$9=g`WT}z4e;!+Lu&%FeO@ER_%=2XrB_+S-ezl0e4DoqO zTfVTQLM_(Dp|TV>nz*rHqms13_hVpSdtsz zsr`fei;Kd`P6ljDQ1k8t{We%$sUilyG$-#=;TY{9daGGh=Atr&gDAX_+^k{olx zTI*dA((vw>?;Rlp0$lNNe*REurqt;I)dmlZ;BFZu8ia%zL9at@Bu*gGe&mmkT;Yge zG0~xH&_Lgq1ygLrTJervy~Z5|MJo2M;f;+sueHi #QgK_nQ_6!1P`X^s+DP78wE|Yze?|2>S#mO} z08-QnM)4w+n({ 5-l+Pky!c_C~C@ zmo#O!6#sen;!EE?>~_4cwwW0!8Vsl8*ZtW$wejy}`IH#qs@8NLvYn{v|5$h(UP^H# zjKpZRx9R;c8ZXD+xfi&2l6bMn`Ib}s3aROLZ?MYMFtRxlhp?ybw@BV()7at6%61P1 z8Jo-26oLABZ(=FM_DzKUEdR6-tYdaAPJ*>`xce}Pt0wCoCEK?wtbV8a#0 i1_Ckgl~=Ud7U1L5g!PxZpHPSm)!{4JhZKDzYrvweS? z#gY%Z6nBgAOM{2Y3&H%J)N+a|3iW#kw}S(&f&Cz*pI7KQ1v7igm$^IVa-p2G;K)-d z9A$a$s3O8<_u2K_=cZhYM&UwjVr=Qfc2;0|$&N3IIkX;6A|X72dOYQoobhco@BTYm z9 `Oi*A(dcF2@6=Wg`kkLFn&q3C@JYKku9A?>8FKdnF4K4c@IGfq& zpbLIOIDG=x>Bz|LjI@Ku#$)@3z_{LVNe-fZTz3W7tpJbSgHj7jG?Wqml3ju%1tvuz zBBF#3AL_yS1s}2CCJoQxvH6X}!y7I$l?QzVTsQ&(0-&$~|2_n56?tLuI<0&`G_tH8 zOUxsF#ofo}s;f&TJPYddoE^X|NET8aTT==+=L4EmP8TZGE+#Q%XJ?N^v0ZzJzQbWa z%jz}>4-Fl(;080;CInYdWR%kct}BZ2iH|I~Q)+5zK-qI7CnhHcy7NiRQd?Ua{6~7N zBhgnJJ%jj0kxP#JiX$NSWe=T$oa?mQ=iuNVhVW~90?sS&?!5;8AUO8G;MV%;JAot! z8p@&<6`%q`zUk}?Svdhz@@l5>0&2PA 43te;I_U(Dr%oR;?^9su!r;qG>DJ00|p(tG^2i_{7B3)?;6wCJhe5 z0LQ|@!u2|$3s`MmiF5EhXc2+$s;iISf~kbuW)~NKLhY)ruWzE-?nSY7`~qKr`r6Wx z3mBeYk-5Klqnyf9EEPoxo-3FVFjj#Vue-Y&!0*}d!rQ0f;z)4_^4`Zgb1w|Mf;cH3 zTM>vM!PaA<<$8X+%gM e2|A7b$_oFv=2x6~MWTqo%*}87Ipx*L3 zek#FIaA$lEMq=jovsD^y)Cgg}2BlE?Qo;$pQF#bwU=4F1$0WPyYm3AQ<5p~?L@U9n zDRDxxNoaE*R~&g6f>b!+R^+w*h2u?l`DfSXZkKNK!p6Lyq)O~f-WKrt=BO27>qgC5 zof>#3)u`1>|62WZI6c22?>KOAzizY9&bLUtK%GF6_6#+1o1Wj^I2=`8=BRw(($U)+ zu&|M-;9Ae}WO8n(m87_%QL J+9a4=l(ZjBLGUUH&2x B6>k0y|nDA<@^ zGd^BUvLe)*I20G7OjGl>FP1TD%ph&)-zjP-4vh{gHfpH|%dkLiOg9jyG=nQON$Qql zpU8?Uhb|nKciQFBo5#O#U_{c&l#OFnda-=t#F18A{3n03V5BBNo5F5jgwgEe31!|w z^&``wA{mL9hJUEFS06%idlE^Yw$wZNS%<&I+celv(&)51dr>FzZP%Vg3_X^=;qRVN zPqN2_yOUkRNBHzu!m0wrm*=JV%XbCq-h6XhVmt`sR36D%V2myxPshMG<%kShson3S zD?H^XP~-G9B#C9paN(ichq^?|NyOY_0I3U$RzIs`OyYn<&xvnJ)S4FCuRU$FMR$Ex z+?huAmA&LHkEqYuY%;7wK?Yv$2-$5%swzjV*g6S-1SuOW3{c&-9{fZq_B+5BTP14{ zzt@41a*IwnN=1;VHx)I!ws-gZCUu8Hk#;eukcr9@)2qGZpig*~Z3}b=8viFk9e80i zc4O0usgIfM^t)yTd -#iGV*o${u=JmPuT38)f}N7gXOJHsTldld2}ujecJ zW+tN+ztTrBx>ggeZ2w#|I{#U)i;nnBD7w4wA?b|3k<^4B{=%~U4{E%#V~(iYF|wCo z`6Wrl*+ZI*ZP a2rgb zmG!@36b(n&HaLZMP1h%B#w1=oETtvB1LbMzE0F+OwY~(+T@&{k11oqBvvQx48V&M{ z>npyKNDhsEZ$WSBz#OKEI#FV+X_9yAe%1DC_;k{yq*!&JUw* x@0Tc&9e1Q>Nhi_DB_!C{5_^ov)*3pE!!4I=0|qk#-V^KDRqoB zf6>fdkD%wfIYf!hIY*O2l`z48&ayFV8|L@l$4yg?`4a77|7; 8318> UPCtS>gs~DxhEuQ*b)fG zsRpxHoU+IRQEwrM^$fw+N=#Nc=eOg!xjm2V5&ztvk^>b3a2NPqySGqy?HwJDv?~zl z39+$dpg5F|Lq6_#D{}f5ie$)PPOG2!kdc;_m!lv27fc-r_WyJ~hb#!08J>IHc^Td* zv9XR2q4nxq{k};vhl!nW!6*9q6arOVz1o6YxiXN!jvQJ42iZP&?bFyg@gv=&jEp8Y z0OT1UFPNVvp`Mb!rXz)HgEFH`tZu#AF60(SOCx>|;K}(oSXfwCS#1Dmn#ytJ&p{2U z5gZZqr%*2>c1*~%jFI7nm=1m $7(5Qx+IDJO>}P$stCY2{uk$44y^V&bFC z>Y1(IrB9I(Lcr@Ptwtd;2P6N0K_2)4mcM3`x0jk4UT>LHwrb(%C9o98o?o>qKPM)R z!98&O_aBw8hdTJ#zz0`YR4h2K55Cqxw9dA+zyCY}nthQy-Q8McCf#5$$Bwl}WWpp0 z3JQWDe;X=JP)@R(X%rSi!dTS2IeOIb+l1=@PB3J~aEUBHL-ypa!LuGO=d#oj51j=t z;a?O!KeN{YZ#Kaxn7?2yet#Y|Dm~xpWuNgn(sOm?Ip_d4RLB9;WV^t6E^@Mn?@xVg zlwR(8@R#iF?bh9ePB47~wu?zm_uiRphIMxBgh8QDLPF#fDEZYWthV8i5t=4PC#MV% zFKlj^*vSgZ5iqSlZ-?(8z{%LySaJ%A>#7ROl5z@n7 ){~>$H>RpUr>_$ktWzWyBI>{y>ocz zYHvSyt ap|N6xi`1A8hx%VVZ}sKiBhgP zy`>aJii?Sffq`A4@G&^b6|B>r;CKXpiOy%Qn^DCVdOq46K4fH2g<4Ywf_G3GjQpXY zp&J_;up$i_J^BB;{&E`rB&$~Nv%Q@jtc7C+K54>lsx(=Z6csmNy1=>&;FW@cV${k- zO-)TJX9k6b^}YqV5a2GG8+ D!&4|?Nzld&S!{sY5|DeH^D6otEkJbk^^fYTL{A%vp{wFO^Rt)h ztJhUpQJ+RQ>gwuhi8nqj?$9UMI4EOlvL=9Gtw_7F$Ep(U&I7twKF)(br3ng w28*yd4ut1b-sV2@F+^0VPD8k)>BT {mfRaA&f+h%GnNLIDg_M|>p%TNV;8BE^BP6l_ivhrD8yh= m{+s;d915i;>dHHe{K)D31Dxi2EB2aj(a9EIvk!jnnZ+^+NjuVo_1a2GK@NN_T zfa7B~lE2t*wxH|-7X~soG|ChkG+jc}x{f}u3&1$yIs4rY-UyDhckkYTBLjKeJmCyi z#{4Yz{B->*2h~j@(|Ks3lFLCC5%(AMIJo8%!X5`ZM@N`Ow*zjZynybX8J{a*T3REB zMgV>V!8HNv-PqU|-22x&0NMls!CW;BR}NbZc1;KpO5q%+(uH=W)I~!Zn++g1(AZ>e zUovFz(}Ej86C+arh#j_1tBn{-JZ&HpCSi>Lgk>O#(9_ccyTK)l3>5Z{Pfx+623HTo zOjqz~z}kQ|tW`K3SV;hvLyg`dMS~?i$8Ic>fPtPKO8w#O*NG*y-;8>Be!dK90;QTC zVq$JgLX!pbX6-Nc0}GNw28w5r@H?7-F9XOD_(Pe)vn)M;qofJGK0G=a=;^sOra&Zs z?wC8D(SQ8-VY+G0#l-~ycXoAE>#M$Sf~lWodpO|{I6a`B>#sJhIQaXSnVEqNK#Nx| zfO^?ja*mfz;JzT*O2wko10WqZum8GkIr3<@gln9eoBQZ*%0U9Y*PgZT Od0!*_^P5VNl~C#o|9Two8lg6|cW2*7`NSy=~1M>%=< z>$zFU@bQKzDIE1U*;|^N)UDK3L`r~t8LoCyB A10sdK@bMx-f${WP9{iXHe zHjS_UI|(47P`9ENzokRe+1WW$<3I;<59SWmUX6T}W+)^B+W`yA-tI1h^oHtcUd0iJ zNpM;+PNOz3pn@N`Ee!u5G-n}^vr9{aczE+r8Qb@SSkP`%DnUEvF2c=S0W26KKT(JI zK&8BOXhAD+M8q=+2}Kew-5&kirl}RVySc7RI(qiKwUxpfOzGEF0oP4!BO@dD=9d2Y z_3QfxME>)_Uy!Ak!`Gm!19v7H+xO$gz5Dm6;7Wjz!jLg2r|UxB3K&|R7ipG)R1RSi z%D*tJl$4YVaS)bPq0J7$DL$i8Jvh2eOiZBYYPihIiZ$It6<-`xIKeb%WqNJNCw*3| z7U1hE*Wxdto&+sGK%9oSi!} bAofsZhNe4(R30`#!80&zLbKt`iH}cM zX+$`AXtE5;t;l;L=(D cJ zHjZ|s70~t^HCvb^NFdPd17QkWjbEUl1e{AMD(~Q5*p1yLpJB6u8wRH7^NX+EtHbnw zv#fuyf<9q4Eo9V&02hS`y=-jq11;Wd{a1rUERt#idbS-Ta7FJwMHZP YE;?r{3WB-L2a?HqJOanux(I3w2x}kp0yX_?fARFY*~lyK1;56M#}CEjNp*DH zo=#if 97#>?JOFuWDh z`APTD!?53XV&`w!7(^%OK7s~X;$KhwsXuW6^=U}rnA8-?8*E~B5PqBV;gif8;R?wx zab*m##T6@B+Aa4tiFt$gk)HDlcvFRYJEGU#V9vc)1l$8lB%IJDY?PJ35h^JmhRhu| z2@4N*b#P#NZKSF?WEOWzeIMyZ5*!ugjd#IRbsje5^J(mXt=Fqfx5hybn7C^DMwDx9 zx3O#0I-GR*dvxESGNB(x!>WagRVpc$>FUWCojH#l&I`vSS)6ACX^Dw5-<&u)zjr-& zes8Z4&voZ=VV|`VZ%G1&PT`recVn)892!Zx6Am%*@0;DlrHYv?2XdV+%u<$>r*fl{ z7U5-uAz1%=X5*MpN}ezO^>UFcI2QRKXqdK8vi=O{9r-h}JgmJ&eTjmc(Dof(rb!Y` zOY(3mQ+mNwZ*Biv@JS?!ImN7qToRY)&d8_d{Zjn_J=L7Ij4;H8xe>PKyooyc= BCS7+g zWxeoOw)PwC;qbX5tO~@x{sEz{p=RN&gz?_go;p8RJZ_XT^_NV-Y!O*q{)4-YH~f%N z6`}WDsf>>H`z?SdkhRq&tmq~cBf*dVG?Y4&v^gHcl~Nq(k;S;b?>mQNZl6lYDvl7d>&?4QRw_FMO!w^{cWtS>kbIegCR#Wu_kKj1YT3P1lbpzv zj#o$Yp!`Q