From 9942269a910cf2f02bd028656be9f3744e1bc7dd Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 5 May 2025 12:55:14 -0600 Subject: [PATCH] Updates to VTK data checks (#3371) Co-authored-by: Paul Romano --- docs/source/_images/sphere-mesh-vtk.png | Bin 0 -> 73644 bytes docs/source/pythonapi/base.rst | 19 ++- docs/source/usersguide/processing.rst | 79 +++++++++++ openmc/mesh.py | 124 +++++++++++++----- tests/unit_tests/mesh_to_vtk/test.py | 6 +- tests/unit_tests/mesh_to_vtk/test_vtk_dims.py | 2 +- tests/unit_tests/test_mesh.py | 3 + 7 files changed, 195 insertions(+), 38 deletions(-) create mode 100644 docs/source/_images/sphere-mesh-vtk.png diff --git a/docs/source/_images/sphere-mesh-vtk.png b/docs/source/_images/sphere-mesh-vtk.png new file mode 100644 index 0000000000000000000000000000000000000000..73b412bdd3779cff6573d81642b91e083fd7c784 GIT binary patch literal 73644 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

h zYmH(@xiQfbPuljKQpbX)+J4wg3D&5kaN9_jbp@P0k2;Pd(hA|^oR>;?YG8gHF{JT ziJ#z{kEhH9Y;NqA`K%vve5sUYW_uNOi3T|5d%=Q}fd|E6RjcRm3nClD#^;=r%Ue^c zx1L(S8-5e5*Yl-=Z2~vo3nkP%+gq*~0Wu+0=bG$UItXC_f$DnvJFMYb(OZzApovN? z5j!zFxTE)?;lXctCzWtfoet&6X$NnR;ytvma&%ti^<@TQv7PmIt5#h)k7$=PsUBPu z2g~4J#ecJ!uzRxD;~v34R&|Vf_%yv9`7yk>1j!LV8=_7-Nl zB_-!@^W5K!xb%Bv5*3>Dd{`~PbuS1~h$WtT>#)IN>|8KRvMbiZYc6ARWJ3 zq{qJYt~RZy zQ?}bkr`5`ljlL=mZz3-OOhh@&j70XSU9j2Ug+=3uxDK5%W8AZno~7hY)|CCCb3-mJ zo#WEq<<qglsew^To6jOFVhR|z$J>P*BTrjP{n)Iwv+gg|zBhaFg!LcP{Dtb8%G46w zIt_*#hd4DjFXD7eFi#LL1ci3}xjTu;*CdK7e}+>!<7PU;h?=WZfM%{+mJot zoqcPIYx{-yU9I;>gJYRj{FK|vG3wx2uXk6W`oVy2XTAEx9#~v(Gxz9`f;#RQb&?OR zWt_tCf`bw4T%cr5WC``-+k5mF{ifwVSnzU2B4)@PS!~PQ-Ve(TQS834Jz%w#a~(sR zX8LFIjqn9m+z4XjmwY=jZmJ({5xyl!GIY;(y79J&E>g;FLD+RVQx!wAUD#*Pi!(!D zxy;=?suYnI!#?Zq&X6BZ=MEGD)w{Jwt9kxZid$Ale@Au|Kz-QVKN5YAjZm3;?O>7O zWbSvv2hnv(P$TsAt{#|-O#Pi-Tkb6$LMg_~3HLgi+^IV4vL;f7ReRQy>0v$GAvoW4 z>B6FMikIrwTWdze9{k!J`lvDWmwsiEdN)11H{|ovxG{LUcgRJs!v8s{c<)_#aUlrJ z`8nMTvDGW!**_+rYhIJC-W(I85Zav$1sl0jxG{7Lbl!M4+fa$9y2rS-*`vDM)c`XZGfxF*oy0i6R; z|2*e0*!h$0nJ0&c{qc-G$n%q#cKegbtf;c#C&-UNh-dksY9BgOhs=-r~TeoU(-s zeyWnc&$2F68%vt|gm7&Pf6ZPq0}FRkBYm3U$he42{_8(6Ymd0fjE6D^n}M*Ob{7Z( zFu(l)u7RUR6$LyPUqXZY#hx9oj+`Kp-yO9r{bveEv*0^cualK~y#!dX_L`CtiUj;& ziJENz{iz&Zy0~dZ!)ny!f|GjtubIoNVin|*Sw~-Qq;ZM$B(zMgJbx93oKqJ0;J*Lm zJXBdaSq#E&*$C%D?#Xw=}!_5l>B}6;CamI1G^oI(o(x$Vyl-^fIVw& z<0--8umDUZg4AVAzUrLc8C-L5ca6#tFwV3(x2=EHfgOVTTFwr34hV@J}+C!XQaqf4`^uNAGivamh9BO{9>kNdVM$TIyZDp^1I4qNlN4v2#EM6f()+VSHJYe|fA?Hncv%wU5xVG^ zO=-oNBXNrW4piLu!rOY2Hgg7P)ud1pP+0z)?cCuIWvdj)ck0MKsn!1q z&vlaaLmjKDCocwi16Xrh0waw2RJp)3c*zU+VvLHbGv+474ByiK{sxl8pQ9CF*KxxtB!sDkH~ zrfX*ey1IO}_0z8%FoPn@UTM6jee}vyNl)YBHqJA^n_IpFPOmd}!QAROCm1a6nXwyl z353MH;-N#)>-9K`s?{-f5e8<v09`eyQ5`iOlk9ps+(38rWyW1Owa~V@P1X5?kkLZGb?4 z%Kd6`PQyPnJA|tejn~}!iE1-bCrk;|$@h`>6yU?niGyyQ@dQy1YN6?-xHd15CRa22 zXO>+iqpG!EFk5Pnr0Z3pN@Gm)^i)#0`>H6fgdE@%@q1VN;UkN9@bH=%k1i*t+DH8n~7 zTgS#W+S_o?z^qx_t<4CfbhXy4?fq8=+%bxD@xWFl(3AS{>%A-MEm$h_8L)Pkdo{vQ zmGn|NN&(E6T9cgYPq7I=wlE@V(HP0?`Mo!7I`~4v~S1QR6FxDc_CQkXEa-iW@Y5bG#Tg)fV)aZ)@ z{T|(Z7Vl(GoH)}=V z+KEY!G9jqJqKs1!8O*xW)IFdVDy=Q~`c1Cy9Dsu@<{?gA<)KsG4<%aAZ|;m@mLjK` zCxt#}1ga<`=o^pL-OWV>HvOF#+YftS!+lI&58c?wWjjaaIjs@JDk7t1&uOXg^DC{C z_jIL)v05a>M1dAS%)XJPZ~pVk4w&?H#7|T7)HcYkJ1pZNE3)(cS+srH}|&BaGeKF>ZlxAs)BHa95+w?uXqV zdjh$&OJlY9bOd2iNRtZZ^6b{WX+P{Q?G5iTg`U<#Z6sw-Eov${@kM_R zcz>>I9j1s3g(Nd93g!g1KqW^Wt-^ZkjG4Dcy^OOOvra2N4~D?;0MJ@VfscoQvXB2Q z8PviuQ=!VYu?mJ%{h5;$o)jq9zj`g?>C)ZRFa}Dl4y7HeSXOW&O;x_T_Z16Zxdj3c z{gBA~mHWHAQaZ?!a4ourN7+Z1b&@K~;KIwt(HIFi3`CAF>#bg62x92HYyVOFKUmu( ztjV=?0j>9F*zI56mRu>F{mNVWy9>+0~|Zit=mYbD|>qjJ+eL{Q z?^!gq5L)!ZSz%Y#spUaqnc71*$D?Gee*oM=yhCHd>7eel7&@!5IJ7F@@`x?qO2F}| zLDbtf#7U-Dl|!r}vR>MsDjwETfGg{F9j24UHn*SmGa+EF?WkKGz_*&#IFN!F84h>N zn@Y}&3$OnhT>53Ie6EnQ?WFQJ{`auB&kygW1Id{F5MA(#u-hd+)`S(8)bJX#7&^g# z_F1*87q91xnl%9XgdOyz>08*5bT=m6r&gQ$-=F^L;@B)Zbh7e(+BnvoNPfJFrGW>Y*1s4>wV}HBjgf~ha90HT#1Hr^FGN)S zHzbvDC!67Ssn-@^K z@xu@xi`PbQ-x*R!*UGlA@~=Y|0fbaLA9JMJ$ZP^NRKAr0>I1VUcEfK<%1|qQh@16# zrTf@ieRFB{dW?InQ&a@MSeD^7vK}@=41fNPlF6c>!M4I~yN*EY%P^bkT`%6_eQT!0 zRA0vzv_%Ca49cV@jmbDqZB0yz$D(gk$v>}#i}M*$`>yl0vrWUGVW)(lSeyimX_|jz zO+3nr^pjU3BTDgy%k{6JOECsvc$8q=vfe2yR}$gUpU-2V3ymZ{jJQ=dU3Gpt=4lgQ z&iC~!OW>+$aB)uR*4DZWz<@V$i3_N!@j=veVDIfP$3;{B@E%8C%!qZM3iRa^b{7>I z&(kfb?2NsDuSWlMp&{3-F;YNsLXO>xXFJ@Mk4W4mJs5Fg(rN3zLux_5vOpW zCWibHc%g=3;sM_$4!v4BXb)I=UNPm-B%_WfJ5il>+aJ5ZB_8qz%6vqJ~&6MAAh z+6(Xe9F(@p!N#@G{~NbD7PMocQ;v04f^DfO3Z%}K<9Ju|FtF&=32JSx3>O1R4m%e8 z7ZOyM;Xx@M>(R+uS))Xbb^lj?^K??n-5uv3#>EY3C%dx^Zb!yOAVIGBJx6;1Bg1qP zHIvmt?+xaP#Ycc-5hi(?9D4ACmH;CFMfoVz@z9A=4Lf57khH&p00mS_%ET(~>oD7z zD-^{G3_F+DG3L%INJgO0Ed8N!st7fEivV4&2{het0qIRjAWH6FwR&kktLC$NE>6?( zi?1&oS5yHy$FucJ%$cVKC?uJat7T|6Eo==)E|Y za9(~;zrA#zH!E#5`_`?cjU9T~oBq-w$v$F8JMMvjs^emr(hYH}((%|h>r0RN6A@f$ zLRefM=2X!>K_tX#MA~(-x#87?m7Bc=zw3XM*}wm_GBVZ;-~|@+MS@RHaGREm3^ARl1glvPsEDamk!>_au8pBi9hH7kAHD?A?F9_;7BGFlYUGYy4riPyCG%rzK z468og3ok;pqh@n4;oVbgOVrv?8SdlHNQ7^&rnX_fVj-oNXS|}& zT(fxBaZ&1Tqo;#RG?BdL7Vi?GyEW|E`dt-%8WAPs?&sG1o-ggLqhcyd7yy1~Ia>QR zlQmwMapGFDc6&ib<}XFbH~Xu_3y&A?elCd9a*24%b_P8?!j*oAh)je6wZ1XjA+ zUm*OB0zyN0yrjYnjbnhUQzzCYD$JK^9|EX9x$eh(#jYRmblFGdz2D;I*_HLJdzSR- z_CiEJ0YHY3YiXKU+~4)YYFxk*V}yJ1cRQr@3Ab!+v7PZi*HQ$PHgtPZL} zr^=mHN#r42Z@QTabvnG4Qq2aXWq}69F}uQ7Xc7!fi?oW#R!}xsg~@o&u-N;GX#>t5 zRA!FH(n-r!FnK~y4Oq}+ArGNW06DoH(l+bW{DtAZ!20BXmwY&ES z)N!u^-meMoCB-aqFe_@Qa4JhHc|-V>&|$gXEZ8ooiF|tpC2)c+{9RjQjv=;5UaOF< zTQn-;n{|(=vQ<{N_)(VwR5e?5+`n#vp2+k3Fv_|pw;I~+`PhEEF>LnW^9+aJ`;v_j zHNIxo-2Ef<_!8*4Jq}u1zh%AnxNo^P_cZ#Mc>T_oR4;T zG)j5d{Ygyr{onAs#kXSs7U^c%d{#FV6Q{NE^L7eddw8d>(K6tSxI>z`HrD*ybOVvj z6K_-`yIV8B;m3&rr0!epnQWu?Ans=>$pvkbhy2%5po76eOO+3v*m@@uB zm2?L?2=I8|g5SVdZB7&%NUu(=)F&7pJpUMc=)4gDrosfP%Vj1nC9ah8 zS-tJiD(H|$r68Dl2=0zp0Mwz>Q%zu9Knm$B2%I~nrLU7IOz1m!Pafx~GjaWkup+JQ z{}JoS_3ilumyJYYe=l1?3v{jw&>1y`HWD8ib!~M5Sm+;QAT*Xzz<)B7ivrNrX)RW4 zwQck0tg_Kp$?gA=0tmY+vt>CC|7FjqVqEQ?Zs1iA?`jL)tHp@ksQX7slo(}Y^+ne* z-{UnHB}70_0C{i%^Cai3Mh?%FJ}36Scl?8o>bx#JHjjQ$QrdiohxG|8OzqN0H{{i4 zG49>^Qr8OcGUJH+6ISsn3_FeIs^6ExD1dwcKoi+RiuUUf)!pfTLBJx)j}A0`q?cPSUICl=;z}1 z!MgK8k*;qi7+M@_5>6`*|7!T(?|}JrUmR<%@sa-cPYtHkAK7&@O-6haQF|6?8r5&# z*+kAvNT(*ASzCKGFlzxN;=%2MC zKtX{wF{@hy0z^Jng@&vgX*BXI7_e03Y*kL%gWbHw-+ndzLy6fx^Pcb_l{A~DsURiQ zr@TM-{g~#ORvCaa<*{$#S~tM)=$e)Z)qFL+f<2aiBYP`94VV}Wx%N0*&G|+ji^4z4 zw{?k{J2E(gY%p?&)`C}lMA%z-qB_kW8jdwY#1^Qla6 z6`P;3HABerNrDSmak0;k3>s=m{PyWVtK3o>#oE>Qa_7Nuz?~x>+;DFrv(aOL3bB`h+fq&AVBaaG1>U2mu&cWG!4iu1ch4Cus!>$sPa4ysVRzp57PZkNjBYgG(_fE{Y~B&ot!yMrh}%gRPDYO(T- zwx6h2;-hB&<|wEu+^tSvD&E}E=-J0YRz0F7`ps~00ABr(2WP^}%R#Tp`ZP}$N+FiW zMpwzr`kloE(de@sCx<4T2N1p(Kre|A=5AnK#r{5CFiCdYnRKudICh?6CpsG{B@qlp21sku_mPFGjf z`?}EOxcw^R z9RIl0x%sgHD|)2P-XcFfCU1(ab+uH&5befP=@M+g6w#y=niL4Uddo85<@U-J*^p){r zSMBuEWhSIBU=2MyjARxcP#VDdwbyLhG{P^)AeB*jy@aLu73xM2$2EMVj*Vyi-6tzIn z4zX}l)$pzw_Ac3Wp&j_&OI8g%g2Hyhd6utgzcOkuCSg!cCs9`@K;B_OediX>*RQqj zK!_i2?61%%_btHBt(T`xLS}LxS14P?9#PS$#okhI^6GIuUe>sP!3RGHe)A1hxQXqr zo}o(R{&7hQF%sps0ci_k0TXox4g|}T5rvKKTw-EOVhl0%L%A7&1m*WjK3FRJ<_eRi9wwad{bsml~&xkK)2lev{f$lc$FL#8DN$# zO$|S^IrZU&n?UN6#hiHlj{Wq#0Tmf_`Md~TDiq5cUtmmrVMN5_-}uQb?Oz$1d|9qa z?8z6%kZpgbe{v+`p%ZY~(|P!HES&x42jRx2qbw?mGPKqgbRCEdG}ckIT2Hp$3yn{l zI_l@A&uf2aS-%$RaK)RL6Cyv|Srz*&K-w!%1hJ807y|UVcSpZk@lpMi&gK4&tgJ3O zH$1co+oR%F^{!KGGI?xss-Ail)4ujXS36MOo3gIerMFaxP4%z?uB(7@ouIvRv+;T- zL;riwrR`agB6aD{;5A6l(JM-d=Td`ywO-M0+_sp*k^=Z0x*g&6Msoh9Go1f0JoBC| zEmX5oc5v0k>ozBQzWK)JB4R;x>$&_Gvs~+FtN?y|o7Wrb6UMR0`#05X&665ehRdbT zXBLJ2Xto`F>0W-5t{uPEvc17Cq|tX&=}G$-YYqqbA3ru_+LiCfEdDkM`aFz3i6zJb7WAG!+pLR1}8$T^`m`c-}KdyhTf?Cj$R-v{iOLfb-lva~W6`dY%CZEPj+nvkhkj`R}#lEN5Dw0U>($l2L1pRY2YYrd~T06YjB^ z^MNORW@X=CM6v1A+j*yg-qrMUY6b>JseUyjr0?A#hSi%6#W7hS*CZP~zA_;iI;~Zu1oN|s&gKrfG58!Iju-!yq*|oW{yqQ;`c>V| zu;$3>?CsUb;*r3!H->eWFW*xnev`?1N7<4N9>Bx4I=j0XTz260rF!E^fX*A(56p;$ z#*#vu;-KU7b~-gqC`UHB*3@PpUo zPAc4fS#J!3jl1cmy>})Y!R-&sKso~N4xW7RG!78{K$~9J$a+=-RAf=T6qwb20*h5) zp^J9qN0spaX5@JEpSl<(PVSiLI=jPK>d5|lckjK_I}+V;%&4=awrBJ)Ym6D#qW45@ zwe@>CM1?jhx*Vbp*_gkM&?$fDy?KRJk{+aZT^AHvt_k%x*C+EMGcL(992SZZ*3;iR zT7rEs3S(C5UkEBTIVoAOw0l(Lwcpts2oiVJ*cu=4663-Y1gJ%mt9gy#flKQ^A{kF& z?~6yFJNVmb$hqwJ|4k-Xv+a`s-^{J0_7;>nyMc$CHQ}55r^-l>$fzp0C?$;Wh&3kw z1H24KkslK*@VWNBh7zEAiqV%Q1)sUNnbF|8a838(oZn$pROJA(pnIpe;`d>b+y0|n)w;=UgNT-3)mRZ@vKkG$HE-}M-*)aX!Xvvkw^$1{3Ooo5HCVBi<_3PZSduc^w zs6)LMUIE=3&Y#xV#7~@&=Id>FuR{8uL`PwH7XR|mwiLf-w`l33#GH^7Xhrgb8Mq~B z85)0!q!P$_0-u4-NqM-YMmiAr~HTr{m*+ zLpR_!4bLXMOpIv$>jpyE*L*AqfLer{J}s*=F=LFZ4e;Gny|ulcw_&XmijB6vx8?RMmY`A$1GC?*5e~ zXnfo}2mHj|x5bsN8|fXPIdQMcmY(#MoX@LM%l65(kpE#*Mit752%s+1JVnFMDc{)j zI$C+RsPiO+l{SH!noP?qD66B=l7$s7gQuo_#0wa3tb+UU*J6Ih4~r!KE2|Z6e?+U; z1M$-2gIEhWbw9rqaS}`o&9aH|n&^ooy_rP$ZL7YRTJOxnjj>+dd84yD_pqHleX-In z&v8rkrF|+=S8g&^XMZ~LUsA<{%<$@}qNLm8_ONc#4il1yW|c-;Pv*5IsoKvQn?0kI zi`FA!+kz^WImi$E#@m~JLWdn#r{q({X%bt-LHg2`11qJ8?FK*DQhVs@V4gg~b3eH^ zey>{kciL!EH=ATP(j+O(4Gke|0M<(zJNNR_&d)&l*i(3`<|1-)?*~`1c&UPtar3st ziOa%ez!iRNjn|u#&o|g*q68y^PLl>luEKE2`i=ld&miTGIaTfYwW+no(wUT*pH zU4o$BdvI=oWs#0nwMso1KV>XF_I7&au!}jJOkMaNQS}wXaSHJu6B+y1P~Dk=b{+Ot zbsp`kO6?bAbzizQ0ART`_`NmaPzS*G5c5wJ**p;u7zY*PwN>Y)NPwri<2)p;_{^HK z0KSL)%t5E}mv?-JR7tfh8`TXQ zr3VOAZh$SYz#@c`y1HAwK`iwyQfGs{=%RS(=}wO@445*NF2B(q2i;~qtjaAnkC|~L zmhzwYgusBCMF2x5fM^A^%)Gi6lkPwN*Uh?A#+WQ^MpgJ(nBSQGL#k5)C+Ui;hJAyX zEe7QnVaNPNyy_we3D+@Arp`@SWqsYGNRs6O_&pI9MQR29V@xvk-{KGwwy`0;&Nq8l zl9hIHs#H!JCjG(vx?9`Jyt9tR_MIUY{3EIX0fXxxl_zz3#rz^KO?r0xNw2@>t4T$zy_*VL>-@ZN){U}%aYhkO0v9B|l?i|s`b zO#Lm9<9d=`eDi{5p(y>^LK@CKYD`|j>vc%=dT}7BgeUP$6x!mF{;Sho-JHErD2$NY zkT*0XH%pFT@o-xR*LQSQL7Mj2#Y^MI-VX)lmN-o@R~O}&lqyG#=rm%HQhhkJ))emLEyBAsFp)M;mutcV01=5y^7= zn3ql-!Nw{;y&DVb8WU$v$L@ack+Nq%V02g--}n+v!{>P5c| zZDxvltz|8)RzPK7eECV2VDA90!!xB?@me;rJ_hnGI9P%CYVDU%-xzR6|Guc&b^lhV zg(E_fElx}m5J10YVl`tRPWijaY7f_$uPW!4(?WPqyDQnZE3SzBHFQHUsp+G7?X7Zj zW44+{(|n2B;J0DT{q+&EO3Go1bu*vbKk6bo3 zKR9Eo@02uL?EB~4076JXEWKWPq0u|C0s`GdTux%LpR4|N%=2V){;92zY?j4w^|duw zcCEW7yv$s!e{NL!N^+falIk$IavgqR<1(9S(cObQs(Vk91Ilim*AmwCxS6MvK?uth z#OD+@oEOMK#90l2J}w4gJH3XZna8K1BuzsC8Sy9ojEN%&-xTddFR7lCLq|FC>wf`y zFO9jSrUF`h&{rE&$CXF&gQM6^g9YsM2XkM=md|2(2sg{TJC}&QWHUEskRVP0jSPju zEk+3CHfV%n^IKT6kw)$D=5@f=B=Hvii@v!@k!70Y+68V{c0uuR<6EJ<>i(*8>Sv9&F{YhditgiS zL$ij_)2{%N`Qv&xmn=gTgBs}&Tn0n z#{sG-b1QEp0Ah&Pb{f0I{>-dAqjFmvggY0&@s=#-^4Hv98 z7ZF(0GiJ`Q!hS$Brb@2tUh9wp2!uFlwdO~sNsgYXEMcm*4AumnGY6yOisipXVFV&l z`u-5aXO5>2bEe}AwIQs6ggLIoRLTh|F= zrS+C83&YI%XVjAta$q3xtZU0UjyRQ|deGFMP4qlHEjVkkz>OPb0n0&Kd0I-D!A@jT zT7t52k@og#XK*yYOp>f`FqTFS=^Z1XBK34Zgj!7X*6D1O53OqGBBvw2FnVOV>yGzN z?6v9+Qha`MgJ^2?+O**DToSXphm_x4JRPu%d-~r;WcFbe2)iASSsFE_viOfL>7!Og ztHuu+-j)+k_dg>D@V<|i(Td@#5faskaGSGo@Ck!m_Z7>_S%^Kfe1Y%a3OPzd89$!} z$_L%*tuzcG{a^9sPQy~%E21a8k%Uky=L~hTFaj5bM6LFhHCwKpP5g2S#pIjy)L210 zz+TPJ*?sZuQZXrNb(k(YH-smZLDtjJXH!)bXtRngkV-P~qx}V}#)I7aj*#}S1$}cX zv*f0i_1gIJkX^065BBlNhKdjGNj;huSG;vH9eFOwpX5_bZ#sju^oqs0X+T=ZMLfA-gZv1BFfYud6m@Y%IHEMB zDr*dRMS3f;-Au)AeLWHfemZ#jb8nfor#<};J8nLJ+M;^&bPv&?wce`H;1?8yQ9H1bs{LEnd7 ziu>5aX}Ehb#%i4s1aCTPlbyK6F0NOsHKD=t;)a>DmFO}@+KXNTUyGy7C16U4&ZY^M zD_HWef^L}qDuoapWNH~1YT7=J*UF`uoW<{$(s!t+X(Wpdt(w7ggF@bYan+ZulH@lx zzsQ?xT6S!g6`^*y3muboNX~WgNU9?OVXN89`Z@h4)#z2HA3s>jT9#7!^jealbJ}OV zm7ix78#tmDN<)V3AMBLJl92Pc>BD&w-9N(eOT1CVE^P!uSI9f@c@uMip@nl^*m*ji zh>#0TH>QqO{5N@|^=LZ?dO31d>e_ugA^P7_6OtbSwZfwYCGHp;x z(A`^u%+UYVEZTl})x%5~4q+Yf>LBARJ1=nAYQr9}!Wgj<6gsS8HN>F&%n0!)ti;qg zvO^h5X=U+!yiK45EO&8=LKy%}@aDYlO`A?Y$F#lyNm|K)_16*_pG?J$ zd$gJCo%_7=z?Xj>B}3NFAT|RUJHaI0<_S?<2<*QE$`(V87@RL$+?h?lMf2wD3ieaP z?p$|${F+_RJ74;@Rz)imPh32)&Z9A+;=3k@3Ml>j0P{H8Ou&X0%x+=KrdM4-JiP{< z`MUHaFzBb@QDJuG!(nz>hW9U57mh$J?__kb$=_NF#&N<9}gU77Lc?lj3bs*xPgn^5^y zI`92DSz;~aiGU;4QS$ZADPVuHzbT_};MaHSZ|p0kLj%0+GmvO|8^N`ZY@?1IL||QK zaKEYX-3V!}0R|@&VzTey8>33`bI9rIk2q9kRd}VGSa(Ds=muGtmd5DnyO6_63E`DR z_RLEoomH=wlRDx-Dm2W2{%(;boNjPYWwou>C3vxXJDXnAkRM#wy(N>?+R5Xkd>9wJ z?6rXI2soh66;l9bBu??jAp~J&BSOtJBhyKCcCmqn5tzC#{o8<#OI)OIdTdX3*^Y~M zk|Q~ZfXdZ==W(0$S)|bGr?n+&V(qMbnl7&DG&LotYu_^j+R=trw8~7U2JfJ5;KS-^ zyZ9YJz`;Sa%iVSze0HBf$R~~&EW^8L5x_OR6F@gKC!M~m;-tGy`35fK7bVx|M)Zsc z2=^Up%jKx!?L9BMf9kjnWuUJjs+E@~nXZiF`(zA||NNh3(3|c}z!cAtZ=W@|w$sQp zx>8dWZn++L{&Lw#`KB1{nQmZNn42qDzp+=>Z1-AY=#_<57{G$=uP_T2{}Y{+7s9$V zXz*&aO24U`otP=0q^C2ZEnh4=a}-Yd-$bMy*v+PqLyLf@FmLpI`GFS|H_O@q!hlZ+>w?773j)wlz!)`&GJbh{^in4)Ops^ZTkC9}pl2y2488q> za9nB833!}}Hdd#y)I@Kf%rWz*Z6XMhy)ES-OCXl*vydh7kKyO|1N9P8>Dv$Sd}$>5 z7Fb$`gD)-V&_5kA7oE3`iTh4;r~t|7`}$?6>4sgotpmK!6r|e54zxd*5n$3>%YIJ~ zaAd~HVG{%>sLUOHylrV~-#BS4z4sLBprG$N&!VGS$|!K~}#F`~*^?NV1 ze!rrO9QnjoH6VO**InZQh}xBZ${s<()@d$Spi&5%_Ihkcmc7VZI4}FFk^WhL6r%yy zGrk<2!c(QK>mBp;zbdsB8*9!Zo;kX0JNXxQlDz||3%`r2TSiZ#c z>QIv8>fTN4cSn4>5}mB98FRTXx(TuNHr|bTDdi=jH-+`joPb$?Yhe zK}fQUYH(2wiaTN7m!*sa#%9Y@NDUt@DYr z%w?eZgC>OvWg40v&W-7q=nx5tYHj~@Jc{PxGXA^(rV;D7t|iM%H2S3M@{WWL(nfl% z+PKX6q?Aj^%aluv-P(HS3mRqAhnD)e8=T>ie>ld~1L)_0Y{*Y)tkH6^%Ld8AQh)HW zAS~D9v*+KEr?$A<-A5W-euod`FcGQk-}jJ9XBOd=Ja&*yaek(xbT>o7{=Zxj)3JRj&=y#7W)UAcuwY!z0o3f@eO>9&A0A-eDTmnuhY0pJ;g; zJ!6Z!uWz~dGe`Qua@UM@KvJ-w|CbPquxO+1{!YybT;;aHL)}X0|0?u zd3Ist9Pa9+@%QDy{r#{QsYX;rf4C8|hMV83ofTZnZmNf*m^CxPz>kTg>tx;f4F0;? z*jN8G>L%kVW^QMzU2W@?@{c0|5MQRPi~l>`K$sm|l9r_mr{4I%F09+m_<~To!?_#( z0)lgaTOSs-+EymHf5|OUz^U*{2KU6^mvsTHW`{PAhQ+}dIuw-up^!N}I#{o3)GT%2 zg@-tc&eLLThd9x?k>qrA9s(OxGjpTdSQopNd4sGJ?ssARJ^@#8=@^ADzY)W=?&X)? zW7}h>c9-qR+2F$2I!0s6$&n_=52*)FZTHnYe2I7yML!~YWPS`wvZ!l6=bNc(42Rx4$@e2%8p%VYOfjIDQ;>k+hI|BZ__x%bRi&>* zLa$|xX3k=?=TvBGOYmc+FTG#rzU8t6`n7kKK0_Cx~3sG;WyY0O6Mbg?be; zO5MnUedb16=Gj>@)&hr&W#=OjyjF7C#+3z`m>-lt2dO1VpcxnH(Q7Ak1$LIZkGMwE zy)GwCUajk|(eioM%YzjP_ZDcq>v3p6T?z2tsJ;Q^Kfvqrwl zW$eG&5*BW2Xj%jwiS|!$6)~_IILO6w5m~X11u~`_W=YE>`?Qj)ssY|;XQ6WKp}ypR zQVW{&B;@IX3sCUS>T)}9ltnZr#@8O_w#Gl+TjaOqI&F8I^4?weJ2Iepb&XArrgeQT z0#Vj#*{7!RiZD&0lEwgj)mUyq3OXzO6u->qm+i#PSFdA#-`D-#er{=8sdID3>~6h6 z`ek}z5Ldv{r@3~xveB~Rwr?j>8(UVW*=hMGB4EBAR z$u|4)>%`^ywO$3nZW^xuXnxZ zYR29L@ZJ3d1E zb)S1J)npgPu|c-+z=$89ZT^!8+Iv%U-xWnqRHyexi>KUS$)JPh0HxiGsDDqX^nEiB zVbpm@q(=ZtXL_hBrSP zwN~x1#wRjrjLZzdmRzX8SHmkd?LHzn?{~?bsQ@qyCE$d+Lsn)Xh;cqkK&p zUX}k24J|>UD;Hj!<2V+DBN}BX1D|-}G>DM>z>PQU_-*ZJvYMi2J-iYoAX-+1A-i$S zy{DWBG9>t>3-;?b3*|>zL<-*E*vq0n=OYU^{r&rqZ~)m!@$6!cS)CI8 zO!N!j2GKKyW5<_2jk)T=#K>|Zdq=6hE%rSvk>nl{;@VG3U1nf(xWcWtwhAo z1ecdh!3W+DL@g=OZIp4Xm7}#yRdf`ah$Yz?AY7(vyCZcI#MFT6yM3>heTSlbo{C?d zK;BWNb5%GVYs8oa^?Au9u&uvLTsY*oR=6?MkqYh7k6Iq2>fMxpL+r{&HP^l=I%x6P zq6njpG*Ul_5G3k~R6FmPj-{Pp7xlC9apUe@EJ)OWV}?t*Y_&OaD4u^XkDr>#U3$u)5bbv~Yp%*x=b zne1$iM`W~4Flm#lUN-two4^S>z5Bweo_ELfu=Nw#^h*m~6(KP{nAgodC7B|UM7%)x&3WnNH$1)A0b-zE#95A6$M`1lh!m1?Omtd+`1QGQYa!iPtM5BwwB;6&R$|Eka=b3eDRHg(Tuh;dm;7Aou9gRo5w8Ofw(uas|oWM$j{CW)qm1 z&)%{yw6M*Xo~?TXh$Cg>(_+SHxeeihijk2-NWFK9=jO2x-K7`uk6myEaBv*^}$nu~F65Ukd~>4Wv_>C@A=YOFXK*^Imr`03Paf7=paoksbh zC2{-U)`>=?kH2CbW}dPyd}P!aq%PWJLrMAhW0qKk_PnE(xS-&wVR_Nv$}=!&B8Dk+ zD467%gJq51s7}5T-}~1cgDfEFJk)T7xhr~CsC=`VUGwtoSjlBpSn;N1NYmc)YsgCu zRKwF;_PS61=CkjrBknMIJ=y)t=g~HO$=&|9OuZD42k;mJJuSCU^{XPht7Kk4d7X`&v*O;{ z;VX=_CtCg-o06^4IwfpK<~*4G(lvgb)Myx(?TZ^PNs&Q6lKy<*i6BLn*=slL<2E$i zA)f$V)iL&>73Xk%)8{W;G3p0~t#5q5huv#5#)qQ_T#y(^&vj?h?Rud0fl{!KBPKu8jAOEq@@J~BQ$eh93|f193rcoj0sE7kM-nx<#MH$6Ewi3XM~(`w2e*h?EncOr1UCPuT1q*m&<5N_PlR9Vx+`b1HQt?0g$nVmEn$V*~} zdH2@jSSL-=35K)_;Ho|^Z|oddA3wO=ck-PJXc1?+*79MIrMkop@-i*(R1$(Q*@@GW zOH^Qu)a5HO(3u=N!vX$xfPqc{Et1jLiJO-)Cdl+MO3D7YEE4LR_Kq;p?$%;|{%FqA79%Rd0gK9$ zF}j_VZ3+u^w<9=OG|rxabv-qj-9zm(kwv&rW^^s}FA$=##Pu!aT11%H=@b~1-LE~V zyq;#c6?-+CUT7hjB^tm6+V{skB5nCsA4qy=>6lI>rU{los`4XHQDMZet?v=U8eu~< z{ZHJpFj_m$Smw^v=%(TQnm>STs?Hgk5`L@*pV8#S$9eB(84qvO3#xH#8Tj)Y;ySPT zZ*e1joX@4 zRGi2FN#Ng@A0G^v;gEy$i1oDQ%axN|RLc|D+V9`qE)Q@b3raP9W;w4NUtdZbPmZv% zrkPf)-)cdg!Drjr({*?+FIyvt3!}f)!mrn49;RkR+>32^@{INt_X2O;1aPy^jMk&?fxZdNJ8lGAb9K(>!P{ant|&Yk)dxkt)1gi3!N#3nBf9_4_ZV4ue4qy z-h)##>varFhZ&FwSzA-=_Gcwk^^5ki;i2k8!Z+)UO(#4kFgF9f|QP!aT6sKI*ss5Dj#@MNl|zrb+&LA z)>0DlwOKz6Aw#$vVZ~Czj^##dKY5%Dq>xxZfE_^)3IqLyGgIKpJ+^iTZm3OBu(xAaQiwSvHJ z*HJx6xAl!=nE+7+Q>yHJAjKK!QE*-9?a46gAksklVPr*JMP;?^sv(`r-l{I|$W~>S zlXs^rYlx}8OmTcb|4Vzrhv6)arJKRBHJ%@Udl0>Or0B^H4#W9G3EBwJ4CgC{BBjtx zb#}r?QzU{^sZ#H6r>FPCF(kv=}x{QB4SzUwIDJjp;90(KUHtLJ?b7w z*o%8OukggHUeugEC%c|oS*T|LCEF$$Ii9#~@W`jD>{A$)X+}S$3VB=&EAwr{t(H2^ zMF9TiTMMok3KZt^f1;^;`#G+Wc69oSt9?Sj=|0$$k3CSW(WV;PECEXq0zkZ9)ZhG2Kngw!U#LeC9P} zWkaYQ=6POEyfLoHYoclR_>2Nt&ze4nDd9s!P^d(7EgoVMiqJmb{>M8fTPe=eD&oJI zORX-z|7!j6)GsTOgne03Q;>4BX^-#)!mD7#=b9|8(d`s7|Y@1rwdO^nZpt`rUewSe%!VOfli{P`<> ze64N6V38}?0b*o8t1gLille(n)ze%?ksXhUQp$|&h))=%&$c^(=cvhX597nW`mDf? zAb0=>xrZ#Wq9aRQa^wO_$GF?M@b<&#dSP!3EYI-*Js9*^Cxv&@{_WpIA@3`=6a0~U z>RMu`p?&22&k%F=E|tQyiU_g9?#>vNH>tApXGuR`ReoSwgmSA_OPyh=|KAMCik`Ic$8bN)Wx`r!cl+727Sdc{V9A%z9F3VtvX4 zmRv;&bp+l6cHYaL6a3ROIK8#yal3x#KP&;PQ=RU%@VN!CBK%;6BQSn$Ns^1^wl_lk zSCsNgcXs-bRKP|}8C%LB3hF=d2Z4L^U6U0#N|ei2cKj+X%24(1_2)gknseHaC3h%7ibB#;@7t9a?0!Hye)*4w%ZQ|YMlGRqflj1ohA>AvOX3t}Jxk&zE)2|p z{avoi76nnU4iE{h^46uS@&-lYjxyrGrS>S-}fJFd(G$<5j)~h!NiTFiWsn% zZ1|j9QAMBnkGo0_^3|xFd7)gvEY2G&z%d z$0qq!#m{qVs5@N_De}}K!?x|A+x_C@aqo_~SDYg9`v<3=t{-}Q_=Lzf&)(G!T~)k4 z`L6s?NfidgPug6dkJsBXTIE2jF?GA7SjsyI>RI&!gL6hUA{V)K@hRij?7F{QJ0lQn z{Fxq^%%9yJn8tyfEJ>3W4H(Tb*!`1LYZ`Ij zp)ykb;|vK=G^!ZCOA)DoW`j(U=(U)Bpgw&22W}tsGp(|}k+47U&TmV^Pr^|3^2G5; z@v_5%1v>@Phz{I1hkx5J$}l5)AD&*nuyEOh04C@5u}UC%xeyHPn~Nv$CiK6f4G^T& zr&4}{!w4Uso-n@Jh;Raaf0!_I_U5)7tO0nr;Iy>mAvUXL5BhtYGWfysO5F zuRn2sgbHKV;o)!BC!-3JIUJgR4f$s`C+wR1pz#XDFqwi2(v=`3@o{Nx!_Q=tI|p+G zSN>jFqK)6~4EQ}ppK^o-UM?+d&Ed?u>NQk8>qwjk83Hx>TTb9SoVK0`7b;z>o_hz2 zI@o?9nya*+s02pcbY;Z}_(=`qOoD2>s<1SRPAT&LH&d|08Q zaSD10vtjkJVSjZ#%BKjS1^?(MH(1XV?H$$&ppkf-HGPle8biVz8^Jy}#*#jn`O_r- z$#T>5u&zncXbQ0g2dC37Y;jtgbZWL|>SJ;ZAN%T5X&g{;lS?{~a{x~zQ zZxDEmP{*U2Kt_gtuxk;vONb0B$tfag4n!8b`uhaW|aF! zW4P8|-S1Bw{ahZ8#4NN5dO+k7}60Q7$Q(>`>wI)t2_@@mYJ+zZ-g5e!C)8y4Uh-NlFA8}9U^2#pm&P=W< zLZ~~=(al_Ee(w`PNfUJ4w*YK3Sw?gH1Mu;9h8l@diiq(*?is6o^fZ0O z!+{>gq(30qkY?#ECe) z-#CSxS&4n(^lY-hVMUe2UAt_m?s1aVyTXx^yA~ZT4}NJqY+l2VT+cU|=y1GX!eo=~ z%UN3c>NJj>hrwvVee`TM1kSdd-j_v9U;o|=J)g0^DnO1K&7ItttWcLNO~_D^5~3|7 zPgUA*u&{TU8IKO$Qvy@z5vM0k&Yr>b)JWTo^wsS%Cp*hsRztA2CoX&tVeL1E_mR{_ z;HrF2k2lxfQ+1iN$4HJJ(H3Fo13d6TMpC~TVR6KV^JRvFptEnnJQs!s1>bk@5 zzZkeNt|W>^@UdVp6kTmL6MHv5z}7pP*fW*eIaTe4S&gkP4t`!ysc})k zoaXW$h!$iYogSyponB_fPN%b6qbcYT zsKd~-0DN^{^bp4Ew!A6HvpRXUD0%<<E02Z%H6TCeehWi{1$ho(bJ0?)IITXruLOysk}Omv{kRIEReF>ZwbfKYb{{UcIH zuQyRtoq~q#WWF@IWuL@vGRDO_!Ts_BD*mg8eArGt`PgYAb!cy#Q7vplUp-xnQJ5D= z^z`m#U%CO`g)t1>+wU#QUz&#*X_7-7;Zd1|)0n*m6%}?2eINH%PCpx;a`6WR;jU)L z5@bg42zUq33T~9^{+yOfHKCU0)r7O;hBB0;R3JMlwkWxH^90{ZOU+xjR2nu)l}Pi95{eKKB_1n`@+gUJG_!tG8Rw z>#rJp5O9ynM-7E;vaZ#+yzKaonn0%4ZR*u6y+ji%{FeH4zTeVmqJ)zBN~F<$edRx8kp9E~Ol|JUiU-Sp!JVeZBWQeh1#KZ>L;t&_t7W6`cAykYb0c3{JjQE z+r60w^S%A~Q%sPAhy>85EtDzokD_`xE`#6H;3mgWgtJNXP2phC7-l#_z52SRM?jp{ z^xu&%_6!1Y*VFY*u+B)c*nwGNzCx)ar6Pv^f<|i2{IQ5yMxj=JdOfPiA2MXZ3W$H( z3H$WCqHcRt3o_oD&g{Q<+V^I&zPL~CrSXa~V--w))5);1km|NBFc8L5i@)Uc*4lM; zpw3NyM7JOV7vl57vwb6i5S+}x**HXYI6w7a6`M%2Q;_EkwbTl6lA%@TcDLbd>KTeK z4Q<|sy?Nz_1SO{6rp(fkpean5EIp;|?PJ;TXs@^&kKzlu)QP_7fC3FgZk1U>IxW1l zb3dCW{qqq>lJLc=r+GRd6zAFJ#P7zdtwuW+BUH^%@C@yZ$G-7^?)(%e3>7FGv`(~j z|Gv)2@&LZS9?2KnTo<_g4Q+$9)kEPc25Np|1rBS{+ z;u7BuBy+F7$_7>0yaJO{sG{>h&4%Y(QIzTzC$q+OfXoq8XewZsK0{rQ#B4-+1vYKJ9>a<8-X#Bx_1BJa(C z7r@i$PfWLg_nD+FZWeSUJK)`p7Uv(F)RG1t=F_l0@aH6%x>)@WD?yR^Z(Wxuq4zLd zZ07b2;R`95M#{*?O&p}OkKTilVVTqg+S}XPt_kK@SyMMx78hIkA^!}v!j9*zUxyRD zAFV%_s_>#N1w0sFCJC>eu!5${FJhUfQ!WX&N|E{x94QwX1;b{Ogo>GB#`k|xPGe)r zT^(}1rfrs2ZAQ(%Lv^cacYD7-5v{yjtG`_m`5wZ{r-Fb8wUh;3Jn~exm`lZS1sa%E=P5YfQw@eu7+vzWQv`)X4TzWSIs_dan^(U$` zpWE{0lPg2MtBdX)gT!)ea?4`Eu#QJ%Bo4(0$t6kK^mw3__MwMWLzXxA(Ase;a7rtcq=(K*cgUEh#>fINI39qO_Dk9UT!G3Os-tdR+XsMSNG+3w|`;3$sKt(f*k##02S4SMB@cGMIfzf6;I+bx{CF z*exfhRrp{(!Gio>WFA*QCN@=-Pz!aMTHZ72^!*S#IV`2Nk}Eg`w&Cxo%{xkNvCWJ{ zX|w0ut_rwm6zrs0_h!oWS?5i`5&Wr|occ`U1|#@(dE9(<#P#m{ge~|m`>EFSw1BmK zynf%1b#6dU&~?=ZM)&>h-ut25*!BWA%t00h@ z2$`Pmb59QRj@k&Ke-@RBG^i|P&QxSQ6_AljPf6X5a00k2E~1m%;?ZB=9KDW)fsA|N zALhcCAw7a;_~NC%nU~H*WubAHS$*PCFXNF3csudVy?L43HlcJbx_mbZ?=v=UZ67!Y zU4c2|c$*=9y%~AS)yk&=*=f}>;{5*|@58;|11s8he@XH&|EeP-2|Bk&G!16}!zIZ- z!3HAYY#HB<&79O_)jNLIZW?`h^jr*Fj;KdRDf_2}t4rPm^-V>3yI)s*PL*8rt1`ss zamC|#wJtT65!kK5t6~j`%^#x0@u(eeX;2 z{jZ-k&Gx9RpP_|53qIHjqEEZD`DhcQW6rN~#MG>LTldHl zmM+z3X9fK`q)C(cs#F6z$|?1zDx@ekN930gn6(_kQU&3%(%6B26#k_-jY$gz2>j14 z54i1OJl7tI@%aUYBm^JLizsEU10j#lnWs8^LEaTD$Q3O&zz_C~`VwPDnTIgAY+52v2MY$eF;H=o#^)+h})B??!GgK zU~|rM&977K5h-nqn!DBtUa!v424?e1UACs;0}fB50N-~!;48)^RPSsaDF6CAer zF>P-gO^Pw{IzY+&yDNMj&ziX^g|tOS`|bpMeDM+Qi@NHJ_DPAY{{Eqb;CocGN42^F z7r%JkZ~L9xb=Bt5YUT9m2snNoku=YhFBW?OU)^aS|XZ`RM$Grn>w^}V`ak~52C!X#Zc)KgTuNmNo4S< zlO<>sjG5cKx^Ewm&>?$8%jY{28y7+SMXXXqW8ByR8wS3?@J2QDpNwNKpzNVlp4AP^ z`Ms^nsdwDB)EPYLn>x&u%t>+3Svyh1;k}(S3=0ROf-@1E}&2uxz8_nRZkA_a6V8nBB`ONydn zis9Z`95t`or+aW`E)|*knpigFn!Gv?%tndvtFYL$tWT@j)t>{Dp6-KFv+9%H-bYT@ z&St;aw7klS%V~8+6MBV+vJB5~Baywzeso3=O58mx%{SXcty*(M6iVG(OhomNVFY~m zTIYHR(z_pOTIZC?2h{ONVR;GWxN!BoMSKd@2WOfY0rKbb_p!r@FeCvyk$_`mF(^nj z@X19YA|mbkwLu0(C)8wyz|ak?*Zu@ksbx>Y}(cra)j zY{Y_X3m;j;7FIuNnXN7P@9UQC>A+Xab|00YB(ek#SFYzBMWZ}7$c&ZEBzy}Oce}9E z-8}5~8AP&mC-}J=sU_eB6{#`OlRRitGRysRT3*=PfH4nW;`eYax%2~^(~)i_QKVFZ zy(B?iC{d33t}``Tkux?qjcTx^ z#HB`#gj^>!)^Gngf?;XVdU;jp7Kb5cW#+6h!L_6H$e8A(o3oQ^FPFexsYWjhKn+wM zG`tC9{=Rzn$sX;qkJNTnPqyMPjwh8Q$J`tZqYbt7$g!oK+2r0jS5S}Ul2GO>Jjel! zz^YytyB$CW7|q{EDp0od_SID_Z-6@K#oKk_uM8t-*`1e@b*!?{%YSeXc4-OOYvc8N zr~TX=D?eY8DVjZvPh2tT*yd)cQ7~$`P~W5Lujh1KjW~y0dZ<>32^I>WKo7$_Bw^fp zkDL`LF&`tR8Yt74_t8qwpA>&$0G1634=?cI^n3~;&4H~bQkE5*>{FiSB-BK%G(A1p z?MN__T&$}{M<{jS*R$rVAV^jWUoYN#asT~W+dZ{Bca!wPTTT*K1P{*}sB+U~afm-- zQDY+UJ?ut1n%Sj@7|w5DyHP}YKdEZ*a)}9Kc0x$)<{)3v89M^yu}oo}{~f|`kr8CL ze1VD?DjC2^s7p7br*AZz2n%1>lOY=1gIdJYEXHl~A#iYyiGJw~#wH-xJZn8Oa&r1R zIf+V1Rs7I}1r8A;etQL~2JO%2YNt3xexq5P=Zf3cW+?)z;;M3S9F9py(mW{mW!}!t z-(!&gRLZMs55v>hl?^$@QfsyF1=sJb3m+$%OMONAy;HaMf8!x{b4T}3qn+FttEG?_ z%SSvn)$0c>_mil;vitk4CG#Q@q`L;C+HWv(E>laFAop21Ivx)XG_IC7HEVO(>>9m# zwm1CHf-<&Dsig{7skipOthLh_shO0-t?7*r=ZL~)=KXyt?p;Wnq|`Vlxr#gs^V>E0 zuxbp`fMfwX@{RjN@a@50WbsV1W98Plc&n`DL`IZ53A!boT}e|6`c@fae05ko2Zyl1 zK^k!hiHCf_C-49MZUnE5V}UQk0Mqk)kC?mVe1eT{47%aaY=ycCdpU3bY)SG zl@WTm3i*vJ=5$D`4bNz2(*Q4$4i(t|Mz2o~OoknY)N`X~G?m4do~xHMJCg6Vi`4W6>T-{U+NHbD$jiHWv+zVRWWUq z@8jwX3OGYoMqtc#h4~jt>h|Rz%zrmTgkNW@qR!C*9PFJb)b*W#=NFt%rbyukx-?>8 zU{M=~?qB3o8MvA!j*Xi(0tr>A3{I^ez(N8SZ(kBa-v7Hb#eKz($sn)DLZsPfDlv5R`QR#Xl`3iltr_~=%&-#5>uRMdk87?l&h7#OOQ|A$?v z3Ye0i2FivAzW=RM3p0?1c2D#Zjuo-IaCkyc7U7U9SLgNQW;W&p@SXxZjJX#F8vO2)grNTlBsoCajJ|1&!E!7>yXby~h|1sL zwe1s#WMp60vIz?Po*eUOHT&kg*d>#7Dhx5%JzyiXHxER}R zX(?L*C4;uVe0&(t^@_;N{cYphYiqxo*!?m~B`|O}X#O^i^@a-ZEqC5=usB%E?lKsj zScHY?{?5mkd!rjn_Dg`t@Ubn*8{TqRaMw5uZBzP4r^{t;-A25;%q`2~MjUpP1$gjACZffZxp3)&e-(eDuMA0EH4Ika{Mz!@;xCi(g4&IM0>Z=O z>-%4j9Tnuh6-1frbU6^PZp@xjxQZ{5ORYBpf>1{CNU&5c=^YjfebQC90~nNYMt&WL zjdZFxyJqo}XGZ$8!%YvGG!|mpGmLNN`&<6{?!f^wk=yw)7eDvt>ld%+&_VMncf41a z*?2mJ2ISPb3@52hum}QB3N$sbc5*5F*I>$FbyT#a!t=!UGPmlQqktvlBFlaBtFHxv z3=7Z<^=f+j$FY!kD&C^k$7wypwRP?4!78ak_y zdIKZCt`iNnAC`2MMNW`u4(-DZ0}~qr_(FPO{_Kn|(P7=6RChWF6xiQ%wbb7N8654P zipHD)oUm3yT;aBKaH`fQ0c4%d9UQ`ksQ`Rj{LMaIAEfoh3@3FWjPdn)^$C`a0%`kB zYsOb!imqg4C$5f>Hs^rRX)`O9jukCD;EP-2{y+u%VdXwn&fdu>#q$iDnV;YNpL;AS zvU*(@W*5qrw1<3zp+))9&%9jYqaNLwzXVgIyvf)gYz+Pd|UM<}HIqtd2|lLW9ysmPNKBucqBE7$+S zpO|8`zq5XcW50f;W#z<@TK!x|Q1S_;(5NxZ0CQMb8&I93F4BxKwKQ!ff{J6Fz4zq! zg*TE3Fx0>P)XgSORf(4@jin1yMj-m}^@<{W|DmL$OI53{1tIMpyKb?TLq=AHiGf4f zW-jX6$*Avuaewf`^ZRwO*O@J(=b=ZYcU!r9*!EmzdM%X_b-LE8C|&Sv+j7zZ_U%;j zU8-8m9o5|Et#Y1X!nNrM?2p|%kw#182hc|~Nd!Pjk>m58T#Mz*xe2G}EgZ2?X3rZ% zU!SV0Z%HY()U{OStt!M1YS^2(2VNd$fJsKP`i?Pw`nU}BJP)i1Td4S{1-?BBBQ-eO3+o>-gII2VXBn!0@~#$DAf38q zw4|Y^{bV!^wf54W%j$cC3Ks=zW)yU0pzYM)@nNYnuxYNP+?0+1ppItrw6&S!Zt*lC z04{>z<~ZvM&lR{I%z>Qa%_w9*>h9Y=T$%6xzT(BrJ#QNpR zW9M&Y2!tMHSs<@t-A^7?8L1o__f{`pwxeB6wC0Ijvll5xP%Of8jH1=ze*snLaCmnX zGO_D#`C({8MOl4tZ}If=%Ks%UE*mxf=ON3V)huV0eo|s&WX?~|W*RxGhieQNGAQ0A z<|u@^{4Fz|0$Jt$bdhyc^$HhcOmwAGuy9Hn(Wrb=AtF+vJ4Ci=@?JDFff!mk#){(@ zI0Gv^rFDB$o8sr&j_NbA-)Kxtish*hxnMALyiTQ7HN5<6Br>KIPfPwnQ_0SZ6Q`wH z=6jFMl?M9BJKTV z`Qd*y5j~{Ckf$Fw2F4fIg9h>GuwMmTFRX=p2cC_PI)IMX-Ye?0%4)z;XI z_+Q`!1sBiOM?(!hAwy*#kr$JY6l%@ zS_-Q8Dp~eqi=8f$lK3t6sj_ZG@{`Ypbm16bS3FX>;zc*M1LWo9QiFTkyqTTN3H@`; zyam}>iYGkYj=n{w2^KmsST=MYE8MlA9plB@82!({7#<=~XIV3Fq-BB5p2hYGGKCnH zf?`u3lYJ#&35mFA(`Plc232yeg%)=tO)O}HwHSZK*>AuFS0k~LU!frKwMsQ{l`x5#2AF#hb-XNim@3(V1J434s%_`pzP%4U$S&!D zkhhuV$G7`;EW>U*2BQ4m;{=VX1B&A^*OBLZA)d`h(#4=7%i{yt_z*g?b16W=>UOk` ziMj8rc|rt{&~}7rOdMt#&Xw)a_+PrIcEvy(0EVR=#rWV(0GXFU&iB=gJ4Q^6C!G{` zE!DjxapQi+{)XL_z`9teHnG+2RR>V4G|=wl=ti#R_tn#iU%7BisafH85wct4`mHTI zd<(I_%kuH~#ZRd?l;$EUHeiH(gA+yIphEsKn%?*i?BAMt0RDYMX8H2UW z8WN<>S39yLL?s*o-@5_ZJm245tu?;WsOmcVm4iH3i)F_zh}Jz)oG80@`z0REx&ITk6 zMw><@M_wRhF9$Bm6w2{XP^B-rr6rUl_*CajB4EWa=m_cz8QLqqDf92If^G zGF{fw03xrC!f7ooV8S($M0FhYvHi?{&Th)l{7Yf7vXvg_--GI)2vG^S50`eA8*UBj&vj=Py zBWab>g7U4j^zpIRBZ}NU_i}69rPF!4jxPsaiC#O>AKTa6*^x}g(IfkMn_x>)>(WLC z5FTf5@E53ktO#&W@PFFv-U{9H@d0WXwiZ5tWcf?3*$s0r!IN$N6S$kQeo zwEKL+*hO^kfFaKRP{LaOQ#Y4BCd5L%tg9(GzaVZDRfcRq7VGTjksR*&x)_ObLpgqQ zKurK-tiROZ``RPRRkAcu-;9HHczn~$P@o=lwQkJn05l#0ASYGfD>A~zKY+1hxeNTa zPEToAmKqo!**yC>#biwsS^C#-RW}ysH0+lJX_u_+eB7Qf{gf!Ekw`{0#|;s}g#Al< zhQ{upw!YVRG8sI*!#4k;J*4hS=ls~2zjp4<*!**+UF6v%^l3gx0qGqpbuDu9i>b#5 zlZ@}bzm>l{a}pYu$W}BH@i@eAzOEf}{R1Tz2Fk((S;k*H!V=6y9pQBnU;P=2DYo01aPer|U`6~Lz=sI>JZ#1togc0S4^RKDW>frn1-#Hl#zCIF zkt)YZ;Tj7OS7}~A5V~aohZ&&00nNOFt%48gK>7kg)wu6dyVvpCd+4H8JN ziDo9O4lg$B@NnA;Jkuw5l6H^ILde$K&^qklwI0xfn{o1wAA0f`fc+X>SutQ0%^!^L zg=KfaRH_)#7KK?;$sB=+L(quEHvOT32Ml_)EY;TrEq0N6tJ#6eCH32mNF#DMDSYOn zgo+NM;V}68s5WktHl$TQCPK1BnnCorak!%?-clPe=UK+HG(q?F z#S2KULcAjgVQpUMj_V()b>v?dtqxPAmNu?`{4lJ8Bv(P>=|>hUQnws$*iU3?cjEzm=uMwcxeTC4??0W}axt?E@V4O1)s;fU~`N|UMpq+UyWMEhF9nnpDBk9)uz5*h3o~*C=VC18zhDi22B_px`?D*z`A8(&rHez6EqF?)RK?S z-=gMGG7rl4U4JrQI)%0JVT_C+%aYf(K^F|Zjnw4)0N8{plhLOA)+CC6cj$}n!>8(n zJ~5u;{(#g zSOVUCIr|0WKV#M82k?1%B)R$?*#6U~uTwA2PL8Xbp4QDAaa89<&F-i+gtBRSqo}B2 z{LTweyY}XrZ^8)rFIagN7u+1jfMrw)h_OO7;HWJhp5ofcRISJhGXHrr7@pR7VA%|S zXeo?>UTDWgj@(a*IY>z;PNUdh$f_A&K!x{HC!SK280_VCwCbpVdvEhCeusav1&` zuH_hLIUIwPts5=`k*%7#{*>;4GIPWiTF~SwU#b94j2UkK4#+SBe9|;++fxBQGY0*Z z0N|`dP@bmAN>cuBP52Hg>`ew=mp|F>N2>qD^fJkZ#4_hBe*R(2x0iT|K;OklA@I#( zwB6Rx5eTVlnP*o`XJUGq;q5fbB*C=l*`4W^JH@rI%*5X^}m zucpSu{|`-H!4UNuZ0%oBN~A%$8$`N6knZk~ZdSS%q@+6}76hcbdl95lIu=;EVd;+h z^S$r=22akMnKNf5VSG@P37tf?!x&#hl;O`$*j+X+OaM^&$a6ZkMw$P~j_l7)Zv%H`eq=H?K#}N!J3dNQ@qklLAc|{^^~&{ld*e zDM?MH*7HW3*q{nHZ;g(REm3Y*?+2e*jRmi;@tv=ZUH9T0^zD-Sy*(qrngP5m$1AV) z=wD#gigZP`SUS@2M2Toe)B(NW*7*<*7?sfd7bXuQZ2|(K!=3Qwj|~0Rd`q3!1`Ifw zxtism6=`#4=+o$TB2xa}ryHM1#YB5B$)8?N=(>9BI(>Hk-|r|-@rf<`mkBzMAuV_5 zFmBQgPIWj+87`9)a?m*i%`Mu_d{|Qb)C;)Ph#xO=42nzlS;PUcgDRf=;)j&@;o*#- zzX?>*Y?(u?U_i5gi%VcwxgWxwTg2B@YG2l5!aQ0(a}^3vezj~gQv@>7<(NDwe!7=b zkCY?bA*=p_46rKJCx3u-KIHJB?zOD&ol_KywpRXVsh^xA~HZ7e4sXY-u{y%$n$3y)K*!b`CPyW_`8(^Xshf8owy4s4T7Tb zV(~kdg}#_2`T2LJK-J>6qZGSitADQl10A`?RpDQvGr)B7zJ(Tl*L2w^G|wN{u`nQK z$oHUAq0ar~$d*!{3eiBN*GT=O+qBjwUyz=ns<8D6pl~lPHR0S!RVk*aEItv3!wTI0 z0VUxH#ep3n8fhoPahKB?oY3n(_ulJ!GTvJ(PU{1|sT{7jrGx+L1R4G0HamDrD%=w@ zw>$y|gR|V6^R`|2CPQ9-zo1+LILB_n`3>XrBR;}D# z&z&QqBGsH`oydZiY$9Vm=M}J0=*d6$ve+K|b7Juq=>!eg9KNfS#l?=6(46RexOlsejF~g&@zh6z);P1bm+%ty{<|Y@^IsjLv1tJ>y zkN_5}14Dfu1q-(qfwEWpDzwrLXiE!kw3Tzdr_vl3-oZ)l zczY%?^ioVfaMI+GKeRn^Dh}DJD{6mSD3vuwqsU4>=)rQ3|FzBk^XxrS$beL)N5ef^ z`2#}{4j^jbIfC%if-F8N#(EziaQu&+sVR2^C!o zs~LB^!ir%Y+_EfZJz&JMa6if#{aZP@szjT@xY-MIbNk}4BJYXO8L&)VDt_n8qdhEb zrdW~SFPM*Ip1E^`moU}FF3y@;*=lO^F5(39T@SAzzN9$^6#VST&-pc+McHsP!u*Zs zbxXf3;;lNZ&cwgtSOUY8gda!n#)W;!J4(nPxmVtE;T0NX^v|0&tblb8;1%q-U%8U5 zY`J?eXZTno%q2S9FM4g+4vo>1D6@{apopGhJNVEKe3QEKsPPVXPIyF&URq$oE8pS^ zwpr@X=z?wkWFI1%7^O{w=E^`th&0}_M+KyV_(!7hAfS=(GLq2J0+p>^+RqIb!z>7t z>Dl_f*gype^;E=gv;l<{K=Uf$LPN&JXor zfg^S{Yb%4~-!(Hn~?mu_($G6>T< zOozCW|Dp?73ALl$S=?!-VeO%JB+Znm_8Cefj>Ve#a+JTiC?=h6WXtg?D3A1dHfBPl zXhKY4d(R1PI-jrcnwBPqfqX;E1SL+K#ZDGK@6a{*lM2q@`zhSgj9|4d_l?SQ7F;d_ zg()`WQSG-PIosna*8Ht zUO!akW2cyaUg=19*QIzlkd=Kn9S*QytldIX&TK{Wr{K?k>wxA6-ul7$EIkaOr?j5W zR;igFKcb|%A^~TIPFTA7}0M1=MS$)8IH+3|XJ{H**^t^2H79_A?#t=G?M zXXe2VkJisw3^~H%@W(%CD531o`>PhlQ@jre|4g1Dz}~i^{W2%xK_qFQ794jkQ~DQ| z-}Kgmk5+wyG0iyiETST7vW^}6%i#c2Lh999!Oz)%Vn_*F^phY{|NLec$Mp3!3zY$t za<1-GUAPU2lFE;-ZQP{f;ie7NA2VFMmKF<5Xu=yFd_Jer1eQX|~TwEr*x)bqbJQJUu7$Fb?xe+IY1X%}>@y5?LX5REa%0*+1y}vP# z2W!%g3?!&MeESk{LXz%@E@Xc&T{;*5Y+TF-R^;^%A@!oN)lMwuW;atn(8FTbzbUGt z-cK`a;2$nhyt`z}Zr9gfKGLY%LL9ysig+H;Oq@9%jgtxi{M&4;2cUJZw!XOOu#4U% z)iI{n{GEU_(DOiGnZ#vbYR)R55y!$^xk#s}ewX?A_t*%D{GSQBps8}lKKi6lp2-N? zO#Qw-3AamH0YBQIi}nuY(>Yi>ARlVLjVT@6+G4G!Pieo;UZLHqPrSMs+6j@)gsXRU zl64afb2VIGhD%mz6JoiEf}e0-_xd46^xOq$fL7QJ+bcAx=*95lPXGdp1mu0+&o9F9 zebj0jdJT=ZU%4+NV|ZS!_p?}d8>wLN?+erU>o$1}sj*g0NmQ0An*cTAY_dIKmx?&o z@~&%^)sO0(c}!0G?HlHLsnkP$Sw?d=+Dp;@S*r9JTQidQiPLb=spUu1*(tJuA-OOnkLiuDEF zhOu`2z7v2Nb?4-8Ie($7$rYY58^(Iaz>&!lLbHAl@WBzH-!I5ju)X>zumD~8_}>J6@8>QHwF`SnkFu^@tNXO`0cZUQjOBQS>*UV~QXWk~U9esXR+tNut~w+_uol zXNm4}ux&&r<3K~6x}-)@g%f0>15K9I8)HL8)zDuQF>K$QUk8Lu;jX_Q%r}?08OH1= z*ka33u>E%-%LA_`*1fmo$QrXRVUeLRzjAc!<(HcqfNh{P#?o>ztfh%XRwJr|aM?fR zPRukBHFBZzVQb{^ZSiyE7u7L@R&Z&YtLp_x)c8-bZ)P^xe({Zx%6%bdR9VkXvmo#( z;-rku(Su)I5pw*+?bn&GE@}gciA2QB&fx`r-lpq%-L%GSgWb7~(HlQ;GN3vTD4qkz zYx~N}ys3($G+>98TRde201PWD6MO(G*+Ly@ih)TLYqEGz3w@qYQ`&T8*RLPdn*3%D zaF|o?Qq7AT$e6@kzuFvJF9KHvmk}MGsG(VMog1Z_3GgwC?Y!;oT)PI5X|#}yjIr15 zU!0x6DmQLUsgxlZ3*g8dI_`hjl_XJziuHx^3ohpWY)8vyel}>J+}69fF*sk)sTEsf z`3TEAe<2}Tp3ynBs(=LQ#8^uO|77~RkW|=F))L=u< z+VHSdD~{AaJYZ$tUFc;0PN^wYrK~dI z3>?hAmyslPM?p99%x7}bG@0_d*Q}`2kD7{t_yd_3MK;Z(ryIVm{vl%mIJbJjQof8w z_Q0y*0RoX=F3B5B?Q%$a<9q+Zk9bUxrL6Qxy7eniRZrC^|5n!Z7YB^9hnm@?W&8TS zO~TK2-b81P##D@2qatH1d0kctX+s>Cm_4efp^+h-dPl=A%nf2yWsMRpGO7GfV=HOJ zeCyG%>UPs0>uDN)@&2NCvu@*AnI}5QM7!?5exw6Ez^rujIdZiLcMlcK8m)+k-JSTI z0IK0uK%?Z!IOu0;GI(o_@Ld^d=(LTScV%m#$LoX;X;g}zqZYI{a(Pos6T~=P%MvqR zJEZwQo>Q|WuLsW(!cEj4uLJHA$Y`F=Dp%6r9!688Cc1zto-`p&5jx3A0NQaC>Bdtf z;WH8R=IAw8b+lJWKaD9JAOgHI0VX z>9;(1&FA{waxZ-|j0IHFd4t}Zp*+JC`jNJDzY@_nZ3Q+MMlX)yK-I3qp)+^S4cCR@ zu}juIJD8{z^kag7f^DsBcTT*RYRGi*)B>s8`9wxssX7}(<7)zV*)=?kb61sBaVr@8 z$9Gds4u^exm(=mHf< zwLal?hR2p3SH4t5&h|TPM?8D;IGIrFOcn&QZ&ewQnOZd->Ye;It4)(7*fF~KOP)Fx zJ8G}TOt9B1+>ArA1kX$)bG4}R2bD>@94+(G^QUhmB`!QGx!5t1f4Ps)H9Jnq?BaW+ z+P--`nH?l6oiN;di2_68H#AIisWVdtEPsXNAqu>G-#03AEwSbxA9w!cOI30A26|uX zkoN$*k6?NslpDS-xjf3|NK&t+uG<@n2reb6t3 zezE;lT&80Xm?+lDc6jF>FZm7Ysv@u5e4@GAJ0F*Yk5d}RVq>C1qfkI5*?F}atW%mrH+#>BM%EN5Kafk09j!lG?` z^q8s3dzqg(#`<)N{&YvVu#6s>R1H^&hbvb@y$S;haI1-ed4RyeS8x89}XQlBzelEsoEy3KovS zZM?bCm6$Kp{u9W)&e0~PVONEo?UB$z)TLG{1A?M)!UWo+G6Ze27h)EQ27RgsHn^lv zcn?U6`{M{1TV=a_Ni|>gW*Q&eZrA1F# zeB(Mqy2JvilyxI(p*2lXih#1SQ0v$*&gIG2*U%ly0b+HLvV|KV-opQp>+Wkv9_B~S zr7vq&tP?c_M!qsH-o71-HRErWhZ_WQzvm2>Yzpr&%WBoN@EOaQp+q`D&oqG{{r(%; zh(vLi)BwImDI~X95c`T0U?;syxF_VQXzI^4G7{a1i2KZ0ayphtGf*2__{JYy^zioC z_|=kjYW|XMm1m7=GG#=MxVYvFW$Opk`D7-Cp-Qfsgz#^LtpTo&XrhOZ=7wU*Vez-- z&vU}rrSW=cgM~*rguxaE-1!u&6fC5lr&(Tc z%+kNv<=5j=O-SG=mGgqXhc3%^LafS7Z?5M}`GRs|qC!{JpGdpJ{Gncye?&O)>RRkg z_-8tTVengW{LQo6rBwK0)3Jz2rm zM8`i+pM{hn;K|V2MCyYa)lj6*syW}Rg)&@YbAFI>;j&L#(n@J1?RGN^(Ed;LG9I06 z8|YwK+`0*knfewD1l*0eX5AH;Y+U#E5hca7dt6CTghRWe^(9d4|J`m8-%z?0~pU6i%xxHO9{8ps&Q zxDTH2AZ|+HV(uSLW;)EKD(P29LG;d^)*%{oE{4t`Sm>Y+XHyS30jHfV$X>?rEsv+{ zXQ7>!2~ge1<4|a`Bw1#esnYUt9#H2N#eoj>WD`k>6 z7{MdZ%dvpe!e!_Q+EnYhBpbc&fG-(qs`K~K*V+Dg)Vr+Y<$=BFST-CNU5>Y`J7BHb zY6@);bWT8-gu%tNF&?DbjBD+n2+QoKIz1+<0lA;pS=38VelZZVFH5LI5e!mO<{ zA8QUU!u6>Q@nCHwFVs#HajKJZi`GQ(h?BBxx!Vy9I_CAKx=Wf8taByS^~ID)xsrqf z1x?(cmEL!{UeG{(!tWleNgh2b;&U+2z@2}&yxyl7q)Gc)YoY#_1#`56vb9uPp;07w zZpz8M<4Vx;!o$oABcId!_phQSxi8a>#hTwuc&AJZt#CxY5Hh&pggBv!&gYphGudSP zKC)L+&T_8_q)nQx@9W06&-3G35FEAXKSQ-g>wK_M#4Y&0T7W-AH*;we*8SXGJ`O<$ zu{*k1h8;t(r{c7F-(2=XvcLuNH=a)Y6Vqh0dNPDtg||XiyXM!{0S4H`kxy$YO}0qk zk}z1t*0q`163_-oe{FgpaYqh^Pr8p~^BiZYE+%v)YE_84)@QNgtPAGwv~QPeXl!N4 zG<0Z~-hyih%$Qv;KPG(7?k%_wJ<@P3J->j89o1AB-hn3iiIGuFJ2@-}u{tkY7G)X< z%T49FU2u=EhN4Ifkz%C(aSqFJo&Odw9e5IUa zD80V9fRmYdj3HLVPoQ$dw6v(v0tPNZ`-Ut1*=#O$`KJi-=tS@nS3}irX35oz0mPOOt5?7_}z=OF_c2glGK=^rRi`0YatUU|Cn$kXHYQGarg z*yt{}_%;q>mX$P*33xXqXP|_EQ*jFw!hj7D#hfPhU1^7Z`D@2~2S%cx#CexA>gf6u z+++YQpK68(TbOzmx$Gk2cJbMEw56m3-Qt@CZ zbFwpj1Y%UC&?tq1+xUxIi>#CVwV+%X=~*`8qKOtsC3^VFSj}}<*4_)1Kl9We(;<

Xvgr!z$Pq0D}n~Bl-=;bz?MVH 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

Uh3_-mm;=L=cv@S4~E2# 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 Muc4z}q-q)PUuriayZ`_I literal 0 HcmV?d00001 diff --git a/docs/source/pythonapi/base.rst b/docs/source/pythonapi/base.rst index e5b5b17c3..f3eb7ce83 100644 --- a/docs/source/pythonapi/base.rst +++ b/docs/source/pythonapi/base.rst @@ -147,17 +147,26 @@ Constructing Tallies openmc.ZernikeRadialFilter openmc.ParentNuclideFilter openmc.ParticleFilter - openmc.RegularMesh - openmc.RectilinearMesh - openmc.CylindricalMesh - openmc.SphericalMesh - openmc.UnstructuredMesh openmc.MeshMaterialVolumes openmc.Trigger openmc.TallyDerivative openmc.Tally openmc.Tallies +Meshes +------ + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: myclassinherit.rst + + openmc.RegularMesh + openmc.RectilinearMesh + openmc.CylindricalMesh + openmc.SphericalMesh + openmc.UnstructuredMesh + Geometry Plotting ----------------- diff --git a/docs/source/usersguide/processing.rst b/docs/source/usersguide/processing.rst index 10944b5e2..8b5ae53fa 100644 --- a/docs/source/usersguide/processing.rst +++ b/docs/source/usersguide/processing.rst @@ -91,3 +91,82 @@ from a statepoint file, the ``openmc.statepoint`` module can be used. An `example notebook`_ demontrates how to analyze and plot source information. .. _example notebook: https://nbviewer.jupyter.org/github/openmc-dev/openmc-notebooks/blob/main/post-processing.ipynb + +------------------------ +VTK Mesh File Generation +------------------------ + +VTK files of OpenMC meshes can be created using the +:meth:`openmc.Mesh.write_data_to_vtk` method. Data can be applied to the +elements of the resulting mesh from mesh filter objects. This data can be +provided either as a flat array or, in the case of structured meshes +(:class:`~openmc.RegularMesh`, :class:`~openmc.RectilinearMesh`, +:class:`~openmc.CylindricalMesh`, or :class:`SphericalMesh`), the data can be +shaped with dimensions that match the dimensions of the mesh itself. + + +.. image:: ../_images/sphere-mesh-vtk.png + :width: 400px + :align: center + :alt: OpenMC spherical mesh exported to VTK + + +For all mesh types, if a flat data array is provided to the mesh, it is expected +that the data is ordered in the same ordering as the :attr:`openmc.Mesh.indices` +for that mesh object. When providing data directly from a tally, as shown below, +a flat array for a given dataset can be passed directly to this method. + +:: + + # create model above + + # create a mesh tally + mesh = openmc.RegularMesh() + mesh.dimension = [10, 20, 30] + mesh.lower_left = [-5, -10, -15] + mesh.upper_right = [5, 10, 15] + mesh_filter = openmc.MeshFilter(mesh) + tally = openmc.Tally() + tally.filters = [mesh_filter] + tally.scores = ['flux'] + + model.tallies = [tally] + model.run(apply_tally_results=True) + + # provide the data as-is to the method + mesh.write_data_to_vtk('flux.vtk', {'flux-mean': tally.mean}) + +The :class:`~openmc.Tally` object also provides a way to expand the dimensions +of the mesh filter into a meaningful form where indexing the mesh filter +dimensions results in intuitive slicing of structured meshes by setting +``expand_dims=True`` when using :meth:`openmc.Tally.get_reshaped_data`. This +reshaping does cause flat indexing of the data to change, however. As noted +above, provided datasets are allowed to be shaped so long as such datasets have +shapes that match the mesh dimensions. The ability to pass datasets in this way +is useful when additional filters are applied to a tally. The example below +demonstrates such a case for tally with both a :class:`~openmc.MeshFilter` and +:class:`~openmc.EnergyFilter` applied. + +:: + + # create model above + + # create a mesh tally with energy filter + mesh = openmc.RegularMesh() + mesh.dimension = [10, 20, 30] + mesh.lower_left = [-5, -10, -15] + mesh.upper_right = [5, 10, 15] + mesh_filter = openmc.MeshFilter(mesh) + energy_filter = openmc.EnergyFilter([0.0, 1.0, 20.0e6]) + tally = openmc.Tally() + tally.filters = [mesh_filter, energy_filter] + tally.scores = ['flux'] + + model.tallies = [tally] + model.run(apply_tally_results=True) + + # get the data with mesh dimensions expanded, squeeze out length-one dimensions (nuclides, scores) + flux = tally.get_reshaped_data(expand_dims=True).squeeze() # shape: (10, 20, 30, 2) + + # write the lowest energy group to a VTK file + mesh.write_data_to_vtk('flux-group1.vtk', datasets={'flux-mean': flux[..., 0]}) diff --git a/openmc/mesh.py b/openmc/mesh.py index 08025f374..27187b5dd 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -576,11 +576,16 @@ class StructuredMesh(MeshBase): filename : str Name of the VTK file to write. datasets : dict - Dictionary whose keys are the data labels - and values are the data sets. + Dictionary whose keys are the data labels and values are the data + sets. 1D datasets are expected to be extracted directly from + statepoint data without reordering/reshaping. Multidimensional + datasets are expected to have the same dimensions as the mesh itself + with structured indexing in "C" ordering. See the "expand_dims" flag + of :meth:`~openmc.Tally.get_reshaped_data` on reshaping tally data when using + :class:`~openmc.MeshFilter`'s. volume_normalization : bool, optional - Whether or not to normalize the data by - the volume of the mesh elements. + Whether or not to normalize the data by the volume of the mesh + elements. curvilinear : bool Whether or not to write curvilinear elements. Only applies to ``SphericalMesh`` and ``CylindricalMesh``. @@ -594,14 +599,27 @@ class StructuredMesh(MeshBase): ------- vtk.StructuredGrid or vtk.UnstructuredGrid a VTK grid object representing the mesh + + Examples + -------- + 1D data from a tally with only a mesh filter and heating score: + + # pass the tally mean property of shape (N, 1, 1) directly to this + # method; dimensions of size 1 will automatically removed + >>> heating = tally.mean + >>> mesh.write_data_to_vtk({'heating': heating}) + + Multidimensional data from a tally with only a mesh + + # retrieve a data array with the mesh filter expanded into three + # dimensions, ijk; additional dimensions of size one will + # automatically be removed + >>> heating = tally.get_reshaped_data(expand_dims=True) + >>> mesh.write_data_to_vtk({'heating': heating}) """ import vtk from vtk.util import numpy_support as nps - # check that the data sets are appropriately sized - if datasets is not None: - self._check_vtk_datasets(datasets) - # write linear elements using a structured grid if not curvilinear or isinstance(self, (RegularMesh, RectilinearMesh)): vtk_grid = self._create_vtk_structured_grid() @@ -612,22 +630,27 @@ class StructuredMesh(MeshBase): writer = vtk.vtkUnstructuredGridWriter() if datasets is not None: - # maintain a list of the datasets as added - # to the VTK arrays to ensure they persist - # in memory until the file is written + # maintain a list of the datasets as added to the VTK arrays to + # ensure they persist in memory until the file is written datasets_out = [] for label, dataset in datasets.items(): - dataset = np.asarray(dataset).flatten() + dataset = self._reshape_vtk_dataset(dataset) + self._check_vtk_dataset(label, dataset) + # If the array data is 3D, assume is in C ordering and transpose + # before flattening to match the ordering expected by the VTK + # array based on the way mesh indices are ordered in the Python + # API + # TODO: update to "C" ordering throughout + if dataset.ndim == 3: + dataset = dataset.T.ravel() datasets_out.append(dataset) if volume_normalization: - dataset /= self.volumes.T.flatten() + dataset /= self.volumes.T.ravel() dataset_array = vtk.vtkDoubleArray() dataset_array.SetName(label) - dataset_array.SetArray(nps.numpy_to_vtk(dataset), - dataset.size, - True) + dataset_array.SetArray(nps.numpy_to_vtk(dataset), dataset.size, True) vtk_grid.GetCellData().AddArray(dataset_array) writer.SetFileName(str(filename)) @@ -754,28 +777,69 @@ class StructuredMesh(MeshBase): return vtk_grid - def _check_vtk_datasets(self, datasets: dict): - """Perform some basic checks that the datasets are valid for this mesh + @staticmethod + def _reshape_vtk_dataset(dataset): + """Reshape a dataset to be compatible with VTK output + + This method performs the following operations on a dataset: + 1. Convert to numpy array if not already + 2. Remove any trailing dimensions of size 1 + 3. Squeeze out any extra dimensions of size 1 beyond the first 3 Parameters ---------- - datasets : dict - Dictionary whose keys are the data labels - and values are the data sets. + dataset : array-like + The dataset to reshape + + Returns + ------- + numpy.ndarray + The reshaped dataset + """ + reshaped_data = np.asarray(dataset) + + # detect flat array with extra dims + if all(d == 1 for d in reshaped_data.shape[1:]): + reshaped_data = reshaped_data.squeeze() + + # remove any higher dimensions with size 1 + if reshaped_data.ndim > 3 and all(d == 1 for d in reshaped_data.shape[3:]): + reshaped_data = reshaped_data.reshape(reshaped_data.shape[:3]) + + if np.shares_memory(reshaped_data, dataset): + return np.copy(reshaped_data) + else: + return reshaped_data + + def _check_vtk_dataset(self, label: str, dataset: np.ndarray): + """Perform some basic checks that a dataset is valid for this Mesh + + Parameters + ---------- + label : str + The label for the dataset being checked + dataset : numpy.ndarray + The dataset array to check against this mesh's dimensions """ - for label, dataset in datasets.items(): - errmsg = ( + cv.check_type('data label', label, str) + + if dataset.size != self.num_mesh_cells: + raise ValueError( f"The size of the dataset '{label}' ({dataset.size}) should be" f" equal to the number of mesh cells ({self.num_mesh_cells})" ) - if isinstance(dataset, np.ndarray): - if not dataset.size == self.num_mesh_cells: - raise ValueError(errmsg) - else: - if len(dataset) == self.num_mesh_cells: - raise ValueError(errmsg) - cv.check_type('data label', label, str) + + # accept a flat array as-is, assuming it is in the correct order + if dataset.ndim == 1: + return + + if dataset.shape != self.dimension: + raise ValueError( + f'Cannot apply multidimensional dataset "{label}" with ' + f"shape {dataset.shape} to mesh {self.id} " + f"with dimensions {self.dimension}" + ) class RegularMesh(StructuredMesh): diff --git a/tests/unit_tests/mesh_to_vtk/test.py b/tests/unit_tests/mesh_to_vtk/test.py index 3ee6c0298..f00aa4626 100644 --- a/tests/unit_tests/mesh_to_vtk/test.py +++ b/tests/unit_tests/mesh_to_vtk/test.py @@ -49,7 +49,10 @@ sphere_mesh = openmc.SphericalMesh( def mesh_data(mesh_dims): data = 100 * np.arange(np.prod(mesh_dims), dtype=float) - return data.reshape(*mesh_dims) + # data is returned reshaped with order 'F' to ensure that + # the resulting data is interpreted correctly by the + # write_data_to_vtk method + return data.reshape(*mesh_dims, order='F') test_data = ((reg_mesh, False, 'regular'), (rect_mesh, False, 'rectilinear'), @@ -83,7 +86,6 @@ def test_mesh_write_vtk(mesh_params, run_in_tmpdir): # check data writing def test_mesh_write_vtk_data(run_in_tmpdir): - data = {'ascending_data': mesh_data(cyl_mesh.dimension)} filename_expected = full_path('cyl-data.vtk') filename_actual = full_path('cyl-data-actual.vtk') diff --git a/tests/unit_tests/mesh_to_vtk/test_vtk_dims.py b/tests/unit_tests/mesh_to_vtk/test_vtk_dims.py index 0b6acf5aa..8166ba68c 100644 --- a/tests/unit_tests/mesh_to_vtk/test_vtk_dims.py +++ b/tests/unit_tests/mesh_to_vtk/test_vtk_dims.py @@ -90,7 +90,7 @@ def test_write_data_to_vtk(mesh, tmpdir): # kji (i changing fastest) orering is expected for input data # by using the volumes transposed as the data here, we can ensure the # normalization is happening correctly - data = mesh.volumes.T + data = mesh.volumes # RUN mesh.write_data_to_vtk(filename=filename, datasets={"label1": data, "label2": data}) diff --git a/tests/unit_tests/test_mesh.py b/tests/unit_tests/test_mesh.py index f1f5e9f67..49556fce3 100644 --- a/tests/unit_tests/test_mesh.py +++ b/tests/unit_tests/test_mesh.py @@ -480,6 +480,9 @@ def test_umesh(run_in_tmpdir, simple_umesh, export_type): mean = np.array([arr.GetTuple1(i) for i in range(ref_data.size)]) np.testing.assert_almost_equal(mean, ref_data) + # attempt to apply a dataset with an improper size to a VTK write + with pytest.raises(ValueError, match='Cannot apply dataset "mean"') as e: + simple_umesh.write_data_to_vtk(datasets={'mean': ref_data[:-2]}, filename=filename) def test_mesh_get_homogenized_materials(): """Test the get_homogenized_materials method"""