From e90b347cbf3408659c16d48db4ac9cc29ed1774b Mon Sep 17 00:00:00 2001 From: Kevin Zakka Date: Fri, 13 Oct 2023 16:12:36 -0700 Subject: [PATCH] Add mesh conversion utilities. PiperOrigin-RevId: 573343028 Change-Id: I4b258f91a11d1994659b0129de5ddb2077689f01 --- python/build_requirements.txt | 14 +++ python/mujoco/msh2obj.py | 111 ++++++++++++++++++++++ python/mujoco/msh2obj_test.py | 77 +++++++++++++++ python/mujoco/testdata/abdomen_1_body.msh | Bin 0 -> 157480 bytes python/mujoco/testdata/msh.xml | 5 + python/pyproject.toml | 3 + 6 files changed, 210 insertions(+) create mode 100644 python/mujoco/msh2obj.py create mode 100644 python/mujoco/msh2obj_test.py create mode 100644 python/mujoco/testdata/abdomen_1_body.msh create mode 100644 python/mujoco/testdata/msh.xml diff --git a/python/build_requirements.txt b/python/build_requirements.txt index 0470e02b..e8c00e89 100644 --- a/python/build_requirements.txt +++ b/python/build_requirements.txt @@ -2,6 +2,10 @@ absl-py==2.0.0 \ --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3 auditwheel==5.4.0; platform_system == 'Linux' \ --hash=sha256:d8410a17523427ba3f7b60c9701d23de28b8f94fa5dab732aa6c30d160df8127 +etils[epath]==1.3.0; python_version == '3.8' \ + --hash=sha256:809a92ff72f12149441492cf4d9a26b56a4741dffb4dfb9c4c7b7afe055c2d28 +etils[epath]==1.5.1; python_version >= '3.9' \ + --hash=sha256:2c1bfa2817eb4881cb509097f1e65ac6160126ba74ec47b3bb47ee678628d8c8 glfw==2.6.2 \ --hash=sha256:c2dcf2395d99ff2506428213bee305bb9ba024043d1f574216e61e6f5df808e9 \ --hash=sha256:c385c9976133aed57ff4f0ff5210276844cefb4d8a7bf61bbcc1caf10385744b \ @@ -50,6 +54,16 @@ wheel==0.41.2 \ pyelftools==0.30; platform_system == 'Linux' \ --hash=sha256:544c3440eddb9a0dce70b6611de0b28163d71def759d2ed57a0d00118fc5da86 +# Transitive dependencies of etils[epath] +fsspec==2023.9.2 \ + --hash=sha256:603dbc52c75b84da501b9b2ec8c11e1f61c25984c4a0dda1f129ef391fbfc9b4 +importlib-resources==6.1.0 \ + --hash=sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83 +typing_extensions==4.8.0 \ + --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 +zipp==3.17.0 \ + --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 + # Transitive dependencies of pytest attrs==23.1.0; platform_system == 'Windows' \ --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 diff --git a/python/mujoco/msh2obj.py b/python/mujoco/msh2obj.py new file mode 100644 index 00000000..cbb6c8d4 --- /dev/null +++ b/python/mujoco/msh2obj.py @@ -0,0 +1,111 @@ +# Copyright 2023 DeepMind Technologies Limited +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""CLI for converting legacy MSH files to Wavefront OBJ files. + +Usage: + python -m mujoco.msh2obj -i -o +""" + +import argparse +import dataclasses +import io +import pathlib + +import numpy as np + + +@dataclasses.dataclass(frozen=True) +class Msh: + """MuJoCo legacy binary msh file.""" + + vertex_positions: np.ndarray + vertex_normals: np.ndarray + vertex_texcoords: np.ndarray + face_vertex_indices: np.ndarray + + @staticmethod + def create(file: pathlib.Path) -> "Msh": + """Create a Msh object from a .msh file.""" + if not file.exists(): + raise FileNotFoundError(f"{file} does not exist.") + + with open(file, "rb") as f: + nvertex = np.fromfile(f, dtype=np.int32, count=1)[0] + nnormal = np.fromfile(f, dtype=np.int32, count=1)[0] + ntexcoord = np.fromfile(f, dtype=np.int32, count=1)[0] + nface = np.fromfile(f, dtype=np.int32, count=1)[0] + vertex_positions = np.fromfile(f, dtype=np.float32, count=3 * nvertex) + vertex_normals = np.fromfile(f, dtype=np.float32, count=3 * nnormal) + vertex_texcoords = np.fromfile(f, dtype=np.float32, count=2 * ntexcoord) + face_vertex_indices = np.fromfile(f, dtype=np.int32, count=3 * nface) + + if vertex_positions.size != 3 * nvertex: + raise ValueError( + f"Invalid number of vertices: {vertex_positions.size} != 3*{nvertex}." + ) + if vertex_normals.size != 3 * nnormal: + raise ValueError( + f"Invalid number of normals: {vertex_normals.size} != 3*{nnormal}." + ) + if vertex_texcoords.size != 2 * ntexcoord: + raise ValueError( + f"Invalid number of texcoords: {vertex_texcoords.size} != " + "2*{ntexcoord}." + ) + if face_vertex_indices.size != 3 * nface: + raise ValueError( + f"Invalid number of faces: {face_vertex_indices.size} != 3*{nface}." + ) + + vertex_positions = vertex_positions.reshape(-1, 3) + vertex_normals = vertex_normals.reshape(-1, 3) + face_vertex_indices = face_vertex_indices.reshape(-1, 3) + + # Undo vertical flip done by MuJoCo's OBJ loader. + vertex_texcoords = vertex_texcoords.reshape(-1, 2) + vertex_texcoords[:, 1] = 1 - vertex_texcoords[:, 1] + + return Msh( + vertex_positions=vertex_positions, + vertex_normals=vertex_normals, + vertex_texcoords=vertex_texcoords, + face_vertex_indices=face_vertex_indices, + ) + + +def msh_to_obj(msh_file: pathlib.Path) -> str: + """Convert a legacy .msh file to the .obj format.""" + msh = Msh.create(msh_file) + + out = io.StringIO() + for x, y, z in msh.vertex_positions: + out.write(f"v {x} {y} {z}\n") + for x, y, z in msh.vertex_normals: + out.write(f"vn {x} {y} {z}\n") + for u, v in msh.vertex_texcoords: + out.write(f"vt {u} {v}\n") + for i, j, k in msh.face_vertex_indices: + out.write(f"f {i+1}/{i+1}/{i+1} {j+1}/{j+1}/{j+1} {k+1}/{k+1}/{k+1}\n") + + return out.getvalue() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("-i", "--input", type=str, help="Path to the msh file.") + parser.add_argument("-o", "--output", type=str, help="Path to the obj file.") + args = parser.parse_args() + with open(pathlib.Path(args.output), "w") as f: + f.write(msh_to_obj(pathlib.Path(args.input))) diff --git a/python/mujoco/msh2obj_test.py b/python/mujoco/msh2obj_test.py new file mode 100644 index 00000000..cbba8d84 --- /dev/null +++ b/python/mujoco/msh2obj_test.py @@ -0,0 +1,77 @@ +# Copyright 2023 DeepMind Technologies Limited +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for msh2obj.py.""" + +from absl.testing import absltest +from etils import epath +import mujoco +from mujoco import msh2obj +import numpy as np + + +_MESH_FIELDS = ( + "mesh_vertadr", + "mesh_vertnum", + "mesh_faceadr", + "mesh_facenum", + "mesh_bvhadr", + "mesh_bvhnum", + "mesh_normaladr", + "mesh_normalnum", + "mesh_texcoordadr", + "mesh_texcoordnum", + "mesh_graphadr", + "mesh_vert", + "mesh_normal", + "mesh_face", + "mesh_facenormal", + "mesh_facetexcoord", + "mesh_graph", + "mesh_texcoord", +) + +_XML = """ + + + + + +""" + + +class MshTest(absltest.TestCase): + + def test_obj_model_matches_msh_model(self) -> None: + test_path = epath.resource_path("mujoco") / "testdata" + + msh_xml = test_path / "msh.xml" + msh_model = mujoco.MjModel.from_xml_path(msh_xml.as_posix()) + + msh_path = test_path / "abdomen_1_body.msh" + obj = msh2obj.msh_to_obj(msh_path) + + obj_model = mujoco.MjModel.from_xml_string( + _XML, {"abdomen_1_body.obj": obj.encode()}) + + for field in _MESH_FIELDS: + np.testing.assert_allclose( + getattr(msh_model, field), + getattr(obj_model, field), + atol=1e-6, + err_msg=f"Field {field} does not match between msh and obj models.", + ) + +if __name__ == "__main__": + absltest.main() diff --git a/python/mujoco/testdata/abdomen_1_body.msh b/python/mujoco/testdata/abdomen_1_body.msh new file mode 100644 index 0000000000000000000000000000000000000000..6fd0e732f4a1dc9d8b6b288063e86b4f70d8f062 GIT binary patch literal 157480 zcmZ_1b#xZj7qCmP;I0LV6)(jlB=0^1cL`Gd9gde(FHyEDwpduHa$esg3_k|f9f`)^B%BuSdreJ=LuK{{)h z4QkDluab5BX#L0Z4Qfu6q-spN-}K#?af%Lk&eHG1bH1rAG(6TZ_RXhcYRIrqy>I3Q zb#AD)O18SC&X;40!y#u*#&j;+O|9-r3El14c1LaGcRMFn*Wyd-)Va1R*2bJ}4tdvC zA0=#WX}xmlR#o*?2G#ZCCM(OAh zxkIrw`fd*S#(L>hzCOitp?o{kqxzTRThB*UjuV^Ju`7Q|v$)4rwTR8C-1fhvNrn{q zTk6dYhrD}%OVVg)ay_Eaf5z_rO9pj)V_jRiNiE#@mxT3Ct%sD}^HtowMsV)z_)a zQ?%q>Ttbh{y;gmhq{Wlq(eH1raX92HemEv&n-|m9zr;AkMyqX7vv)=PG1F?bCfzpK zHoLBFeI?rAkTWM^IuE;TlYq_5bdTt0M{VT(FSLyQy{=aK*C^J;oNf;J%*n@O_4Ts4 z#hVy4v7#mOJ}4b^ZjQ=SUCYU-O7Gk;O?~QW$uH?z>%AqXIUI5yzXU1b)mqz4oMR(X zYFT#OPq!R2No{Fp$-#~-b>Dv{I`WeeKH-mCxeGlJ)Hb{r>kb zheQ7R>>Dzw$v9p0vvX|x^LNs2#b{mN$r$x5SIlhfoKODOvkt62oPVbhesCDQoH;4R0rR(B}oT-2N zF-jHey+ykC{;FRNTA}*1+$t|4%rVtzg$n2tC&_mGrUMH*9r7UqV`cZ!<~miyD96}l z^S4R9ZEbYrek)YfRa>O-53Tjo@=k}GIT_P=v}}iDZuOh4x<1-b8+nFS+a=3}U-k0E z(TcS(r<+60bJ~?nd*zOAfWCY=TqU2AC}nj^Jup68{dU@xoAWyAd-uZ?9r7}dwRC*b zMxXYMaE$GFaG%W2+Dhl#7_KHKO_W?OJL%n5o%zX`lQErV(Y8!D&{KCGIMGoXd5VEr z{^{03pA4F)SQ~S?IpjR2m3($nzI1zRb;}Z`YF4@;Yl9zI8MDW#Ea|SuuJg(D>A9N~ z9rE%AZpx+*Z(U+$tYa+a4E&yDesbnyOo!jObjVkJx+G(M&7%9R-lSL?eK&`EN6ZcJ zJCaksoV;0Oettq$ck64lxf-I1H9sK}yLPu)4G&h`wjPx(zt6Rn?hkS}u%wcT#Tb?PiTU7o?KJ9Ft`$=UDS=200vZ=44D~Y3?JEs@+=a#hc-d+Q{$x zd|2Y^ueHwiAE8(qbGkX?zo$JcO=`th*?$jG{H{Mb`MBg6Ur~2YvQ7UoAQ-1G44Qb=3yNv7fG;5Z`*0^yzHt)Y_Nl~EMKbgteCE9EqEhOD$dj0zDFpp93SP}qgi^?u?R(nyj8VNvcL8s z?G@l0%kSJ3e|?ZI3nuBL)5bdTlQSn{I)l@El7Q9WI>pwpj@rmiSNtyewJYeN9#dmF3Q^IyE)|CC&zi)lCnlEojLgg zmG8VQ17_9J?{AM+o$n_~@2^eu)#l-f4tY$fM0qx)p*}e%+%dMyr@az+roIk7H(r&` zv0p+O2k7p#oenv3GN!{h108bCPgom$H;0__8D1;Zm}Scv@5(yor3f{AgO-vH8|yYL zA`~5RULSGnqlJmmzUwc#Lu7<%60%qFht}4)3PmV7`+CAJm3#=K8&BBf8RG&aV+=w_5NSwPQQVAdzw&(L(ZIx=|qkC zDrc$<)MdOw6&>=>q+g_VP>8NGJyfwa`fd(+&h?+y?4e22^SO)l z;;Jhg4moo&rgM8z5_L6pu`W?&g`z`VxnDAM#&3omS1DStHu`Q3`M?U^s!f^@-6-t_ z#cRm{^L9vJ(e}DQuNA6E%r^P7zODXRHp=0U^ZJov_v}xQ5&L@TUmq=3rIYWG&feX1 z&#kKz9dhPmOy~4vEn%y>=w9Z#n-2NNRl6iKM;pB+HrjDrOyA8R=QS_S|KG+Rkn^54 zdh)bzb#DJY`C6=t-l@YC9dceja%|cbN9CVEopp&v6V$Ewhvh|VZ+)$BxS~VOoQ&yQ zmP69H-XNXlY=omW@*2GpfkaPaeu~8%c67PQ1^_gYsRG!eQ^73s-U9QVUMTeX@8Pnl4BOP*HW3o2- zZVoxGSq9JeEN?^aT3$1^tJu$vQ*5xBq z?gx7%ZTjlkdsn!kL(cgL#}?_jSGqher1Kq^ppvAwMKbv4-t{LaI^@jBm=5QtbjUd; zWNq}_9CFU7crDLs{6CBCml1dOS)B_EQ*_81Yeg#lM$69ddr|qqmmKots?moffLX%zel;EACkv zi-f4a=URNiljw@U!HN#KU#|qYlaNDSono%7FqWUo&!R)loQ&yko6sSDeZ!K-oT+s3 zp+SnZ(RXvmFMQr3slVpevtvf9%`K10i@n>d^Ajeimfw#`<%yfD1BEB4M_CU_>-WiZ z@#hf^hkSm}0jc4iT7T&<(J}UW`NJ}3$!e>{{RkEH^M1*F;+wT&QMkh)XHLd+ciCpoQ*`nGv)MTh(+-@TIl zTy}l6+GNLAZgbYj{N&8Zm=0^EL(c0&)<)mWA?J1L)P$2VAxR0p;8vs6{st!{;HRQ~ zvkQ(?J3pTkzdlzJTD%KZbjY_oJtdP8uO<|KG0HKvRH{?*#8b@gV~b!lW1orZT}^mj zA=u%NGbdv@y!T6oocEbo8+|v2ocFGiy}v1y_Jmqzmv2$U)fHLd8E56waq6(o6?wGR zvh>ARMTb21tDEvih6F3i(KyFgzh5s&y{+S{!$EN>rpYBKn^jwuc^1I@ays~X&X%wsI zkaPd%*h}aBl4P|fTNN9`syfzRQa0|871MdMqC?J{jOmoa+8a9LT<62u=({=OJZ3j# z*drhGdFyt{mFmFFy>e*7Ijcg!C93GX-4fY4m;P{hv7$p>_^)jeJUfSeQ^`4&$0PT1 z<|k)P#&o#P(;@HEVwW`e?4uv`TC7+beK&{vw_RIgNpL0IJ?%=xYhGRp|1lv^<{j#% zD{q+UaL7Mew%qR0M_=7NRdFn@&8KubBvtPZ)wyao9dhPmOy_vSL5T?%uIEjet>};k z^)>U2C;jy9JF^vQqwnUB=U=ELvQ;15^3iPN{qt8DercI5U3Q_W-Rg@xid?M!{AZ4; zz3ht|Xt-F19hl>Ez-RUPD(#9a(}OcO$MU`Whphv{YYR zH%B>YLw+}hyzbnuQoHhU9sPNM;+mE`litbvbdfqCVy+4f_$*BeE!Tb1&viKDwTpcb zJ58jXI%1*XSU#8J^FBJ{%*mJzw>cehZhzKB-_0TCKEr$dTnq7ef|gz>d+RsWR7HoJ zYqvO-$1L}AI^@jBm=5=OI^;9kTax5kFJ1n@Y{lB>yE)`shsHHmT#I!t_K~d2F;A~M zY}TA$T^705tm`r-c!uuwVUprlKD*?zZ#v}6$(RoJNjl_F;g4lkwIzC0?-`1<(RXvm zSKYfVqdar83ZJQXuI4$s)u^3P^F~v>^z$NzLw>H%7HQVJzW%(+tkJ@E2ftIeo{$bX zb26sG|5G~TKknWs-=?(F72_5u)<)mWA?MmN&Q(r!J}ZmgF0gLa*rYaOI4g6jUbeEE z`>S-wIX~f8&L=rfqeIS|jOlRBMu)s`p|jGzatd8+^#;ehi@uvf&N&tD`SV%8*Gl`P zW2UBh?1MFm4*AHciPC9dBi;PM8pW}EHgO>TQBhf1>pYK~4moo&ro(&VbjW$1oVC$+ zbI5t$o@>sN%}Aq$jclPecyCds4yRGetF+KV-^D39< za^_@AhtIa?ke9fhM!l-mLO*{Ur&t?(H-~)eru6FO;$nJv<{gUb{Q2HQ#GTY?N6laL zzeTq=9CEJh=UA?*;d&K1(l6vGbdv@JZ9;T^F1%tM&HdL=X+tiSARb&LB>odte5$YR@whbkiva^ zbS^bk(IGFP5+rGtN_txNv5I2@r&|&?^d}wvZIpU-$C5{rs_A^ioenv3GN!||TXe{| zPK>qDcXP=3Y>v+ws!uy0Keu0Kt++5j6$;!dBhx&xmUSMl=#caI0>@fC4ojo86Rq@v z$EjP@_Q_vsPFqQ?hbcPb%*mJzpE1!P_vFxWJX;QPcX*uRxe0wYhn&wu7}Ke@c9~_KNj=Xa<*O?z3<`( zMTeZv)Hs&UNj-IJDRexIP98qO@m!UhIT_R8F-wP>$2e=F@8*zmo3|O9QEk|{$y&W( zmkMc|QDuL&$%b26sG zISCzd&Iwr?eK&`k^TSpbGpbVGGFg$C{4{d zFRja{LWBBQo~OGUW53qUsK%zsY#lEcucj2ps8%2BXZ3yWbjX>LF&%DmI^^8`tc|{# zL(cu-U8YQG^7L=M^?l=2*MBpr;(NdO#(Lt_yuUN5lD=INe9OiwI^;LLWmKb%cS&ge zi*s!3u#BqK+HbybE#g(To*C8X*ceh{{ONz`fd(6_lH>gE%9|S zs9t-%`W74+uf&r<#iZz#aI;6eqC?L5IW~KRw5nH+Prg>$cr~z0T2%ZzXE5(d53s%@i&u2W zx&L!4YYxhvRuyhJ#@e=fm!dd6}P_IT_R8GhaI7 zT<6Bx=({=OTz5CW%NhCYZ6&{38z-q{>WIuwQq9jAVcsize?%7UN^14W6`|;mS8aMy zdQQn~4KCpv8-Cb4)7kFh*YomtRb=Kd8S%%%go7f;{MW+P7UmoXYUeIob7MpYOFwo7K^V=Va-wELPo@n-m@L)LAZw&!S}3z!c80 zoBlm5QJ=Q^UNh^Ew--MpFV_~e{{45oBR@HFGN!|Ol61&^0xwhiF zZ`ZH$)cp=8=d-MhzMDhN=f!>7UXtPKF8fA}+oC3Y z_*)8h{M+|8wMBh=`L_&d^(mq9t2jl6d~NGX@;v#6gu#`aW4XWa|B?C0nUgUc{-4qz z=ktBmM&HdL=XwJk3j-og$gWbGeCJnNtKKCZk>G1S){Ks86&-T!{~TMO%`w@sd84md z^QS6n*5LUD*0tVbh*osSnUgUct_h(-&h;m(jlP>h&SRFx!k53#h}A2bUx{fmRpZwu z2RN?L(cVStc|{#L(cgL|F0XFd#d9jO8a#kJ4G#?bW$#V zDQV?-H(Ajk=l?IqR^E1AetlfVZ)u$=YI)W((%@PFE6={kiVit*GN!{dpLEE%{*$%Q zcXP8*_4UcB{iQSVw9pUMvksFL9dg#sv79e)9zutlIT_R8oP-WJ z*C(?!`fd(6w>jr>`>bQ~_*^-^%#<5)Q%5|i4$eEKd z9j+;*LmtxVgeX?_(cXP-cbIygIC2`JU-zg<`s^#8KWa*x}zN!4Tt5hkU z$bs}X62>LpuByW!Pn`c*0!Jh!4EnsoF_z~mo(GtpoH-fO;W>d0Ij>(>8+|v2oYzy_ zR@{cyCLEIGx3*h_Zj4fN$a#O*@&Aba74+$l^K<#m2;ZBaPluenDfo^9-)o>xhn%0w zd&T^F>C++S=Vq<>T$Wr2l~zA*P+le9N$)WoC2?r1imRMd&92u&Dw=+JbjbZDeU%Zz zBc$;(=hy}>Kg#EezOroQRyEP|xO-K^BjZhvJLV^6PR4Xrn|^waTKLFH(@&2M`5@D~ z&!>;6+4SyXZS>t7@}Z_5VEYu4H4 z8ylySirIHL9P)Ce|K9owr#yvrImga1{pfaYsUj0hKf3;=$DRM;D)Qa*xMO~D=44EV z+kp;wfa%@$WO_#FZhH5zHu`Q3`5&eqpuORuXTtyb0d~J6A?=@ex?J6?u2;AuuREre z)U8Ypy+?n`sSD}Ech)9{Lmp7%qU=t5@7Z{3lVj|HEEi?n4|$|^k4-AofeX?kWnS_A zy3yf~Gbdv@!>5?Od=>M_wq_e0wUMVwc0pdR&njPk+o)I@bGkX?gG*kJ7hjXf^Wcpt zWiE3c!~RkBJ&RF)mp&$`e9KC`kMEkf9)zYn$A)Cx>({hw5QZ8HO=9W zSF5Te@8>4+^Ui6Gv9nA+x~TGhNO7+@%GdO`o1ATkTrfTEn4g?E8PiEJ)slYIhsbpE zUJ@Ph&-E?oytk)3Hof~;8+|v2{J$tz}v$35lUu4b+$WP9kjOpB5vO~`H?;r)%MLTLEkB{6UGydo# zcTMj;*2bJ}4tW~W4{$}hF0#+`1DtRA>8TDW3u^xYitpG-f%mG^tgeA5rG;ES7bzv&ClF9YIKz`>hx_1|=I=xnUo zk@1Qg+?Ps5T;A+($oE&fV)}|a_LMdANsg_#_J$NsTSzLe+^k-Iyd;4K^2qdrO%8{g zIT_R8oPiEG=O?UK29Vr|Un=8&%~c~bKDEcKMU5TrO)skh;*+#Om>8h%@^ zHky8VgC>-e0Sz}e9P&LAj?1C(9`XASqd1mxHqPyQ`6Uo`N^4+F`XYxKRxe{ z(jz33i`CC!Ft zMTgujl|&`>T_QJ4|2>X9Y5LKvDH|cfN^DTkrccqE;R_{ShiHdG&YXR9>uV2q+eUf=ZY^Zhnn#!VWdSQ~vehn(}n;8eCG z8`DZwn0|V#QYT86;EqyfaJbrP`ssaq&_!Cd2v>B-KbZb|)~R+9dS|?2EawdTo@IV= z=44EV-??7<+dV|w?oHu`Q3`FYb1Flmks^3C)EHz0=oqmcL9t zJv!tuV{K{vxt>fk{r5PQ^B>NO=#VofV>;aCbjUXa@0I7xTgwd7yN|WecXPPmSO65$C zyVUc-<&x=fM~9p_8PjQF`svkv9V)v`KRr6+fu?s~P=+w^PaCRO8+|v2oX0G`YrdNM z)xp`8Nr?*6)vei|8F=*D@PZ@+xWMv%>Mc zN#D&O=XWBn#dwW&a_u(R<<&)6my1$#$V-_1ds8oWlgp<69>?;UvBk<=@~m=anY}sM z;gB;YV>*c!wZuQ^Eu-3*|1Z==zA@PzX|S-LoHo7tSQ~vehkT&v2iT?XKzU^P0rLFM zYqZIxpI(LZL&eVycR1v`P5-^j+4@P^>EViFdCmBtSE6+NCqyc>o#=4LnUgV{X{MiE zjhSO*o$04XhkSwQ-S=Qpi1hd=T(LI#ZVvf@=0~Mh<-xMa^aJEvnse;HYZs((*3#m= zaf8Dle|zkdlp9rDhL&5WIF@sMUSrZBXHLd+c+E?P{CekR-rFmU z)3%Uc(@&2Md1LQ=vj4cB95DU&IF@q~&I##|Gbdv@oTJhqznR9C9K9OJZPUAtwb6HT z$Y(X)E2R!p7G?SY@?OOJmItN7nA@I@<%87V0sCck_#@8}|6vY?ocAAcCEYJ=dVKV> z`!GUPDxE0FlO&bJsfRoA&|w~aZoNCUlo*#rhA$qbN)F#EJ>R61*>i?E^3Y)(e(ukq ziL&wcl=4Htq3ZL312QQ3q36a1XC6At!_VdY6aKyQ>5%ht<)tMt*>cPAnWooqy97C! zP*Psa9ix_;enhbW*<|gUU`2<#+io*oP2nxotA;qn7JIcv{yknnR&E)s(xx-dN_OOt zA7=(R9CGGlOo!W+4mr0oYoqVxkaK^C%5YS!=Dz6}WBTb8u6;n7w96-pJ5E$bE+3HA z-E&Lv7p5m39P-Lrj!M?x%buo%oMU-h^LSx?a^_@AhsO>b@{Vu!$$6DcN-hpptc|{# zLw@qQ|(5l7*gmf5$n- z@_Ux|+nJx7IT_R8y>~j~eY;!|@3}`jS(nBt)<)mWAEZ9>*{xSXZ=#V#FaZr{udF8oh`tNZppMCRrF&%Q| zWK4(0EFE$lzpRbEn?ufXPS!TZCBi4sQ@z)Eb+yPb8Fn$b1TI~tW|Xz1Xa6kHzx7&0 zhdieBKDpHGg6DSVTE|$fi{N?#<|k)P#&o#$fDZX@6SvE~oq6O^w$+NY(RXvmS4HiX ztu^j?R_kcReTn@Pv8q||J<@B_6HjjMl`8oDHW}kx zKpIwFsa8JTEqkn=q{WrR4u|~Vzk6lI=I5S2%sV3-J40`gdNn+9(e$Gm*K(IsjjSad zdM|c3^8+|v2oaYl>vu`&2@jU&5rRSchs)*^Qcj8Wn95DU#=#cX| zontR9(2{G>Fu7y;(Umbh?pF8)Nxi$X6&-TsWK1W-^wSGTI#zz3I@?hjxv%Nnm*6u_ z)|uXYtc^L{9CF@Uh%WV2>JE>VyQZIB8Pgwc^1(l)M8<{c-qJ6!`|n7paBz;ILw@JC zFEZfgRnqF#9LLx@bH2*Ui_y~d%L0|c^thW48zs}%I~{W7WK4(mHtCS_J|}CV@8*#6 zzAM*++%5V=dTv-Nb%GYET&ADif^E@~Kf_!_hdh4bJIT9utqh$wS8*)2C+nm`&YX2XJg zoH-fO;W0~xoX0O~qwnUB^L)ZJV=*(Y%eoE=CGE#aYO?94*Kf%(X?0|xqC?JgVjNq~ z^rOptW{EsB{pf0%9(OPLMoEi4GZYTLSy)ydaZ@_t!lem&>^ejkzZ`-NkLF&*xcbjZ0* zlC{xybIAFf$nSd20kYRUD>Fts_w?DfLD3=4Iqa-FuDsdvJt7a?XeO%pzZfM0xqVh2%NAMl~$EU;bY6n>4$#M$sYX za|({-y>Z@8rbEu0jOp;+G9B_>KOB{LX*)~1`{sAI@%)9pn?ufLD_k@Gr|FNE?MfBd zZ~EhHH2w5imhC1lOg}w3jt)7W)3G-CZVox08*-gL-wWty`suxI(p_2?+oI@@^W6uI<@RKqbjX>L zF&)-Shn#D5SQ~vehn(wzxMr2>-Ur;b<@fOB5^JwfbjZ0*m1DWKjqAbakTWM^Iy`3S zkn{LuZS>t7a-L6kF6Fxn;X}^KumAigJ2$OYbjW%BC$=N8kOGbt-MOQNP;h}R&>a@4xD58UKQV0qC?J{jOlQn zr$f%QXRM9Bn?ufZXnfXC(7eZS-MhZbGyU<}ok@_B=^D$=rk@@i@)yGsBs8Fk9H}{4 zaV(#0alI2Aa^_@AhijkckaxUk$%RTyB#-Ic$J*$-IplT5TC%NqRe6+RwBo&b-or0Z z#oRw^lt!j@9Pe<*lQcXa?Y|uGz*a$Y4vdqhnzVX)8R8FI^=5$ z?vp*;K6z4I2~(_%zMDhdtK4Dv*lfFJaj$WTe+!>QCN4^l@@qxPnSOe7$XP$fa{u8z zLx-F>8PnlDOoyD$?^qjsH;0_toX^+zJg#gXEsr1OlV4tqP;|)oypm&CGxu{k;Qi$ay0ja^_@AhjS`A!d@@ zoQ&zPW;*1drgz`X1M@tyP47O|M&HdLe`opuUToIPbI0@pWUss{raxZ2kuUr@nf`dQ zOh3IzCtvv0{!c$Wa`xZjSZ+_&Nr#*{8Pj3SbjUlK-hD@hzVP$?PwzhZZVoy7<1wb= zXZqW4X`seQi4A%*mJz z-`%D|KEU+u>m9S)v)}aYV{P=^9CB{+#ipO$iNTXSpJwe)=S+XRn*|PdVshpW~Srw#_k?YumUUjQPo#lQA7Wv!+AN=hv)_zMDhN=jrVI z5}*I1q>t(A+4$2W<^9hQxs%w@BblB3^vKzNk7GIKMEGz5D39IppjQ!`@{}vR{y{36(utzr?CdP0z{HziW8BA36K!k+c6E$MSw7@8i)S zXHLd+cu$WGdE75%-RYSYo=Nwdz5D39Ippkb#$I`z%!g!WlF^k5@U_FP@amwyI^OpI(KLWj#4Voc;93*&mN%`TfXsTy)5plQA70 zvvkOL{IWLsZVoxmIowvLF&(a%q(ff! z)@iAmVuWYlUT5z<`fd(6`{OaD(<<_eOdUJO)2W@apB_2;<8dr&<~mzCt7a?S}k7vdbL#qLuQ{!?AgWZT(KkDUGSIF@s^*OgDm;I3;u_YQ^6#Zjhn%0wdjh;y(5_PoRpH09o~%Q5DLUjs zI;T+4D_{GjSh!1ZEU%;Ubx5J!l^yO0Ddcp>nUgUc?%Q<8xu3H(`fd(6k4^q9yjPH? zT?$p|L7eC9{+)^rIqTi?Zl+Wm#((=#_MTeaGKgV+2 z2zzqUA!km;bodS_9df>}%G&6=IpjQM`EE7exy~@jOpq^@=^29eugPCm zJ1?2RN?L(YDQtc|{#L(U$IJeTsF>l5W4NQa^gCE(&F zMTeZ{Pmbj~&U`1D4moo&ro-ci4mtbrvNrl|4mr>HoZE2D(9z6)`YvCZknTV8A9DUK z6324>!2Z&7$eEKd9rl{0L;jPQYkj(2&H7Ssm*e-I=({=O{9Po*bbd1PpTp(nTHW^T zR1OE6zl+4NteL;>L&w39lb=h6zx6|h{F|9;EqHLs+T4Dpa@2M3lIELotu0?%6#do%N<{%=#cYwpE;JlbIRWjr9;k~jOp;VMCp(hsQHileX^B) z&||$~ZS>t7a{gBJWz%P)bG<=2kLk1FRr!o0TNb7hXN9X-X8v<)>v(;;#uP<|e2RJR zrt1BnI+uCxhGWarxh}QuPSQC{KUn_0JRNf8WK4&@HBW~;*vz#e*N5vv8)qrjM&HdL zKW^SRiU}C5=S`WdxG!-Z+hgWG>%&v&`3H759P(bKKla-z->sj`H3-LYpWkhIXe`T| zQ6KTz?r_MNlQEsHuRcoH-qL#I)UApR`CZdH{aSo!o!azHXKnP|9CH5F_8!w)X2iap z`d8Cirs$2MQvTamoyE*&W|{dgO?6Db26sGW0np%k6+eC-_0TC`6O+Nqw>$7&box@EhE0?CFjZk zI(*=GRci8C>9cu+?qlXZbjWX+{x&aSd+Te3!yRMeO%La=T_be^)5H09)5CdGlX1GL z>EX=$^8+|v2oaYmsi+GMIQssfvy5rGjE^ShD$n%6=m6vZz>T+E+ zDvsqjGiT{{;yK?`7aAVxaLAdHF&!R9bjbf&@JI%pEUf?S8>d(seK&`EN6ZcJJCaks zoV;1_T*PzKZS$LV&$5N>qGI^@@fBuYq@KlF*JixkK5oOyfoHA(ivd_C^$e1}8M zoQ@b{dCbxw=kd$h=({=OJfHAddye^g3;YlwU3?a)DQ5dr44EeR$}LoM$a#IuvAka6 zbr2nL=44EV*F<#4Cz$PdZT@m8cW%C7ZS>t7a^4f*Gew)>WP5ve$q&qhag-X%W`edHNcBg)~BGbdv@TpK`#oa+Qw8+|v2oNF8So<4t5 z;6UM6$ z6>?2Jd&YiF`&FXu#z?x8OB5Y)_K@dT_Ur4J`I}_?xLQUHTB7KXGbdv@e0P`*Io~5@ zZS>t7a=zEhzlA*s{p)>`H(skHrtuO*hn)3uEPEt&{o|Vy8Ma!6RbQg$kTWM^I(+w> z4msa*XKnP|9CB`Ro-5ePqJI4?QoH|;B3q&q9de!@IF`pF_j5Yr%*mJz_jx+x>;=Kv z=({=OJg4zJ>(Y1P|b0&ZHfetxyGN!|APKTV^ zpS96&!%(jjN>1=dF2 z%^~Nz`JCHu&X98DezB4_vU>by{zJ~+U3HAbZw)WNZwJ#MXHLd+_*=bn$OHX%$^4<` zt@dWF#oFk*IpqAU*l4v)YWA+EKW193QjL$5gy>4ThndfOD-0KA`I>aw zWZUezy7iT4$JpO?ZILCxm2`L0C+A$DEz+!cef@dY3Wr0^oQ&xd?7c<0`2MP24qD-; zjeLmty_nrgo9k5O_h?ufbGkX?54&xXfX&TxkLYOCv90MBJ$Hr9Vt!{Q|F-v%=6#fo zox4~g4*cY+WMCz#{ z7CIbq=44FA`{%DR{L(UA+FTFPAwO#7TJdUyK0I)VVr}%@9P%&bw+RX?U84QXZxb-4 z6J_Qg!IOMkJ|NMOJV!gQP3dOOkd6wzD)2_%eJvhTcheOVsjOo;!YxHVK}cL%*rC(&3OZCu2H1X6cag{J`4iyE)`MpX6Vt zC9+i?-O}`o3Nk&T(m&~^ci)+iKS@8*yJ18Q~C%ahDe zGfmH*B;R`J@}}p{B{TmilDD&NXy!k3$ba0uQ@%}Urz@HsFC5G5$vWwfGbdv@j+#*$ zc^~upUoRtC>%E;;DAvZDZVoxm`Mj4EWqSVXsODh+oB2=L56kt?uz89OIqz|C zY`Lv(#b^0aoyYu!PM%5cWPZ9xoe(is(IIC}#&mejr$ZiPem^eu=}O(O-D1Vs=({=O zyyup4{U`aWP`F+eKURgB--f6i6r$^x--d`XzwdCS+CW{#{Juko`AvkcK{NFE!x4%; zot~y&*@!|*_0@HA)C}``3Q=YwCzW$gLw~ktm(UQb8#`fJo664v6swy zsi8srERT5?wT*e7cf-z2)@t)UFUQ_6?`DoV-X)>Ac{j6_d8f71w@g-~d8d_Q`F*QFzqssR*IhODF@?BSsW$zchFU+z0odx!R;aFb#^L_%yvX30^18^*V^MXC)IF`Q~ z!r#B(SpIGZeL9SppY<^2-@?D0F}EAHGh_ZA@&A-D_XqAjjJfY|UuDewoW})Y9#d|| zAo+tZ)2lGHk6yTLv}51q=Q2P4cK(h0TezLMJvo;Dr~JR;*cGO>UaLn+%=*!aJ{`u) z&w3d1Z{gn_)8MoCFYKW=%nVk|Opn1i7dz``g$ApU51&hm7R~hf=6xO8$89WYW^JsY zs>xZSS$9cNx35ZVKC4v35V>4zunIIal$qr)Npwfr5KHG7AZzDY;N z_TlI9v-r33@8#dp&eZm{X91aSYWv;PytqRxNqwuE;@F9%wm(+C^E@-PjW9Leex6D! zQ!~d_G__3|bkh@VYNJnwG4rz?#{66Ow7) zNvX2g{3749b!;EEv8%)t>I%*?NlW&5K zEpka)O*<;q#++^r`N77wb-34lz4Ad*bur+vXHVdD>(kK?br494s^6_j z*4g^K^s9_P4u||u;%(2N}F7*pVZR+ z;b=OY*-GVb$eEKdorQ-R+S`2E>O#pfJ8C1ZV&$>J2JY28o|jjwjXB*M@|PPwXr20| z9{=56{dTydJ^SntD>$u3l|P=#-W=J=TKu|^`mtO_dq(78D>}Zp!y&JCtFS#e^Fb>- zUroo@rB@r|IYnJ*7pe#L%tIONR9n9jIm{&vQJ5xRV-+>YAF(}tz6 zX9U&NF>8KRtc^L{9P;92ve^Lv#r2}0jns!KA@-M-Up;pMURqz{N89r=ANTy^l_ep` zzhms;{&W4Rge^&+L;fZIXuE1+9?ylyM~<;y?u@cm`JeUp#x1kH9UpB6`&)jYFKvfI z&YXrL$0`Ht%0%l7El$F1xE1$XKfnLp@79U9qm$kWE9uoqrGuE(bLcZ@CMHOsn@ z{kh&B9ccS`{kW&-(=2vWWPrmVXHLd+Don~PTQ0V?Q$!?n)J9&o`z*cMr-l6{{U^=Z znA6Q6&y?tGhxm%U>ggHXbVV_HT%f-_-T!dHtf5Er-xd1WE5e#u9bz`=D-ZkG0p|A= z=#W>-ozI?lwx&I+O+De*R9@pfUt5i~NBi4WH~%f3FULpOGvW?==#VofV>%wwr|OD- zf4gIe%|eI#^}ryVaHoTt7a-P#d?s)7J zVPg|oMU}Fx+BbBAk3Z={_qy1n7G<}aoL#L${Kck2KEGf?yHel}R+UkC9Ai7b-K?MY z9H*+}T%*mKe=9pCWy!s97in$kSI^-eA#P$u!XJ^VjQL{Gs zZVoxmY5B)wvWtiKl!U*AJ6^VgY8Q%`^wg!Hag*Z2m6rcj-1NfQ_~^8*t@Si%{nA6!$vs9MzpAD zZ}V>}RjcH++sygd-dE(7lzo`fW`1(!WK1WoPX@c@@PaCPTpF7W`P@nk?4SIzs3YaN zY1T&H%^^P?(cQM9Z^&pc9fKXCMxuI|55Z*JL2WuB1AUS96B4k;m~U-JK*50DRU zRL-x=#<;O5ZOo5A)k4;t}0(Fw>_j_ zHOE+f=k}gaQC0KFXZP{h?r_MNlQEqOP5Y>kqbyxJzL29fa|6q#_`RS%T)s7NZ_0Ng({8$@( zH-~&q|N5%v<1F^sz+S@tYtF|??98T;_$IOI`Tk_nA?N=u$8vtyAWsqXFz}5oe>j(8 zu1LH1e)aDAv(Fa_f%g#mo1a4moo&ro)=)kaNz%+UUDE z3DXN-r)b6&D!X@Ipo7`Rg*HkbK0{r*0*`C<~jV` z(O~`e$3AxT%PTY;@@30T>BCdH+6lQk{%^kY|9y9Gd$LYC&#TyX;s**H^1^L0t07sdnR~DY zg=6`hQu1^*H8)=adrnw=heOVsjOirFoSy!Y69Q@oYoqVx zkk1)YU*(^X(e@rSPIxU@HG5ur{>=vVC9i%7g}Y|9S1f937x2&IaL9T6$gzWp`PhLQ z%i3cT_a-!4P{bZxTG@U+KMEak=44FgQ|hleaC=!hV{LCmhx}3Mx4PqlU+f=Br&p|v zzMDhNYhIrJADw-p7rtz$cYJJXXK$CrZk>CBo-(+$O^2M}OQsJ-by1l|rn1WguBaDXHLd+xE<(_7xl?%x6ijpj|vjS+UUDE zBTw?PUh;L%XuDF_51!#+dpvZ=IX~gpd$R`FCF16KRLd3e)avNrl|4msykyq4!R{@QZC+7BkZmeSkjYdYlT&iAqx zzda$xBky^5pP_XB9CqeWsZ`a|d2IT0$oaY5vX-~+L=N=)UcZXHbzB>JT$sNn{lJut zJam|cpZk96NV|B!Y;rj4j&=9*K)Zg+Kjl`~A0GO2$oaWf4)(MAc(zO4%o&7#FMT@X z{M=VxN7z>f_LsX}gZyq68)&x*Trb1?_xL?4Hr!5?Z@d)s%Icv*{%L=R?b9Z&vOegPWaRRoHe&h1H0tc zxsuH%js5KXu>UjP>5;mEyzvgUtLDxtm12GnI^WBke~1MWsx@0>@ZxPu9u&|9dhPmOo#V=>5%h2a1zu;-_0TC zed(lCyzCkU3+k=)+o*SEKk2Sv<@ENQZB??ZUUqDW)_TL&mWmE}#u#sVRDkHUr&~D2 zrf-w;W@6JaRv0esbny zOo#hC9dbTrXKnP|9CALF-#Me59T8U3lQMHMweI<^cH56Xo8H;ps)tVnJ7b`?r~iV= ziVk^*N9-$J{jHYKB^_grZ|-jAX*o>-hsMhGh_<#@SQ1Ir+somQGbdv@TsuLBoa;1L z8+|v2oNGULEDW`)+1X>#=vI-XRG;e=?Y_M$=}z6tC_3ca|2g*1$1b*i;7aR!n}@Qq zMLYZTz>k(!-6V<*Idd|m!?ibb$hppkwb6HT$a&0Oozveg(|duOIoea-4E)_LaAAh* zF4sXn7(CdH3JZ{{0sS={@`rtg*fSs2mE()LJI3;Oz-%j$EKRsyu22!b-kcH^=)l?Or)~tkY_07ZEq>q#tsZD zYjG^E&3im3Z}%Tu*?t-}%;AtTCu2H8F8J7;50^3fWdVy0dE<>m?FqGO{BI7Iz}o1$ zIpi7pn!l?`8+*A|Q@?AK2B=P z`Mi$~Idd|m!);E7oZFwZ(RXvmxj*opKi5Kp{a)P;7+2h`=k=3Chn#D-IF`pF_j5Yr z%*mJz_jx+x!DT#ln+`wQUBluMSQ~vehn(xsxaNv$v5F_o(U(s4war>xO@}2hDY-K5f*wb6HT$SZCA!JhlEzI{0G zj>U5|&*5*L2K{f%r)Sg0-!vWa_uc=`y$H|9NgmCy{7&I|LOSHk$=KmwZ6O{0U%yB_ z!XA>lnr?lxlxA)8-5heRJ>y*ElvhvtS>n5dUD>Zm+@99<^m2!-bk9>LI^>+6a4hGO zoTt$tXHLd+IA^0n9vRonz8d$`Dx@+i)<)mWA?KWm_x$-RApG7weQ@4wz4CHXMTdNB zkwm?^^m!dq^H;^Od^WKz`vv_e#aA8CwWh-%XHLd+cyF8zIq#FRHu`Q3Iq%zZ&H0x~ z-=t9$^Q<8#s|pN=mB8q-cAd9{6diK8^`j(xki_0Pr;XxRK6m5uEIQ=O$(RnGZP6i* z=vz}IPn*=N6+R)XjlP>hJ|;-15uOB{XLx$Wb^d&BBHM*Y(rR2OyG!nJ4u_m;`#F~D zYPep74moo&ro(Mchn(A=wb6HT$hkjo%_rA_9h&UJS@7x5gm^kZY&8hFDhH88uPL(casIF{#3zAr$BoH-fO zVa;^Nxi*ir(RXvmxlWI3s=3yBPE370`*Jh4Ehf;ax#neC8xlX6GOP0%S7nzX7?tHY2eLU!%rbEu0jOlRg79Db~<6>>} z-5hd0o8z;F*Nubh0Y@uKfm<2nb>AS{H!hzvD_C3{4mh7LaO~{|f7rSEPZhIXMc=G57l%&rRt6@1Dv3uLI6!B8)lqf6tX( z-5TNPT(GRrA?I^aj{Se=Iu~%8ivRyRl_aTD2uX5FNXX@2&p7VK{eH=E8s)XlXxUVsN~65ipO`PtEA{!~vaapJatjv*C37zf zRinHbHr1!nD6jQF|4aIk$0M=-b;i&1f2K`~#KxY_q|fxKQC`chzFC`Y3}Wg0S#6ph z*|$OPUcun#$(d8VYLwSBbz3#|E?>~C#JcG5YEu%*ro6qE*R*{0{n39q&rCQjnr14E z^19D;TQ#p_?9OXh@u}#UGBdqul-K&NzFOwD^KS{Vm%JH0`qE^t8s#-j-Byjhd#)Pg z^*whjo9a_(l-G0isS}?DpLabN{dC_@|I5M?LG1Zg-q8X6+>U8s3f2|cbtxXP;E$puRf2~=e(M}@|vb@t45#ssz!O8=cZ*-eJYLeI`3}j#&$L*;l?fL z{jTx{I*$vlOM7UutF_YocKPJ+Xx8M&&jsV1YLs7FtVdY3#KK7Vo);(h{#jyL_-Wc5 zjfbqO8yqh^C9IfxX~f1N15ICfO;fj3qkT@*D6jobEt~37X_VLg@YlOX#`a0$sa>P) zmpK!{Z_~y!zIN|o_rsp-@S(JJO*^k%<5Z*ku8ntw=VhD|ePrv03BHG#Otkq$w=}-8 z@B+85_vmo&k`0kts=S<_QC`#3ZPnQiZy*YVO5E2f0MrTy9Xsr)X% zsm%X>++*Y02cqM`lUY;UgzUzFYLqWnHzq9E>OS|}sU8Ww|7@HY+BI=g?Ag?@Avs}C zeURIeJ2I;2E3awlwrcd5tZJ0k=d)Ti)u+-Zug{CG+*U01UmC5S)XUFbV{@j{ZfxA@ zrEC4HmomcZ3LcDh98}e-M)?xq1>t>lwnkt4C(&2yn;u6^UwKVaw^gIZR5i-$^L;Iw z>QiZy*ZBr|F8ub-q;PUtUgN(Drn|2`91+f0)xveDzSgNmd9DBI`}fi5;T>r=HL>@c z-1i-`!>fwk@1~_YryAuoP2EcK;Ajjq+Om)%VP=Gh*lL=J9EpqsO8-;kuk2u3FZEQPn7~Y3jCWbWV|K zl-K!1S~k_E(kQRz?4Kq74#uQ4+8pc{=zmW;6Af1<}aXK2&#@3a|P z`gN`q-czG_c&uxVs~;^Jsz!M|zUn)8bRB!Hf8LhZJ6~geX%v35dz9n=rm5TNt8+?Kqx}92W5cWKEOHI1mrLlEsy>xQdF^v9 z@A*++Ya(shwdqd3ch!-9+n=pdZ}t0D{Tg(uvo88}lPs^A1b+QT|Gwk9^T4nKUv00n z9nkcZ*EDroHQFYqMtQw|SuSN$eJYLedOxN6O84QH)klQ$HofaASG+8$8s&9-SdXKw z5utk3D6jeIJ0tqugz8nJyymO#IOux~s#lHjny-!(>;F}~YLwS}zd3p&DEDA-Z|@)a zZ+0CCelLE?O(`Go=bXMPsQ%g&enF+yUNy?woRr|!Vs-pLUpv9~v;3ce8Se+~i87si znRN?-bt8AWykY|rG|Fq5x~-Zb^Ue*z0sGv0rw1pLP5Gu3ua35vUCGaTqovofX_~1t z%I{w_HnLz_E8lWQMZY`uP-Jt(y^;TIo#sES^Hb#KvYhaL~NYFZJReZL8H8;soSd2{h%7Wve~A2=HOW7}uxD7U@8zyUs|);-`#OiEyB2emGE4Z+ zw%zgXJnD4=b~@E4zoY#fVYp#mWM%Xdr@q4`+!U5yf4}Q=s;XbLrc0Q$?nYN`Y4L>g zmDePcdr`dtE|4v`W0OwPmk=H;M;1# zwc(!`(<1lPZ{;taP&Dj1>^c{FmqF84UenZV)!b9Md3bK$Tz6AJnS`<_zi4`!a9Vye z5?Ob(*RpAvsWi$zTCHRFW?KI(b<3CWv3Edb7cbuT#&xQlYQ6=MV{HQ~tNK z$xW+uyxc$Cvumhj(==0Ql>aF0_UQhOzq_}KXN5hxUmwmW?R~x6GI=d)UmH#z?EGt4 zH@m(=UI@ObKGOHis_9gteD1opg0J?D@K!gX>U+tgB4JkUjsAc2PrGxMwC$h2B6yeQ+|roFq?2xDui+>}-}(r{+Eu-4L2Vf&@4oxN=r zsz&*@3V$1P+FjLc9dv7gueJ#@=lC$P=xTpp$+&;lxFdb#HBH@CP3dvP!e#5*`%5;= z2~?x}a|JttRb4-IPd4llYS~nuN~8SXRvUt28*<#I2Zn~%{&i`Xoz=)aUeM9sSmny_ z?W4E21;twX&P%F=wl=04U%Rnajq+V8T^HuAYvv{%Zk*tok$X+pK4-NXKB2z%t1E=v zJFauXyVp<9D6eViwraG`pc>`1kD+B#eJYLe+MhYPesUOl7WMh6VUaI#ZGF6+{|OEi zOo#;E4-E5{e;d4)KR8g0@;_A?AI9DRdNiYBpuQiD8xjVGzX|%Jy%2dQKQpYl^|J88 zu0s+u%4?dst(vmiE(%+%yf!TL$%Ub6l_W%CNQkb4K`jBbO)mJ~phQuQKa0 ze{+diLH@j3{3l%xxQ?5uCTNt`G<91wUmhFoN5A%lyJ2^!gt950o!!XS-&EH3FY#ia zWz#fMX_VJKgWii3N-yMdCN%Y*r5$vcBP;vtd5wIruCtwLl&`Sq68FZCe%_wNI`w_{ zuXeuDxDx)ItSt9QmaTDj^ecByTJxr=QC`#3ZPk2JWV9dF>Q!g&Bt=!D{J`q9?b_bR z|5@?xh?Y(DsWi%KpF#JP?n8U8+yB+kz9nY&3aU|F`&8no~0l}35(AO6~XQus(l z2WM@(i>(=wvHTi$ZT{luu477Pbi+Z7t_*t-L^ewLhTOS=A`7 zY3jCW^qQ+0<u9Al zCHynhx`p;!F0aYT^8Ue%nW1Ww*EDroHM-ALqrC2aEt~37X_VLcpx2t3+e-Q|wHx`F zOG4LuX>~uUN<+VG*kGp`<@Nfaz7N-H@2@I)v9~!|?%t9uyzg1TkKEM2sYZECQ@2%< zwy=b;oWqg6g!B7D4jC*L`z znp2JPk&Rb}4{U4eZA_}E`szL7(S?5oH-BH#Usd5^uNvhwP2E<_`IXKM`hpItp1U!$=fyQ7iQvZ+3mM)~R4F6>pjhOeDlx~aDRdXH8zdSTdi$qVkj%Ugx2 zQU2%hCxR8(o!o2Dn?v>0d&YLhDu>xGHS*`}$_-Sbyr!w!s=4#nO=0H=)%+FP=LM=! z-s)*s^XO7H{u5ifPs*nHR2t>07QQ?jozu`QpWY$VzO?qStJb-8<;UiiFcg0DW`skysk*zNtbZtBWNf<}2wQ@2&4`$09z>-d9~P4%fX%IkQAUhB0F zaAwbp@S6NfqPM4QjHpKWQ?sZ2`!4mb8%{>lSNkN|Csd8{nx<~6M*FC$QU1_h6Jl#a z<&|5%&}rFJpGu?rkAIB~%N|`2Z5&zQbSz@WnmfYBR%{PGE^#2TwqlR)$o4;iN*k60 zs!?9YA9gPs5sqB_dQfJ`Meh5TvcnFApACMjI4&U_)o41J?;mxhhOH}B3Zh-ViEf(T zKP;2IAbQUGg+kS9_MH?Qd%S$m?VhD{5HbbTdSDZ50V=_{{k>b7ch->OD=-OpM!)u+-Z zuk|6ecJmE&mIb9UY@O7peZqsw#|H-o91o61Y(2e#azX5SE~-)f$cc&J69+p5Hy^C& z)K|}IJzrF#yr!w!s?l>tHOlWDGAiu2gxS+rnovK92_F_qn4j zY(2)DkwJqUk48^!nHqM^tQNG|@Kp50?|X$?as~uvGX4ovqx>T$+K1N^EDA0=aY3lQ zdf%t_Q>sy3)6{L%=ss7C^1A=EY^qPCQC{mq!rY-lGs8d9rsl<-#r|1oT39vX^61U! zwG!9U6JFQHDF&N^cDZonlFn}4x|Uuw%9kEgEbN zvpU|c=_{{k>b7ch>|Hg=&!5vOoHMM2YuK}#*RrWTl}7pAJ!^!0b85P=8R`B|(TQQv z+4ltVv$sZnFP;-VQl>*t(Dk?Isgcvd9_iNybJN~!tQzI*y{z!_CBuS&880+HOlMxt7TJtDvk09?aBUL;egy1^Gc-^i;X*nD{?=MOx)Ah_j|2Y z_;~*Iyvc`~_!mW^{F>bEVdr7hf-BN4Oz_ot5jx*M(^p>8)NR%1+ym7p|LU>6VTr5@ zg7XT}yp~P%sWi%eIDbfZO`XL-Yf2*LXH}!Tp1)c))u+-ZukDH6vtM@d zg7D=!ef-#rO-)-LxHhyk_5F-A-&8fq>wUWVmJBZp*N45lJ==|RA6Y%TYnS(Ja-VLh z8s#-j-B!(v{C~gM=eOk!&Qp!@cUG?--ud}W{=aF%^R#TLPo+^_#}>XWJjxGS_o`dp z^}o^EGwKD$cjfpC>l6;2E50lEz`p0)eM9v?HOjxe$JXB)@{7ADzi^7eJYLe`dn3?S?Ij4*+ZI#9p_c`Gjn}Y)hMs?G}Kq;q1|0RBkWS-I&bekG*ylA znx<~6M$cK*D6i+QmQD4kG|FpxqI1SdXB7*dJ=x7SJ5?dLc>BG<-l3!XIR$qGs!?9& ziK%ac)3zR6$#(w9f={9y_OA~1E*#}MRjd}MMtMzBw^gIZR5i-$vuQ1x>QiZy*XOEw ztvT81-!;0UGdKC*_~$v{8>{+7H!SZHs786czNoLx%Zj~wGI(7b*D)6{MC z)jFvf<#jHlmQD4kG|KBW@jr5{*FM048m+^jUF*4qo633BDF069tgvO;Q;~h^es$`r zeUiJYXT-h-6KPkgidT*Dnx<~6M*EzqQC|C>S~k_E(kQR}VSQ%t!0z_~o7d{rjO^~0 z=6n#mGo-++=-0`sMtOZsp}soqt>ek6QC`#3ZPn=5vTBsKb##JX`<`^Oq8VPxrutMG z<@MQ$&Y2&WQQQ6V+COgN(7t|R@hxuPFE{v>pI7v%QNHlJb9`pM%D&2?%e?yDeYly= z&VAFBdE+8KKdY55^!7jQp*kNp)hMrN>b7e1*_>*W*XMLvHr1!nD6h{Ab)LVz7jSX; zIj-kp*ZUze>w48FukSvnukKGRr)refG<91wT4vQKuk&!UY^qPCQC{Z->6}%a_r5#( zP|zXrtXtE*yH}0!I!{%7b>5oJ2UCsmnx<~6M$cK*D6i+QmQD4kG|FpxqHU?ZsZ^u9rm5Si(K@dh<#q0vmQD4k zG|KBdG=0|a*YfFMv95((=d5ax6%#sz#mAlROQp>ZRHOV8`#Xh;Pi=GWtS$)DSD$U^ zd?(c?uW9PGYIN?CYLt)7uNt(xwhuD)1zI-Mr_v}NS$=g`qRj=q+WN~w9jn(d{A0^= zLZ4Y7u)5?_qx|m;bHb?`BEeJv1|Ynr;P8hys38s+yt zHa2XWu_Cy&&W5O#P4%fX%72?NCcO6j#lgex+j@ZV%u%03{<&>x_-(=H=)knvPBqGF z`PEnJkJcI0D6eViwraEvt44W!zNTeUeJYLey3h6bnm&(vqD1HLO#TdKZ@hedafGfHO+)=Ie)dzt48_G8>@xmcWiRqpROKi*;JoOqr5(!oi!xGyZk329p_i| zcYWdgn1c;n>nfG}knC3?g_qy$4$q$GRik`^jK?C;Ro_JZ+A=-CSNn(BC)D(n*EDro zHQJ|Ajq>`Qsg_OksWi&#yQ_<|Z(hW#r;Ib0UAA zp6*qneA_aW-MUphBBy#zOYqhGspZu4mDe5vucztvt)s@_b4NWjwY_%r}|VH<#l~L-B!)9+?ls%6%$wru0m&8s)Y8>Z^5L-`7@+@|vb@t4815R*mxS7G%ZN z?u#5**=4>+h+r zjyLK!o@$iWG<91wI;N)@<-a*LDr}ekOl)pp!rFbRPo+^_*EiF(@(MbS2`}3*HwfMz z7#tWq&c3sj6U@nMk+`0o@VY*p`s(vmeU7ObRE_e#M{>e&$sqea&zyv{ z`&6Gwqr9$frfYN6m|ZfqK3-%+_fG$Qi@y2MCnJq^luKAoFZPXkcwHY)ef62XJ_lEg z@|vb@t48ajYLwUdsby1rDvk1bPHA1zI`-A~Bf{M5W=qL8*lG^b&Yk ze@}fA>b%YolKQXnb2LreR*lZdQH}D)TIGZr`}PgGu3DS0cAx4~X_VLX-*oM%zlNL+ zhA(+7vZc)cpEj&ecwhdzkvB{CPgqY+d0ih*ef9dN^SD%_yr!w!s?l>+HOlMxt7TJt zDvk2m=IFlCeVF@Fv+zv8jG$4Gs}k1JQ(o7{Q(rx%I!{tH%4?dsts0#(sT$=+Pi+|f z^!~V@%lp+5*6ve%Dvk2GKAvu?=GgN&;phzw?OT86C9J2XysnR@zFKCTXR8|JHBH@C zjrOTjqrCR7v}~$RrBPn{gxVL7 zz2#*B)g>dL5UlutOm@}7du?N_~yTPm+(zdE;nhrCy!detbe`RcnTx`u}8RinJ-tMya= zuj*B!yymN80y1+iCBjYFU%R1$>LqBD*EDroHTvvQHOlLAOf8%0Q)!gf z=c+pAQ|E#Xda!mlZhE>em49DUHOluYQ6ucLy@t>1`%Iv|IyW`e*Sh(On*Nc3_EFU+ zuW9PGYIJU!YLwS`Zdx|gr_v~|^X~LqcwE+d^aEA~@221Cc0V@4t44XP|LUvrMs!V1 z)hMrN>b7e19a7aOukWjB*;JoOqr9H8)8*Z2edl_7@y21NzpDC8UHd!LD8IN)+tAOe z;O#rrP1IM(z9-Wp=^{F(<>-u>5ZneI1-DrQgutTk9-MCii zp=y-BZtvycE9rgRL+@vX>Z|9Y)^pV;uW9PGYP8O)MtNP&P|K$JR2t=VeMN0c^_}aR zj+F_QXMN;utx?CTMtN;N)mPtfPIxC;-t|^q)6{L%=y{|X<#oMZEt~37X_VJCU;8!* zeTJTo+dbSp(I4w4^?!ud?;@$M_8)Y8=>(0eJDo0R>bCmoTGOgg-fvnN+@JrS=nqG; z6TkN)>8H{tuir(|ZPj!hxh8l%cUQC^dyH3&^7>sQ_0=-#_kC2Oyr!w!s?l%#s7CqT ztDg^ksQ7zyU#rnx%clBN8s+s{PWlb#E2~`;c8OdU7JckIZ|hPAmwr(s9Q;xpuNvj` zyU*&Y-#OLqhpI+-O;fj3qu&x$jq;_+6$`hn`z{!{w1L;MsXmoPdHq)P9VhCA9f#Ss zq+fe5=smqg*t6&LVb|4bgMJfgg%h4{9L_CxC#o9dZ$D5s967E*csO@rRDCbaFA`2` z;=-p6f12=pdDZB5=QT~;R*imZUNy>(e6T?{WLe#?bgsRJFJ)7GDvk2vccq87Y^xn+ zWL*>0x}2cK;x{bYOx; zc}-KdRkO9@cfq}B?*vaC=+HOlMxt7TJtDvk2mo@iU7ZB)&pCBvtu?+9)$ zSI?_P`Sh%-!r49F4sP39$E&ZlnIBHrADoH&6HGf6Nzf>-Y3jCW^gL3H@>SC>5BryY zF_@m?yp~P%sWi$r8B{*(U;M>jM4bj++ahhFW_;+v9u=<--^l70RgLmf2S>s_C2EFW zrya>tUu`p67p)Y|t=KZWrNqlo)hMrN>b7e1oK=nTdX8(^RG&(tytXHLuRW)Gi?IFZ zD*mUm@pHY$e+rM4{MfuI4E0ZVN^BBpQ$i2wD(AxbltEvs=oScbpP_P zVe9m#gDW!@o*1dS~ER-Gk;IhOR|eN z)hKWCJHsm34@BS3{vo2i`re1GVXhkG6VjA?Rip3jsa|<~k59{{`cxX_^}Rx!ldo&W z+IO=3lv7Rp`32`hRinJFA+Nr=USC1(7~gI8S~qP+G^!fqHBH@CjlMgq8s+spVlA8M zQ)!gf_nP&;=$eGxyHU(?iW z)o7hpjqvA%bFcQL!yC~=*)Z<*w&MtObD zU46C9)bBp1M)`y^C12I(K3Bc+y8pFos!yd+Uh9Ki>$MLse)pze_nHy@n;l1@s!?9w zb5~#OljwItRHMA6soSd2Hd8gq>)H!iHr1!nD6jA4Yu_fJ&roE1SbO0zccfrqV*f{Y z{qCyzYX3pM&#M~cf08tHTQ&NvUezdnpx?OAZGXbm$-Od9%clBN8s+s{v5)WR7}|FO z({HSCrLAi}J-o2a?8x@qA0x4Ml>W^BEAP@07dX`@zbM)!Tzqs}v}v`g6MTO!oD+VK zwm7#7QAKE`5 z{A+@el+sLmfz zO<#FUQ@2&~b^THPjUXLjs}sz&*O=osJS^qOGQj@P4FHr1!nD8H}cXg{>$#^A?{ zaZ%k?&7jQM?!@pZp{+9+QH}D~e{#jY^JO2*&2;LkWgfWuhTwSpDdCy4f1;{UUenZV z)z~w(EekSQhq3k5Rik{Dir2Xl?Wcqn?JgW>*;JoOqkN%~h5Uwb7bU&RHp& z@_PPi*)+{m8s)V;xn#KYc^dW&pGfQ6wB!1!;p|q;L#q#Y?LMp=&fVW4{3-2tW7Q}h z`v$?AyZeQ$^RJDlua1Z4ID=}G*EDroH9F>?8s!_6yefQnU%T+jv=Mn)Hr1!nD1UPO zUqSH8!0@fKZ<`!HnG-I_Z5xcs+7z8qI}-LCP%|8yyCHAdJCU&Wq8ee{v@%iEDF0hg z`&L((#zCL=YXs`6`%}xQ8s#-j-Byj3Sv3iK$$!`K3ePXNJE~<<{j^jX<>gwSV_CP? z+8FyzK-h0yt>C`M)?jDGo#9Uvk4IIbypCU~@A!gr_j82_;fHg%Vzaszj~ z7`%|tE37i?G9UBFwr^)&l3OG%eehM`(sk`Z)vIQ5ev@d!_T|EdYqSsN<+hAg8eSq? z-Mw3aueO2OuBz`nr!#!B9TmdaU7I^?C)Ib(@D~2OV&{a*Ge2?<&dl@`7F`k+nLf*@ z?~FP=_Pw>B&6-MnW{&rhBY8o&NyWYT&OO*7_Fif zpzFY>uipFXc!K)sI&wM=puYOe3tdxAef7H``uz*_)$fL=UNyR{>1%m(TmOsxciqz>wC-PU@p=Y?+T`Izb)RDOK@&93kBHN(uD%AuA=^VRhA zzw3WgU)|5TKh;-{sUAD^oly|D+X~n9ORj(S|*7UVJx~>03|GRy2D{^|>4Ew&| zn~`TKc5~UY8in0wR`=|Na_Zv&6%Z z9}n8v85LIqx_$n^yWOax4T2xj$Av?;)bk~~-WM4@seY&$<$FbH_#vz6MyH*OB-9_x zSAF%rC;Ufglgs8WhbCwD{qMbp*6=;EuMfs`Ob zy&272)GX{@^alS>TDvWiwlqoDKdF4R%vv@rgQnTKUL~KK{Z?ddev7bM!|LAVrMXG1 znj~y%nwpMoYxy;O-PZKgH~))A+|o_WeK4bstJt@T-{&j2uD9Im;lV9Wf9iHrzay@@ z?aLkRkbTpA?U|15`Ubt?JQzPh_}8D=>2_b%B%TlWrl0R{m)7gx$p^n=9$a=Wm~&B`x#-O6^0>)y+F&W&8(#RoUdc2_k1 zKYuWOgz%IX9(>(X-t~H?mnR?MlX)HW^QqfBJotuR z?{mM||3vq|lil2xnS=ZnhvvG$xBMRu#*Yxb;{QH$S67O}^8vrPqlMdbeIHLg_$Bk; zb0+U}56!IapPlly8{9b4zuU5*`(SA=|K)FAx_L)#kMrPddCpyNWv{rd%Lgr8^Tz#s z<38=&U0?Tz^I-f4;hPWt&@C$2IGzuf{YpOgCG+5?-}=A}y0xv}JN7I0#-V1u!F%ty z`D^R@4%I$!zb?K#&VySttmi(R)H|-L+N7-;JGGxDJ^aD=5yDT(`@pr^&@i44_|mJ= z-Ml5eJ^A35%!8Lay2k}4GW@};Rj&2;X8xULGF{n|-TmCzAG?p2-4^G;E6@4LrTsN5 zuB(3Rkel&%9sk2C4PA6^uQ(6Jj}V^Y4i7GWs*iiX&L{FAKA8s>z3MUd?q@B0?ElymE6HsZ;l^Vc#dP0w6EMhci$1$eevfT&W~*DIo|k#@gsyUvTmpIM;gZS0bl=K zrq$yfo_z32=E1a&KkmE9H9CHCyxpnt+-}!(`%n)Le(r*8u1MLTaow2jUU$EKnC{os zpX2V>(lXA2@gszHHTJp-dN=U!V9G^4#3%D$&YSS}L+*;Qb^Ha-tZ>T)clUSn{nWiM zZm5R`pPBiX8~bthxbBuS``vlF>%`j&{AoY%BZObLVz2w`t9tQ#z#Jd)!7rHybKabO zroeTx?^AuyY^7_z*vHQ+c+R7%H$LO)j_(oI(Y{hH{K5DU!c*Vj!FxYn>^>ga(vuJI z$vimrzdyJAKs&Pi$%oyfv29}M+i@ShX?cj$cOl3 z9!&kA9i?7z+~C1er`2^sOZE2XejD_jJA8K=zi!WLcf;*1<2)EYLU{H!JeYEm5An%7 znCsq<5xd=MJ2T?fRn8xHaLZ?Exns-w#C7Cb`{GAk{|de0JQzPh_^$_j?XG+v-NS>& z^n2aaos#a!hxlY3eA~otoL}6`(+{J+@z#K?u4ld5<2?BLv+X=Oj{BJYi(I70|Fu70 z{0QM`Z{WeLp0Ddp*XZrZhxlY3{OWz5xT<4XdG;gM7yRJC>_2o|zZPA!!d-cB_xN=T zj2|I*A>*i z&BKGs7GCMzUEedV`|eOjH*wJ|e%m>ZyUVNhi1T3l2;pgW;lZ@Ovy${^I-f4;o0Bt;JPyxyFRr$c=91WnFl}h z?0)xn#d@CenDctbv>NX2$^+s&c*UCc+@!nfdvyFi@`DHCM+i^8@ZfsazwSn6rhD=s zKA8t|{5g*~uQ_h;VD1ml(Qe$ZX`!1tqoaoh<3|Ypal1qA$3N@F>nWIapM3C3=D}Q_ z=!ZS@NlkZ2y*{4f1`p=?iSEzBZ@EH`HuC!itg`Pz_44rGxZm0O2v5Bu9-O^(o_qSo zR`KgO@yR@x{YU-V``qKM=FuMU{xLlLVy@fhh~IzkNjGak4-XH+X!Si|>DU_A`Ej@btUj!Su_> zhxlY3%=L-uVy8FyxOQW@c+MMmFyk8N=%3PGga_kC2v2$8!C6}ty8T&gZgBtXCtcCP-97o>m&}8?9x(29D079|I;Bgz{P3hhe*zu#=dq6-c0ZPE?%~1s z5yDeX;lb2b@*zH%2ebb;4}aVGsJnGoS6_9{C|4_IX#BnpylC0|uK%_c9v%OW{NTa( z5yF!%JeYX$AwHQ0)6b(HJgv=xZsVj@@%;~Dyp1jg+KHb$HzkH1Q{Mn%%9?Uo|I_e$A8y<`wAw2sH z9?W~`*Qnpu55ZYKlFpS zF4C!G+#ie|Aw1*6@L>9R%KhDlH%9mhWe>VNO}&Q)_c(K{tDJeW zM@Ri4J$NvFgzy}9crg7L@*zH%2ZyCXSMt0@KGt7}jsMXPhWU)cN8GIL86FKw`4FGXgW12__cIP$x%E%3+x%u89?WwRbkr}7H#`_WLU@ilJeYAb z@*zH%2h;E1xd+cd@Ph{r?sc!5)ozeS$NdK7f(PSA2+whY2mhU&>7MzfyC)ywlX)=D zJ2(y;e~ueGn05gj?FQ{NJQzPhc=j7SnDGwsAwHQ0^E`%jynHlt%NMutvHr+T8%Ku+ z(|)7l`bN3n!T1rvbKQXlv%koP_+%c;b%XnU#sMyP^gDM$t7aY^%>6Jr#u=uZy)S?V z<3|Y3eKtIp^a+UvCx_gh@Z6jGJgyt?VD7)rasR;e93G4xAw1(e@ZiGt-{Y#UZ4)1_ zAU>G~GhRYDna{v^0}o~#6CLC9jE}>E@gs!if5U_M|Kvk_G7qMF+!ym4hT{egCS7#Y zFODlb7(YUIjypUUfAS$dnFn*+I1e~4uFd)0{d3xRcrf!F&~e_;?!$xeBZMbkcrfFL zinRt@pZRO>c=m7h`;a>k0l~{0QNxckp25`;ZUu z$vl{HQ~wx0c>2I@_v+v*4-dZO+ecm4uX}v_f#Y6u;3Mwi1@^q-?Dz#3KSFq(lfZ*{ z-aLWhrxsKBZQ~j zh6i(fBp>3Fc`(<3|Y3xC=b^+IQY`rB`Ie_XqLGJedDY2v55O59auzBVYQv z@L>E1;ThM12Q%N3e27ox!PGm>7p`j@H+V4jMd-+v@jiGkeuVIh`@w^G-a|gbC-Y#Q zFHp~EA1?gwf84mN{_*+`ZhBtmN?p=AJ|Fd&C&s%u8AIapU-4)E;7170bq^lQ^^bgr zPv*f~C#c6fFMWFI0k`-5b{-yF>FUnj%n z>##rY2jfQw&$t~tnDIOEAwHQ0Gd{@m?vevHxoaBq@hwMv`ul_7^-D zKSFr+8$6hHoqUK-=E2k->H*^}+g|y`9d6Xl!-F~g=ol~m;H@`YM%A|e&O43Gw*})z z2v55O52k-dKEx;UVCo(9fcqYf8$6ifk8aQ{PrC_|yZGG~Y;n`BYZIS$491TTp63Se zVD<<35TDG0sdrnu?{mv`yZHF)~+9!&m>-%`Ig-tb`j2;n*I@L=i%`4FGX zgK59nkJJA5h+9&qr+=sH7p`DaR}T*+U39Vke}g@@pu}uQ!GE-v>iqn{aUJIe#~Xhz zeuVJsH+V4p5Aq>CnFrIq;eYVIE;{m&tI(%weEbtkyT$%u-YoI(VA5k8iTMn~!-GkW zem(bD#KVJ0kNY>uM?5^3^u8Xt$(4AgiT}?P)7;>qxA_mg{M6ldyrYK)H`&_Pjc(C3 zu4BC8_a8>N`pr7Uc`$y2@N1?&;0CX5AI}HeV$>?P`f^*N^=v-)CG+5t%f52=w3LsN4lHa4UNx_`}yE5cjmiH4-ej#yTUD++$*l* zc{)1g*MadPglB#hJowH7!`(-xZujIvd@>KF-&*^HZ`|h6&HVY}pKzVW_4)UC%N+@L>E1;i)h1;C}aHy9-YY@#I5%G7qMIPuL-Ho155om|tzri(j(m#qeO} zd!i#>_6Ix|KSFrw3p|)|kq`07Jecu9{C}Re(_OZrS^T)da~w-qdppuH}~`+dLbS*?YK2Y=ppmg}>>LtMxG z68i&xFn)ya^sC^(FFrfYZ7wmylMnI9Jecy)j>qSno;`ozIge8*j_36aPu}BJU)ajSgYhGT zr@e#+w<)&WeX^#7Cm-UIc`$zTgV=u@H+XRJ{$KXQSU0J{?S97FkGTsc_VxIK@gsz% z-G&GE9?h@aXv8M-Fawovv{4>o&&?9-Kb^E_cg^t>QY`J=#0^7hwDd;c55a!Nijf z@yR@x_K$u9{fgK;i`aXU@L<|Cbd;a#0X!H#LU{b(!I{4vaM@|;@%Mv>Pv*hzZG6j3 z9@^GZ4?bA@o%^m(y3gy_*u9uHB+i35Zs>0K?G0C{T652HX?QSxgz!aczU)p{b@6<_ z-wodH$_#1h$p^n=9!$MUZbydItKs@DxHbNMJ(%``knPG6d@>Ja zztfJ;e{UW%aFyQ}F7%I1k2;5T5-F53W;xmJ9A{`ER|AoC`4{x>}M#9{k05WFE|TIsM@5Zzs9Km)+*;ZT!ZyS=K8)-yTf8=YKDp{-E2n zzgJujkDl~y`{zw}#jly3aS!6*!K6pOp7n5uhX<1${cp-gJUp26XjfOCeO}4DBzUkp zFwwpA`CyNZ_LlPx9*iF$JpU6O%>N}H;*)tW`J!h^;lV??OmJuJ862+<)JOc1 zL;MJdr=Gxri6|B za*+@5$vl|-%X0$qFQ5CK`|yQ69v;m5OX#@YBRzO9euVJ&!Gn8Wk?VeZt$X}EDdLlP zFz;9KKNwH$?svND>e>1{XU9{)jUJiiy7tQQ=%|0}S9mafgz%iV@L-;Akq`07Jec|u zyAHo;*GH}+XO4g74qn>#-|J?K2fuUUWVfm7EpZ+9qqL*=gYhGTr{2MXIez3rd@>KF zelM{1MF!aWBJ{^NZt&puHjZ&u=iVCEF@DQ^DE?sl2;=I#&h6vLhxlY3JbV96 z_vwk|@%675r(|4&{vep~M0AWtGENE)#xEY89gn5n!Go!PFJWBk2gFwa}i&8VC2M*o~1e?AJ&a}E3m;rZY2 zV8$8AhxlY3%>6#~WcbUQ#M3UqgYhGTr@ZiBp0|+?@yR?GKiW~+Rs7(= zTvyQ1Zu4FcJQzPhc+L}eFxNlwAwHQ0bA6>A@xM53@L@pT{6oj{CiVwB7(YUI{x>|B zdO<$KC-Y$T7tgJq88*yqxTAyTxWR*IztJ&Xmdu0kBZTL;!-F|K=!j3|!PF1VpIeJf zaX&sk*cWd4l3Vm>2M-S(YvVCTY&-@X<2*c{fCuA82v5HY9!&a##DkMV&Kvsw+@H30 z>)m@Tn#TM8VETpV7&nNe8yjbW2jfQwPrmSA?iK_e=~l>_!55bV9rl;*fuQcz7`R6LQ>14<3vkAw1)H@L>E2i3cZ# z{BNGiaNQg8!V9kX@g^P~%=!`Ni0AnVJQzPhc*Y&!!HhqW5An%7nEy>Zr{B$a0}tl? zC3IZ(xZc2n@gs!ix&sf!pL~c<=E0nQ)Fa*};JCqqdH)F=`EtJm55|uWp8F{_9@yR@x0Jec&DzrpxF@$g{MfN;^D!h$904LB*z&Z%zNbMXy=z!p5fZR zkQINg2aF#fJjWRx%<(24;*)tW^@(!O-Y`xC4<>(f)RQ&#{i*8q{V8}beuVIp7amN1 zmwbp%=E3+e?#nn5?KC`?@mh3@6S6)HJQzPhc*e=#!HlDk5An%7nE%Ik6VGv|U+`e& zMWW+;qkV)2<3|Y3a~^mw&wI#+_+%c;b0+Em@0}&jqX2XK(J`LQ{Rcc4KSFrswZVg# z-$p*fC-Y$H5B+AI1IF5gk8FKacrec!(NVuR-tb`j2;n*I@L--Zkq`07Jec*#sDF%C z@xS50%Lvi}&ThX-^1p`-ld2M@-N z5T5!159a+;@*zH%2eW@^=V^C`4qE5l-qR_*o(7ofdt7(+J!ak?h6m$E2+#h82lGBI z`4FGXgIPy`5FS5xFzdmfBVX1}fd}J92+uky@L-;=kPq?6JecP#tgFcPK^Uip2eY0c zI*vQ_5gv>mAv}KYVBU8oAL5gFFzYz7E*IY=dF|ep-1$Fsh=0EZ%sRN}Sg(}*3J=DQ z5T5eFgIO<-e27ox!K}l|ap1VTd%?@D^~{bQ9?bkwbR2iqA%zFyM+nb-06duQQj!nx z$vl{Kytoc9Ux0c0@L;}QfsS!azE=ki#*Yx5{S6PM{*e#y$vl|)&AMVdKbuqT33t~I ztvo!K^#Rb)KjeFX@L>E1;i-4E1;rZY2V8&C)hxlY3%y=&IO_?u-A3T`vFQKCzk{&!5KSFrM zL*c>H3-Td8nFr%XIe71q;|34r{UvmqUt7NY$hDr;+{1(MBZOz3AUv4)59C99G7qNw zl!N|x75lF75&Nz&Jed5^(f{N;fd}J92+urCcrf!g$%pu49?buy9y1TQ$a&AY;rT5* zJec~6j{3#%h6m$E2+w|l2Q%N7e27ox!JIdYOH)5j%v|Ma&1)MUuLkox7#;7=@je?o z7(YUI@`VS}evuFH$vl|j$-F=26LQ|bgPHG%j{U}Z3h-e32;uqP@L>Kw`4FGXgW2!2 zqqM6WH+V4PF6d~tIiB!f{0QOs-|%4O>5>oe$vl|-OFK`yySZSk`|r5c@$b8USx*if z?Jw*1!GrN5gpZ$hXY&Db-$g$7CG%kJulSw{<;klXb#))<;Nii1e;Xa^wzB>{JQzPh zc;4HC2lKsC@*zH%2eY0O>teIs?`K`!bSE$C!}mMH-F=GcmMVd@%8+{w14QxmvX^_@gs!iJ0S32-UlKd;*)tW-(930QLif2 z-{O`IZ|~v3e9s3R^_F@855|uWp8pLGrv8x+@yR@x`b|HX`%aD?}Z2RoSuA$Pv*fq7iZmX)_Z3iUU)Fy!9Yj($qyckA0a&X!h`WAAL5gF zFy}q@A$(_q_37Zj+<&0sJ0{#$!GrN5gy+162XlQRAL5gFF!w!tKb8AR?tA%8D)I2N z^Q>=&j`NE15gp$T;Cw^Jdke|mBVb&N{LpcpkZ)XfcAb9Kr$)#8F`jF(o;Cdwo@b(C zz8~}G(9thtejqyL{WI?o9sL^mx9GU;(qBc#`#;S4MaOy;tp9*6HV-4Vz6J5{g!q#_ zA?2W)g!~`=FCqJd{YJ?CW&aa$oH*Wu9B=9aA@zpi3=d|UhV)4f9p$84==i_*>Sn(TJgxXte!mFG&IY8DTZ_4tuL z`4Y13B=LlN_k-_{!-MHhlRoL8qnwlv9qXc(+BDI9_U&yR9p_K>$^~v{gPT1%juY|l zg!q#_A?2W)e3y&<3+D&=WF7gE4?6t%ww&Y!uI=*gcg^3k@1n<^Ys5nQ&=ZnB{)G6U zD`dYkvvbVOH9OC&u-W-$Ma(WRD{6M3SuwMV%!->`Y<7v+rDi3}E;GB_>ABVvx;WdnpHBZY*xjrs#!I&>&&W~U2j&ytfpBlvm4B6 zo84$u$E>bdJ+qt4>YFt%YiQQUEZwZJSrfCSW)U-I=FOU!WtcTLYhl*Xtd&`7vo>aJ z%`(l}nYB0TVAj#BlUZl8E@oZLx|wx1>tWW@te07Dvp!~h&2Bd9XV%|rfZ0H^L1wp@ zWtrV-HrVVovms`;n+-L)!)%z@oo2($MwpE>8)Y`yY>Zj9*;uo2X5-B!m`yaBWH#9> z$83t(RI_Pj)6Hg>%{05qEZ6LAvsq^Mn9Vl3*KCg2T(fy*_nFN%TVS@(?0&OFW{b_1 zm_1bZ-%^ov*+-!x}6J{&To-|u!_LSMvX3v~*s@%-%HHWVYFCi&>so)GROy&E7K0 zH+$Rc9kX}MwwnFNY@6A8X78JQVD_QeM`qj2J~sQr>{GKHW}lgTZno2Gm)U>KzA*dJ zY`580W_!%OHrs3VjoCi4Z_NtKzBBvY><6>`W{qkj z%#ND>={b_c}?0;r|nf+~c+U$(kKW4F$Kh5kMvvbYPGb?O%zF85o z3(Sg|U1(O!>>{(`W*3`XVs@!n3A4-0E;qZvtfW~fv(jc)nw2ptYgW$eDzoxtSDRHZ zyT+`d*|lbs%qp8zF{^4;&Fng}>SouQ)iA4RR?F-Lv)X1in$(r-OYNK^)%~c*4wO)Szoi8&H9=3HydC!&}@*|EoNC}x0($$yUlEf+3jXS&F(N8 zW_G99aI+C+Bh5ycjW!!&mTflHY@FG6vk7Js%_f;mHp?-aVm8%mn%Q)-8D=xh?lQ|Y zyW4D***#{n&F(duV>Z`pp4ok7^UW5REi}8|Y?0Ywvn6H^m_2Crkl9kRhs~CmJz}=p z>`}AF%pNyeVfKXCO0y@;R+&9z_O#hEW~_xMe%w9Iz zVD^gHMzdGVUNd{$>X z0<-VTzBl{9Y`@u$W(UlEGCOGYv)M0Zhs+L}9WndW>^HNcX1|*qGdpf}!t4*TlV*RK zoih8M*&aEMn%&yje4| z4728DEzDY)wK8jM*2b)@S*BS#v-V~k%sQHNGV5&C#jLAYH?!_$Jle2(yu9qs&H|jWNqM z8*4VsY`ob7vx#Pt%qE-Vm`yR8YBtSmy4eh~nPzvH<(l1XHp}cDv)N|%n$0nrYc|j9 zKC}5||F433S^`ALf&jR8Y}>YN+qP}nwr$(CZQHi(*_?;`go@~hQ`Msw%^1cqj`2)j zB9oZR6s9tb>C9jzvzW~s<}#1@EMOsvSj-ZZvW(@dU?r)hZbx46w6 z?sAX&Jm4XZc+3-?@{H%a;3cnk%^TkGj`w`vBcJ%p7rye1@BH8=zxd4`{_^k9{~rMe zNFV|egrEc?I3Wm0C_)p4u!JK#5r{}6A`^wEL?b#eh)FDB6Nk9OBR&a8NFoxGgrp=R zIVngTwNFfSSgrXFqI3*}aDN0j@ zvXrAd6{tuhDpQ53RHHgIs7WnqQ-`|LqdpC2NFy54gr+p3IW1^OD_YZrwzQ)?9q33W zI@5)&bfY^x=t(bn(}%wFqdx-}$RGwYgrN*$I3pOzC`L1ev5aFp6PU;(CNqVpOk+AT zn8_?=Gl#j%V?GO5$RZZAgrzKFIV)JnDps?GwX9=38`#JuHnWATY-2k+*vT$-vxmLx zV?PHt$RQ4MgrgkeI43yCDNb{Svz+5R7r4kJE^~#eT;n=7xXCSUbBDX!<30~~$Ri%} zgr_{?IWKt0D_--4x4h#$ANa^8KJ$gIeB(Pm_{lGR^M}9uFOd8bfPe%dFhK}PFoF|; zkc1*MVF*h&!V`grL?SX#h)Oh~6N8wF-b^DGLn;ml%ygxX-G>t z(vyLVWFj+J$VxV{lY^Y(A~$)+OFr^bfPxgFFhwXzF^W@yl9Zw}WhhHI%2R=gRH8Cf zs7f`eQ-hk+qBeD?OFin-fQB@pF->SnGn&(amb9WZZD>n7+S7rKbfPm|=t?)b(}SM$ zqBni$OF#NEfPoBRFhdy1ForXNk&I$AV;IXg#xsG5Oky%qn94M!GlQATVm5P_%RJ_@ zfQ2k#F-us=GM2M~m8@blYgo%V*0X_)Y+^H8*vdAxvxA-NVmEu(%RcsVfP)<3Fh@Ab zF^+SBlbqr-XE@6_&U1l_T;eiUxXLxIbAy}Q;x>1<%RTP%fQLNdF;95PGoJH;m%QRN zZ+Oc)-t&QveBv`-_{ulF^MjxK;x~Wz%l`t)KLH3xAOaJFpadg0AqYt*LKB9tgd;o= zh)5(N6NRWmBRVmNNi1R$hq%NeJ_$%jA`+8?q$DFbDM(2wQj>hfil%qTqs7NI$Q-!KjqdGOHNiAwq zhq~0GJ`HF{BO23$rZl5DEoezATGNKMw4*&8=tw6z(}k{dqdPt5NiTZShraZqKLZ%Z zAO&aK$t-3whq=sSJ_}gLA{MiRr7UAP zD_F@YR>(8$u4%YhrR4$KLlYxw6A~RXYN;a~SgPi0dH+jfQ zKJrt5f)t`KMJP%!ic^A;l%h0cC`&oYQ-O+9qB2#eN;RregPPQ$Hg%{=J?hhdhBTrv zO=wCpn$v=ow4ya_XiGcV(}9k3qBC9SN;kUGgP!!FH+|?!Kl(F(fed0WLm0|1hBJbZ zjAArn7|S@uGl7XrVlq>h$~2}kgPF`?HglNEJm#~2g)Cw*OIXS>ma~GDtYS55Sj#%r zvw@9lVl!LV$~LyMgPrVRH+$I2KK65fgB;>8M>xtcj&p*OoZ>WRILkTCbAgLo;xbpb z$~CTYgPYvqHg~woJ?`^>hdkmjPk72Rp7Vm2yy7))c*{H9^MQ|i;xk|P$~V6AgP;83 zH-Grc|ANXt0SHJS0uzLw1S2>h2uUbH6Na#aBRmm^NF*W?g{VX$Ix&bzEMgOfxWpqq z2}npH5|f0aBqKQ~NJ%PElZLdUBRv_&NG39qg{)*FJ2}WnE^?EHyyPQ41t>@%3R8rl z6r(sLC`l}a> z$Rs8+g{e$qIy0EbEM_x@xy)le3s}e^7PEw-V?7(#$R;+kg{^F3 zJ3H9PE_Snrz3gK@2RO(f4s(Q~9OF1AILRqabB42=<2)C*$R#dwg{xfSIybnDP6JlYEp~Z)S)i*s80hL(ul@1p()L1P77Mniq^EDE$wJe2RhP; z&UB$G-RMpadeV#D^r0{P=+6KKGKj$pVJO2G&Im>_iqVW=EaMo@1ST?x$xLA?)0oZ- zW-^P}%waC`n9l+hvWUejVJXX4&I(qtiq))PE$dj%1~#&Z&1_*S+t|(ycCw4z>|rna z*v|nDa)`qm;V8#A&IwL(iqo9oEay1S1uk-l%Ut0q*SO9NZgPv;+~F?wxX%L~@`%Sg z;VI8}&I?}hir2j1E$?{G2R`zN&wSx4-}ufCe)5ao{NXSE%02%PfPe%dFhK}PFoF|; zkc1*MVF*h&!V`grL?SX#h)Oh~6N8wF-b^DGLn;ml%ygxX-G>t z(vyLVWFj+J$VxV{lY^Y(A~$)+OFr^bfPxgFFhwXzF^W@yl9Zw}WhhHI%2R=gRH8Cf zs7f`eQ-hk+qBeD?OFin-fQB@pF->SnGn&(amb9WZZD>n7+S7rKbfPm|=t?)b(}SM$ zqBni$OF#NEfPoBRFhdy1ForXNk&I$AV;IXg#xsG5Oky%qn94M!GlQATVm5P_%RJ_@ zfQ2k#F-us=GM2M~m8@blYgo%V*0X_)Y+^H8*vdAxvxA-NVmEu(%RcsVfP)<3Fh@Ab zF^+SBlbqr-XE@6_&U1l_T;eiUxXLxIbAy}Q;x>1<%RTP%fQLNdF;95PGoJH;m%QRN zZ+Oc)-t&QveBv`-_{ulF^MjxK;x~Wz%fDjZe*_>Pfe1_xf)b42gdilL2u&Em5{~dh zAR>{7OcbILjp)Q6Cb5W39O4p>_#_}9iAYQml9G(%q#z}!NKG2jl8*FbAS0Q`Oct_| zjqKzgC%MQ?9`cfp{1l)dg(yrBic*Z?l%OP~C`}p4QjYRepdyv1Ockn9jq22(Cbg(d z9qLk#`ZS;+jc800n$nEsw4f!eXiXd1(vJ3Ypd+2=Oc%P+jqdcIC%x!RANtad{tRFs zgBZ*ZhBA!dj9?_A7|j^QGLG>~U?P*4%oL_Fjp@u_CbO8$9Og2Q`7B@|i&)GOma>fH ztY9UpSj`&NvX1p^U?ZE@%oet?jqU7UC%f3q9`>@2{T$#Rhd9g;j&h9SoZuv;3J>- z%oo1$jqm*6C%^d3AO7;M)cYR+2uL6T6NI1yBRC-lNhm@ShOmSqJQ0XUBq9@qs6-<= zF^EYlViSkB#3MclNJt_QlZ2!sBRMHZNh(s4hP0$3JsHSICNh(StYjlQImk&aa+8O= zlxi z$tXrMhOvxeJQJA6BqlS3sZ3)!GnmONW;2Jm%ws+aSjZw4vxKEAV>v5W$tqT}hPA9? zJsa4_CN{H$t!!gEJJ`uCcC&}Q>|;L%ILILmbA+QD<2WZc$tg~AhO?aGJQujgB`$M? zt6bwcH@L|yZgYpb+~YnEc*r9j^Mt27<2f&Q$tzy-hPS-qJsKlsTn ze)EUF{44bTM*sp6h`h{PlzDalAq3R04a)TALT=}1ooGLnhRWFafr$W9J&l8fBrAusvJPXP*2h{6=1 zD8(pF2})9m(v+brs7?)PQj6Nup)U2PPXij#h{iObDa~k33tG~O z*0iB5?PyO2I?{>GbfGKV=uQuM(u>~op)dXD&j1E8h`|hDD8m@e2u3oB(Trg%;~38b zCNhc1Okpb1n9dAlGK<;FVJ`ES&jJ>*h{Y^nDa%;S3Rbd;)vRGH>sZeQHnNG$Y+)*>T;VF$xXul3a*NyC z;V$>M&jTLvh{rtPDbIM$3tsYy*Sz5^?|9D#KJtmreBmqK_|6Z0@{8a6;V=KjJpU1Z zfCM5iK?q7Pf)j#}gd#Ly2unD^6M=|CA~I2kN;IMqgP6o3HgSkcJmQmpgd`#{Nk~dE zl9Pgzq#`wGNJ~1>lYxw6A~RXYN;a~SgPi0dH+jfQKJrt5f)t`KMJP%!ic^A;l%h0c zC`&oYQ-O+9qB2#eN;RregPPQ$Hg%{=J?hhdhBTrvO=wCpn$v=ow4ya_XiGcV(}9k3 zqBC9SN;kUGgP!!FH+|?!Kl(F(fed0WLm0|1hBJbZjAArn7|S@uGl7XrVlq>h$~2}k zgPF`?HglNEJm#~2g)Cw*OIXS>ma~GDtYS55Sj#%rvw@9lVl!LV$~LyMgPrVRH+$I2 zKK65fgB;>8M>xtcj&p*OoZ>WRILkTCbAgLo;xbpb$~CTYgPYvqHg~woJ?`^>hdkmj zPk72Rp7Vm2yy7))c*{H9^MQ|i;xk|P$~V6AgP;83H-Grczaig$1Rx-R2uu)y5{%%4 zAS9s(O&G!wj_^bvB9Vwp6rvK1=)@oeQenwWv)U>QayTG@v1kXiO8D(v0S`pe3znO&i+Mj`nn*Bc13>7rN4o?)0E1 zz35FJ`qGd73}7IG7|alcGK}GjU?ig$%^1cqj`2)jB9oZR6s9tb>C9jzvzW~s<}#1@ zEMOsvSj-ZZvW(@dU?r)hZbx46w6?sAX&Jm4XZc+3-?@{H%a;3cnk z%^TkGj`w`vBcJ%p7rye1@BH8=zxd4`{_=0c`yT-aNFV|egrEc?I3Wm0C_)p4u!JK# z5r{}6A`^wEL?b#eh)FDB6Nk9OBR&a8NFoxGgrp=RIVngTwNFfSSgrXFqI3*}aDN0j@vXrAd6{tuhDpQ53RHHgIs7Wnq zQ-`|LqdpC2NFy54gr+p3IW1^OD_YZrwzQ)?9q33WI@5)&bfY^x=t(bn(}%wFqdx-} z$RGwYgrN*$I3pOzC`L1ev5aFp6PU;(CNqVpOk+ATn8_?=Gl#j%V?GO5$RZZAgrzKF zIV)JnDps?GwX9=38`#JuHnWATY-2k+*vT$-vxmLxV?PHt$RQ4MgrgkeI43yCDNb{S zvz+5R7r4kJE^~#eT;n=7xXCSUbBDX!<30~~$Ri%}gr_{?IWKt0D_--4x4h#$ANa^8 zKJ$gIeB(Pm_{lGR^M}9u8}R=}00I(-zyu*E!3a(WLK2G5gdr^92u}ne5{bw}Au7>` zP7Goai`c{=F7b#@0uqvl#3Ugp$w*ELQj&_)q#-ToNKXbbl8MY@AuHL)P7ZRCi`?WP zFZsw%0SZ!x!W5w>#VAe*N>Yl_l%Xu;C{G0{Qi;k`p(@p=P7P{Oi`vwoF7>ES0~*qZ z#x$WR&1g;wTGEQvw4p8SXio<^(uvM=p)1|!P7iw0i{A91Fa7Ax00uIM!3<$2!x+v8 zMly=gjA1O}7|#SIGKtAdVJg#@&J1QUi`mR!F7uer0v57}#Vlbd%UI3|RTYtBoKiKLQsMcoDhU06rl-2Si%vW2t*_jk@-K?WDk@8 literal 0 HcmV?d00001 diff --git a/python/mujoco/testdata/msh.xml b/python/mujoco/testdata/msh.xml new file mode 100644 index 00000000..410a0618 --- /dev/null +++ b/python/mujoco/testdata/msh.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/python/pyproject.toml b/python/pyproject.toml index c9c0b204..44c5ec80 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -27,6 +27,7 @@ classifiers = [ ] dependencies = [ "absl-py", + "etils[epath]", "glfw", "numpy", "pyopengl", @@ -55,4 +56,6 @@ mujoco = [ "libmujoco*.so.*", "mujoco.dll", "include/mujoco/*.h", + "testdata/*.xml", + "testdata/*.msh", ]