From e31aa0fb31f6730978c421a24fe1091bc813f6fe Mon Sep 17 00:00:00 2001 From: berenger-bramas <berenger-bramas@2616d619-271b-44dc-8df4-d4a8f33a7222> Date: Thu, 9 Feb 2012 13:43:11 +0000 Subject: [PATCH] Change the licence in top of all files. Add blas kernel. Add rotation kernel. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/scalfmm/scalfmm/trunk@360 2616d619-271b-44dc-8df4-d4a8f33a7222 --- CMakeLists.txt | 2 +- Data/test20k.bin.fma | Bin 0 -> 320028 bytes Licence.txt | 10 + Src/Arranger/FOctreeArranger.hpp | 21 +- Src/Arranger/FOctreeArrangerProc.hpp | 21 +- Src/Components/FAbstractCell.hpp | 21 +- Src/Components/FAbstractKernels.hpp | 21 +- Src/Components/FAbstractLeaf.hpp | 21 +- Src/Components/FAbstractParticle.hpp | 21 +- Src/Components/FBasicCell.hpp | 21 +- Src/Components/FBasicKernels.hpp | 21 +- Src/Components/FBasicParticle.hpp | 21 +- Src/Components/FFmaParticle.hpp | 21 +- Src/Components/FSimpleLeaf.hpp | 21 +- Src/Components/FTestCell.hpp | 21 +- Src/Components/FTestKernels.hpp | 21 +- Src/Components/FTestParticle.hpp | 21 +- Src/Components/FTestPeriodicKernels.hpp | 21 +- Src/Components/FTypedLeaf.hpp | 21 +- Src/Containers/FBoolArray.hpp | 21 +- Src/Containers/FLightOctree.hpp | 21 +- Src/Containers/FList.hpp | 21 +- Src/Containers/FOctree.hpp | 21 +- Src/Containers/FSubOctree.hpp | 21 +- Src/Containers/FTreeCoordinate.hpp | 21 +- Src/Containers/FVector.hpp | 21 +- Src/Core/FFmmAlgorithm.hpp | 21 +- Src/Core/FFmmAlgorithmPeriodic.hpp | 21 +- Src/Core/FFmmAlgorithmTask.hpp | 21 +- Src/Core/FFmmAlgorithmThread.hpp | 21 +- Src/Core/FFmmAlgorithmThreadProc.hpp | 50 +- Src/Core/FFmmAlgorithmThreadProcPeriodic.hpp | 21 +- Src/Core/FFmmAlgorithmThreadTsm.hpp | 21 +- Src/Core/FFmmAlgorithmTsm.hpp | 21 +- Src/Extensions/FExtendCellType.hpp | 21 +- Src/Extensions/FExtendCoordinate.hpp | 21 +- Src/Extensions/FExtendForces.hpp | 21 +- Src/Extensions/FExtendMortonIndex.hpp | 21 +- Src/Extensions/FExtendParticleType.hpp | 21 +- Src/Extensions/FExtendPhysicalValue.hpp | 21 +- Src/Extensions/FExtendPosition.hpp | 21 +- Src/Extensions/FExtendPotential.hpp | 21 +- Src/Extensions/FExtendVelocity.hpp | 21 +- Src/Files/FAbstractLoader.hpp | 21 +- Src/Files/FBasicLoader.hpp | 21 +- Src/Files/FEwalLoader.hpp | 21 +- Src/Files/FFmaBinLoader.hpp | 21 +- Src/Files/FFmaLoader.hpp | 21 +- Src/Files/FFmaScanfLoader.hpp | 24 +- Src/Files/FFmaTsmLoader.hpp | 21 +- Src/Files/FHLoader.hpp | 21 +- Src/Files/FMpiFmaLoader.hpp | 21 +- Src/Files/FMpiTreeBuilder.hpp | 21 +- Src/Files/FRandomLoader.hpp | 21 +- Src/Files/FTreeCsvSaver.hpp | 21 +- Src/Files/FTreeIO.hpp | 21 +- Src/Fmb/FExtendFmbCell.hpp | 21 +- Src/Fmb/FFmbComponents.hpp | 21 +- Src/Fmb/FFmbKernels.hpp | 21 +- Src/Fmb/FFmbKernelsBlas.hpp | 21 +- Src/Fmb/FFmbKernelsBlockBlas.hpp | 21 +- ...rnels.hpp => FAbstractSphericalKernel.hpp} | 361 +------ Src/Kernels/FComputeCell.hpp | 109 -- Src/Kernels/FHarmonic.hpp | 29 +- Src/Kernels/FSphericalBlasKernel.hpp | 214 ++++ Src/Kernels/FSphericalCell.hpp | 118 ++- Src/Kernels/FSphericalKernel.hpp | 975 +----------------- Src/Kernels/FSphericalParticle.hpp | 27 + Src/Kernels/FSphericalRotationKernel.hpp | 612 +++++++++++ Src/Utils/F3DPosition.hpp | 21 +- Src/Utils/FAbstractSendable.hpp | 21 +- Src/Utils/FAssertable.hpp | 21 +- Src/Utils/FBitonicSort.hpp | 21 +- Src/Utils/FBlas.hpp | 21 +- Src/Utils/FComplexe.hpp | 28 +- Src/Utils/FDebug.cpp | 21 +- Src/Utils/FDebug.hpp | 21 +- Src/Utils/FGlobal.hpp | 21 +- Src/Utils/FMath.cpp | 21 +- Src/Utils/FMath.hpp | 21 +- Src/Utils/FMemStats.cpp | 21 +- Src/Utils/FMemStats.h | 21 +- Src/Utils/FMemUtils.hpp | 29 +- Src/Utils/FMpi.hpp | 21 +- Src/Utils/FNoCopyable.hpp | 21 +- Src/Utils/FOmpBarrier.hpp | 21 +- Src/Utils/FParameters.hpp | 21 +- Src/Utils/FQuickSort.hpp | 21 +- Src/Utils/FSpherical.hpp | 21 +- Src/Utils/FTic.cpp | 21 +- Src/Utils/FTic.hpp | 21 +- Src/Utils/FTrace.cpp | 21 +- Src/Utils/FTrace.hpp | 21 +- Tests/testDebug.cpp | 21 +- Tests/testFmbAlgorithm.cpp | 41 +- Tests/testFmbAlgorithmProc.cpp | 53 +- Tests/testFmbBlasAlgorithm.cpp | 44 +- Tests/testFmbEwalAlgorithm.cpp | 30 +- Tests/testFmbGalaxyCsv.cpp | 30 +- Tests/testFmbRotation.cpp | 127 +++ Tests/testFmbTsmAlgorithm.cpp | 40 +- Tests/testFmbTsmNoTsm.cpp | 53 +- Tests/testFmmAlgorithm.cpp | 21 +- Tests/testFmmAlgorithmPeriodic.cpp | 21 +- Tests/testFmmAlgorithmProc.cpp | 21 +- Tests/testFmmAlgorithmProcPeriodic.cpp | 21 +- Tests/testFmmAlgorithmTsm.cpp | 21 +- Tests/testFmmDemonstration.cpp | 21 +- Tests/testLoader.cpp | 21 +- Tests/testLoaderCreate.cpp | 21 +- Tests/testLoaderFMA.cpp | 21 +- Tests/testLoaderFMABinCreate.cpp | 21 +- Tests/testLoaderFMACreate.cpp | 21 +- Tests/testLoaderFMACreateSphere.cpp | 21 +- Tests/testLoaderFMATsm.cpp | 21 +- Tests/testLoaderFMATsmCreate.cpp | 21 +- Tests/testMemStats.cpp | 21 +- Tests/testMortonIndex.cpp | 21 +- Tests/testOctree.cpp | 21 +- Tests/testOctreeIter.cpp | 21 +- Tests/testOctreePrintMorton.cpp | 21 +- Tests/testOctreeRearrange.cpp | 21 +- Tests/testOctreeRearrangeProc.cpp | 21 +- Tests/testStatsTree.cpp | 21 +- Tests/testTic.cpp | 21 +- Tests/testTreeIO.cpp | 21 +- UTests/FUTester.hpp | 21 +- UTests/utestBoolArray.cpp | 21 +- UTests/utestFmb.cpp | 43 +- UTests/utestFmbDirect.cpp | 34 +- UTests/utestFmbDirectPeriodic.cpp | 36 +- UTests/utestList.cpp | 21 +- UTests/utestMorton.cpp | 21 +- UTests/utestOctree.cpp | 21 +- UTests/utestParameters.cpp | 21 +- UTests/utestQuicksort.cpp | 21 +- UTests/utestTest.cpp | 21 +- UTests/utestVector.cpp | 21 +- 138 files changed, 2338 insertions(+), 3133 deletions(-) create mode 100644 Data/test20k.bin.fma rename Src/Kernels/{FElecForcesKernels.hpp => FAbstractSphericalKernel.hpp} (67%) delete mode 100644 Src/Kernels/FComputeCell.hpp create mode 100644 Src/Kernels/FSphericalBlasKernel.hpp create mode 100644 Src/Kernels/FSphericalParticle.hpp create mode 100644 Src/Kernels/FSphericalRotationKernel.hpp create mode 100644 Tests/testFmbRotation.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b5bf385e..1d7a9fe50 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,7 @@ project(scalfmm) ENABLE_LANGUAGE(CXX ) # Options -OPTION( SCALFMM_USE_CBLAS "Set to ON to build ScaFMM with BLAS" OFF ) +OPTION( SCALFMM_USE_CBLAS "Set to ON to build ScaFMM with BLAS" ON ) OPTION( SCALFMM_USE_MPI "Set to ON to build ScaFMM with MPI" OFF ) OPTION( SCALFMM_USE_TRACE "Set to ON to print trace or use itac trace" OFF ) OPTION( SCALFMM_BUILD_TESTS "Set to ON to build fonctionnalities Tests" ON ) diff --git a/Data/test20k.bin.fma b/Data/test20k.bin.fma new file mode 100644 index 0000000000000000000000000000000000000000..ea8824cc468a62dbdc75bad9dbc52620a504d7a0 GIT binary patch literal 320028 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%0Do z9X1QFWBcA_XL1d4KEcri_w2%#71`b04_Tk`K6SmF(DfU3(hnf>0gmU@?PDuU?H#v3 z+H1$oh1(T%&9G}<4q4xESb@`C|CpnFAp>On<=zWb_6`kZ_R6~<^OHX`)a?^0@@<>T zAobT@hEH|@jkflabs+tj0}+$$WMbs)G>Rbm^F5|2+ZUYNZpS+VGCy|J%hO)U)Z2cs zBSifsE;W1i1>ANUw?NwK`>S&7gSUIxcdA1A1N&C)w<}}Ow&q+7xzAzoib(t8r#bCE z8bH<q<}NO?Ynj7hZ@3ZCe{A_5Ve?T`-){Q~$bR*vTUPeJkE+=7g+Ru)wD>;QMHl7S z^D#o|=lRN}_KVqt?2kQ#v?n&a3$uH_WSiXsDaig=|G!1{4O7-xe`134k8cG(wS93t z*WPs(B)(WKRNMDO&bISRg|ru>Ud!062$i*SJOVlIV^8d2+pa$+?WUZCq^}n;7WQpN zF4zf9hO`H4yRX^_f9A2{iG;LIm%fj(zvV1#e|8#V{xALEQ@fAn7T8TR@CE0uPixNF zsVKAAGkRYD$A8LEal7XZpX`EJA?No*bpEq>e@fI|dFwi`eE&KV`_Hok?IYMB?Td}- zN9=Z8wXi=F1DXGM=^|-g=;&)Nmjfx!f2*vri;QEn_udPc|FM`>WcNe4z@GmXWIk-x zKM(u4!ru0msv+}Pj8od}oCGWE5|={C7h$V~b|-JC*o!M!gYEA+WMQv##>@Wa3rPKN zPK47g_dt;Sg7c8`^1AFl+x^XBx4-QNY0tj4_-cE#Dbs$c3Z#GWfH~WK-*F~;?lX|} z3|8MC*;?NUw~s#pS+8j%V`lI3Z?SFo3rK&lN#~hea$T(b7wGx9S|Q%{{fex1E)0<Q z3$f47?QWfVY$vk~vR*>)kdpnK`C4`fevtm9NZ3@n&|5R@UfV$Si+qaXu>a8GW<Tp1 zq&+?>dc7U5NveH*B&2<rcq!igt$Bd`6(LCZIQL<Q-IZxM_L;vS`zI34)Z4OcR<bv$ zhV<8EpGMi6d#$sb_7l=xRXp_2u2447{-+~k{C3r$PP-qvtL)DDLB_w5_t@I=-YmC| zI}hn!w4K~&t;f-7*Rcmu-Ze+=v*mp3WnbY5iQiKTP3^;+x$IhNA@%9AH^p{`&Pv!k z&Vrnech;iMt}-vqu6qWgJ!}`RVt2xz-_H9#r2oh}<Bu)#H%_}rCm{WW={?2v6XS&K znV&(%!zP}~uzzMBVgLIxWPi}R*YoW>|A^Y_ML_O53O$-=e<xnt-en6Uzuj$gu;<a% zw_o!Gvi@P^w9|I$W}dWToCDd<e$%7CUf_hHeSQ*TJ>k?pQ|-#1WY}Lj0~zn0;3Z^l z{HWj7Diu;5Y@7VUPQljA&OP=cc>Lg&$`8BRd=WbzN62{NgAY6H{w<5MO<{tZx0wG` z$o|}c-FAE8;=%2!s?!ek@21t+h2MpYKNd}Mv5QEQvpOySnQ!Sodc*G4)6;fVS0Vk~ z69!)PJ>_fcrdmPvkN#`dv=g*av}a?7%<o;*bFyy|^0O280~uf8pQ31AeNNwgffQtX z_+*)~{i0@lJAF+^e>n6(l3nCY4*U7Skow=<QqA6~?4E6+Lp(TtAKIpA?>H;QzS$U3 zzZq$C+THmZZM&rj!mpjfXYb|u#m;>Tq&;){SgGBuWgT{B7$ECo82S0^Z)V-KlhuN> z-w#i4w`ZH^Y`1S6B)x={&9Duq2(q`Vh15^dG6MD{_g>p6#X<J(YKVH;=`Yu_|B?sk zPrQssvVVJErCl=*WPba-Pl3JV^g4U)CP;th@T_vX#bIrB2M<8%bM6(~_UDcV+Osu7 z#uwZRYwdz&6x)WK`vngFy)!1+wRy<e?-Pg2$JCUS*iYVc(oV4eQa)I!2HR^~cyIUU z0;E2A>T=lbwG)GF_jSm4$s(2qwvSaa?RM2c#=~R__Sx|ZKeaW8hm_v|c6RoHU;S(| zzd^>&F5j!PXIV4V?p0d|xI9X)YqR663$vFogv_7GyWg<+d}*C+fdu4y<y~EwwpG6S z?51Qx!na$6)xOYbx!pUpL*V#X8)Rg6f>YY=lMZD4woI*>{gV_9dj&&CeX=}6%)T;J z#eQZLq&?T-8*FzjG2Q0348;Aerxfh2-*&Y3;eoWTFSuW{UA4>Fe$Eld_(kT_d3JYy z*4bZUdJVR(I%AF9p{DINPhUai)2FYyVaK;@k!@Kbq&@y$?4PYqrKJ7(e~|gHZ*mEC zKX~2j*@b+-`q!Iy*lUR0v}08h1-B;_oIYT;^_{uRcU?&OUEJtxmwzVCPGkwBzV83Z zZWncWzug@cNdB+${b1`S`^BzpKO}wpzJAg!I?~fVc_(E3SA-9f{qdYXww0xj`ckOf z)c(m6ZhPxfkn)ZHV!z#y<=Xaq?U4PzH|Ln!HLXv!|LqDnKPYNpmYv}fZTrc0Amdpv z=lt#Y7P#2@?SbT%$#X?*m#?g`%gl$A_j_1-?PmKQvWpCX^!G~myX}4_{j=Mf44Gef zQ{QJ*Et_I*SOr=Cw3xxle);7yb{oAQ<+sI~Pj;H^_ie-WLC)J<+c3-S=BDFzQP&~$ z!@XuJ`^5(Y?eDZf+Rw39bM1d-_}EKcgS3Y}Y~-~MHJ7oM&Vrmr`DKTro!&%M`||sc z`R=q^y0$zbIri#S9pLb<OzpCh%6GFnWC2MpRnsc%rFz`$s@Fiyr%+k`&Ti%7Y<s~2 z5dTSiT4LM1`IOza4UqaG*}U9NW|ootQ4vV_Jymn6?HB7?c5Kl3D?S}>`?b%u+Wp@Q zac@qHot@j#4Eq((`+7Be6zrwuoUm=Gfvjh82wz~g><GVI{{+bV`pMKoc4yo#*{w)| z+;6cwyU>1r$x*xQa**=yMDuC8PrOm~!e=1m{VV21JJU6J_NROx^T}&Y$Jm*_Ftj^! z7E(U>?G?0VtgW$ozyfLSEED)+_iT%b?dF5)!QtWgG0JXfXS!YOT*!LBWy`tkC+S7m z|7+h1me*8avp<%hX}7ckQoiJ6-n0|z<+kTP2I;TzJY=!2`uNlC4(|tWd6NFY&wk;q zB>RLuNPXLyJI5yS6OY|gD@c3U%s|1O>HZeG#akfxO-4M={=80(eUE=WxIFkHt!eL) zb;T~(4$?k060x^0`KVw&n-S7pUBA)RJ}bq@E;3;YSpB-BP<!XSM)q-CEa3dKSFOYL zLjP~uMY|#6bI(ti+Oq|#*c%E!&bJElwza?A_RMbSR7n4H+f6z9ExsS@GT9;hr|BB^ z?CN(MvVBzsY0uu7c-^k{=vkYciy`AZ7w4$kYjo+`Z`%lIpD^#qwclcM*UtYGWW3F~ z`nH{tgQ1<5bT>HsPQ7)v&x^iky+#2t{u%ILhF!^?skX}|LH4s)%I~x*ZSt^R^Ays4 zIX6Gk{`6T^dnrxGdPB#no9tNU3E91v59uFp73J8U-7Rd-vK%u1@#RIN{qB}}djnBO z`Lnji*uF<m-F`iEe4;(I+`j*=i2X)eNd0zAKgOQzw3^MXUPyn$esZq;w+=7+LI+5F z^k%c6{RfU6w*S9F=A$OLiQ1PcKDR5Wf|M_x6JOd2B<`~Nr%($H|0Amo*=o)<vv0Z& z>CgEr<+eBCRkrV44H^GvOxk7Z^X8|WhXI7&kf>?z$?ar!B@j|yTxZC(PhTi+*S!}~ zo_5$t+y7#1wz1KIr0<p)@9pwe7usLpTn-*zN|Rh;7agx`FR^qNIDAt$`|P$%PqK@B z3Ta>E`24d9U$WZnnJA<`I9;~hj>G?s9p6TXed^nl?Ju0Ev~R3|jNfcYlD20$*<qWu z1+rf1&m<xH1yxq|mgbQ9!Ev&)U3s;t{iHuT!1kqSoUmgkX|xmAcN5G%bWhUWsm;P( z)EII;k-L$Uy^nsTZI2TqykE5$+WYFSwyS&ragXfALc3YIYwRYysse}KW)2}cqkE$E z8jm3T7i(i@`;^c$yPxaS!09<tf1VBRj}Uvw6OjJhqovOFLSpCbidrG(t4rNAvcH)x zVc+}_l3&;S@wDe@sj*M^0O=3pnWWmEOA@o6^cgb$vp~GaJ|x7+&Y~N#{!%AO$^O4| zlD%{gWPiX?CvJNKr!Tg*>>=ZCUVlC9pNh2EN!mcxPdwfC)^5Yr<2GrVA?>yB;y1QE zpNwpug+cODOIWBq*Hu6J8Z*fFOQli2oysOg`&B*=`CIGu*)5EnZg)5YvOab0d2{<e zJ<fLTyp_S_2md(_`|8)+cEX*I^iUR`Vb2}vYA^E%a$Y2d;BLDF{e^aFQjq(jD;1UP z&M&`W`(q)b{gVBR(>|v}&^}le(%y4U7qYv~q;G%87Sexlb``OYj%2alsS4?j)qlTc zH~o{hJ>yZxemW7QXnP?IT|4*lkn?5U%;>XQB$;flv<}kW@!mYyZsT)p`}>O_>vOJt z|7oY;E@J<3Hl+WgXC-96=6s?3DmzGfZaagUz2AW=wo5KU`eWzZitS44RO}rUAoXSJ z150~X2~YdyUXb>FyiJRp(C%G!Egq2eGLNC8y~j-t`_yPi`#}25W4qYj%JzE>LdNs% zXNuWhcF(r|{{^ys;KPAz`-iO|c81XVA@-}DuuGOTvX9h+`2W^UMSI2d9d;a_AniGU zNA`BjEvmMB6CvZ98fPNxe+2j0aoIu6M?JD|hHbe{tM!+UoZ$FTh_A613~aMo$OT#7 zaG33i-PFh!`{XLf{sik;%Jwev=h%IXg!E^-HnQ6`?o6>iu@I7e4PGy>E368zcQ_0g zf1I?w!_L_>$ZqiiNd8o6^s(1=53@J6fRvBkUwZ6reLZedGXYW_n{Y?lU+0duzxNWd z-ge{F1-ASOMfQ%ukn-Za@FrXR`aJthw;=t=x&5#06j?Xg-R_0NU%Hx{{b`vR`w7z^ z;}bg>uG+QynPejv012Oo9UOK)rB>OoOoi;%a0$z^bxoDDzZ?#!KiH4y+Mhdf+U~b4 zq`b5GCt%;3pkp7o7t-I)k^O6TAe-Hu{VL>q2|Z6^`?5A^dmk-Gf9oG_ru~-_hV~rl zknxpu-wxYxJImPx^FY?SxHy^HYi)P6w+Z?KE+1BG+-fIz&%uuAAVmJDMzVeA<|TIZ z=OFoO&e?oB*}6k^9qEwyAuDfB`>4PITWu+b{QVWib^*)^_B*N|<9|<1h}j!W_+nd= zt_Lo^GB(HCo7@hxf0qL(Z?3<;YHRe;%Kk_;r2MGr@33=Gd2Z{~3)wF!5aMQkRxQMS z?r+HXTrs~o>{|X=+pWritOqu*bGO%bnP~f;53(P8J&(NoE%P~c<`$6s*E5-$Y%MK! z+xGfE)?dzxO1Iy)sKc%}43hs=uexgIEER2E^#an~nqB_dZuMC!`*nvQ=G}6AXuGUC z)c*b&h<~j2zOa*;ea<#xB4od*lWK{5v3i1iX2DBv_&N8a*|kg(vb(k&65nYN`t}ze zW!pzTfXsKEI`_`5;XRkVm{2`9eHU+4u>YbjZC@jO8yr5<I3n#Qburn`&4i?P&Ui!n z=kdAr?lzG5h-P;U`%Lp=c6*`gy%NP9+1>B>XP2x2DL(~vl-TnwF1A1Z8`3_g@D#Q8 zKap;4r3@LrJ1(VQ+pw0^?)Gs={%_i;Yk%x;fc=_PkoBCqjgQ-fhE1@GG=ZE4<*jqx zZtjB&dxcYw_QBMjO!mev9qm(ALefjhx+MF`3D4||G9mlzR=<92`>*znt?vataD6i6 z;tbmlvv};QG$HFNra8sgGXyi*PsxYWhcR}}_J<yCu}x)wq|a%I9QKncnCw1ZgRFmf z6!gSydAOhbuS&@Hxz&n(JAq^Fc2~AQ@`G2NhW)B`NqfGsnc(oxvQV-A%K5~0v2zwU zJPS;?>=x<Q+n2wAtk2l$$Y;MN<EgEA4WvK7s<O*YL)PAIP7LJygZ*mS_J8Ll*lJ`! z`p=#Ba_nt90__*DLB`|7zHYKz8ob%=$P&nSpv9C!cFvc*?X&+t>fi03e%i5E&$WI3 z79xN2a)SLTQ5$>1*O2u=hSp|wnsW}=UH=B@FG`&$urs*LWM8QU;n&LB*=s-Vu$_1r z(x1sN-)?t4_Kw}{S&;a=y@}P{V(ls0T}vSIQCuZ1cD!xJY`(vN^tTr&7u(OA_Qck6 z8{|B*^b?`>_jmrb<IRG^_r)V@_TJa3>~jSn^PLT;m+b^rMca$3L)u%B8fo^2dxdS| zR-OijU%cHvyQ9~;>|z2S>+{`ociH~Co@C>c3mNaUl=QLJ@Y`qS^$@Z?O=OFK{rj6K z_KwFP^Cjmal<m8=ueW8M0V$8VyU*EKtQ53eQ3zST+kc0}{@0^8`@>Tq>Cde9j@@+s z({_B&`}zbnT(j$m^0${0gS1!b{s`JVX)?9{<p;@6x);ms{5yi|?(Ty0Z<f16*;k&Q zZfD~L>0i9u$Zo%${ebPlTf4yNLro@=XzeO({qypc!t5%wFUZ`dW)K*}F+{n@tj zf`jclHbUATxwhBrA`>>))s#c#Q@><1+MOtKv+sNi8E>;;>9n=CcDK{2fwpJNZ0+yO zUSs!!SsQGh9rsf^D<=_qsbi4wlkW|;><;tZwL9qrNnZuL*X>SOl-ck1hQuGo7Z3Y8 zZIbpU86e}qRa=a0YkMEtE#iah_xteanB5{BR(ppeNPf4u<YFJ;U0}b#lMig4!~TUf z9{-)~OgJIy51Kz}*>84ev6DJ*4;-I~`xxy0ht=CZ^?m|Yul#VToz2e2c2il;g3F_M z!CLlGvhnsZ_aNojd7IUCi`}Q%ZS;rCSDFMKx4pP;j_s0bQ^D##yi&2}oB7T5#Vg2q ztBF5l>}UBf*^4cLlot!PU$9$a+h>>e7P4N>_8qtVg2)+m|1+P1-ShC>Yr9~%a(iQG zNcfbT7qpMf-(_of5;8yE5Ls*UtLBKEnIoh>r*%`+c8j8?Z9p8PzwI>hpB-!B5j#aD zNc>loWZ4IqezV&(A98=4zH+{OvKWJ1*%rus@2-ZY?X>>e*l*tn8Q&`?J!JPPThy-i z24wuzCt#MHxu>E1E-py=IIVTXZXT1Y-Jw26`{cipr@gd*rM<;t$b3(noSa=FtF67{ z2FQHFxfA8~BFXOdCQgv?5IJ>q`^@-WyE~^K`-AN@743ISaIs71h2$se!+Q3`vW#{= zCqc&7BMhSL|KDe|cT<71m-t_C+HaRix0ihjX|Gte{<kaP4zydD1F`?taYuXS2s!&7 zZz1agSG}&XZ~1o4E=C5jUbT1EG`m|&{Pr_?Anln1-a7l`r`hb+yoZ!8Q~Yi1MNXUB zCCrD!m-nGKdlnggdka2eaQX<J|IMy$-*3BXqLBIKNnP=F`tqCXUcG{hZyhf&v|s)+ z$$lX#WPIr4;RSZ>6-VvrJRtLvmNOLWzX}N19b5oO&nqhr*xJ_rwq=%q%!kj=nP?X? z>#E%yIY|B5-yLBmz4fA<#R@ra`sf$Rwr^h{VW(6IIq&5C#x(m`y>o5mXx;~>zqhMr z+e+9l*!SFk^v5qU9JJdjXJN1WA{Jc#c&_!e<50hBcj_TzJ;mpOT>H$gmiFcqko;1( zGuqxodaK<u7sz_$lr0zR)>%HaOI3mF7s`CI!%o@Q+CDKJ;$Ok3@%HRth4wq2L&~!$ z^_lk5GGgo%PC&|w;$l|2HYsQOUkf1foy#H=?U*No*-!0(jJIsl)3smk7-JW-8WNv3 z#klQjzF)CRc*_j-uiMAzcF8x_+kp}g=sch#-TQXkGyLp0_@9C0|Licg4`q<C-w_9y zKQE5_W!qU+VZU7&QeXD3Dzu-)9bw-&A2Po2ZKAQAUbmzDv1Z8lWv>UHJ@<<w`~O*x z{f}HTOYA)!8{0DdhRh$&SB<uRm1AL_#|^139xwcC*T&v%7r_TvPkx-A$v&-y-~Mhf zr2OLP=&%zPuD559f{f3f<3403e8$Xvl?i0M$o!N7dq?pw`#p+~^=GedX4_pj=x+bP z0<zv}*Pgd_e#=VildB;2ja}2@x4-?4$$le0WISM{@m0Ii{O|3a`9jj?=4DT8xuTca zUDyQ~pKa&ZVpCS<V?Wsr(%*mJx5=(rX0F}OU2Nd^-;_Do#^sWby}&uh{vE%q$@bbe zitT$dAm_um&fjZy$|l8Lr5kcSc0)ptz2>Z+wx-39@wg+;-`g${6ti!Zgv?J>Ptviw z&nRlQS6~S^f7CC!Y3p-~-`-^cWWIQf;1*k@d>wnQcMrkw#cJzipU!V&@305bAD>a} zXrG&FZ2MIcvVTM=cY>XpQmySl8OZ$ALKZ*!qV{6@H(wz0quy^cZ8g^|vD<D484vYp zd}SMQPsr|13grHTxWnc4(wVJxHg6&Q%ZGQ|>?1baw$sUjoFDi{^SEsdFQ>hnm?zjh zEu~5JoBHMLTNohqz3=8a``nqA?XJl~%J-i9bbD(>UAvZENO|si;j8U|zt8NRNkGE$ z^tB9oX7*;g4Gxg<Y5Qq4`yQ7WcDdgn_0jEL6YcIjxn#$*9uj}E)YNQeXCJb&>4S{- z@^3n9x64bxZnq6&J&NpvIQu*A8}06DK=!lMD`wjt+sbSA@+KraS(H@le>QR0)y;zJ zmwPQ&Y`cm@()P|>$o|p|6|DAwnu>Pkav}LMOVZNz2S=xEb=Q2bf8QIj+FyHPZm+F= z032W2gBICsan7=4ZG)J<YeTc$)l(+69`7ONm)$6TWtZiB%Z_m_WIdAQ(ap9?v!~nT z9fOS5?QLzebB~R-dteOdUlyOyv<>?iWj`+jGF~^Ex6;l<JIns%6G;0n)JWF;rTcxm zOP`Iv?s0RtZzrDp&F*2-BQU>cBC~zKmvdG|wvh2>j-|==s}&d9m8nD8Lp<8L_QsjQ z_R1xY`L}z|!tI|2a@lTx&JR^x)w0uh_rrFzKV-i4Y_*-e$HDz}f7BrLWmNoYyKBF$ z*aay-^6PYtd3Ki$XxLBlhRg?CTH<c!`>fk8=Hpy&d3r3d#LjE7slAvgWc+jX#Z7h} zCZ*U-=z;M6PdBrZ@q1>QCJPDgm{?<*3tv3#4S6B!Wo9}i+poK=XrC7jInVh}uCpD_ zL?8PaPe^}OTHDM177w?*f)=Dck_eKrU)5$~E$$C#4_<!KWw)epzTJ~u7r^6h4Ev(& z*;X;yb8Lr<&vvhkx34&4XMgS;q&#q1y5CMW>Y%N<A7p;VFh0S)dr`ODtX+`v;HK9Y z*_YZ*w0k}Q(*CKHJYehFsBd?AEhK+E*JHEqDBo#!-3~IICvkYTZOv?HySCU>;P`21 zR<izX;b_0xaRZnyH)VqzL(Wwj;Ykqx-b~qOmynrgFHoEgE^j{a%G<vZbF}X;h4gRt z|B<rSS;lO4E&(#$=OGYa&k?u8I>xCD9NuBu*zJOk8r#oa2<g9^`d4Pxe8St_DG4&3 zP@7wAfBD^FyQevj^boR!)qdvvQ+7v!A>-MsKcwszsGPCe)dTU54TGV5e2ksFlm%q` zSI=vkZA{q?+p2|-_G*|-o&6peGy4+-ko!~a6{^^OGg@T#ej#K$IDF|*JD%k%cB@}O z#wThx&)IF%YqR^gA5vcSTs5}mzRqAT*a2CewOPu@PN4IL-PQY$@$s!Eep*ZC{jlDC zAJYB_b+5C3_(H~B>V!Br|M6e3wzs}C+b+!y(x1`dVX!}*a?;K)780NR+r;dO?jE&! zTM4O;IMR6R?+U%KVZH^~|GwRRfo*Hr6}vTGAocg6Pcrrl7J>HcD<S?_uqe{LhnLm9 zZ#5)76s42wEvFdT>pXz;7xi_D>`t{C+dn-BiN8ZxHTDYU4eg(l7=hzMrI^z$&h56{ zqg2Rz@A=fLHj(Rd?L$%_{f!6WOg2xR&$7)~0I5%Xn~d#Q4$IrCEQOqhzE#xB{`V<k z`{&Og>xCa&inO<`UTAmDejC{T$Nd`ZzBOptmFPn9^D%ElyANC4ZPy-z%<pqJ^VnbI znPm5F5@fvNmvWJP)T1uD=@O9o?cCcE`!}=C+jW;i#^Y)oyX`zb-LbR12C0vP*{bb1 zm>=4iO@R21_2MjBXMO>@m&qH!{u8nGv1^lzvX>5nl>ckK+1RJOF}AO>hU^EQvE_j6 z$;l=5*Um%M$FaLq*k3VyZoBdx<h;PmtX%eoG&Sw_e}(u@%irIAkFT`-n>0xMcre|~ zzROy`zUwk%{flIuj-BV7P<!@uko4y%``a$&QGk6!4P?IcKv=SUjZKPu!PyLO_}qV( zVb2q_%a%7CvLE-Sxsv@`#}IpWOUQW4MsFSahKL+{fwPeI^78!&_U&_0>`!lw1n0lE zyV>kYT<+TS-i3@`?OLL3KjCP(ok!G1TTpw-SNxmZ43%!1%W07If2V_y{hCj<b~4V8 z_M^hx^>zW=y7uqAAmevtHh1j!lLYL~w?pphD-YDLztjH7E;|a6J|gGY*xTN}ZQH#E za=!M0>n!#&kGtDT+IE5MOYm&Ab7<GF*Lni!UtB(X%huY=%l-rpB>vdV<m_K<eQkH5 z98$jrB-+@|c~)Tm_5!5*aGP+|PE}pmeugh(|C&8_zWr9wYWo)vkoIy;Vu#&=^h<Wz zug?YB7oz&x&Rna<_US)Jd;7k<pZ$DgKl`&)knvz9{bKvNZ%ge?w?NisEWFZZ^M1aF zy_WAWu>SK=RrZ-b^z9$~htywbhxXb%jG1G%dMjjna(V3<Yo0$EwvU=1`^8>pYS^Dx z|H^LK3&{8?!}~vWuE$Q;dH;jtzfZ<5tZz=%us2JA>=*hLwZ@ivmW17rJji)vE?r9Y zNoghaY&p*0_*dkbW|uNG-QMvU#D8V(*7lq{Irg<1A?pjJ1w-s_q@~%<%<}-p_iq7n zd$9>!cD^ql`@^~S*4gqp_1bA|hOCcniP~)U{#2g*x)#X(s}0({cK2Ft*<E}N=`Z#M zSlO*py=S+o8Zus2+w<SfY#xif?jlJ0U}0^N{j-HKcKsZX@>}reEL)N2Cw8CbLeleN zJ#l-+E2egTRzmWx@KSyI%e;rJS13Zp>%-MQ*ojZKu)iMxDWA7);In_x<YAvs2|0hK z;jX^@vI87;SB^l&b7GG4*fIB9v}@;sv{(L3Zn9I261SI<g5<B2M^o%&n0MMPD1fxb zuchnRv&^fspL`IqUhL$98+IvK{<a}}kot8;(FEI0RTcXMQjqh&f_Es}n@?SCSL^)% z9N(s%_iWwodE2)yfV4l@lp^ha%5JsGQ-+L>y_Sx(-*;Tib_Vo5iTw}!?L+1+v`b5a zoHxX^z}{}9gpmFIVn}%}%T#Z_c+Xoqr74i~db4Dy-CPM#J2mKejb^ib?Yp-L+Mm&Y z^v}9hTG>B3qHG`L2N|EcrxR+Q{j1OJqXeYB^EE59-_di-&f+^{y!Fa8SNpbwg?6UU z`^Q_p9JNbPI%6vwwhvssWtwx^@uX(jZ*79?e|d3kid{*@DO=`SkoLFQW?9>)%0sp* z3n1gGA^8dR2Ey0uYW_j;fAvBGd-KUjcGfGlg2TuC6t8`RU$OnGN=X0qcxR!lX|;#_ z)c)V#^+$b%DfUepE$zQmLC%joron2zR^Y$gou!cW?eBFA_A{H3>@~F@^Wm!(ve}38 z&9X7=hs<ZQCCA#I&7WuId<T*~IBnhRjnp>T<!M90uk5P0-B!*tJKn4&aQ?XYS<C)~ za+dvy&5-u@!xfJ9ad+O^g$F>^S4?&NVRxF1-M*z4vYz&e@gKWQ1=s8zhd|~RQ^S+( z<r53+i+4fp|91S#VsEVQ$ZpAgNdCO)*I;*aW4V1-0%U#c{B0@rr$j>SwKE{;{m~>P z`^$mS_Ab?s@wG)YAMFg>9qo^OgY?hCKU><1l-;mPYvTaBcdd!P-Ku_byA%A-`Ma+Q z_FLJs?ERu3`E$pNF#DP&1-mzXkn(EwTUUGg26J1n1W5lSL_65dwN$`f<p3l-FV|wT z-!Lb@{$(L#y~~@Z7<>O<Q~S+rkoXZl%xIr{X1yKHM#%oz7&`|0rX>OPoBu-QQ+aJH z>~BuzvOf?7DPNYyM%lBb+S#wRgS0p9-FjiSW6M6f16`2%nyE$9-v3Ov-TzdG`d!}a zcIzKh+cV#T%(wk&lCu|B=Va$J>lZk^$T{=aYhN?7|M4CY-n?0l?Zgd*?cJRr;rINV zfnCwU<+c@?knvXs5hnXCBT@TbXCdp^zZpx~>)oAYxBN6@JaSX%6WbpK@^(kUAm<k* zp7pg~Ybj%&=>_SZv3RT4?fvFv=OF<ZA3ac^V{fgv-0u4i$a*TC=v=$$!bSGgOCa+d z;vrk@vey2wTUG@bKVUPNYPW~G!2ZiR$bD#Dck}JnSU<8|TMs$E@DN+B{nltX`%>t6 zA$zV^*{`*WvrFNCoJU!6Wv1<6n-z9br6A*F3q&>SxYo1VeRqS*@6XXvuxI}})y_y2 zvOeNu>kK=W@^bqQEl7Lpj&+H>w1v0b_CQE{g+K7I7pma3pYR{De(2}c9d@EZ5%xaZ zkoIgb??1cv_wM$Gf*|durOV9h6~CF-zm53|PH$3`%=Wvc-nUb-gWTVtwoBGNmzCMx z{DdkvehQDr+h66<wU<zYj0a}$+1WqJnq@b+7czdvC+ue*S|MpKT?5G<o(tXV47c#w zi}XP9vtA&(J-_BwyO{zuVEbwoZnJB7Z)RU{{1LeP33%|!_WO-+yV<Oe^7_oWdizIn za_sl~hNPd?U4QI;YCo`>c?_~%ZDMYaoi0<XEzb<deDeJJ)pk>+=h|mQL(YqhZn$Rm zXQ{URbP33O+xNC4d*Pzbc067hVE=G+EwYPA)V9B50hvFLyjWzfcFM~x@+_o2`5VG+ z=g!P$e|HaL|NNV^%638Vy7tnWA>%b-AIt4!`E>37`a|YVm)!hrSGQKz?#1*%u>Y>7 z-M4G!Jz!^<16dDLSf6IU`k$QrK{H5x-<hInJNd1$?V4i9{Hfm2Z*~`t=GbRPLdM%I zp0nDAYFF4vJmdho*PG#^?aq8>yBsFSdU~<!cH8KrrFM^<A@!}pDl7Xy%kOp>ZjkVZ zj+L^nm40sLdKA*$-xzh)ZemrweUc?)|97ykvi;BKeRieFkn!Mr&s_W4QQdY9E|B@A zx)>3=BK8G#pAJIu)AltSwgGA0_EUTz?Q5p|({=*07un5+?tfM7zGJ6!`<`7dFJydF zw@uUjOB92B!u9Lm_*Izl)b4^vj$KMLq<!g<n`z&l6l$;Z64Jg4dl_gu-@d?Zb26lS z>M7e{XQdo(AFmAAU$g49sqLy9AA4DQNPlxH<7T^)&4u>YoFL;(R~{PLPvxt!S6c}w zFXnNS+iUmiw_EoOGCx^a^2Kfix1W983CQ@OhP<WSYUTHK#`_`Tiy~4XcF&@-?B@tV z&I@^&Xl}1{GT8o`8l?Zg?X7FS|9OIa#cjxXhkfgW>_vJ??2cT3oUfPX5N==3JkjpZ zF-ZOu`+vx87L$^Fw-;nQp@lQw?#_wjb_$V@@v8RhM0@dDQ|+$TK<3X(lOpUr)LrfG zX+h>IE=g9~3FQ~tr&mJOW6Tp1vx~i^XlG;y=`YGo>9cFN9&gXx4p~1ea-`C(TZz|R zdPWX7y&Us@Z0Fha&zA2dWW4YXBa8iZ!E$@IJjnWi>WN3~nw2)%H6MoT=T!Cev0EH0 zV(%Xc3E#||TKkZ?*LG1(koH8ao}Ar&r#W_uGa>cStIdCHuRQ0m-+BWwK4DnQZ(oyZ zWbfk#DL+niXWDmdue3j-3TZzk=j^t%S(IQGqX@ZQ!{UyFUC{+idk164dRZ;^CwALC z&Fx~=Li#h=)|YIwXA9WR+yhxJ^^vQ@u5_KV{W}N9eJ<P)?)LYj9PQK2L*@fgXUW*t zF3Ye#`T;V3qbLw#x8gjjt<lE!;QYAvj*Gqa1#$Zz3CMVvaM(AyuhES5)!!iH#oD$m z+s2a;_Ax$?^Cvf_1ljd7*xUcR3~3+DN_}rPae|ATnF?e*i^@Gi`+wKt>?~6t<!hB` zr(JpBOS^SKkpBP2(Cc>6&INYj(UA4M50<jq>a32iR|$aZH&xCqws-qnWy^O2;@^t) zYj&TyL+te#A>%_AJ4Nlk<<7Tr-?a?v{`_`J`-S|6?3SuQ`U@{}*4qAEAZl--4jG?% zp?KGJxlO2Tq&H-}*wkC|?A{sL+aKgw08S4wJ@ag@XcgOt?1H$@@QJj&`}=!#w@*Rb zzgIBTp83gpJ9g;)SzW#Dww}AL*;%VX<|`-ZF0y;LAk1EOBc#1~Kc2@fIrN5|Mh0ZR zjrprLcFiZm>>llhoTuGre$?(qU9R0X0Z4ztQ$NP`8~ZxD11XU7<ja?3?^dX0zkV7d zJuc<1vp?x%WgnFcDUWxaWV8S3yT)!u{BLmip{_aI?#`neyZ<vG>l<cqW!nF=Sz@Q6 z1(_easxM~mW~yw@dKxmmE6B0m*3Q?>{?;`}{?PKwv`^+Nwp-^9Y5xnIylX2NCvQKM z9a5i5oJzLmQ`EJezzr!6Zs=LsN9&8*U#o$%ulTxW+cDUS+S}Gc)*C<6NV7lT`oMPP zGf4Wo&zxsJ)9SokfIOtVuy^5YyL0{v?To%d@;B?Zjdpvkr`Zb?L)t602G?x&?WnU4 zH~<+Rttp>q_kuCQeq|G+yqKCSW54K7o=wX^Nd8~BM%PZcHQm0J?*%wMFK+F&{k>Vi zUds?t-cI-|Yu{9vXCL|ilHT+-r`RVi3b8-_5z@XsK9kYjX_=F~ff&So{i4lw&37E_ zwtaXDHt)$dW_#r#PWyyilfdEq_VOY-Z3`9qs3pN*zMEF6{maie_EiCp@P5C>)V?m9 z)4qip(q21kCT6$dkcs{B36S<TqkOAflBJuyODCj#u=+rm{gcQOb{;j5@s(AH4R($P zCfdn0LDpC8T&ZgRqSDL$6dR;{cd`Dd-M`ZUcB{Wb&J+G$D`5XvQ^TI`1EhSpBrIxw zYjUN1Q2?a9nUW-7udpx9-o*kkA9ZgNvps*di2Z_MNcucd^VIIZ4@-LwGst+n;Jit8 z4jnc2q4y!@YpkB^VE@{q*naLD$a(}TcS$?O=e~A(Yar)au1Ps)SE(Fnzw{eqzS*H@ zx831m)9sdOLi$JC=G^v)i81ya!I1UJhJGz}>8~EyB|*otg8XIeODbh;S-mfU^K(gd zs(on}ul+;;h<`=yo7sD;ooE%v2^k+R2raSOuRqyt;zY=N4SOr6{k$DYwl%jP;~RZ# z8Foou9qnvFAoX8MrJvn;eL?%J<q-93Q_Jnoy~wi{kA|#AU%fBhev|zdyNW%K`Kxr5 z2X>#_Z0y65A@h^depcGI>uk1b6@tu%7}y=PyTevvw|z2XyfHX_zuoBvrS^SyApC2` zx7yCW;cd6|BIG=q9xpF@-D(^AJM~Fm{|R_Kvb#8^%znNV<ot%tPt)v<ztOP!=K~o( z`1PUA{(%F#-C0w}e3_t6o&A==<JR7*A?HPOa75YbIX$-9^8~W~@!Sg;yC~D^cH2@v zfz5x@_Q&q1rJwyI6Uh4QsC7r}b}u!zixq{8PnD(j+g*0)v}@*utZxnocw-lFKF@Yz z8>D|Oe?rgxpCE&MqcWuYDbwC>>(uRSzc~&vUXd|*qODDhm;Gx!NPF2TquSp0gopk4 zy%6*ESMRmEdO^wl^j=8${BFx1J5Fvd`^i5c`h$AQ?f=f1U>9KwsUII7)VE)ws%?K< z2GXBxShw3Q{brH9!G1{m@OD?*$uVEDi$9bF&W|OTG4_SN`)pPALHbLtBp=$9?6I>u zGYL}vFI;DBCvv#iu2T#$erC3^(3VfV)b4#Rq`#MRqriSKyNvzOI7oWz&+D)|Cve$z z_GO6v`DQ*g(bfI7K06@eXT~W4_Wm0k?LX{>tVjRMINh$?<&W*&JjnQENW(O{CD-=Y zz1;z656{1`*-j!j+ip%1q`WO&m0`a-QQLlpA!Pr^=I5<;$-YtcoW79u(vPC^cHh%8 z?Rj=V#?P+xt+I=Bh_dhTas&I<U|Fg?^WM+4T+)#Hn19JP*u7cEX1C)8Bt3baNU~qc zV`N{O4oN?(Go9>~_tx6SH9+o5aM=CGZsF{Sc6+u##*ebL+^|*HrDU&S0Lc%UGh^(h zq;T8sQ-;icJv`-WpBv$4&shsOf4f6D&U%S^gxzBqPH_4PE_-Ab63J~pu^lpBu*Cki z9moHNcKtsg=lM=eQ?YO4H?-e84>G=gSSHr~^mSqTs4bBBd;6Afd!9NMdqyWneeGRR zXum!$+|Jz|GT#z3|FT`tlZAGlPD0lIW&C??+pcS7#}f-l{}IaH?VQ7^?axTNf!*`2 zz{Ebyq{e=SA!L4CeMgwR!u?xz2A?4Pl^yoM_DTHN_L+|%{liywdG_B+`R&(nt^kK` z%q(rYBGsFA3^yU;nO)b<*nZUQu#;GK3v9l}yxlhZx?y%Zj3DEA0-Lk#-bTsWe^i02 zH`uUss_m{Q8+*@#Y+&^jr(WAl-xzPV$^=p$>F221hs5UC-@6XEA9iy<fo+wjvwhDh zNO^l{?r&@3P%-=4#gP5G4=$dzlbyn1&-H0Kcs$7G%2&HBRr>Z;t&sJ!GkEyzmWq1X zPrC^jUoesqw4eUT&;DjgI(YnYg>j(Wmanq5$M!?a&pNJX*R|n^ErThfJsIUP#m=`{ z$o@1hWInw$@SNR;x#@PrCm{O+_a!sf^WU6kcm5fqJ!o|Dp-tQIsdmrLLDoCuP55ZH z`HX=*`!Ps=$LzyryX4z?cH8el!ehs-bo+mw=h?-4hKxV?O_8)WoRVPw<te1Spz)Kz z{szZ#TmPew_U|6q?>5)GOYIV(A?fkXvZ;2;rR?@mYrDbW8FI_j{^{I2``{W#`^My# ziJcqsJ-dyoAnm87g7tPc<=@!NDTdsSVq<y4R^>*Xy;?M+{T6m*w_WXmi+2A7A@j#a z`j^_h6J2QcL%$Ae{+FArwyyG7_In!`z<i^Hvi7$OuGwj@LeeA4tU$Z1i=NumuYjy? zdU!D1{^Sx{`=pbQ`p+`S%uc4B+1@=JQs3<e)3sl@*TDYDMM!;df$5FivN(3z>lKjp z#hrdmd-pHQcE183^9?N5X4_Ss`)l{OMFea=>z8sn`SpSJ2@#O>sQ(3j+r?%j*}s|w z8DG>}DQn-)&0zoNF{Hm#xhlwBpvc7j)0Hx?{=&bVcAt!8>{+8A^IusC)piYMJnfw~ z{RPXn@0GF3cY9~26Ad{pdxpVZyZI`)_ScLc_tm>9&9M8H@z$<S7;>N32}L&B+W9W_ zEFU5HF_hQLu1#LuMtK3Gyld50wy#xXuy5dk#Bbj|JDa%DcecM09KreP&OKjymC6Ep zg$_vi>2kERExI3Sr(6L!e`W9CyEgCYU)Z@RNrBzxaGcdXGGE&M<Z4KL#2sg9uWoz6 zHsb=M|8*cM*S_EIjNQV*L*V?u_p-<C#Me7^2`Z5DLn3uP+gkpUw!e1(l0Me4df5Nm zR%5sQ3}iiXjKT`L!oU_g{w&D+UbW8wyCpUaw&5|5_$uGYWS4pOjxEPBh=1;1`DLf0 z&Sls0KNV~r<7Z`i?m!Lu$WTc8c8YDYomSj#yT37z_Lot<kNqm+X?AMs9)tZa`o-5i zrccm*#RrJ{OC?0?UwqcLZ`%zi&zEo7X{Y`9y`6(4r2oBszpDLVP9OUSS4er3<Lz$C za=^gutq-I=Kk9niZr`4ncC%hU#<N~~6xg5h@Ul-Wg7oKK=@r_~E5Bn`a2T>4$hn2r ze&#KG`_>{zdEI!Z-EP|CA9h<LAnWb9)*Y}rP(8(Nn-pZeYn^+xeOOqW{X9O%d|cI* ziMGr3<=9P<YytZ}ZrKOB$oC2M-vuG*SvHBuP9P=M{)ZzZKa@O;uz$k4$ZoAe4>&&g z>0in%`un>e&nqk75U9d%549cF#Q_>G3FgiyarUgT2u|NPB6{%}Tp1LX|e*Cn4uK z9%N#(Ur=_!&Vn5>9`ep=pWScP`F6dr5dVwnWY|j<AGXW6oB=l9!z9yw4^Nc+gc?Zu z+uqI0-g#-2{rm@z{-0TgzWw&DV0+hjkp55aic<Td5e)Ws^X`G&t8I43=57j~o!K_X z_}tQMEcV7$r|lYw4uj>5%#7_Dg;ngutRd}nq5r$>*djITZr|_(m%mNC%j|X<bJ`!i z2RUEDVxpwo?ER1IPH92PTajbIc3K)+?VMa7^MOG-1nuTsYO_7w2RU!}Qsi>$t|SNh zEDy+dfXGc7J8^C^`}?aP_0Q&9Ir|ebHuhpJkn{a6xi{F|TGnWHpartNPV=s!{d~?6 z`;A{9{iXV__cj4SOYA;zLCS;v;6VGA{Hpe=>>%?K>FcxX%}c!PE9ODMcV_2lJBjks zR#K^u^?+}mS=l@I3)>x%gsevsc&cT~-z8zUdM{-C;W|bOyNMfD*)>){$_MY&f%Y}W zitRn8L;7!t?<MRfuk^RumIav)ns~w0zVCRbeP{_Je>xr&vv+cewSV#YGC2N>F9_OS zoT_J^)(e^cd0)1{*1}cNehwoyIDDh7TG_I2)!Rp;L-<GcZ@2sO!O~vC8qz;G{Km%K zdA^JN>R3pBOD`tQe%<^c`wKTA=c{hGW@`V_%f-I_IrM&z+mq}zm+Z1zc@ENEtv>qB zc9k}dUDs~NeohwOG<%&3miDbG=fM5Ff<`aveGb#@zOq5)@1KV|*jL3Jwu_tr86RZZ zJk3sZ=PkRWHIV+p?E_)<r8b`S0Z(3l^)vrrv$xb_vrl~nS>F`1d6(Teu9J4cZIJe{ zk^rauwg;DNc`ic61BH4u?B%B%w@c%Ow71i~RNL=g#Awel#T9Ixa<7P8`~CBFHP0aR z$(BGpyRMRpcAIh`<D*Hl6YMv5sMs0gK<+ECnrCencm0Lk>Pe9Js;~ZGClWc$PT@Rc zKI~Bovwg2dkbUYyNcq%vZJymL4m-O8wUF>$A{uWSJITWS`c24qV%i}A`@43B?DFlT z!0|U@_Cvc>>bvZgxk1!hoOo_0XU=4wX$Bdej@NRw>prb(ANvq;e(M?6RJ*rneD=4P zAnWP6+m-FB{cP<!^C0C(j>$K>R|aWz>SmDf&MjW|ZDj;)?f=O@<}VTsx7wK;bGO~v z4JmI5;{EL3<X*NlzX6#~>Mwd>r(&RO@BJQ9f5z_mZCCUDzHJpZq<!LHD`d<4h~GYe z3$h>3E~>_U@frtvW$1k8&8Zvg#Qs&<%fEu;-{Zcq_6u8O?X~zI?c;zwVfMTJ9kK12 z{{&n<$n3slyIm#7uC*C*{wHsahu!Y0@9cz1A?qi1AN*i9XG*sn%QVP*m}b#CyJ^f; z_O~bP1(&b848rXNo8#?Po`CGvHn9=0H{xuvQ;3F)H=U^qwvVnZwQJ{xtcQBv<6wVy zrKtU8Zpir^zu61yMBYEO3(SYC&k*W<X}2YPvRxl^y@H=;x_!0SDZBp}ko9QQ8#miJ zs)^gj%0t={FP1H_dtO*!yLDC_I6lkfY1kVdV6%683n|~`NNU;NdbrzeIn#5ndpAyU zw^!6HvbR~<3ikiv+b`|ju6DIAHH571n))@#{*DEk{ehd1`x@_jn`(F4%E|uFCCGT& zCEkU0lNe*{=Cnb^_exXl+D%#e!8XkuGGDYS&C$L?KgdpM2W0<;cpJBU*nKv8OMA$8 z^5J}Gd;RaWb~pY(*FWq!WtToZ(mwJ7WPgQF*f~21Ek*k(SxA0e{#Vo9cmD?4bCV$R z+xdGm?CN+c?bj<dg8j2Xq`~f{V27Q&Eo3}H?5>CX)qWBCX6XG5o06sNe>4Z!teFW} zuhacC$o|v{7kmAEko8u})+*W`id|rryAM)7?Y;TmZpplCdsjYxaDMfAlVb1peWBgL z%aHnL@f~&h4QdwlMZY2Y%Pqg`v|HzK#BPx&r2pM=INZKCn8#jG8PZ=qel)`Vc&v{- zuMTAV<|&hm{aq_j`(x#h`Y6Le%-*WX$?oZI$au=U$$It`Y^gS%W<kz7+gem@f51`I z-g-5}J|#nc`>I_ccFiv!;}OxhLH7OY6m4JTTY<~lKMwl#J>L!O4Rs;s>0S9{V%H^= zZ~I|a2v|Nm#L-@7YnuI08A$!`;oTg&&sFyJOE*Bqr*vih+HU;4&5mt3BtA0YS?wM7 z71~d6g_H-;v3d6Q0u}7n-GsDX_9;BDopMClK2I9bzS?$E(mv<)RXZLpNPl{FZLp17 zPpRG46iE5`V6Uw`-;x}Ark#-ek`DtN?L@@R+iF4QfB(E$Xd`7FZNG*Mvj2Fh^%*;l zU21kJKOy6>Upj^D^_NVtQ~U!7-_MC_>>4)u*&iu^^f#p6PO`hrXKT-72<ab`FKDp) zEEH*f<pN~9Vr6!Wec;WfcA8R<@^af&S$q4^H+B}mkp2CkrkCvgJoL8<o();wqf?${ z|9<8PyBi6R^Y~YHJ+<4n<B}cEc}Ra}&52Zdttx+e10Bft<`VNmw$>cS><nH&+J9os zYWCu$mi8NFLe|$k_$qG4`clhAED%yY77F*+?f>3t_vtod{IcBbt+l(&Z(H>hknxV# z79~47SzG%H5qH4paq}r2`z7}!?8I^*`@v#o#M=9R^s=?pfSjK&apDBKt1tf99rlFO zCw>Ne_BvIk?2i3|)E{ZbYVAcie%tkML)NcPTW4n9EW>a2%N)`l6jiLWGwhsfH}5ed zelL7rvJX7RZ~wIxavq=m8U_1%D+KL%`XK#{Yk{tI-#o4CRg@s-<$So4U>B&_XSb~Y zGM>P!`piyri;!LGG{|`F*Q*n4XTQE_w{}0IJ#qclRa+UgYJ0xVkoKM8z9RdkHx>5h z8X)rl{4C~n60`N~-@8NRQ@=fCw~Kw8Yj2YRIZyP~lVi5gD<0b2yaj208&)i}d&Jyh zdxtLzT)xRO>)1b8*=o1;EX04w=}z`B65s4XJ0a!!MCN+?4RU$*Tje18-ImXtV0Y!t zCM%6rNPC&Bq{G(h*bQ5k)e!dz=+@XR$cwc-HXV|_g?h5=x5ww%?MZzEwvX|OrTulq z-F9U<ko_#34}$D@Z@;n2d<Aj;;j-^`^EEx~pJqYE-z4nK>}w)l*~R=90P8=>qix?7 z5NF5g1Bp+m_i6U0;-c)fW<k>X%RhZ~JZJyfDIbCGpUAARW&g@=|K<+F{}0#2+Iutj z+h5xZ>EA4OledrUv9v$p4H;k2IMZyq=fE?&_??jUYlHlKyR(fwc4l6X{@9WiwRRqV z9PO_aL*^4KrZC$bDEnYnAv6V?{!V#z*-cU4wYz!=a=+E9f)x8t#mctlXF$puyX}wd z(z6%az1svCKRYzP-hM&RS-UUGA@eQkYc%W=FLc<|1wir_SK>aq8|#wok9aEEg4X9v z{;|j|R-?rJt0ttp`x&8VZ&h&I?%`EP`5y0f-p<WP*<SM!r2WAvUTz;E?qc7`3u!;h z++J-z;jpmn&M-)O*J5M5o$}gT`)$UM_T;u5TJ|l1`|X@sA?45FY#Dpbz<qWfe?#W4 z_s#iW8@ud_P1^*>{^E7zckK#RpS7E!59uF2d+^bYG04KcAUqemJ~^+o%>HZWX1k}) zAmdg3(N^|aevbBh+n<2L>wQ#%oqno?J&!G<{9}GoVRu5t#NM?MQXa=C?za=;%(2f< zgOs;(WV!869~84+wFfdjb%mMDcK22vyY<&0^|M|~jy-SFBD+U5kovfeX_@W4Klb*s zf*}1T6<=mM=dH<hvzI{De^gts*!?_ZYxnZha&Ubq#KdaPdoI)dz+8xZr__1u1>ULK z-DQQem)4$KXUCO$!R}@qWPL+kg}$B1ad-O!H^}(|Ei8HV3r;SzoBj$ip7qA6+E%)2 zn;n}3WWGDDTfn~Dso%~xB@&#Te><MA6+67c?o}wHJejhV)pkYZFS|E9koH#Te|`I6 zXF2;%*^u!}E`LLNVKH7i9u7$Vf6C40cK*5g_9Fiw?X{in^X%uj+_K@{2AMCYto~rj zbkNJrsTMN+`}RSKo$zHQJK-cq|LC$(w*9$<j&=@yko0!bD!~5YX9xRe56Jx7wwg;e z0)HaypRa_J4;Nn6*uM%(vM<{U8Q;^{Vqg~+CS;#42)Q4b<uRB2MXz?dQ}ZDE8MxAe z?Tsgy+cRE;te4a{+imx{QO#a$Ib=SdtBA=idZLTH*>1>s|EH49_R~(*+OIW$oVW9% z+QL5LO@_VQOUU?TxuKA)qq?R2{)LeKb#b<$z4~r@dlnBiaQ=uC6|?`o#Kt~rH)MXe zt?8c))1?gi3CfW4EV$`_El<{SJHzde@tc>wr`ai3^w}Ms1Q}1h;caQRgo)R_EDCbp z=z|OUZQbVU+OLd(q<?O=K)djwhj#XAkn$;J_anQWD=K!&g&^%s-%D}!uM#}%URXlb zvz%TXY`gYwu)W+XNPF`6&o#EZn=ae2&4SDaEb!fGWj5=v9Y+piyzSnNUv{yNIqjvL zAoJ68eHC^=iJ|tgwvhfZbFP{F1HoJy*8dLR^b=$eYA;iK*OvW0WWC_;DHir;|IfEe zGnfmOx7safKPA@De$6b%{P>~S$L${KE7(s^g^Wj>WKXxBm!)f8eF;*YBz#u4yUpor z?{Ww-{#p^OX4jPBY`;$qa-O1&_ypUB3mfhB6hXq{nfo0(g_nQr_^v?e^A?V7Tc5U2 zyU-3u|822jvz^yGP1~JjkonS+|9;!v*K@Y7xdmAtDPeHO&gjZcJCiAp^pNy4)&AFZ z2Yb;Yknx&NTmtro_p95V-UV4N&Ey<!J9|%{eV+wnexP()seNT|wLSk_NdISf_dL5N zsiC$Ed64qX{*jm6;xFIq6pupUe_l_vebQ|nd*vgL{fM7MH0+IQ{Omd6Ao|yMGuZR| z$+dqD-Ou6Oq+xHUvBQp`91^~DVnX&`KQ-I^(u0gg&A4*UHkT#HzUnTdz0)JK%x><F zc>DcPd%@{(dGjng!S$i`t>31D`TFm4ZKqrow%Z*7xsTJ}oQUnKsP%RY=cU2z&*JrL z_NpaqcI~T`!0{J#F4d0JKighZy&Nn*|6-YalIe9jC1pr?!n60C-QDL4Y)kSW>mPYn zue7T&R<qw?07-w1EXDS`d`|XGS&;FW?`M+jrtVr{`+XZ^JXqUyp`FjBBX(cTK+eNI zYjxaCsNj~}MK^n}{Zl_N+uz`PYo}QcX`ihU_-7k$QfqIs6O!KF-JD=|V}6vKBL}2D zH4Lb;3wma1ccL3oK5xGxWG8(?#eVyL$a>53cTU?aTw7_M@fk8dDI=e0ue2%0zJw7H zo?ikg?dqnA*&UZK2K)CL^K-k`?QiTd`&Wa*Z_3_3b}<hl?Z2&rj3?9?=-EG9zT57R z9;AOge_xm#kIrv9r({TZDs%jz)n6tz`};bO^N3Xo&Fr-vZnBxl2{|uHTqMH&j)kV( z^B72e^mK@|oo^#x-@yejFXwosed+d3cB}S4!u!DqcKaXe&FyC>K+fBp+m>y2^0<!O z|D}-nTXXpWyFC*$?YHtl#sj+l2HBT3t+(@zwgmepSI5WxQ30>L%h70X_^$7FvOji{ z*WT|7WIXfPtbF^cQ#<VLTvY<sk7@Q(?09}Wvb9QsjE9;0oMb0)M#D~543b`5_*(5I zU7l|{|2U*R(dSpR3qCAue_s(YKNULN&+gZfF#Fzlkny`K-lq0ekEHGTo<Qoi;+bu> zlHV%rUG=Vl!?#k;%f3y?&3?5Qq`hSOwBOov6NmkggOKw)Bt`1%&1ZeE+g|ns?0%jC zdFyjIPWG|0AoCx;9-G=VPP4O3J_{*db^5dHMIO$vyLKE>pZl}0*saNUYZo8}IUmeW zzsOcQO3U6Q0dn4=@NGrA|K9uU5(6RQ0m0GP_R*gn*iEs8j0a>XAF!D_FU!t>6;l2m z6W6mpE}L)H`Wce`%sEo*HS^N#8kr#Vr&{|SyO*ys?ef+_+FKv)me_xKe%|i-G{}5> z$ZAu2Pqw9Y2l*iD12l`d><c-b+ilwo37^1!RrcD;nd}d1L+YRBF)el<WVP)d?uM)f zR0%h*cdit(x4HtUukzO)wvDTjvCr8FDQ|1?dhI+_rrN15fu!fdt7`4@Gp+14)kEfQ zd)6A;y}!$2zu^_+ew^-OUu^I1X0%`W4${7KsC{UAdQPm}sX|EoDVTS`F6Ne_J<A)& zdeA?owC&d3u(8*j3n^b0a!A-Kve(<o?uO)l=FXFLu5tSIjEf=nuTA)=Xm5PQ-G1LX zNO<XOI%mtdJ;OGjZ~?gelUwC$Z<6e6`zr^M|K)#K*+;ge*y-+sl;@|vB-x)YS#M`_ zr4k(f4~{*xlfUxZu6_q(ey4cVDmw|q82j8?kns*{Z*BWWRgY{u`XTLyj2F!I6*BVn znbRQs<!uFDZ0zkSY}P^VLzo`VZr6EB)&9^#NPlukTZH}j4fghnS3uSSv>%VOx6$Uc zZ|#D#Zv%9sY`1w$u#;W`8E^a)?PfnCL&r|k1k&HSBR|V#+Fx1wNdb`gikhgecIShN z?L!}*0lWWZvXMR4JUM%2ZpeJ3(q}dMQ<7YE6Xm_Y`Jua0%KqVU4Z8{AEnxoBAEkDC zm}l5k$3ntS%3Z^rT}jApiVS4E@w!|#JC1-l`-((AaQ^+Es&2n3@}JG2y^!-S#g?45 zJK*PM&-)3YUb^sy-G2FC`^Q@rgU$c1e9`9T%-ME1x<A4Cr+&R@ml5G?RhkZ258~4h zW&cB2-TuW}NPo*!Dczney4mi5I3zsHmzLXChX1qskyZot-zFwK`>4~hb`36&_V;^d z0lOBNNp=&SK*s;swPfv#ObYC^PeIPhIU4lTu9|0!UFdnp{8^?_ru}KVAbV>|Q?UEk zX4cxjJ|1DO=m_cGD)_Cj$!_hoJG%(Ne|A#ao|T8u?#G^2;P(IA{FipeR=lw}><U@` z96SHKT`gC={X9QN|1kHZn!P@+u6^l2Nc-p5E)834xj_3{c98XRFMr>#Tbof~znCAg zUY;vC%wA6Anw^gbq`mejH`DfG#tOSf6Cvwwrv;z4{WEK^U7<4%*#B%|&+P8Sud`EG z4jDhnit(|JF153nECy*`oVe&??~(l8?q)S)JYkMkzHLxrynR?3B>#Ch2iWh=VzU?X zgY?(;uvpq>e-p50k&Xt3NAZ;``-GBO`x)Mc!SS`b)z>!bda(VC2uOdo=@E;)XI_&1 zlLW~5GR4~d_In~~>;;M;_tE*=6xr7uzh}2-52U<1B)`pW5ktP6?*@qe615b29(hjN zQ=E|Y(QKEOc2`XH*vfW8;=fv?)#lO3bo=eEA?>}OiblKn=M?PS-$2$cZ@xXpPG~W= z{qh7z`z1$UrCn~dguS2zq<^w#i>rO*`&YJ6%OLX`ZKB-vNu4?NqW>ZOf8nfTzv*b4 z{got0{diok)z&*K-R^TYWPBw47o)x9gZH+#Ga={i1#?`p3!NuqFHjCyuO(sYXZPcn znEh2Q$b7w0E0euabGSX{6-fK>;-e#WZx4&xnZ1L|SJ`^h+a-VcV#gNv4;-EfT!r?_ zqZ{n*IzsNpsNBF}AL;CEf94$IzNylhrMAs{x9z&;L*~Q9Coi!567<Ke;)*6X{tsl$ zv$II$xAJ-fSuf`MO30oy;F?_(KcxL}O*PNnbGw}VlQoe348vL%yOkeV>@+q*#$&vG zEw{bAmf2ozD#U#$Wi0lO>YeQm9EQZln+zU%rY;kE|6`E*4O4a++P`_3V)xbr(!a8u z>})T5Wwu>x1!O<h2_qBxn?DZQt#}HV|9G}M&i;&{p?wo)BDj5^n<8UpV$os8nGC6q z>=e0d_Og50oqYl6&%FEl+%EpsF}tE*Cvf`fj<B`=c;kZ|*JVh2rS}-w-F;MJe|;%r z{^z3EX4{kAoc2rSLe^K_+0bCOStQ5qf*z#3m~9$nmo=l#zK9W`ztdB~-srTE{k^}C z@Jx>TWG7K9Xunz?(tk`Z++wHFV_|>P8?t`VB1_GF<rXXZ1-VDS?qLlUw68yBWq17R zcX0UIRLI(E^W@maq(jPoF<nzT)vBYmmR^wh*l-?$eRYJ59g7ZR{93M>!(Q_4Jv;r` zkn!!dNuKu4f2-KfG={8y{Gh(k?vQAy-L$`u`R=vKlkFCjnAtxrgsi7-JeY02Dy!9& z{U2oh%#An5zE|AbJ|Puy{?e~mS@z0TC)fp~LDo0#);?=@_ED;RRS{%;N%60(b~6fQ z+U{4B2gk?Lz8Q8dXN2wVnfrnHC3oHIg{&XhuAB*3pWycKhuzDYsrEsOAocV64Ni8= z+bit^?f!$qgMGEQ{r3Ot_9-!t`MXy#0`^5s&+T?{Li$&aO`Gig&FQvtQ-rjC7oOFz zf3nok?nXBxd>^Iv*@gcXvtODAX>VjN^R=Jwr_g@K97z5Sop95RQ=roB=S9ePup&c_ z-DSNcHt`!E@%hx}qn*?&M*BVyNd4R~ahqMJn~}Z74@i52H}RX@jz^R2>h43v`>skZ zwsYf)vX|Hi*)K35D#>oI=S|z`?U3~RYI~Ud&2R4ZPDjMS@q5VG)_&HSBHQ#2koG~w zCQf_Pi!t`!-$2&qIn29cx8G>8-B0Lw^s+l*?9*qm*cSvr#@oJKxM6q8zSds&Cgl8! zL!T1uZ3H*k)t;6BoB!&SsJ+V0VEb|p$a=C<j{@y&Bt-3)Qz7O3quGr1X*+k@6>o>E zfBo$C&aN~l$j-wHGG5;$B5R*;qtHJ8D`daMBhD>${i5IPT1z19;Z`|*+vhh^>>r$m z<j+S+W%ewS9PPs!A@LJbnqmLvrMaEqLCAW@?T2^RiC?L+wNozzyKnatCVQP5s`m56 zA?MkC+fiiyy7avrj|!wcet&JT-HotH`)#U_`42;PCHuu+9@qu%f|TEfXZqW3e;Z-D zc@kuP;!UBW?M(Iab}vdH_kr!5CTf?({m_nkH)K89d|wWG-N3VUshyDdmbY{7+g-Gt zXXkDQ+3ymdu+r{Gy|%r6=VfsE`+if<{%4?tU63cFJ^uQRlKn+fW;<CyNd5j!HPZe@ z;cmMc==t^@({I@^EO=pBa22v%;Es5N-GiC__C6_)^ss71f&Kpt(e{T9K<<m_yCG$# z5#DWmwiePq<ce;#^Go5hPf>&PKZ3S@v~@AAv^NxlgqQVeCA%AKv+V?qWPtP2%kVb4 zl)3TtMMog>pA!OOZTzd4?73z@+K*<>a_y=dw%fgj-sc&)@}}Lx*B<sf@sRTwPA$x` zz45Wm{>Dehd>LrJQd3vH{ncQ|dd5b!P<u_*O}0jjkn_~$aO|`TxwGExxe8>wF*$Uq zou=0tJM9R_`l^5L*zF(Rm$Tn_X976<q|+YS-QZ5L|GfiJUd`!dx0h>7wV#~!0v!MI z4DIdLy<)a&y9^n>mQq}47jd4~K7BuA{A}j?O#9MG8GHMUkn`F(FV3~w#lO|=pfx1C z@+a}zms#4`r9sbI;|LD4UoFIAKOqZ}-`<zY*vIY-v-gyTlwZaR4%%&v*lSnuLk;Y{ zr0Y-ZGUEO1<EwMP;Ti6E(vIWWTD#gmkomN)*CXsjo^G(!{0_-)HLEr3<D;(HH5`MC zmma&?WH-TbrQM4EFTv(1$wb=wv?|*#>4)@Rj;%jn_b$%IPCpDXUg~+J*1jO3*CuN* zWPI<YU9tV9M+){O$&mB?f6v)#_apVDwaQXRdyA{)lHE_6mv%3YL(<!cqSba9&XM;2 zWFX~J>vcIhS!pBtg_e-{cfX9Qwnn{M?bvf6^R->Y()KlmGWLe-koc|NY+-LR`<0zf z9|PFEE^i&}8kdIJH#9-oBMleB?N3z(+xO{0*2Aq{YHYiBhnu}v9;CkQXIX9AAR}h? zNC8q_d!+rbQ$5OOzqbyuA672a%)YZO#a@~VGQMWX(rvfU&DnN|EJXd@-C6eMTczzj zPbdb*f8U}i`+p%$_B%u)!Qt=Yv(N6Az&E?K#~|w`#Ny7`oom*%k5z`uU##|5viA#R zwqMu;8PDOrooK(ZpU>XK8q$AJ^>nhg{-A81atP8sV#`voukPir6XJ)=AEatl+t+qP z*sJiY1KYoTy^h`KkPo&$N+9b=|I7%n%}(X9{U8nL@63#zVy9pkWpn!>q&*?R$7?4l zchoMs60+WAyYFK=v3;KQMZX~CZ(c8I-za^<t|JICeiCBDYd`<uY&*k8ko7eNx2M@H z=x?-L@2L#7|HFP8yI-?S?5Dn-3g)+NSG12ms&6m%lNZdNzPG~O`(u>-K|x6VQ~R*p z?zUBief~U1`OPGfW<Ph4r=3LsWIgghVK2Lgh}CxL?vVOB`d_6zN3gqnB^PA8LG$}f zyHeI&c7KH+^`pg{V|IL|S@wqSA^UZF3^MFzbcNY9Mnmp9Jt*2?>$3Eu-R_f+_5th1 z?RK|ZF4{=-L&i6zy!~gl&%NG0wE@y!Uj5&}eqsGKyZSOnep7sBV!Ld4lihP=Nd5eW zcavS)#^-jz7a;vDuSX)bHtTNNNhw={<3BN&*?#k-DEp;)kn_U#oVjFY*<4|_ZHE}R zJ*$-@YoF~RX{QX`5B$16(carX)=v8ZWPW&QWR!iVkFb4E6lA=2{|hGj-xAYo`4>Uj zUu7z1ZB88uwtw&tGJbK)<B8oG!Fc;q*C72pAEzeUl}QP9rF@Y3y@R{iX5QH*JO63S z;P@!FwzoIf<znx)1G0X~J2BketjWSIC<QWqskbN6en*qHeSF9Pu=*Wmdu<m9>Dn{Z zLCUX3oqG1}IqdfFnvnDR(oZb5O9@c5y<-Y#4>`4!*!zEMwdHDpobRBNQDooyh{^tK zBBVVTRPJVXO-tB5?iFPI$ZJiCy|J^n{n<m1{^w@vO*X-Q*VskmS%K|;CAif3QoXsI zJ9K^Jqn;eQu$Ip@Ilm#}#~HrT_Gj0fvaJn->^EAW>utCDzPo*AHDo<zv-WPgGWm11 zQ&l1Bfi0D#?L`)+*uGo{Dc`D!b?hC2jjS6tL&lTSugciZckr}}xCfa({O|8--}898 zt#%t^J?oUCHg=UoPi!+BAnn_4Gk4p~IQ-65vjMVxRIby?KK%PeJ8v0C|LW)QBzs}c z5_{Dm$ara)q=o(0KpDFSfsp-f*LE(mwO_?ze_j-_KbiZ=ce}mW|7;l&Ank!)yNc~U zIr!Lz2tm?UbzYwRCY?)m)k%=?qvbPy*u~GZw3~Ui8=Su4@)Yf>^mp5R*aC^~2_-LV zccfU`?-7ICr@On)&3?`8*LG0{A@Ru*_TFxO_C~v0=z7;Ms}?)`sy5r#a**`HogZS) zJWI@OsS0F2>#Y_B`?d*+_D;I%!SRzdIoqzmTh!hw4zj;a?|Z5J@14x{uirw}o34yZ zwm)$BriF6|#QoEDq}%J3D%$^#KMpRx6=Jz;_chzu?+Ad54>Dcvv#S(hwU?=dln=Lc z;_d7A*4W2F$A>27U9(%3Rc*KUFvNW`H-55R<~z$)B@0si?zCHD*MCmfKIAK;Kk;{~ zu6^caKYM?}Ca`@IdIRleta7neWq`EDzJ1$c=g6XA|Ah_0|5SU<_WB-v`^FED`(}T< z^Rio+Bw>I5KP12J=zD0RbuQk1g9>CkihbH5JJ#QJ_Uq<D+SiHpCH7_~HS8KzLHa8! z%o_HLf)njbzd*`cja)|iyUXS5J6gAc!|!5xjs4c$GwinAfb>_l-uJQ%j(%@@Q~@$y zsklzT{`A=&c5JGU_zJudWVggj%)YoCvOXg->55&_ClC8J7s&cT^`t#^H~#tCZxDj? zU$ULU?Q_*x?J}hy=S8-t&9b}ixyF{s0Wv@8`S6~#LyxU}^9jiM${!m&?dLtMw%h*z z(%*f5N!0F1ORk;OIY|6nx;o!3Q*MIYlAX}-)~m4#-J4-A;s{y)wZ$OJ-gEM6TfJ~d zdt{<et^K^k?Di8pA^kb=a2xxLS5ocMJs{(Ey_dJy$x7JTJ57R&Z&jCD+P~kbWLqZ< z=}-L3Yqpb^WM^CB4>`}_*Z;}3lCwkY)fPhLo8mt(+F#|bwvS_i^e>ZtmD$yNooeUp z2AO|<d2qLF4jY&KJZs4QnLfkYc8+-m>=rh)fW!ag{mpjClXuy@djeSx<}{<&)`{(` z?E+~3=XIlqy{zafyUN8k!RogM<k+clSlOBVg6zLuqhD^%Q~bcr_8DY8;>x;*cC9;^ z?AI_s&V#Xgq-s}ZGu0+c39=tC|N3j&pBGx}UUoz36Gq9+b|nWl+l6{U=6fz|`(xKw z>26<k5)wZ<=Q!A3UCL^wE)1#fmN#<QKkIg~`>+`@9wYTO!|thytNouE$a$p9yz2HF zJX5UN9U%3`hky^Z`!dSyGcU{rr~l{=3ig2w7wje(L&obj7FOEt*db_N2EFfRJL@dF zWybpUpIss2MMwIw?NgX|Y&Xw>%)g!GSZLcP&2F!^05ZQe;gyViUqQcJj~Zk>(e}Sg z_U|l%>@6c9^U2FLGTFNXyW4X1K-SBt6qMVWHyPW{34xp!wq}EreP~ahy_{({*nK;- z^z0LUKC%0f2FXv;_H@`CymQ^ow(Tvrd^>0zZ*TL_!v4m5$oT7)MjLyE1{M2%@sRYN zxT4rzYN3U_#COR0$v%%F`(W|ac9)GI`>VPpPO?qtjIeLK4XNK||2=BQTei*a)lo?N z&Rg)&E-Y-R-G(WU`MF28`0TGo=h`=ZgtY%n{ABF=+obK2?m*T<74uH8z4avCeqszH z|1jmBww<kDZ-3SoGQPNjH^6?r%Xd37bIAIgZMppRiBs>{J<o&0r_;+&`&zZbb}p|V z{claH6Lt?yJ-6$UUjhz~t6eVkc2C0WKh#3jPiby<wUf-8Z>O9EnV)#Obg^B2f1LfV zqmcgD`;K-yx7}augrN6XuQ1ZE54_J~-*Xgl|7fw?M>|7bHT!>oknyDK=6BYYx4yBP z^Wro(eFv_#v%4p})8?ODD7Zay@9YNKha02qKYKvtt7d8}vAb$rZ?|^47FfQ<;H+J! zWw*_%*^v1!v+ywc5V>%>@&HKxBl4hxefKPO`=`+RUzYMsv}2C<wpaKDIZyERWnud; z<>z)c=Ro#D+OgW(KUK)F7rO$v|H?L8)Bg3}T>CFBkosZyjuP8{u5WE8^Fr1)batiK zzvJ|`E7=bzU$mdyvORH))jqQi(tj!vakFR3&#^ao0h!O+nb2=%bIi$JX+Lzo2-^u; zP5$k6Azl#scRcX0f6k|3AHEWjpB?5E+jDlu+c8-~+QU-T+V%`D%Iu#-L;3?AK|;2+ z_6qiwA|dfFnH6h)qD$X?5)-8VyQbXSK0s8&-c$r~-hh4HEjzIyefz7kA^j<V?xS}6 zysz!<a6#&yis+qoPt0uX^%p_<BQ3E!_S?<F?AJs<=BqdQx7+1Q$lI%*hm^Pafo}F2 zwh7sXc|p>*VULZy+VOI`Fe6C$D*i&w{*G>+o$oQo`01tQdv;PRLUz%AAmRD7W0&2g zAJO(<%8>Pv{KEh27ROJrW0r%A=ao#AvWxnvZSTPaG2e27m3_D&mu*B7WIm&jtH*X0 zgQ$JaW5{}<KR2E2i&jL~2Tg>GH`MW5vR(L7&YoogWIXa|w}$-^?(KGGEFtGXz58Ki z_cFK2epdiw{%UUgGP@=5m+cN*tO2L5Wg8Uie7?BZ7oCF0U$GUmU-7%!j_)NTJf|Mi zv`=!oX*c&hWIbB3e!Sf>Us=0NlOW@5oV?8T&x4ZfW~xEj^KV*J?6<9}v9B$M^bczF zPT3hWZMRJ@h4i-^<1Os9YwYb$yr}}`2MMFecIj5R_Bl&Zz<lxL>~`5#8tmTQfV9W; z?tHb~r*qM+cowAn`lGen-uOzTJ@08qe!Rta#`eTiW&4kXko_|^^3&~?CPv%)H$%qD zyP53lqwnsqJFN2)Y<_IGnw_7Tt&M&cq<x{i__p18@e6jbrjYrG*Sw4D64o%<2_-|; zr)eDGxA)+<Vz+-iq(AEX+Qa_UTW)*rHIVfV@g3Lg3RY^_x4ePOUuRAXwNKYqvfpt4 zGJaSV!)m{Hy|sNq7^MHR<&>g*wY;*uN5NjOdt!Q0?Ri`d*<DhD%r{rN9<jT-oy$I3 z8WO)()1&Q+J1gut=R(@!saDtRE-Fm6+p01Vtbezkwf%&kNc;L}ko3FSs>1$~t&;sB zK}h&6P<(ACuaIDSLl-ihzVg>LyX?uy_71U-_4Wooa_kP>zi4+<5;8yBJ;lyGV5PQg ztPZ67s!M%k`_Zky{@5I7dMu8zkG;Ia&VdaQ|8M%F?0MYG?KbyA#&7kvIoWT`leE9Z z0O_CgcbM2dtXgTex(HIfbKJMJH~%oxu5JTlKBOSI#{PAOlYPS`$at8?#8msgh97KS zxkB<6|J{dn(>pfVoi>H!_pIOM_B)R4vrYH_>2DraSF)F$7Gf7@4)LE>S+0H4gi70g z&5-+>vTK~}zo={3vp$97KRF&Dd$&C|?f&>$fa^O;9WDC^-w$?ywvhJrlX=qiXT>7y zj!c7`kJWB#YuCHP(=N^)(!Y7g7-%1JdB5#@Rfzkh_ph=0{DQ;YDk~10pY(or*zG#e zXea0lDbMa~FSS$QNw!a11i3#{ajKM^e^Y>cBO7EqrN8Hh-L8Ma_ER+>>F3lAZ~Itn z3A=oL$a#uPv;6D@%meI`^&tJ5)sH0XUaY=uR}d8dp8v}`?`0pRDsBIw#0#7r%J#V1 z<@w#P^VWxq7x0Lh+cW1o+0Sf%tS@)37qvH?eAi~ZI%GaH;t;pJ($)?;sY1wj$p<ZS z`%V9^+GT!*w5KQP6xl1f`P#cZfwZSp!@})f|C6x)^#@WP6_u;n-7-9HCz1hiuR~9< z{fvve_Ww8`<1JwaitTxwHrlO-gUnw#l}XyEOyIKb4uj0s<-B@mm*CZG*LM^$UN`r3 zhh4c!xV`!&NO{<~b)((9vq$ZA@Ic(ZZ~6ke-@O-XU5zTh{&oCy(DwfmXIpt~$o%QG zq!)IjQ<ClH214R5Rj<rmTGiin(F!|oeSiPR1Un7ozg9|nB*F2uq4%uK3%e3~jabO| zU9<UqyCaXU*v_~GDKCsp3frxl$ZcOU3F4ny+jZ<~*#qo9Z-b1FvaQIqW9wA5J2V%P z9_M7I+d9U4vg56Roaa1^ZKhpjuAqHy-gmJ5zgDleE4{VZX3azeaQd62USn^0w%WeU zvm7jMr^IL*5Z__9z^ER~cRQzOuWd2a&d~{SUTdDVi2ZeQE&GrX$ojb}M>}j)wEXQY z6Cmvc^VR<Le-3}Q%Q+7j&j~ql%I?3nx&04MNPG3>|J`;w54qYOH~=Xx@5DW{Q!toh z+xS!$93BpH`R$o3uGodNK>B}e@<R5e?Pu(I10m(D{1ip|+SPaLOdBEnHP3cKdu4@2 zTb)u!d_?awwJ-Kpu~!O(j6XkZ53$$HFtvB9ht&Tz7yjC%2(#Mrw?f7@ulQHm_myVZ zJFkV5H)m$b*nfRB!R}8!WPIw0pr!pw6-#@DZIJfZ$#-Y%0$V29v3Nk%>m0v(*>?TI zDEm30kn+Ustf&3#*FWso)@}u_w*c)8iuht~_ob=_9G=IrtL+Q7CEH)T2Wii|JdkW3 zW@lmlw-<8$w7!G1{l%Fvc1cl?@sy&4e)dW?9qm4zhqQ;b`dQkG3i#Tu5rvGuCD&fI z`=Q8YACd)`FF1b5&@NUo*Z#vs$aqF-?<Tu_i$2*ftVyywd*+O-UrdgDOj4lz2X;vM zT5&wr{`v+!d%i|U{IQ4E+s~8XvadIXr2iYHruMwMZ`-YU4QX#jerB`_ye()u*#fej z@aWDqTlM|n_LGG4!11TKJlp;*ub{oJD`Y*b%gH?3zB5(!IsS{l;qf9Y+n#|{*6vR% zq&!uWZn6E`&R{R}8Pc9B?`g4ZI&sr3FBFph+eLZpFNbfn>*9g5heD&`>>jXgv3slp z8SfQ2=W5^BQ*3*QVGcMyPO@{ct-NMuXJZ2yKQ(&5X}?ag(N3%sav!hY>3BPa3kG&d zuOa=3Y*AzTz@{9#joTsPF`Q8*_8;#`+I{!|nXhHtp=96mI@<0S<595r;;SX>?@RRC zsiZ>Y1GpFu*nL|VVsGXGIUnW}o0<Lg4rkkc!jSRQwVGn~3)q6}kNH5-hnQB1eWzEP zeF_s~J@-Y0T)VQ+3wGPjC4=+h7q2UJ^|A`~Z+IZ<a|)d_?5?CPvzvGPD%gJC6DjtE z^FG@6L_^wFwg=tpf4XSd>x4n(n;JP(?Gzrg+HKZ^jIX;audtu`LCJn%3uJ!F{UMj# zzIPk#WcNbSm;V_xdmhDn`#pyt={qDP!%oRN*xr>7QXf`I*V-qWX4<k&5C*5;Q=7G{ z7ZiT9YY2mkhwa|(XqR(R$v&$S(w^HFC~d!UBD?*X(@kLisBJN_d$V+oU05_EeV8(r z+Ush)w@dSe)W?Fm=GbhlcwqO(8qz*a%F47~`$fn;+Bg@Sp6b=3>_0H4+ogv<(zo?% z8GEHI&+R(rL&^iDXXSPxuOHgoH-eOpOsRc#)eevC_N;^SXBayR>~;8*?4`Ft#xt^n za_v{vm)fo9h3x-1p;2i6T=I(DshJS-<XYtIgB14JHSLC+Pt|%}!2a{=<962BkntHt zJrTR@2WHvLtA~u|-267tHcMX4?zkhQzvwhM&t9z9#s14L$bOU4MsoI@s?s)pA3)km zA*XlP>Df)T+cN=@-Xa5q?c)|?*j=!NjAy>!xn;-kO2+Q;KS=%H;p=DbCw18NSVbc^ zJXO#Aw##^KZhy}lG9U0+RMq}w?nJwnf{^^Oou$a`X3K3m<w=nGRr}CcI}b(%`|1~v z{^w6dZ+l_QyLLx1Zh`CXw||uEJxYCS7ZsU-&Chw8ZT~m&lHK8tkog4lIyL+7x*GeR z3n267ADrE7rgL7ltG*2>uOCUv+WUFL+a0xo?4MYnu4u2e)6_oF2Xa5sx1tUk!+Bfn zB=17x8$!M9-2%kz#p)pUi5)#2Zy#+~XMc79WIRoV|DJ7#v8R3XRml3D{S^;wn-gx> zt^EYa4<hbAY@@6<*saopgii<ab-Syx>+Bg<K<dN2N=5coMR%;v=s?C#EdI&cAHO1J zU-ui59)4DyvD^Ex-i~z#Wc*4qImMo@p~KFa53;}9$wAw`ETYmj<vOH2b^Lz3y-#eu z{eBL}c*&Fo5&J)%3~hyNAmdrDx0>6_Tguw4OqvYNAJaCa+lQ>{v11j1<X49~4EFDC z7}~G%hP3}Ul(yKe{;h0Zz84~&(XrO{*ynaTWeaJr{+sbL?e3dt**}hloG*NQeySbE zEI#`m?;+#W0`D2@H8Ruf8d@Re4Ls}FZ`XC<tnHacknz}4HpO<!tn}>vK<{^V<4(3$ ze0bW<IRH}L%`Pvs_j8+Vx8dy;aC}=cAFxZW_p^^_fYgsA>Yny1m{aX}e?Zpv?3W0z z+q$L7{$(j-yz#`dGCP-(eRh)~A?{n8$!<U841@heH%R~O?wM7#%P!uvzRfWa>>ug- zM)tZahwV1!=!46zx$O0Jo`G`qmqa1;+2h0E_Wd!8_Q!Z2_Y0|sh}(y(cx%_S65`(} zyJhT;Uk$T=90*x2f3JLnoy}i)d*evR`j&6o_3g8nL+ou@A?bU6^gO%QFM4f1x<dLp zD{e{HA5@dHpB?}yk3Ks+vWscZvu8ZI6YT$~PR#Zn_8qdTT>xocAC%R%k5^Q*|7ZXS zpDD(i_ARGA+KK&xr2p@hp7xE?>TMk^LFQ)|kFT}+vqi_AV+EwYUBqK-|KnAGb(<Gt zypG4R#Qxz51N+!ONdC{sbg(;ct=@jdX~_9KJ_*M585<?+dwU@5nTti{_A+|1wl8@g z{m-8cw)W+sy!KWS(O~!9brG_AaHhcSKrf_y`TLZH-I+93d%hWv{kK;Q4DAms;Im)8 z5wbo)lv&^2xh2&;O%W2_va6Zxw@#3-4-|r|k4gxrus?W`$KG%^q(3J6snJg6iH-fo zi4gv+IBEL}9S`i%c?H4om;Rd1{?Q#dyLS;5V7|jcXFJ0mDfXMRA>+qKCI#9xPm{2H z6$fe07k-McpYy@bZrf4FcyDoPnf;$PDfS=FK>Bk<?)-LwAB64SuY#O^?ew|UzUby2 z+rnzdc<p4?Nc+b->TFZHAoYJo<4HTqlMC&Ny=H>b*Vdo{`*P<T`)#?9_%7eD#CA{Y zH@o*Lko|L0BU<hB)OG9?WFh_QKi6yR?{_EIcPxXHAJ5H7?E~s8?bjzk#uw)PF|<GQ zSl@oNKcqh^np|r?e`~OPWj&<*<7{qe_i#m^{nf3I@hhj3<@UwvwCq3jK-QPOkeOpw z^tsGdbTy<tYRx}n_vT=|ea|~c`>Jwjiv6wqi)@#dLe{@zoZ`3d=2&Mp!v(UR*v96+ zZOe|8c4ZeJ_6zh`+6SslvFn)&xxaJY2R8eo{5AH@Qyzl-zmzf6?sie7z4{Bte1bQ_ zf4g-|@^%~(9l`adKy<8qw*Md7?{yIULeA6d4jbIIOO1uhZ#_IIW2<t(&))7Kq`juK z+r)lusj>a66Oj4)DL10*IUCyS9-M)UXX?o6+DrH!vuj@h>EF8C-fwqz%~M;iJ&^ur zhK-MX)G}pzfisZ)*~h#L`@_#-?61~B%$Ep{u)lP6huyUQko2waLel;zd%9h7C#3z6 z^!bQQ(_<F<$?cH&dEaY{_6i&L>^VO{#-rc3)!I+F)@HXX9TGlm{Ji!b<v!W2S`KMH zp4su-jw{jIK6f5ue7>Vq-+sN7uH6z&$au2{d#IgAce#C1B;<UfN4)0tEWhIIKL|ql z%ZA3Db~1q$_M1LJ`jbgMq4pI;OYAOLLCV*sSH<nu9o%5I;1gs$(5dh4_A2I4_9f>a z<>Td-ZuWw8;r9D1A>&P-7JahQlRjyue{LVR{p<eeuHE0v2>WICAnU!NPPp5*yl1x$ z(uMTjHkg#!g&Eq~r|p2m=Y|h!><a2$*kx^kv^OV+%(P?aQL}GjhRh!*GRxba-SFM+ zkPRe%pZcz27hg2jHmMBKAD1dDv=dtvZGX<&7o1*pYsJ{V>{qfs8w6<&R;Jk73vu7K zJ#he1K8ZeZuy4D?W#6m`8SmSDfY*M%>r%U?mXP)y?>km|?hpL-W!E6<tDpM3woA@P zvoBr+v47{rF1xj-yzR=(An~6R<7<EBYoPsIK1g|~GE?1tpK-0d_sdqWd-j?|*^4-& z+1V#U>f<Wzbo;+o*V<}+hV(z&<Gk%H<wNbeuR!uo<ky9^evD%FPJ1BxO$=1R>{L1U z?LGuT!sFwiID4@Tn)bK&A^Y9KW4i3zxBRk=Uj<1&Uyl5<Jso$_PNM{J9+w!uqP@Jn zhh4?i6ma?aSys;e&5}razbS6u_>#G;XTS2cv3+V3<b1;zJ865R=Ti2Yloo)?KcQn9 zc9*)&*ts2o^tS{+>ybFV+TAyVl!r_~+O`V32KFyLL)sGp?85ef7x?V|FNV06+f&=# z_Fu4l$1liuan@%|``g!w?a$4FtWPhQ5N-eQsfhjMYmo6YFXedqetsW2)~gWz-Fq2t z&u~A{-qQ?{p7t<bvfXa=%kH`rq&{1?_=?>FKXv=7(DE&*iQoSI${%)@&O+KdO&L?| z1i0AkIln;4>*Wj7?EZILu$4LjsqZv=jO?|eT<zDjK=#ul^lq`!ntjhM)d;d4+4A98 zJE1*O?Ud^w={<0ns=Y6(hMk!N<UWE=40iTno8@fTlOXBa+MLUN$vOeMqyHfH1uhRM zw6Cn?vll6P22Kyv+wJUc|9fw1qzoyad(T|9vCOz=$FUVM|CBeW&fYCX$iCwz<h<36 zFjo7!0iAZeGa&7~`w|KEa_{BrUC%(yuXa0OWtaMWw~fvb$o`zAofB<&+qCWLk3!u0 z?t+rtU*5}h8#X}t8yt}=c2@g}?N2;{tUq2dRm}c@P^$f<NXU63&y$VqV@@gCuZx6~ z@5X#H?G9vU*=w0Y`U~4LZrbVn*02}Mg4nnBlbZbvH%q&EAxQf3>Q=K4TA5}$j}g*- zOY2^3JG-dFF7hFyJe*<bZ@+!^JiF89ApKeK-=Ox>2fLJakoMW})e82J5|Z}w)<Ehv zg$^V8uiNeH>h?qGx2K1f+C33Wwog}ww69t2cG`YRwzHe{36lQSs3zJ)`pVd!cncZt zs@Ys<uiMaOS7#5IZ~J{T-#+nlroHeg$a=Y%$9e3}+0@%#j(H5u562eU*`*cv*=uP+ z&dXn?@W-w;m(hNW7^J>_^DEp=FqOlOGwujDe?+cMv`<+WV$XCJ(qCPB^@&|9ubkbP zyO8$LhA(RN_kSnZJ!yxuXS|-X+8-5oWLLQgvc69_FxGZ&`BA%IQAmG!f{2U#Cg!Df z83!Tt?c#kL_C=oY_RQ9h{X4O(T=r&a`L=WIA@$RznbG#Un0W0|{zBRxb2q5imohrr zuMmTbkK25?ZF6poiaqZR$avF|Jredxdw1BTSVP)J^L9kphVt0i-?;?2Pb<&Z$lmUG zyWKwM`7f(DitUppF1DMq53-*0xAi+au2<`9uQ5W(i;e$M?4Qh*v$ys?15V$m7EA0{ zT2<_{KSI{WNUh<u_fMN{!&(m+5BeQ6)$T&Jru|n2$o)q%7}V{GybbIfvLNgCj4NX8 zwFM^GZ4`#wPcv<^g}r_HT06%;$oS!>wLbRe3;1jsgd@S>pOCoNZu|Rc`-!}e^2TUy zs$Hh^GrP;LAnC6q{<+;5i4AtQr6BtsR$21e&(P4afA0^OFZ{CA)c$x-yj{q#D`4|J zXI`_@uVb>mP(BarpOUS~_Mvt<_Bm3J^s-}jl6A*6PJ2NO$bEJT=7reVUTLv&Tm#vk zvgEO>9am$aZFCi6K6X;|Zo8(52klNqLe>*ToldpqwUDx(xeF5hy4#rTf7Qg<{*{KT z|9WEMU|*>yZ9n}zq(7E7S={dSx`lS0N|5<yHV*;&bRHY~N+-zrOa^fk``ZWQ?dLE; z&YQTNbir==5(WD(=z8y)%U{{qp9!^J&JC%Lc(o$!HC$`$b<RNUGb%aPZTFCMo1I$| zWId()6g~TCa~kdDU4rbV+u_G$U(w=X-`fG1-`_53XCHl##eVK#$oP&wtBk$*GA;YS z8<6?l87B?xKkdl2D_jnlPgIncVrRn|Z$IPG1914>@8Pre&+W4l%ZIctvO0F!P3f|+ zSG)yje}$aBWw&sPsJ*8=r2f{I=e55*JKFwP2V{L%lz5cwFMTe1j)#!*K-BUT?IwI( zZ2RLSWIpWX?}c`mQ-bWn%^>;Ji)Wc_f$?2CnVpdJ*?vW;b`HIacBfB4#%owvs_YNm zyJE+F0n#5^bnA+p{htc^^=y#&<MeOe>|QjiwsW2c$=|D19kG*BbGGjlmj(OB=4FrF z?5+iNQ}QA69oMI^+P9tEZMQ=ZVqW3v4K_VaZ1!0bAmdHze@wQkbO^U!?g?3cTQ+s3 zEfZ6YefK`de5@@$yZyQ^t8A~9d4TI{xr}hTm6~O?6-toufPa;<{q^~u?Y>Dt_7Cjc zAYm`>U26Z{7n1+~vuoPDa9D3A_2M7ceaHA0+X;!v*+=b!w6B~mudrLTp3knV0doFK zWObsw$XOM;RgWO$!(nb_d&~G|cFM|-{?T-Ua(nM2HhV8G$oa@h?<4ISB*JZXH$&Qs ze+6Rg<)^pVg*}7r|8<#acYO0b8;(tD!TD#4zM*~eGI@IzF#|B){r4@q=og;$E1e<Z zjT=Aa*neoeZM)=|8MyrAUTtH)fAf7ihi*uJOw&8dzG&4VJ1rf^`pQeXa`t}`LhLsl zh0fnOtJ+PT=xzVgA2PotRi<FSwL#UM(|9G=|Dn%~?KV$jvKM&@8Q;==;9>v9*w=p3 zEy((noN00Pj>rGlnX^FJA7`d#+Pgf=w(p$=*^lp7Jj3qmr3m}kX^{0{{10c^G1Q6L zw{3=ucdlRd$S!Eof4lu0kol$Dmv;6yx4*aDoe8NQZQ}mhJ?!tZ^ZN}c-=(j+*>mqp zx99ty33lJFmfN<B`<L2o<AsbjZ3#8D=bjO3@6rsJUpSMn#I9V=#@=Zuq<vAcQNZ5$ zn5unS8zg_+m6Ei7^1sl&IubI!+5E-Ee%--pyYK5D=Sc|%EVMi9Y+%1+K@hmVq;xpU zE<Wm>-Tdj0@zEBke0$$JdG_{oko9p(v|rd|Y&NyO^5zdXzOGJ`vu9Tcw0{)}DUZeN zr`zqWWU<%H=?BZ}J#@8KToq>jR~j-uS<q%@ueJT0UBeMbe*4CwY`^2t8!L|^kn;A) znFDrTvuy4AFG1?Vx3<Ri&-4>*m*_zDcTc>>YTwu1Zr9`tDQ^?sys^`+^tL-M4@sW~ zLiOxrzo^;gFN2h)(Vu<opKy2E{k{WP{~2d0WK*XqX#cAK(tf$QX`yWx?>akaX~_6l zL{O6bt&BCc>&qbHxdxeQ?1W}n*ekw;@b`$>*vqh-uoaDfj9*T>bkMHQ&c|LP8#4Yp z_rIw<i`5dlHE*53{<mxUVrM+r!+x3xq<q@ZZEE-I;#)f>Mo4+4Y9?ksXGf>qB^k*1 zBq_Q9_U>MNcAM5f@@w2YKKsAhw%NUz1-akr;Zr`lsO@ETj~P|L>0{mj2D`jR!uDOa zAmjB8uU^=Oe41~^cN?<aGqyC`zVwlSeZ3@Pe6;X^yuIp?vvzD-ApJidejR&5)kOO( zCn5TaWU}plHfGrRrb7CUTVw<6UH7Tjf9ZqNmoJvo*auyIX(zD-lD=jKTG}sbOtR6H zhm2qSVDYv8%`0nns|qqdQs`P{@AJIR?#4gJ{LgRs2>UyVC+)b5Ap0{pe+Sv?OBUE& zxD6RU>=2Q%-}@}uUUD~NeE_Gou|4NEcKaGuNc($_h^YNnm1lOlMIqyf$;Wf;V-q^; z)F;J&!#g~T+g@)~quuE(ko7J1L>|~}RI9STWXA?h-)vF__A9mB?E{-2`RQb=xt&y@ zt^N0}ko9$@cWdoLCyLsi;@u1m-yi`+ds~T%c80x>^l_%!*uF<o!{+vL$o|FTrN(ya zUz^&0&xEYM5zk?_zs4}l?(q-Ec*B>n0(%SjWV;1xAoFSB4t4gbaxV7U8zJNWkG?S2 z2Q3P)%UA(9kG`SonawPx6nnudkp4aEHWT~g3lnU^x*+xApVgZ7o0S&Z@t)WPF8{T6 z_}HvjSY*HV2xNby-~kEy3SBjOE;fk!KG`eVUK9(qKfepIp0c7g-R1)8Ry(_Uko|z? zOdi<n_&n9_?KVjNQbvZ^?rHHPJC#+C{=*yBNw!z@yzH0#g|yFAKi1lJCI#9%IIx4m z)BLD`eXj(Yy>AqxztXPBVy7%*Z@2t4WInO8N!o7NU2nUfUPya|(OJ~Kdb_v%>0OZV zs@(@p*i^j^wYONj798HsE}7UBbVk~@gh198-%ysfU*|sAF2N6y|GKtLw%c>{iro?c z$axgk*IU?|r~kCeE~*B{|L>^nc1@mN?bb^|((}HzN%r@a>)KVOK>CAX6Moojelf%D z=r_pvz~uCEcHdV%v(tYEX%BETb=sY%=d@k56cXR(t3B*hALQD4C_&cOgk=A+{oqw# zr(p^?Px;-#0Q)Is(e~NU^UeJ}_}Hhrir9H-Lej&(Ba>|n560S`+zA<fk=oB;w`*6b z-O@%#`C1SgWRv>%k?r%C`(XE{e!pT@u|&fD&3?#v09UPdT5H~@xBs*S(jHu%;B6me z)M@w5Cj}h-3waLN?eY(_{h$RIKP{Q=V?U$Q&~DQ=$oW0a6MAh!SZeKgUDUzm7Z)hl zFZ$wXpCtxaAGUX<q`gyajQ!S}5U{*(R=F+5+&cR&S&;i7+<(;DzqR{peO4JV-y$P_ z-!|dM4ZFB)koEPqoLTGxR^GO2?}PBCf81|pbv4B<!yi%}6nA&n&9|1akFSKBuest- ztex7jvv%5cpTY6HHs-9IIoC(KE71FX^j#m>RjfH~D{cVk{}`=Mu=nXVvd_|joX`FD zov!^`Rww(_LU+OLEniY%Z~V{EewN!CFn@Q>dOPt)vG&ZbIl<vmesh`KL+>MYtM^0t z_pRUN+U=2ZvVV3NGT!=KiQj%>-x-@329W(y%i?3~>q5%y*713O-B<B<wOv`Wiv95p zNd8b;<YS+0u+}!L4${7rTpVm`?`LN3EDhQ3{`;?nU1ik?J1alPexQ|yyY12sZ?rok z2q};KuO71#oMB*p^D|_AY;|a^eecW$8`X43e?Ck!)n1NanO&;|B)!)KZLnoiPO@KP zrw-2VFRT*n*EHGLn?8Yr@4PQFZ5_Fn*iQHgNe|J-ZSDJ%6Yb~ChS;~!mC^n{Y@Yqy zmyq%&IJn&Y^UEW)rz}>2!>e_+t)1$>J$5q%A>~KUBUQUyFCFdQuzdx~U$)(5oocUd zzkC|xelTIlJiFZ?BKAezko2taJI;<fUdz62B4quJaDJxU=b7C0;nADG`uENLYS(^4 z&fdouvY+C9+kU&l_B-wP+3dmcQv0^pO@10{uiyu9@1i~v+h-P`_TQr*=gIILV6?mQ zW3tWTE0FT+LIt1wibM;$^#PFe3+p6x?WYOb*-e}bX&;C0_qPufyJk1z0%ZNN;;AmX zFDI4kV`U-ZdFORy?RToi+Iu~O>_@PwG`2T*zTR$8G30(BUbi@V_U-2On<F9nXY$Ol z?3ZkqVC!ZNsXzK!QtZEee`Oo?0Wv@IHox4S!=~Ksi9Te#?Y=D+?Jl|d*vA+^#_ziI zWbFSR`ef(071I7PZ~1Gt&T*36dPd0pqKs9g_Rm}S>=U{m>F-<bcH3L$^z0-zK<wwd z>}>x*C*Iy_qcXVtyYOs<?cX9>`<+pc_2IqG%<Z#Rs@tC}fUHmQoL*t~OP9y~%y~$E z{O?>z`{#3+?aiyj!0Gw@)=GP~iX8g|&mi@W_cM0;3(Gj{?I&CV%S)Pf+f~ZGwfU9- znUDOq{f=F*aIO9ByO8spl4hpcP10CktKkZ%ABv_W*-PIDx96M>X@4tQCEI^ZNw=5N zFagK!ohj1xP2TeMZ(l>|vq0`Mb|Hna_OsI=?V*>eX4@^1duMlUJ7oO3<;63*rmlx} z!UmA}=p$QC+4Ziju<wtCv_Baa2iT{|RNC47hv@&o&1x^SSjWD{2eSY5+Anwetj;w1 ztPPOy$>pU{c6a1G?VS!n*6+Q`VX^-osbe1-QVDin!FqoCZFl?aPCS70_jZ}J+BJXC zwU-Hk^j}=IGTQ$*S#94H9RbdN%C|b~N^0)e#rs0~XR33H?PX?$*jFrp^yif?=-SEJ zsM?20LdK^yreC!SQP8wIR{_Z%zuDC7UpW=oyNFkU!`m>v+&-XD*>1_!H(>KQYyQ|e z`RdxQ*$-*Y%1pMgJNc>Du6-S(eC=nAvzIscZ^ykDG9Dea{)*komCLM|av}Q*jf-yE zohs?Jdlb18?7x%u6YVwPQtcvKAnWruQ|8*KO+RT@+5kzPQKu{Iv+MosyG}sTQzQRk zyR$rR?Mk^J?w@p)-(K(ZZM&1NA?v^Fjm7OHN_p+MEg|FE*Pc$byFb&$ey=H{J^jR~ z*Di0ql)aI8IoN--E(P{VkLTIc=Ro4Cexs;;YQj^y)~k^I&h8j3`)~3q?f7*e`h^z? z+cP*R+qXU92J2U9<FJe5m9^)sfQ;`5zlyS#nwn?-{12pk-~N@=KK$q(JFX{?^^gk= zZMF+szsA;e6J$L?v{bbHD#3$x>}MeRg(Lzb?cKH1?F%MB#;2dihT9*>6Swc|g!C6> zPi(a1ZZxrb^9*v|M+cv@{lA)U`)wy7?H#@HO?JvQ*X(ZS>44o=nDN7ImOZaMza*sn z-yLz+E;9Ino#r~oc;e1g;r1r-dG^81kn^Yx_vzWQGfuFp^M$Mr)U}^(Tba#cH$@*3 z-gC44?Y?E%*l*hmnSTk-&9}eRA#6YY1SI|*eABnTdr;G!%N?>mdA32a{h0-wcK1{B z!1djtFIVmUa?9C2WQVk0+1bSGS2JF+?LG|YZ|K<Vv8#T=VV`#kGJgFlbD3?r-a)%H zh9zMCXzZD6ml|JW`<@3fpLMxK#J<3s!|tp)q&%8^vCgjT;%d7#)stZLPJBZ4CTqIv z=1N2Qp9j`{xBKN&YF~91GM;g8zmWZu+6emxYa#Y8RAsb3{l3la?oLSjPh1&g|E4z5 zUg#I3zb%vNXwOj+XJ;}Ca$eB%OHH=TS7z89sD+H*)tsGW7wREqzkM;JzrMCO$bO-T zw%z27kpA=+v#)k?%vbGVmO}EktzNwSh5j1*2M-|q{ac>l_K9ad*j=uI?7v#!_sLE! z-N^RGYe@Z;v1-4akPnaj@l?qCj$nU^z5DC4cD9Eh`)!pwneG2}DcUWb4H@s)kgsj; z@g>Plcn73CaB!=?-34Vf`wI+^`EB)y-uA!rHrh=%3-RwxCszCKM#1*-{*d`C{<|Xf zCW%J&AMQcg|Mh1x?Ri&o+B<YZ((hvJ06V7{CN?TJAp4chb+5J4@;_>)0^Q$u>W7WJ zcW$5EglNck$;_2C_9ypy*|!To#%Hd*dv5nJ?v35dvk>=v-y3K5Qbx=E@*~Llg=gyp z?d4-$+db=mwC^{)-fVmFLzVrma!CEYe$q~x8)y0L9ZMkPXY1-h`*miY?PO0t+UH)6 zR@*r&)3vXk1*tF0V_og9xAfY~5!eMTf1*Vl?LVeC+82G?15Ph}Jp6WDe0KI6k09r@ zufD8je^uPW?sqz5{;<R8sok@z%XY^(A?{l@$;Li1wc7r(5oG;_y7@l4O0j<1J<5>& zcj5IAd)4Z_wwjM2>Knh**w0!gYWt=K;@^3D^z7wk?6V6`gR~#4)*Z7GUn*p`#17)W zM5C{E3-_hk^9Vxr|GW~6wD*ybustgTnNNK(OUR}m)WV)S88W|-wn@?c{4H%evvZL7 z1~2n$`^3(4`+j3cePNrWW&g^v*Dg*BlAb?HpS06?eB1WWQONjqU%j5aar<H0HK08- zXU^DumUv><s_SllJ@qp<yq4N0+qVm8*)i%s&Xak!cca}USylUvAV_<`>M_54dHf%{ z*^!X*kU74w*sE7D*k4->>2ICl)3G<(#9`+z0vTUpC@Hopu?@3*tqqxf>=*E~7ddBc ze_$bGef~|~b9Olo9@%!!+6RuG^3><Hvu}IZN7O*}k4E#x*as~rwmZBIvcFQSs>=T9 zJO;a^4=#b#M>&+)CGvi<^LPZg&!O<-8M|fk_-r5Sg@lLvZVCHO_j&Cr8iK+8`<ljV z|8ZBkUC1QJ`DOK-lJ=F;-`Z_dgskt+G8MDeDXh0^m<H*Od$C2?n=`B17ffjf>$meu zwR`s7*<SM;q(8J<(9quTue|-+jYq-qIe+u*!^@@Y@03H%d#}B{$u5sQ!hZP^NP0c? z{k+|b4V8A2&Oy@8;hiP+uIl0T?6DKU{z-fK!@5LftDVDK$oN5hq^sS|>BaVcG9dlA z8Mb%ql+SY7%ZNhmgP)mo)b7@@<92l(koA~b{h!<YRg<+(wSbIYvA>yTS5P>|&L<l( z{@fgK!EVBh3cJ5+AoEccT#ELO7K__wZ-LYo`|mEbJ2t=Gexd>-{qbLqw(X28vA^aH zncsYQeT`j+cbUCi1f)N2!Wn6Qu1(I)H4kzghCxw~ef<GZ`!`k)`^(C$ZO@ce*mpgJ zoG0+@f404^^$ojFQ%HLu+Csp7)nsdX-aJVEkufjCe%*gQyCV}I^TYq7jO|rUx!8+% zK>Ej*=3TavJh9jI=5t7W_xb)_y9+l(?UEcJ?OU7sI(8S2e7D=y18KkPm0n_Jb$z8> zrXD1|{J!6?Gbxv~yLk5@IJ~ECX|)v!^|8x52}w^e>c?y^t^8pd-2@q5cl>2*Kh;;? zo>fc`T)+8c7}`(U&20bSDx|!r=SjBri;A|>aDenDCxz(P|5>VFFCGa|f4$<B-M6Xr z_TA?p;cNQc(@xl2+wS~v$ohb0t~7i1?LX}%%!SnNZ!8?`y~8u@<9<Whg8}nB?C$bb z*)I}+^e;Mkr0w0OO|un$HwoMxKPLOgj`M7QePJ=AfA!gt(<a=M$zFO-0N8&wewo>? zX+C9V$_;5>Z_IYGbJ*Nto4wNtoL-r~IND#n#Abg&0@7ZVZU1PuAi&bz)fRF-N>iz} zy>hg?{nuBJ_OrK-kDaW>K|6aV$bR|)z9jp{yM^p!10drWLh>&5s}(Kno+&}vhwofm z?ft^#?eE=(gwOth*LG$#iuP`*kp5-bb4`2ccN^?1&K&}~mnCDl?Jq%2dye0b^Aci{ znCyOWPqPcZ07?J-8TxiTC!OtoC_v)()uqFBGIjUt%zi-HD}IZY*(wGp*=q?v<X4Ir z+D}Yiv6q+u8L#O%+h^zYe}dgR4M_WWb!UOSglCMcdK_f`rs?M^b{}h)?SDOo#P31d zvv#o)P3@XKgo4BCFRO?B`b8~vOob5tvhd~D-Mf6$?td9%yeH8=*iQHepMAFjBz<4_ zl5XFzw!r?#AIN&pHHS0pbnQ0S?7Rp`52B5^_OoV~*=wAH><4Kv@wH3%Uu*w%BV>GP zMxwesPiLNeeHkP@#h$gY_hH>+S2KG#*gfmB?%TC5w72hF57}?KU*nfu%W`&mxs{Om zo?Cm4E$eD0d)~?E;PjjDr^NnlUAeu(I>>mzYa1#1wZ-xF{+y8Usg^x@_6JnX+Zypg z`V*Bhr|o8LePeU32C^Qs?SO*4`ROb>|0>A+>E})g+NFsk*?+C90=wta3sd{U4`uAT zLm=(r#5-R03kp4L4fP@Ot<6rsww0?n?E^kT`d99E1?_Je$l9;8fyDQU2cPV$b%pGc ztRVB9CCBsaXRa``+oK4nU(IK%wOgeYZU5#KWISkVkhA@n%tkx6ZIJbxFACG_b4wHL zKlVbxzlHyk4bz`JHerh(`RmSsowk=QSlg!v2!Yevp(Fq8jMuW+pUH6n^L6z!>|-7Z z+pjqWDW88iZLsV7C1%I>9@2lhxZlhEo1VP=Ar(k{$5|3=m-UU$-lZI}-s0fxKXz@0 zQtc;gh4gR39w*vci)z|GS_!EyKiAB(Q*P(C*ZdEezs>R~vY#(5Zm(r`4jg`scR$<h z_SdtYJ_Azz+$@r_&p%;dH?<qG{*tH9-`+DJ%wA0$GJdx+gv(xx-OA2YZ#`JQgHMwE zbjM2j{UVV1o~h8sKDo-mE=UYg{=fd8WMA2%W53r-9qixQts(a3^ZD#wJ%Y@?Z2$Mz z##1laUiu1T{lN8q*KIdf`P#2-tOTc@2DxCnXP5fyGA=^a%ak&!+4|l|wQpvI^nX}< z&e}z0ncAO8hKz3n&RT2d@u$vi($grg{zs`d?L2fj>@?IN>oxbwvD<~#<k?#l2!i{c zo0guobEpZlx4Hx=|2h`%+wV10vsdGQoNx4$?Wo=6KwbNZO^3n$ZFuWq-y7&*&-xlN zzonaRXRjw&YyTh+vi?%D@r>Opo%c4XZIJbf2?B+7=j`s-$<2n;A5WHN*!RD2vH!J* z6>MHvud_X4otqu|G|2qdye;DP3FnsCZQ_HRrx5>3(w@`G(q1eM690xXC)z1*ooIKt zAJQIM#K&gO5~po1+6L)=eyNkQXP^GSE+Xj|*ndAWS?mwKva%Br2nO>D_Zix|{uZ$h ziqZkwZ}#5BKGr_aUg8vF{XuXSuf5}QOZyx*h<VLVMD255{<1TF1Zj`6dO6rH@>*%@ zeFHLnaa%jmezUT^{YsS|;Q0O6>1^-wq1^u28_0ZByYULU+kb!CU7iXV&-eT-XwU!t zv2E@&Nc$m1Ps0B8a|QcLf~8>h%&C&LpW(CAF3AT{pF29J+4HU0V_Pc@X}@M@{j|L* zuWJAIG^9Os;q6Yl1i>7;ZO<X`&z#|7AM00b&m{<PpT7gYy+u`seN`r;J*=-~YOBE_ zVK3-)3GChu`vChlvN`tOlp*ES6Ol%{ETcbmY-JhX@TzKNv1_r}WV^W&;-2@%9qn`u z8QTBXhm5br?F+HL&9cFcFCqu*ev2tn>`MLL*@ZoY)CcBOpY0aOh1joq3F)u8PL{G; z)}~<3WdVuL+gmg2FG<_mIc<WB2N+!4Y!{c7V|O)YE!cev`JL_mO*FM#v!WHupKh#W zuY7#EUH4l^|2_YzuKfd!TXxc>knvTQeM{_e%4F?5zC-$t&T^COCTBje+xim{-YzRQ z*gdPWvA^%M0c>95d}mv>4-s}A42EF-GUaOfWe0cK?KlQ$e{G0PwU5#5wp-H+sXssQ zs@S_V%G>kLg`DRVd!)+#oZ?Zt;|!4Y`{|@IyL;|FwqGAZ##`*#>g?anw6afo0U6JU z+#PEFae}|?r8r4&{&Y&+YnLdn)^3ZXB{=*dH`du*x}#^`C<Mtb$Ign|pAxgSZ}x+% zr@F!GVqaioX1_WPG9EeMih#Z1G--S0W03V)Hc7npJ`?KfCig+ciyJsy?e{Irv@^T` z>F+trW3Y8)`e3(y4x~P~`Bu#S0N-0X^IS;zZ+}h5zPNRUU1&U{zw30xz%J^mmi_JR zkoCgrmE!F-F3hrz)`aY*(!E`8U!Kooe}63`Jl1R0+0XmcWB1}IWPKUercHMD1H<h( zYarwE9P(B6<{2mLWE3FnOOKhEcKP4b?CvThfzw;FU9A0oS$Df=VaR%2!`nReky}0N z`2->3L1zWa?G41Y+sXPv#?#(6-LYGFfZbln6Ea@n`83}yq|@I1(ksaL6+@qeePfEf z{p2l>_0;8-1@?x0w)QiwL)udb@^SWSEw|gg3xc#yE}EUUdvDlbJNYhTeZSB<Cp(3k z)9m_AtAX9;AP{KhwMNNqM;B!Nd*4}odzUs-dv*y(f9uRWMSFo6I`($%konZfMhW(I zXRg_Lq(IW&mTFJ?Elbzh&3Oyy|F);e+Rx%Gv$b9V>5pAFP;4JKtKPnd={Yz(WXuq- z-?%f@o?i~K9_WMh3>)KBU3Sg0A?tgJ=EvIGD88`^vVxR{3#=0C*M(@=r#yv>?-jmU zVtd_Xi=F><$aw$CRlT<6j5YQLWN(1Yf3fk3-6`W3`~M}7^RUaSrrOo5SGAYg0O`-& zSe0eZt<z@rSpX7VuYOLp3yY4nb6E{p-_gG7tesuHyZx(^konu=OQh^&4SnqScR})V zXHmR;{{>C^O<KX={IxamzMTO#mwl8xWIft14<)<06>|0x?2!J|v%g~Ymtzg=zj23x z)z4!zvbWfF)z)TPH`u-R?xowazBpy)re+S#KksE<+HJL6VCQWEnNNuN-(q_~TFSoJ z2hzSU@Yb<s6Rxz5Z-R_hO+FxIcWbV+ea&V_`D~n(Vt-8Go1HiZWPJPovXi!Ud$a7V z`yuMBLMrSZR?o8CX$~2GVvKOJOY+sS7uW6wyYKhLvvv&gcGxYQ0ja;c=6|r;6Ww7K zdH^#2u6x7Q?%Ey;`?{a|!0wMasb+UD#?$`)FG&CNUDsB-hyJhaguWPo{j;WjnVndK zwEazG$ar1ft^Kx>TK?MwEP~{h*m^d5&F>QSeesa?vVrVByJT-cd#?2m``U~)*(N`9 zvcK`;G1z@Ox9_%Vd8uZX;|*Dlp|9a!ug0ZhA9xBf|K9R~-QKVv&|bj|G9R(!xV(Lb zQMLWUNs#?%>8*?H{=HvqC$$!GU(3E5(`>HVYuZ1b1ZnT3PF!ZEZtZA)AOvzAgGj`4 zTaMCxyGS2M{7>)-w3j*QW?!KX+223wr-Xejf2{q_6A=4j67+3V)@Iu=o`alkQ{)(F zUm;v=zswfWU*5AT+y3uwCi@$EA?4Mb4`%j<`MB*8K0xN@D%q#oo#1(CrxTw6?w`rl zuC@!Q`ebLK0g*2athT?~>SMp{7^FWoZ5ET={en#U`?8Sw>EEX~`-0t8_TSDz`b#gh ztn7rdmfM|w1F3&Dvp3nvh3&Q5_z=<`*qryvj%8E4o#t0a{$O~u&F=FYKD%I{dT{(U z>KfZh%!slNzYOVbS}2>@hvZAxSy@BcZ_~NW?T>HyZa48EBRGDhrysK06#mZ6@gHP8 zxY~3d`?^cw_6qrs_8oWDf4iSuZ|x>%LF{LkQ)zD=plUz!K4kvyg33ZWfsi!&KvBr} zjzme4{bjM^cERr;`wyBf-LuPLu(wZ>gOoRCw*0emGWN3nn*;H$4Zo3nRTzVP$R&vU zn<<;@TsmUycBDe)Ter4;w!1S`!hXUH$oXF8O=s=cqE6XatkD9y|NVgyJB~*w_T2@L z@!vC1e)b%7arVuPkon|PD`WeEjy85~!I1k3_>Pv@yQuWoS}%Z<S9ujr>`uL9u=jF= zq>tBEx@=40Cs>)yhqTXS1i9^V!j0?`v>@l(?(fyMlb5ryE$j&d=NCVPUb{UhtoE~A zAobVwj7a+%syX%n{*d);Q!AQm{32BCA`Kz=#lJ<>{{Dt?`^5DS{|LI~*t@>gvcI?= zvVTPA{3+X@4T|<rE|B^|_Lru;U&?%2_mmZ2{~nrEX+K9s)Na`q2;ZZ0wykr7f&D%6 zTj2VEYo@OKX6tBs_PLPs{mtv2U79|-UF;1=`Ek-c(|&?UwY}*-NPkmux`lnHN4>pg zh%VSak0;!;TXIIlUV{~qzb=>8+iw*Vw7>NL5<W}J9qp%QYuWE#0O{}is}`}(JiWqB zW+mi4LB(|$_U{<x*c}Lj%)ee*SYqdJ?~vVQ9msf0`j>XQ8BGPYX&I3I@XFh3?3U>A z**lm(>N_L1Jo{U(-q~HqfcXDx#}hjVBL_RxjgbCI_0d1JKd#8wPx=jMA6%d7Vt?94 z#{SlK$o*qVMN4e&aqPAe{S7J4avvPE$z>?A*N}wFcO5-qZQHjl%D&+cWPR61rzks# z9s6t(E<oH<{kqpSchPpct{af^3a+Yp*mK((*~joe!do;-!QQr2!G3l%q`W%W`rJ<1 zcbctY2c&%^{G!LsyVKK7G8VEP_R>dNdo6}?``+b{_2B`HZuT#pS=a{YLE``9k56{} zuX}Cx>p}YOdUqM@Kb?JTJ9`)8ypTM*F#E3}E9@3#yamVqIX+(dEB&YK+FK#vvHsjr zyT9Aa?Is<8=x=?iW`D)q&)!NMQXV>7dSX{3+G2OY7qUK}>CtVwLv<YXU9TbO)%f&D z8;yrOcK2RG#$!G|$hNbQ^S9m20a@SOujXs-k;i5~zZr5L@9b5J>~`k8wCS^k)W@@p z4D6qD#@chZLHeg_XG_~98(y`0A`NNp6y;Rfb2ix8Z~P5OZyZT~>|}1Au;XrrjNe?Y zQnp`rEzI7|4^rN{_C?#@>+iH<%6JAY&xAR8>?Z0=v(v1G^#6ZWs@u2mvDtr!gY;)M ze_Cv-nYGOBz+A|FA~gqL`=l-vd$X62_RzU^wsyZNSK3JxL(<<p-hZ|i-M`yS6Nl_C zi<$r0ZmYs8yH{Tz?Z5cbmG<$D#rB6kLGFt`DLcc?aF3Y1y#r)CS~)hs{>_vpcK@eC z{G+T@Yv15!VehdHQorS&KVbK9!hXA1m5})#gXsbG^Lk&{J^TnMe?OSG+fTdq!KVEO zWWTSPoU8ppt{6K<OGx?UFj2w&M8{e?_m>d=bInb&7n<T@-|`kx{@&BbvM-Exvwx%q znJ;T_Sz@=oXtM3R2*`S#fKLMUm8XmByG$YN|B|33wsXGb+Y56*%EM_E$@a^4EwF3y zf$XR4xf*ZBbBWombJi7bc)LE2w=dSruousS+z+78XJ|LmUDy7OCFDGh6LWm+H*TD5 z7xWNPAAYRNvhTSbXm{cjr2qNq+z&ghZ(nRzt%UTK=4zj|W@>t97uE*JZ{gf;Y<*VT zwDypNoFD&no3{OrHydsL3qaE6f2$&U)3QqY$%&BuQ)9b?ed0P-J2B|~_e)a7_Rpqu z*>=`L!b8F|)PC~KGP_P0Nc@O-SlV4SGPV6ZA5uR?7{}SmpDne&CkiQF%LBLCsb@a1 zo4*Cp{+n1UYkzI(b34b^koo&P2a4>&d<5+u1wztiy=}Ig7H^52!db}rDEsA4?Nol+ z*mdnZ49<^6rq%YRj=I~&dO+6SdUmVWn;-mYXEhtrU-i(AuuIckU^hPyGM@W#@k_g+ z^MCBlEP?b-mVMu0t!TE>?o}aVf6Uo-C;Kzb=JtPlAor2v+9=uYYFcTRSqN!=@op-z zH)83xtF7J&w*U9mPP>XgCVNik`ICK)y7m&PrS?JpA^X2Io)+4AMHSe~9EGHZ4QWdD zlb?#%mqkPF<Gsw>XP5fH%l>K^Wd2scPt`7sv))cw8B!k4JG9+)Qbv>Ag&&ae%Py<R zzKb>AhJgvvUZ_x9VAuRZ)qYo7BiKDEf@f^|S4r5HxkBRaSp5sT-qu+A=Xsjo^tFf2 z!B+Y>mp$7a$o?TahG6^Lr;_%8VvzD<bJt<JVuM1vC(!lDO4qL0vH3CEPr3oAf2!47 z?fVw$*e_ZK*)KWYQ`Y{`OlSMok09&&FS7^PE3nwvGtGyLH(lnmvp?dSXv?7wIlt22 zY@I!GjGWzEfmvYpEE8h4e{xOQe&KP5{Zm&8+MmC!ZeK3@9qgakse<-W8@}4PE`;2d z^tzhSK7DSCeRsoRu>7;1=WN~!OtACe3kBDo1}E0o>AerKy|o^)USYRTn*F2-E&IyJ zko9}ZzM9#eWcX=kRt^~tS}}#&{+>pb-APeM|DwG0sLlM?RJ#|?AoEGT3s2kfWjWZ- zy8!VIQ=GD`i~16~TLF;%@0=s7_O_MD_Eim#@sJ}H()NL`PTD<`g{bHHnPdO{<~6&+ zMv(ohq3llf0v8?abweTRc@y&5?M^*bx4(N9Qs2H|;Ix0ZX|G-L97ujR>BnO)k(Xs( zc>{9(annXwdzV=S_7C+T{TG|nVfF?c3byZOLh7Ge)!O!wpBLIrTnlMG%1l(S`_Ck0 ze@+cDzRIcg*Oupfh~1|9KfvL?=uok}(Pa+1cO4M(SM=A}D%qsi|Je*FAH{#B*m<0l zw>x1AnV-`;6ku!j#lXH$Zy7lJPj1;|C(Bc6=OhX_FZZ5NhJDwUDEq)V$bRYlNjmn& z<{R3_E`XFT+detl*_-dO`+5dq{z><*HqY!??JF}O>jii&I@+&zqGJD06Vm=<dYfSH zwOqnpIRi2t_we;KJC_L>_NyZx<>R~a=Js9Z677EqLFV_j@#@&Gy_ILb`!A$F_+F*n zUO8)q9Vc@l*uDQ&6xr>aA7~f93Nk*qeDYPhb*B>Sg|0%v^Yuq1`@2?swnq;^&SOiB z$hSY=bJ})>0i^!8cQDj`nNzfVy%xm%(&>fvEA(ybJNH1^<Gn1lb}7^3?9Tc?_Iu1( zx5%!&G~Rx_8D#wMbb_?KZ8Nt$=Nrg=>b5vBdz}?r_F~$Q{))$ZKl_{@cYD^!kp9n< zD~b013q0&L$3o`Am#$Q^*X9eg=U0Waf5T>Z*iT4vv0ph2GM;v4>V3OB4Jmv7n~?UC z-UDm<&VFwD?;Mc%&Fym(?AKhdvY)UHGG8RP%-n8qy_2oD3S@ld4vVb)(GGR{Wmb^& zL=S#d*=x-$w`=r=^bfwNs@f}Mdf47_hU_=_y@T0aEjrI$cORs^6|383cbY}ie*Fx{ z{*<?O7uq`8?Y5hD8nV7J?NXh+K$fq4STtmOZR=_mds{C~`+Zl}gX1SMv)At8Y<0Vc zJCO67Y?BM@KQ35rrzHb9&uInUXS<NACH7u9kn(k<9-qDGg?#%7MP1<b_lh5;cG}-W z>`gDWfz!9Rf{49Q<xyK7Q%HFySZQpxs(ZVgxD}+mGiQ~Qy(;qqJIkAp_H^@IANx<s z@7j4dL&E!}g{1w?f4+9y(vbP$9m<9F+cLh`eR%=7pK`;6avOd9t9GAUAnWlIxVi0K z%ca=6OF{Gt>1Wz&%zk25{R%R^zPu^de&1<%d!K`l{@U4?I{VP|{&q9vA?Kk;O{%pw zo^sG`VJKw$#_)`w{nnCd`-?G<`JAk!%=Q*R9`?H0kp4u<#a25dvBP$ERzd8yDC4%D z6uZ<ecOPVYXw$1&dkLAfcIV0<?S&=!9`?%@ezMy+6;fZm_GGs|^Z$t5y39S`@SAxt z!cLNPfgR6!NdH4p>x<pyeRJ#{&VrmLb8|_U{j*2Y?OslX?Dwns#b>`{Z>;^^G|2eT z`apAgnPZ3SUT8zcD|h^yV|Tz?#r|V1<bL-(wkK^Lu-n@mN`>?f?(puhTfWK6?xqbt zIKKAY4!8BYQ)<7^1(IG%g%$0Ke16%rAA#hr!{5~G=SLaa`^iAYljeBOv|G2&)Gk*I z(jMH+BxyHgLX*t{aY+9!$ort(e?DRRmaCBQ@rZgc`<R1M?BqL>!S*?<7P0TTD`6kh z0&$OJQi;7ItC78z8>GGP>$sYIMPh@kwLYYOe`2@3eYpP{TjLiy!Qr)((ZeobuAP0= zSBQI?)wkKYYMi!9bAaqeWS5w3_tDbGzN;RxAFyzfpZ$WW2>U53Ann`0Q?m9-jVX4X zk0IsND*LH+3+MaWzio%qSLZftv^zNUgk6Ioq&(<3ZE9;2wbAaN8l?Zsyg1ihq_p1t zgAru>_uJH3``ZTk_P6&y=I0swB5hm^6Ya~lK-!0!qS)+Bzm?m^y@Sl3o>^sMU&PXG z=dS_D4=$@1?R=I_w7ugBnUB0}$6^2LpT52MVMuyVQDU|~Kd;Ju{ZYt%W~np}`<!>n z>~^e$q>tI{YW8=R@3nKw_5|nWf}K%zkKWF(n_>^S|H|iKnEiRlDRu`LAogp_6S22{ zGRuzD2r^$GdAQy7(wSg;D-B3}b?{k{{k(Dk`{GrQ{)7NOyS@G+1N)O7Yr*mNZ)35& zdP|C(_&rE|Gbxp{*LAkBe^vw0f1n}P)?+1${SL=?u=*pd8TOrrb?ihYK>W9!<+^R{ zzQcCE?I7#Pz9r1G(`HJx+wmg^9KY|5nAvTP^R;KKft>&A_&DEQEIiIWNE<SrS<S6w zf893FzK97j|MzaIy8YRi8|<7<LiRUtPc^qc@pro2YF0@3>HO@Son%R>{l<xq@q3vA z?slp^CH4xRAnoC<3H5d_FUHtw7#M-wtGh<WzJ61=eG?0$KNxWBwB6^U9d>69LE=L+ z?~+}X#uK|gPS3#M&HL5T{>{6?b{Zcc`;{Nn$Jq<$JJ_zi30dzJ(j;tue}}RCA~wkQ z(6_Wo`zy1r*_krAgWFFFb0qA!4<_0Bl|k}L<<?^R$sJ2=iw;53*R18i_E}mh?Y3z^ z_WR5^6=%P9!vgCqy^!><Yvy!2;mC7#S5`v8b7g;_{gmVYd*vUH{Z4*KC+!wSaM{;y zh18F`HO=hVHeR$V*a4XjQGF0$e?6+ke(od4{(-m0mfM{@SZZ&%A5tF1>t46b)8n&u zX@HDB|B80EfBu-!KFkoZ9^;111v^IZ)piLNXMp4H_@-3*;)p=I34afO`A(m=+Wk^u zuz!;Q3C|_cOKn|KAKR%XK-w?A4mH@FOb)YO{Q(jlf5iOkTY7oycc?)24_upf-Y)p| zDLc^#knyZt4yN`BftL0j(;@3upZ>pXcg8Hl-a!O1zMIS}VS99vwEgS{-r)G@*=T7W z?2}`&ycyCy7q76h|B;+&f8-`){})Sxi@ovg4!a+pAnT)^U39aPVcKMuupUx>u+O|_ z*PSG3uPF@afA0DcW5@UToLvTMFF3vI<hfw?$;01%tqf#*CP_=weoZHf{moiOu>B?i z7WVTxi|p-BOah0;bB{}QS2=6!*)^f@D<fl{xZBj;@)qR$LbgUByANqE><sN7@x@k^ zX#e4ClHIA<koJe{w$HY&&tI`iEQX8+s;K$eS8j>4PyP>Ck2kAmiJeVvyX}g{kn=dd zY(8$s@!_N0or93_F5pF!eWY5Ft-$nuVE1L!nApxVa<lhc1sT8Yd{Ap^9Aj(uZ7-xf zA;4~6zr5Jnz95qitbXF5<#sQG3+%6)h17>t@`?8EdIRkP8X^4=m)%D8n^+3$#g}G- z)yqW0+F#SMwg3JWvOl>YT+v?Bsmyk!Eo8lX)&(DX%bI6)S?!SZd~TE6?Qi+avAeJm zk{{;m?zKz5v&rt#4#@h6FPkjvD`#A?D>H`7ukCY}vP+zG%GS~k;@;^IQ|vS|Z`pB` zLE3u?zY^_bSIn_HqYRn9EvPoKS6<m}t(N->9DmzVa_#fe<Ls*{Am_iy&1JB;Tl?Q` z?j6W_(QJ1)yA5(P?TSqy^F^+bZuTE|7TT&iLdFlZ+Me3o__x*0>-AM|{MOA+wP&6@ z*H-uYeX#$(Tw=Gk7tFMK><4M@309Tb&n{rGFK>p7-)Ltovn#uL#*TYEr2W8I$7CO3 zc-(fwS;%^xwWk&BSz=DwNLfPm<N9~}vGcmhVr$9^>2G&BUa{L(V{g|x2hyLbv-Y$v z{ZVS4aCAD@J)S?`*a??kw9~7Gv<Lo$|FYxXHplM$eMtE=RXx}Kk8YT~`xc0QKD>Ej z$FsuQzH2h1{doWLO*@{K-)!ghL)x3A7Y*&Tq805=ltS{G?~Zc&^}cO(D-J;Bhvu6+ zu>GIqX#bZNGGBaB*ukDxU(ZhGEo41z*aic8$KxgT3!g&PGc@Lz+Mj8^W*6cFnSa@r zu+sKveull#AINwc{~Qkcs_CKjQ6UibMma{>J(Zqe_tXP2{!#Smg54u_OZ#nckoeZj zZn9p#>8f2T7o`0;ugb{YQ~9XfjwHzXp`NlUc7+Ci?GA{ggTseMRnv}bLzP|S0?2-@ zip>{o!(;O8>-IwS8z<B}u)J|f#opBz(*G{5nrrvro27k-8)W@v_Rehkf2yr^o~4lT z)A0CSyVb`&+D-R>l&_bz%G&ouB-(#k02yD=O|7<1jZLz@pb2R&Y|O8+XTBj~zx+1j zJOHznB0Epvdi!<3ko<75s=>~nNY!rre@Ob|JAKdYn`*lqTMVQ<|13n<UNo-VZm%z7 zy}^0~E<2YTA$yB*$oly(Z7KVB?>~045+V8HS8BSw2WPCk(iBMlZ{j)zdy~4ab{pS7 z%3rSkLH4~KZ|uapApN6T8Upqo)F0X<LHGarKhd{mGu5?kzghuK-#_!`*yR=F+TT%z zw6E6P)3JNCey80_==oTiCYRga)+w<6d>OJHL80`bo#l$DwiXVM@q)M;!uGKbbnKs} zLgH)Y)Fam6ZX)*j`4Ip5$!6HQEMIOrIR<jx=6_BD`%j<K?I#35=EpTwY_XeR`N2+M z7NozbTPA6r%c5Y{Ck@HJeXGOm^^4xv{pp2_?|l4PV|Tbf(f-hM$b4sNQkH!wi=@4Q zH>5m@FpIR$ZMtvmBM<4n%D>%Wmpon6-arGAUf=E5Y}cnCZqI)gGXFYLFVb#D^*_6U zWXO2ahe}@iEO}eIBhd9{|7UEqdq11gUath=e~!%(_PHKBcD}11_sdQ_$85i9Z<T%G zI>`8)(#{=r)8C}qO{{_R=bH`*+H02y+Rapk#E);Nx&7nGwf6HKLDnlM%+0rdDzd?j z=?i52ci_<w`<KrQ?fYjz*0*j*pJO+{D8v5R2FQ6R9@As&|3$pEb5($pAE9@b+WoHx zu)pxZ3>=@EjyBoxMqIL+HwV)Ga^0}rZqBb9`;X#~{aY<<DfUt8CfUigL+V3&-Kn<g zB%|$DK7sUa9ZyEu|H%`w@2P<F-|w$hvX|juvj5)%iQgOVCt2TGwASuLCZznxKTu}x z%BpH#F-H>I9@=bp-L7{IqkUd~3AlXzG_l&&ygS7H+d)Ws&F5;VT~on&+aI?f{li7h zeD<k5x9t)ZLHa|p&qvzl%v@sESr4h-iq`J4+w<h4-Lp-Q{Q|1ngl%iyRoUgAfQ;w8 z+iYN8m!4=Zwh}TQ{npIDKDIZ>{>M^Ce}0wYVY@TFk@i(#ko9*yw$=7NXFKgqxkL1u zq-fZ7*{`%?x(q4rEIqR9B}9eng${;+{d4t(kKKzTM!QZvNcld?_L5zwMwR`q%aHYz zlj1V$W&Ulli#P_EPvI(PwR>1{)b1{O7C1i6GuqjGE1GS)!W%N){Xay`-e;+^{iQNU zfA8Jb<93Y_qIUC-K-S}!Ec3J9%*$k_67>`ue*fND*&k5Tu@jyKDIfkfez)`JUu7G^ z0o`xKveeE-V4_{#V@UlT#wl+9dYPepGv|A-euq+XyINK$``QDL_RXR`HM^$0G4|`F zAnV;6yieFA-gma;>x7K⁢nqf1RXdAE^h4-}Bsm?GD__u&pYAga^;mHFgRnvG&it zL+Zb&ub<k<DM{EzvO&g|t~jLFzmb@4``0%X?EkL|((U6;ow2jt4modxZ?36rOJ1$L zG8bh1H0v7`yC8jCJGKtU{FK9N1^Zw3R@!yALiW?#%l>L7D{5(9*9@7D{8@X!?)Zch zyXQKP`g}vyX<Nxv=JxwNAm!tQhxzuOJmYQuZ-DF{+IBO|KI;{O{oG%W{^_wTytdV0 zr|fp$g}8ruY=d3ujG1;<T6clno5|&1&+fCq?oJY9y!um5p*?FNqrLNANPhVtVrwt_ zk=^dV8%X#uZarmZvPs7N4kM&L`2GDkTW+;^HhgN3^6lx1k9NjiKG~{YfQ&a@nvrIo z#F}Dz{0L+|&Go3O9gkG0ePiWZaD0`-FSd>RT5ErM3uJxWj9DhO6DL&IEm#Ig&+3vF z?Rxd<?B!G6fz>nGIomhv&bMEw3+XR)lufd$xS(VIRueLRz`sDi?qK*tTc;h6`t^aP zh5a361G~kuAp2q7`?K0-{#CKRp$#d|6Bw0jt*3F@>*YY|%ezlx?0eX4?XB7%?&qCi zU|(GvXg|3c(tm%sQ`JsoZ;bu+`H=i0Et+qiKe@}!^_(3z|Gbd)vz=JYVSA(#(jHIe z*RlWAy4bFK3#31{vgno_)3w)j>0FTbD--p$Zw<Dv)9!<mC$in<b{A5N?F00x!0|Jm zPv8Doi>>{6MacM#$?HnHmdji0qBSAwXW1E@?cd+gw_RfiSx;p0v&&9(W1!uubVz-n z&~@0RpOw!p#T_!fKJAr@eP@rOUA8u4JY@5WXLemhG4>hnLcs2ydd|;&Z}?=pOPe6+ zNyWd=ZXwq)+o^XT@$=<jsJ*#It6hc<WIdd1&SKkLn+ok2Za~&oh4;tV%WZS8YiWk8 zZ%rvYZP%|?Y_C*55A2_gP&@l2Ym)44t%lg&w7%H>g>1E*oi3#O&0KcJ?rw9AO~M37 z`7pn((EgIoJG)m*ko>@r>t_GwWw+glb&&pkhjEwfaStZ@M-7v~>0`GEmwj322D^L> z$b8n-b~F1{gPV3wdLi>`SK}4zjr^zCeR%<yubsXy#oqgYfxVy`WWIGli@)8n?0a@b z=OFEMre1UV)u)cyt(giLk7y{_Yu9BFXusPXQolB7McQd@ce3}m16dE;<(p-1sKRNl zlnl`y{3qRhQI?ebvh|Shfc%^)`?6XgJCC)H`2k<X`F6(Y(e}^tAmKODUCds9@4Maq zNXUGS#=&4)yTAi>r^_JrneBULcbrqi-X;<<f0>qb(RQ-#bh|GTA??{8hpO$l0=4Yx zPC@#Qo4FG0SItha_hW|Chp~@K?Mz>K+22?SiSM7c<L%p@8rgqUfQ&y!|CwO(El}6~ z#(H6JdT5Vhw4Zya#$Ie4q`tX5>#CiZl(4-pbiM7nWO;j!Fa`TmUPyY`af`)Xdi7r0 zstJ(ssPOhk`vYC>cD!>n!13=TDQLfFnwgz%1;l=Px%0MrShH=v3q!_7?wvYimlia` zF5(xY{FKwpu-hbJV0X3)(my^Vt!Zy-;$*kV1hQT(ORv~&+G|65H+IN*63Z58+bf)S zYWu?pGXK1jLCpS>jE%kGzGiUx$Z1co4|(5cH*X7M|JpNgdwbR&mu=U}L+V>i`%HW9 z8QS&@TOs+YY`d+!aE+_|om5EucWc^HJN7nhJN|x1`8xANk^SVGC+#*nXM)W)S}SI^ zvm?P)s}-`pb>F|;Ha;t++CAifj33)PPqIH#R%Y)T7XwybD7eh7wVcQP+9SyP;ZKI+ zb`SsFv}0eP3zlE97PNQXz>XyivR<HOZ>s&b^{Z^pe1!C0zdyZYSIQe~e?J%Ez8j`x zHb*vg+a>x#%EM>rY4&eglk8S}fSj+Y_@~6aZ{{AmYeJCqiR()P?5ZM9*ljn2v_Fhi zir9Tt@3ZrhhpZ<)dcfOmlZ=%8`%{eI{s+h98hgFDwe}V~ko3Z_@vF@xFHZYUGLZ2W zRT&ezIRf|WJ{Cd7Tdw}7wfCxyf!{Z|B~8R$F(kp>Jrd$y&79SC?0ekoza{(yug|J| z^4(5jhqb*>{{e7%`C?{ZKjmt^y;})n{>9GT){gD}a@&8+7U1wHzprAi@}S@D(-Kv1 zdR_EP&EBM~(@wz&GCuJsb-k_2!x?s`jE%tNZQwMt4}bs3&S5IVy-q(5*)cwRXD6cg z0W8n<H^tto*w!}eBxL=sZ<wC_B&ox86Ig$O?c)zLu<xjkwZC-(QXd{V(qdb)jn_VZ z9i)7|&l76z&1P%wzYfy=lbf1g-+cP8U2CNr*n9yiHhbG+JhtBs-2n3seNeR%Jo(jD z_7Y_L%1vmE-K9hR_DbrI@zLaYh4yFvy4ZQ{g0xp}$6mHO^?0Lg-9$)!nIY_Ce{7PA zz4^BtVE1{MB-*b&{?g8W9%MdFmDk2TuZGqBR0yR0n!KCMex}e?yO5k(u>D6bpRrqA znPYd|0kXcqg@ez&I>OQ3iWkzK+Miivzxqm+ee5wv`~8l!vHjfLjduE-kpA`3)>QlB zA3W_Aoq)vWJ9~b6d2JbcX;w)7yuPT@F28n<-J|J{_Iv7s?RM;EYVCI4Jq>m*lk7q} z^@eJD)gO@lqxa(=`(4&d_Jz>>4NRXW+Rj;;VP8-WDG$x-jqMLazqJeh0qHM1me_4) ztN+N3`7Fdf3vWrg*S>;wF00wV{`-5|&i?a6Sz9(g$oio9OE~O#B_-{Zf*|7$rNI~N zDqh9fZ&rl#=TAt6*sjS+x4X>@=^y!jm9o>x<g#aKfsBV#ZgsVPH)EIGj^EZ`_rEf; zw_h)M-!38*65hwI728{C@Yv<6LDmz>p3k&zn8sj#O$*XLRG8ys@Ap#8{=mXN;Pd7` zy5-nU>pE@6Sgr~-@5Su~yH}Zc_O%6&^c&9LZ0D)I&hA?jq`h));Xk{kRVVBgnnL!g zFZBtvohrm_KhqX6{&MDqn7zz|g?28lA@xtk3?=)9_w}|nHbCmf`+vpkr{$O0EM<V4 z7rVig#pceET>F(`ko8q>t>f(fI9S-f`wy9KvfCAB|F&Jl-svc0{C%BZrv1aODfT-0 zkoK~66Oa9t^=oa}bXmae=eQJW`;1N0UfBRLetuBM(|$v=lKrw(kooT$64|yNE~eOJ zK836=xj4trp5<(`edJ?EetRS2Vt;JvQ@g8ukor_?a;5#}?Jw<mZ$S1N?O&;He^!5) z-K+p^aCsCl+sk&Mhr6BrR>*pp?|J_AljN@33ap0gcUGRqVE;E&-JU%WlD<Db;INl- zHnra{A2R>KT3Kqpcl95;Ifo(r?bXV;_Brgl_6H91gZ)z%8D{r&LY1A&QAmG*hl9^P z@szI3U-^UJ^i}SkWpD3QWB(%?vcBN!y8yd?pSA5P`61^Y{#zVrw|TCGJ?k1s{h}`y zYrl$z!+upUWIViX(nY&VYq)GD{(AzpFJg(3?SXDV`wx#G<EP0gjdn*_*zM;QLgxE( z*PXI`81TZ*+5uAEO*hxIyRc8w{(v&1zr{7<gl)cbydBToFJSZjyMDIwisZ0k(TCip z{$6&To&1tDcK2>V=0{hnzPIDw&10|p9#a0_coAq{v+1&3ar*~w_(r?-+0`xzvUjU! zgqYWI-0tw182gjEAmO=pYM9-k@2_kv{z3d}caPPc<8qYUzvqzgu#Yy!?EG1e*v;{U zw7(v({<90x{$>|)8*(4Qq<OOTD|VFF|7nJdFBi2~*xUEF+wok3^j8+{`Da%eWo<7# z5z=0KbhXaj&zaXgG7AzPtDH~U{7wzAzs3V;j~jSyv3<2L!EWYFi2d)KE$lDPzHQfQ zVFj)qYMB%5)z=i;`@e<c|L@m++u2WDYxnj(<or9YNiOyi&W760XN9a6d;Y)G&iTeO zJCA*k^#7qb+1~$<zTJyG7r^23Co;<ZiJ!K8>;p)Bt9Na;-7ys{`%rgCd-vh0X?Bn6 z4D6?>LHetiDrUBv9Pak^DUkb{?ptfvf1Li$j<W$$e%^d>#P0RH19k>Fkny(i!^`YG zTE*EnY=fM)x+zf2-ukSPeZmn)dvWo)7k2t*Q|*}&A^o|Ouoye}Ku>#7MM!zYm{(>e zy;|A+$$m(Ef492c{;9-i>-|$8?K3|6xppqsXWA_ihV*|TgPz!3oV~#=+#Iq#(C4<V zJ=+OR>m})s^c@;4ZlC$*s9owENcq9TztZkQyqSIQ1c>`q|G8l2lDyN-b-x)nyt7-E z*nQy$v@hv_#D{sYzWs?8jJB$~A@g5)fk}3fCEa#cx+K8qtCQoF-R0~qyAN*-!F+b3 z>2`%zh3%O{A?3reHBt8SF7LO=ih#5)Tos+|UfvA0H+lr&&;NJSrZ(%Eoe?v{J(hFw z?T+lRw-0lG)X#>S=G&#eQLuY-9I{_}ANOUO`M<x|z4-+xpDw8=+e;i#x0`U}H28iX zH#Gs<#au`2xRyi8*WQRJw$nQO?ejSy<x8voTif#@H*J4?`v!LJ<BZpK4(ChlKb8uE z%ZEH;2|MRFDZA9|ko^L@@5AiH<&5pzZ$jpKi_d4-Ys6l(o4*v2K2GtQ+OKW5uxCCA zX|Eq*jIrldu(uCPg5=kAe}e6Ib{??{4~C>)b+HiproL--fg2&|H_7+B?b0Q`?S6G| zg6)_7tYYt6BW<4~44uEa=xo2NwbM2MdR|i5`V4!=Z!va3*CFf6?xZE!Uptv(tG}5I z9Do0pb=e92sjxqs2pJDQ_w%CNZEijLf|ro~TE;^Y`?<Va_Fsh{`&EnDzu8R}*<%;( z2T9Kgde`kvHG0^^he7J^9r<?lb|N$EUO~^R|9&yS-s*3GebkBBVE0yU`($f!-o*Zh zCS<(heCT4k)pfG=MM04E?SyIC_PnS6+6mM{+7o}(Jnh&lUF;RAA?FcttYfp=blt@6 z8!sgMK27no4;4?cpD_iJem7P+*~x6%W!G2j2e$9<n@W4RPagJb>LBSco72kfdLp}h z=}Aca=K3nZes=l=yY<H)_324VYrDB!Z1%^rA?r~>9`o9_m`2$5ia^>UlGg?7M9(nW ztABY8Hvifd5Bn>kX7;IPAnTjn#GkPXI~Z=ybLkXV{^K@7dyg<h`)v%6{UV*-?Dku} z1lnibhWIb{m6d(@LvMTj*^u!9?&VB&my)aO<Mbi+SriA^i~B{}haZFF|Fgxf?0QZp z+Maj|S+98VypR3e|Kj#O%8>cP@F$M;i%o6poA=g(?O$0LZddt=#omM!Qr@yF-?7V= z%C_%11{u%ktO~YIxF}=4#1hipSGs=Pc3H829gi~Pz7gMR_V!`y@%Cr*{lV!!xZli9 za$~*yxtp)R<>M(IZo5F0Ap56FApNB{GY0#-J$-h02Xnyb%g5t{9aF(VTknIA@s<;^ zjCSEdVfJ_4Le?uT%{^ep&tq?!{tz-A#8<J#u9M}9-L>BaVEt}f0(NtL&a%sy1xY_C z^1}8h?=RTdUxCaIzBCB2|7Wgf_vR5~eE6AiqWy};tL@}mA^fdX8TNc#AMNU;A@j4d z<h|`ve^=P+c|pbl*dLnPi`wt9(_03quRJ=7?0%m8Wq0Qkq&?YS^xN+I+*td#HIV*_ z@7FfF$aH_Z;s{9ppr)+E{=$y+b}XTg^J`MuTkKB%&a(gP16iMON!P@FtB$?>=UI^U zKg-L-HnRg1?DNh*&d*rayxK0{G>84UKuCWyPw=DNrK`*BjC>*IFP~eRWY4wV#&&NG zq&;ww@sM5Xoe6fu%OT@=L20J;&FpUWO2;7c16)tm+D=lEu-!Ke(*O7(QeeOAN3H#F zbx8keP2hgp4HXS`lawLrfi%rE?6tB=?E4l#_J^4*IcQhZS!plDmj#aRBYW@JO`bN- z&M*fuzq(;VnLWc5cYCRD$b80;-*4^CHEP*&D?`dxyQ?egG_@^k&0Qhq=S0})+q1rO zu;-H63{Ec(*QeXJEe*4uzP=D_e#5urcGbJw?B81kg860=2W>YjiL-w<A2NS6)6L!f z=5026r;=uHdajQSv-`3(-QJHc7tC+Y@331Vxz6rxA7uUFr^V6sJk_)9b{&PxZ}I+i zv(MP=V!!$cWdEjwoSnV7!AaYjrI7P{Q`gtp$ESGMCkH^vvtr&L8wU{s`<GuK<BwI6 zlWloFG};_bfUI{b+V<PlYRW@f^;MAdIbFRs?G!4L?cW+e=f4{C?EluEuzh$BvcIV6 zNTz*L|1P_%-FjgEtzGuQ?%cX$yUHNwc-}TQ`vcGF?Uhv__u1T^<!pb0#m;`MRutHO zHcUSDwp*<2x!*&^*XIX`+86(^v-f6(#GkxUsNJIYK>O1|5c^*LkhU+pR$w3O3R(a3 z-#5`d$7;7-@jl4<rZ;uE_J<xi+7_LIj8D(leaLRwqf+~`5s>qF*e2hwyP18(?kqE8 zKimFKF7{0uobCKB9tOK7B|ORge_M(Dx9tC5|C9?Hx3%eXu-~%~vcCUJ$3EL_+gID^ z&x7pONxkA`pRB@dzvMUMJk5l2pY1G4W$ap4K>8o7k(2B$Zeg>nD1@}%zP_rqw|r%4 zKcyd1A7<=yw^w)AWvf*LDc@$FFR<^J$ZQ|8Knm<0mc>i$`Zy-q<!eC7Yt3CI_N(%= z?efeZ>ob=x53w(<Znx8M_X4{&#nZrkne2AE*$j~JVzu*A?e6t(+HHWY2Ty%!W}ogQ zWB-wV8CbpL*}1l_%2Mqkvmocu%WM1D-%m`mZxM&A*WI#9#NJ(6)4nqvvi@>U<RZIA zuO#giA3@6VS1aG!rR>SE4=*(XmuI?}{`Ng(iuO!_knu)2<vX?+HgD|ST0!p9h+3>* z7dKDRu5T_R|EsLzvJaj2$nF>eq`$ag_6IxLOA2;dbRhlvOZ>d{w|3;)#c)8{BeJ$y z_OVkHZI9I*0p~a8mA~w`uE^Qj+C$PyNXB`)7YqgVb|I6%;b*-x)PC3M^LE^`!omDW zQatwRe`4(TV<F?S8rN^x-ELcI*Y*vPAN{L@>^p9JwcC0WQvbc(H^Y`|?Is&mBgpvW zVhJ<*%45InTr<PK;dddq)c&1;zU|bN5c@3kFWTxDnA$tufvg`cRcEv_7xuE#a)Rvd zmFo1j|6w6zFXRlVPtMFdYMZ*}zTG`T$ok$&<GFT6e^lH542SfW^=^yXZ9H+wE=?LT z-YEOznca$e)%KzMkoNh@kaYXVjC@;FE68~2yEY$tO@3E<{|3nZo#wZZ_CJfP?Bj|d z<*OMduib+gA@*I1A@dn`65iVFeN<u}p#iC%44z)JyOHf;zu*w0{SuNr%}!80*1pLe zlHX?fiQ1bz*0XcBfaI?(ldZN!@r&*1iXiQy?+3H&S17vL%e{rH$7xqfx0_g|V{dXC z5}#Yr`0W4x`e?UXZUQ*|*v}obW4*T2?)_)T{6lMIrQL$4H+JWHAmg`h{s!3ZyPIR* zlMfjWc2N_vU$bDf-SKTR!SOkzz0{t8P0{|!OUU^XV#i(VlY%1cTGJr=8)E<S+lPFc zX?G_H(%$<s+r_^1OPn1$C!~MxB3^3W#{1ZA=?%zv3@$1`cI9vD?Wg>J?EjF_NU{66 z;-KBM$B^}z-~N`{-_et|KdT6t4>{7sZQmdHz|P|?r2W%!X})cC;whV7`ylPPjMWG2 z=HIHee=ZDJKcRVn%YN%Z2YXdxNdGyzIl*4VX`$U75lH{c{TaJ`$%~b?_bx)t$2gT$ zVz2J1YU{WWG9L3jHq5rKwAxO;2f{ColefQm?!Db4DM<Ou<-}rt;M9G)JCh*tAA;iT zRSK%@&B`F<R{)!=o&WMOTSw^m*nJGH_CXB~>>ezJq>tB$g*HI~)%H_eA>&yl`##$3 zn;dPw{263EJ@S0E9p{&0c5BL7!0~rpEZA<|$@O-%4e8+g5F)2wA2aoo-St(F{It)_ z%vM2Vs?9YUNc#F$7jCcpn#2Bj2ju*~8xvaXOlvOKWqLY+<CFjEN85Gv{Ps4VA?>?{ zm_HVk3@hz^*g)D#hgZkicXV&C^YYaOmp2<8eYd-(5@^ry5YpcNxBjY~Yqz5<Z#1O5 z%J_cQ?!ul%yY2Om^(Yn3f7$K%lVIQ31xXL;C%x=75_9ZV8AH}T{bd!fS9{=WA5sl* zpRtCkeX!6~n-4LN`0U+PYJX{tuw6wF<i6N~yJ2>*dxY(7#X$0F$d^?63ER|c<}HG( z7oG1YXrChS*RJL`WIWPD^q{R_N~XQx14wy!BuC!n^!^QYGxtH-7qZozb_*|u+K29j zjOR#r<k+8_qhMbv0|~#w)e`pN-A;B({y_4>j9I?+KTeg}n=gg*fBD{DwQFt7w$JW? z%r~iC5w~ys%wpG64ROz(_LH_7)SlVIib2Nn=3OqbzfvS&FXswrZ%NITwXd3LVBf$C zng5#lZH1klu(AEpG)VvVSn&+IJr~ODdrKhe!yjG|w!0#cVqdjm8aV#931->rY5ufZ z^%-(r#AcaicCm3&?97BA``@{q=-6yiGqv~Dgp}vM?al4CeVu8S!3WtdSG!xlerxy{ zyUPWT^s{C0O}h{OHrm;(hLpdVCGPf<W|i6RaDeoux;L5I?$DlQcX~Ob{5|(j-G0Bn zxV?)fq<z2W!3EpzE;jZzzC!AszB9&lYs1v+c`rf6e?H!PU}vUr+SZy8(w;xIQPY0= zkq5RP)gkhdHGcM!B7*JDC_&PHn$!|od5sfxK64@M=iKtccCVfW*vt7r)^oi$+h-RP zC1Jne1*AS(vpm+m`l_;h&p(KMk9X2`lk%q9dHX@qYlg!GyIspp+qI}c_Oq>u<+X1- zCS?EqCFH*2+xu+nZ0`BkH0>1z=eG&%H*M{o>e#2-K+e~D9ARU>{?Io&`2&#onf29L z_Di1d+sCeelz*Y8>g=Nz6xt`efV3xyBy{YpWmD|3L?G*lU6>Zw-6-E`d-^h@y|DdX zwVlbTGCRG6kon)AzOMEMPpR6+ELjYW-zfDzHmeu<*zs6H@{iW(0(<8TN9<bjAn98{ zs@Ps#=(k<Ra>)9j4Bj5wo9*d#(pw?*(VwCKo29WS_VvaP`@U*#viqf;Y;RHm2~U*; z|Lt-d`0X<tA?q<eO{})-bBwo7`2Y#eq;rb)cR4@Vew+nqUnt&RU}w^wY`-ZL(!a1c zandfoAlqK157ORh{N!jm(>lifogw7BiM73E_B%uU?E~|rz~u+Oc${t8^#ps5KuG=C zGcCd1NHWF#?K((*W_m)K-R3<dcF(Rs=3COT#O>|>+t_==Le_g(trxP}{kYnmp${_t zZ8XQjUT%}DeSQXHJW<(P%YL0=p8dZmkoyyYirws{a4)mlKNFJQKWgRJKk?jW7jYHR z-g+e@X!~=@T3aD)h<_Uzl<ge?`0Of}ApOh!#qaGpf?I7u%^~{*&oepMUD(=Zcijsz ze>5xH$KLm7oW0HzNc;9pUb+1*w-}qn(UA2@Z=OE3_T%-je}5mc{$*afrro2CH+FLw zA?4*gohUoEhwAooWFhCL-kfY<XU-#HAE^V$|1Ro(ty5)X?SI^Zj4vdps@k8jZnWbl z4h4s2!h99GHTf3yOXot$n<i&L`-Be}_C}8&=hdcJM%n#xH?_aD7qUJn|AvJ9vu!%| zMSH!$>D!U5+<sG?p1q3=q`hJAtjK=mg9!U9#%^%^aQ1nOJ@4K!+uw<h@zeR0=WS)3 z%j}HuAmwkbw3&UlPMzJ(7|8fB*VprQWgAlLe*{6=GiKXL?e4Y2+Pa<G15VEqBX`(d zke0V+=;Q>?-~HlCu+v%<YTtYjGC!5X7H?<Fde`of03^Ly9?G`cDtOxNrUm3aAEmQO zwj%d7*lm3d8PDX8o^KZu9ctGa45`04?Mm##dgj>~O^gP+e@m^M{ZFGcHb?G3&P(&= zjJ3Dgam#LlJ)}J$d%D1G)k!UTpAV4p&K^u(Zg=O3qkXbHBiOy4R;{p`eWTJ|VIQQv zK9a9wdp5((uDB7>A2=O%)2><crri|i_zz?5Z#(t;w|4hBA?I6U*_^kNPIa@tVhicN zmOegc7pNX<({L3sU&MY*+&=J=qrHSVWPQw(uoT-lzvb-hW}O6wPt&POb}4$%_V;5T z^<{c&kiGv)YrFDfNdG#vFv|X{KePQB5lH&1)wi%eS;lMMwFI(0<QiL_jlNoyeag$D z;P^geX=We4^S#}^vyk-!8AT5EPpjhXzf6bJ9}ElMncLlLu+xK{w-9@s&wiOxgng?X zH#j^lTk_cPccj_3u7i|EOWTC(7T%g~_wo*8zOdt8fc-r!PCJ|Hko3xXu*ObwPmR6m z97z2>%SzpT(rXj@OLHOZFSmV-b|<4P?HP|i`eS!x`s~!S@7o=0g0ydazdGB$m3OdP zerEyL{@WTaY?9O+>@ox(?e9IzbL`9>+SzAlL)r&DnQQG<y-&3FnGV?x>YZF?pR0Ar zrlbL~-`vE3(f)RSxc$d2$a<v%u|9U+7`EB6xkKFlspf*+j$gL+38x_Ex#|^a+ugod zXP?*y89()1kZwQuLbu&>cgXn73-(90IX7i(-)lq0XWWY%?cRRtusv=HnO`{egvGwx zai85UUC4aNg7t>>O;=6r{dgh!^E;Vb?ax}6*nicBtS{x|R<vV$5^5JQAF>``>sej< z2MQPMUY>{4FK>bz>|UM=uum6-j8`w~J7;IQy4v3P31oj;`s(#|jo!)jOFSXt0n2}y z+t>Bf+h1aV<R@+K33iT4?CpA;ApNZ~TUl+doi(v%Is~aNqKeq<-~2jb*D@W_-eIiF zu>bpC*Ur%qvVY*4;sU$Y*5!5!CqddH7cKbhS6H90K6n!{esxSC)&ArZH@j6UAnnCs z=1Tk4Hxl;ugCXf<{eNp)i$ewW3G*T2E3;0Xu)Duo!~VWDgm3oT&A#+uf&F_CNPY5A zG0X0fO{IO;QOJ6d2g^fjwbwJ)TPHxuKc+{b_7MS>>@2Jj!1*O;Q;@y7rKSBZS4jGB z{oZN!;qe5!7ip0B3GvncY=3x}*)6*PslRyZyzLJ~NZG9ufs~im7eBRI7vX6qZw<L` z#;35>{>LscduL~ed$i`V+sC-<w%Y++|7(=eY`02F!oDjJGX8pRih;dGsjB@ICrJB8 z@++(TikMuxhZd0h9(<L}e&6&2TY)E#`=kOYqU~+Cmf0~pfwU(D*Spy<ZGCFDugn%) zzGt^s+M6d;+P&w2^oOQ-M%h<t8QNc#fUK|mbs^jS=xjZEVL3>9$W}zne$V3wJ7E^c zd33J|7ugA1dvEvV6=XcRepadd%>RmZ8V4ZrsS6^n+A@^t+1qW0%$JEi(XjW?47J;J z0MZ|m4J)vh6m7G;aTH>|tQCX(`8zFkn;anHBl(BR>@Iz(wtxNua^H#ecQ(5Wn=tzW zZV>-XX-=?9;&rlD-47Xm{$ZDDZ|8i$&i?`AK5NVW`Sw$yEbV0;L+W4ES3>r}U-j&n zk|F&oORs2q_XVEzEE^!}(cUucv)jS()GkyB(mydgRAB#U%Tc=@Paye?vm?}gnn<$! z-RmLX@~(ZMiQP$2W;;VSNd4!j=xkrb)@nBsdOmEAmx`^6$5*@G{gClUhRk9MlVkhs zW^IJ1Z+owAx9rG#J3SuA{-eM5{Ov2wB-uAILCRYOCmH*VVs`d&ZIJbvd>3}uS{;00 z`&bo{9>Q(h?W>o@+V*ij0K3Ouk;6VADcSzB2&DdBSHf*C5Y}QFxD2v>=fN&6d+s&C z_Aa|2?eR}l2kbU~h_ye$2w6{2a<<&Q@k^|I`DDoWFkgMSy(XKyZBid(y}nJifqlaH zNc$jlNdMw-@)6quN^k5=1wqa?=7^bMm!!>W&%^~8pLr3SXJ2@Jh1~{A$o^56kWzd0 z&KUbgf26_nr+H?)efID3cCXYS=dsOk&a$7nqsTre!5CZ~e{YGilX<h$Zl@ZgK4w~6 zZ_m;`)y_&9vYxw6Ud~RwwZ(1@H)MWVz+c|}^w}c&Ker(5*PV|l?Q52p+7@nv<i9By zQ*37lthU=H4rvdo&7WYGwxiu{+Ff~Y_+`K0w!eEY#jcJ6vR-D%Ya{!Dvqx;xcp&L* zUTKznO^~^b{O>fd`xmb+wU_^uX?JZ4Wc_)}r8s-FwhX(73dnfW)VHekmx2!4SzkX3 z_D}Msw{|lsE3CD<J;3}O0ql0hx2x<gi|+^XMH*Y}!dk*?d#*wDdwJX_u-}-!+OE<a zQs3<hFSd7Hl4$?291_1a2|@PH`$g<mrMrOLUuJyTmW%tJo$%egV1BOGGP}T}mv#?t zLC)9XxfO5E!M@z?i!3C)rv#bXOBGhyCtE=JkKVk2_S3FBu)AvjX^;Gy8f#x^CuGmh z69FzSepHm&Gye~<4=sW8-)c`Bwe!C2YQJ>@<b2u#u?uav^eydMn<3|stXy1Y@7m98 zACUlY|GLGuthansu`iwu8BhA(`o-q8RE0gOIHbMns64^$`<HP0&RLN8$yp1W?4#ZJ z?H6-H#@qhhkhAw)dBE<@Ye;)|i|`M-Nvq23(zig?yIj^@VOP@UYnQbdGCuxOBhBuP zyO{mfE=c)zJ?Ev}lwvLWy5fo8_`B04Xm2B~Y0u&b=`W<8Yqe`Rqh()M3)!EbIP00+ zmI5Pt_sx*?->Vf4+lDk%*_+OV^iRKhX}5i+WNZIzDkOXYCpg*M_`cn)a24b{hB$`P zcE?yF?3-3W)_3Y;Zn4{&XJB{F0+K$N7Vz8M_C9S_%m|rZ+E!$29~l#6@B0N3zoj}g z_F2cS+jVh6+HaMm0rr`v^z6+OAmdLd8I$dv#&Xyl^nmmiuku>kTfNJ)6FUu=?_loh zwu$;O&5q?AWIcD<rx^RY9CPh{+s*~251|+9Z0E6<*l&9eiGSx!JoYw|lWhaG34qgM z%bIAri!B~@OOqh=<F@PX>|RYywGWqu_&?yl5xe*UiS`daK*lFFWtZ9CFg3EDTn3p> z{?8X`$Mve({_rJ8dx*tI%I?8;Gy6b4NO`(-&m`M`5NrGA?KWWhX1iM3Z*!BdzcmxG zKBZgV!G4Fbp8Yb3RIt2*ysZ7(@NBz}p^)_{OSRPOEt?+OJq?Gfm)duKneBI-O#8zB zkn^qGFYmUqmzr*On{fkJzw(u7wu?VD+liP#%DXw*Z|#&S-`UA2xPa65#Ecqyp_8)q zfAqhB)5oK2HuftO4D2m7MuPc?^&a-^XRg_?Y=*4IFg4`1GY{9ZtAMVbjW2hx<J;<C zzkLm4{i{ykY`e7mckKeUL(b3W2$8X0y_?xS^4b)zds3zZ*!wR{w7=>P>CY{gl4gIo zzQlfy0%ZNkmQ#B6PTJS((q8QXt6zNesa^7)b9V7+kp9dCraXK9D*|@>eW$?gtJouG zSF$C?-g_-%J*JXUvAqOOg{`DBWIk!n$NP3hwvBe`KOp`Mn<i(c@6KnR9uGOM@v_<? zyE}PWcCC{k?$3-lZYOO}ZGYJU(%zT9=4ikBNTU6+9gzO~wzr4v^7{qs-OoYttN)5m zc5)NqY(CC_v|puOS=tHI7TWhTLi)RX2Zikm6W7}^=0Nh(#=9r%n4SvQ9@++(KX{yc z&@PtmlU;NuWc^CQ3NgDQYZUB7EFtH)JYn8!r+c8#zPSK$zvR}{9kxgAtg_pA0W$vT z<)>xOsj|z~APO>GaZozJZb#WCyY@Yh^J4FYINP=K7ug>-gXE75ih}kU8Z36#H$&3@ zW68C)Gftb>vn_y>H?}v~>{~CNv<+Ja>0dwo|Iy~ijn8%**)PH29re`1zG|Ahy}c0R zycbpeBeppbmG&$Bo`Cb0+Abk`)q6^|>lGpMM_L+8wmLN?_8V70+Q+8z_u0ud=h$x% zfb@TzCHm~<A9`hLu>ey4EaLXGW2w@!|Kq3yZh!vE&bM`tb+Nxy3W@)NNvExUy_ss~ zwE>bIrCn?7fAB1|i?oE4Z}wjw+ii`zZL4Ms8Gm{n!*2g}o4?&8Z^(E{Og*3d!{u)F zC6$oyFcHYMPdVjhzYsc~C~<nP-OqFjyS){V`mOQJbUS;WS9XFIA?rUMMe5mcWUAY1 zPJ^t6dBtRCcOu@*e!0_QaC)7xEz!RBo4Ngxy^!@7_tOmQS6Z9e`#puUce<G??G<jy z*r^6W+S{AV67BUT>)A8E69(&dX>zjH^D41B_zW_Bu;aI`{l6{+JJpSl@$8L{X50C2 zu-hx2hP3BIv!d*K{sq~$J!%HWkD4`$J?qpud+#Vn`@y;`#{O@Zww>@U$b9L9cNO;5 zM?GvE6Cv%*BeM?J8Gp91??2)Pw!dZSMcaMfOzmB|Amz!`=6w4CU2*#ZTOsp3+YVLO zr^Ro!i*@=3R$so-!#*natBu$-$ozrD)^m1kmaFZ;KSSc@-?RX`Bxwh`#~&f%k*s=e z?EX8N*gtQB<oDT+_SspT5U^h!1DTIW(5|;XwT;vM*9%B{f^o-MI~|rRd)+&b`e5>e z<95?;x7l1<3R&-d>y^0urd`GMQ4A3GnL2*8%c#w<H#-2iZ~Iw>l>L1*Q~M9wApP-= z!AbVlxu4it|A4HY^>8<|FZEk!C-NUsK86-8v$NgjX0O)t3ml$82a4@A_et2DpOOIf z?+zJz`&HSZcH##h?c2?);`Y~af7m%6fsEhOx9i)P{*Sj;_zfxlr)9pile_ZXZb>%e zJV&prjdm-$itJ0$AotlAr;6D3f9A12cHtJ-{M84-?HT&-+4<!`?$<g~_|Q(?n#t~5 z6Quw6;(nUllm6#+qD_$bGv1$O_8bD|?X(_3%7Z8-SNo5Xr0nWXL&gUmwd}OZUuA0_ zA`DrdyrnJ9-oGc)em)~){B9-lNjsCK19majA@$vI^Ei9^Zx;6J-$44)2d{S6J>E9U z?pY>e{P$Dme!Ic~5xcWVyTRepyFlEY`KqXWYy)I{Ms_cQ-QOO6dj$?id2;&1Jv**8 zHhT{R$oi&VS5oYc3rx3rXaXt!zBv51yXvK3Z(j@9kNI?wn0@C(Hv8&zko%fjmhjrg z24~yvTm$J}8cnFNXX*B|fA0!uKM3*ev2%}$x6S+qDWC5@m|?fO^tN4_6lA{rnxdAy zf9`4<f%}m1L8wE~PV~2^o$3?FdFg6_mu<Bli`e%uLGs6>FVF3~3O?I?>VmXKwDe2t z=SNi9AHNEjZ+vR$Vb}7T-@e8Q(!MqLvdPYh;jQi5(D~r<@1k0w{qe?&wi{a^>0eQu z-L56~gWc3>NO@~`Lf_tSxr_a?9LRiW-qE9We3S0l?N)}A_x6{x?Rm7t?Ohci@p;70 z#ol15q5U-*d2sqzvgnxIGg~pc&(Qrl9Xn>*iGMw7tIP>WuUwlF>@8+Zw+mwo0IQFR ztg<(8SG6y0fb9Qg52?3j&117)y#TVmaK}ww`?Ka6_Tuc2{;_YUmi^!V>+L+(LDKVq z?h^ZLkF4wi$|2)5*47<%uQJctMMLioaL}`~f5fL_XK*hCoE~_Uob9<o`Ruv-Am=kO z%;~lBH;l0l;D+p9nsmw8KJu}R{gEI@eZ2fqfc<70bNi3Rm%;jv6jj^rnqX%CmmOlC zaa)63Q5K8+X?sY1HT0^r|Mkzx?xa0L{_}^wcE5Ca?dp{v<0F&r-?Ov0bk1)6?mn>p zRfWp!3u2k<HswIZTMnx^+GXubwl{~~FS$*C-+q~_mR)NiWIW~A=}$JlBlGO{cAfyc zNBO0<{URNE`)-~)VDoZ#!tB!KTiJUHLB@BIbj0i$9#z>_{e+B%JU(S>zd@(MzS;(o z|JQKo*@t+&v-{N!X^)0SZL<43CCxrT5OQ9PJ?Aw$iRH2OCln#`hiC4q+xPLr+uq?@ z1h$V=;h9}MqpZD%Dy04E)N|SP?sOG<#$L$z7H4z*+WlvIX!qD3GXL|#T*_XWMa|yx zJ!Cz0`;;4Y#{J&*Coe+EUxwpO_F_?-_Lcu2?VImx6YRJr$J$BCc7p9I>n^Z=H&MWT z+73whAR_+Ls&87g{rY%Fef3S)#V)E$*}gm=8Qgx{)Z1nE$Y_i0w?IgKmJ?vHpLE~Z z&UZOvek|VD(B6BUzWwDa$aschv#fpFnaOtBcIVoiJ#)rZ^l67(n}M0V=#l&2{1fbw zX3zWnqn&vKWc=@p6N5d|ZwLEddm#Pa{4_!PiZ(<03v(g$FPl84Ju|bB{hL$E!RBTD z-DAhdk!*iH8sh$ldChhi){1t!mEyquQ&M!Y{}HES@0bAz&u?7m_G?vk+eLRk%D0KH zf7s0st+ub)1zE4P?TNX4mqMML>U@a&^+$I0*9^t&!gV3zi_&HD?40=3?6<o?=1Z&( zY_~mfE!Iv|0y2JgzxSTq_9+hbn$nQ=M5>Onebnq9w!v<Y^?arsR`z;F585#oLF$u) zED!r<d^~pFq4z<F^u4h8@JhipC>aueXU>$`SG2I%zp8-DXRLZ_VYh8br5!ILq<pEl z^30aSr`BHO;4^Uh$-0omUWIR_-H|(x^!<`a*WT#gF}u<rNPCM<n%$oBSdhKWb4dBO zedA2qyicO`(|<wMGbBVZ*}HySU{~@IQs2u(pR<+JIBt94AY{I8zr}95^Gg}*^zK8} zGi>@_Xa8^GdRx8{$b8V83TgY0<PN(BFCqCc@bf#nVu?d`%u|ZM@e$Vd$*#0E)qY6= zWIgtteipmf1|j=weaQTt$cZ;rvA56ImVAYbpG}BWu<vp+wrigc8L#o*u+NTJTi>4Z zC}jW8nyi0z>EAr;JKQ1a?Zlky#l5BMeiuOc<KD3aw)Z^6?5xuv>FIH0lD#muqkUMP zCD=Xk;U)GTgp%y+yddi<Zi^?_JU?w{ukH$2ua=y+&+gj$Ap4JtAmevW89v)ur3Kr^ z+CkQTO$arxpVI!^?vFiWeyzwh!v3RlusxGCBt5*fUuf62Xo+2hp)xrC)ICqMSF>4c zt9Jy_f3J!Vwolv2Yqu;6vfekVeyiP-=X-2+CK`a%n{GT~7h_jtU-}HvzTNpZ$bR>} zTKkwykow-FQN-@%y`6T+E|B$2kBnt(h39{>yDk8kPhKa<V4FTg&(8D=r2m@X=41C^ zQH72A3rPLC_hg7IE9*+TJWGgsS?UbznN~#FeOdrX|EVos?5YlV+Q$`50EgEG!^?Ji zIE3t+*FeT|+OM3qJ$Z}EUUB|JuzZ%Ig$?V*-FDwKA?01-WLf(QKbY(#jzGd!FVfhS zZx4_CR6~e={#MVhTe(-nzG5rnKA4-5t=7)x-R-ZP+zU1@>Jx|kJ?T*Us&dHs$qC`d z>>kf#wcocCG9FtpbFrQ1oqGF%3lMppZO83yy}V?X{t8l_$SnMBSC`Lh->i8LY+exy zpM6UJn|+!!q<tpzUDkd|Kfhh`G)VvP&O}|?2dOr86N4b@`8RVF+rL@&&F)m=2e5t@ zojW!mhkw}B+=q-0J-_nBwyj~6P1JA5_;%DaF8dk(FW6OSLE0<vA587qe5~x3Jc5i* z1w4_okGJ_~YyS+=zqoCsZ720Z(*A20<i3`3>b-V`pXBWvmqFSyvkV>V=Y4jySL=eb zk7ZBT*zY+LV86Tg3b_1?Htn&?zwT@=@*7frpA9`>cX5Z8{k|AT`aCK!#V#*6)4t0f z2dsX<_60T*f?wFlBtpXLi)pvrgQbf0fnOxS<*5%3oBdvmJUa(ZNP9u=l)c@Vjc4q3 z&4KJ+m^5LR-Pt!f_D3}?gU$0VX}3LRbIa~Y52Syxp(4XxV3xYwf=I~v6F-@J`(&mE zcCty3_T>@1M|KiAA@;S)A>-E$FYejh*!<Bp^A+Si<RhNX>>hmJu@g;)gnvP3ynV{L zi*}ccA^EE-V3$qZ<2-wJJ;?e`&v#So0yccJ<@x}zztUgDZkf#wyR|zZ@jGdYo!wm? zUVFRWkn>D9tZM8fxnJ7}@<HyiTQOPEeyj6IyDyI*_1X3#RrWSJL+vHxAp4oacS+gp zi0ZQA>xP^!)3ZL`&MwHpet#omJ;#qASNnC##qB>vK*qb@#245bRms{H*g*1+!n?J0 z;UClOXR1Ti)27eiw_BmvVSCm9;=d1vW$iboG}?K;-3U%!diz=IJ2n>EnH`4gclfwK z)Sjy$%w8}R(*9AB-(q{vCD7hi4zeEeq3U(Ju+Qc8y}KaymzCd$vwv3OZ})tzGr0W7 z-SW!L(5TX0s~a+3>!0@0PHs}B{qg;f@eIBDNA0488tvpZLiY11vOKWse{jMscpGHA z?XFR!{V!f#n~jSg`y;bB%5Bp=v)Rk6g4Abwjiv3kFM48YxC%PoJ%ii+ZGw;8iF1(t zhe_UIJMGnS_TMiRfc@9Ty35Xu{kPqv8<6^Bc@vY}&AUbR8C8(`25QfIw_{Q|Z+HKY z7&tw0`@FQ9(coo&x){=ba$mQ~ZZTJuoi6lz#kW#@b`sb8>{9PR;@|bnCp$@>HoIwy zA?*Xh(;4<BBjfB{&Or7jt2SEM={>z{7h4A@k6lW-?KZBowigVBthZX+x6*E5@=;su zwUGK~*Jg413X@bj)^5mp-Ox+H_A$n$_BszPfc?YMTxs8#s%|%L4y1l~T)E$lC-I-1 z@h`}Eu9b5%?f%%h+0R@F*)P)UT5ex`q0a8+FG%}nj@~poyT6Kdt}7w;ofOns+Z)-h zv$J%E<hNPh_uB2gDP#ZY1El>HrmASqyRgtcZZ5<<OiK^i9S`BOuXzO--_U(C%hud) zm)%WSNc%zenW<es$XYw=?~wgCZW|}qN~W9HH~B;QBYUs9*jb!Quz#)#*{^NQ#bUo( zIKqCrF=YSS5{(PCN^5xR!i*s8`R$Q>_7yAQ?2qh#j8{BxylE#ovCQtD3Z#4wu)bt7 z`(&KGcsgXf&r;vgKEI&OF1Q0SKDAX+)!zB@QoFlxkn%+)zsF9un8AKpBxJpcM_H$B zSf`MEd?VyMVd1sg?2hhpwx44Sxxb;e;<_Efq<%XoEiG{PD_yg;*PL_MZiSgSIK7zd z4YWI>USO}D<PMfMU~07~pSaWRf(gXGilq<jbhaL|<DLMy&r{}|pM9m@6I)vb$ohr+ zGBf*@#g6s|Dk1wl@2XbYdnf(2*}OR)Y<_XQnEh?P6Shuekp7;MLx%mS1262@O(Fe7 z-->ItYh)7a+5bV-ldL@^YIp9Fw0*t-ME~l#Wp>g@0rqpxL(0DoS^MpDyF%<2?}7C9 zADq{;ukP%!vlNH4?;mXrvOhCzp>4YW7uY|{7jo=8R(jd@LeDonxVFq*^}MV7e0fO! zWLuV(ox$84c2$~?^zg8}!@5+q({8`;ez5z$y9(QP?A~XmI}5U&;!pc6yZrMk_K`Co z>n)`OH0_V_Mc9}AhV-u(SwihU3B=niYK4@K9*w*0WTqtA$De|%@7uk8vfV#-6MM_Q z5dWV3xWw*%b-sP$GRXYhl-Eyf4``;@`#{gv7rL8gpRIh%*6s+T{OVzgvVXbioNbG~ zDcFDO9n<VWq;>5p6Cvm6yvzM$*Z1p^txf}^eY9}FO1tcQXZsI*koFwYQE%&<VhMZQ zU`Y9!9>{1fU{Yr9`5aQ7^_chB-4<`KbJvIDx8KPuc9&a(?A=#G#%t^MyV|=s>D%+J zg4j3pii2H*yqtZ>Ovrq0^3O8+6W$-}F6Ke%v#VmlHUZlV?L9>x<5Bv*ZrVw0)wX+k z334BE`>!2#de#5!+LIyY!=5(~u#4$ru=hIynGa~L<+XE5d}|%Y02zNayV_wR_;#Y5 z4-cgO^08FXo=^UYo%}>d{jitwqpg&Uz1>t_$b5_4HxBy<jstdkKS9pRk@@XmEBAY? zoueUSe5m=Kru~)4o9v7}_<{Qa%R5T!ncUs%Z-0QC_h|EElbxs_x81o)Nc=LKX0-pb zpx16Gj{!J+%+_nQ+Z=zzZhbi<KdqTwY0v)lj@`=@kolb-iwo@g`~KSec?=0({j4u` z8_Xo^1ZT8@<FA&(*!~r>zI{v{<bF}B-<<YyCR^L@-2#cP+rp9dwkoIX=Kg}rSDt<p zY2RbI#cri5q<qkSu-WEGkFou;c?w|j&Py2D_r{0Xo!<i4KlDR7);{Updpk!iNd9!1 zr*FH9_pzN2vl`g_k>?ogSBD<4d$Pq9%wLgm)b4G3jQy#vkn!?0r=HnmW$@cSyLlem zerb_Ov6q)UZJR9wSx@75QQN+*yvSZ{66E}V7w3KKJ)?Z={r5xKR})1|?7e>m+Mh9i zocGcoZ)Yzh#B8tQ0ZBh4^YU#~Vh-53Plk+7YOr|Ozwy6j=V1a_FZi~l*xvtJj{Q#; z$a>ltCxq=>1Lxa4TLLLR#BTkt`^oEU?_df!@95TRCi_|~b^8m4A^qp>Kb>~9-<R5* zTnLGud9F9@%wqr9?skHl-zb-qXK(Q^*q+S>QXjhP<g?qsAY^Yp2a-P0gZS*{|5C6w zs)6i3h&lbxuK({<J6px8;PAfm-^D(YeXrdyzt7<Cnb!Hu?p7(Yy-^z^{6uHR**<$z zZ{OE(39O#&j=kN1b4>RA)sXp&*XOU<v7U9e&)Nl9f0+>=X&<mZ(Cz{^WIwF(WMTW0 z?%Z|<otVJ-gXZnGYh&oOd!hpA&v?q}+poG5V$V|tnQ#4SwAXH9LARZ^9AtdMrTUZI z(k5-&C-zgo?vuE|VE^?GtNkr;Ncm|f9bv!xnXvu-Uy%Ndb54={io4GC@1{f6b6k3E zY+oj3Yu7RjQeMi(d)Tv1^RWMW3bMXHcu|dgK+q05jYP=${M*N8*aZHtwwK-rX+J2x zma{j}zGjyn2H9`4j4R4sWWA^TgvXHeHy<?^>~n9n+U=SRDQ`ZUVzEDW#M!?7C}cco zijJS{|NGMR;q{R4@3<>s@8rX0|8FOxeaXID-d-c4#cs|bNdHEx`iY&Ev8JtaA!L30 zvGz}P>sCCoIhp7VZr|z3DBHX4u(y?tf|OU6m(I3b{!Gh$Yd)m?`NV#so$p5$`;&5z z^`TA8$@ZJv7u(cxL*{!b?LOJ*KIOFcy8!9`zu7Kg|LwS#{j3DY`iHi>4!hq|_3Zlp zK>BM=Q_St#e7x;@4nf-EdvdqfxoDKxh4Vw!Lp0>O+J8A~W}o{6GXCayk;mTY%4R$J zmyq#Tx#&jQ?R#(8x!;D|cPu%(&i?E_S9|rDkoLu+oo4m{O`7(L&O*+!O+0F7Z`j6V zcfS57IKJbwAKFz$n%jS!44EJK<LYg{XF|1oi6x|c)9qwp|4+r({#Pp`{Pl|C?f2~s zwdEFoj87=-SZN!5I>`RtT}b(ApRmNv({jI^!U@Ru)_xUfdw~h}?Y{X!&g*4m;J0@? zcE`>|Zznjts!aZA!&xF?C$R!jo@Z@lwNHK&X1~M}qCc~q*IwmApPlStDRBIh`x@94 zeVA%{(-_iUxad=6Ka0WLe(grc{PO8b-1aAm)$CI<A@^IYKDyWL%qnYpa|TFxcI7~Z z{qA+Kwwq)i?)}o?W54>phW)N5koJ2?{af1u|Kjbo^+V>L?t}%~sT$VX-AjRtKb@~F zwck?jYTwicS-)3&Ji^}c-%`8a{gC;2#jDTkzNq}OORR;A2Ty(`X*+%2E4$yd(E9P+ zQacy!nby3=A@>)3TCHh+L-T-L{~Snvia{sXzG3x5yXx{1uzyo0?y#Hpb(O7JIi$Y4 z6}8H))5^#0T3IMq-lNpUe$$EbcHbpdfy2{#%S5}tBfIP_9fFKMq$}#!=Piq{+szIs z---{ewbPlRX`guovVQaCheftijg0Lto`aN+Vs|9$=U5%J(Vor=F7I!ib+$i#Ro{Ml z6(m1oW@*_UXJoc74}g@1PaewIS9-<UYp;jQ52~dU+ReBhXqWMBDcC)~>iTT;-WJ&V zxIor-{`8iy^OH@t^J9Uy&*8-@>s>EW?E~^5=QI3`v$H#|T5KnF$P(;7jhq;JIsZj= zVJ{)=;XCu|?3XfU*)!Ne^7mXZ4!in`y7n>`xxwy@Yf!a6U%tVP?;B)&$f|{p?M};< z+qXMF#*-NsmfMBg_O;910Wp78^#!}k-Y&b@OCj<1`F@Ih>gF4E?{gsi5635V_H6NY z>{f<C@`JXJzrE9OS^Ig9AA|Fc;}s73D`{WsB6>G~?SFfs)V_DwN4rH+ApM_P=Pug4 zyCG$NK^oHE+;W@Se)^^cyZrT#^==&Q?ske=M)us-YQg$Fh0N_GT(;V5xB)qTH+Sko zyW8h)+wmAf%A1Kzw`~vhFSYw+Bm`FPc(>kOAhFlhaSx=vdu8Nh@4GL-o}Ujg9?l*V zXfLOF+3wvoi2u$eso8zsw$JXO24ufJ=dtT{FPuE=m69Rl)r!B{?JR6p*yZhkjCb^e zso2MTV72dm1{pu&JCkfbkE_IP{RBvTd!}HmUEEn+`{GBC^KzB8=h<$s^|b%p06D+# z@B?4Fk5ZoY^WQ+~lOhv0`#ZkE_BTTz^A+E=m)Re)KWSHE3n@>Y<SE)uv*5G8n+)ln zNc?oMpDkTwfB!b5KDLTsw!dex#_szU$oh>H5={2L3aadHy@IUAx$(!_j?*^Io-+q> z{>jt+O#59|gYE9`g7iOCIudLT9c;Io@B`u=22WOd<xTJGnA9QTlOH0JZTZZ~>|zrk z<5A)V-`hPC4YX@ug7kOzZKm19ZV9!&W(irp^EdamUFljW`@&F2{kKQ;qg|Qr2iw~H zkoIa+ue*Jil7fADGbDW)SIF4+C<fchee46bC%2^P*%xiJv3K@`+>fr|c*pL`PA~i9 z7m)E5Wyx~;=d26toP8nV2cD6W>{JW)*hyzwgX5po!pcrgGR(fg0a6|{$$hk&c8A5T zBnZ;J)tj`?PUW4Py-*V*eC4Wm>;yRW*dFYLn0HQQx?K!kyuJ83$art#y*qYtyx;BI z=R?}xZc_K{_%^EBg|I-*BPv;-YJZ(a!k*I_(x1{=`p5RSD!={b?~w5ZXa08E`9Tr( z{bi8yde5giJ5G^1Hqr7A!R~#3N6G&1{eO0sk3sC~*%)pA!y>@`-epL7ooB3X-w<AG z|2Z3yKjQZ**w3C`Z5JX4na{kw)zeNrRM-B=DM)=TX)A6YB=p=?eLJK)(%WZYzpu&3 z{%<?P{pLSa?32Zl?0>$5)Q=|SiS|A}i|l7W+jH&F-|b#s_p-B)g@jL`ZI1n`Nul<} zQjqb5PL4lzWiE#H9ukoFv)QR<ukqo4-Gn!g^+BfZ%k1rU&bI!<1{vQ9ob%Ck;bcEM zAq_Eb`H=U|!JhGvmwo7U$oX4SxANNSFJQJ`xffDiPN^)ipOva)$8!}jzSNtXX1|J4 z);9bcB!8(cFtU%UW3>-zfviV}-OFk}ul%u{jW{GdmwQFn3m?e0Pu>n`Pjw1Z+xu6_ z*&n?OS<iE$pwqS`L)6}a8<IXXlF!)j%`vuTV%Y|EUxvs<yPqa6?Gz_L)XN`bx6fe_ zv00b`X<zrTUbb6$vcx`bI;8yei8r+~(v7wcn!^SzpS9Ie?8DFU+W%YS2rlnySNYm6 z37up6Zw;iqvGX90z0TEadsSV?czTv>t^L-gY4%e89Kh-gKKj~U5U#LKtALEJWc-o0 zKi;*+?j`j6!;Uqo_S4V1*?(LI8Q%}8ePfrSIoFQ)KV-eb&jK&|T5${e6(=C=hs4T0 zyTJTZ`&(Zj;~&g7eeJ8KdfFf3fwVt2eU7yMVJ~h!!yIz|ck-0=b_dx6?A&@F`@@eU zxY}pcu-F;6HGti>tRT?dOCaAq@+4&ch4`hXcAI$k?LQrcjGs09b+>=|B*@O`7-T-N zaE+k-qwiYwy*-foot}s7w%dO3m7PF2WWCg_1)ptumfF}a$v6cz|68V&eSaO7{e(x5 z{*AhBihc8w6L$Qrko8I?Z&>Y$ZEWl<R3Pm$TbrqN=5rbCgP`}fob=slw^MqV-P~Y3 zaD04eJ8Jjho2$KLBgB8js-E^4UwG~LjUnsfnZwKMkFou=_33^AwttG%6T2BRe%ZNJ zLFx~_->UZM2c+#6+e7*{${zOiyF%93CCr12M{LqkvgeP>v}<>QoJV~&^O3FM((QJl zzL4^{u+YkWeSw<&^eYhmcVvFHTYa+ITH^;~e5X-S!A^SHaXW$cko73B7f;zSGMU)j z?}g+qv!-x+zBpdHg&dIa%=wc`?9Y~n+RwQFN$*d2+3oZ8=h|^7LFT)*>4w?=+g@d# zxEnG*C3Z&Ne#0Xf`zJz>@@dDNT>Dr0miDhsLDtut)y%Np?)2PFB@EJ@H`F*`Cm)t; zzdaW+9>Q$sWB2FtD%;M9kp0_%zuoO)`o7w^dP2r)PTb3~KQU>E-H8Q|@y_HPQ#<xu zy>{VYkoo(q#<}({UisQT;)1OAD(akQH%~&v{$3Sid{?TW%0Bbta=Y)0ko{o)CZ*Zm zYHGIQ41kRPoPKC&_hOB@-K3+C@_S3kGuz<*y!QNZkokn$N1SaZb35Ae&Va1XQQ_Ke z_k@kp-Y^$ZUWA{Ew~svi+%6~+vOh*XpV|JXhoZfqI%Ivs))pK4>KZ<K<}a_o@jqR| z#m>Yr++J=vq`x`UUBTY>V4(f9dyw^MThevxy+bVQ>#HFB)$07mcKgnx*;i>m`tM3B zwd|#@rr8{=fy_rP`w(ESR8?!6U<@fwCTDrtX6(FY*Iu#-T>jr;cD5G_n`iey9&$cQ z!7gumtyw|#Sr_ks<sAxc+1``mw>NkSnLkoAO15Lsbg)lWgVgWKldJ5F9v-mU@Ep>< zoBqAl_DYMd?e}uX_-K*kIXf|hzjnofkp85xYli)nCn|O_9+3Xh|D1CB%bHd83Ev^@ zwfF_@_HFz(Y*KDO`hQ(n%y!{NJngHbA>-|ne&yO9s}r@KITup?_8;3}ckYaV{rd_? z|LWa@O?F{3Gwt6`g~V6pZd1Fzf0FG*!yx0!-C@D@<#&qhlk_0{Z7DA|yZBFA?Kb~} zwBH)c-r60lX|pqV4>|wE&)(j?ZEcp_Ehk9*_x}1`TY(QkHkS@V+B->;<L$d=^4R?| zgsh*xIIYZn1$(D0n<^y#XPYG0S9098Tk#mOe&p!Gjdq*QxY>t_LHr+gP0+s2y2O5- zf)O~pPjA$*lbGagUpa{p%)c5HXg^=2(tgfv$a+>M$uj$W_4n-z=0Mtq+Z8+PHvh4< zo8%7J-{xV&V;@@5YZo*b(*HFQiMBU3leAlU_A5Aj749mw|D^QXc6pXP*!=SQiuNZZ zYVDuJLHaW`-htNP!fWh|!%u+a-|U!V$N3=L-tQbFeymTvwtJL3!}jk<$ax$#o?`Za z=_&SK-kkuO?`_d*JGmjse(zmKd(O%^z`msWi|wmBknzCNU7q&a4{O<rPKUH-<>XxL zUtVXmZ=D2LUvcSrvi%m7&vySOLe~G?pFG#Lqwlt@QafaQLz1AO{UeD-wk5A2<<+g{ zD{WQmPuu;P2B{BSJ#O3Sw?y0jybf6}o-~)&{@Sd^c2nzKfc@jRTg|?tgxP*~JtY2q zB-`1=<S)0Iu?VtW|3zuK{Tbm`wqh#|fc^7_C(V9(LX!RKH<0kTE2(drY2jwC`D-^= z-nw+A-P2c*_7O+C!RDvU;kI}G!)2eE0V%K3<(cf9EEVjJT!zd~hX>2rdtHmQ{Sqz! zt{<G%n%Et$lD1zM&IzvnXJ;we^XIhKU7iW)A5~}-*mKW&Y}XhFDepVJ@3OnqxykO= zWXSnSeTuK`mb=&5P5c6B|4w>4+m^q5irsG=$ohx7pSA5&|B2b}*Z%}|pY)yGb~;&H zb{AWk!1g&P>Dr%iX|v1pg^Xu&yg6*Qr!>L-tQKVc<-2c@{ZWA^TMchWeh4crv0u)u zZ$JAsBz%LUzSt?4$=mw}Tm`qEL-sDSd$O^{Ugkbze8uDGWV^7|Cw3K%koM>GIox)! z2UzX@w?O)H1|m-OA$tw%J=h@ilf#A_JGpIHw(Dgf_3JH$TDwJOt?fk|AnmjHy~+04 zvhQp!Y=xAMIXgt{pZ7G_-U;&uhbLoPvVH8l2{vp;A?x=nil5n8sQk4PKl%n7UzI0b z+8z54Xm1t*8Q(i~+27tz`o67EFJwHSMeB-PomRD7S<WP|`X-aPc010;SwH52v<FjV zz3l6?3+!CC1%mBUFS}r;Gwqw*^JZQ!-~ZbryX=j7?RwlH<Ij2g#<ofmOYAixA>+B1 z+oSB2-iO=EK<|%Qb7iAlP2e=Udj~4P@$-rGt=(@P2m6=okol^HvjX-<AMo4H5i|tL zcU^sD%l@s>o>vYsUdFJ{&aPi!qTQO?kn?VoHy7Eb<W9BS_5-p$CL`0uzTx6mI|F{m z_`$qei|w8#yVy6%K=w1<HmSA0H^txHEgCZZ&C+LKzfnfZzS|O#KkRROu-kRe(Wd1n zr2GuOV`l$f__N*LC6M)xA-3-JU&>W&oi{_u<K2zL_J>Z$*?Fymj2AU4?zMZkWu2YJ zGsyV+j5;rSb?GT~zve*l^Xzv|><;9o+x|Zf>Hkaa7PX&t;(*<mbV&SN*|X2q$7r`* z=R`>QvuowE_qE(;Tly3-pTMjXYwtOk&%Wjjq`kv?{;i$k{Vuy7Zy@=dbytAB*Lg47 zZ?hry8GGbf*(dC`veIdQl>d{&<m?~U?X{b83v&LqN`RNW$`2L0gbR@NiFTQ=ZTMDc z`-pvz^>B&o&i4Bcy4sZ=hScwUWleUX6DHX`eF9nE#>2vI?{PNVUXmZOKC$s7o4xmY z6MKGfi2wdxWwdvV*0<Zx1}Xn4eah^wO{lSVvx4lGdTH{?PVS$Xy^E?DIQ=nQy<?lG zxyr8F8FGHu<CUjvSE&8AJs%G_kLAX$Lw5HIl<cO4*nrc=j6LS|GZ$yuYjH!)6P07Q zYu8Y1Y`5SnWIe{3J52U(9$DMJm<4Gs6eZ}|-<;8EcS-|t{u9&tGj>^vT<qBoLH6e) z{W)p(_??yg7HIvoI{ATJysCrU!TR-J_XTTwxBK8e-7bg|k{;i0O|{Q7I%QXv2^lZ0 z(f(w&u*}VVD=TEZ$73xG`=Yczc77`%`MZ;y+ty=qj=diA{sM_QBl~Ca_wA&zA>-Ts zlLPEDnxEUYn?uHXQrxcEJxgb{|9BI!U($@l*Iqm=!+yoY$zcE6-_W<aslU-KVhN<b zE^wyVPE04nUZo7up4<3J$DZ|(rG26;Bz|@U#M<%R_qO}V3h948iOjNJt`u#bQUqxq z8ZmR)%U@2m|9k_|zC9?m(#||k%s#gU(%-567Hw~y<z;^<2Qq%lsHbMX)HK8{e<dV8 zo|F%<JCV*}Gp`iVf9qNJ*KUuTh28E;knz4xiz@8%Zr``N_z%*a6_d2Hw>|vKHmVtN ze^lOz411l(6?P^YA^o-Vb&>WjC9CWjzd_m$M&~Emt?6{Pud{^gZx+6yVxPI<f$em8 zNO|>d!2`Pv?h5;JosjZrVbw;vPD?p^^XZWJAdX2c_SKHT_SaTG*01hLJ7(Lgvc#@+ z17yAP<oT}l=~+|lDr_M8gHPD>+D&`HW9$AFvR~P%p3#0sS)skvVn~1eN_f7#ysEeT zLSM*wsUV+3y922UY!f#_>aQ10r|eEWu&~cN0om`V!=h-Xc2vdg+hxf9iJPZP?PtAX zw6Eudl*fukKG?Z2_S$`&3pp=fwswi#ms$JlY!V^;iw$q>?2NYv+vSTv+NUcbh3p@S zUAL2-J_lUC#W(fYuI9?MFNlWJmu<zV_Vr0I_Wccz`on5&x&6E~OKshIA>+5R0|M;@ z)_t}U%7dgY4oP==VF@Ms==qTL%fB}!_BW2Mx4Ui**+2N}OQYQ%mjL^je31An_f)Vq z{ug2^90OU8m=?O&&Q`a??xS)i*gdXIv+cg8_}eS2gxrs{-FvB>vuUDz**?hrk{L{s z>`tz5vwy_~IiF>-tcESKo1OifcaZW=nLojP-ZXyuuyc_1aptc(c0TcI?Jk{xjNjQ8 zN!Zz*va}673Gp9y=zcp#y_t4Fe31U6+|GFW84q&oP2(W#14B`Jdu`n+yOvDIddq+~ zXZu_q9{ZYekov3Xw2z(Vr#Sol%#idWBP3uSbWYw*AQH0v<XW(&{r;<-c2QFx<9jNR zyKE<^OtIDMgp40lOUBzDXJoWLZ&3lRACLc^Xcs1@ZofRH6dWFXlXYw>q;J}&-Gr>i z=)Nvv|En?0evL^fI6wcpR$!++UDf{021xrr=GPJ1Z?7)e8Tmox*Y@YS*vDwd*z1Tx z=2!nbT4Z<crGXvm8pwJaHaS&$zrIrY1O`ZZa-x8_y~=c7+g46Uek?KGX!rJ0wtXiX zB>sh#F0^wx9c;JH6LNp$cmI`kY9H$CcE5$xm;EBD_ERRu*k|3p1a{x9#3cLKUdL>I z<U;I=FWF-ky~x#W>kr6&Th)DM?82^<+HY1}2re&c-^{XG-rr{zvk$Uf?l0p`yIZL_ z_V2cagU!=tl(Ww+Q?|d;3+ZovWG%8+6{xY#er^Spui|mHk3KrnE-VtVKW|e~o88JT zMf<H8kp8cTyqkT2U9a85ACUVFl&$UTjxnp)%{eLo4*!K=Rd$Nj?Docbkn)syl9|2n ztX%s}7RY$b&TU@y#~gF)y1HM2<EJ3b(6(TrxV_mX$avjRwkEr3uQ0oX8j$t90jHSl z?UUr}j#)tJBkdL=d#<H<_QleW`SZ<f8*RHI-R)$TLF$|CnU?nDU(4-7Tp{~Y{KC`h z{t3w0xw%2g-~8wx`}4+U?9MVl`g4mqW$c6FpW2$3L&kT)WOmvuNlLfp)`6rizOBdY zx+;q7-+fJjgpcHUyDjg1?M$HOOU7-@v$u0Iw_o)FGGC_hj?w<&l*@KodLi>adcsHS z>c0KA6H9^A=Udh%+iL`;+4V+3`fnUxwe77#pV^(c3rQb-*0T0eJl%E|?m^bOEPA@u zc0GTRy{$XsJcT(MzT0J#SJ}1jK;rkb(hJ+f3MG5P-;niXtD0Ba$+1@17k@nscJF&Z z7yFuB8TLEaUxCwy(bvs(4uMzg61XAtpKnK;z4;~|`<s^`^S8-wMC@ND8rWYlYXs|m z(A{SDbnOm1wqua`^@;3BTgOS2_QF1p{@_EiRd#;wOKcBCL)O3W@7J|=R_C^VbmlzR zzQCio_H(o~?Ee-*&etdrV6-cITWc>}4hfIzc5L<u{~hh88$!y9bM?yhC(hruEm|xK z*1uIp%g(K-%090LvR=c`-OX-g9>0C$JIHusR@4)_nOlPFy<H*g!MA6`?Lu#4+xJ|D zlsCn{e%kgtZ?tPvgNzRe&aSe*x+%}TV>V>IB4g<iTh)pfdxq1$!S=0U3$%CIQ)Az0 z1{p6oR?BWL`J2h!Fbz`Pmh6?XoBdkSPAdV@{|!)cveV#MWLNMAQs1~7cx3ZnI+ML* zAf$g4&BA9ddbGqonH$o-^_~34uJO=STfRMz{qCtwbL^__rQ4mo2uUwz<udK|dIi}z zb3O-$fB95H`yGCh?D~E}#&fRo1=<@IT(lJ~f~+53QJQCeX0@Wd@)k({<mPQ(d(CJM zdro~weZ*|zX}|YLg}qf4WPf_GoW1@2U-kBX&p^gkCGL0FN&V-w7n%g=@7tBi*dOqy zw@>zh)Tge&3HDDf&$8o$-fyq$b;@qpMt1wem5}!9=9LllMKY;&Jbxhl%@;G3>@4C{ zZH2WU<vaWSS9WtwSJ>}e4RNoJdY4`4ayNUM4#;}dy<E9=6_5GtU1Ji#;eV!_$^JU? zJUbH(2!C?t47-X#Vf(rKkoEfqb9HU6&a$_Qjev~z+AF5mpFiJd8*m8HK5|Gdw-?{{ z%I@{^2jK8KaKFZ`R&b7;&~8Zk^pA0XePP^NJ61tRe_4LdH@iK2Ira<hK-x?1j6Li- zI$i9vIUwQxH6_+w>C_FotjCey@@iLAw*B2ZdG?<!LFSKayDRPIw&mD;yaky*x;0DG zp8aFDoj&h6uz&8Iakk?~*RZR9Ck}Rx<(jj$Y+qRIR!2eHU!%!o|2XrYT~;!re`7hx z-)_fZXFC^F$o|+VU(@aXy6M>Oae|!pV|q!%{`%J!b`9;2{Y#5dSZxpPUu<`A1w?=C zU2EH{tWvvmt&sluBELO$anqyi)>_R4yQi6@!){Z9kNqZlNdM}5`)0eB#kKaccS7cS z`Ro7NHF@u}onr<WZ<})QhV9!RMf<~rkn;jsHuu|9n}^ze41}C-RHJaxj$hZ-zDhb7 zT>j75Xkg#|Z?WAe9msyk{Hx}6(yO=Fxs^e}Kkefl+tX@i>>gZz%zxijF0kKb<zl~Q z>szq<jL#I=)SYLx%`}JXClkK5%Wgm85xbz(kotG2N}_%GfkgX5S0Mcx$7nYDnYU`} z*Q-PJN1k`%vEL@O#yVslWIvd<w6p#53#aX#7<hrh|EQUoea(d}wl&?5{HArb*8aL& zrybWr$a>LyXLWmn=pA<VUO?7Y`it<{KVLM%F7%TS*nRA$we3AD7udZ_=mzr(n8fVY zwd>mdy!i}leoORkyP!3E_Q#_j^Fy4hKka7Qtg!vb4@occ1E1O^`zhL|9Ds~B$8ieT z$6P*Px6A|5f15tl#a@eD%XaG{NPbp#nq+t6CYvqGM96xeQVs<>?v48Ph4zs7HOaR( z?XpD6?Q}ju%GYG?H+G2=GVTA}f$V2HKat&jk?McDx~Y)$^{4+;*-v(;wO`N-Sw9gM zvB1ut?X%tSNs#eWZ4)JXpIkBfW7F%w@fkOz)PDIbMY|VFknuX^yL$GHJh}E~ogw=l z3+w;d1#XS7W0i-Lr#B6S?H|YOv9n-;oZk_ZQeyK@)!Y6eH)MWp?;!{K_~}h{Q*`El z!>jj#uYLVp4}0mAknv&eG!A>OJI?m&UP9Urx0eUnA9r40+ZzdqkDo{E?UvY>*$YWQ z>Kj27J3FR}+V&j!Dd7BB(Isrp6|>duFZ90F+2Y(bdvhc0-83QYIaL11PRIVH-Qk~* z_|N|%Z}0!;fnAe5q<#3uYl6+>^DcIU*^v247sI7?MJ)C9_a;Kl8~DP;XjhxXZhuPi zBRKxEwX^Nlt8B76u?=#c>xl$=yJ^gv_F-9&^2k|5-*#4yg?)sz2sk`h4Ki$1^k&$_ zzJ$z2{FSe_f7mw1PC6XYUa?*&ZWmPVZhzz!<UV+zCtCJR-_P0IOo!yh%gojGMt`o` z?VAm$51sRQ>~~MIvo}}(X+Ie4NVBiF5oaGM3OQfBZ0&5D$IM>#EV7XLwp=I1PV`Qt zeMS@He5XaLf7_~^o@ryU7Bb#(c7w6~nXXy3y&aJHNo$sp{r0ZOw%geu?fb4rSM8?d zCE5w`LCTMB&*km6+b7$fVuJJs=Fac3>vE2>?`Adu$8TcHecRcoSMBCbhpeaF(_LuK zaBY#DXaOXCFX+s*yFOu!-H&2O__XCtv*`@xwdW0h^pAK~wA=kXp<|yW2WkJkV#%|c z^7(+>fqXS^crtbWv-|hQ#YX%gWWB_p%r4s^t~+*nY#{BurWIH1USEo{EvbRbC+NiJ z+x@OwX7_JDWc=~=`i*wNf%ohpra|g^vHKl%T^R@MrtXHMZ^mD_wrjog?akC6{refg z%J!1~jP2_`L-O;~J~umsOXc=^ogn#z=a7qirmwFZZzW{C@bu(scDH93*?(OC>ECvE z3)qP~bGF}d6*6D)rDm0F$V)4`M~5KgkI<P+`vXc_?dtwR?w1$nk+Jv7G`7#wfV4+% z|Fg8ed86F^b=W)bc<8huWjiVU>o(EqkpAi&raXH=9xeM9UXb%1%zif5ZCf90ukjwz z|BL@yXLqPj!Ty~Wq`tmaEpLC>!pe5?aY%o_O-$Hk?@c?qh1NI0`H5F4*j}2a%kG2# z<o=BJPYmtrJ*@2}i9+<Bdy;H#5a(^b|1V^}xH&JYJy$HN{lhrOddsIT+3Yu1>e(kL zK-S0ncS*48wvn-Sl7Y0xwwTG<tL==j|8W}9-}KO{vVV8@v295;<a{HuN-q1DFV^;b zhamOw{}^BUtqykf+onVMBX`t7><=Xg+8>z<$#0J~NZBU#x7jJw?*`}31qUSU|7?`8 z6FCQ&Z*8!Twclo`V{a1%F@OKgBepqxK6bfkkn^lA`E9k^mU+!Cav>yrgthnDz1zWN zTOS1(k2d+0VY|Lm&F1eVNc(2jthaW&!o2pI`XKuom#oXOmw2$n&Qbw#e_6B}pZ$Vp zE4vF>kp8{hiMMt)*%R#=H$lb|nM3&Or!fWD|F32T=NCPfM|NUP`u5u-AoHiDzLEBR zH{I={H0FWhn`u+N{VgUgyYNSl{YTNkO7@34F4>jtgv>u?Zg;ceTJhda=`Ex@zTOaP zpR_Q~e!KBRaC|0A=(1xEh_ny>yccX=&4O!ohjq@|O_~7de_OucvTLl0v+uYBN$(Xo zuWdQz-n5gu3h9qo8`av){t#=Qt_NvPx`%|>p0_o(7v;zYhj)-<mhGkYYWDY!K-Ld8 zs(!PJYMW#?b1P(gzWRN>J>R3RcAtD8=bK2JIcK-$@di8nhN)oxh1|bx$G1z?p1m5f zUM%>fm;L@F0=5^GAnE7S=M8olqWX4A^qIi!PfPw}dnt92U2YV_{oRUY_7(LU_WaWz z<AwVyYVG$t5w(w2<^rq#HQC8Fuua8&MFph&doQ!hZo-K_wyW+z&aV>;h_JuVQDJ*$ z4aB_lH?!=G?!L9#B?oD*Y+%W;cfOZof8qwDy|lgF&3^iEU3-zoknyB<f}FNR`X_Ai zRzS)l`4Sboh2}zbeXHMs{a0FUW?#HM%Km&5Wc>02C%c{Di*S3Le+*#vEuGe3S16cb zf9EJ<yljJgjP0WJY<BPBAoCfH{~7Im{;ssIeh%p`uhG%7UwJjfUULm({dBswh<(JZ z0Q>bBknx-{#e=r|QR4RRsv-RqXLeP4z1Q;gXSdt~yC*4rx1AY>r@e<RWWHHIY`<N| z|9^JRj#Po=uRqPSS94Od|Mm#do|FkwvaRe*wNL*7X>ZuQ_OmYuEVd6=04cw8yo~MT zy5`w>&Vi_3Zm4em;jg3pr$Wg3$osYvY}ZX%W9Q`qDc{vA_S<pazGIg%6S7~4xnP@} z^Rn5t?GqvC@7k-KcAq>R+3lGLQNP!L*}idofPKm|NdKV8n#De1s+E0DG-N&S2b*1X zJ9oL*v%ZAXC%>j$u>G-A*uKIFGGC~_xx(J#L9g8&Zb*Nk!avadv|^rpgfOK2lXZ~K zK0-##ia8k4KUkRi!q)Wkemi9*$a)2-j8?ljvex#lS0U@StRq=$&1W32JrxO=4+*$0 zW`87D+J3qaWPk0pA1d~`Rex-It03*q))g!4s-u6}#YRHvTX)+``?&|i>_h%T(nJ0G zM|Nk5`Ryy-L*{?Bnn&1nv>mi_7KDtS_)A^4Ti23rf65BN4`cjqtEA>>JGl{(e$pLV z?e6u=vtzV_w2!#fe6(YeSZ~K32uUwC`x)$lv-9jvFM))ow55bSXNs`Bpb2C=V&8Qy zd+#0T_SWr?^{P^aPWF?&2H58;g4FMK6K2^hzSUxvuLD`%YyAI*?W~9M?P_j9>K`q` zc>6E4*7jO)koxLNw!FQ3T(o`92gvz=5k2<y)4sj8{cQ%B4~aY_Wq;#}nEjtt$a#qg z(tP&IS<LMh#X#zlIL2qTP1W=4q9#GwJGNiE?7y$RV7t@{(qHAiR%$=fEymv50a8Af zSD4$&-%+*eTnh=mcds~X@90jn3$KK%XVcEGvX4`cxAT&LoL{!GXS*G@iMxGf6(qm% z<VoA69ALAzsf5_qwEM2jXDv26^*Oh|`EzUHc01W+`u4B9AnPBs@5|YHruo=^SAf({ z+>c+`wML2C|5^$uKURJ4vzutZYp;G2GJcx$$H`tGsMBtCGNe88dZmbcUj8h*&R>xD za`Z5>*Z=d`#%4tUxV-L85w_1cbIfkdH%NQw<=*LbdRDjW6!IYZyACCA+C39}VK=iG z(*JN-#&3Uix4-?e`H=Mb|A(>tN7K7@Mt+d>E-zK(?CN+@?02kyjGvV1o7y|O?z43{ z1=&CB^x%gr*U>2Zg)ETqrX}@8_OI^Vvt!={X@BZg@!4OyBWCw95)z;1Y=rC&NL$)} zV`u}H|6kH}*-a0dZ<D<XvL3AKm7e`nZ&^Fd7m)T?)J6_Ft)FK0-xfpCQ-emAUEq_e zcDsK&fW!AxXQ18UY9ag7Xvln*7Pqy%URb|fNC0GhulR|dy?x(VyXVTc!QsO@Th>m( z?3As>1jzZirxbkcKO9iE_xca%U#ETjV)y-9x}As_q(64aire18P~5&wdkfgUiUvX3 z7V{pvB^i+MLj#6td&3DA?9AIC=NYIiv9XVc(Y5~;3~6tOKF+Z}y)V%|$qq7}y2oL< z_1BX!_6c7h{qZO+Q@aZ>*X_<bLdxswc>#9XqQdr*Iw0x&RI--+>+Az|O`eeOR6o{Z zw{k<2y@NYsd`YfO+Wzac({>*|K>TxOa;ZHF`#n3WDUkA(@#kB+6!t529)*zg41RI? z_KEYQ>{eMo*86p)EVauFpJQA49Wq{bw~@oX^z>5OYfX^-KQkxpx8eHHY<D>yVqT10 zmVKH28@oT8knyGW$I|VE-!a;K*##+23k7)X4fme4o0|<OpOV(!u&dG)w-FDAtZ&x5 zkYqpUL%F@t)_vgcOiGcrSG#rB&N~iLzix4GvFC{XWUImkQ6FC^X7By`p`C#Xq`$V} z;S{^3`bzuX!H2-<$KFWVp1-Evp0gJcKgura?Xq`e+S|uL+RFm!>h@8Mf%ZpkLd@eh zves^@@?N{01(5NE1-^;)H7~vFRka}ccPt6CU$Rrz-jf^BUU&NIY{zRe%WlUfNclM@ zw#xqc*DhO0J4pENPtLNJx}k1gQx545Uigx0|IVYxzM%{<|M&UjaT}d#Ui*1@kpA-u z?t^xAvZ?kjk3rUF_)T!O^K;>`Z%XO|r_cEBY<59v$@Y6WA?tNB-h8tARP17(xf8NJ z->o~?ewBon{lDdq{J+*&%<h-CyS<2nGB`XJH>cT8D|NJIn4AIT?>^{iA9hpQ{^lRZ zdWDm(*W0R{le9nX3hCbz7w)$!<5jSK-gp?Sp7Vo-{VGpk>y$l^`wS01jJ7Ym>uT4a z1es5}9+F_6m9@<7k_V)Jn7z5pE_1byeMcqa{73l-kL)&>DcBdThU9OV2Q%$vA9uCS zd<)r6ua@)L&emJU{(ll={{HeUefy7+PwZA!K-Ocey)I~9#KmD>%>@bH7glHNv=67- zKhTHF@1@^!w>Q}=U|$jjnNOH<GTZj8=1sflN|5?Q@_wTI?8`Il>V9^C!}GPegnhHK zfW0X*q<pVZoo*X<@~HL6V#s-MWiR;boW9So`@;%3Ke=srwfz=D7yCUvknyQjE>U}a z$rpB6n<3@FEw?E9y0$$w>M4-=ASBSzK7jd#U64AY{UNk8(ayHP-;R4L<ox405exf3 z%T~LZe8~K!R^BB$w)cW|)2Ec$g3f0-BzxO#?P44IGjky0*^wSqb}=3P_VLjE+war* z_LWY>_6$oP<#E;7H2eQA^X#`=h2&Q=DKGn$FU<DuIw0qDM9u$gyQgfA-9AZ3dJ(!& zV?Q}{kFEF#NO-6GceH=^dcK|73ds10_xXLc0m~U|%hj5|?n(8GvKMK7Waq>L8BbWh zDAPXsLY%#A3Zy))w&%3x5qWJp^9>|FWX;#KtI_kd7t)8cf3C(|u>JPi*j`8yQvUTn z^tF%B`C}JpCIe1irw*6ei+9P|fAN5fcR$zQv(rqHvR{4`(!L4|vbC2wyu)tZX-I#s z{1=z~+p-sSLf0VsUEJ)Y?RRj_wX@WR%)ea!?{BX?FTqaW0%W{LB*oF5E#1*xcq(MQ zz}f&N`-kVU?Zuzig6;qJFVZeMe7DV?5=i`BoDpg7wI|r#UksA|cciOXi#B-L+lxZ_ z=P~bD?ftlN?K8?D;m0GwZ8twg%l_L9$oM@QSEX%qOsL%r4aj<km}@;YvC{(VJ!V4M z2lM}2u``*bV1M}lr2L6U)3@*ca@g*sI;6kI)!u9S)hoq**Eh&|u5-anb_+tU*_K{} zgkM*+kX>tXiG95^Wd4pzi_QKmXQ}-P=_as$JndQSCw=;A*O_1e=J#y<YU{I4*8Wfl zq&;m}yTta5pRRrDUdVmiY94>>=5IB$H%)@HzjMFF*p<(JXnW}cWIf8xAM$o?v%Kv$ zeuB)Gv8zSdYk0@nFSUiF?<UI+cBLym+eUIg<Tn@Iw|%7EW_K?eQl5OP7PkLw>uG<w z6jGj_>I|{({58i;^B&~BkiS(LHgD2z*(K^i`q%5kqV4A%X0-RMfwafk9%b0?NjPtH zGa2H)-7fC-dQ;-;wx5QKPkB`J*p;~Lx9ebltj7-CFJs55nr>&3c@mu8t8#PfnVuQi zCo)3nyUV3M_Lf(C?I*8*^tU%YRIra-aL7*B(*+z}Ki6Hcdzc<>CoB&sPbMDIv!D1r z(XRe5B>jE*EMVV1Wsa>SA7p&z?*T?TiP9STS$84)2$#clmv=hb-<%8?Ut;I5x6jR& zxAl8;4D23FjtqOf*)Dd=86fj-#ld;@T8rM;hCPGir^tCTY$dp|?E9hnPc$!lwLAHm z%l?}d3)p>;zqIY$oJ;L<PD1vpb*bywUFTG>pOpX!FaGR9wrbyl?Q}jv_B+&HVY3&y zv&zmT15%#&94@st6)?Bgb%E3;D&aEr6$WqYq>Lc#Q}aG0`%?~k>~7ja*1vT1CE0Iy zKEqD#3S@oQgOU(?H~#&0X7?cNk9>U*`yKgF_J7r#!S2(sGPM`XVzU=Dl>qZq-Z|QS z{%mM3D-LOY*3?VehdO%MKNErEr-i2~?N(?nvb)C$X}`a@6>D$5sn^cT2y#9U%dbW| zXM<$>_|=g16~CCCebqiz`=h5J^}&VJGwe8KU9c<u2Wj8MEMT&o$X;yca2#@ehYg3G zeelNs`}et!^1=F2oPC2fn?2`3NPIGVm~E5fC1n3+3dFy2zxml$s+-#_UIRIgpqbmx zp11Obo$4FN`1(;xF1x3CQ|uaCT*3X@;5G}pQW0+Zj<1mN<I5R+dx2Fcb}Si?_WI5l z{PsBwtoCe-koHyR4Qu<NRlN4g^>V=FtG0c=-L_MCc6M7J{^`A@Ywx6f#kP7sWd3z( zxs<)L@^4#tEy(%=H=`6g*62L@@8==&L609P+PA0K*tZ%8fyXli=54q8`6bT&yE|n5 za;C;kyBisSwl{X11INco;YPcr$2RsKpyxqev(>UM{V~I?Ko$~TJ8OT~{qkV7J+~23 zpB!i8w)c85->y0ZQr~dqT(#SDs@C3YnjF~uho%PDyE{qP>zhN)pMA97!~UjUpna<w z<ouxfoAd0;lb_i|@I%UjlqU@KhZ+3s16d&EZ;RMvXCI<xcTWmZe;n^{u|HvZ!|uQz z$a>j4`BQe6o^G<8RRt+OgvGh-r_UC$*E$cWznhe+?cTn6V{6R|8UM=PYGIcY%wf+` z@CWR^KT!#G9+x)Sd0c>upNXA3WGB9a%}zm{6C7UKr9RndJ#VtT698GClWsZ7&eKuQ zetsZi{ZxYxi`A0cJp1*}AoHP*tsU&MzZu!9azpYD&&v`!VZ#HqvyMR4udbba&Bjz# z+1~n|J=lKsmI!;XXNmT#xoY6>4|A`w@15OXyZ9ZXeX@1cIoqU=33k;rkn_{$Ee*8a z)2C@~#td0+UDvtQF1CQn?sQo(Sih<EI=g9w_wD}3LB{u<&Ed40zxlr1f*weF+$sN* z?Wr&aI|(+(`kimfe%QU9f6Gp<6Ea_aVr!}WGR_xveKWPd=3Tye(|W7mOuHG!A?Jl} zvDURqT+nM5`Tq&n{S$0s?fJY9+F4A2%)dm4X4p^D@wBVxO$E#AZd_vfgrC=b_hm@_ z-}royUA=0G{m!+J`Lrd|{@994zi8uO(*jmsDj#Fde)XSixfNu60F&!<I~hG0d&9So z{@{A;VEZSJ1?>e-K;l#QQmuXebYc6wUm@%L557>ft$Ai=&+iR6pZ4xgX**sO8T(Bw zkoA6(PjK6(TC&(zltb3TXDdqCcb%88U*HXy--s0Rwoi7>vX?J}<Y(26>vpBdvbHz= zLiUT8Pyb=J=4+~b<qb%Fy#B(*eoKOzofa=-y^Y|St9FgmGi*ASL(aG3J;7tYqFU94 zqX{xz@!F}{ezm*5E$77p;PCy`YhZu;w7=cN9!UC{Sm$Qny4&9V+fm4Rtm8|vZSU{g zY{$Ij3^;t=vZmN8ofWn_XHf>OFL=sj?W4B~*su5)1(rYYa+h76et_-qC6Mu$64O$< zbFV$^&wmyH+xIEh(ms+s*v_6=1I*8|bGLuo>1h8e3X-0lHe9qjcgDv4i4J6a*mn(2 z`-xj`*@gXql>Z%DUF}m+{q6QYgUrAD`PO6St=?)kUks9d{wf}@^GK7jd%>v#&Oe7Q zAGez);9}3i3Q3<o3?JKZim}<1bU^w$ZPlmj_AT9O=g=@0?EdXlT=pGi2W|I0hQv=> zwTZoTYP`MZ9>{r{u0o0S(cTm6`cFX4Cwce!imh^Kmu-A6<b2$f(j4|WEaCQvKhJ~x z7ZGY|AN2RNZP)}YuzT*WFSH9({B8F_6H-3hFU_#;s!FtPvx2Oz>AE9g$D_W?j^hBN zzq0e&T|3V}3wzt?YryVHUCm_we|oFkqi1Gd^POeA?c3bT?QP#f&W~b|47EQM8Da0- z32FaNc_?k~@x92tTMcp^)@zmk`$wwZ>`uf&?w>ATOR!U2=xAr52RZ-g)5IkErWH5s zjxL9^$8PO5ws)Me%FbU2GQWD@%|yF4rmuE>vB6;XWNfRqpI?({FV_xfZ#8<YvgHW4 zVRy-p6)Z2v)@COo8f&+B7NkD?>Ab*h^AlIw+%J&+)x0!S`}_79_FG>=>R+pQ_O??x zKiK*F?FRdAwbEp}G&ckL`)A*P`9&*K>?3Xn*&A3x>a*MhzwA;pdhMJ<lfd$#r(*3U zb@AIzVS|+4TLL=memU^l8#hDR>$TsNY`wcw><czS&dXULGQ~EyH{JfnLCF1l`(944 zwci_OH)$?pJ;GAKEc<t&vGyzaAnp06zb5t<`7`aGEQ9RdX82QOKfA@t?%+Ad{<Hf> zAKA_D47WG<1Q}m&uvuw0&v>O>QX8avE>z~V58>gl{~`bxpW+B<uv@n!z`m#-vftf& zZH&FzlPG)3JCOXJ7m;eeJ1y6~Cliu?Hz<qReQvI|zas%zzmlc@*lxzuO#731ko2<4 z=ZxK_NpkkH>>%x_^FM>^KlMr4AG{AqZ_9-X?B(V3ZKE_H>lLoED%i6q?6=cA3>m+% z>=Cms+MHuwdmd8%q`!P(d#lvgE{p@RA0cOtyWNdd61L6@A?KTfoX)nFd7NjjZvz>R zdtkzAZ<Dal_Ln#0zVq_gXYBSKX0=c3v;(IH)hCZ_rCw#*cT_|2gZyr5`<IXH?7xUW z+S?Ci@!C)Lu4ljF2W0*HbAf2PbHC==#q~hOZ#!j!>=tyU+F!7TjDOt^v$NOT%xU8; z3z=W`zj4fVet3Z0m*o)uZf%=mcbD_Otw1-V{ywYn$WB^J*Is-(q`ps06}I0dH`{i_ zSIBtEZ(n))+(vu5+b1FS_pwc$Y*#fq+y0o;N^p7i_cE{j)|^jvX$~gf{2X~9#(v5# zeS4i^f3W=a7;gJ-jVboI$074|az#>hS8piUTfT#=_c*sR&;I^qYkLkw$oXG~6CLd5 z70cTeO@*xIzx0N|-ck6QUBz$6eDY=Y)pkK2(ro?XA^B&YoPj;VUS0bY{~+ttS2vg0 zH@B7BE8V;X4&TNz)%FchtoHSSkoke<JO=igLyy?0NkGDPi<hze#P(c!RSU@ZqzXbZ z_6HRf+TKrtv?rn%*zM<4n%nG?f|RG#ENb>E?Vas^2tw8iTz{Ej|2?9^u4yM^f2{x0 z0Q=MnlJ>7cu7K^I=MrG=dT+AbTz5!(c(l~p&wkoqr*IBZe<l3BWNY)cz|JAC3!GnH z7wFlW`Q+GFLGLg6S5svFYMQ(~*KLUV%_45tYA(sMQ~D1%FZWqtntjSjCwtDjkoie> z$=h~&qc7SeTSC^G&z@IjpQAt9PS+EX|1B14+iJe}Y^!1nx$nhUSk!Lu!94pd9FY0G zyq;Y9*RFZ?P1TU{s4q&_K0B1lw*4BUKG1J2vUe0Sw{N)rzydV>vErJfz5QfO`;T)W z`Rl|nD?7J&F806OAmdwCHiX-23uxQNe~<;IkGs9h_GQnG*zP|LIS;XaRgrzb?VYwS zvR8opzvr{6ec3g3yHBZ*^AY@bi|y}}^x0Xwgq(-SB*tZ5C>?CaTM8M!<WN3rm#vs& zziU5az1^xAuk2<n39)~bSPl;V9m`(XHGR8d7sm-HKhnFF+kV!OwRiW2j8}VD6xjFg zeracQ9}@q|HTdk8WLMZ*t%USnpB@vjHx|pb=Tm@;kKg>0VgH^}(B6|9GG4Yce!HEm zIE%gT0m%4vo{Fvg%gaf&@1f<J*Lz>v*4q1aQ7a(z$CBDpb`spF_Md$q?Wc#CFYTW1 z*<v@}5pv$9#ZNQ4#`*W`)W1T;A3mmP+Y1Wpx7+0n84o%j8)Cm<L$1BgFG&0U#iZ4? zQ_Gp`4VQI+{d<Dtj@`W%*X*{&LHd)N9U1nHD(?2ju0!VgWIVL&*L$$oAMAnLcgB5Q z!G4Llp#5j)eNrdieX=V{E3@ayg_L)3g3@+p%&ythorcse;*za)TW(6&*O)=pGi_?D zw)d{@uyb1s84qa*Qnk~3eaQA(Fr+=1p*G)+!`|FZUk_3qemQ^8PVJJk{cn57eAKzs zfj0V4EcWFmAoX+eCpA0mPAj|DYar$MqWyd9!V3NEWmiJxJKq!-*pytHXva|oNe}1r zc<hy<?%QRBLCy!5{^h>iTuUQ++XTpZh%QlQd;i_K_DAv|<@<ud*LENH!|gTCLgLFL zZG-K^9x1!mb0GaC&%|Uq`EGW5!F))6)K|jY{@g__d$uVx;P7>R^4K=N&%|DL9b|u1 zv1Xb5pTg<3yys%U^2~n@+DSF6wKeO8^!M2;o$N2(Q?y@O1Zf`?^z+$2JJDx5IRdgC zxo>~5{jzr<_9^oq@e`ykYyZ}7s$FL}r2hH#W3OFR#zDL7SpwkvamHw_U4M_H{h6hZ z{9euxWxvDopk2m2$bBR`E@s-Fboyn-$p$GedA=&xt)KeL&f^Qjy#9;`yPF;%_R&g^ z{Jj4@kNy2dF?*S2Nc;Tyl4W)_t|E4pF_85cTmO06zivBb`@jp*UhqpRve#!Yvk&_O znIFG?H{U+w>2g~&UUjU)4I6?Kl=DH%h?s{`lR+bdL++5KG)Sug)uw9Nkh0a?4` zpOE>yFVczjtkLuBUJ5|gGusHn+b=uLYM-^}BDnr&-%@0+VLjFM6Cb4fSYobWzwq;E zJ4Xe`c<e6q`*xy_-0kE)Le>wQdu?m$TP<kk_YtyQMfhToeaO>=wm;vhg3F(o_cHDF zT~V-`=pX@(FW0cUwvCt5?Uh_1>l^x5ciZK>jJ02=3K<{refZcmfz{qV*a70+6Ag3i z=7`GKf98kOAMa+ZvQs`KV81sG65p9IMfNi6DR%lRA^p46H752;rfS%4SqNGGbuyRV zKC#5a-il=g*#4LrM!OPMb^GIAAmgh7zHatXdlT&sJ%Q}^l)UI~|2VzYzFj;P9RGfE zx7&tX-D;Ox1zAs9)y8VS{OmiswI-1Idv<TTorSua{iG?7^8k*YW4A9|dfS#y+7%q0 zYISk;je@bZXColzd4#A-+aLCIvcJ9>GJnN!lG9$ie6gK{0%W{&!bur>H`6C}k*6W! zUkBM->`%>0w3F$EoF^oFa<=W39%kFXP)Prsqi(9*isYZRD_%j)H&}dUzuo&yD)t(8 zAme3!x&!R?R%Y18GegQZk6bl-j)@QK_$nat6I&WJ?L&I!+NpU$($DkhsrLWgX4=1; z1{qJ?@9bsIoA=zVBnUEo`~LVbyG<-DwtBZ9<0VT@D%(f2huELG0;!L(-?-XWF=W_J z<%QIjqUEXfKmK~zaalpq_oW;A?Jlepvj2P&vcF1c;$pk=7u@V~&qC@W=KV6Zx;3}# ztk*-<XZ&-HwGaQd)mC}^Y;gRk^xD~P3a_z$oD9idQXWU_3TM07UowTvPcXe*XSe9D zx?RI;$avU{$9DESCw=YLxkC2;9VysrSH4x)-lZ3E-olf8H*6#$KiSPY3R&;T$lz!H zRU*=UfjVUV?B(WkJIOX}yWB)b|6pS<pZ%?^L3Vs~ko(fEvo5n++TCwEcOPWE<@}Fl z>}J*l*fZrp&R<O3dE9PVmzUjy$&mVD&i4>|bxAJ!EO*HIEi<*Xc6C1|+U2bi1pDvP zRvmlAt?Kr17a;lH`DT{AM75rM@N-E2U8Q2Xo$<FHb`L}$<!9o|eRd)lX7+}=A^QQ! zcBt8PmUr6i^n|ouon{}h+ptgEevuAjKjDWp`t}Xxb@nTQA>+9plB?`fG>+KG=R@|R zXrx)&n(4>bZMy*3&s8PRXZLa*ul+Ss$a-WCw*_|D!I^f`n;_%iO`mh@%Xf&_t^W&I zpCc!2V`K1&!M?Xg9PA$-wj%onW(oFpA3)k)>bLD}@B7QyYD}37&L48FTkY&puh|7g zL;U-|!rH#<&o$eNlOXGvPWk58|B_y1%e)*iKCp#rfnED^W;=(|e&GD+7*TF#$8y1L zM<Aqr;c<Uy=d5aBKY1BsJ&u*nGP|P^s`f{MAm=%rQBJTo<kYZ#xDV2wnK~!azK&nY z{@_<gdMT>av^U^Yv)_LUQXdIR>Dlw`*SC)2g{&tz@oI|Q{1?{t8R?MyQl=cK_E}~c z_8SjE$`kYTiS|dVE9~clK>F{N0;_EU+#~FAbs*<G9oQUZAGKA>K7KJ|eOz!<kbU{> zT6>S>Vc_s$(J!`l{vT_<tQb;1Jb5c(e`B`0y*nGE{iQ9t-FA}EBfH=Uko=gkPs#ql zte>_*4v_xc;nR}#4S|>KHfccG2OD;1+rLblYiGU>(!Y>-8Dzh{!O?D?DdapJ|JgTe z(^|UiHm~6Tm)F<rz3nHje{5^q;R_C5DK|em*9&>}eBU7H<=gj0JJ0`#_K9bT!R}p{ zUuGY5>#g0q8<6!J9Z$RME?wZYKld0?KgIFn+1<8rvTO5#lou;_-0glwdD%0cgUmPI zd7W$@r2fWk?{~=lkh|KIc3nRw+PUw8`1jgV0sA<G6Lw(>A>$LCQ_k3mIoR5HibMRT z^Kz!0#NnfMea|87ALEoicI|hS?XNw9?Dx8#$7`?QD`n4o1+t&!SKkS{H}(nkSC>Hg z7b%uH_EHk}Y<Wx|<)iu6S+-F;v+Y>>A^KP8q}VH;aJ5^v2r|AL^CHWJq3XWfb2~`= z+9kT&PUD)A^`iBV`c7IW)Bg9Wi?%ENL+XcQXKDM_!RPGGw?OXCIkLLIjz1>Ve)m2| zd;Peez5Si3PwkG1L&g_QJ+-jU77DkYGaXW1*^4&Xo%d$8Un~o$Usms{urFIBX8(T* zBtIq1{$}T}?yDU;JEXkd|KPb@GwWYF{tiffzua$X-^Lqczxynt{r0kMo83Z7Yx^n- z$bP)SKMr=Bzt-3p9fQm-EpWJC_jS3Dy`vJO|0KGv-LA5DvEA-1ko~N0Us>8`|IoC( z@CTCquWxO%^$D3~m+1|OpB`5x`^6XA?P{+>&JPyb+HBWkW^e!h3}n8?v(4MCeYTGs zlf5W7ea&1dY`<k&hP`_%B!89jl-dWqX}5bZ4HCcUfe-DvvR>F7u!EG3XYMYun;IHp z|8O^?|83fN$F}YggWbGRNO`sT&l<ZP`6zo;QAm8<|9!#EJuJ(9S{-D)Q{>57`{m|0 z?PN3{@qho1nq6F(p1s{(NPpYBC&2zgc%nTcH)Q|u_uHlRBEMhSWmQ1tN9`<g?U_Wb z*u@z^{G)n7-hS(*D0^|+%i#PV_(a1#v(3WJVlN~=KDF<(Yf7DLx2tbESl&6z!%oal z!9H0K5?@zWY1qYo;Idtv4oMFTS8mx|<UVinhYeDG$V@7+kG$t#cc&6!-rGajc6w)> zt<PSB^cQW)Oze-$FSB1e53>KKZSq!Irklz3;Wr`UG3TGy*lVn0w&&>)1n2KUpK$vp zCPsG4py!9L<n*%-k9uTR$|eSOU*qo-`#ny|_H`2>?e`}<VfID2zV<B+kof2?F|<D( zn{D@K2PD7nR#e(sF0-|(`~Vqmc=<8ke)5(pc5YiB`(?HrcDL7Q`DV)%0-66zp0ULC zCU=+}k1nKsPs#DNKbl@-pRoo~UOf1))6Q&*r~R#Ckp2G~4W8OQ*eh;7a{^@l&o@a4 zy8}f(?Lsd@%B$bg{p~w?mfH0;Lh?)f4MzLOsCFAm35b7NU9;@&Z>qIF-Uu0gNoVJ? zJFz6!-l+hx{_baDux(w2sl84lWIR@@E7!jJx2L^CJY@ZZ*>*$wcj=<`i}W6Y(`#05 zrF~pNk-e-Qr2bz2@V1>>dVy^^C!{^~fN8niapMrXzE(*2bu=W#e$m`1Hr$<%{-Hsb zmt9URoBh4Rko0qOt+V}EK1cg~Wsvhby7gJ?mrqEsZ<B`1SIyzpw?BTY(4K<>5<W&d zD(pW5#M_tuf$Wc|KL6fMokP&R_Bq5n{`yS&iBq}kZ@WX<lM!0NcA0Gz_5ps7_SoOc z<@THSXV^JKL)K$-==R%H7Ae~4L+>lQAfII)@?@)>*>6bwwC=Hhed+%%whIg)^D}ER zL+z^0E7^a#09haUvDDpOXWL@CYme)}=__)6zHPtSRJ&s)kof_jXN-2N)lT-eDk1yD zm=fLXMSf}9*Ik0F&)yYy&~DX{0Q=_=kn#HSMf|qQXL#5%G(*mB%nwSlkEm|6-BSe_ z&z>9PVQ=kUW#6$L(jR%?;B5E8h}*v0AJTqx*tx|nq}Rdzqa0-aN!;fPcCO4E_UykP z^BY{dFW6cC6|=W6g{*I$rqXY>zs%e|m;=(^wm5HY-?;v-T{;tFzIgjWBl~#`@%D;+ zko^YpeyQ4@F3+&PR|h$dFfKaP-tv^6eU}Yn{I|kzmfbZOar=@=$a*EGmKs~Wx9;|? zf{^~qZt+6<U22?mMz)ak0};8e?BWh{+3&H2+?SD-IL+>{Lb1KXd`SO`sph)f_A^;_ z>$M^M^%XsH?b4cx>}R}%q_^ECV(n#BRPD|3AmdGX_GNaZw$tnwo<Yh-w)>~;5?(mk z6(>OY^GoaG>{qD%w!7B;%o;SF#1tE7FA>daFSiRaf9R3NZ@=v6AG@>6kojNsa|yQf zD~s(z`XJ|vd@fyTdm^LSPU-?={`R`Bk-hN@Eqm+Pko0?~^o>n>T&4X&S;+X7TVS-k zlX|%QSGGcM{;Ao|XP>!ascl69r2Kt1Rm)Dn_p9B6Tafw3t)Zg!D>YBr_HBiX?;ceW zw>NLfvadb?iSMI358C~E@Y!x|8DzXD{@_fz_`mG-=97cL=HFcIY%jM)#{PdTWWDH2 zdo#P2pXb_5+4%`vzA0)4*}LvuV|QvTWd5~z;w8I9yWQ-5-+}ZO>$_C#Q}P__nV3?+ z?b92pjqM%?XWJW;Le4X3JDOrYC6mGaY&^t&p3^Vdo=Dnb%lZh?eoXxxV_$yhgI)6_ zNc(fv){nNYJzeb|pNFhxXEI-AcjP07J<|t9uzMSCx!JF7G_!y88Zv&k*)Y}q%o+~+ z>6an%89C2u?0df!+BY;o>c{jW+4kHG;`UEIK*B3OBHx}V+r|Dc3#7lsr*_+}-9Xbm zekbI-n4YM4HU-Jf_J?0V>hGIZ*zB*yDcHYBhNPF6<xKV+Q|;{6M?=O(9z8#2<JHk? z`{nF;aQgUnM%u2cJHp;w5mMfpWQy6_?zOd7nFE=hoL;%ZZsigy`x-t-dY@jm+)f}< z&3=`$7q~q5%w%m_e^AtZ%{s{V)2A(Z_A3-aZO+y}+CyH-LG~L;S!|a$LBeap{Xkn2 z8Gif9g^=|7qS3*=Nv6-1IS<l){j)E{uIk!BThR-U{$sXnww?8k8as{Wknw><AByaq zr-#~`oA7|+@BA-6JL>><yQ-^@@qwi*XYHaUv)YT)LguHxiaXnNIt$u!GC<mgD@*L{ zKRm3rn-Bu&Z`=(ow>P>s!8V~5(qCzqR%Fk0?x(H%4#@iApXPk_D|g4+udjx*|9<CX z*xN=Qx2@X-S&z@PZiQWI>2kZ?ClK>yo|3RX5!P#Wp*jd0K3Tt|?DemFv3vX*a=yfg zh3oCI-Xz#tK8B13=J8wG+fMGa6*s#HPQT^+Cia5rf%bKFkohw96a)KrRUY<SWsv#F zPybEq^8~H!kCpI%%~vXzXm@_nB)fYFko_zNjPvX}AG+CHmxin-vwx*+pTW;&Kl2)7 zy!6aD4SV(r-)vv;{{h=)G4-2W_Ek%J(KnF#<eSNVyGo;8+yBt}+C6TI+wR@!WB<Gh zV&C0~LUyJ{8SFnKL+)eDY5#BcVTp^~w9Sz5)7}4a?DaI$>_hAz<u&v3Pj>%WtnJ>& zLFU^(EKarmzx;)*b;AyD{^+Z}YG?o7!@kuY(mp+?({3j^=ds=6LsP)%bGN}UyJZr& z_8<R2<_C*dYVDoVZrV94g^W)=-ud2cP2wB7zflnP3;*u1@x3Z#-^X|n?7xM^N9?3e zT(P|~X&TtRZEhU)SH6F;DLe()Un9(Q+0KER(SFBr$b9ut9ufP*xU+WKFGAKMKk_NC z|B)AHZ*l?BeoUVeWPd<wg{_JiB)_~p8f>3!{lV_EA0&O;JHlrl;PT2YksoqjmGzZv zc9Q>d><<}1+B4EeOYA?T724Y<@POTOG9=Hom2tV9R|{mmv@~{$UB&Te`$dJ2`HQfH z-1aOpyX*vAAmg1zU$gDqA|vfN&O*+Uk=b*}PGgy;y;TxqKd;6yefxeV8T%d^$au=k zALs3U2t2TJZ-w-COE!ksMxL#+Kai&m4qvH^U$*b^w%BzngS4-Y)~nkq|D0=A#S5w5 zue5vF?>W5N?z07C|3zLOlkE%v3;UpG$ohwZ!?Wz}CAZt<xj@bv@z$Gb+d9Y2?%P|4 z`^1bI?etkC?UyZtv~PvqR@<$cHqp-X38ekA_UID3CC3fyjdZNR`C0Zwto?2wJ9|FX zyI}YA^vBuni;uNudJH+=N5ss>zWF|jz3@9NaQg3a*0x`NZk`?Qe;#mrpS~DtU#qa* zuJZw;J=mb0WB>i5ianeEB(VAS)avaHOt-L4eFm9N&+58qciN!R{)8Q5{pZ%R$Lt(7 zB-s59*Z?+<-@DBISs$1E;fs*)KVV*I&;IU$UELE%`{UHdDtmd}KD&wzNdIB_v9)#z zPiNZhSBC7j{=e>pwQ+-;eY8##IKJPAXxaV?l(7$$hLo2#8oll7Dmm=+O?|-f0U`nR zX3ie=JWC<t&Bl8>ZB{CV*j>L08Bg5Q6KL<6FJW)a519|XI4#{iWEY?P*$L|4@R*XJ zXD|AR-M-zf0qlMc6JNXgkD2Tb%B%yM?>AA@Uh8<IJ?FG5V7^q=PrHs8(e`(AAnT=7 z9E|O+Tc+8Y%0lX=PurU8*6%j7Pt%<ZR^NH?h28)2jP@?)A^Y<eN*}O$Da&TR><DB$ z%<p)oomuF5yBUFy_Lj`)!*&~4Ywd1`L;AOyQpIf<SLNC>{)3dq@gGmydfj2R+kf~c z*nCOJhjs}aX7(aMkn!J%*Q4yWeD$&OWP^-nb8pJ9nOK`<?|u6)*nfZbd)TX{$lFOm z&!1}8y2<vOql~=)A7p+#>5zflJpUSdMpa08d|maOT~}I@U7;Q1d|S4YTkI}NDBBAv zLC%ZGFYvL~>({XtDudXcpXX*D#p`Boo&s5KI&VRn-R$%zyZ0|4>q{elO4{%1?zX-3 z9@77QZRKPCf8h$-u`Os}C_O@4I?b+r+)+6P<)w6%ARbtP@3Yp(*{ZeHwmd9xK z<{xA|L%XD}ePN!seTEvOzoPuI%>K)zLVNZ#koH>mm;H9h&UW^u){yefbgP;DrHw51 z@)IHZ2OQ^G+9@)5*q1$m^w(!N@3i~!?XcZD==|qaNjv*#H!bY+G9dNknWqPBE~HMk z&9;Gz$0hB4ZKr<A(LN#_l0KQ<G1{*^XJdc&5M+M*qc4}e@e5A-IZ2T6Q1xN3eb_|? zdk(<_aQx}?I@mXzPOx9<4$1F_CTzCb)*x>G?h|Bw@1uaFJ=+Ucd&BRL{j%qt&9(DX z=du(24ryP8x|i9vFHW$p(1o;ro7WrJZ`+h+ZzKhoAGv*frrkM(opzC5AnDyTINCn5 zF3z5(4YEE<S&Ykm(~OIDma8G{y+Zc@`)^x|?Bst!+FyFRS!`EY)!Hjffb36*m|SNs z%C^q#_z6gUohSL(?#BEE+jAQr^NHylHugvO_Sr44f{bT<{&&bOckU`X^?Q)<zT=yN z>~xO*x4An3(q5Fcyk_fnWu=|7B4j;B?QSRgjb9z?*35^bKb~K*cKyLt_97b~{mUo5 z8*Le8bJ?>Re*lM{&oWl~P0xhvBUV7pUx<AdYR^?AXm1t{sqa*`+uBdaHLx|zhOBRV zdj6W7L%+Md&nbv`o?Ur%&#hGKybeO<Yj!r|*oT+zwrk!GIbUd+AdCGx){l0pRzk}A z&8Z*k41VU=ZL)X|&QIJ+r`pY{JZiVp3esNawqvswKl{<nb2ViDHE%?n{f(YF`|v%G z@yX(d=XR#mA@+%8koNw4wg$T>BO!Y$TS)oNUi#S9cUG<a*BOxg?iq*H+f{!~u`{_1 z8Gox=lwqIvP0a4Wv;=VZ#hAosuXkS4KF)X(I6T6{@7XDEaM=A0hs@U>{KR7~z4E5r zDG^9}`ApO)I|<=p`!(Mn`HP#`!(J`B&^}rKGT)T6-`0Mg-YL6dY>@Gxw%46@=cQEb z_nJcbi+_#6?ejYw?YS;M;^+QfXFI9T)3)8`Am?qbxn*o`<H2mhq6OJc-cu-IuawVh zzkViUJjbd#*Zyo(k^T1BkogMJ$Bg#UxBuC7J%E(2|KESK`!XxVeis|0y%hR6!~XwV z9edWhknwxA@9XRi?z&?4kQK7t<5``Qy-KjYeS#yz|8AN0?G)SC?0*M9?#GGZY_*%& zYHrUR45`1gmFL=Z9k^!K*ACfFDIUXMf8k=iJ?lhEaCr8--fqVon`?iG8?s*Qm(pgt zhK74~^-p!d;d_YD#ooap!+!1}NPST)!e%#BJJ3F86Qq1_e*VBNZjO@OX*<aHH_tOc zyT7W=_Scdi<H2brzwH{cyzSm!gzS$Ga*?o~weOW(Qwij}4bey+`^O)g?N`l(tS495 zCuj3{W`~`(BZU8t+s1yslY)KXZ^(M51^O54Y_3$=f3$_9Z-a@#_W!Qh+8dNX#*><t zD%;CO$J-x;ju)?9f55JG?tHsD9+3WbM>@NG^Mn_6H}fF<wY^hz+m$>jw6F4ngm2hp zEBoVWT=p`H)xiFLrs!|K{r?)fRWl*^q5R=oyA@wI+V#wW#CPIEKl=%0D{PZAA?d@- zCeO~r_LtrKzmWATf*Jd4d+S<l=U#@i=Z&0W>_bCM?2BU|^~t-FkL^M-m)chRg|rua zw>#Kv7Ll=kCI-20bL|{Md%^pa_IZww^X`4moVH7!WMcot4>CUYu8-f|Zws^ig>#Vc z7yZCrcAQIt>^&w!)=yaR>)U6UDcZkT06Bkft_7og_0br6iT9B8KxH|z>}n^K*uR<w z>3`ke47cBKHNf8f3uOJ6a$$p=Z)vMt=0ZsLa+y`yf4T6~&LRggzRdex(r&hhkX@7( zWPR2n_ij7iY%Y8EO33-uPe0|^U%hzV_R(!fe&2d9&;F8<xcxOo$olO~V*PfKDLr=6 zUR?vXzs^US+ON!Vx4%#WX&*fIQm|KMUux^i4=HahzLd7#vnt#E?-R&)mfW7{cILhM zc8ljj+CztaH`~Ugir85RK=$8jWIwVq)0%GQ!VBqtA3Wu4&toZQ&(|3aF3-X~McIGU zX0X>gEenqC{5iMnd~V;hn>Q7bUX=WU?f+Mp+1q}d0d`+GTa^9WmDlZpjUeT%d$X;5 z*l$N$^UIL(Y04x~`!-Gu`!BT+dFOkTc2l1h+dC#g#-q>2XxOcO*kg0z3gkSD!1)~Z z&X%w3GUOrY!Rw@z?a^~hb_YBl<6}CSCv6X$ePo;X5;DL0NWanUgF2UecoJlMwO_a1 zUgg~`yRh4k`Byo=S{v1Gv34#@)?oj2s|VO$U?{aeTelC)Km5zUK4mhOeZo!1{6X%= zUv^))Jng?8fQ$!x*!<c~Q>oaVNduA|Cx!^ye`)$|*Czy75969rW6zhzZqE||sV`a9 zmf4$3R<Pd(?LTBWKeAKRPPEU?T?@8PoMWrqmWTxVde3Lz@J))ZvVY^7V(+;K(mvny z;h;@<sfoShVu<_y{Ca0w^5B%+*PD>_x%+p-+JAhJWMAY686VtIDQJJOb)((vWJrCV z<2>1}Qas0A%L~%J-hAer-M;D!dzHzM@QI(4W`9T{-abMNvcJ;G;ECP4DGTg=E`pq2 zaOx<#ebYHD`-G6`VE1*ss<MBgt7>2P0CK+er5;uLEL&~+DY=mL_4W8JyOT1W_H%Ya z+FzH>+_USrs%HO73eun1=6}@ggH58{@=i$q`mNX`yH6h&?H!yT<HtP)+V<YzmG-+W zA>$eA4~y8ZdKqtDCk8n$(k$S+Z9nr8JFy9n@}k+A%YM@FNc-d}$o*uSpN87YYzncj z?SZV<`LJ`h&7ImWcF#^i`WwmKS@yT`?Cs;vLfYd;mIT;whFaTM?18j5?%zLXCs!+I ze_q!F?B8jXY4%e(qU_WDK-zCPrW@=OcCy-U42I;dDdtA@WzR0#M%zOAr^dC}_F=PA z?Ue1K!1c#usaJN9i=6GZvO&tvN7<V8JROqu7j{6@$NylmzmqC&-~ZkgoPRcW{IId# z$Z0<#4KkkhDsZ)3!7W?+Th@^Ikf>8r?0yA(v;DCHQvW+Xd}p_zZiS6_Gh{!L)D}s* z@V&e2R{w&G2W&s!Xa6O+(zXh^en<7sTDxN5YJ0m%$b9v+FD`Z!jt}fsG(hsxE9X@E zuPJA2w{k$*3nf2q+x=^iv3J}BneY7g;-Q_hyNdmJdC2&UV~($##fM7!x-XFS>B?v! zyHl$=?B*STw67oetJ||3v$mhY0ZG5xbSK&H7$@1=r$fejBzw~Bk9;<;e|8<R-(fOy zs{JXee>QS*kHFy}#(&>de@}{CR5Ii|kw}rvw(F;Vw)NQuX`eY{YuRte=doAih13TZ zZpPYcq}1B?b_IgNfBsJ?`^SHr?2cAJ>YKOo*4w(RS!FkusTQ37YIf+`vo5Q#H<$*I zmus497qxS?warOL`*m)>G`pU|8TS7xA?4*P?{#+a$9?VB#6s3<SLg1rV_KPM|L88n zf7uzK_76^3SY8i+l#jW-XY9_DY1#8PLi%?MS;F>n0yyjwJR$Q}k}pr%z0u&cyLcQj zzUZ>o(JtvniXD#?WPirDx(2%`-!kk4A9#WNvntBgw(nk?U9&i({Cqag(*DzZCVT$d zko2X0|B&rI)+l?uMUeDSF8a^z<HrQM_-T;wtyeDJZ43OOY%A76_@$Py_SVy%+qvXy z1Bb_l=kj)IHb1jbm4o;v!uEk(NXQMlgbYY}oXV7GUp-UCzG4}qK3rg9ZvX8@j6Kg> zNdDg_!(_i;U50(_(nnzPGBf7bwfidBFEoLe_u+!GP3}r7`vWDA{VqitS?w2HNVB_B z2HDTD@K2$Ax8+8=!_tuQclWYAb}u8s?V9F7#!t^UzOu_*u-ooOF=Rh-=#PcAkKXy( zYq&$^ce0j;*_VGbvv)lR=^s7v4YJpdxnp<a%wMp3-oG-lKj~FqKcSfo%%5i;Z2$Fl zrQLz8kn*<v#S^<GnP$7leW$?rfBw2``_1<5_MyTM_gAaR+K1R!+DmVMw4ZC6cG&gQ z?y(J#gsk_UufcCWeFKkucNk>6Xs)ZL{i62@_P4tr?a@xj`*sp~@9osLL+&3-&o#2Y zdvdbf&y$exa|ZPwd!D=g)?M+C_P1q!lzlaSi2WfwNP7I~!fIc}-fPFa7t%jdU6N&= zdD6pf+aJh!i0bW}_SeGw?M0#IJ5Nn#v=2<tv)gk5vY!3bTRr>D2d(U9o`Q^TT^G!> z3t(rl|C#|wKTkS^?M0^)+p{tlfc<~sfU<oJqniDLldr*i;prT9KLS43&B}z#cXVA9 zu+Pe0YB!++lD-WEE9}<&3AbnVfXpx2vl`o7Uf^UOTLn3<nQdQ^{hSRm?2Io#+B=Hx z7TZ1E?`!X#4aqNO_D9&yj{a%)H4>6O<SldTT|SxFdz(P|2O^6U?EQXBu}e4s+5alK z$jAPJO`iRolaTxQxcFM_7K=99)~iC!1G;2wX>VttXfG84*^leO++fpX6L0@&7G(d5 ztcR%mlDqb{eeRI*=u68+y9c}T?6=!P&Yxa8CENaCYNOq^znj46<;#Cf`zKRR+xGH8 z#<zEG=CLcT-fFYpKcv2U*1~A_!B@@xdo`r|Jn7SE%k|)?-E(MpUHVzwo~zu{ezr73 z|JkQz_B&JW+NJtK>aTNkM{M7wKDCo;o&&Z|Gk1wyY0`h24~3BNW|u#6>}0AB+C5&F z0+#<LD{f!5WQLvWFGzoAPpz)Keo&eHwEK|x$w^|3b{~J7w)HcI?0=H%=CY4#Ot;(O z1L<EhTKuqmC_K$>P9&uN`F+2lecIn5`<YI~;Q02)3$`<UtZCoe3|ZfKJ?@enPqCBz z>CKSy=jPS_v}5yKYHM-~GJehLCu85{f6Pw$JtVzp&(N|z;96xL<_H;&u$o$FUwc^H zzI8HWK8=g(h}|*24Ex1GkoN2vg#i1#o1fZUpZ*-|Kc}t~`}Yq7?XN@k>+Csx-ELa5 zpWWgwkoI)z77hFNKQ7ocY?uwMFZc^q*gakyXg?tUvYw9d?i0J@>vQZ3q34_MEs(I^ zzcb7JLVFF^e{Pk3Y+nV6+FzOnX<yV|D6&_1&S!6^4H<uDNwKlld{bcmy%OTy<z@2r zS9u)mL;NB0b&E1>?8T?6+8;52l-Fjn1nt&b@3w8d@(Miuy6@mWyDEJvd&eb^{%o=x zi@jJynk~-{$oaa@WvAOQU1PA{3O!GLvWlEt{f5)F&)p#77e--c?H-Gy*j*1*2ZzU5 zAqD%pVfuEBF_8N8pDm;PZp#e&RUVM`+pGMkc1au9?f<QUjMtyyX1C`w>9Cvj29jT7 z8duq=FkZC#@<<XKUU@p}><S;I+p|rF^jE_(9PL-w->_@{2dQtO(rWFGuQRt7UI}Uc z@n2xKe`6kRZ!{HBJ~n@@vFAG0ZFk9E4qQL6$h@_=^flGKQx&2=@u-6R!t`@?F7c4{ z5qcIncE?^D+Rw3rl;5Jq-`LsTOSTIShLnF!3(nceTJYK1u7b2*Bl9oYh4`h~uj__{ z?<p%uyEWU??77xuf#c80x6qzVR>j^c3UZ!1PkV`7$QFG&vq_NpKPE@XKE6rW?&?a& zd2BHijdu4{9qo9tA>~P_w4UuvzCin3wvh3!KMuC`Pi1QC#X`4$!+UW+x&3{Hr*^3< zko5|4zPz%Va3Rt@U>9V4fVk%lyDEWpyCocu^6mKnExY?`FWb$pgUtU{Y(Hfe<gv{z z@+f3IHc!rayEm>9_N!FW!R~*rplYXhGRuxN1TsGKwyM$Y?VWFSRi7c{BhR7=JG}rl z`{gW<^Dh&QE7=Dtwc8ciLFQYSgDmY0+OzFeK*z_zoOx}fVhrpp3LxVZt$k_skz5|O zr9U9+AvLFK+SeV9u{$vjGM;o|^DNsrJu>#apCRSH)oB*HMNTF5pNk;-F^Ya{wR;ox z#`e%_Ncmv1%+`Lzggtg#ePQ7AlViNl?s|cYecCEWdz^EQiT&LNHFo{hkof?fTT5-N zx+?6qU4`6d_A)Bn{;2tS>(WX{|4H$*u>IFJ>GsmUApPfQhnel=S_JKXX+g^4Uz1|( zr{7YspSB$`{?^eZWS_?CW^eHeGM~nHAl|-4jm1v16;gk<g`c;(y*|!<;x)*8#y9S3 zc1~)xb`Exs`K81SCHAwPCfk>nLE0-HUOU>~UQl7bkpU8)-ke_cM}EiKE5^rx)APY5 zCi~O9&+Wu~AoCYHe)ic_ca_^`EP$N%vev)du2eSE{`4w{dvoJs?0>nRw=>)UX)k$h zzGV03c%R*cgOKv=%-4Cg2l@5wR~16!MH8Re-dlUY)_OOjeV_cw(f&kYj_nobd78Hp z)a-dS1=w$JgrxuOL}vSl-BR`?wvhfvMB`z*qaR+{rU^pUKeHPv*u5-0X}6*bvLE#I z&i{6&lQitT)<D_|jr>3D%nz~H_b*rjPJhS#*Vx^W&a-#j0$ESN%FbiA!t1X!PsdEK zd`@wy{eIK0wk?|>?cHU1;r7xK6YTfeL)rt?=XLDAd}On~wiq&=9jf%r?z_3FtursA z{H(T8wF}p{VHe{KnP2<3bei2;1rhrNJdpY2*@sWsiNBw3yK$l!IKLUlEVo<SDqtV1 z4Qb!U-_x|8deq-OwhvN1c&YZ=g&i-lKjH}4|GGL%#Qu;~gni8mNcod%P;H-)sc*0I z8L~cU`htgc#|wAZ`4pZ7r&n_&b9+9oaC`qBtzi2q^(E}@t&y<KUIv*zxmqP=?|pr` zo#?`Lu)JzxrG4>P1ADO(!r<^=@|bHAQrK;?vK-Rhnk*`6|H@L&-p&@%pXGQq%eMba zsl5g#WIVccp0K@@GMD|DI>>lAql}l`@?ci`{VO2jQPUWV>^~`&*}EKu%+D$2SlDa2 z>DnJy2bs^(()P4>ecfeOA_%$9@4%mKyYdgw_ACjI@juq5YwhL~hT32G>Iin9z{&4+ zccP>0|0P4#dmJfnwY&G|p4}^G{hB}1%--M}lYPZ~$aoQNg_Yfs)XlajtdRKFyz8%B z=JSbmkztVaY6d)i?YzHK*?U((^24t5DEpiQWBZZ=koN6Dvq)PV@t=0$W{~o>Z+(;9 zw@xSfJ~c>t^(4Ea{gKC~ZM9}V`XhF&h4u`IqV~KmAmg3iD<tiV_PW`Zr9%2Mr9$Gi zj%$C}d8f|<`)5HwlKqk|+V)!<Amd?6mUY>Eao4uvp8`q$YnGYWiAHGJM|D8P`_k>5 zY|rm!w(o|Hr)ED9x3>%yw2vu)j0Z5AUb16Y9b_N$53+uuo@0~k$xXucr>Y?FX?0V= zp521ge(H8ed)D!6slDqoZTm;Zd%)>oyOEQ94!f!S-1m_AokvF9wmcEy_KXuD>ql~V z-`T~jj<K)Kfw)&RTg<LMK-E_LDdheHd1Zh5-^VxGDxQOs@00Zn?6P9@?6X=S`)PzY zHrOQW-)$Rp1~UIMsZP=U{bMsbm3m11zVp*sJF`h{_8W_;!R}GNs%T#xZ)0EJ3prmy zInUTWTIH|Z&Xo_q;n%Rc#jfiIzrEDlui*60*z(Jc^~HS~_XtS&XZIt?UM$1NE?_OB ze3-yiWUson+WzUuC1CZNuCUmvsmR;yY=(?~@qE*;*HksNTlyPPzo#FPx4(1T&wk++ z$oQQmo2K0p7IC}lZjk=l)ko=e3Dex|=lVd_)2h0a+Ou<hv#YUyj5n~DowjpHvbAS3 zg!u1T|1CR#iCK1T29W+kvcqCKz9(;Ny-z{L8<=M|*eMuR*%q`z#^)D4@3K2mE@EF5 z04Z;}zE{}WZ!fj8nUe_)AA`@%_GSjL_6rgr<@?3uHugLg?`%A`d4T;FaQD02>nlxm zmOCN-`8K88KIc%BU1c?7e{<2<Li@SiGWG%t5cMDae79?~khB#PEC+}0&DTM;CF$Gj zdJaO?n{fX0vbS!Ow%@=G89%FRV6o@<nqWVt8j|0iEIe&D?M<Zp+NF^8b<WincE|3^ z+Vh;f0Cw-18H??7`M272=t9m5jK8<i&b}<ne*J4m`@qHdudOM!pMCK%NpSt-edd(i ziW~O!_9w!@?(yciXjd1LZx=6C2j*vasoC%1o@5ua6EZ(}efm{vz3=mFjbB0LJNV;n z+QrpN*dMQf+>h=Sdc!U-pw3=j22vmKi)h;OmOZum`WuqoH|RRs$F{rJcQ-@E4~2H7 z*e7f`ZF}k`B)%`l_S;>mPO<yX0#P3mnrJW8DrfJv8#3M&XT8hzb^1e_V_P8Y1@>8M z?N)~B+ArP(nI8ykE407Kpl{!~6Vm=`XO_2PuD@%0z7SHLzdl%P*K&*9zCZ}FUvim| zgPrFtXFEF=Nc(mkhrPX%Oo{#M(~$OzW{-w_$khmYbtg#u`JDTr-FE>dy9(tu;Q0UC zRc8P6%o}U7XOQ-R@x=~19gdT>r5_>frvzC)d!ak`?QHrW<B`la6zuoBIAoVoF9MFQ zo{8-C4yK&;G4~<$Lz&-Ao877&_R-M$kJbdU*rym(*uOmhNq<-LU)nKQo7?N(g_M_~ zeX4d5ef#a2H$mDjYnGPV%lmrRA2frEN1b4+w->r$XCEy9X;1xoqhimb9bl7S2nnC3 zdluXA#0A=4wu98?6IFHW<#V3cotO++|JI&sYCq?Ar9J;7$a=K+)F}HRej#hcH+*3C z?=)w(-~E)uUSskEaDT<;<4L=vwUzdoF&5zT6&fCGx2lEPZkg0Uu=>c3MEf0PS8PiP zAmjN``*rMp<(#o?_kfI#yqx#hZf=#Gy)kq>?<&RvcC{y(Y-`U!)*IR>nAtC=v$6M+ zg}9$5<F;MEjmLJco<P>i@Yd?t^DdrY_p=OQ{)KFFdxy?o`^=q?{>HZ+3;XHpNp_pJ zK*r;2FFmv?TYt~4WjAELs+fn<Uj4vAyJ#oKewp(>FWKqNueJYm9#XzP4dbzOx%<ve zZz^Q{^g=&v`||v7`{j!v<HLW~{j}ZM&uicB0$D$~BXyO{Zs%(Id_G9|Ct;ClfAWB) z{nvO%eimHsYHt{M$j<a7B>jr%>(~{YIcvLoBcwee|BTaq?IJGw)vb{6Q9~&!Tjt8S zwl5b!;`iTUb$fw`Uv^?nkpAVz^xbx4A6e}S5+U(5;a{MAEQ70EIU^+eb6wWjy?edD z?g?~1Mcol`d(TO$?G}87?C-d>bgJD)mK?i_8IbzxNa_^3Fkb^}#)pvp`}PMfY`s6| z+4awYtWP;Aqhx2a$ke`~3erAd_fodM>g;I0;|65E)BT%w?UwmpvP+SGl&=zd66{Xj zcC+6m4B4+zv;U)A^eqYdPo9wW`P=^j_7iLJ?O*PPv>#mdN7?Z^vfG=hRDsK*!o}hC ze}seVr-(rI52VC%+I=*8WUF5anZLPZ;b(uPJJoL0H%NZWyew?*d*!g*4ns)$XsJMo z{esqIHf>Lzfzu<?uYNmArx$iDERgYrsi7)%$^km|^A14TuMYA8_D%am>{ji9tdBpj zMA7c7zL~v^Ib{C&hDWFEy!$!!(>_4f(*>r?x8rYiv6nW4+(%Sw<7xlmR+_!nGDvue zylb;NBy4IgWd=zvTXHk)L(fgLb5MY!X9eCaJDdB)cDW&t`L@PmhwT=;d}$~08nV9R z$n$i2Q!Y9CV^KC>_xmXX+g)C2VP|{|a{kR*(JQuos%!0{R3Ymre(ub-Zz(@-_mc&( zU#25vhTW@Nb9;^sNO+6Yezl8T#bE#7D5QMcFwxaMUD3t<*e%F-(&YZhcGCU2_B(b% z*5j!!u(w-1wa9*TD5SjE{`jWtjgKqrt_S}DyN5C5tKGq-Lc0wikotCQIh%b);3GTL zI*5O)a?S0VR&(1=SA?90J!O)d{kK!!?0U~Y+Fw%oPwn<kcej6EatIvX9zP9jC$DL- zyZQu@ep;Hi>^1)Xv9V!;jMtj|w6kxEUu?Hd3$p&rBc{;q>~uzZmM}<vV(*$Xd*>@M z_U{%$>aRb~_Sq;J?XjK50@>g3!rR&Y<6l|(qfwCYbe>as_F>mn**&=d8E?9AtH6H$ z-(vf{HIVjX>T)Uj8CqxU-fV!3ci(wfZGSNHvE8`{$oTBWW3l$B<~8;QH6ZSPdxqJ5 zwt=<1@)5}Rg-cSn{o3|&`+fP4@HNPKW1D3XXK!o(DbGy|E$kO*r`VTogQWjUru_Du z<?8ksTOjGvG&$T}yLpY>WO>N^yo8Om{Vj_=yI@(!`k3;nD*H=^6YZ-`LDsu1Y3Z_E zw=~wiJ{>aO^!?`*yZ9Vy`zP}t>wRJ-dfOX3t+D$%53>IL->N@$^>?<|hOdLHSIgUI zWFNjbz%EoT3>+T|A2Qo>MdjG<*m)Kl--ZS^?RLn2w>zK**&o>GQ*5vJY^mM)Cdhb+ zNRGd~rhc7$n<S*XP4ASqU$C;mUTYy_|1GOcn7!{}d0UB1ko7Md?tkqP-@UL~lmuyS zFXZI4lMrmME4qIKY~OQ1W_#{9JNqAZA?ITVWk%V5mV0Ek;sB)oQR7u_EB&#=es>9E zyrp`*nq9ikVLK}?NO?K`R+fFn>XmjOuOQ=(ZhM7n6xapr<|aP|n_sa0pq>6{XZ!gZ zR)G1w8jAKN>{9k_O_1|ECV=iA3O#CD*$x?hHENWwZ`hJ=$2tL$UKC^v?b-j^*$cdb zv_I#CB-l%4NZMB=*@N2)Pcz%?4#sHOFMU@It{(&Ph3yw`1lw<T4@o~F#e41SAKTjZ z_(J+8E8qUKGtqOf59x>04<5;q_8Y}n?3$w><JB>hdiIujPWHFjApN(coxb)beHiWU zN<hwcwN^T0cPsy#ZQoBwdDGJpWGD05%U<gv<bDj}emDDF_S*LA5+Lo1y*-}xYrf>! z7wm<kx1?%E`#;G{_VPWD@t#XFuiLiCCfXN!LDu&lckr~|s<Fqe`8p&&Nnen*UsPUh zpMMw9o-beJVfXKYs{IOXNdIDm#8Er9ug~m`BtphN56#fFKiC~&f71uj{&4nmva>uV zWUJuD0#0vdL|@v8@A0>H3WW6UG_NnVyW$~f|IQU+9?QxI`<#xgcB_{|*6;f6@w9uG z_u8)A`Wra@4jW9dyYryhZu)je|9s+pcDtYxQTBJ1LF(@rS=VfT>-pOzDMRkN{e2_U zzT@9LJO2HU^RE-SC)yexxM4egDrEk9<N6DB>q4g6rM-u=&l55^?QKmR>^08kfZgj_ zy4tRXZKCZw=zSfnEFHF2PiEN%F+<M#{2nsb&h7Y1Th||u{CDH=ExW0U&e_#`fQ;|# z@XfN<cjUA`w*xYt;qA27u8B{@e&1?H`c*mo(eCHD&vtBUAoj^lxnlEDg2!H<4HAA2 z?_IPzSWsdg|5g#4zEsjf?47s#wzF`Bxc~mTO4}n-g6(g&LHyq%o?;&|HO0P73R1tY z9-d`u|KG<hya#gL*s=f%`#l>K?8~M@+^6IyV_)*0%ieP%WWCV+&s*(gF37YuwuFp# zY@H@$7shkcZt*!te=Kg{VY?Zjm+WF}Ap7&S3tQORNCnxSY%vALj}FroyM#tH`#d8^ zdw!F$jlG|YnSF8}q<>#O$I<SVv6MZ}PDpzyxrE=|x<}W3wZ%(tc)wU-ZF_L%X}g{R z$oWdFLHYKr4eU0pzL54zaOe)Z$NIbM<laHdpRat&ZvI|od(RTcdd}hp<@SDksrFiS ztHI_ys?V`yT_kJo`cw|g4`aG$E4{efej{`~b!U*W{n=y2_W#2m`Kci2yyaWn6#H{w zU%>u(@TSRbzRPnvQRw{YF(EViJv;x|T{#a~&vZS(+x}?mUAsH(ko99bW3Jov-1M@4 zsR=1Bs^*m1=dX>obFf(sHt(=NlD(zAz1_7^NPjnBf1I76f0f;BaY+3gbZMWRUdBed zZ@c)x@txIgW_N+D#=eailD}{LGPK{NP-DM;AH+XfS_AA?#+2Fp4}^?goR}kH|6ygZ z{p&Kw`nJ6j{Opf&+1nq8g@l*nS`C}NCt7wh@*w92%snG)UlGP=w?YXreyX}f!#-$+ zq)pj7NPhgSscio&BE!z93F6*J_FTK<dP)0DIgs;J&iwJRw^eqx52}LHrypOW+v?eT zvOBgLGT-ofM}*xp_sMp=Um@!o>>2{?Cp)Cs|FVVTUm5)z`+$ok_Cm|^!11$P^0ggn ziMjoSqi4W;jU%4+E{)Ud+IB$7ulZ+J+a3Q>Z2w#i;vcP5eYS_?#O)PLA>-|p6|S~3 z6N2p7Ga>2iko11L)L2=2rg(m^d0eOU?7!UBw!iTe(jR!MQDtw;m1MtoCZxUgOP1Nb zu*=xq>=vYa`o5>$zGtVreH-+=(6_U4?Hr9)+3MD%fX!QcQqg__SG>J$0wnz`<504z zJsNEHY9(a6PjI23y=QN)U70oHyr1MXFYO|1me~bdfwX_Nb_Lq=t}(LDN`|!8N|Q?M zb>AJbTVkdIHs3cw$ezt%yWQ?u$a!%O9)Gm^yEo3>cM)VgzW0o7yDwF7_M5gt#{bup zyW3arp0{msfsDsin2TEnt+uvb6bU&GHT64-eT{C4y}>+4_(l2D+V`FlwZEDIX>SNI z`q)13*0N>h;RD;BI3>@%SU<*|Pam>AQK#p&-HVBV_7i8sf#vsKmaxyda@<bc4N`y3 zeywV+dMC!-g9EZY{k-&9JFSIWcKZJy{fUDw-R!^1XW921gv@`j8x+~;ZO^h#HGs?) zUbYalSBt%G7c^5DoL?k&T(iCT^`@N?2PFUBu+FysQ~KHN!5T<=wfk+h?Y?;z?1Jt< z(#Ny6DfXqJVfLkWAm=RwFL+{`dFifQegtGb%jlNAedV%cwo^<X<0avh>~^_FzuDcp z14-|<cRjItKcmI&>K{md!(?BK{ih9o?U=Vf#-C#*8`&guHQ3(KK57Np52$GuU~9Wj z+m3ZNWIquLkFLF?;zrvB2}pbWMB#e7|J}lN`_Du2huPFP`$Rrj+u*N|{oIFmW9$x1 zmbB|kgUk;<h%UBQvJbP5u!gjsOD6ExSIAb_TUQ8y!+XiC33jKyUa{l33K@S_&&snm zF6y)Ue+bf_39<QScaCj}o%a>Udg2Dg|8|r4*4br!g6!XPzL#UaGqcHttr@c3=kT{+ z`{Wth?V8&m{i&`hUb_XYnRfn~knzg*+b7y>Jo(6O#!txjZi7>-ePQECyOKgk{d2RH z&0Z(4&^~1iWIW`#w6^`PpJ{gD7a{XEImQ!gr!7*j<6aC||C@WV-2Q@_y1l+Mq<-5m zH`m@?PTKCF2xNR%V`-}GWWBkz`Wle+9~xy{c2no1+jG15gVV#+e+u?ZoAqrcuI>Ye z$CUg_Hu3A0+b!G$8J`g86|&!-=3;m57G%BPxuYfa9n;P26Hh?S$7QsbXLmpCs2!&m zWIlg)#(djd#V_qb(jn)WIPUsyJB970-Pz0g!S?Ovd}GJrw8c)919ILQb2^XR%5N9! zwx5Tb-~Yie#6Dx2uKiI#$oyr1S)zS))?B;b|B&;-Qw@~tN++(eyLk;#zVC8Nv_F3} z-M;e!q<=4RsLp=w>==8&4#;@L(w7moW%u;#8myt?vBqocu1u=4+x-f%KGpNAoBc2I z{dOxVApP}2$K&kpE(o>vISW}25byWKcHXWE`+p*k^49<HeY@U2KK8S8A>)CP-!$#- z8R^+CX@HbhhrZ_7f8Q5oA9oVcKA(Mt-F_phg}v^4Nc-QtYO&q1<7W1!tRV9#Ca%Hu z31Kew8J{5T-`Zeq|E>PA?b$*}aClAL&}{2rn`m#623eoE3$)&z)xrLjKP3E8I!f)Y z^~Kr;SV78<!&blTelyIr(@KHd2X!LD*nV1Bx&8mWkp9(%rSWzVIcfIaY9QrR$h2PD z=Y@Cd{8=IAN&E;5wio|qZ=dT0X`i-8KDP6=7PddT0FvKV{K>UrsF-SZS^(0X?bGS9 zQ%TuoC+r7FFNvOd_J++ac2>(E<#o7huKoTcQg+V{L)s5(*9+NAbW^b}NP_GaHM*l> zw>fUT9s5m4|C8rywEfW;{Pyv#koaSMa>{Okx1xPe9b|rW<rg)3e(RTZnI(|*!D9CE z_Fh_P_8IYz^+-qeZ?`+Yl+A8SHl%&J<B+#qY5iHdV{;+>#e;U)_P0D%*iQZe>7VUU zK5jQ_4yR4ac}RcjVzH%tnWwZ}$T~=RX<D<>?uyU?yDepq_PG1{a{FsP_3etjLE4+X zFF)Fq7YN$3v_Q(Mk54by)lW&Z>$(rAkNB+j+nO#3x4*&(InP2zZ>wFrfS;ZFX2|&N zDW(kj?w4omSe`-3^9c(A?0M4{+gbmBjK?X(XW6H?n%XP4LiV3elGe7%D!Oa;wgfW% z+Z0@GTh{MwA6^HUKRUH^y4_woXZs6hAnO@+d+oFBKU-ku@)pvbiQ;Cpk6or>pArNa z?>K(-tlhp|8~d5xAmdkeE?L_xQrl^}u?jL?_}Tub?L75*`*-&s<MoVYm+bUT_}l+o z1ldm_H{H)ZP~FP@$OXuF(6(n0cBb!A?58h;l>f8Wx!C6>m)P?fLgu$W=_uPT&1tZk zdVdPIyxG4}*FO0FdON+vkotyQZ?YXTcdWg(8f5*ywfB45v#;CjJg-B_f5r!%_SRRQ z+R6Tb%y({z(zKs5iQ9gUGK8<`m2W?1ZHfJ>*O2jCwYO~cyIh>@t%M=@x8rKCeMViS z{e31#e94#d+cWFh+3!3F8IMSG+-m!3^C3I^*^vIhTm3_J&ejFCH)lcigQ@OLx6e1- zXm@8Rr2ei^ondRo@zze{9_0MTpSP>*9ZodZCA2}(pV*B``%C*W?H?UK0nX1Cf0x_; z=7_ZK%7mQnzx%nXz0;fhcEQ|`@r~DCXWK2+^S9gG=>=}Drv9<AKjGwTzjqtN{ajp+ zZNI*XwBIBESwCO!$JTx=caB|}2*iD!)6MPee{k8^#6j*4Qnlr?|H~C_XKM^ef6s4d z*x#>mvO81C33iWMZKR#~ZB0A9Fv$9j_7C&yYEN<6X~sj+_m0|Kc2Q9o_8Os(_}HUi zX=fK2Y4_X_(jR(txx#)+V4?l{K2C6aF7INrkJOL0-QWkAuis>L-7amtw|$;lELgri z{-oV{H)i{Ac}V?sFV4(<mRyf*_9aOB+*IYS-L4obd!<51d#qfO-JWSrf&GW)5dZr8 z|76#l(O~y=MJU+)^Y(VyDHY4wzuE$+pN%pe*ahzOwtuPtSzpH!>Thp7(ZxRJKIDGv z6FUm+51aSc^;kpNgB9#~_SV}C?LGHF<^%mxMC~q{Z?=8U2^lY~yZF!U#!(;p(;bld zdiJJb+o$WN*>RnQ<OiQM{`OgoLH06jkntp&DOUChOf&3eu7<4NJM+%n{{DRd`$Bif zeMegt+uEP_-Dz#l1{r^Uw>HzBB{RUjYC5F9TWkH$=8U3~ee`CCfBz(T*tuvL*iXxX zw6Eo3l<gv#LhUD9gp}w1Z!6jBUR!B*Q4ca-tv=b(uF>a&UG#fM`k6Q7g`JU?zunOS z$ohk8ueIz?rsdgRErgUmoowuOQ$o$`(-%Yh>!cN7H~G_ZyRg&W!0}bxw!yZ*Z?|3C zT*&$)&lOho8c8SZmb1r$!+%M%s{Q4YV)pwaA^q`^o@Tq-3+(O1=0Mu7r>B?LZ~1w| zPPZLW{-(vfuv_v_!2VVgq`a`Gs<HF0TWa&O9<tsbxIf1Jgt&oy%UQ_!Obtdi`|O*6 z_E8@p=VxzU+F+Ml|Ho#5DWtvGw!_*!WZ8S$8+Rb_x9Zsk8{xST_BW*=?XSAMt8Mc? z{<hm64oTm66NBwP?X$O^^#jr#;)p(Hw<pZRe*S96dcDNV`F4B7mF&dBA?;P!BpLf( z9_Q`2nj!7utpd+&7p8aEEj5L#kGpw-+rGtL+4jo?LvVQMvl`kj=bvi#AOSLdIlpv@ zojdml8`fEn_Dz6(liiPs7~6;ykn>-rES0hU`-jKw+#|^NW5{1V`?VL!?CYE%_Z!@P z-DsEeXSdz$!;tlQhp(-&d$dW{{^}pd{_Dy^Rrdchr`Wwvg0%OVT~+P1-<`GF5eAuG z41G{<|89Sg{f6#paCzbxWN0UQRN0<G9WwqqCGw!%+yA-tdzM4?qn`a~WFH)7V|UvO zl0P3mj<wg^>un#k6*9iP;TW6!&yuZnTf-pZBl#Km_E{UG?R%j6k5==!*`ARuw7<0j zk{(y>TWsfgFWWxnBcy#}%T#ZFLRrwBZ4qQV{%b^my)28M{r-iJ{?XDW+4k!rZ0&n< zA?pj5K5(}?rTxLSDi<=p#6RPYo!kEad;V5P{al(JVXygE&)&ibvft6AWwl-M@-RE+ z)B51_S@YJ@UeQy;PHrt^Je)&Z#{SG1SG!jyAobVE+4pTbf|%{~mP7XEJbaRBe>8;2 zena>&uzvCEZMG%RPwj-yL(+ry^-Q~cDtql({2}A1AJ>1h?&uP*x7LNUS8fHE+yBYP zwPlKg#P`dq()O%&>GoHzw1emW91UjJ&0#39<9Y@uFIH-<vn$$i*JkQ;NP7Kzu-1MJ zi?aPcJ4pR;w@cJs@rRwgUQY|yJy8=*+A`f$vG;x^1ddPEFXncstE}xOHEaTppNgCb zwzp6yvp?<wS<e=6KH6?NbA|nz4Uqj8f{GUQg(3R(Z|^07)hpgqvE33f&93n%q`cX4 z+0?e$N!)(E803DU8r>E<|L{C}-LsJSn$AbE_D+&H_TRTd>MN->9Xt6YjP?>6ApJSR zGkJE}*QD&zOd#Xo;WPd0buN3@*O^1oV~lQyy~BJN`)%Qn`uwk7qMg{}V0+(aNPA<g zkcpl87H<3f>mlu%IR;L4I~m37C2v96)3&|0Y`?}S+G|)s&Rd+X*Jii5G}-?6b4Yz; zI`y%gO$4L8w-ltjQf6(pJ6x$_?`jBX53Do_u|KbqVSk?wvVK?VkF>4YF*EzTEJ%8E z{9a|>^qI^4P9;SBcfTZiM|WrYPdt$Jfa@wp`#0VN_Q@=e{Wk1d7TEbFFxy=^1X*uZ zbV0-J^|AuHUS~-7ZwQdK7is!u_gN3J-+IcCD*L6}h4$OtL+azA#XWX6ErRSmUV^Mg z{Ukoe_6skMZNCm=Kjs~g?{@sGQ*3h|L+TICR2_T$x^Ua~{*d|LQ+q$#-8z<UpQr~} zzpyRtx~+Vnp}plX$oYErBm3=sOn7RYPzISF7XG7V`|FRs-Rmci_OpQUUAy=G?)I0b zL*@&ZG|lXrM4ar?jzR95%s2dJw=J2?c0oO4yu+ZW#Qv=3ecL!ji2L3fEU{ZrEN;Ju z39=sM)XOt=NgLbkGCo1di>_HaY^H6uwU=ptw6{2ST(HYs9ATf*`4ya=745C<3mqBl ztUfY=%TL#r)^=qK+ICXkA?1<H{W$xjfs*!jq9OMe@&+f^`hA^e_wPPreo^bTg<afa zKYL3zNc(rzHzxZ&QD^&NeaQHlXL*9XPQglBsl|}-Lz9mS?5?_gw>w=8(SPovul@dX zM*Bo#VQ_vbIG$s7_;9BE+_jMNT?CJ9wtLE?YOk#h8P8j{?~9$;-(Y)>=aBQwp4@V? zFS=u7f4dOUeve-kWxx2LgZ-4vkobvhGqBH<$hUvmdk5^lX=nKC`Q@J2F&9D3_u%-$ zVZV@PsU43f<o-6XpI2;O|5LIr)P<y{cTxrRg%2Ov#cM&vD+BzP?WZc~*q=#;?8lK) z&9`5+`GC!hXvqA>#2Mf0zN9eN^F>0+JEwCVb{p#Z?EYs#=1=N!nC$P&V7C+A30V*0 z(ZFFhB`3)K+Ycdde6XYo*asIKveT`F)c>uA9qo-wv+SQAf#ioR4_IvHcg?a{(hlk0 z*HnAiJHIcn@7@CG?`-Evv{kMCU?+baQhrq}%e6~9dd_ao9Z2{lhsW6dT$g0u!V5{y zEpjII-XhCw1(_k`pQS^nExW(Cef@bz`kApt)=o0t(ti00$b8k+EGIkbHIwaXc_H<; z&rNN6jainq>zyF|n>3rxc6qk*ZCS)2<6EprS@v4VarW+Pkn;v6i22xGEzYrDXd43d zZ`|$8cIQgv?L>Vc<K@|>a_yIQhuN{OhRpB%W@EO=JD6!NRRGz~<0-w{u28hx{@)Qu z`I+)H%6=Ei7hBzLkpA&KHEp|@X7lWPIwALKn_iE$pZTTAK3#t@*uE3S@9d_lzO>6S zgPi~D+`iLx(aXJdof6Z)<*|Xej(wA^j@?WZNO{RsZE4T{lf^zm0MdU5YO}EW+V<4$ zohM{Jf<!s1z3%*%c9Uj8?z2=~UubU~8)P5x9x|U|X;x}KKS<a9)(^<~pfnvL`!JaZ z`(5IY_TYve7WUnrjqQVYAmb@><Gk(nnCjR)_~;3Cuf>`|`}H*~cK6gF`QcAYnSFa{ zp1uEk$o$&W#&r9MAJpx?9J&KmpR<VBT2&~_{$@0!{5B4pXICw>-R}EsFR=gq^|9L@ zDVSxqx&xB`u5g*#o84`(^MdZTSA4O+hH-X@y~BG*`|7uxlKsZXy7n73<$=vNS({-u z=gCLAj7O05-Pfk{+Hu=nwR@BcnU9HzGqPv?e$ehi1mwK2px+bi^nOjS^L#M{te;=! zq+K!NBs;zJkoM@qk45&uniBTc3n1q=1<ID$w;cLwd#(UdUi@C_ZLe}T%s%rzWd5>? zX|7%Bsc8GGDoFYLv_jMVz@^`IrZSN8GX+vC?AMA|*k>|8#w%9E6xmDMud}~n3z;7@ zSHEjlWNT<&Fbi^CkcdO1y|i_e{ep+C;P8>Xn{Ds9Xs=y^0i^u%?g_DHYg=qL33}h? zR@Gy+%MbM1?Wm{&t8X#Yvac|jW6Qo5vLEu6<{vu^{v&p|?U3?mtz56&bao3{<HL~l zXyIHN`>rR>_EoKr`JG#Hwe3wD&Fm+oK-M4po3Y%+Hdxq>Wf7#mVR7Bw{;^1%z5HEB zeD8bbWY6#^)826%q`!49zrfbJ&d$E$5oG*uf=97EqjR|Zj6g_#uGp#EzO91M{`qw! zaQRyGKhVCox86STJ!C)0^EM9q$(B8Ki~cu(<7dlv8~Z(ddNy?~knst<T1|V=2tE5v ztz2OJ2Of&p-<@J?-xvk0zxdtkG;TbzOUZ|{e;+4!*n4J2+NC5y+IK4acJ>PnciF}6 zhm1e5@NTeaTA5_GzYDVel;M(yz29bgJJZ>a`Q%y4<Lv&ZeY0Mn0pYi*7TK8=bJ-WU zLfTKOFU_>ObhXcJ?SDvr!*4r_o%o9a`$N$FLhEL2`)emz?QL&D#us^Iw%N_{HMid! z0h#|;b&cKjcg%k~n}<5!_&aw`-oEu)ncXTa$oh)feWmuoHEnj=_CxwZn_9T-I0Yi? zJJ&$kw@EdD_J8J8+g_gm>Hmp%{kL1xHp9-)pafjM{J8SmZkdjx{ns+ccx2F(t9DgU zR`%liAnl7V{wCXh(r4@*X+Zh|La~?Z*kl~-Ysw(zy_X5IE12nN|9r9s*gWRf33jy~ zF4>tKg`8g@7QkR%p1aR(i2`K3){dv`)-S}F?AIAU`p2Pr4DBatEVrBc3NoG-vFe0f zh-I+-J6%Y7&mvLLet~<R-P9<E|F$HE+x_G<vbVkh*>7TDE^YtB-^rfuFr@sJN)WT( z@>ADNeII0hncmuoc7fc7>;xX^g59V1{i|K3gQWf850LSG?R#1FKbz0k)~Q3{>%u=- z`w*t9wrA=f`Sa^u6}$N{KK2_fL;54qQZDv7$DQn0cp>E>r-!yZvv8386$42BqP$Db z&fs;q{TVw*`j1?H#x6ri*gjDf62Cs-k8OCk)a+z=A>lpe^F=$8O;7BO2|?x$f{H}! zSB2!-$1Q`buMg=_wYz2%VZZJ%Bz?{dd1LFH{KoEQGbH?fo)orMPL#JdI0!kPG01wi zUG=wPcFB_<>3!|0D*H5(9NV;|kp4!)?Kt}h(=+XK6hDK*W2VU~y9s+0?4Rp<gY(nh z6~6Y~H`MLfu0htLn&d3DJ3gV!c6J}6zge#wZI|t$YVZ0OQa|#`nA$fi_p>+CfwWhu z{?D`%Hp;O-=ne^wt<ClJl0W|2Jy`+iFU>yj$8PJ)SbIekNc<kWWp0<`5@DbI98x}r z&C$1iByVo7X9`(=v0;;n-R>6#c6YcS{fAX`;dVNYEA9P`LH6fHXx*^uF`91YuoW^s zZ7H|ZRxOFie)ThJu>W}5wd^nch_%yR2-#m`_wtDC$66M9yUURAjF(Sp?3XjL*iV@U z*&lSKm%;vDjik;0i;(i^R`PkfiAA9ONs#@jD~)#B?fMaK?{XG0p10r`uYFpWknOrV zj^O<H<I!F_7m*sfd9NVjS&OfP+uKTM+n;2I%y%3WK5WOb&)%Nv8DzYrw^_hmvFnOm z2R~&0*A5jvdy7X*_WF+?<C|~ZzqfPh`)`+Es|SuBhvSL%0=HILEtmsokNiKNVz-6& zg5A!Uko6kQyC>S|FL1SY{`m&1UNii!?OfjFcGg1D;P6N|$z|tVVPtPV88W}L`S~B) zcRpP9PvzRd>bE*xu)A<A+y3Fg0C4#^N!rJ5_m&@aM`uIU(|4^2wTu0zZmV??vK}qS z*T$ZwoXK9x5n{iFp}YNzniF>Sra;zXf2s<x@6O}37kUHf4>NF2wAJ+qvu~7uv=5Y+ z?CpfUm)i3SL)I(najmuU^FC_3MGSKOz;-_y`v%EGJC7TX@@I;Xuf27;g1y9gNct(c zB5N<77i|Ap2-1H_-5p^sGlkbyOb{|2)ZZdzKSj;ee)@mNdgNOoA@+O1dF+o?L(V7d zy3lVMz4V}6-WtgMeC226_R=q&+Rgp}nV;x8$!j-li<14?_mJ|vxHZXst!1UX*i6WH z!%W2$b}1dE_GR}W>rXW<&A0opi^+bY8>Bp1pAcua-j>O3VJ4(MwQ!-d{Y9@zdlebT z{QHSTO125-`R%<kA@eDRHLLB5PaL;P<naTCzt8yvcGLE}wzIB*r02i@AG_^>=5{id zA^pqsJURA@a~IjA@I&UiV*W_k^MCZSt6_zN{}ZjFb^>SF?GJlG&ZD^a@`#<vws8AW zPDuF{@l4N#`Dux*+7w86b@{;?yN~a+?7!cG)W<dditOd2Ozn3ULDGNQnIOA|&Ia}q zCqeS_iU;~OeeK%TcM2fm$*xsycKQGO?9{J9&evI67;GPw^v~Ap24sHc_o@B1%T8F? z$7?{=bJv!xwmbCUmF>Q(ko`2woRjPrm;JZ1*=Yq%k2ak4_Otq!>=n*m2lJ0ut+r$N zUtxdsC1n0BvL@BO{%^MZb9PAoLndsgP17MJyI^@pdGEBB!@l<buU+9;$obxKdQA42 zva9Sqq(au`Wh86bcQ7j1wf%$4|MS?f+cke~uv;ph3C=H%zWdrYn26ak`>Y4^*RJ?x z&1e~K&r}JS&kE{`w6%4Tv$x=fjDM+kE7{GzUu<vBy9}&;eodbJ&*(_|Y5~apRu#s} zcB|Ur?CUcj_NSi^vA^Da&hC*4Bs>rAcChCv%Cw(u4A~F#W*4Jf;Z-4fhM&gZ@t}Wi z<?X*LF|jX=hOFOtZW?8OZ4Q&YRT9KKi}T&>G`d*qt!G2qbAF<>yvjoMA9q3e<GeeM z*<IUeWp7XgDUZ~W&Fo8!H0_;IIKb|8O)s@Ko-x(dXO}$KJ`RgjcDdE+_CCiU^GVMg zBJ30LF4)DdUIbQOS7KoQdMSs!qBf+wFV`@%U+S-9Cw2kSKQIg{vR5cEvPnq44UWI; z9iH}2rv=%Ge24URmjyG}Pk2>s*PH=qKgb(~+G~d^+J8R}X>V>Rd~ds`WW8NB6C{21 z@io|KJI}H!+6t+UnEe{<X4xv)?@fgCr<ZqW*fae7V#l8W$-m(bD(%0Y*0%d14GFIb z?l}7r=@|QC&XDq6X8T*arG<X>>DM9swJHxGdjTy8`&>at{xbXLVYl_|VOv2S$aqui z<`Z^T*X7#VBtzOGUcrm(_Fb^F?UjYZmw-;X{W6c~c3poU<IhbG`RzlzdF=PpK+1~* zp#=N);lXy5-yr!tze>X1=cbii$sNf0ugs1}`%N-Fwz0yH^@cM-+Uz3dGTYC)1zG>e zFiqcnn%;Wbl%<gR{ifeSyMta6?4*?;{flpB?d<sLb?iS}gp7ag6f>~jvZB`hPab4G z+0BH*{>YUS`*$Xg^(-01y7t{UFYOk`LB_{DAH1~lnYhw!K6L+d;%hT|QRiIyPtf`- zCyn2(?zEfzrPEU2_?&#~rrm-Vd0R0rNdJ9q9E<&_ZcF=@`jGirHh}=UBx7Y;&rnEz zK}NmC{@ko|yND~0_6*NYL;KvnnfBbZkoJVYg=cnY$xrO&LFX63s~PNXY5cVn;ehmy zE}TDS>o8TszH}jEd}AhGhP@NxbUQnL$bAppKU3^0w%oJxy$@Lr>ai@(zSTCy{&4pz zaC+YR;Jclh#X-A=36S|lOQxT;DhovH#iu~Z6Q)RYTZiKU_NS{L<@pOwCHt8Tt#%d_ zkoLkE>3F*k4Kw?z!I1HXLlQ>ztNWttc;-RMpKA(=_Flgi*u}ckfx~Cw#}xY?21#~j zPi_O}7iR4ZwqAN~Y?byy>i@f5akdf%oorY9fsDU|&Z)L7km0b8ko*j8Pb`!2w%=}} zZvWl_(!bibPQc!MlcD`y21tLTQ&Ye`?#FVw?+uXlcBAuWJEg<i_I8UQ_X)4|4z=&k zFSq+D0a=fgWV+C9*Pl3hc`iu*=iT1}cHZxt?PI4w+MjnHTidVx9BIFZ(;aL-!(ul3 z$Q$YQjm;%s|IDv5vy-1xZoeW05`U*2hS(il<78jc3fWJPR2XQ_wtbo1vS3JkJF&3N zp1U>Ke${+Pe_0~sj@=C3U3TAvAnl7gQX=+uPI}s{dJDOKHEel-y#_C{{nXcx{9m?F z)?U6R+5W*zNPp(CJG1?te0lrsvylGXuVgm+kKPh?C%qx}!5OU)wf9I}ZpT(|1svXK z&L(!^uQ}`$CPT(w3sbJ!eb}+Z&f5W!fA@0luoIlK(QZxGaj^Q$p$hh*4DR+yZydn& zZ|KDbc8^TA+0BfD)Sq1I|Je1lOt)*g4yiwl+pgK|EzYz*@E+1%KlA*7t$g`SyF2NS z`mpttnti8yvHhWIko!VBo6p$pKFwkOBMNf9RL%)z`zd!!?I%k>+KVP@4eX7r+3ZAL zLDuK|+Ujf<ruo}W*cp=FuWk~t{~Gk(Hn0t1|6AMDcAUX{_L6as_Obl$iFS8ac-b;B zzXZouV5Ysj|Lym7i<&Qi<FlFbwCzGJ5&Nk55c^X+rrA!vl5LlB53=5GGQX#t9QR7Q zk5-WUmRP82|JyghzEvF3e*4_1Xs`d9!#-%48#sLa{VTU$`@+)xS1BZZg`CvwS<L6! zZHJz3bwTruZKaipeQE_HJp@0_v*)zPwg039X^&f2JJ?1p)Uh{Fg!DIC_D!+vVsf)z zyBTtSM(uM}`)Q{m><=nH%-<ZAW54>lf$jULkoslG#Ay3F4F>jCk3+^6HCHm&&l6o@ zCwU(d{@>>H+07E3Vt4#Fr2kpb#chAzyU^a?k_0$BF0aqE?-9(kJv0}R|131(>~pr% z+Ml`#8GqFBj<)~aC~fQh4zk{(WBUTThWbagi%rji_5XXj$u8Gi$==x&Qa>cL%i1gU z@!9VSfy|HClt$Qf+F!Aoc@@&XwPaMce|I9wKH~u-eFr~KuwR_$VRvl>WIdQsz)HJ^ zi)`%!ZzzD%;}NlSc3Xn9?YGFpfcYvbYwh1uaoVT6gWS*eu1?Tix96nYqjQk^<^;b5 z+TT_*wGV8EjEC*ZkFcN7n`tZd8<M`5wwl{pD(Kjobwc{z`#F{DJ8YBef3JY_zmjW< z?GD;;+P^G>%r~?CSF;PK(Xi_cf{cf~4L)cW)%VxVNEecSxgT)Y_g@ONKl>k2{#iV? zx8GbHZ0{2_9~?dx7nRsMem!Y-sS#4&szv$O9X}LpCnfeBoIZ_i@!B)8m)RD-gN#pm zT;;Ma5_Pw~HXAa3^WpO*+a$Y7c5yc$<@LmJ2ivZHs`mB<konA{${c&|eg5|8dH2BK zvxT|do_(RCUE)8;`G?O8{Ox@`EbTvBfUHlQkvP?kEB=$+A|FWkWg9-<Zq1V0cFxfA zX4-Qs?eD)(u)lO4vftawKf>OX$J*|s0c5?<vzVPWkuxmq6YoOmzrAVk_Se7p+w;wW zlt0oA()I!WqV3ybj)DDW6_H@SsocZ<PA6pi@V4B1yR>R|`?nL0gXJyF%j~?@h}maZ zLB``>#;vy&k4?0{cNwyNH(|Ae{dFZ5J69XX{@TT#MC@%#v+O;+AnncRS|0Z8N1W`< zUO?7+?9$h<&FlBDmt%yux36unt@bx{dxPDO@#LGf?DoAmZFbvAA^VH7I2G)ft@!LR z-a^`ou9G?J?^-{zn|%>7{*c_NXuo&0f&K9nko_C8>z~_IaT(bg6hX$b_G;SOZ_S=+ zH{&(rJVKT;AM9#Z#M_HCLhjp9>khIPxvXx#Y71n1ZpX82b^_Ck>?K?v<0r2_%i2F; zbGPp(fy8HEwt;<V=N!AP0*HUuAIjOQ_~qGi|A(wMx<6;N-Q`1X?M^@c0S-S~^AP(q zv%|LAPWXe%qcERL`&nu{_6C<B;~j1L;_cThm}bY_2^mjo(0y(bxy{+W!w}N{DDydK zTkj}lZ^;Q+k8OD`*Z%gFLi>rKko!jimALJXt>CxsTj&cme`-vCy}m|+ox9O}u>JP4 zHrmO5jkCY#23ao~&^pt`k}ufqx+ui{2}}6xwyfc|U0efcU)|bRY_I5EWdFTK44hs? zxL(^WXAQE~d=4qUv}9WBgzY2kw=Rd|@45DQ_KPx#>~o;^Jr{Sh*xhzZu=jwjuRF7M zqFuzLYj!e|AmhJ_n77!ni09j>#X{zvzRvQrdoW4FzH13&f5pn2B0KJQN&Cy9kp3y- zMq7J*4_o_r0+98tp3&><IDZ+~9|(ucj~rR})6V;kq}{n)komasBf0keQWx#MSU~2V zChX+2>zujPu23We?4Jvfx%U4AB<;7yp8|)E#4k<zC+`#OmA691yVRV^>>~;)?4MLY z>Q|oyO!i?h+IAh%kpB3@Pr3H>PtMt$&w-@R6b?Rnrd|=de_J5&&z%xucWU7eJDxa5 zd*)C<ko|GRN_$B?NdIZ6MZKNfvow3h-H`U?;w(0M881;=ZUIPsIFN5|U$m~wo*8=H z?Y7+!_FXF!?4Nf)#xpiO+-0}%wV1ubPe}XudF*@J7x8CoLoYzeL#EG9?T%c0Z==}? z8Gl`H=8)Z|Hc|Ukry=2UV@sgz*ZDs7yS72vi_526w%aZsZ{K(WGQN=eBgg*1y*T^* z`yk_qYd1&Ovrj%{mmmz8FPL`srY-MNA-l^5A@bX<l-d6(skPsA1=60G7i(g_?DST< zb8M@@?b%&xuh=Op{%98}0O=p6`c1PFJe_Ty+yq%)bv#qp{$SE9yYA<Z{l^k>{H<eV zZn0}<hr~x%Tb4bOxQqS01ju@d>v6vJ`TU0VKaR?R%kOEj;`TC!Iql6GA^pEMiC65- z|5LHQUkOQHN~itpS}#l6--PZ5QH_<ecTHMgx8@3@KWMyJ-kzbu%D&tOGXHBg)ym%L z*;bpGk0AY<YhPpRe@aN&uU!P`-zD7@v7h=v(mwh<q`knWe%khR9*cb}8zeqbzZBcG z%wB9aT^rI~IdY-aF5-2D{firr_R3ikb^F;C%j~vYhm7y8+vR5`#?Nm5W{nd#eYVWC zwST)o)Gqc8r2S`5q-38b?`mH>5pv#iLeyc)@XY^qvg(ljV!rTXJC@L$cI`Tl`I1zf z1p6oLh4vO&ko7DFqyz0k&gj{)w?Njv$||wh@4eh_H)%0sz2Xb=9DDvacKfC;kox3; zK#YBXx0PL9BxHP#=i);<{^lcgjvbKu^bSr|w2%Ao&-QN+<b1u#1Dtj?fll_iUm*RN zZ!31&Ezfka-xLTrzn$xaoc#+^d)w$>NcpOy`N{6Ee2%^SZAgD+t!A!$v$d@~%Lzz* zy=85xz5VVsJK_GL;QaaZuf3f@n4R4xen@#>Q+dp;Ce_OJ+#<;M6VJ3v`#rKh?ZPHP z);mo2S7!fB<fHAOwuRvEwDncDt5R*Wd%gs6U+HIAb~}r7IeVA7P;hw}Rv>B5W?O2v zs4x-CPintycPZJ-K6N6bJl$XIXII~=Z2#g6q&;7CugAv3n$x~R3u6DqV=rtsT3Ol) z9DuYJPiWZMm+pFOTb%~E|7+T5Zu^kc2W{NGLe6`6z23(DHFvH36LHA;xDzJfwl8X= z?G~<rq{pT5Om?}x6YXvaLdpwWwlaHO@g#fcL`ZpbzC7H%dh2|<Tb+>gc&41H_G>Gd z?NcU0_Oq2n*xN09z;3^w7t+67%1~!t{!_(%(F90&wDmx>eZ9*OJNtUbd3kdlFR{7$ zHrM{^Ovw0Bk_@-~fw@}tr#3?7AEhqZ*zpQl*vnf$%(MSK&-UAl2>WaIAm!J=4`TMp z^Zo1}eT9VA_QmV$K8vZ@|7&>%j=z&)e)j$j)9ie`AmbILnHlz7Z@${?TCD<(pR3=v z?XSH3XqTn}2~V~C8TNMhFYTsCLB`j6{vNig*!$V;(qhQ|%>&+v_UDr4+gM+Mj3;<| z?zWq<H^9#QF(khP9f`4?B{RXU`Uhlvz^vUl_I&^2?3;5H!1mQ_w6b639BCI~1hG%1 zDZ<|STaV4n$&mWs(u~h`FD~TRAMk+W&+zX`_Er5K?H2wD2K%SV{E^*p-otjD-y!v9 zQj((ms#a%v)@zXQ-@DW7?Xxbb*dI_11ebr}nH=`dn`Ld3nL@z!zdR~p`)5mt&1zZ5 zdH{=wNA2?X3ha+dL-v#ZeavP5YQL8K**M60sD(P4?AV-`?dy+0%AXk*pV;N|)!L^| zhop}x!)rFjSQYG5;vwzl^_}x=rFc4R1<pXqv-%gJ_D`FQ?2oTw1>4`UPtd-_^ogB} zEu??6qF>1VW^<Lj_GU<U8cuMx|G-;f^Pd&c9^tj?v|C|#)-G4X2An@$tx>SQSW{@f zZpB%!d3W`E?3~r6+Qo`N`V;1tJni59wy{4Aoj<X@Jj<?ft+V|^Ey#N5mWh+?*3S#K z7xjVkk4~*qw~yhwZTDq9WWRj1l&Ae>*LwRsuORkK59ha!zA9)xH4johw2E%9lQ_M} z?yMc8z0Kh)U^kgX&b}p%9qb-`)dc&`N2~1m7taF67w_j@yNs&GcIxLL;n8dFVz<gR z&yHONQXiErJ!s4Elf(Yk1ju?Dhj@AWQwM|WSL#FBo55@2>@*&Jv5UP8sek;dne64o z+U+zxLGA<BnNe%E{85no(~BnH@L6!B%zoKcZ9A^=WU&3Y!bbMtf9BdT+d$fLe6NG; zb9!y;8s0*}tHD0q{;=g6yNpms{?zd6vOB7yZZBsA2_H?-19ruU_V%;Suz>w%omXX- z-niH9;}=MO-{N$MJx7k1J=bZ-{8oj)5!+o>$8D#6fUGA;`IT#Tbk+tt>&uY(v@W2) zp4DZZ-O>Y){`$N2I(v~Fv#c-fgRD3Icv#E6ULn+eeFx-x>cWkp_W$E;?0Nq~^1o_K zk$qO@Ve2K~koLdJG%kC8<->O2S2V!>%{r-VZ>FnY|7kX4e@FB_dHcK{BKC~CAmddm zc1gCiRl4>^xFF?wsfdHU*v}06vb&J>W#aixyD6TL_Im{&<z48C68ol$;r4oNknusa z^kVzssZ923(jfW4LzUG|)%=icSTAIKSiFa;{Tu@=+nU*s_Hy^aW?NrNQTw#}kotK$ z_YK>8)+Rd(Nyzv`fj^7A@WBLoE>=i+R>;X>|M^LteS1A5{7<ctvCsIaXFs<BlHc8C zMA}L`EVfT<*$R#ir&Yf8d7T;dC;cGz_2hrxv!C)I+Fnf)VqboYsNFNmT6?YnNcq@j z{lU()$;n<s7&0E)n(bp>{w>J<&<sfX?6nt@{k!kE_LBaP`JA@!2>acAPwaFAAoCp) zVw~;I2b9^{zJi=*qqk$b-HhKt_ENhb<40RUV(n$7D%jW9LGI_B6rEtVx9*PJsR^Rs z_|Xl$YIjb*)_$QUWIXNB+<&&qq`B<cnj!7KW6rtu8<$AgpJ9cJr`!s2wa->KXV>}z zQlG!=@v>8h&a_W>0hyl*`IKP4Y?GsXpEblk|5+Z`ne(&S$MitT*LmM_?fqUS*uUh5 z%y+9BUbkg(u(LOIVF$P0_^;>LJr66hzqbRj-fp36m)&osLv~dXkn{BqCu-VRU1hLW z7ly3IEZy&G%V2cJF800_IQ$PkG_=py?`y|<0<ykEyh7bhTkVWpq#LBaZ+3~_{xVme zoo_hg{G@j23wAHr&F#6KLef)RMwDIqe--<P3y}33B1#hWYo6NMZ&85kpHQ`zvM-oj zZQpnfvVO{Tr>1RVNTc08==l92{||Oatk>-BeTVcf%GWd72JU@t_dN`9Uy9XfZ@YDj z>UNioLE2}xce&U<wpng>ZZqV(7KMs>yX6JR_5t@H<>R*WpLSROOtX772eKb(N^+H5 zmjsjj!Do>D*tVI8_V2G;w9P#O$&Y%UTkH;1n%Lh>hs;;pcpzyXCTedlD+K8e=uBQ> zH|I-?-CRvbe(i1Nwy%0nYghgmvK~*k%G>VN)hBk3H$%pIQbVI`6{pA8tylsXPpbYm z$8G`pJG(dB{NV8Jiwm<~y}j7}bQ5Ge!%A<Jt&@|d-G@lX`mPS0O8cC1b8WAASc22r z*B>(WC)3v01@J-gvsZJWovlcLy^lMjz0olJvF*~`Ep}%UAmwc>|9QKFr@r=YZa~I+ zuD{W=oAAWhdQ&@Oee02mown;Hr`aydg!uO+(|WrP7k1ipXKx1EcfRABorH|9-I+io zF#l|8mi;WriFRAB6@uNr_kOhf>Y`@5uW^w17_X9ad+$wg_V<(2z~%R>CUyHaGj7<* zltaoFhM7`!W)g9B@2)`7H!pjv{TW_)d%s-}^*`?i*)w%|+8ftF;@hJ?$4+WTf_?6D zNd7PGjk1@1mSCq_KMm}jr@sp9-_;u1U)P1KS7%hHw%^SxXTNhXWPRDLusFL9$3ENf z#X{P{nn&5~Th<@4i{yut*UAel>~<~XwJleIjL)micd^f7va{oGx&m%*2$#s(_f~n> z25f`0mk-5s*eyzrw_j2R>7PwrlWjjg`ikw1caZv)af+h-bBR*>&jyh8#Pehm`!m96 z_N}|4z~ObNs>=SXaiaa)O_26`w;ZSaeeYwonmUm6ddA;3*)8o;u)p>e;y#V_9JcGW z`PmztumFc==Gq|pOQFK{=R6?eOK(F%?5C(Z+m&5_tY@i~cxBh~;ia8~1;qS*?|A#o zo(JuE4nz9a@3=MXrkU~C6yJfQ|98c@_6O&f+1o?+M_y1$v7an%XwRbp>3`>3wXm<e zkzv>I7BZeDQ}EVi$3|iM=pT^z_wYz_`&BkF_PM7a{T*TF2X<;#?%J*GfV79!UD;sA z*wAJ-ISA69nO!=|&d$fee&f^|;P9A!n$_;?baDGl?;-7@37Z>jPuy~}@6mva?>rSM zvCo}*&(8NKq`j}oY-i8&c$r;OF=YHS$?uY#dcKS8UscF@?`J_KcC#kWwLLlwav#R? z34->gxxMWZ7$NQDLx)}L1GeVanQn*7*A)10+pnH3Z2vqAGJnf7pUJ-BQi8omwK+I_ z-F}&8-x@AxQ^yY}A9`<E+c(~uY}<1Ma$c<@6Sw__YZq<)Lc`n8y3O|1L>GIWRgm)n zdOiB>^q!d6T{{Yy?{?j8Vc#`-tKCI+$a?SJ)wcF);&SX~)lLQ5xBb^1yF4XBd%j(e z^_cT6-mxp&U1+zd1k#^!n&N2xfY;t$+Z|HgeBt)B-}PPBzO%;#oIW0#J+SLrblEPF z12R9ngEiDX;c|&R-*m|NBwOt??RQ0Nwt1leDW5G~2G~p1&9eLQ5E9<=LucFQo!V#f zcps!b(EdBa&bP?fUbT1!*nN{?_Sr4m$8LAo0Mfn<;MTP-j}WkD`v$pxlBt2uzWC;1 zy9uCsgU_6?jp|!ymwEKN?G!J_`i?boSJ}#o@Y_!;gWNyF7n5VZ*7$_oM^8xpl=<vw zzqKROcKZ`Zf0E1MhTUPuID4Lc9&mbj^gZ9MKqlEfC<D^pNsc~iCzfMpm)HX-Z*?ku z+xea3v!8Y#9qitVH@oesgYxYfu0ZzF8c9yITNvVHZ*>qd-q5uu**5>)4cq*Akn<d$ z?fY-Xx6jdz?Hois$C_<+Ju%O0#lBmD>(|TmdUosfrP<puL)IfM4?Sd^x^=0Yb`vCj z?OZ5ixB3R3{j7PA`5D&M*><sQrS@;m&jFVw{nnXwPg|bZy<>vZzqh7Nw2RiawC}wR z*-w`@Ki&S@pFA5q9Y}e(JR!pV$%cO0KkktBXP;Dteg9QK`}*yW^f2WGoBd?%TzkQ0 zNPDyJ0;j!w%rV>jj*#}q4FM_pS&f%$j}}7iH)Ed6Vc+(s+D`T>B!5~ZZ?RL^&0}9# z4e1|LUE5~I!R2nh?z<g0ytVVP?F0O4ZQb8O%9|ao=Jv@Y<@Q!9A>n=I@hm&8tN!-k z^C9*>+F55m^S!zKvl58^5(^XTHz!oveRhDfuZq6J+0R|!Vb7QY@t=X2i~Z}Oqjsiy zAoG2Tf@<t5e6sDYZGnvM>~nXv*ZR|C_vJpM|D50U-!AB-f<4O@$bDGKjr#Vr;XL;5 z=0fssW}bw7mQ}mm<~B%qyhNPUUYcLfUiL6#|K;y(%=Ujz@Z0}shm5~-#4ohnQ}V#h zoe^?hb<`O_`vtM{?2d6j+86l`73`QaX4}5wfV6iee2K7^ud22^X9em1rmgg_Pxv2X zKT#6WzB*vkWvAb|)NWZKB>g2#=CJR3Ctx%EEMz_?@=>(C$|foMvssY-(Wz-tcGiCX zY%hF<)c-m)O?HPGl<l87LE85d4d&S{USn?G_6s8aW`>B}?~jx0gx5g!(=qDT+iyyG zY$q%T@z2L2`F5ARr`l~j0ZAYC{~x!jshVXgdIHj)+R+neAAfO!U03KwNP1>UuowE1 zV4wL+2Ap56Ecj}deb2_es{t~el2^9LPPQf4KFAAFzQ}L&us_2gY^OdAGCs)s!`)s) zG0ATGUdVi>#MM|khS=S9nGYfR(;^ki?3s4&wBuU@3D0aJ5Bt66B<yd?L(XGR_^oNb z_FRp<R4n9v>a4cCcB#>R_TT<P($C@9XY4HE^y~$GK+2B^77y$?cB$B%%7m<sn)qyq z?afRk`<gG4!0uOh9%299cA6bmGi3fOKc&&`>h>A7{6UcU^1HzY>>4Ge+I56O`VWhx zJnfC68|{>@K<@L|ut(Y6kActj7&D~4Th8KXuX@|azW5Skz1og%XRR-N>ao3{3u#|G znJr{rapS$6gFz8EzvTR#WYfZtVV_b8Y0p=j^tB6HT4Ud>0?9wO7k1lK^@Q4U@cDw( zCp`XX*ZFm$?awWc_REf0IrjD!-`MSa2JyfBCrf)y-a5PRDUkBSLp{a*lYO#%ObH}B z`LxyTXS(RvH~K@?V=(<bYuElj*Z%ffNck11U21>zM}yt=3y|~Hmfm%<TcgosH~SGJ zze*R0+o$t>wENf&8E^5?{cpE0+|E8r1Y)1YEhBpu)m%I2V95Hrr6!g3$`j=6%E}@A z|0HQHdyi|0_J8dl^E*ZH+wCU&b+vzA2N^#Ko)BSY8+gl3nGe#RnpW&=FRvD2FR%pS z{)dN-*i{C4+FxLX+#k$e{>knUN45QeOvw2vE;b+R{#FUuH}8hD7u9^8+e!CMuvHa? z%;)_o>9jlZ+Qq&s29o}h%na-b6zuHl93cC9f=_bVFD;*7cU%l|-kX!6j9t%bW&3au zNd4!~u5Q1OKgvGhd@(rvob(E@H*1!)7fpt=k8ZrvvtRzC-oAGWWV|7W-^)JM;gend zUP$}2Q$W)$(5}#a(?iI46ge;LZH}KfX{Rs+GCy-lNXq`<JWcyM>pH>aH{82nSGgwC z-X{!F-`2*TwVU~RpWW99d%*Hsy{&e#b!_&lY9Zq>cW$NFmxx-}dG|ur%UlvKvCrZZ zv0-(Bw6~sBh1>tLGqhiL1u}kIqR(Q#aLzZoa8ZbRdpGOb6;D#NUl9z6pZQ*A>?9^> z*q>tJ1LyyQd?Wj#o~?Fou0h&+)=Qo3l|=OIQ=1|E^Y-6D_U!WOYz==x`ajEhwd~J` zY_yyE4s!nF0<kl898*i}R@Xq>H+x34z5f?iyNhQa@l&+K%5F(LzwJD6$oPMk&0)Jd zbzXagC`fs-(=ysNP{h(+^(JJ#*qL41p7ZQa+pw>b!QtU&uWQe^GSFVy9Wq~3qO-}) z#!uA#_t!SC`{&P$vgcM;v}?U{9<2VtBy0Q3>p}K!xu1gbSB(ab-Q%ugJImLQ_VlSX z3;Te#fp$I_kn+)d`2xF#9>?t56CmS9S@DwgTMxO|XYoV&=OV?s?E=e!>?I2z^9eG` z-0d}f|FZL64cTvWTqVlB^Rt%Sf?tsFz#v6iJDJPO_D{}0`d@+!es<+I_t-5LgRB?O z`aa7p?$3E!{&$f2yob@jezjVO-H8hj`#W#mw=11cYX2|+avr48szr8+C%Wx=3n1rr z$6d{{t9FjJZ%Ko!SLU%bwio$QY&XLPa$be-&18H1lqojq>X7h%vCGfy<?%Rs&L@!m z`H`qqc9)nFZN2j#`_to=*xNQMG}}E?hLrbj1+wk0bMxEhDnsg*KmTOxk4Vk4lhB2f z4@b_k+pGVwv+vytX+J%XR=3|>*<@P^-QT|1P|Z$`bB5hPjrHL8h^>EUH`}q^-s%Ws zJjp4O%YL0yvVAQVWPRmgM>ab<?`^hoO(MbZRaBB}Kl$x-yOX;h>p$Ywso2RsdT+Pv zEu{Tl>F;a*gZY@<lhcs%y`C0v+cQX1nD6C<^hf^AXS3gPf!$t|1=3y=-u=$5V3W1o zCkIG*tNvftUg*;XyXh+-{bl<n&h|SjJnhfwK-SaWH`-?V$$7b*W)ft4#dP`|yCW&D z?0$TKtY<wmL&biD??yYfLdg7r+P4h*>`RRHtByd%n`a!qYj?tVo?T!Hq`vUH%WQvg zN|e1<Dul28B;CFz^N<~P4kZ3g1nJoZOp35~c7?3(S#q_)u52Qk{i@lJ@g9>dTl=in zQ|ywU>*unY3hb0B4%tPQLB`kCUzD|9-R^H+6$rWSFfwtI?QMq_b`$*}>jw(=R@tlT z?y~#b4mt0x$9|n%!Y^<8ht81smpuwwYy;QNw+q<_>CYs-47Im^A7@v<3uzyk{C;8k z!?D%wz<fx3!r>%rpL&hK{`wKfddJk=hwajuD($ZNLh4u1O_lbUOkeH(Jc6|63p7&g zrKcaVU7iK$KSwR<wzI0SvRfFj1e`whDb(BlEmXDhcZSsOZ@4n;Tx%HY<q9C{%jdMY z*vB%6+ixg_)Nf+7s&+M(Z`#%CL*~1-<>cF|aB|rf@c#mr2c<lG_9>CCY#%P;0QZMh z+Zx;N3;btS#SU4I89s^I?#0%RcCmtx^_UZn7u%m;+heD^9kQOw!brq^;uU541yvCJ zK6^Fn{l6;ND_n=<*M;9N*>YLL+E4L?+~@rL>w3Fo`xNaD1w-a<SLdbLzn1m3|Nj-T zpF(?{mi@vmEBhsGknx&jc}DiSdK2v~Ooa5uq{DLT4qmCYk1vIcSDQJo+w3~^)pqez zNdG6!yWP%(eTuDYiXS+CI5x`KD{fY^pOFjc-?h9Kx4ZRVp56JQU%>K=m&5H3&%12* z*c6h#V$zgsV^2BSPmhGGkJ6|Lw&$=^w{I?ol)t4_(za>q7TbBSK=On4KTmt*-5oYo z(Dm*z6V&Y+a%=7W<U-m*Igy<<hdwmf1*=2GH}fAv+6&0B+FP%Hj6cLr54Ux$<+6*3 zhO8&xd!AySVm8t4<Y`Fx_ImO@yHh(D?Ly5U>yw{9F|$t$(z3JCfs8lR*%{a$;H$Im zp9h(rXUchL_w>vU8`T)dd2XsZitRTY3ADd`XD&GX#0Og2&sq7&?z=9e{lBg5ubr{| zZ@ZX&$b3`u*@Je14D0RUvmxc<CE3+>e?OhH`(y+ezjA$5U@v)avfaDqknw!JZPE5k zTAKEXVUY3KCoYb57v&Dv?R*8PuN!lF?JV+}Y%704+K=B?cG<jOX0?B?9}-^^BIemj zReZFY)B<TAY?G3++h`hK*PIF&KMu71YIppMk^Qd<NPhCUP-MGe_FP-$pOEpn!<ou< zds;5pF+GKhhe!LJvU88zV#j+KQa;P@XW1X`3b&K{4H+M>P35=0ntsOa2M=U?`}O>N zcB^0M*x!$Wl;68lP3?Z$8`}5nh4h!^1UuRAa=Y4Jk%IL19`<V4@0yrn@1OxG&z;h} z?T^Ksv*Y**X&+S_xNLWR#~Zua6=vZ4RJ&=v-3>E&`)gtU!QsFEw3Ypq1Kl=%^dRYP zmhFB!#oRo5gI|#PHfD~l{hlSi?JgH=1gl>jwB0UPDc1g|1SCC8QM_O)vq#OgVIyRI z{qxaXcFcj{w#NOC`=D~)owohRWMMCT4YI!VVS<#caTc@vD-~#YFk8ny-z(SNGb90= z|5e+M*+sd}veVoFaeuBJv;CyEe{J-|Ao20qwbs5^=Db}%Go-yD?VxMFDrBW?;abT2 zmT8`|{iWp(?U<nJ7k{_0*~{GEvOoM7(w^LXzsg?JI>X+g7joaZEMK6VZ{Z#5qtTH3 zEmO3`j{Ci-?fY)Xdgbr2>Go{D%<ZQ;x`6Yi=lv}E<8N--s%1ddTNO>`wP(wbv#(c% ztPg0}7G(EvqqP0bjga+h9}T?hC7w*Q>l8Kz`)@&8ti2eEn{8eKbbrY|UwfP9LiWKO zkoJ7aBM<v;$9U~C4nxjYw6G4euj6vE_o{*PKmJY=w2zf}WNUpJGT-$jCe;2|LWYgw zRY?2KZ1q{2GYxt6w}c?&W$r>2`x=8Eb_f4L&YL>qr(=8nsDb^>j2YnZjHP82_6y&B zwcFzgS^w}ksM`L)uMKu~Y-_>(4Pm=y=lVg?E;<XcKIWI$ZM(9#eEY>okozQ0&Rt=* zZl;61-FwJ*{~n!UyU@fXcH90z+IuTzI@wj4$=U6J-Y31fI>!FNYje90XUO<jTc5Ih z>Kr5c7ds*8De;<sZD69UeeZurda8M>Z2RrHsr~da$asSGp%r#7wG8d~UO@DlKGCxG z*}-6E@BlL3H^EQDe!@;(dzrbA{*BB(bK4S*B>Q`gpTX%jsl3xpdhR#dGlr1)H6Cjz zd#Nw;>{`?y^INZ?i|rp>)3>Wpgw&q_-?HuOTKw$~Rzvo$)oib`UotVm{%8%PerU;i zW_Ra&lD+zONPWI3`l#LU!!dRON|5&YgN0i5YNAQ@N&%4a@L>N5+uY-C>{5jx^A9`+ z-`dT1%xFK`1F}B+kcX(f=X^K&DW@UlTl_cKW3zh8LA&emkn&iEL(aY-XNBE_P)Pg+ z2A{CIV$5%U?j~eBrt^7>eZXs8`={3+;|-TgXV~8Lm}ot>402w{!@qU*R~H<&bI5`0 zzxyaJW4~G@-S#XKWPg|1gH3ikf^v4UPa*B=qm?T5CsX9?vnN8<TfgZJwAb0@XZL5m zCOCa;>3wZ`#wN`!)CsaaweO;Zef;!r`>7R>_OhHhgS{L}zTL$L$o{TG_8qn@E=O&5 zOs@f#NAWpq_S$>(?7VhC){CrN9$~+Ji<VucD5U*%OZ|wQ>{&Pa|34w^laQ&t_WQpu z*f}*q+Q)@e`u1P9x!CK@fSlK7EIG^ep_7=sjyj}2GIdRv-Ha{9_9vAf<G)pJJ?wpW zZrTNuK<*RZPt&k>S({^TPz@;`cTC=4`>i|M=72J!zNieGYuhKqWzT)N3hdtF%H6i* zEl2HcGeFh@M&EmCr+LlAKG+vBo~HXI$-X9A$X;)S2ROamyY<EH*6C)u3P(tPyeinh zUOi})-DVER_)C+;d0WdXLiXLqA^qo@oVNC9&D-t7_e18t*aYJ3bbhqhY`X!;4~F)6 z_J=Rtv=udlv}Zpi+1k&WXl>`=#tSZA{+L?WADq}=xAGmNJ!rfw)}GJ8*#3*DIyk=C zn7!<+RK)CmT0rU#&b}~vuih5hXL6A8r}4bHz4B8B`!D^F`goOXsjbPGD0^cWNO@#n ztYyc0P2B$UZb<v<vA2;u|15udKW@nQ$Bze6b`Cdf?f2J1<_k|=lCw{)_-5y>0vQi^ z#I9(+?S!wLdM>1WdG6VM8&>B|ThpbG`Id7=_IA&;qwQ<F&w;~lEo+Ybhn<G@$vKep zHd!Uh{;|+zI~xZ`elyurYByuoMY{qXNPcBd=ChN?61M+&1d{)~&z`dTmfdZq`w6mM z**8bqzUa;kyVKD9Er$+y*~$x;*#1;L3l5*+3o`akJap`}Sfs%5ZCZWHPRhf`zFP-U zzMg+nV1G^|$-XE8Qr^EktYup*<!9gS2^pV_lMS)sv$wFnJR36q>MzG=H+yxdy?iAk z{V<25*<W9D($@Sjr2b>b?XY7s`)g-36SAIAJngZasjP<GH9p9E<66O8c2Cbn+1;7| zDK9S1a<+fd9Bdyr5i%e1%XYUNZ*!wv_D#ro(25;Awh<HE>@43w^5aise)|xoLc0vX zEnxpeo4MQHT>r?9&ki!)7PDldUBi4q`)S$#!0Bh!v}Jbe&)?hKn+I86(V~}V&!S~x zzvB>OesSAz6MNedb34{kkoL0T`4anQPr2-E{{8}=?<%9;U{}aE*Djk8GJjROIL>aX zypDaJIOMz~@1{h1+t()c6V5@>3&+D-b~$n#c6YZ!`o|WP?)E&9CblQ}A??v$2O{lj z^-tJ&t%vj<!?q;a^CX+wpIrngFG`rrZ6-{Vu)lZ)(qB3@PszS}(=59OD<R`u(=Ohy zI~&kq*CP)ZPndG%rrlS2Ci^-8NPjx(e52i!7nb(v3Ae!E;~To#PCi@O{$MT#nEy^t z#$IC=udPogWc^~4-#6P^Ap!Pz4<PeZOV3QRy&|e*|E(R;e!SNqVXt+H+n(_?WWD7Y zZ83X`WqkI|pCIF<KR?X3`!4Kiw`MiOJtduSb|=@$+S~qvjPEKNY1!*IYT6$C0U7^v zYQ1LH|9zSrt2$&p`D#&weV&@4y~-qr`L2Cc_C*g%?2hF^+C$e0584H=?67lcg^XV+ zX$IL>Zog~i*$%m{S$w0qebnSPHuD!j>XW2`AUn4Svi4ERko*;FxW(>pN3Q(}==o~( z?|keV)`-~6wTARR_Pk-VcaHV9|Mt2VoL=5)S=vvi&$4?z4RT)Z=Rhs{qf=+tJ}ZQ@ zN24c1+g<06vgKT91`f}=fj;&ZH{Y?#S_7$negt~hiLf==sdqruV?MpvY^P+BVSn%q zbo{(O*8XDSGh2>YNPYU5=eN!Ai*M~tvqI8$#hGJv$JVvmy*7Z%KWuW|X(xZg)jnDV zaz2^R;{$dQ_x{=m=|RrpVA!i~|A$%C?vw+h{r^l)!Cu?zfZd6QQQ-WpanslS^ld}C zgmTDumkRfKyN6<X?RM>hxVKPxfn9Qig8h!CkpAwMFZ1nQ^8c|DI}905ZYs~Uk9ojq zuTj4h96mFDeXyJ1mTA9(4RXKjy&Xz+4=;4vtt*G@&q}q?u>TdQX5VfG(f{_!5xdX2 zYwX&}A?v%C*4o+KcP+EO_XIM&*nC05mR;V(URE74zEUu8x!q}%ySD%5LE6hj?XmVt zQm)$_)r0mIzRa^bv&Py!Tpp6%Q*7hx{ZusV)BZ!&gU7y1w$E&1v(u7<tS@}J$<%J~ z{3&+jv5@hM3m1y)%zKLLm$^Oxm&dzbdD%z3U1=9<4@tj{Nlf<d7P8pOoQBL7-2EqM z|4onIK1>MGp2-%9vtRc;$v!p+vVS#uBZIv{y@P#YG$g&BJ>hKsVp_fJOaaJx7nK(* z_Lt1^>@TOB1lxE0xwpN6LXiDs3&?(UMZFsPmp%3NY;utDVCT*!cEv1(c2yye@xF;q z`RxBxJ+*nY05Tu_cm5%3$v#f|jjfBo>2J=}D|R=G`RvX?_sb;bi`(ztaNfEm6Vm>i zB#~f$CV<I)?h8nLBwQk5Z*1IS$NdPhzvx|ezs){IZ~J=^kn-xh`&-*7FU9Poi&lWm zkA1hnZkxEU{hMyceJrL^W9|JWt+Nqkhtz*h>sHyRM2XnHHiEQYiW}MOQtpe|^Rqzu zmsxJl>{cXCvHCn462EL(%k8G_6t~}Y3o_pK_w#mJ|0VD3)a@Yiw=&PA>=z}w*z(t; zg2QXRinZMtkv7}9NXUL1)<*{Re(Nml)Y>578<w=#=FlTHd$moF`$q*2ZM1v${)F9z zuaNsbrC(&&XKuH&uh)d+H#TVo`(x9i?YosB<JDYu6zsp1&b15jfsDtoXr<c!^H;K8 z#RHlDtd7;OtMjw8U$hspe!nfW*xodIg`Joeq<omX_?q>he@ymX=OO#4kFiDD%QgGk zSp-AU|HjGF>@wdc+g)0}66_x*&$)Jw?+DsIivA1^-yhG{+5PSOYL_(?Vt@7A5_^^h zRrXw$Aoo?5&y=&{+aqmnUI3~8pMKhEC-jWLo?#xNCFuO|0tpGbg1_4KGr}PC#jTSU z?Y;-e+bbN70NeM2)56}4LDBw87bL!3_3XE0=lfx|I~y|Ia@9r6{!W0q{j_vQ{d1wp z+Wy7r^|lo*ko9QHi$m-_UAkqLJzW88p1I6LyBEAi?2`27g3E&nvG;aCYdP&ZmnwkE zn+WGn`y<Oz>~r+k!2T=p4z*`Ir)A6C2`QgA7xCH8Qhsj7vIDZ;*ji7<UOZpVj^Riw z*!;aujO>m{wc9yAhLlgQRSNAbE@j%=XF$?>Lr<PPhp(!=WiVvC|I@<Xb|*`t>_sO- z>gW7h?Di+v+w4>`qQLgQI?Q9Q&~IfQ?GEV=pI>TfS8<8oUj7|q{6hBCT)WHGr|kaE zf{YJb{P5WJ^ZsIcqs@@<TA3(Ld%bu3_9_!0>tSNd#O-63+t_~%g{<GLPh+w3IHPMH z74QRWU)}5{b|)fa?5|vbjK4>hN7{4xU9|o83Nl_@$faj*$f9K5z8kXst7=J#eU5^) z9a9~oKDzo^#a=FXhh0?w#Q!fgPqv$<rfr{`2bs_RTvBPjV~M+cm>y)j>mTn^+ZBHo z+HqJy&f8yd<(i#=X@-3(KV&}A{Xnh#pEn}5niC-NO)oBdwv)5`Zuj^ir2n@vR@(lG z`YOB4LXh%cnTNRj=4tLWebJEh%pK-o_E!(3+yC7Q=`VF{^|xQOj>o<ix_*<LXOrE$ zjxhVMJjni@b1(YrCjIrd@5+bF|9tLJvkRP`W54|tr2KK*FKzEGyut3QJY>C%QnQ!+ zmC38^a`!^^UwR9x+sAG4w|D&wsc)Y>{BO&vaLq1Wt_K{xANY*zy|l$_M4}<}*=5xX zd(#OK_B96~`vVqp&am6>s$tJLAJRYl5b9{#^Khy4a&^e~o5;*}b|DQD?TWl0<MX*1 zTJ~p;KCu(&gzP8i<*~3URZ6neI|td{&m}Bn@3}O>USbBMKfx?hZmUuF->%dPG9JE# z>z38UE%NpsG9lwbnLm2$8rzrJEj<Id&tm^detW-V*>+#0Am_))&2q3$eaB`m*9qyb z_!j-KJHjk%|L_XLy?JbtZ6C0x+9oW#1kPW)Ja6rGSD4s8eh-PSiC*sZ_o|cZC8Z$! zsanGacIRb(+8wEbls{_{@7k?k;IaQ!4(YGzzAd&}o6BS07YP|p?O*-I?$OI2`}Plz z{@X_mBYQ{nqju{S`hxSHzmJ>!&uu(*4JRP!A@?ei{nIo>djUhp`7Lup8tpb8H@5dE zf{Y(+uIsaVYNl!DI~B6N!`s}!-fKpoy_O)PJU_9h&rUGuu$_tn<b0500_yhn5(Dga zEr9fw_H?k>&$$$8droE-IDWG?Y_s{eiP>K1p*@(-y)4|m<9(Rj%Wg=1Q)@`EH{__X zU%nHv{?2>i2Rqx{f9)h3A?r6^ipbl)ZMV07)eJeWrrI#T{_u+%HutYX(({R9ruGy6 zx!H4ALj3b|{cpRV|0%X!^&H^xi>1QJes_YYeb6Duc}e>ugzfJw&9_@x18Fa-su$RQ zvu(C>`3M<5+E&Y8r>AksRzDMRK1uj$BYW+mwe~w#-35o|pOY8t7D>Oc`!)&E|LSVB zx4$I1()Oq+r2ld<*UR24B-K9f2xPwGz~XxQzf#in&zd0TnR1<ww5ywb+;;aN$oP!! zM?L#5S<&`c6CwS@oqoS;QrPd>wL$kkPE@>Ow=Q(A-A-f3`fN#-4R)PV{@Oi?gVgUS zaqsPNuDROrsX*q#J5z-1XWo*uzh?;9Px<?<xt-gAO?I80reOCc3US!4Gv~KEw*rzM zyS`-DZ#c$lcjhppy(+n?%{KP<WV_wlAm!;3?moNUS1Rn+D?-fAkM*+SC{(vjTnZ__ zs#Uhw6&KvKD_j7%Ph3jJ+1_oJn|-Ymq<!;4wA=2%(n>pt36T1TbG@rQ<GDcljaiWP z#ft~l_6<kt?XR4IxTnF?-TvWqcKcsPA@eu>_ss3D&Uk3IRuj^HHF0UTTepzWUg{lW z{`hJ{hW&!&9`;&okns|(uNUn8*j3x}T>S=4Z)fb+*%d8XWw&1mGCv?+pkhDm)nQxK zyO8#{x#&Z?xdMCaYTY2?cj=~g>=N(t+0}_a+M{i2HrP1Kh`0ZD6H?z;1eDnyIICvA zKN-?qEa}&?m5bPG=T&D3PH#t_wc2U=DcL`$hs=l7Jan=Dw~WjF)6+t5{&$&FXV<J) zY(JT;9;{xR-`f6i(-gZI>mlv4Ylf=!9UJrP?N&kR)9tcr?A$B%+2!5!0;}J+s>|+r zn6Le@DUk4gY<1Sg`c9BNn=YjMy6Wt1U##P4-}4o6o@79Dy=|6gi2c=NkpBDsVo&>2 zw;i^BUcLs0&x^WAHlDAd?I-+^29LLX+`(#luI!F&!(Pbvt+&e?n~!tD?3ey72dlqZ zyxp#E{&%~h2aUjd-hL1J#rFd3r@n!tpXwZ8`&;vO+Fozl1eSMXWU`<9?v3rNI>>qG zy)g^yRy<6xm-K<mNAPO8+Q(imv2RI)^w%Gqm#~lVwzCh&f~*H%@XN6czVBo|GXzq; zp5!gFePrcrU;G#{KP5KZ-G+5;kbQC^WPYOCs>$wbw58oD7f63GZ}x3F#%E>rXZ0cD zc|N-;?Q4R#?49IhgY!e)@1=G}tX*xh*dXQKZmWNGY%DwNgry+!%kM6|u(MmkX7_oe zHdy^@?Q*-1RaW-DSt0I?SoP8NqP?fR-&2VHpL9mquUimdpX2~3zru5k?78+w+h6;l z1`dysy9e#+A3d`T)Yt&#Kegw!XJ5r-AM^#%9@&`BZXcAwV!zY}(mt-bEM?D?6mFlm z08$={T=lj;_iv5eahDdb{_q`%_V-?R**}{Fsn5R^<=9WK<+fFE{seaK#|l&X2}`8y z%sL?B4fT7P?7lVcw0@!iNzVm!687;AjP2h&hxE6XSv%Put5{}hcLcH?xVY|;?O#3x z`>s2X{@VM=m+W@`lC_(D2{OKGq1$Sw5#(gQ&;&C6^5wRIovk{bJ;xSE{2ttN#ZG<y zeY<CKAog8R^RpLTy2EaN03`e@@^kF3M)%o1wuI#WyzjyGCBe(=Uax_SCj=>o*lVxI zw)g5)1*d;TMF+bJk9F;nVj%tHx-%K}^Nl_1_g{mQzr3#v>>|Ip+VQ=Dln+t7CH5&A zFYNLvApMo!j>7i(-ZJ(j$&mFt%-=Zd|4h7M!`B80&r7P4?NUyM*iW1anLl%qoo+kF z%F&)X5mH{<NpiR0G7`0q+n5B-&*i5|?29~A?LHVm%8vu#QudZxH`yH!gY-{aGgjJ} z`L)>Xn*y2NXp+~r-*fnm-Phxg@o;A~7rVlHN9-yN>4M{HLiZ~>lZ~bJ;p&k2r1GGC zyIjA&cF#{k&R21M!)Y&X<zeqN9a8@Lu`Ah~kd3xKySN>k9_~Miun)G5v;W8pNk2<+ zW9(0{2HQJL76rR^$^vhDk=?iKt|UUvn^~E6(Qd7vlRfJVh<mp%`q{@NJ+d>J=L~jF z(BzYL2dtFr&4VE0;|sm-+u5<~v7NUC(%!Pn+-BPryw9$U5wf0%Z>Ebqn^>m(QftU~ z<c5SkyVLu6Y;&ReQ|*|z?RQjV**9oH#((2@PT0k~aI;s>g4`eTW5*f04;@1GBGCKy z(s-ThT^*|J8=?2nUOlzn?uVnN{d+6Odac=ZH|*N<EbQW6L*@rFPej=lZIrb){{|V~ zeAHEAH?z*f{+B!?J^h@(Vdty=$&SGcGM@4{-q-%0yMz6$vyl3CVbOBC$|=+ACV4>4 z;}h_+u+It5w|{2<37=Un^6jnD*V<M*hpb;+_dvwncUQQ5_Y25*`gyOa?eEpa*-6_# z#s}k6L+n}iE8BmTgY2J{GMj66m+!BgKJ-3qmx&4X>Z@$+``<&x&+Rq_+NYk2x6kW` z%+J|B*S7c2)3wjJ4vBw>t>X5RW~5uMRD|>|f`8w(TWM-(FIog?-<H2LvUQfzwErUq znV-G3Fx&3P?{YiOn~?E0!=tC|YL}+lF;qhOZ|SyM>@L1eu;ngz1WrE>&-}2P61>x{ zWIrT5*VGl-S-vT;o0SQ%Kkd4K{n;aVw*So`<HJ|d<m|gITiMIcgq&~IR5QcQU2v&g zqd8>%^OgNwcD`*6_MOd;@c4f**Z%1iZ~HR~A>sM^gSNfr>dQ8J7eLl)w@+!dd;0%| z-IIVd;Phu>QewMoo|}DIGGsrWXElSpE?1k~5+_J|q^k6RUG~X;cAIJ;?d_dPZ*2=c zIN1HqgtR}x?`YY7SmbBlWeaIv&vQz(@8rC0t9J~NKYlqf*_kyRu&efgwC8LWtgtm! zn`3u?3DQ2iven35gr&;9)D}`7PYmO;kF(6TTPp|AzwUvuy}9x<yWqW$@~^$p-Tq0B zw|&+jNPjM@qTjAnF5k}H4|2cOJnQ8)AFpq+vq^@ufA1^~w7<>SX%oQ%nU6SgXrtZR zu1xz~=e~pEBXFLV-HvUFwiOzX{+_@WAN!frKW*LKLDrM*zv^x0{xr~j`ac1%daWt) z_8ZC%*!_}*tZ!VO`q6Itgl3x=@{s%(-gwxScbd2TuZXu`^;3<i?e|TbWh+-=1TJ4Q zH}A4rnsCH6h0zWi{vY<_+keo{ve$5K1oJK07TT><YO@R43`u{Lt9<OQ6~4C1SPvO* z{dh^k{%d5b-QgeHVDp>#g6*%mytb=&42gdYzjFJfTUOdGu!GFMdhb|gm-CX>eswvd zy-@pJ&SrX~nthi$<i7RNfKPThJ&N|36Cmxs<U&2W2T$wl;}RhKyWJmS?Jg|Jv#)J{ zjK8h$?6=!Az1Hr{BglGipAAiRF>H>uiK`&(nd81)cHxgr>~muw>%la=F4*1r$Zmh^ zCnS6%1$Wu8H2kxRGJv%I?x-8tYs?9=?=^;u56N4b**+7Gw2v)@)Neu89PAt$me_Uv zhm_~Bn=jaX+VR^i^C=|1-Q%>he-UA7Z`A==|MB-_vHhOEHTLT7Ame$@wmr7%2(Ps3 z`3ITLTh4vj?pO`8{o{ua_4;?E?Qbp2w!dHv>Ce4f+i!O^WTM@EVaWLU>k<K5=Sx-g z=i(vf?`t`2u$!{)n2oV~J~;fJYRtA%Sr=*dmK`#F^?P!Py~R;E`y@9={GR&s#ZG(P zdOJT`h=1oZ*4wKTO}FE+hLj&i-#gj2PO-IrGXc_m3VJ7GpPb2Kw}}^$|CTrIv+ek9 zXD=QPnV&t;FJ#ww{-({RNXYo<#_b078)9m0O?4pSF$ZjB+a7p(-cB<K(%(B7H_tAp z+thv&wEPV+kG1!cm$H8~39^1{hjga>)T2vm8ImCRi7isgzWdS~TlX9bu>TY^F4~EA zh1pME4=KNYc%HJm_~DY>-+7Sx;no?Y+Ryc1w68b_DesDoEVS!?qiX-9A2Pm_*}B}O z(PORM{#3|%yMzoA`;FpP?Cf?z*4GM8y=-S|ZD~K{$7gW+xWZtyU4N07y*)eR{4_P~ z1p8i@|8^heL)r&wy-xPVbJgvftsvuZ7Ap$uW2=SiqmDqzm-FE<_K^$9?VV?|gX`mc zirMyTmt*YXTOs4cW{)lG|6MV&+kG5z-lSGBul?$y-gf$8kox}8#>aN2Bh&5Kl_2xE z9j12nD?Aq2xx_-+N0qV;_7nD~+56f<;=jOihuya4Z1z%dkoCS(ynJkTyqsj0?h0v7 zzWEnm?_ZK(*WL&jpYCb9ZYR8av#rIUd*JXDV0d7c8*tj%H3JeJ>8+*q*DI~;k6eO` zcShW0wqv^0Z+G^V4!Hbi<yE$Sb=1;+x(Q@_rbnOO{_(f>c5fme_Bk5|*{w=Wu&WV; zq+gGn59}7%ir7zlIUQWSe1D~9=fk9EFY^Sl-cg0I!?u9wiJekEB!9g)z+qo^B-WmV z1yUceC{@^Vch0t3It$YN_g&LrcWZK+-46{&f4Rfn&c3bbgk3EoWPRN#lWTSiH(%PE z>w}!n{?@PFKBP{}{wB1%zOg*TUX|P1Uh3X8uzOZiJ+xDqpKF&U2}!?gyO{0yT+i7h zn?v>^PSHuQ4|Dxs_fiJ3Un-~kt)0x|Wb5>Ykow@&KR&zZtd;g}mO|?Dgs33<Z+WG5 zsrw=0Tlu?l?c8Qp+shb2%8ST?9DB3uvvyDFA?d3=f1Mpa=NY?4KOp08iLcV_4n$0~ zi{pfhUu|Er(r!zpwf*cPknt*y57jm=Ce+xioeUYjeJZxXuB7dk?XgXe{o8k(HrlrG zh}p-VKLhsPAx<-U`!kmI5`Q4)ajjpkY(HO($G-6!Wc_i+{1E%<sqXf?x{&oAo(nJA zU1l}0SMq_>7ea!kZ1ip#+j_Mg0-MKbooW|W&}Ap|3sN4{B*faa^GVsiG=;2h>7Mk^ z&f}k~{X0>}`1g$GUADV8i|o6h_do0VYS_gnGTVkYLDEBhRJ+{`Ydia{Ek5A%RXTHx z9q;wSc7fYAg45@3cQtz}ohZAWLyTa4)4f9b&Cv?>Wo3~3y+ljJ-g=FiJ?9q4_?d6D zjs4$W@%9%tK<bwbhko1MnX$`u_b*6!=UY>5mng$w&-Q62*gUQ*Y5R~$N&6~RNcrEW zcgS`@kF))<Oi2GOYln{AC#&Z+VXdpd{$KK_++Kxuw_WlM$oivM)eG%n78lz%Jcp#$ z2QiQA_}7-&KWm)>Hvf!gx83IJlJ<J<A@$?lWKp~SOV`+Gzk;~my=#iynrW}?+-xEF z{moxt+sswQ_Wqk8?Zv}|XY8J9%(L5}4;gQtZ*6MdzU7?V?0Cp{pai?SZCr<teeq04 zd%3WM-Hs`n%U-krGXCUeD`|gTBii0;S31}|GM;^Qb?au>b>u<Xw~gtd_Nspb?L&(p z{k8RBT=pWN=JrdB{(=3wrE#C#FX^+^t0qFyuj8L-cG(McZPh9u<GClU+uMIsePq`b z09n6uc$KexjFqI_sa25ik9aP5d!;{Kb{fWz_RwPY_jX<mEA9M0Lgw?XAJ(-mzME_R z^H@1J{xdhF+cR;5*yY<m`g73*yKEaXz3gM9!oczg2NUcQ8dlmB=0n=2JzLnVxfo6C zS8_t;KjJ0D?6vCa?GHSLoS#(`8gKt8%-+5}8**RMNALG`TN!!nZA2mWqqHo1XBS{# zV7HzF(%+e5Ct>?+y|R7H5=j5puS3GF^7$gW_l=PK#VH=|ZKuyjv3uVPY0q}@9kEM# zvB0kIEu?&IX-lwkz2;)Ka4lrLh0sJ-d-1PscB|Jx%C9ohm3B+7x!YgWh48EE^6bTQ z)b0B?A^X3KODpY5Cw#N5ZG-4%d!=P}QAy0+$x8|xe>eB>+3#8=Z(rsF882FWtk3S; z30M2c8}EYS%k^ol{q2p(_8WFU*2kJ;dfM9+b=!3YK-}lK_MTnC*57v0ZIJNn=D1?F z<a(POn;8pOf7A4%w!Lf;_N-En@!q2k-0ay~+3d}GAnDzBTA*FYm;ZKJ5|Hv*b%V9t z?k!sOuU|vPe~kaGvI{zwYPa<vWInEr<Dc!TYYg_yt04U~&bzsGu@!gi_UwSnAIu6C zu<x3hU{@;&slWOsgxRszsM~)!kPP<kv&BxfDNH@KGCLsiHQ#a;+kQTyVRu6Wa-Z6g z_7r<2kwW`L&mr}1-R$jlHqS)u9`RiV`{(7;LVJVLE9_=WgRJ+KW&dbv^hDEMhYONE zXEJ5kJ1zCJ*E#ebY@bEcce~OFi)~!yLdM^!I1BCN3PkPaa6!hOzsc#?JBfJPud{=U z#~Jgd+BevR+yB}JDSw)-9kP>OlWkw5EDyGS$L!a3hm8a5E!iORNuO4?+On}3*eU*p zlxJD7dUnCq?`;pBf{f>V(k-;NP%N;U=<^M%U(TYyezvxR-IYAZ`pXQX2X@Rm6z#*i zA@$A2oV|862ZiiQe?!_2@|CRiry8s6^5h}q&+Po=c2oE9+ugN*tpAX|?Q8ceiq(G8 zCCK^he-@Y89nz?_m(+u-w|lrJ(T?qjt?iPZL16nC?`^cpz7}gI6r%$UpTsM^_9lHw zc1!Ib^Ld}==GaHxJ!WgE1<8-cc|z^)f8ntI&;gmxlAGaVAF(>!e#c@+`%_)L+wQ%` zExUDEEa3K*_hMmt*E<gO_U8q`<~Mz`u;&dfvEOzMvYzP1YfpRq4{ml9-y!4GA0@Tz zJHoEm?YIhQk9B)m*t<$O+Xs6?!e>H4vi-7m0``pM5dR(hKgG^a^0%F?mO9vcnN{KT z`;C^`W$%a7Z$G*&+Pv#tX?rLOl70jXJnWUbw%S=ghwN{(-r`{&laXg%pADHG;nK*p zzZa=)-@OkqUU}e~n0;>dBfIHUko59sN4}l?-$%CFydm}1$HO`H#w$bY|1#VIho=jF zsQqD13;Uz%AnhrYf2sDlnMyY0Zz27?UtKk}hm51_t5-tKdzb2PvX?xNU~kO^DL;2U z-D#)!LBrnXG^D=JWjSeg!sD^sN@GZQ6uQmW?(U4ecI~~8^q{aN(_a5@slDB0NdIWN zT7><)qi%NE(;@vmFC%BW!>c~qO5TCAk5eRP+Rbe#w!iZf(mpA-uCzbc6lvd>4{7g& z+~&0_^v<+zbAz-GCwVK_cVE`F-+2r&K4<3cX;+rUW1I0X1l<0;@ZyK<p9#0@F29GQ z@52FA_QGaT_7O)Q<JFV*{IoNE#BAT*4yk|mk{{Y#6Wn3<&H|EOa-T5R*IwnZHz|Uw zzvpT^ZD)`aX>X_pIseIKhNjK(xk2_zwnEkiJ`z>3uMsJ;7h!~yUpgo6+VUlc+1ssz z^tV|o-`L&R=wZ)38`A&cfAGof+qrc6mdB9sqmSu%_B-U0?59gY+OM8EPWCK+_S&u6 zQxA^63!Ay^JJ<W$=Ws&iL-)O5vwx$$(9ZZ4Wc?7!Yz6!35HtH^8_4+M^Rv44cYaye zbKQcZ-|l7+`&z|qcCGIq>CJ)jq}_?hZ|(f7AoY=bWP*L#vmE<;21xne{o<tEtu<%t zQqM#3=altp?e^5Hw3B-e>0c&(OtLo%-ELdI1=1had0S*(Hc!cZ<s8U;lt&)#wY#9B zW@ncO8Q;~OvEI%?&C6b@71F<dpr~Qz@Z!DQw|Yo^XnN#lzq!iY)`>e3>|ee`m+hwg zcxX2x3KCwk<)!UKRxh&q-3S>^;!+T`zu;+RpFJHiUVrc2Tf3Q(LAFZakozi4s<Q2V z3l-SkZ-CezIeoXCIzzJkvwM*K!s-hP?1Y{)+s#>62Db0Z3}Jh@eUkP;6CmR+d~&?@ z(~ddYKjDDfH!Dz4XD6{z$lm$~q<vWsJIhYKs>VL!2c$d>=nS;qHB;RFlsTk)ojs-1 zPT;wb-J$7_`tA_#Wn1Hw%JwlkA>)}$`Mq`r+T-lQ&p^`Shwq&Bn|%xI>Y)4Y)~vm6 zcW5_{efvI0{N8W;XLl!v(QauCBtNz++GuyQNY}o+4RU_bmQXGGlLEQ+A#Wh%k+3YQ zE!)2gyW%v6f33X2?WKBcY$F*U=Z)#iD7Uv)n``%RrzW_4^G@H-e*MdfcJ9X@^KD)) z4ecY==-c<N)(4kg3%0V_D^E<bTUc`e%rECCvXiUUv={ybX<trc3bnKNpk(J)whA1c zo_pQx19}<l`wv3;FRCmbZ25ci?IJEg`aA5i@7jc14zRl=2$?_g4$iTE^}*bB^)1Nw z$NOcM>{gs}wV8Sw(jIfno?)x$9%#QP3DVvbe|W&I$bi}Yt1M(bI6s=lUMrE$)_F6e zeQ;oAiGAXQF1sT!4Pf_Po}6jFGVrV2gDa5rT5}%N+1s3Hu{%%>v0r<MqrL0d19o!P zHi6yG{`QgGw`J$-jO3?+_3skcZr9_x+|FMX65fKx7TMYUvavtn4H;j$d_mNH8GC@e z_7=$e(Cf4|yQ2>r?P}*j+*{zJV88IPjs1jX$a?E@*P`tba}DheyoQuF+8*!hj2Wfv zwKO5)XRUk*_7@&Y+Hd}40gfNnHZS{c{M+r;aGeIbkMm)Ief>Wl`wLqj<0b8fbnObH zmF%WPL)!PA^^Eo>FMqbX5(;VmXfKVjuUuVi`)L<sJn*2~BAci?OYK%&g~)GSZ)88$ zpxAy|5M;inE$xz>(@YJ!2hm%>>xbCvPT8e-Dcau`hs@{9*c@&DI)c%D*SlbF_;{}q zu}|DL-ELJgWc|<rem(oA490c=ERg(iNYL7DTjB;g7EZ|e;f0JIHYyt;?O%R^w1;k$ zir5E)n%J}4ssj5j_;RUzTe_wFEOSVI@9zqB`y#y?c2{OV?z{2`3bU{A3bikN3TZ!m z$q2Lmy)@IV=?e?kJxduM+iiWZ!IozlWPM;`jhcPpX)Svj=y}4c7-H<0w{5grwHmVi zJh(~3zGyzX{lYWP!1}jGU9qj$&t?Bo2a+HDe!OfuY1L0#wMSdQ?T7mH8g|;QD{Q?k zL*|Rt9_O)NyivxUdljU;CO##}{u=u;yZ<JT@vX(YNA33AoMiX460+Xt(_v=&O>eF2 zHOe9P1%FSMv`f8m$nI+!q(5@5a+z&xmW2J=!;tZSJwgt4`!^ZeWiUeeTmQ3^?fE|R z*&S?zgilFhfqn0r!*<5sAoEieZwu|!lz8lK{Db6&rUN?mGyRU+zCH-qkH@+?*#1>* zwSC$aNdJQ6fxmqP=N>y(MaX=a+=cTt>rN!vf8&FUUuu;sv)ix5WIJ(^J2-wsnx@+6 z_CL36dkm>x7?q{%HQ&y(GrIukA71i!W;Z3V!2Y=-<UB>sr=j*7j}z?Kp!YBS*tXuz z;X;tTj_4b3eI0Tu&%RahzuhNINcm}{&1KhLzRb?d8Pa|+wfD5w&F8Umodv1?s}d~j z4Kvm37HLD~n;zUdVRvZ7PrIK5koiiZix2Ixr@GrGt%Br_UkU4MZxkH0`@R4&UKcti z-TvyGQ2TBsNdH`KQi`?QA#MA~Pa*Sj+HODW;?mM>mS;oOyY6phwtrh*WIxRfQeRu2 zQ?|b^y25rh3uL{@qG|T_9~|TCgKQxC8-)5(?Xnh$+m~8E^4HX#BKEfgYwT0cCV<0F zXj6s#voAO8oEC+G^Y_agpX??bW3u0x1-b9=`mbKQ^GC1P$yGqk54`$szRj1uYjz8M zLe>LxJyo{v&q}wqoDP|vczJ7$?VLMT?bP@o?b9T?J2q2KWZOOxg!Dfao|tB*9qea+ zIT*Shgvr?c@7-@UpKn0Mx9^p9*tKquv5!`OtiSH+Ut%{sNz}fJ2@=23E9C7Ce8{#f zRDq=LjLrjg?<-c@vFJejm-FL}-Q9|<c6G&&^d5Fy(eB5>I(y!Gkou0FH_d+KtA)1P zW<bgpQyDRP$6q&WPYOcH2mP3Bc1G-H?d%I6_06lsI{PUGXKep_L(=Q)2dQ?<O}p({ zogwY3YKDh)$2bh^Eqx&Cy{*NT*q;3qZXb9GGJesgpKHf@FTrksBBa0iyxhlr`(`zJ zs|v{YOzLY7`(90ddnpD!aDFd3sbfFe%+x;bD`dX#?9^)eg-fT|x$lJR|4y;pWcQ*$ z&E7Tv68?vNvDjZ?QnmMg25D~{?6t7}SrupRG#9ep-t8iXea^SJcH$c#>kX32^Xz~B zK4$l15u`j9-+9#T;Ym6B)LW4Jw(f_q-Nfc=b~1gC^(!Si7Tay#5?~jU580p5xZ{=G zf^P}-szvv~>1U3lu6<rljJ;M9q(9{Ft=_(FO_<#o`53T#O_-(q!=+aC=Z`?zSEp@w z>|N8J*&Vls#Fxwy8~c|mHTHk4Anr4oB5UtclV$(45HjDZo43Yp-NspVcbXvM<KLC~ z>{!=*vGeSN?BAR*KhEC9*vJ0TM@V_oyspdcr(Cn$(+iODh^PCIoy5vK`-aQ4;P9Q@ z=3yT(KhOTZJ*59V!z0Z8%2##!7IDb>tu$Uv``S|hb}c_4<#kTxCEML%h4#7sp!u<* z%Kq&tKKmV2koAt!SSsyU9;Mj#Uk(H3A65ZoyT51k?NmY`>p#5(@7h%uYT6dQdj$@U zimC$pO;_gIO}(`j?4Bz}m)YIdH?%*d1M$zP>q7Qlaz5L=zE%L1xA^(bM)}`-yME|> zL94&T*;VjF+UI|Sj7REikFsADS#00sCk{5>Ec>(Fg@?KJ*W@ANQ71%vY_4}3*llKp zw6`8JN7=tSJJT-mD`Y<P(oP+_x%t-i1s#z49$F<P+KIf<ws+YS11=AHE7k4)`_$X7 zSOl5x_`qLke^N!rzCFbf?7lT(u6C1Tr0ml-K=xyv?ObhZdn?dB{3K-jaGtHXUG_vB z`$aX7_KTxnteu36q+MG>5?H@liobp8T~#~1HpqPW|I;(<KAelQ;ade6&yI*LwLiGb z$}ZIS7Fhj>#~Sv}vftVLl!e^aIx$Sg{(tpX+jr3M+2T(J?HYd1wQVbf+$SF$#BXoL z)n#X-0x2I~t%$N+`DTmVh9t;-=@Pk9c6(eo><|8hv=6(_>f7^l+1np?fvlHXo10;8 z^p4M-<ssyJvG&ASc19u5_K$W!_Tyf<RcGI|KEPh`5XAhSFRt4yQTuH7U(5!a9&CQF z*!M3Nx2rz}nUDYJA!{%Dn9cruE2O{7P}^^JaP>x84IN1NGBbe3Ub=zbE}juGpY?u^ zlD*@54*TmCkoI6g>1jKI&q;Rb7a`^KyMJ@-9<OAv+gt|;KmGE<c9q-i*omn_+M6$) zzPFRjxn;LPq79rr7_QjZcWXu3r-wo2pZ;I{XxHny$IjaUQeOW}T5fkByV`z1FQojv zo!4SlAJS%bU?Zgc@uB6l-Hj@L`*Vem{?FX61vY*8PwX@_ApNzj@C&x(pTh0WPlk-= zOWet~-*H^p?xq}M{nrz-m3D1wIqX+vLBjj*IuZN6N(JjXO_1?ep(0iLsuEj!g)NZv z@J|)(?Vi>~+6mr)ls`u}66}8naM@4X44H3EOx$Uk>fvM0(E=IYli)gOw_CKu?%-cY zfBW;^Q2X?`-FC~(AnSvqpZVK+ZQgGurwKVvV(MWdo9gWOc0AIM{`1!@Ywh#{RqRzJ zLe_)GYM!#)#E@bqehD&PwDt5vJNu$Id$BUec|4X$i|y)GC)@t5gxpuJI^V*+#yQXa zyDwyXD);zxTduEbZDOWD%Ij}64)&QZFWXrzgtWIK--p`GJ5^_Q>ptZC^mmh=+A8%_ z+D`I>oVPdUcC>wq++<sS=zV-EzB$@YtGQ%X9{?GTe)Y%6F29+{esut(|L3NmVDFXb zZU5>JWPIfetFOJ$<rlV#{zBS^n%s_d-8)0=<s2dXE%vrIww0R-?2m1LjK|8Vhui1t z8`@vfhRmmgod~jbU7cp{x&gADOX|=<+jRxuHYXoK+80+FP3_|?<L$FnLe{6KHmcdP z8z|Z{Oor6AeQx=7PVWQl@999+8@y9dvK7#OV)y7Dq`z<Z)Xd(mw8qZX1X3SwJ^I+r z=D<C>6@HNMu*32<ZSQ~Jv6nD}+^4bcil_Z|{S$VROd<OXEvu63-5aCru0MeIH_tQM zPRnqb-Ap@3dUiOhWUrPbW&NWZGCsa+{|noGX?6R5^C9))t1nvC#&47C{Vu42%exaz zXYCsKbL}U^Leh_nqlEpgFUt0^XCURH_3bqKrF+)dzT5y=Z}0cc$kybYvz??Y#6I~e z40hfZs_Yl9SP0H<v$E3cTfJiK&uBsR4;FX}+cQ2tVEbDa(jFEOX}42&U}c|r0>Wov z3bq&h5pI8>AF>`Xp&`qLYjK4AEEmZBlyHp`HrpoF+SPN#fz6kA@YSwsX}EpTRY-Zc z@Pn1z(FQyF?`t6I*N$FTY`1E?r+v!`NdNs_9HY&~Cz<x=D<I=x^;b69diw|1ha85q zXWq;|WLIu_+|J|yr2qc0w%q=xin@Ks0Z4l-%#F{!&-aVnr2@!!l9!f`{lta8?VfIf z<nMytIriK_EcOrfL)K$U+^Mn`X9BH%g{-%)+Nfjy?}wS)o*9tw$VYo#*tz)rx4StN z;+|K$x9sHBFxq!j#e&Pvj{gVj);<%rzj_kVe~ssHwOedfY2Ty*Id3jb>Z0wGEd}<W zosjm-g2%S@SHAwWD>?u<|5&*o%`V+*n%&a|Nc>cP=e3{Elwfzr8**Pr{#`b^kDt8l z<U=6k?=cx(d-HYi_I=AB{nM{Z=Jo-SE9_oE&u=<AL(6`yu%kV%52Sq&F3e%y<jZEa zr3X^}Z7d15`><xIUHD;$e=3{%>^eT*w0m6+8DA7SU2orCs%^LGDWtsE^~Tfg=BE>O zoHHQ#PvlRM{fmMk`?WhD<&i?g9$Oiwg|?onA>)7I9@Ff&TovsXBtyopg3ER6|MqXN z>wf?#pKS_x?SC6t*tpnbfYXPwc!9n07cP6@SO;+Z`F(MgeZWNr`@L@=<D-7*arQ?H z7;PJ$L)JrC-gmM;dib}Es`@psek%`2JEPQ0yG1qs!1~2sh1fH$eq~z}2kDO-S!8WL zVPddd&2`B9zHUUQeE|o9y+je@KFhPa{p`8^8`^Q6gy>(9@X+@E2TS_^SBU*j_iNcX za%kCGO^1wU*7R+)vsfcyf0zqWp8ehuYtN(p%<h6Lq<vL0$JhS<sc^e@zai-(F)_n_ zZs!iWODiGmp=A5>cGGve*k!H?1H1Q?U!?u2i#hgxWg+w7=Y00rUDtH7&zlYzZ+Yv) zX20~QfPLFe$oZV=@3z?N64bTV=YaGd54~Zx-+VCK{-MG*uz99xqV|WCz3e(qLC(AU zn0U-C?tP=J{soAC6s%M2GH%7%zdr;?kLyBr*`Ba=vwvm_DZdWX+u6OyHMeukh3pRz zoqEb{g3nVMBSpymuFjkO_R|-hu~RXEj6Z!Zu(IDVImiB_IApv+qa)B>)4Ir>a~VW^ z_yi^UYyMyCf;L0;4_L9iwPku#VmsqPDcHUHOHJ(z|2?r&PJy&9=j$5SKRl~#|IAPi zEHCx&qTMtJXM3j;h2Z=)<->2gwjD+G_hljb1K#Sn*ekJZuxqk_^tUX{%k9&O<n7+b zLFPMRGjr@G_$JwVq(b_`-b_#Jc3d^KpM4v$US`EAReQNJYwUK2LelfysRs6IcwgAv zNQU^2nJdrUEk)7((NRc!68s_0?xgZ!yS_Ha`7|;U&)F3<S=nctgv9>>#Z7kaUnSbT zZ-k7OOJshuTd}gn{+}>p|JIr&dHaVCitUXKL*{1_+l=h&yb|n}?t%E%CPdBt#I&V$ z4_hGfRXzffY<bEm><_GloL_J#yu$t^x2FBEkC6It*6v*UH=^S95^Eskx47+UJH|^v z_8*@^<_C7oyJTmbm0@@E3Z%W;ZP;KJuPtmZ_Y_j!IIfnoUH{M4_IMv;JpEjqj@|Sm zZTl7Zknw<-OfT*9St9Ju7DM(^lo=@4U*GV@&Z`wt->l2}Z&x}?z&`9ZWc<T@fvLUu zCl32MzE$A(lUCVpw<!9powh7wK1Aw;mVJzmkG;-&$asRtf_}Sad0}?DIU(gmu9dv~ zzl_&*Ql=31=+xQRrOo?i$0`cxF9fZ#wttqVWpD8wGG6_>yufZo<9FNWdyxA`A6%EQ zU#VbkZ+-<bzZ|-2fgM9cwcUnYknzUGh#GtMvJ(5p2@v-;>|bQJQecJMc`L~L&YI7q zc6lG_>;<AB`!~dMYV1EY^xCQ4hV-{DmX_K-{grC(xf;^`dA*9!zVY%3+jlP^^<T~Z zv$ls$1lT8KdV|xec>XTCo!Nf2QzIeyd0pB^yE*$b?d_@{@t12e#rBwVmAzd6q&|Cg zqu9>9q|Cnc7-YSnOn8Ak-->>_G;7Ful}5eGwx0r6?dAVM+M~?uZMK|y8SNYXL-ymY zxL0JiCH0-1_gBdJozF>e_DAnl*lTM+%EP?adi!N>r`WFF4Owq};h2|w!>apsYMqev z6{!lQ_R~8u?Dd!-@!@K^*G^TS+WxB?q`o+Cwb!mvGQrMfGNk`8<tU%s>rzEKuDOu* zQZ2(uyJ>B$b|yO@<F{@0EcRg>%k92ifsEI<@2|4IYAs+dz5+77eWQ4tUBB&JySuHB z{vP9b5BuyNx9uh>L*|=1&KlW@^Ca83KZdODz5Zy6UH0Q#dpGVm;PT((<uW^|KQrvE zNo0cgvg*BdZ!?7Luj@nhFKf(punU$lw?F#|(q5L7Icz7i($aS04oG{1!|0H$#4UdN zp4rR6?W@0K3+>`&a@lXHfV5u=w2xbPT~4%Dd*1|>FM6qA@4ZONK29C7KafM}gq_NH zQ~RygApN;(to-&BEKRoZyCCV+u3gDKDC@YLjs;|X;f#c#{dNy6dlM(f{<G~H%IzET zqwF`mg~X?|&sjT*Z~1oL!XfK-%fB76o!7p?PSgOBo}%u)vGx70V*hLsWPCSP#Mu6E zlB)feBFK2mHEnbI)idVUao9t~BSikG*hNMf+3WB@++!scVjs7!$!@nFB)m5*xM`RB zEZN@5&H)^LT!KsNEdPtx&-Q`D-~5$c_8->s*vssJj92rdR@w7~72B`c30V)M`X<co zysx$Gv#*f!ZzGp&t>~m`cl-}zJWV-st=-d<82ga@koJ{dAfNs23BvaOS3~+6YZV^a zIb5)@-^c}-uTy!!X<PYBz`i2|(w?$?YhZtATdn<9FUWX|;zt|%^>y>@wrfa&%a`)% zXLeiMFWbuff{foVmett^6fCpV34n~(Hf;{D7ZaLl$H@wj|FfacKKR8nyNRKY`Pjp2 z&Fyz<DA||og6yZ?WXfZw`ohsJc^afV&Dj}apTMPPFT9-*96lYj6YU<Y(6oQe2q|BD zl*{bxbhg^<-2rJIJLIw3|FPU-D^dZePx5x?+W$VnW#7b=2p$iYOg(6Kc^{vBYQ<Wx zc>>`NY*s(nXJ=3VSucEu-O_%s+af#1HIVW&I99~oMUdC_$4W^3I9Y#&9dnhw9oIa_ zc*gG}ar<L+oVMzxA?Hcv)XCc?u3cp3&IGA{A{mqHetzz=o1O?6zZ16fx3_)aXFs(L zvOh|Fqp5wE<4?N<PayGSG|9}~JUG_=xf^7Cik+j6{fE#L`;(%O@s;qWhISicLFYk0 z^2>D92z$XdZgw9RLB?x+UWwbyUi#Z^|02kGrWu|p_D<_o+FC&GFZ{d6+1_M}iM{W2 zNc-DmDUW@ZNv^$TAS6Ck*&5i-&9$*_vxMX)|JZE%PTMDThch7c`v*ru`|F35?3mWJ zg7ag_nmslqpGxc_njz(<&TmV5^>wUvoDW&S<*&Pmy}jbZN_)OJkoYaL^R=HJ`^PqS zcPKdh9D4G^#^<WDy}Ku5{HMi#vYlrIyZwy_$b1WbeXM=<n+3K>y^#7V;(~>}d9;iD z|6h>&vs?I>UE2<Qd+BpG!12lVgwy`@mxFdiQz7GnWrBS6oA#fz+wvJQo-{}Et(|BN zv)#J@$b9_u(i(do{sepdV#s*_PX$fv5BuucPw#@vuN-K|w0~J*Vjq_U8Sj`dHNbAQ zOr8D1Ns#*U-49>8U9+R@^EN=nSIhJm?1XYe?3Z#w#z*I}dD_1(Ew>NvfRu*`3Muw~ zBN^=%?t|=aNnImvXR*D^cF}W4`N<n_(9Vg0&HnFGTX6W)Ua+#4EMv0Y+fxDdpXb61 z+n@4LcKz2N<3|bS8SQ^7G1$GI1{rVp{?fwUHD-mK>jlVo#KxcR?Bdq2+wWk9<fq=K zDRzIhtJ}ZJhqQ0rSR~pT);_em`xMfCivJ>S_i^t^yDjyQ{`}6}{`SgKe%j3rgS5Yl zqvGr(iel~iS3|}x)U0D|r#ea42RcK}FZlHMmF>ziYWB-lLh?Vaag@Dkfs$S7CP;sr z<L@*(#<oOzdltz0qvg-6>^HG)vU}D88BdK2*lVL;plpAna|+o1g;A;YJee%^Rm_n3 z$j`yXUL{S(UPm2rzkn^{65E~5KkQo8K-w#>!+zMw|JY(@VGFrGf^*$vyO#ME?7Vy+ z_tUQZ5ozzRhSmPIE~NesUc_KOYu|pmCnq88`NEZbb{Au{?VtKX+9!=!N9^8roUyyF z?FtV6Yc4ZvzQ*3LyVnG%KLz>b*<BM_Y`1K^KiItnD->)yXUEv`20_NF*QKAgZB*y9 zyZju|9;lkBW*=56XaDm(q<r6Wpw)KaQ5M@9e}96_w>~w)mfbbU{`YIhe1?*{js4bh zN9`CgXM*z^n;@UPu#J|zq$Z@ldhKA7ovEn1ZCegxyfQF-w%vu<ownU`ApMOtvs!!B z(gSwiR3Y=N2RdEsxVx^{t$z<$FY$75x9x937W*fLkoDMSFWk1fs;h1HbR8r<>Jx?S z^!W1Z?0-Yb12cmTyJePh?c5w7?RznnO#1+PJ=+E9kokeQ^SSoFzew0`PKK=CDE}dA z|131hp6x0mJ#eI%*juS7*fnrK`aeEgF?JygqIO~ukp9`!4kKHxqigIqIw0=1kjS-X zS$E#9+~GRd|HlIh?KAg>+CLF>1Bdq-1`+#{)2r+`g&^a<tKV1K_3f{+yRj6KUJPt} z?4O;Nvpd@fNq-lTZR~eRt+DO@yAQ0Nt$(fExoTtkZ9$OovU5(Y{hGt)?JD*_&Nt&) zYHFYPM9w}?4zhoS=Y_BRCmt>PYYmY8rPhN5cG{}q_8Zni?prksS!egDjKiLD7o<Fz zw4THM!=A^s{?Phn+Ky6tq37G|ZtsPRhvdZ>+CSYVXLn8&vVO1h!h5?e;S_tjX^{Gs zDLvfYI49dqQUzju_1#X}$a{%)k3K`jv#uLIvs)mOXFq)dWPP%YMV0*;78`rJr;z@W z(9UpsJ|B16OfE=#g|xr0-E4c@?g|%Vf6@8{33l0jIrfhpyMx0cd);h1M)oB8#vF)x zWiuuF{8V9kD;das1wW5Zwv%p|*dEb`)W070_3c-0NwUAl1xa5aA4}|`J`~#*s6ozG zGk>aR-y?F)j(t94{G(}au02cZA-m0sA?g3XqGbEPcgc1o5|H&efl&|b{z<H{Gr0>{ z&)KZUX1~gW&wjry<UYh2bqo6k+%fh$c_9A#rQU7F*7C<rqX@F!-F!opJ#V*+{YB{b z((n7i_A9T<u>0`>(mtPY^}Jos_9nZvCn4oS+N~FM4;+&1W%42UzgXg)UDCe*`-)?b z@u5xo#q5+8n%JjCLHer+Co=4{EJf`$?u4w@yY#Ev_FRp&{q{SM_2N@Rx$Gu+9JhP- z0@7c3H(`&hn}w#moed=axUwkN*S=7;pVkMd4<ZEo?H(z{+bu8@2G^I9EVS%hH_O|5 z_Cmtb>GcxZJ<JPjHO@im&la9E`;9ux_FZQn{uTas)OOw-4f_q-ApQB!Y!>@}O9buT zmP5v$c)WV-R;wu5JNH25XOo1*>;+ai+e`0)^hf6MI@#;lMBC3^1xc^lC*QDp-tf)t z;$KMprY>k~-^rqH?|BT;AM0)Hu`{pQWY<>-X>ZjuT(f20dfSe57Q}xR^MdRJ&MmjQ zB?Y;Ut>x-AyAZFNb|H%)^-JCj3Hy41Li?o?AnS8dr&QaET#K>0eqIb*{!P3jWBc60 z*Pc%tGXI?$^4+c_jNjfS7*gMN?H99;Ur=qo+Yi#7+FG^Ru5F{9y~PYj{p-#?)6Vxx ziM@X)B>WBkCfOf%t+Bnn9+F<ort{iQNlLQ6KMhiUy^XcDk1{Q{6RLo;2OJrN?2j%D zvlo~NsV^scR@rM=1=;g9LCPb!CAl`i>@oH)rb6O--q`?qq2%>;6^fAhbhG0pJK@4S z`|AfG^En+`WbALpblAlfL*@e;XWp|D+$3Nhavsut6j744Z;pFz$F2jJ&spalZ1=%> zv9*~j<orvm#hi92OKj{vMnlH`mV5rR^YWf+w~Z0fzKZ$iZeMtBqTPXV$oRsgXH)DZ zde5{w%>y}qC)Q5N-fZ@3+dW?(^EoT`f3kC!B4$7DG~_<baOV|v%F4cWHd7$;^BhxS z?YpKb+0W{MtdC9ox!tbfUYTA0S4eu_sgY$bEd11t-3F3hSLAKA3;85sf9(KdeM^{$ zpsnrB9$SGn$oSkJ5kC8tj!1jgRlC9QdnX{(e$#t?J7qJ-dh*f*M{GT<?CdN0AoH`Q zJCyCqGve%yh#my1KUebH_T+AEd*<tq__)>-WxsggB|C0L$oyE3in3jcudDsyN09NG zP5ZL!ZOioSjhy7b`Dy1bU3<QpO16@hAmd^EIp%ho*k;+rOoz<JnIzWOUkX*U?^*Z> zY~Rz(^K92GW3#te0O_C0JbrJt$4cJ5A)O1{e_(5<wC8JYwG*8L*^l>CwAa=tWxt)@ z14wu@$n3JaeL2If;Rxh>t*LU;>`eX~wOdjLS#S8f|E=AO%Gq`gzd*(>^a5AdwrsDq zFH(Y(=Ml9N>=t^d*?A;G=AWXtc<l?%i`$tLLB@Z2;<W8kG}G-)#6#w*R;|mmf4<w$ zzGW6<{7=v_&;G5owmo+or2i3BCTX|ko{jwm2grRsPi?d8W75ytx^+Rum(?qF+vfZ@ zX=m#UsUQ1q$=PZhiMDrTSO5->u1DJT0p|+rFI7OsGk<VyuzP2mVs}*|6<l8^IPJC# z6L+&$u7T92dz?Pl9eVx9E}H|A-+Y+%+lhJZvs>H&Y2UAsPP4bzJ<HCX0aBi9t<<+q zEqiYF>K>$j_^30&UhmUxyKAQ*{aZnsd^?K^uj~vIAoY{S1QwgF)&J~bpyxsPP1;~< z^H9gGHL4CA-_h#gcHXwk_AK*a!S0jL*k{+jRLcH(9pwBCxgb0Hbn|Jp`7a^k5rSLS z*{Mx<V&^0YNw2r$l<cdHZ?OBk4Kki3DKBB~v+lQzpb=!ej_uD>yO8t*dkt+!`Ek^5 zpY5Sd4{bZtAm!~z<;ixZT|U`zzJ#=|Ol{WL^<)Ry)rmsZi`#!(Wmn?4#cpvNq(86t zfXDurg{A#50m%CC?{QrACq&=dRq8<Ich(12+UGp=vo{omwD&&dxZC$~JhHo=#}1C4 z3y+iR-<t~AGA)MOmvm73iQN&W6?R*8L)v2kP5bOhuU)r0uHX+=?{me`UcT1Ue)=nj zeW81m?PqQFv=!2ZoVT;~o`L;l^&@u9yCCBO^Q)Tdetpif7kUOcPmZbihTWs3pX}b& zW`V<dK982YgYQ$j$YhB6h4x$QT>Uca>gGYl`)YKL+Oh9`Zu?UkGJj%w?Wvt3FTZ`l z8c2I;sqb++Prp3-+0!B8Tl)+j+D%h3u-_#DX`h4c!oIqHx!srbkoE^(X0`p7OVe%A z<@SO76R2!zf9`v?-K`(j!0p4dNCmqLTO<1&T#)foqeW9}`KRo#i`WRsfAhb4+uz7E zvtJ?%nV+?fFSFmsa>8~>1?2p{FDumTw!Y@J?>-4xzczQ8p?&+LeEX~7kohtTJyrX& zVF&E4ltA`-JZYU{_xfM8eW(;<d?;sUjm^*Wa{IS8{K4Tfb?aSQuWlXtdCS&;-TQ1O zr`?i;A@(*x9$<OHN+tVOrs?+lg^>BoPAyUUPF-Vr8R&X|qW6yWCwesPHywk7&z{{@ zwyfpB_GeNc<*j>Ziv1#9R{PtXkp7-bueN>Gdkwpg0*L+Ma@=+^|9-G@$cMP^_QPEJ z)W<*UEU!c6*N^YAwNKTMuxC38(LcLC*#6!$D|=rK$a>c63#IMl6?WM<ynv(^>3{b2 zGp&m3XQo5$S28;yWzVH$VxRa05}z-+`0S5ewYNWeZ5ufMJ-U)?%j>OT&shoS50$h0 zwhP=a-_F<%a-N9%)0yD23O5)tgTteW@35^9^Fh0$rI7wVhh?;V)1!~J$In9g(_-dR z?OvZQwD&#<IWKwRd_Ma_xxDsUOCbHRgEuYhcU_-l=er(KzD7Gr*ozos*l*Yb8LxYP zjlu4F>07%`(Dt~C(|0?sA1wCTzaZ&1)MSU9*FrfPdsSI*e96o^Yo~Q<o*nBGNc(&r zQ<nXSx##V=KSRcc6;@>0-{5bvyQ2@8uYX?3XkWgV*Z%l#$aqE1tzdg6$w#(Amm%}t zj{eN{FJ;2))2>3&lhrR_yN*3~?5bEH`TOkpuXYSm`0TGTN`u3XwOznoCP>+K{|?A_ zR07jfyP5OO*tr-(+5;TRSJ*|#`PxS=fRt}-M+5976wU3c?m^Dm5ZtM2Z*fw=Ub7t1 zetP>t!@lYdhh1Y9WdGZiC!+SNCClt5?uLZti^3+`>lZ)Sop_}Pwtum5gnd=Ioc*^O zkoKOeCWk%q?~}IIH$(QzOn#|npL$HwKCS~Ye!AFYtKC%h68n^okn!8dNM2hbvx#;! z@{s!G{N8gmKUhxNZfv^<4&U%o*X=e+y4&;pf~-GS`e>1@HR}UA9ZN|6>ebsRc3Q9Y z*jx{StUup-MaI5(%|_eS@|j@w<@>wZ8%5^X+bBc!Kc5QNVK<NEt=+WX9&mXOJ(bbE zW4)*ylO`m*ip&k|P52n>rx!r_w`&6X>`p%Bu;0K9(LcpP%YH{Bzy0;jUa<bGOc(pd zcGdR(TOs-9<FS8sHJdAKi<R=g_Iq0Hw2M^PVs{6&K4Y)F-K%G1_CLKK_e0c#{j`fT zv$2o)3ppS1%bfFeU%no){o4Q;ztKy&VJG=T(*FJ%NPThS!X;br@M(5x-yr?Z^`~s? zlR|{-@7#lwxAE81?Qa+t*{K&o($hL89s9V1GV8bRAnVnlCcd}38OdP3P6*OI^a?b# zul*Kde_I98KD9VlV&5C@XM2<z(jLz^JHyU=BB#Ba6J))9QmT;s#`r?}y9*%g`Tb|+ z+Vv~$wtJ%qX)pcpake{f^}Suw0Z4rqbWX_L_F9l#Uohl6-k7N0cJI1l>^D0@)~_9U zT5dn*9EW|e0i=E@+;z+DjEA_j&?ks{p63_YPkLc&Kj8%=JPu6>v_G{{!@lzzr2W#q zK;6Dhpwzx@KjggYX<g}d4@=qY@7F=x)7+e5?+_DaZyo@N&&P=>cJJOlwb^k4lD>Z5 zu&}@QSJK|+A!Pl?y|+>Jf5P|L27Q9;FTZP-W+%i`X=~sO8DIUVE@}Vy_D{RYM-V={ z$tSymyYJbFPlK$-_u-1Lb9vfmw{BTCIQ`08thd*koMGRz>H;{uY)xEdXLFs?&h$5= z|LpZa+}=RzzRjz3koGPcQ>LA!yMx_JUPyn^@cRn8qpvdT_srM;)^DGqY`^%1v%PlR zOR)KuU-;QaWz^bBF+u7pW)o(6?+Ie|4eKEF<EO|3yO&F<Y#Eaw>)kpYD%c;6?6zb5 z2f1%0F3iaO_wO#d2o=bApPO!5*xy(uVgHpMQa+qr+iTZV<77932{Qg4t*348vHz-_ zm@s7ivVPT8Tia-R``dpZ`&-sscxd~*@2K6MH50+<KWBNWoz+1%yN$Jw`Rc<VXY7KW znAj_yhm?=veYLjde&yH~RYJ-`wyDZ?VRv}#{bzcB^}9S_vQJNKuv_E-*?(V9=4zkH zS84At6Vjep^;6SMe`>wm^e2sA_1o*k?3W8?+rPgEDGyD(z3e7cKe3L8g3NEMoM3LB zF7d&3`4>q4vBdYB)rFhu?7l65)F=PEd+ofY+uFN#LgKgU3a_1Zfv>$-3#7hqe_3an z8(L<+t`Rc+dO@?rF0uHNoxK|5e0$5CmiA2ts_eL&A?YEB$ID(U_LAMjHc0t;>y^H( z)4F>5idm5U{M-v>_BJe@cKOMW@=*0VyWRGSnf5hlknzQWPx<!uEVAq!%pm6<rA^Pb zFRgaATbBiCAFNeSvH!n(h270t5dCeQ-F6zSC+u7eAmg2}T(9hE!qx0|*sTSpAHNwX z_SuRD>~u^Z_4l&kS$1(H8g>gkAoDqk50u)A=7-ol{s!r9NJn$pC%wtG|6~ryk0D>a z+HPMIXS<RUlK<FLgY4(rskLu+g19&9M~ppFNv?gWB4oXaM6#;=`YD3;6R$$%7Y}{U zu`99+xBsynl77tc-0hueXV|@zgUlCe-|(^D6YXrLrJxM1?|CM*+qNkFv2(J8#1{Z{ CXgeSP literal 0 HcmV?d00001 diff --git a/Licence.txt b/Licence.txt index 671f482d3..5b1cb77af 100644 --- a/Licence.txt +++ b/Licence.txt @@ -1,3 +1,13 @@ +Logiciel initial: ScalFmm Version 0.5 +Co-auteurs : Olivier Coulaud, Bérenger Bramas. +Propriétaires : INRIA. +Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +Initial software: ScalFmm Version 0.5 +Co-authors: Olivier Coulaud, Bérenger Bramas. +Owners: INRIA. +Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. + + Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que la communauté scientifique l'utilise afin de le tester et de l'évaluer. Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation dans un but lucratif ou à des fins commerciales est interdite sauf autorisation expresse et préalable d'Inria. diff --git a/Src/Arranger/FOctreeArranger.hpp b/Src/Arranger/FOctreeArranger.hpp index bdb1229b5..205419597 100644 --- a/Src/Arranger/FOctreeArranger.hpp +++ b/Src/Arranger/FOctreeArranger.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FOCTREEARRANGER_HPP #define FOCTREEARRANGER_HPP diff --git a/Src/Arranger/FOctreeArrangerProc.hpp b/Src/Arranger/FOctreeArrangerProc.hpp index f6b868aea..146927ee8 100644 --- a/Src/Arranger/FOctreeArrangerProc.hpp +++ b/Src/Arranger/FOctreeArrangerProc.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FOCTREEARRANGERPROC_HPP #define FOCTREEARRANGERPROC_HPP diff --git a/Src/Components/FAbstractCell.hpp b/Src/Components/FAbstractCell.hpp index 224b12a19..93b2292c7 100644 --- a/Src/Components/FAbstractCell.hpp +++ b/Src/Components/FAbstractCell.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FABSTRACTCELL_HPP #define FABSTRACTCELL_HPP diff --git a/Src/Components/FAbstractKernels.hpp b/Src/Components/FAbstractKernels.hpp index f1a03f2e6..cd89e9f76 100644 --- a/Src/Components/FAbstractKernels.hpp +++ b/Src/Components/FAbstractKernels.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FABSTRACTKERNELS_HPP #define FABSTRACTKERNELS_HPP diff --git a/Src/Components/FAbstractLeaf.hpp b/Src/Components/FAbstractLeaf.hpp index 8f63ddb39..4466970df 100644 --- a/Src/Components/FAbstractLeaf.hpp +++ b/Src/Components/FAbstractLeaf.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FABSTRACTLEAF_HPP #define FABSTRACTLEAF_HPP diff --git a/Src/Components/FAbstractParticle.hpp b/Src/Components/FAbstractParticle.hpp index 504bcf05d..01ef72448 100644 --- a/Src/Components/FAbstractParticle.hpp +++ b/Src/Components/FAbstractParticle.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FABSTRACTPARTICLE_HPP #define FABSTRACTPARTICLE_HPP diff --git a/Src/Components/FBasicCell.hpp b/Src/Components/FBasicCell.hpp index b7d5cfe3f..c6b1885b0 100644 --- a/Src/Components/FBasicCell.hpp +++ b/Src/Components/FBasicCell.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FBASICCELL_HPP #define FBASICCELL_HPP diff --git a/Src/Components/FBasicKernels.hpp b/Src/Components/FBasicKernels.hpp index d552e3755..8a8bf31d6 100644 --- a/Src/Components/FBasicKernels.hpp +++ b/Src/Components/FBasicKernels.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FBASICKERNELS_HPP #define FBASICKERNELS_HPP diff --git a/Src/Components/FBasicParticle.hpp b/Src/Components/FBasicParticle.hpp index 046d8ca7b..a7d0b69e7 100644 --- a/Src/Components/FBasicParticle.hpp +++ b/Src/Components/FBasicParticle.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FBASICPARTICLE_HPP #define FBASICPARTICLE_HPP diff --git a/Src/Components/FFmaParticle.hpp b/Src/Components/FFmaParticle.hpp index 04b2c0bcb..21b350070 100644 --- a/Src/Components/FFmaParticle.hpp +++ b/Src/Components/FFmaParticle.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFmaPARTICLE_HPP #define FFmaPARTICLE_HPP diff --git a/Src/Components/FSimpleLeaf.hpp b/Src/Components/FSimpleLeaf.hpp index 8b044bca4..beb3895a9 100644 --- a/Src/Components/FSimpleLeaf.hpp +++ b/Src/Components/FSimpleLeaf.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FSIMPLELEAF_HPP #define FSIMPLELEAF_HPP diff --git a/Src/Components/FTestCell.hpp b/Src/Components/FTestCell.hpp index fcff639a7..cfb6db2ed 100644 --- a/Src/Components/FTestCell.hpp +++ b/Src/Components/FTestCell.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTESTCELL_HPP #define FTESTCELL_HPP diff --git a/Src/Components/FTestKernels.hpp b/Src/Components/FTestKernels.hpp index b1f8d0655..611a2abd1 100644 --- a/Src/Components/FTestKernels.hpp +++ b/Src/Components/FTestKernels.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTESTKERNELS_HPP #define FTESTKERNELS_HPP diff --git a/Src/Components/FTestParticle.hpp b/Src/Components/FTestParticle.hpp index fb304810f..12c9bf3f7 100644 --- a/Src/Components/FTestParticle.hpp +++ b/Src/Components/FTestParticle.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTESTPARTICLE_HPP #define FTESTPARTICLE_HPP diff --git a/Src/Components/FTestPeriodicKernels.hpp b/Src/Components/FTestPeriodicKernels.hpp index adfe4a696..4da86c2a2 100644 --- a/Src/Components/FTestPeriodicKernels.hpp +++ b/Src/Components/FTestPeriodicKernels.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTESTPERIODICKERNELS_HPP #define FTESTPERIODICKERNELS_HPP diff --git a/Src/Components/FTypedLeaf.hpp b/Src/Components/FTypedLeaf.hpp index 3a31bc02d..0e0740e4f 100644 --- a/Src/Components/FTypedLeaf.hpp +++ b/Src/Components/FTypedLeaf.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTYPEDLEAF_HPP #define FTYPEDLEAF_HPP diff --git a/Src/Containers/FBoolArray.hpp b/Src/Containers/FBoolArray.hpp index 7a7c405bf..ef08d9875 100644 --- a/Src/Containers/FBoolArray.hpp +++ b/Src/Containers/FBoolArray.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FBOOLARRAY_HPP #define FBOOLARRAY_HPP diff --git a/Src/Containers/FLightOctree.hpp b/Src/Containers/FLightOctree.hpp index c19fe4de0..42c3f99cf 100644 --- a/Src/Containers/FLightOctree.hpp +++ b/Src/Containers/FLightOctree.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FLIGHTOCTREE_HPP #define FLIGHTOCTREE_HPP diff --git a/Src/Containers/FList.hpp b/Src/Containers/FList.hpp index a72ac353a..ea88ee0e8 100644 --- a/Src/Containers/FList.hpp +++ b/Src/Containers/FList.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FLIST_HPP #define FLIST_HPP diff --git a/Src/Containers/FOctree.hpp b/Src/Containers/FOctree.hpp index 8cce218c0..c9c97b223 100644 --- a/Src/Containers/FOctree.hpp +++ b/Src/Containers/FOctree.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FOCTREE_HPP #define FOCTREE_HPP diff --git a/Src/Containers/FSubOctree.hpp b/Src/Containers/FSubOctree.hpp index 6f2c4a0b1..687dfe648 100644 --- a/Src/Containers/FSubOctree.hpp +++ b/Src/Containers/FSubOctree.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FSUBOCTREE_HPP #define FSUBOCTREE_HPP diff --git a/Src/Containers/FTreeCoordinate.hpp b/Src/Containers/FTreeCoordinate.hpp index 2f0480d14..ae459fd67 100644 --- a/Src/Containers/FTreeCoordinate.hpp +++ b/Src/Containers/FTreeCoordinate.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTREECOORDINATE_HPP #define FTREECOORDINATE_HPP diff --git a/Src/Containers/FVector.hpp b/Src/Containers/FVector.hpp index 3b05e1bb0..d7412b84e 100644 --- a/Src/Containers/FVector.hpp +++ b/Src/Containers/FVector.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FVECTOR_HPP #define FVECTOR_HPP diff --git a/Src/Core/FFmmAlgorithm.hpp b/Src/Core/FFmmAlgorithm.hpp index 099ffdff7..90afff093 100644 --- a/Src/Core/FFmmAlgorithm.hpp +++ b/Src/Core/FFmmAlgorithm.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHM_HPP #define FFMMALGORITHM_HPP diff --git a/Src/Core/FFmmAlgorithmPeriodic.hpp b/Src/Core/FFmmAlgorithmPeriodic.hpp index 0974ed766..f478866bd 100644 --- a/Src/Core/FFmmAlgorithmPeriodic.hpp +++ b/Src/Core/FFmmAlgorithmPeriodic.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHMPERIODIC_HPP #define FFMMALGORITHMPERIODIC_HPP diff --git a/Src/Core/FFmmAlgorithmTask.hpp b/Src/Core/FFmmAlgorithmTask.hpp index daee348d8..72281b32e 100644 --- a/Src/Core/FFmmAlgorithmTask.hpp +++ b/Src/Core/FFmmAlgorithmTask.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHMTASK_HPP #define FFMMALGORITHMTASK_HPP diff --git a/Src/Core/FFmmAlgorithmThread.hpp b/Src/Core/FFmmAlgorithmThread.hpp index f2dc8d562..d8b7fa74b 100644 --- a/Src/Core/FFmmAlgorithmThread.hpp +++ b/Src/Core/FFmmAlgorithmThread.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHMTHREAD_HPP #define FFMMALGORITHMTHREAD_HPP diff --git a/Src/Core/FFmmAlgorithmThreadProc.hpp b/Src/Core/FFmmAlgorithmThreadProc.hpp index a0dea032c..60be53118 100644 --- a/Src/Core/FFmmAlgorithmThreadProc.hpp +++ b/Src/Core/FFmmAlgorithmThreadProc.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHMTHREADPROC_HPP #define FFMMALGORITHMTHREADPROC_HPP @@ -570,15 +565,12 @@ private: MPI_Status status[2 * nbProcess * OctreeHeight]; int iterRequest = 0; - struct CellToSend{ - MortonIndex index; - char data[CellClass::SerializedSizeUp]; - }; + const int SizeOfCellToSend = sizeof(MortonIndex) + CellClass::SerializedSizeUp; - CellToSend* sendBuffer[nbProcess * OctreeHeight]; + char* sendBuffer[nbProcess * OctreeHeight]; memset(sendBuffer, 0, sizeof(CellClass*) * nbProcess * OctreeHeight); - CellToSend* recvBuffer[nbProcess * OctreeHeight]; + char* recvBuffer[nbProcess * OctreeHeight]; memset(recvBuffer, 0, sizeof(CellClass*) * nbProcess * OctreeHeight); @@ -586,22 +578,23 @@ private: for(int idxProc = 0 ; idxProc < nbProcess ; ++idxProc){ const int toSendAtProcAtLevel = indexToSend[idxLevel * nbProcess + idxProc]; if(toSendAtProcAtLevel != 0){ - sendBuffer[idxLevel * nbProcess + idxProc] = new CellToSend[toSendAtProcAtLevel]; + sendBuffer[idxLevel * nbProcess + idxProc] = new char[toSendAtProcAtLevel * SizeOfCellToSend]; for(int idxLeaf = 0 ; idxLeaf < toSendAtProcAtLevel; ++idxLeaf){ - sendBuffer[idxLevel * nbProcess + idxProc][idxLeaf].index = toSend[idxLevel * nbProcess + idxProc][idxLeaf].getCurrentGlobalIndex(); - toSend[idxLevel * nbProcess + idxProc][idxLeaf].getCurrentCell()->serializeUp(sendBuffer[idxLevel * nbProcess + idxProc][idxLeaf].data); + const MortonIndex cellIndex = toSend[idxLevel * nbProcess + idxProc][idxLeaf].getCurrentGlobalIndex(); + memcpy(&sendBuffer[idxLevel * nbProcess + idxProc][idxLeaf * SizeOfCellToSend],&cellIndex, sizeof(MortonIndex)); + toSend[idxLevel * nbProcess + idxProc][idxLeaf].getCurrentCell()->serializeUp(&sendBuffer[idxLevel * nbProcess + idxProc][idxLeaf * SizeOfCellToSend] + sizeof(MortonIndex)); } - FMpi::MpiAssert( MPI_Isend( sendBuffer[idxLevel * nbProcess + idxProc], toSendAtProcAtLevel * int(sizeof(CellToSend)) , MPI_BYTE , + FMpi::MpiAssert( MPI_Isend( sendBuffer[idxLevel * nbProcess + idxProc], toSendAtProcAtLevel * SizeOfCellToSend , MPI_BYTE , idxProc, FMpi::TagLast + idxLevel, MPI_COMM_WORLD, &requests[iterRequest++]) , __LINE__ ); } const int toReceiveFromProcAtLevel = globalReceiveMap[(idxProc * nbProcess * OctreeHeight) + idxLevel * nbProcess + idProcess]; if(toReceiveFromProcAtLevel){ - recvBuffer[idxLevel * nbProcess + idxProc] = new CellToSend[toReceiveFromProcAtLevel]; + recvBuffer[idxLevel * nbProcess + idxProc] = new char[toReceiveFromProcAtLevel * SizeOfCellToSend]; - FMpi::MpiAssert( MPI_Irecv(recvBuffer[idxLevel * nbProcess + idxProc], toReceiveFromProcAtLevel * int(sizeof(CellToSend)), MPI_BYTE, + FMpi::MpiAssert( MPI_Irecv(recvBuffer[idxLevel * nbProcess + idxProc], toReceiveFromProcAtLevel * SizeOfCellToSend, MPI_BYTE, idxProc, FMpi::TagLast + idxLevel, MPI_COMM_WORLD, &requests[iterRequest++]) , __LINE__ ); } } @@ -686,9 +679,12 @@ private: FLightOctree tempTree; for(int idxProc = 0 ; idxProc < nbProcess ; ++idxProc){ const int toReceiveFromProcAtLevel = globalReceiveMap[(idxProc * nbProcess * OctreeHeight) + idxLevel * nbProcess + idProcess]; - const CellToSend* const cells = recvBuffer[idxLevel * nbProcess + idxProc]; + const char* const cells = recvBuffer[idxLevel * nbProcess + idxProc]; for(int idxCell = 0 ; idxCell < toReceiveFromProcAtLevel ; ++idxCell){ - tempTree.insertCell(cells[idxCell].index, cells[idxCell].data, idxLevel); + MortonIndex cellIndex = 0; + memcpy(&cellIndex, &cells[idxCell * SizeOfCellToSend], sizeof(MortonIndex)); + const char* const cellData = &cells[idxCell * SizeOfCellToSend] + sizeof(MortonIndex); + tempTree.insertCell(cellIndex, cellData, idxLevel); } } diff --git a/Src/Core/FFmmAlgorithmThreadProcPeriodic.hpp b/Src/Core/FFmmAlgorithmThreadProcPeriodic.hpp index 9aaec5aa5..31d980ebb 100644 --- a/Src/Core/FFmmAlgorithmThreadProcPeriodic.hpp +++ b/Src/Core/FFmmAlgorithmThreadProcPeriodic.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFmmAlgorithmThreadProcPeriodicPERIODIC_HPP #define FFmmAlgorithmThreadProcPeriodicPERIODIC_HPP diff --git a/Src/Core/FFmmAlgorithmThreadTsm.hpp b/Src/Core/FFmmAlgorithmThreadTsm.hpp index 4a189254b..7adce618f 100644 --- a/Src/Core/FFmmAlgorithmThreadTsm.hpp +++ b/Src/Core/FFmmAlgorithmThreadTsm.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHMTHREADTSM_HPP #define FFMMALGORITHMTHREADTSM_HPP diff --git a/Src/Core/FFmmAlgorithmTsm.hpp b/Src/Core/FFmmAlgorithmTsm.hpp index c210031e0..7ca3ed235 100644 --- a/Src/Core/FFmmAlgorithmTsm.hpp +++ b/Src/Core/FFmmAlgorithmTsm.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHMTSM_HPP #define FFMMALGORITHMTSM_HPP diff --git a/Src/Extensions/FExtendCellType.hpp b/Src/Extensions/FExtendCellType.hpp index 3db619be7..ff4fd7eb0 100644 --- a/Src/Extensions/FExtendCellType.hpp +++ b/Src/Extensions/FExtendCellType.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDCELLTYPE_HPP #define FEXTENDCELLTYPE_HPP diff --git a/Src/Extensions/FExtendCoordinate.hpp b/Src/Extensions/FExtendCoordinate.hpp index 212039f72..eba5d0e99 100644 --- a/Src/Extensions/FExtendCoordinate.hpp +++ b/Src/Extensions/FExtendCoordinate.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDCOORDINATE_HPP #define FEXTENDCOORDINATE_HPP diff --git a/Src/Extensions/FExtendForces.hpp b/Src/Extensions/FExtendForces.hpp index 0195eb2ce..324b9ee9e 100644 --- a/Src/Extensions/FExtendForces.hpp +++ b/Src/Extensions/FExtendForces.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDFORCES_HPP #define FEXTENDFORCES_HPP diff --git a/Src/Extensions/FExtendMortonIndex.hpp b/Src/Extensions/FExtendMortonIndex.hpp index 87da37325..90f9d6ce2 100644 --- a/Src/Extensions/FExtendMortonIndex.hpp +++ b/Src/Extensions/FExtendMortonIndex.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDMORTONINDEX_HPP #define FEXTENDMORTONINDEX_HPP diff --git a/Src/Extensions/FExtendParticleType.hpp b/Src/Extensions/FExtendParticleType.hpp index 0d4cbc8ed..fdb5792e9 100644 --- a/Src/Extensions/FExtendParticleType.hpp +++ b/Src/Extensions/FExtendParticleType.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDPARTICLETYPE_HPP #define FEXTENDPARTICLETYPE_HPP diff --git a/Src/Extensions/FExtendPhysicalValue.hpp b/Src/Extensions/FExtendPhysicalValue.hpp index be73349c0..82a81626f 100644 --- a/Src/Extensions/FExtendPhysicalValue.hpp +++ b/Src/Extensions/FExtendPhysicalValue.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FExtendPhysicalValue_HPP #define FExtendPhysicalValue_HPP diff --git a/Src/Extensions/FExtendPosition.hpp b/Src/Extensions/FExtendPosition.hpp index d8668c8d2..ab4bcf807 100644 --- a/Src/Extensions/FExtendPosition.hpp +++ b/Src/Extensions/FExtendPosition.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDPOSITION_HPP #define FEXTENDPOSITION_HPP diff --git a/Src/Extensions/FExtendPotential.hpp b/Src/Extensions/FExtendPotential.hpp index 4ee2e700a..e8c85f4b2 100644 --- a/Src/Extensions/FExtendPotential.hpp +++ b/Src/Extensions/FExtendPotential.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDPOTENTIAL_HPP #define FEXTENDPOTENTIAL_HPP diff --git a/Src/Extensions/FExtendVelocity.hpp b/Src/Extensions/FExtendVelocity.hpp index 9f165a0fa..7e2f8e2ac 100644 --- a/Src/Extensions/FExtendVelocity.hpp +++ b/Src/Extensions/FExtendVelocity.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDVELOCITY_HPP #define FEXTENDVELOCITY_HPP diff --git a/Src/Files/FAbstractLoader.hpp b/Src/Files/FAbstractLoader.hpp index f241f53d0..6b8649789 100644 --- a/Src/Files/FAbstractLoader.hpp +++ b/Src/Files/FAbstractLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FABSTRACTLOADER_HPP #define FABSTRACTLOADER_HPP diff --git a/Src/Files/FBasicLoader.hpp b/Src/Files/FBasicLoader.hpp index 979e3d85d..577d68e07 100644 --- a/Src/Files/FBasicLoader.hpp +++ b/Src/Files/FBasicLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FBASICLOADER_HPP #define FBASICLOADER_HPP diff --git a/Src/Files/FEwalLoader.hpp b/Src/Files/FEwalLoader.hpp index e07a04b34..cbc2ec5ee 100644 --- a/Src/Files/FEwalLoader.hpp +++ b/Src/Files/FEwalLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMALOADER_HPP #define FFMALOADER_HPP diff --git a/Src/Files/FFmaBinLoader.hpp b/Src/Files/FFmaBinLoader.hpp index 5a8f5c47f..ffef46b08 100644 --- a/Src/Files/FFmaBinLoader.hpp +++ b/Src/Files/FFmaBinLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMABINLOADER_HPP #define FFMABINLOADER_HPP diff --git a/Src/Files/FFmaLoader.hpp b/Src/Files/FFmaLoader.hpp index 34c94d7c3..e75657d66 100644 --- a/Src/Files/FFmaLoader.hpp +++ b/Src/Files/FFmaLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMALOADER_HPP #define FFMALOADER_HPP diff --git a/Src/Files/FFmaScanfLoader.hpp b/Src/Files/FFmaScanfLoader.hpp index b5ddb4643..3106e2f16 100644 --- a/Src/Files/FFmaScanfLoader.hpp +++ b/Src/Files/FFmaScanfLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMASCANFLOADER_HPP #define FFMASCANFLOADER_HPP @@ -72,9 +67,8 @@ public: float x,y,z, fBoxWidth; const int nbReadElements = fscanf(file,"%d %f %f %f %f",&this->nbParticles,&fBoxWidth,&x,&y,&z); if(nbReadElements == 5){ - this->boxWidth = fBoxWidth; + this->boxWidth = fBoxWidth * 2; this->centerOfBox.setPosition(x,y,z); - this->boxWidth *= 2; } else{ fclose(file); diff --git a/Src/Files/FFmaTsmLoader.hpp b/Src/Files/FFmaTsmLoader.hpp index 3a78500ca..8e1d892ae 100644 --- a/Src/Files/FFmaTsmLoader.hpp +++ b/Src/Files/FFmaTsmLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMATSMLOADER_HPP #define FFMATSMLOADER_HPP diff --git a/Src/Files/FHLoader.hpp b/Src/Files/FHLoader.hpp index 00dac32bd..4cea7882c 100644 --- a/Src/Files/FHLoader.hpp +++ b/Src/Files/FHLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FHLOADER_HPP #define FHLOADER_HPP diff --git a/Src/Files/FMpiFmaLoader.hpp b/Src/Files/FMpiFmaLoader.hpp index 9f81706be..cb28ce82d 100644 --- a/Src/Files/FMpiFmaLoader.hpp +++ b/Src/Files/FMpiFmaLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FMPIFMALOADER_HPP #define FMPIFMALOADER_HPP diff --git a/Src/Files/FMpiTreeBuilder.hpp b/Src/Files/FMpiTreeBuilder.hpp index d374b7aad..8fad26df6 100644 --- a/Src/Files/FMpiTreeBuilder.hpp +++ b/Src/Files/FMpiTreeBuilder.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FMPITREEBUILDER_H #define FMPITREEBUILDER_H diff --git a/Src/Files/FRandomLoader.hpp b/Src/Files/FRandomLoader.hpp index cc6a26b18..867c1080d 100644 --- a/Src/Files/FRandomLoader.hpp +++ b/Src/Files/FRandomLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FHLOADER_HPP #define FHLOADER_HPP diff --git a/Src/Files/FTreeCsvSaver.hpp b/Src/Files/FTreeCsvSaver.hpp index bdd72a579..e5ccca7a8 100644 --- a/Src/Files/FTreeCsvSaver.hpp +++ b/Src/Files/FTreeCsvSaver.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTREECSVSAVER_HPP #define FTREECSVSAVER_HPP diff --git a/Src/Files/FTreeIO.hpp b/Src/Files/FTreeIO.hpp index a47e4387b..04a373921 100644 --- a/Src/Files/FTreeIO.hpp +++ b/Src/Files/FTreeIO.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTREEIO_HPP #define FTREEIO_HPP diff --git a/Src/Fmb/FExtendFmbCell.hpp b/Src/Fmb/FExtendFmbCell.hpp index ba8b1b0a7..e463a91a1 100644 --- a/Src/Fmb/FExtendFmbCell.hpp +++ b/Src/Fmb/FExtendFmbCell.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDFMBCELL_HPP #define FEXTENDFMBCELL_HPP diff --git a/Src/Fmb/FFmbComponents.hpp b/Src/Fmb/FFmbComponents.hpp index 4b8934d5c..865dcd9a9 100644 --- a/Src/Fmb/FFmbComponents.hpp +++ b/Src/Fmb/FFmbComponents.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMBCOMPONENTS_HPP #define FFMBCOMPONENTS_HPP diff --git a/Src/Fmb/FFmbKernels.hpp b/Src/Fmb/FFmbKernels.hpp index e13135bb4..2ec13be01 100644 --- a/Src/Fmb/FFmbKernels.hpp +++ b/Src/Fmb/FFmbKernels.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMBKERNELS_HPP #define FFMBKERNELS_HPP diff --git a/Src/Fmb/FFmbKernelsBlas.hpp b/Src/Fmb/FFmbKernelsBlas.hpp index fb7e31ed8..8a7231765 100644 --- a/Src/Fmb/FFmbKernelsBlas.hpp +++ b/Src/Fmb/FFmbKernelsBlas.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMBKERNELSBLAS_HPP #define FFMBKERNELSBLAS_HPP diff --git a/Src/Fmb/FFmbKernelsBlockBlas.hpp b/Src/Fmb/FFmbKernelsBlockBlas.hpp index d08fa04e5..14b15a970 100644 --- a/Src/Fmb/FFmbKernelsBlockBlas.hpp +++ b/Src/Fmb/FFmbKernelsBlockBlas.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMBKERNELSBLOCKBLAS_HPP #define FFMBKERNELSBLOCKBLAS_HPP diff --git a/Src/Kernels/FElecForcesKernels.hpp b/Src/Kernels/FAbstractSphericalKernel.hpp similarity index 67% rename from Src/Kernels/FElecForcesKernels.hpp rename to Src/Kernels/FAbstractSphericalKernel.hpp index 3cba30175..3abc8133a 100644 --- a/Src/Kernels/FElecForcesKernels.hpp +++ b/Src/Kernels/FAbstractSphericalKernel.hpp @@ -1,20 +1,15 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== -#ifndef FELECBASICKERNELS_HPP -#define FELECBASICKERNELS_HPP +#ifndef FABSTRACTSPHERICALKERNEL_HPP +#define FABSTRACTSPHERICALKERNEL_HPP #include "../Components/FAbstractKernels.hpp" @@ -28,50 +23,36 @@ /** * @author Berenger Bramas (berenger.bramas@inria.fr) -* @brief -* Please read the license -* +* This is the abstract spherical harmonic kernel */ template< class ParticleClass, class CellClass, class ContainerClass> -class FElecForcesKernels : public FAbstractKernels<ParticleClass,CellClass,ContainerClass> { - const int devP; //< The P - const int devM2lP; //< A secondary P - const FReal boxWidth; //< the box width at leaf level - const int treeHeight; //< The height of the tree +class FAbstractSphericalKernel : public FAbstractKernels<ParticleClass,CellClass,ContainerClass> { +protected: + const int devP; //< The P + const FReal boxWidth; //< the box width at leaf level + const int treeHeight; //< The height of the tree const int periodicLevels; //< The number of levels above 1 used for periodicity FHarmonic harmonic; //< The harmonic computation class // For normal computation - FComplexe* preL2LTransitions; //< The pre-computation for the L2L based on the level - FComplexe* preM2MTransitions; //< The pre-computation for the M2M based on the level + FComplexe** preL2LTransitions; //< The pre-computation for the L2L based on the level + FComplexe** preM2MTransitions; //< The pre-computation for the M2M based on the level - FComplexe* preM2LTransitions; //< The pre-computation for the M2L based on the level and the 189 possibilities - - // For harmonic computation - FComplexe* preL2LTransitionsPer; //< The pre-computation for the L2L based on the level - FComplexe* preM2MTransitionsPer; //< The pre-computation for the M2M based on the level - - FComplexe* preM2LTransitionsPer; //< The pre-computation for the M2L based on the level and the 189 possibilities - - /** To access te preL2L/preM2M right vector */ - int indexTransition(const int level, const int child){ - return level * 8 * harmonic.getExpSize() + child * harmonic.getExpSize(); - } - - /** To access te preM2L right vector */ - int indexM2LTransition(const int idxLevel,const int idxX,const int idxY,const int idxZ){ - return (idxLevel * 7 * 7 * 7 * devM2lP) + (((((idxX+3) * 7) + (idxY+3)) * 7 ) + (idxZ+3)) * devM2lP; - } /** Alloc and init pre-vectors*/ void allocAndInit(){ - preL2LTransitions = new FComplexe[treeHeight * 8 * harmonic.getExpSize()]; - preM2MTransitions = new FComplexe[treeHeight * 8 * harmonic.getExpSize()]; + preL2LTransitions = new FComplexe*[treeHeight + periodicLevels]; + memset(preL2LTransitions, 0, (treeHeight + periodicLevels) * sizeof(FComplexe*)); + preM2MTransitions = new FComplexe*[treeHeight + periodicLevels]; + memset(preM2MTransitions, 0, (treeHeight + periodicLevels) * sizeof(FComplexe*)); + + FReal treeWidthAtLevel = (boxWidth * FReal(1 << periodicLevels))/2; + for(int idxLevel = -periodicLevels ; idxLevel < treeHeight - 1 ; ++idxLevel ){ + preL2LTransitions[idxLevel + periodicLevels] = new FComplexe[ 8 * harmonic.getExpSize()]; + preM2MTransitions[idxLevel + periodicLevels] = new FComplexe[ 8 * harmonic.getExpSize()]; - FReal treeWidthAtLevel = boxWidth/2; - for(int idxLevel = 0 ; idxLevel < treeHeight - 1 ; ++idxLevel ){ const F3DPosition father(treeWidthAtLevel,treeWidthAtLevel,treeWidthAtLevel); treeWidthAtLevel /= 2; @@ -86,7 +67,7 @@ class FElecForcesKernels : public FAbstractKernels<ParticleClass,CellClass,Conta ); harmonic.computeInner(FSpherical(M2MVector)); - FMemUtils::copyall<FComplexe>(&preM2MTransitions[indexTransition(idxLevel,idxChild)], harmonic.result(), harmonic.getExpSize()); + FMemUtils::copyall<FComplexe>(&preM2MTransitions[idxLevel + periodicLevels][harmonic.getExpSize() * idxChild], harmonic.result(), harmonic.getExpSize()); const F3DPosition L2LVector ( (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))) - father.getX(), @@ -95,123 +76,42 @@ class FElecForcesKernels : public FAbstractKernels<ParticleClass,CellClass,Conta ); harmonic.computeInner(FSpherical(L2LVector)); - FMemUtils::copyall<FComplexe>(&preL2LTransitions[indexTransition(idxLevel,idxChild)], harmonic.result(), harmonic.getExpSize()); + FMemUtils::copyall<FComplexe>(&preL2LTransitions[idxLevel + periodicLevels][harmonic.getExpSize() * idxChild], harmonic.result(), harmonic.getExpSize()); } } - - // M2L transfer, there is a maximum of 3 neighbors in each direction, - // so 6 in each dimension - treeWidthAtLevel = boxWidth; - preM2LTransitions = new FComplexe[treeHeight * (7 * 7 * 7) * devM2lP]; - for(int idxLevel = 0 ; idxLevel < treeHeight ; ++idxLevel ){ - for(int idxX = -3 ; idxX <= 3 ; ++idxX ){ - for(int idxY = -3 ; idxY <= 3 ; ++idxY ){ - for(int idxZ = -3 ; idxZ <= 3 ; ++idxZ ){ - if(idxX || idxY || idxZ){ - const F3DPosition relativePos( FReal(idxX) * treeWidthAtLevel , FReal(idxY) * treeWidthAtLevel , FReal(idxZ) * treeWidthAtLevel ); - harmonic.computeOuter(FSpherical(relativePos)); - FMemUtils::copyall<FComplexe>(&preM2LTransitions[indexM2LTransition(idxLevel,idxX,idxY,idxZ)], harmonic.result(), harmonic.getExpSize()); - } - } - } - } - treeWidthAtLevel /= 2; - } - } - - void allocAndInitPer(){ - if( periodicLevels ){ - preL2LTransitionsPer = new FComplexe[periodicLevels * 8 * harmonic.getExpSize()]; - preM2MTransitionsPer = new FComplexe[periodicLevels * 8 * harmonic.getExpSize()]; - - FReal treeWidthAtLevel = boxWidth; - for(int idxLevel = -1 ; idxLevel >= -periodicLevels ; --idxLevel ){ - const F3DPosition father(treeWidthAtLevel,treeWidthAtLevel,treeWidthAtLevel); - treeWidthAtLevel *= 2; - - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild ){ - FTreeCoordinate childBox; - childBox.setPositionFromMorton(idxChild,1); - - const F3DPosition M2MVector ( - father.getX() - (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))), - father.getY() - (treeWidthAtLevel * FReal(1 + (childBox.getY() * 2))), - father.getZ() - (treeWidthAtLevel * FReal(1 + (childBox.getZ() * 2))) - ); - - harmonic.computeInner(FSpherical(M2MVector)); - FMemUtils::copyall<FComplexe>(&preM2MTransitionsPer[indexTransition(-1-idxLevel,idxChild)], harmonic.result(), harmonic.getExpSize()); - - const F3DPosition L2LVector ( - (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))) - father.getX(), - (treeWidthAtLevel * FReal(1 + (childBox.getY() * 2))) - father.getY(), - (treeWidthAtLevel * FReal(1 + (childBox.getZ() * 2))) - father.getZ() - ); - - harmonic.computeInner(FSpherical(L2LVector)); - FMemUtils::copyall<FComplexe>(&preL2LTransitionsPer[indexTransition(-1-idxLevel,idxChild)], harmonic.result(), harmonic.getExpSize()); - } - } - - // M2L transfer, there is a maximum of 3 neighbors in each direction, - // so 6 in each dimension - treeWidthAtLevel = boxWidth*2; - preM2LTransitionsPer = new FComplexe[periodicLevels * (7 * 7 * 7) * devM2lP]; - for(int idxLevel = -1 ; idxLevel >= -periodicLevels ; --idxLevel ){ - for(int idxX = -3 ; idxX <= 3 ; ++idxX ){ - for(int idxY = -3 ; idxY <= 3 ; ++idxY ){ - for(int idxZ = -3 ; idxZ <= 3 ; ++idxZ ){ - if(idxX || idxY || idxZ){ - const F3DPosition relativePos( FReal(idxX) * treeWidthAtLevel , FReal(idxY) * treeWidthAtLevel , FReal(idxZ) * treeWidthAtLevel ); - harmonic.computeOuter(FSpherical(relativePos)); - FMemUtils::copyall<FComplexe>(&preM2LTransitionsPer[indexM2LTransition(-1-idxLevel,idxX,idxY,idxZ)], harmonic.result(), harmonic.getExpSize()); - } - } - } - } - treeWidthAtLevel *= 2; - } - } } public: /** Kernel constructor */ - FElecForcesKernels(const int inDevP, const int inTreeHeight, const FReal inBoxWidth, const int inPeriodicLevel = 0) - : devP(inDevP), devM2lP(int(((inDevP*2)+1) * ((inDevP*2)+2) * 0.5)), boxWidth(inBoxWidth), + FAbstractSphericalKernel(const int inDevP, const int inTreeHeight, const FReal inBoxWidth, const int inPeriodicLevel = 0) + : devP(inDevP), boxWidth(inBoxWidth), treeHeight(inTreeHeight), periodicLevels(inPeriodicLevel), harmonic(inDevP), - preL2LTransitions(0), preM2MTransitions(0), preM2LTransitions(0), - preL2LTransitionsPer(0), preM2MTransitionsPer(0), preM2LTransitionsPer(0) { + preL2LTransitions(0), preM2MTransitions(0) { allocAndInit(); - allocAndInitPer(); } /** Copy constructor */ - FElecForcesKernels(const FElecForcesKernels& other) - : devP(other.devP), devM2lP(other.devM2lP), boxWidth(other.boxWidth), + FAbstractSphericalKernel(const FAbstractSphericalKernel& other) + : devP(other.devP), boxWidth(other.boxWidth), treeHeight(other.treeHeight), periodicLevels(other.periodicLevels), harmonic(other.devP), - preL2LTransitions(0), preM2MTransitions(0), preM2LTransitions(0), - preL2LTransitionsPer(0), preM2MTransitionsPer(0), preM2LTransitionsPer(0) { + preL2LTransitions(0), preM2MTransitions(0) { allocAndInit(); - allocAndInitPer(); } /** Default destructor */ - ~FElecForcesKernels(){ + virtual ~FAbstractSphericalKernel(){ + FMemUtils::DeleteAll(preL2LTransitions, treeHeight + periodicLevels); delete[] preL2LTransitions; + FMemUtils::DeleteAll(preM2MTransitions, treeHeight + periodicLevels); delete[] preM2MTransitions; - delete[] preM2LTransitions; - - delete[] preL2LTransitionsPer; - delete[] preM2MTransitionsPer; - delete[] preM2LTransitionsPer; } /** P2M with a cell and all its particles */ void P2M(CellClass* const inPole, const ContainerClass* const inParticles) { - FComplexe* const cellMultiPole = inPole->getMultipole(); + FComplexe* FRestrict const cellMultiPole = inPole->getMultipole(); // Copying the position is faster than using cell position const F3DPosition polePosition = inPole->getPosition(); // For all particles in the leaf box @@ -225,68 +125,27 @@ public: /** M2M with a cell and all its child */ void M2M(CellClass* const FRestrict inPole, const CellClass *const FRestrict *const FRestrict inChild, const int inLevel) { - FComplexe* const multipole_exp_target = inPole->getMultipole(); + FComplexe* FRestrict const multipole_exp_target = inPole->getMultipole(); // iter on each child and process M2M - if( inLevel >= 0){ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(inChild[idxChild]){ - multipoleToMultipole(multipole_exp_target, inChild[idxChild]->getMultipole(), &preM2MTransitions[indexTransition(inLevel,idxChild)]); - } - } - } - else{ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(inChild[idxChild]){ - multipoleToMultipole(multipole_exp_target, inChild[idxChild]->getMultipole(), &preM2MTransitionsPer[indexTransition(-1-inLevel,idxChild)]); - } + const FComplexe* FRestrict const preM2MTransitionsAtLevel = preM2MTransitions[inLevel + periodicLevels]; + for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ + if(inChild[idxChild]){ + multipoleToMultipole(multipole_exp_target, inChild[idxChild]->getMultipole(), &preM2MTransitionsAtLevel[idxChild * harmonic.getExpSize()]); } } } /** M2L with a cell and all the existing neighbors */ - void M2L(CellClass* const FRestrict pole, const CellClass* distantNeighbors[189], - const int size, const int inLevel) { - const FTreeCoordinate& coordCenter = pole->getCoordinate(); - // For all neighbors compute M2L - if( inLevel >= 0){ - for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ - const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); - const FComplexe* const transitionVector = &preM2LTransitions[indexM2LTransition(inLevel, - (coordCenter.getX() - coordNeighbors.getX()), - (coordCenter.getY() - coordNeighbors.getY()), - (coordCenter.getZ() - coordNeighbors.getZ()))]; - - multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); - } - } - else { - for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ - const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); - const FComplexe* const transitionVector = &preM2LTransitionsPer[indexM2LTransition(-1-inLevel, - (coordCenter.getX() - coordNeighbors.getX()), - (coordCenter.getY() - coordNeighbors.getY()), - (coordCenter.getZ() - coordNeighbors.getZ()))]; - - multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); - } - } - } + virtual void M2L(CellClass* const FRestrict pole, const CellClass* distantNeighbors[189], + const int size, const int inLevel) = 0; /** L2L with a cell and all its child */ void L2L(const CellClass* const FRestrict pole, CellClass* FRestrict *const FRestrict child, const int inLevel) { // iter on each child and process L2L - if( inLevel >= 0){ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(child[idxChild]){ - localToLocal(child[idxChild]->getLocal(), pole->getLocal(), &preL2LTransitions[indexTransition(inLevel,idxChild)]); - } - } - } - else{ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(child[idxChild]){ - localToLocal(child[idxChild]->getLocal(), pole->getLocal(), &preL2LTransitionsPer[indexTransition(-1-inLevel,idxChild)]); - } + const FComplexe* FRestrict const preL2LTransitionsAtLevel = preL2LTransitions[inLevel + periodicLevels]; + for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ + if(child[idxChild]){ + localToLocal(child[idxChild]->getLocal(), pole->getLocal(), &preL2LTransitionsAtLevel[idxChild * harmonic.getExpSize()]); } } } @@ -412,19 +271,9 @@ public: /////////////////////////////////////////////////////////////////////////////// /** Before Downward */ - void M2L(CellClass* const FRestrict local, const CellClass* distantNeighbors[189], + virtual void M2L(CellClass* const FRestrict local, const CellClass* distantNeighbors[189], const FTreeCoordinate neighborsRelativePositions[189], - const int size, const int inLevel) { - // For all neighbors compute M2L - for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ - const FComplexe* const transitionVector = &preM2LTransitions[indexM2LTransition(inLevel, - neighborsRelativePositions[idxNeigh].getX(), - neighborsRelativePositions[idxNeigh].getY(), - neighborsRelativePositions[idxNeigh].getZ())]; - - multipoleToLocal(local->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); - } - } + const int size, const int inLevel) = 0; /** After Downward */ @@ -514,7 +363,7 @@ private: * Phi(x) = sum_{n=0}^{+} sum_{m=-n}^{n} M_n^m O_n^{-m} (x - *p_center) * */ - void particleToMultiPole(FComplexe*const cellMultiPole, const F3DPosition& inPolePosition , + void particleToMultiPole(FComplexe* const cellMultiPole, const F3DPosition& inPolePosition , const ParticleClass& particle){ // Inner of Qi - Z0 => harmonic.result @@ -530,7 +379,6 @@ private: for(int k = 0 ; k <= j ; ++k, ++index_j_k){ harmonic.result(index_j_k).mulRealAndImag( qParticle * minus_one_pow_j ); cellMultiPole[index_j_k] += harmonic.result(index_j_k); - } // (-1)^J => -1 becomes 1 or 1 becomes -1 minus_one_pow_j = -minus_one_pow_j; @@ -641,107 +489,6 @@ private: } - /** M2L - *We compute the conversion of multipole_exp_src in *p_center_of_exp_src to - *a local expansion in *p_center_of_exp_target, and add the result to local_exp_target. - * - *O_n^l (with n=0..P, l=-n..n) being the former multipole expansion terms - *(whose center is *p_center_of_multipole_exp_src) we have for the new local - *expansion terms (whose center is *p_center_of_local_exp_target): - * - *L_j^k = sum{n=0..+} - *sum{l=-n..n} - *O_n^l Outer_{j+n}^{-k-l}(rho, alpha, beta) - * - *where (rho, alpha, beta) are the spherical coordinates of the vector : - *p_center_of_local_exp_src - *p_center_of_multipole_exp_target - * - *Remark: here we have always j+n >= |-k-l| - * - */ - void multipoleToLocal(FComplexe*const FRestrict local_exp, const FComplexe* const FRestrict multipole_exp_src, - const FComplexe* const FRestrict M2L_Outer_transfer){ - int index_j_k = 0; - - // L_j^k - // HPMSTART(51, "M2L computation (loops)"); - // j from 0 to P - for (int j = 0 ; j <= devP ; ++j){ - // (-1)^k - FReal pow_of_minus_1_for_k = 1.0; - //k from 0 to j - for (int k = 0 ; k <= j ; ++k, ++index_j_k){ - // (-1)^n - FReal pow_of_minus_1_for_n = 1.0; - - // work with a local variable - FComplexe L_j_k = local_exp[index_j_k]; - // n from 0 to P - for (int n = 0 ; n <= /*devP or*/ devP-j ; ++n){ - // O_n^l : here points on the source multipole expansion term of degree n and order |l| - const int index_n = harmonic.getPreExpRedirJ(n); - - // Outer_{j+n}^{-k-l} : here points on the M2L transfer function/expansion term of degree j+n and order |-k-l| - const int index_n_j = harmonic.getPreExpRedirJ(n+j); - - FReal pow_of_minus_1_for_l = pow_of_minus_1_for_n; // (-1)^l - - // We start with l=n (and not l=-n) so that we always set p_Outer_term to a correct value in the first loop. - int l = n; - for(/* l = n */ ; l > 0 ; --l){ // we have -k-l<0 and l>0 - const FComplexe M_n_l = multipole_exp_src[index_n + l]; - const FComplexe O_n_j__k_l = M2L_Outer_transfer[index_n_j + k + l]; - - L_j_k.incReal( pow_of_minus_1_for_l * pow_of_minus_1_for_k * - ((M_n_l.getReal() * O_n_j__k_l.getReal()) + - (M_n_l.getImag() * O_n_j__k_l.getImag()))); - L_j_k.incImag( pow_of_minus_1_for_l * pow_of_minus_1_for_k * - ((M_n_l.getImag() * O_n_j__k_l.getReal()) - - (M_n_l.getReal() * O_n_j__k_l.getImag()))); - - pow_of_minus_1_for_l = -pow_of_minus_1_for_l; - } - - for(/* l = 0 */; l >= -n && (-k-l) < 0 ; --l){ // we have -k-l<0 and l<=0 - const FComplexe M_n_l = multipole_exp_src[index_n - l]; - const FComplexe O_n_j__k_l = M2L_Outer_transfer[index_n_j + k + l]; - - L_j_k.incReal( pow_of_minus_1_for_k * - ((M_n_l.getReal() * O_n_j__k_l.getReal()) - - (M_n_l.getImag() * O_n_j__k_l.getImag()))); - L_j_k.decImag( pow_of_minus_1_for_k * - ((M_n_l.getImag() * O_n_j__k_l.getReal()) + - (M_n_l.getReal() * O_n_j__k_l.getImag()))); - - pow_of_minus_1_for_l = -pow_of_minus_1_for_l; - } - - for(/*l = -n-1 or l = -k-1 */; l >= -n ; --l){ // we have -k-l>=0 and l<=0 - const FComplexe M_n_l = multipole_exp_src[index_n - l]; - const FComplexe O_n_j__k_l = M2L_Outer_transfer[index_n_j - (k + l)]; - - L_j_k.incReal( pow_of_minus_1_for_l * - ((M_n_l.getReal() * O_n_j__k_l.getReal()) + - (M_n_l.getImag() * O_n_j__k_l.getImag()))); - L_j_k.incImag( pow_of_minus_1_for_l * - ((M_n_l.getReal() * O_n_j__k_l.getImag()) - - (M_n_l.getImag() * O_n_j__k_l.getReal()))); - - pow_of_minus_1_for_l = -pow_of_minus_1_for_l; - } - - pow_of_minus_1_for_n = -pow_of_minus_1_for_n; - }//n - - // put in the local vector - local_exp[index_j_k] = L_j_k; - - pow_of_minus_1_for_k = -pow_of_minus_1_for_k; - }//k - } - } - - /** L2L *We compute the shift of local_exp_src from *p_center_of_exp_src to *p_center_of_exp_target, and set the result to local_exp_target. @@ -1080,6 +827,6 @@ public: }; -#endif //FELECBASICKERNELS_HPP +#endif //FABSTRACTSPHERICALKERNEL_HPP diff --git a/Src/Kernels/FComputeCell.hpp b/Src/Kernels/FComputeCell.hpp deleted file mode 100644 index f8ce0f1f0..000000000 --- a/Src/Kernels/FComputeCell.hpp +++ /dev/null @@ -1,109 +0,0 @@ -// =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL -// =================================================================================== -#ifndef FCOMPUTECELL_HPP -#define FCOMPUTECELL_HPP - - - -#include "../Utils/FComplexe.hpp" -#include "../Utils/FMemUtils.hpp" - -#include "../Components/FBasicCell.hpp" - -/** -* @author Berenger Bramas (berenger.bramas@inria.fr) -* @class FComputeCell -* Please read the license. -* -*/ -class FComputeCell : public FBasicCell { -protected: - static int DevP; - static int ExpP; - - FComplexe* multipole_exp; //< For multipole extenssion - FComplexe* local_exp; //< For local extenssion - -public: - static void Init(const int inDevP){ - DevP = inDevP; - ExpP = int((DevP+1) * (DevP+2) * 0.5); - } - - static int GetP(){ - return DevP; - } - - static int GetExp(){ - return ExpP; - } - - - /** Default constructor */ - FComputeCell() - : multipole_exp(0), local_exp(0){ - multipole_exp = new FComplexe[ExpP]; - local_exp = new FComplexe[ExpP]; - } - - /** Constructor */ - FComputeCell(const FComputeCell& other) - : multipole_exp(0), local_exp(0){ - multipole_exp = new FComplexe[ExpP]; - local_exp = new FComplexe[ExpP]; - (*this) = other; - } - - /** Default destructor */ - virtual ~FComputeCell(){ - delete[] multipole_exp; - delete[] local_exp; - } - - /** Copy constructor */ - FComputeCell& operator=(const FComputeCell& other) { - FMemUtils::copyall(multipole_exp, other.multipole_exp, ExpP); - FMemUtils::copyall(local_exp, other.local_exp, ExpP); - return *this; - } - - /** Get Multipole */ - const FComplexe* getMultipole() const { - return multipole_exp; - } - /** Get Local */ - const FComplexe* getLocal() const { - return local_exp; - } - - /** Get Multipole */ - FComplexe* getMultipole() { - return multipole_exp; - } - /** Get Local */ - FComplexe* getLocal() { - return local_exp; - } -}; - - -int FComputeCell::DevP(-1); -int FComputeCell::ExpP(-1); - - -#endif //FCOMPUTECELL_HPP - - diff --git a/Src/Kernels/FHarmonic.hpp b/Src/Kernels/FHarmonic.hpp index 1d80a889d..a4ae5f094 100644 --- a/Src/Kernels/FHarmonic.hpp +++ b/Src/Kernels/FHarmonic.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FHARMONIC_HPP #define FHARMONIC_HPP @@ -28,6 +23,7 @@ class FHarmonic : public FNoAssignement { const int devP; //< P const int expSize; //< Exponen Size + const int nExpSize; //< FComplexe* harmonic;//< Harmonic Result FComplexe* cosSin; //< Cos/Sin precomputed values @@ -135,6 +131,7 @@ public: explicit FHarmonic(const int inDevP) : devP(inDevP),expSize(int(((inDevP)+1) * ((inDevP)+2) * 0.5)), + nExpSize((inDevP + 1) * (inDevP + 1)), harmonic(0), cosSin(0), legendre(0), thetaDerivatedResult(0), sphereHarmoInnerCoef(0), sphereHarmoOuterCoef(0), preExpRedirJ(0) { @@ -142,7 +139,7 @@ public: } FHarmonic(const FHarmonic& other) - : devP(other.devP),expSize(int(((other.devP)+1) * ((other.devP)+2) * 0.5)), + : devP(other.devP),expSize(other.expSize), nExpSize(other.expSize), harmonic(0), cosSin(0), legendre(0), thetaDerivatedResult(0), sphereHarmoInnerCoef(0), sphereHarmoOuterCoef(0), preExpRedirJ(0) { @@ -163,6 +160,10 @@ public: return expSize; } + int getNExpSize() const{ + return nExpSize; + } + FComplexe* result(){ return harmonic; } diff --git a/Src/Kernels/FSphericalBlasKernel.hpp b/Src/Kernels/FSphericalBlasKernel.hpp new file mode 100644 index 000000000..8a3c3d4a1 --- /dev/null +++ b/Src/Kernels/FSphericalBlasKernel.hpp @@ -0,0 +1,214 @@ +// =================================================================================== +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. +// =================================================================================== +#ifndef FSPHERICALBLASKERNEL_HPP +#define FSPHERICALBLASKERNEL_HPP + +#include "FAbstractSphericalKernel.hpp" + +#include "../Utils/FMemUtils.hpp" +#include "../Utils/FBlas.hpp" + +/** +* @author Berenger Bramas (berenger.bramas@inria.fr) +* This class is a spherical harmonic kernels using blas +*/ +template< class ParticleClass, class CellClass, class ContainerClass> +class FSphericalBlasKernel : public FAbstractSphericalKernel<ParticleClass,CellClass,ContainerClass> { +protected: + typedef FAbstractSphericalKernel<ParticleClass,CellClass,ContainerClass> Parent; + + const int FF_MATRIX_ROW_DIM; //< The blas matrix number of rows + const int FF_MATRIX_COLUMN_DIM; //< The blas matrix number of columns + const int FF_MATRIX_SIZE; //< The blas matrix size + + FComplexe* temporaryMultiSource; //< To perform the M2L without allocating at each call + FComplexe** preM2LTransitions; //< The pre-computation for the M2L based on the level and the 189 possibilities + + /** To access te precomputed M2L transfer matrixes */ + int indexM2LTransition(const int idxX,const int idxY,const int idxZ) const { + return (((((idxX+3) * 7) + (idxY+3)) * 7 ) + (idxZ+3)) * FF_MATRIX_SIZE; + } + + /** Alloc and init pre-vectors*/ + void allocAndInit(){ + temporaryMultiSource = new FComplexe[FF_MATRIX_COLUMN_DIM]; + + FHarmonic blasHarmonic(Parent::devP * 2); + + // M2L transfer, there is a maximum of 3 neighbors in each direction, + // so 6 in each dimension + FReal treeWidthAtLevel = Parent::boxWidth * FReal( 1 << Parent::periodicLevels); + preM2LTransitions = new FComplexe*[Parent::treeHeight + Parent::periodicLevels]; + memset(preM2LTransitions, 0, sizeof(FComplexe*) * (Parent::treeHeight + Parent::periodicLevels)); + + for(int idxLevel = -Parent::periodicLevels ; idxLevel < Parent::treeHeight ; ++idxLevel ){ + preM2LTransitions[idxLevel + Parent::periodicLevels] = new FComplexe[(7 * 7 * 7) * FF_MATRIX_SIZE]; + + for(int idxX = -3 ; idxX <= 3 ; ++idxX ){ + for(int idxY = -3 ; idxY <= 3 ; ++idxY ){ + for(int idxZ = -3 ; idxZ <= 3 ; ++idxZ ){ + if(FMath::Abs(idxX) > 1 || FMath::Abs(idxY) > 1 || FMath::Abs(idxZ) > 1){ + const F3DPosition relativePos( FReal(idxX) * treeWidthAtLevel , FReal(idxY) * treeWidthAtLevel , FReal(idxZ) * treeWidthAtLevel ); + blasHarmonic.computeOuter(FSpherical(relativePos)); + + FComplexe* FRestrict fillTransfer = &preM2LTransitions[idxLevel + Parent::periodicLevels][indexM2LTransition(idxX,idxY,idxZ)]; + + for(int M = 0 ; M <= Parent::devP ; ++M){ + for (int m = 0 ; m <= M ; ++m){ + for (int N = 0 ; N <= Parent::devP ; ++N){ + for (int n = 0 ; n <= 2*N ; ++n, ++fillTransfer){ + const int k = N-n-m; + if (k < 0){ + const FReal pow_of_minus_1 = FReal((k&1) ? -1 : 1); + fillTransfer->setReal( pow_of_minus_1 * blasHarmonic.result()[blasHarmonic.getPreExpRedirJ(M+N)-k].getReal()); + fillTransfer->setImag((-pow_of_minus_1) * blasHarmonic.result()[blasHarmonic.getPreExpRedirJ(M+N)-k].getImag()); + } + else{ + (*fillTransfer) = blasHarmonic.result()[blasHarmonic.getPreExpRedirJ(M+N)+k]; + } + + } + } + } + } + } + } + } + } + treeWidthAtLevel /= 2; + } + } + + +public: + /** Constructor + * @param inDevP the polynomial degree + * @param inThreeHeight the height of the tree + * @param inBoxWidth the size of the simulation box + * @param inPeriodicLevel the number of level upper to 0 that will be requiried + */ + FSphericalBlasKernel(const int inDevP, const int inTreeHeight, const FReal inBoxWidth, const int inPeriodicLevel = 0) + : Parent(inDevP, inTreeHeight, inBoxWidth, inPeriodicLevel), + FF_MATRIX_ROW_DIM(Parent::harmonic.getExpSize()), FF_MATRIX_COLUMN_DIM(Parent::harmonic.getNExpSize()), + FF_MATRIX_SIZE(FF_MATRIX_ROW_DIM * FF_MATRIX_COLUMN_DIM), + temporaryMultiSource(0), preM2LTransitions(0){ + allocAndInit(); + } + + /** Copy constructor */ + FSphericalBlasKernel(const FSphericalBlasKernel& other) + : Parent(other), + FF_MATRIX_ROW_DIM(other.FF_MATRIX_ROW_DIM), FF_MATRIX_COLUMN_DIM(other.FF_MATRIX_COLUMN_DIM), + FF_MATRIX_SIZE(other.FF_MATRIX_SIZE), + temporaryMultiSource(0), preM2LTransitions(0) { + allocAndInit(); + } + + /** Destructor */ + ~FSphericalBlasKernel(){ + delete[] temporaryMultiSource; + FMemUtils::DeleteAll(preM2LTransitions, Parent::treeHeight + Parent::periodicLevels); + delete[] preM2LTransitions; + } + + /** M2L with a cell and all the existing neighbors */ + void M2L(CellClass* const FRestrict pole, const CellClass* distantNeighbors[189], + const int size, const int inLevel) { + const FTreeCoordinate& coordCenter = pole->getCoordinate(); + // For all neighbors compute M2L + for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ + const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); + const FComplexe* const transitionVector = &preM2LTransitions[inLevel + Parent::periodicLevels] + [indexM2LTransition((coordCenter.getX() - coordNeighbors.getX()), + (coordCenter.getY() - coordNeighbors.getY()), + (coordCenter.getZ() - coordNeighbors.getZ()))]; + + multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); + } + } + + /** Before Downward */ + void M2L(CellClass* const FRestrict local, const CellClass* distantNeighbors[189], + const FTreeCoordinate neighborsRelativePositions[189], + const int size, const int inLevel) { + // For all neighbors compute M2L + for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ + const FComplexe* const transitionVector = &preM2LTransitions[inLevel + Parent::periodicLevels] + [indexM2LTransition(neighborsRelativePositions[idxNeigh].getX(), + neighborsRelativePositions[idxNeigh].getY(), + neighborsRelativePositions[idxNeigh].getZ())]; + + multipoleToLocal(local->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); + } + } + + + /** preExpNExp + * @param exp an exponent vector to create an computable vector + */ + void preExpNExp(FComplexe* const exp) const { + for(int j = Parent::devP; j>= 0 ; --j){ + // Position in 'exp': (j*(j+1)*0.5) + k + // Position in 'nexp': j*(j+1) + k + const int j_j1 = j*(j+1); + const int j_j1_div_2 = int(j_j1 * 0.5); + + // Positive (or null) orders: + for(int k = j ; k >= 0; --k){ + exp[j_j1 + k] = exp[j_j1_div_2 + k]; + } + + // Negative orders: + FReal minus_1_pow_k = FReal( j&1 ? -1 : 1); + for(int k = -j ; k < 0 ; ++k ){ + exp[j_j1 + k].setReal(minus_1_pow_k * exp[j_j1 + (-k)].getReal()); + exp[j_j1 + k].setImag((-minus_1_pow_k) * exp[j_j1 + (-k)].getImag()); + minus_1_pow_k = -minus_1_pow_k; + } + } + } + + /** M2L + *We compute the conversion of multipole_exp_src in *p_center_of_exp_src to + *a local expansion in *p_center_of_exp_target, and add the result to local_exp_target. + * + *O_n^l (with n=0..P, l=-n..n) being the former multipole expansion terms + *(whose center is *p_center_of_multipole_exp_src) we have for the new local + *expansion terms (whose center is *p_center_of_local_exp_target): + * + *L_j^k = sum{n=0..+} + *sum{l=-n..n} + *O_n^l Outer_{j+n}^{-k-l}(rho, alpha, beta) + * + *where (rho, alpha, beta) are the spherical coordinates of the vector : + *p_center_of_local_exp_src - *p_center_of_multipole_exp_target + * + *Remark: here we have always j+n >= |-k-l| + * + */ + void multipoleToLocal(FComplexe*const FRestrict local_exp, const FComplexe* const FRestrict multipole_exp_src, + const FComplexe* const FRestrict M2L_Outer_transfer){ + // Copy original vector and compute exp2nexp + FMemUtils::copyall<FComplexe>(temporaryMultiSource, multipole_exp_src, CellClass::GetPoleSize()); + // Get a computable vector + preExpNExp(temporaryMultiSource); + + FReal alpha_and_beta[2] = {1.0, 0.0}; + + cblas_gemv<FReal>(CblasColMajor, CblasTrans, + FF_MATRIX_COLUMN_DIM, FF_MATRIX_ROW_DIM, + alpha_and_beta, M2L_Outer_transfer, + FF_MATRIX_COLUMN_DIM, temporaryMultiSource, 1, + alpha_and_beta, local_exp, 1); + } +}; + +#endif // FSPHERICALBLASKERNEL_HPP diff --git a/Src/Kernels/FSphericalCell.hpp b/Src/Kernels/FSphericalCell.hpp index 4d27d82eb..f175b67af 100644 --- a/Src/Kernels/FSphericalCell.hpp +++ b/Src/Kernels/FSphericalCell.hpp @@ -1,68 +1,71 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FSPHERICALCELL_HPP #define FSPHERICALCELL_HPP +#include "../Utils/FAbstractSendable.hpp" #include "../Utils/FComplexe.hpp" #include "../Utils/FMemUtils.hpp" - +#include "../Extensions/FExtendCellType.hpp" #include "../Components/FBasicCell.hpp" /** * @author Berenger Bramas (berenger.bramas@inria.fr) -* @class FSphericalCell -* Please read the license. -* */ class FSphericalCell : public FBasicCell { protected: static int DevP; - static int ExpP; + static int LocalSize; + static int PoleSize; + static bool UseBlas; FComplexe* multipole_exp; //< For multipole extenssion FComplexe* local_exp; //< For local extenssion public: - static void Init(const int inDevP){ - DevP = inDevP; - ExpP = int((DevP+1) * (DevP+2) * 0.5); + static void Init(const int inDevP, const bool inUseBlas = false){ + DevP = inDevP; + const int ExpP = int((inDevP+1) * (inDevP+2) * 0.5); + const int NExpP = (inDevP+1) * (inDevP+1); + + LocalSize = ExpP; + if(inUseBlas) { + PoleSize = NExpP; + } + else{ + PoleSize = ExpP; + } } - static int GetP(){ - return DevP; + static int GetLocalSize(){ + return LocalSize; } - static int GetExp(){ - return ExpP; + static int GetPoleSize(){ + return PoleSize; } - /** Default constructor */ FSphericalCell() : multipole_exp(0), local_exp(0){ - multipole_exp = new FComplexe[ExpP]; - local_exp = new FComplexe[ExpP]; + multipole_exp = new FComplexe[PoleSize]; + local_exp = new FComplexe[LocalSize]; } /** Constructor */ FSphericalCell(const FSphericalCell& other) : multipole_exp(0), local_exp(0){ - multipole_exp = new FComplexe[ExpP]; - local_exp = new FComplexe[ExpP]; + multipole_exp = new FComplexe[PoleSize]; + local_exp = new FComplexe[LocalSize]; (*this) = other; } @@ -74,8 +77,8 @@ public: /** Copy constructor */ FSphericalCell& operator=(const FSphericalCell& other) { - FMemUtils::copyall(multipole_exp, other.multipole_exp, ExpP); - FMemUtils::copyall(local_exp, other.local_exp, ExpP); + FMemUtils::copyall(multipole_exp, other.multipole_exp, PoleSize); + FMemUtils::copyall(local_exp, other.local_exp, LocalSize); return *this; } @@ -98,10 +101,57 @@ public: } }; - int FSphericalCell::DevP(-1); -int FSphericalCell::ExpP(-1); +int FSphericalCell::LocalSize(-1); +int FSphericalCell::PoleSize(-1); + + +/** +* @author Berenger Bramas (berenger.bramas@inria.fr) +*/ +class FTypedSphericalCell : public FSphericalCell, public FExtendCellType { +public: +}; + + +/** +* @author Berenger Bramas (berenger.bramas@inria.fr) +*/ +class FSendableSphericalCell : public FSphericalCell , public FAbstractSendable { +public: + static int SerializedSizeDown; + static int SerializedSizeUp; + + static void Init(const int inDevP){ + FSphericalCell::Init(inDevP); + SerializedSizeDown = PoleSize * sizeof(FComplexe) + sizeof(FBasicCell); + SerializedSizeUp = LocalSize * sizeof(FComplexe) + sizeof(FBasicCell); + } + + /////////////////////////////////////////////////////// + // to extend FAbstractSendable + /////////////////////////////////////////////////////// + void serializeUp(void* const buffer) const { + memcpy(buffer, (FBasicCell*)this, sizeof(FBasicCell)); + memcpy((char*)(buffer) + sizeof(FBasicCell), multipole_exp, sizeof(FComplexe)*PoleSize ); + } + void deserializeUp(const void* const buffer){ + memcpy((FBasicCell*)this, buffer, sizeof(FBasicCell)); + memcpy(multipole_exp, (char*)(buffer) + sizeof(FBasicCell), sizeof(FComplexe)*PoleSize ); + } + + void serializeDown(void* const buffer) const { + memcpy(buffer, (FBasicCell*)this, sizeof(FBasicCell)); + memcpy((char*)(buffer) + sizeof(FBasicCell), local_exp, sizeof(FComplexe)*LocalSize ); + } + void deserializeDown(const void* const buffer){ + memcpy((FBasicCell*)this, buffer, sizeof(FBasicCell)); + memcpy(local_exp, (char*)(buffer) + sizeof(FBasicCell), sizeof(FComplexe)*LocalSize ); + } +}; +int FSendableSphericalCell::SerializedSizeDown(-1); +int FSendableSphericalCell::SerializedSizeUp(-1); #endif //FSPHERICALCELL_HPP diff --git a/Src/Kernels/FSphericalKernel.hpp b/Src/Kernels/FSphericalKernel.hpp index cb7c37a68..7403f4c15 100644 --- a/Src/Kernels/FSphericalKernel.hpp +++ b/Src/Kernels/FSphericalKernel.hpp @@ -1,246 +1,89 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FSPHERICALKERNEL_HPP #define FSPHERICALKERNEL_HPP -#include "../Components/FAbstractKernels.hpp" - -#include "../Utils/FGlobal.hpp" -#include "../Utils/FTrace.hpp" +#include "FAbstractSphericalKernel.hpp" #include "../Utils/FMemUtils.hpp" -#include "../Containers/FTreeCoordinate.hpp" - -#include "FHarmonic.hpp" - /** * @author Berenger Bramas (berenger.bramas@inria.fr) -* @brief -* Please read the license -* +* This class is the basic spherical harmonic kernel */ template< class ParticleClass, class CellClass, class ContainerClass> -class FSphericalKernel : public FAbstractKernels<ParticleClass,CellClass,ContainerClass> { - const int devP; //< The P - const int devM2lP; //< A secondary P - const FReal boxWidth; //< the box width at leaf level - const int treeHeight; //< The height of the tree - - const int periodicLevels; //< The number of levels above 1 used for periodicity - - FHarmonic harmonic; //< The harmonic computation class +class FSphericalKernel : public FAbstractSphericalKernel<ParticleClass,CellClass,ContainerClass> { +protected: + typedef FAbstractSphericalKernel<ParticleClass,CellClass,ContainerClass> Parent; - // For normal computation - FComplexe* preL2LTransitions; //< The pre-computation for the L2L based on the level - FComplexe* preM2MTransitions; //< The pre-computation for the M2M based on the level + const int devM2lP; //< A secondary P - FComplexe* preM2LTransitions; //< The pre-computation for the M2L based on the level and the 189 possibilities - - // For harmonic computation - FComplexe* preL2LTransitionsPer; //< The pre-computation for the L2L based on the level - FComplexe* preM2MTransitionsPer; //< The pre-computation for the M2M based on the level - - FComplexe* preM2LTransitionsPer; //< The pre-computation for the M2L based on the level and the 189 possibilities - - /** To access te preL2L/preM2M right vector */ - int indexTransition(const int level, const int child){ - return level * 8 * harmonic.getExpSize() + child * harmonic.getExpSize(); - } + FComplexe** preM2LTransitions; //< The pre-computation for the M2L based on the level and the 189 possibilities - /** To access te preM2L right vector */ - int indexM2LTransition(const int idxLevel,const int idxX,const int idxY,const int idxZ){ - return (idxLevel * 7 * 7 * 7 * devM2lP) + (((((idxX+3) * 7) + (idxY+3)) * 7 ) + (idxZ+3)) * devM2lP; + /** To access te pre computed M2L transfer vector */ + int indexM2LTransition(const int idxX,const int idxY,const int idxZ) const { + return (((((idxX+3) * 7) + (idxY+3)) * 7 ) + (idxZ+3)) * devM2lP; } /** Alloc and init pre-vectors*/ void allocAndInit(){ - preL2LTransitions = new FComplexe[treeHeight * 8 * harmonic.getExpSize()]; - preM2MTransitions = new FComplexe[treeHeight * 8 * harmonic.getExpSize()]; - - FReal treeWidthAtLevel = boxWidth/2; - for(int idxLevel = 0 ; idxLevel < treeHeight - 1 ; ++idxLevel ){ - const F3DPosition father(treeWidthAtLevel,treeWidthAtLevel,treeWidthAtLevel); - treeWidthAtLevel /= 2; - - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild ){ - FTreeCoordinate childBox; - childBox.setPositionFromMorton(idxChild,1); - - const F3DPosition M2MVector ( - father.getX() - (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))), - father.getY() - (treeWidthAtLevel * FReal(1 + (childBox.getY() * 2))), - father.getZ() - (treeWidthAtLevel * FReal(1 + (childBox.getZ() * 2))) - ); - - harmonic.computeInner(FSpherical(M2MVector)); - FMemUtils::copyall<FComplexe>(&preM2MTransitions[indexTransition(idxLevel,idxChild)], harmonic.result(), harmonic.getExpSize()); - - const F3DPosition L2LVector ( - (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))) - father.getX(), - (treeWidthAtLevel * FReal(1 + (childBox.getY() * 2))) - father.getY(), - (treeWidthAtLevel * FReal(1 + (childBox.getZ() * 2))) - father.getZ() - ); - - harmonic.computeInner(FSpherical(L2LVector)); - FMemUtils::copyall<FComplexe>(&preL2LTransitions[indexTransition(idxLevel,idxChild)], harmonic.result(), harmonic.getExpSize()); - } - } - // M2L transfer, there is a maximum of 3 neighbors in each direction, // so 6 in each dimension - treeWidthAtLevel = boxWidth; - preM2LTransitions = new FComplexe[treeHeight * (7 * 7 * 7) * devM2lP]; - for(int idxLevel = 0 ; idxLevel < treeHeight ; ++idxLevel ){ + preM2LTransitions = new FComplexe*[Parent::treeHeight + Parent::periodicLevels]; + memset(preM2LTransitions, 0, sizeof(FComplexe*) * (Parent::treeHeight + Parent::periodicLevels)); + // We start from the higher level + FReal treeWidthAtLevel = Parent::boxWidth * FReal(1 << Parent::periodicLevels); + for(int idxLevel = -Parent::periodicLevels ; idxLevel < Parent::treeHeight ; ++idxLevel ){ + // Allocate data for this level + preM2LTransitions[idxLevel + Parent::periodicLevels] = new FComplexe[(7 * 7 * 7) * devM2lP]; + // Precompute transfer vector for(int idxX = -3 ; idxX <= 3 ; ++idxX ){ for(int idxY = -3 ; idxY <= 3 ; ++idxY ){ for(int idxZ = -3 ; idxZ <= 3 ; ++idxZ ){ if(FMath::Abs(idxX) > 1 || FMath::Abs(idxY) > 1 || FMath::Abs(idxZ) > 1){ const F3DPosition relativePos( FReal(idxX) * treeWidthAtLevel , FReal(idxY) * treeWidthAtLevel , FReal(idxZ) * treeWidthAtLevel ); - harmonic.computeOuter(FSpherical(relativePos)); - FMemUtils::copyall<FComplexe>(&preM2LTransitions[indexM2LTransition(idxLevel,idxX,idxY,idxZ)], harmonic.result(), harmonic.getExpSize()); + Parent::harmonic.computeOuter(FSpherical(relativePos)); + FMemUtils::copyall<FComplexe>(&preM2LTransitions[idxLevel + Parent::periodicLevels][indexM2LTransition(idxX,idxY,idxZ)], Parent::harmonic.result(), Parent::harmonic.getExpSize()); } } } } + // We divide the bow per 2 when we go down treeWidthAtLevel /= 2; } } - void allocAndInitPer(){ - if( periodicLevels ){ - preL2LTransitionsPer = new FComplexe[periodicLevels * 8 * harmonic.getExpSize()]; - preM2MTransitionsPer = new FComplexe[periodicLevels * 8 * harmonic.getExpSize()]; - - FReal treeWidthAtLevel = boxWidth; - for(int idxLevel = 1 ; idxLevel <= periodicLevels ; ++idxLevel ){ - const F3DPosition father(treeWidthAtLevel,treeWidthAtLevel,treeWidthAtLevel); - treeWidthAtLevel *= 2; - - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild ){ - FTreeCoordinate childBox; - childBox.setPositionFromMorton(idxChild,1); - - const F3DPosition M2MVector ( - father.getX() - (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))), - father.getY() - (treeWidthAtLevel * FReal(1 + (childBox.getY() * 2))), - father.getZ() - (treeWidthAtLevel * FReal(1 + (childBox.getZ() * 2))) - ); - - harmonic.computeInner(FSpherical(M2MVector)); - FMemUtils::copyall<FComplexe>(&preM2MTransitionsPer[indexTransition(idxLevel-1,idxChild)], harmonic.result(), harmonic.getExpSize()); - - const F3DPosition L2LVector ( - (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))) - father.getX(), - (treeWidthAtLevel * FReal(1 + (childBox.getY() * 2))) - father.getY(), - (treeWidthAtLevel * FReal(1 + (childBox.getZ() * 2))) - father.getZ() - ); - - harmonic.computeInner(FSpherical(L2LVector)); - FMemUtils::copyall<FComplexe>(&preL2LTransitionsPer[indexTransition(idxLevel-1,idxChild)], harmonic.result(), harmonic.getExpSize()); - } - } - - // M2L transfer, there is a maximum of 3 neighbors in each direction, - // so 6 in each dimension - treeWidthAtLevel = boxWidth*2; - preM2LTransitionsPer = new FComplexe[periodicLevels * (7 * 7 * 7) * devM2lP]; - for(int idxLevel = 1 ; idxLevel <= periodicLevels ; ++idxLevel ){ - for(int idxX = -3 ; idxX <= 3 ; ++idxX ){ - for(int idxY = -3 ; idxY <= 3 ; ++idxY ){ - for(int idxZ = -3 ; idxZ <= 3 ; ++idxZ ){ - if(FMath::Abs(idxX) > 1 || FMath::Abs(idxY) > 1 || FMath::Abs(idxZ) > 1){ - const F3DPosition relativePos( FReal(idxX) * treeWidthAtLevel , FReal(idxY) * treeWidthAtLevel , FReal(idxZ) * treeWidthAtLevel ); - harmonic.computeOuter(FSpherical(relativePos)); - FMemUtils::copyall<FComplexe>(&preM2LTransitionsPer[indexM2LTransition(idxLevel-1,idxX,idxY,idxZ)], harmonic.result(), harmonic.getExpSize()); - } - } - } - } - treeWidthAtLevel *= 2; - } - } - } - public: - /** Kernel constructor */ + /** Constructor + * @param inDevP the polynomial degree + * @param inThreeHeight the height of the tree + * @param inBoxWidth the size of the simulation box + * @param inPeriodicLevel the number of level upper to 0 that will be requiried + */ FSphericalKernel(const int inDevP, const int inTreeHeight, const FReal inBoxWidth, const int inPeriodicLevel = 0) - : devP(inDevP), devM2lP(int(((inDevP*2)+1) * ((inDevP*2)+2) * 0.5)), boxWidth(inBoxWidth), - treeHeight(inTreeHeight), periodicLevels(inPeriodicLevel), harmonic(inDevP), - preL2LTransitions(0), preM2MTransitions(0), preM2LTransitions(0), - preL2LTransitionsPer(0), preM2MTransitionsPer(0), preM2LTransitionsPer(0) { - + : Parent(inDevP, inTreeHeight, inBoxWidth, inPeriodicLevel), + devM2lP(int(((inDevP*2)+1) * ((inDevP*2)+2) * 0.5)), preM2LTransitions(0) { allocAndInit(); - allocAndInitPer(); } /** Copy constructor */ FSphericalKernel(const FSphericalKernel& other) - : devP(other.devP), devM2lP(other.devM2lP), boxWidth(other.boxWidth), - treeHeight(other.treeHeight), periodicLevels(other.periodicLevels), harmonic(other.devP), - preL2LTransitions(0), preM2MTransitions(0), preM2LTransitions(0), - preL2LTransitionsPer(0), preM2MTransitionsPer(0), preM2LTransitionsPer(0) { - + : Parent(other), devM2lP(other.devM2lP), preM2LTransitions(0) { allocAndInit(); - allocAndInitPer(); } - /** Default destructor */ + /** Destructor */ ~FSphericalKernel(){ - delete[] preL2LTransitions; - delete[] preM2MTransitions; + FMemUtils::DeleteAll(preM2LTransitions, Parent::treeHeight + Parent::periodicLevels); delete[] preM2LTransitions; - - delete[] preL2LTransitionsPer; - delete[] preM2MTransitionsPer; - delete[] preM2LTransitionsPer; - } - - /** P2M with a cell and all its particles */ - void P2M(CellClass* const inPole, const ContainerClass* const inParticles) { - FComplexe* const cellMultiPole = inPole->getMultipole(); - // Copying the position is faster than using cell position - const F3DPosition polePosition = inPole->getPosition(); - // For all particles in the leaf box - typename ContainerClass::ConstBasicIterator iterParticle(*inParticles); - while( iterParticle.hasNotFinished()){ - // P2M - particleToMultiPole(cellMultiPole, polePosition, iterParticle.data()); - iterParticle.gotoNext(); - } - } - - /** M2M with a cell and all its child */ - void M2M(CellClass* const FRestrict inPole, const CellClass *const FRestrict *const FRestrict inChild, const int inLevel) { - FComplexe* const multipole_exp_target = inPole->getMultipole(); - // iter on each child and process M2M - if( inLevel >= 0){ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(inChild[idxChild]){ - multipoleToMultipole(multipole_exp_target, inChild[idxChild]->getMultipole(), &preM2MTransitions[indexTransition(inLevel,idxChild)]); - } - } - } - else{ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(inChild[idxChild]){ - multipoleToMultipole(multipole_exp_target, inChild[idxChild]->getMultipole(), &preM2MTransitionsPer[indexTransition(-1-inLevel,idxChild)]); - } - } - } } /** M2L with a cell and all the existing neighbors */ @@ -248,399 +91,33 @@ public: const int size, const int inLevel) { const FTreeCoordinate& coordCenter = pole->getCoordinate(); // For all neighbors compute M2L - if( inLevel >= 0){ - for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ - const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); - const FComplexe* const transitionVector = &preM2LTransitions[indexM2LTransition(inLevel, - (coordCenter.getX() - coordNeighbors.getX()), - (coordCenter.getY() - coordNeighbors.getY()), - (coordCenter.getZ() - coordNeighbors.getZ()))]; - - multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); - } - } - else { - for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ - const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); - const FComplexe* const transitionVector = &preM2LTransitionsPer[indexM2LTransition(-1-inLevel, - (coordCenter.getX() - coordNeighbors.getX()), - (coordCenter.getY() - coordNeighbors.getY()), - (coordCenter.getZ() - coordNeighbors.getZ()))]; - - multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); - } - } - } - - /** L2L with a cell and all its child */ - void L2L(const CellClass* const FRestrict pole, CellClass* FRestrict *const FRestrict child, const int inLevel) { - // iter on each child and process L2L - if( inLevel >= 0){ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(child[idxChild]){ - localToLocal(child[idxChild]->getLocal(), pole->getLocal(), &preL2LTransitions[indexTransition(inLevel,idxChild)]); - } - } - } - else{ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(child[idxChild]){ - localToLocal(child[idxChild]->getLocal(), pole->getLocal(), &preL2LTransitionsPer[indexTransition(-1-inLevel,idxChild)]); - } - } - } - } - - /** L2P with a cell and all its particles */ - void L2P(const CellClass* const local, ContainerClass* const particles){ - const FComplexe* const cellLocal = local->getLocal(); - // Copying the position is faster than using cell position - const F3DPosition localPosition = local->getPosition(); - // For all particles in the leaf box - typename ContainerClass::BasicIterator iterTarget(*particles); - while( iterTarget.hasNotFinished() ){ - // L2P - localToParticle(&iterTarget.data(), localPosition, cellLocal); - iterTarget.gotoNext(); - } - } - - /** This P2P has to be used when target != sources - * It will proceed an direct interation no mutual - * - * It takes all the target particles from the current leaf, - * then it computes the sources/targets interaction in this leaf, - * then it computes the sources/targets inteactions between this leaf and the - * neighbors. - */ - void P2P(ContainerClass* const FRestrict targets, const ContainerClass* const FRestrict sources, - const ContainerClass* const directNeighbors[26], const int size) { - - { // Compute interaction in this leaf - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - // We copy the target particle to work with a particle in the heap - ParticleClass target( iterTarget.data() ); - - // For all the source particles in the same leaf - typename ContainerClass::ConstBasicIterator iterSameBox(*sources); - while( iterSameBox.hasNotFinished() ){ - //(&iterSameBox.data() != &iterTarget.data()) - directInteraction(&target, iterSameBox.data()); - iterSameBox.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - { // Compute interactions with other leaves - // For all the neigbors leaves - for(int idxDirectNeighbors = 0 ; idxDirectNeighbors < size ; ++idxDirectNeighbors){ - // For all particles in current leaf - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - ParticleClass target( iterTarget.data() ); - // For all the particles in the other leaf - typename ContainerClass::ConstBasicIterator iterSource(*directNeighbors[idxDirectNeighbors]); - while( iterSource.hasNotFinished() ){ - directInteraction(&target, iterSource.data()); - iterSource.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - } - } - - /** This P2P has to be used when target == sources - * It will proceed a direct interation >> mutual - * - * It takes all the particles from the current leaf, - * then it computes the interactions in this leaf, - * then it computes the inteactions between this leaf and the - * neighbors. - */ - void P2P(const MortonIndex inCurrentIndex, - ContainerClass* const FRestrict targets, const ContainerClass* const FRestrict /*sources*/, - ContainerClass* const directNeighbors[26], const MortonIndex inNeighborsIndex[26], const int size){ - { // Compute interaction in this leaf - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - // We copy the target particle to work with a particle in the heap - ParticleClass target( iterTarget.data() ); + for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ + const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); + const FComplexe* const transitionVector = &preM2LTransitions[inLevel + Parent::periodicLevels] + [indexM2LTransition((coordCenter.getX() - coordNeighbors.getX()), + (coordCenter.getY() - coordNeighbors.getY()), + (coordCenter.getZ() - coordNeighbors.getZ()))]; - // For all particles after the current one - typename ContainerClass::BasicIterator iterSameBox = iterTarget; - iterSameBox.gotoNext(); - while( iterSameBox.hasNotFinished() ){ - directInteractionMutual(&target, &iterSameBox.data()); - iterSameBox.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - { // Compute interactions with other leaves - // For all the neigbors leaves - for(int idxDirectNeighbors = 0 ; idxDirectNeighbors < size ; ++idxDirectNeighbors){ - if(inCurrentIndex < inNeighborsIndex[idxDirectNeighbors] ){ - // For all particles in current leaf - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - ParticleClass target( iterTarget.data() ); - // For all the particles in the other leaf - typename ContainerClass::BasicIterator iterSource(*directNeighbors[idxDirectNeighbors]); - while( iterSource.hasNotFinished() ){ - directInteractionMutual(&target, &iterSource.data()); - iterSource.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - } + multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); } } - /////////////////////////////////////////////////////////////////////////////// - // Periodic - /////////////////////////////////////////////////////////////////////////////// - /** Before Downward */ void M2L(CellClass* const FRestrict local, const CellClass* distantNeighbors[189], const FTreeCoordinate neighborsRelativePositions[189], const int size, const int inLevel) { // For all neighbors compute M2L for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ - const FComplexe* const transitionVector = &preM2LTransitions[indexM2LTransition(inLevel, - neighborsRelativePositions[idxNeigh].getX(), - neighborsRelativePositions[idxNeigh].getY(), - neighborsRelativePositions[idxNeigh].getZ())]; + const FComplexe* const transitionVector = &preM2LTransitions[inLevel + Parent::periodicLevels] + [indexM2LTransition(neighborsRelativePositions[idxNeigh].getX(), + neighborsRelativePositions[idxNeigh].getY(), + neighborsRelativePositions[idxNeigh].getZ())]; multipoleToLocal(local->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); } } - /** After Downward */ - void P2P(const MortonIndex inCurrentIndex, - ContainerClass* const FRestrict targets, const ContainerClass* const FRestrict /*sources*/, - ContainerClass* const directNeighbors[26], const FTreeCoordinate neighborsRelativeOffset[26], const int size) { - - { // Compute interaction in this leaf - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - // We copy the target particle to work with a particle in the heap - ParticleClass target( iterTarget.data() ); - - // For all particles after the current one - typename ContainerClass::BasicIterator iterSameBox = iterTarget; - iterSameBox.gotoNext(); - while( iterSameBox.hasNotFinished() ){ - directInteractionMutual(&target, &iterSameBox.data()); - iterSameBox.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - { // Compute interactions with other leaves - // For all the neigbors leaves - for(int idxDirectNeighbors = 0 ; idxDirectNeighbors < size ; ++idxDirectNeighbors){ - // This box is not a real neighbor - if(neighborsRelativeOffset[idxDirectNeighbors].getX() || neighborsRelativeOffset[idxDirectNeighbors].getY() - || neighborsRelativeOffset[idxDirectNeighbors].getZ() ){ - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - ParticleClass target( iterTarget.data() ); - // For all the particles in the other leaf - typename ContainerClass::BasicIterator iterSource(*directNeighbors[idxDirectNeighbors]); - while( iterSource.hasNotFinished() ){ - directInteractionOffset(&target, iterSource.data(), neighborsRelativeOffset[idxDirectNeighbors]); - iterSource.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - // This is a real neighbor, we do as usual - else if(inCurrentIndex < neighborsRelativeOffset[idxDirectNeighbors].getMortonIndex(treeHeight) ){ - // For all particles in current leaf - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - ParticleClass target( iterTarget.data() ); - // For all the particles in the other leaf - typename ContainerClass::BasicIterator iterSource(*directNeighbors[idxDirectNeighbors]); - while( iterSource.hasNotFinished() ){ - directInteractionMutual(&target, &iterSource.data()); - iterSource.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - } - } - } - - /////////////////////////////////////////////////////////////////////////////// - // Computation - /////////////////////////////////////////////////////////////////////////////// -private: - - /** P2M computation - * expansion_P2M_add - * Multipole expansion with m charges q_i in Q_i=(rho_i, alpha_i, beta_i) - *whose relative coordinates according to *p_center are: - *Q_i - *p_center = (rho'_i, alpha'_i, beta'_i); - * - *For j=0..P, k=-j..j, we have: - * - *M_j^k = (-1)^j { sum{i=1..m} q_i Inner_j^k(rho'_i, alpha'_i, beta'_i) } - * - *However the extern loop is over the bodies (i=1..m) in our code and as an - *intern loop we have: j=0..P, k=-j..j - * - *and the potential is then given by: - * - * Phi(x) = sum_{n=0}^{+} sum_{m=-n}^{n} M_n^m O_n^{-m} (x - *p_center) - * - */ - void particleToMultiPole(FComplexe*const cellMultiPole, const F3DPosition& inPolePosition , - const ParticleClass& particle){ - - // Inner of Qi - Z0 => harmonic.result - harmonic.computeInner( FSpherical(particle.getPosition() - inPolePosition) ); - - FReal minus_one_pow_j = 1.0; // (-1)^j => be in turn 1 and -1 - const FReal qParticle = particle.getPhysicalValue(); // q in the formula - int index_j_k = 0; // p_exp_term & p_Y_term - - // J from 0 to P - for(int j = 0 ; j <= devP ; ++j){ - // k from 0 to J - for(int k = 0 ; k <= j ; ++k, ++index_j_k){ - harmonic.result(index_j_k).mulRealAndImag( qParticle * minus_one_pow_j ); - cellMultiPole[index_j_k] += harmonic.result(index_j_k); - - } - // (-1)^J => -1 becomes 1 or 1 becomes -1 - minus_one_pow_j = -minus_one_pow_j; - } - } - - /* M2M - *We compute the translation of multipole_exp_src from *p_center_of_exp_src to - *p_center_of_exp_target, and add the result to multipole_exp_target. - * - * O_n^l (with n=0..P, l=-n..n) being the former multipole expansion terms - * (whose center is *p_center_of_multipole_exp_src) we have for the new multipole - * expansion terms (whose center is *p_center_of_multipole_exp_target): - - * M_j^k = sum{n=0..j} - * sum{l=-n..n, |k-l|<=j-n} - * O_n^l Inner_{j-n}^{k-l}(rho, alpha, beta) - * - * where (rho, alpha, beta) are the spherical coordinates of the vector : - * p_center_of_multipole_exp_target - *p_center_of_multipole_exp_src - * - * Warning: if j-n < |k-l| we do nothing. - */ - void multipoleToMultipole(FComplexe* const FRestrict multipole_exp_target, - const FComplexe* const FRestrict multipole_exp_src, - const FComplexe* const FRestrict M2M_Inner_transfer){ - - // n from 0 to P - for(int n = 0 ; n <= devP ; ++n ){ - // l<0 // (-1)^l - FReal pow_of_minus_1_for_l = ( n & 1 ? FReal(-1.0) : FReal(1.0) ); - - // O_n^l : here points on the source multipole expansion term of degree n and order |l| - const int index_n = harmonic.getPreExpRedirJ(n); - - // l from -n to <0 - for(int l = -n ; l < 0 ; ++l){ - const FComplexe M_n__n_l = multipole_exp_src[index_n -l]; - - // j from n to P - for(int j = n ; j <= devP ; ++j ){ - // M_j^k - const int index_j = harmonic.getPreExpRedirJ(j); - // Inner_{j-n}^{k-l} : here points on the M2M transfer function/expansion term of degree n-j and order |k-l| - const int index_j_n = harmonic.getPreExpRedirJ(j-n); /* k==0 */ - - // since n-j+l<0 - for(int k = 0 ; k <= (j-n+l) ; ++k ){ // l<0 && k>=0 => k-l>0 - const FComplexe I_j_n__k_l = M2M_Inner_transfer[index_j_n + k - l]; - - multipole_exp_target[index_j + k].incReal( pow_of_minus_1_for_l * - ((M_n__n_l.getReal() * I_j_n__k_l.getReal()) + - (M_n__n_l.getImag() * I_j_n__k_l.getImag()))); - multipole_exp_target[index_j + k].incImag( pow_of_minus_1_for_l * - ((M_n__n_l.getReal() * I_j_n__k_l.getImag()) - - (M_n__n_l.getImag() * I_j_n__k_l.getReal()))); - - } // for k - } // for j - - pow_of_minus_1_for_l = -pow_of_minus_1_for_l; - } // for l - - // l from 0 to n - for(int l = 0 ; l <= n ; ++l){ - const FComplexe M_n__n_l = multipole_exp_src[index_n + l]; - - // j from n to P - for( int j = n ; j <= devP ; ++j ){ - const int first_k = FMath::Max(0,n-j+l); - // (-1)^k - FReal pow_of_minus_1_for_k = static_cast<FReal>( first_k&1 ? -1.0 : 1.0 ); - // M_j^k - const int index_j = harmonic.getPreExpRedirJ(j); - // Inner_{j-n}^{k-l} : here points on the M2M transfer function/expansion term of degree n-j and order |k-l| - const int index_j_n = harmonic.getPreExpRedirJ(j-n); - - int k = first_k; - for(; k <= (j-n+l) && k < l ; ++k){ /* l>=0 && k-l<0 */ - const FComplexe I_j_n__l_k = M2M_Inner_transfer[index_j_n + l - k]; - - multipole_exp_target[index_j + k].incReal( pow_of_minus_1_for_k * pow_of_minus_1_for_l * - ((M_n__n_l.getReal() * I_j_n__l_k.getReal()) + - (M_n__n_l.getImag() * I_j_n__l_k.getImag()))); - multipole_exp_target[index_j + k].incImag(pow_of_minus_1_for_k * pow_of_minus_1_for_l * - ((M_n__n_l.getImag() * I_j_n__l_k.getReal()) - - (M_n__n_l.getReal() * I_j_n__l_k.getImag()))); - - pow_of_minus_1_for_k = -pow_of_minus_1_for_k; - } // for k - - for(/* k = l */; k <= (j - n + l) ; ++k){ // l>=0 && k-l>=0 - const FComplexe I_j_n__k_l = M2M_Inner_transfer[index_j_n + k - l]; - - multipole_exp_target[index_j + k].incReal( - (M_n__n_l.getReal() * I_j_n__k_l.getReal()) - - (M_n__n_l.getImag() * I_j_n__k_l.getImag())); - multipole_exp_target[index_j + k].incImag( - (M_n__n_l.getImag() * I_j_n__k_l.getReal()) + - (M_n__n_l.getReal() * I_j_n__k_l.getImag())); - - } // for k - } // for j - - pow_of_minus_1_for_l = -pow_of_minus_1_for_l; - } // for l - } // for n - } - - /** M2L *We compute the conversion of multipole_exp_src in *p_center_of_exp_src to *a local expansion in *p_center_of_exp_target, and add the result to local_exp_target. @@ -666,7 +143,7 @@ private: // L_j^k // HPMSTART(51, "M2L computation (loops)"); // j from 0 to P - for (int j = 0 ; j <= devP ; ++j){ + for (int j = 0 ; j <= Parent::devP ; ++j){ // (-1)^k FReal pow_of_minus_1_for_k = 1.0; //k from 0 to j @@ -677,12 +154,12 @@ private: // work with a local variable FComplexe L_j_k = local_exp[index_j_k]; // n from 0 to P - for (int n = 0 ; n <= /*devP or*/ devP-j ; ++n){ + for (int n = 0 ; n <= /*devP or*/ Parent::devP-j ; ++n){ // O_n^l : here points on the source multipole expansion term of degree n and order |l| - const int index_n = harmonic.getPreExpRedirJ(n); + const int index_n = Parent::harmonic.getPreExpRedirJ(n); // Outer_{j+n}^{-k-l} : here points on the M2L transfer function/expansion term of degree j+n and order |-k-l| - const int index_n_j = harmonic.getPreExpRedirJ(n+j); + const int index_n_j = Parent::harmonic.getPreExpRedirJ(n+j); FReal pow_of_minus_1_for_l = pow_of_minus_1_for_n; // (-1)^l @@ -740,346 +217,6 @@ private: }//k } } - - - /** L2L - *We compute the shift of local_exp_src from *p_center_of_exp_src to - *p_center_of_exp_target, and set the result to local_exp_target. - * - *O_n^l (with n=0..P, l=-n..n) being the former local expansion terms - *(whose center is *p_center_of_exp_src) we have for the new local - *expansion terms (whose center is *p_center_of_exp_target): - * - *L_j^k = sum{n=j..P} - *sum{l=-n..n} - *O_n^l Inner_{n-j}^{l-k}(rho, alpha, beta) - * - *where (rho, alpha, beta) are the spherical coordinates of the vector : - *p_center_of_exp_target - *p_center_of_exp_src - * - *Warning: if |l-k| > n-j, we do nothing. - */ - void localToLocal(FComplexe* const FRestrict local_exp_target, const FComplexe* const FRestrict local_exp_src, - const FComplexe* const FRestrict L2L_tranfer){ - // L_j^k - int index_j_k = 0; - - for (int j = 0 ; j <= devP ; ++j ){ - // (-1)^k - FReal pow_of_minus_1_for_k = 1.0; - - for (int k = 0 ; k <= j ; ++k, ++index_j_k ){ - FComplexe L_j_k = local_exp_target[index_j_k]; - - for (int n=j; n <= devP;++n){ - // O_n^l : here points on the source multipole expansion term of degree n and order |l| - const int index_n = harmonic.getPreExpRedirJ(n); - - int l = n - j + k; - // Inner_{n-j}^{l-k} : here points on the L2L transfer function/expansion term of degree n-j and order |l-k| - const int index_n_j = harmonic.getPreExpRedirJ(n-j); - - for(/*l = n - j + k*/ ; l-k > 0 ; --l){ /* l>0 && l-k>0 */ - const FComplexe L_j_l = local_exp_src[index_n + l]; - const FComplexe I_l_j__l_k = L2L_tranfer[index_n_j + l - k]; - - L_j_k.incReal( (L_j_l.getReal() * I_l_j__l_k.getReal()) - - (L_j_l.getImag() * I_l_j__l_k.getImag())); - L_j_k.incImag( (L_j_l.getImag() * I_l_j__l_k.getReal()) + - (L_j_l.getReal() * I_l_j__l_k.getImag())); - - } - - // (-1)^l - FReal pow_of_minus_1_for_l = ((l&1) ? FReal(-1.0) : FReal(1.0)); - for(/*l = k*/; l>0 && l>=j-n+k; --l){ /* l>0 && l-k<=0 */ - const FComplexe L_j_l = local_exp_src[index_n + l]; - const FComplexe I_l_j__l_k = L2L_tranfer[index_n_j - l + k]; - - L_j_k.incReal( pow_of_minus_1_for_l * pow_of_minus_1_for_k * - ((L_j_l.getReal() * I_l_j__l_k.getReal()) + - (L_j_l.getImag() * I_l_j__l_k.getImag()))); - L_j_k.incImag( pow_of_minus_1_for_l * pow_of_minus_1_for_k * - ((L_j_l.getImag() * I_l_j__l_k.getReal()) - - (L_j_l.getReal() * I_l_j__l_k.getImag()))); - - pow_of_minus_1_for_l = -pow_of_minus_1_for_l; - } - - // l<=0 && l-k<=0 - for(/*l = 0 ou l = j-n+k-1*/; l>=j-n+k; --l){ - const FComplexe L_j_l = local_exp_src[index_n - l]; - const FComplexe I_l_j__l_k = L2L_tranfer[index_n_j - l + k]; - - L_j_k.incReal( pow_of_minus_1_for_k * - ((L_j_l.getReal() * I_l_j__l_k.getReal()) - - (L_j_l.getImag() * I_l_j__l_k.getImag()))); - L_j_k.decImag( pow_of_minus_1_for_k * - ((L_j_l.getImag() * I_l_j__l_k.getReal()) + - (L_j_l.getReal() * I_l_j__l_k.getImag()))); - - } - }//n - - local_exp_target[index_j_k] = L_j_k; - - pow_of_minus_1_for_k = -pow_of_minus_1_for_k; - }//k - }//j - } - - /** L2P - */ - void localToParticle(ParticleClass*const particle, const F3DPosition& local_position, - const FComplexe*const local_exp){ - //--------------- Forces ----------------// - - FReal force_vector_in_local_base_x = 0; - FReal force_vector_in_local_base_y = 0; - FReal force_vector_in_local_base_z = 0; - - const FSpherical spherical(particle->getPosition() - local_position); - harmonic.computeInnerTheta( spherical ); - - int index_j_k = 1; - - for (int j = 1 ; j <= devP ; ++j ){ - { - // k=0: - // F_r: - const FReal exp_term_aux_real = ( (harmonic.result(index_j_k).getReal() * local_exp[index_j_k].getReal()) - (harmonic.result(index_j_k).getImag() * local_exp[index_j_k].getImag()) ); - //const FReal exp_term_aux_imag = ( (harmonic.result(index_j_k).getReal() * local_exp[index_j_k].getImag()) + harmonic.result(index_j_k).getImag() * local_exp[index_j_k].getReal()) ); - force_vector_in_local_base_x = ( force_vector_in_local_base_x + FReal(j) * exp_term_aux_real ); - } - { - // F_phi: k=0 => nothing to do for F_phi - // F_theta: - const FReal exp_term_aux_real = ( (harmonic.resultThetaDerivated(index_j_k).getReal() * local_exp[index_j_k].getReal()) - (harmonic.resultThetaDerivated(index_j_k).getImag() * local_exp[index_j_k].getImag()) ); - //const FReal exp_term_aux_imag = ( (harmonic.resultThetaDerivated(index_j_k).getReal() * local_exp[index_j_k].getImag()) + (harmonic.resultThetaDerivated(index_j_k).getImag() * local_exp[index_j_k].getReal()) ); - force_vector_in_local_base_y = ( force_vector_in_local_base_y + exp_term_aux_real ); - } - - ++index_j_k; - - // k>0: - for (int k=1; k<=j ;++k, ++index_j_k){ - { - // F_r: - const FReal exp_term_aux_real = ( (harmonic.result(index_j_k).getReal() * local_exp[index_j_k].getReal()) - (harmonic.result(index_j_k).getImag() * local_exp[index_j_k].getImag()) ); - const FReal exp_term_aux_imag = ( (harmonic.result(index_j_k).getReal() * local_exp[index_j_k].getImag()) + (harmonic.result(index_j_k).getImag() * local_exp[index_j_k].getReal()) ); - force_vector_in_local_base_x = (force_vector_in_local_base_x + FReal(2 * j) * exp_term_aux_real ); - // F_phi: - force_vector_in_local_base_z = ( force_vector_in_local_base_z - FReal(2 * k) * exp_term_aux_imag); - } - { - // F_theta: - const FReal exp_term_aux_real = ( (harmonic.resultThetaDerivated(index_j_k).getReal() * local_exp[index_j_k].getReal()) - (harmonic.resultThetaDerivated(index_j_k).getImag() * local_exp[index_j_k].getImag()) ); - //const FReal exp_term_aux_imag = ( (harmonic.resultThetaDerivated(index_j_k).getReal() * local_exp[index_j_k].getImag()) + (harmonic.resultThetaDerivated(index_j_k).getImag() * local_exp[index_j_k].getReal()) ); - force_vector_in_local_base_y = (force_vector_in_local_base_y + FReal(2.0) * exp_term_aux_real ); - } - - } - - } - // We want: - gradient(POTENTIAL_SIGN potential). - // The -(- 1.0) computing is not the most efficient programming ... - const FReal signe = 1.0; - if( FMath::Epsilon < spherical.getR()){ - force_vector_in_local_base_x = ( force_vector_in_local_base_x * signe / spherical.getR()); - force_vector_in_local_base_y = ( force_vector_in_local_base_y * signe / spherical.getR()); - force_vector_in_local_base_z = ( force_vector_in_local_base_z * signe / (spherical.getR() * spherical.getSinTheta())); - } - ///////////////////////////////////////////////////////////////////// - - //spherical_position_Set_ph - //FMB_INLINE COORDINATES_T angle_Convert_in_MinusPi_Pi(COORDINATES_T a){ - FReal ph = FMath::Fmod(spherical.getPhi(), FReal(2)*FMath::FPi); - if (ph > M_PI) ph -= FReal(2) * FMath::FPi; - if (ph < -M_PI + FMath::Epsilon) ph += FReal(2) * FMath::Epsilon; - - //spherical_position_Set_th - FReal th = FMath::Fmod(FMath::ACos(spherical.getCosTheta()), FReal(2) * FMath::FPi); - if (th < 0.0) th += 2*FMath::FPi; - if (th > FMath::FPi){ - th = 2*FMath::FPi - th; - //spherical_position_Set_ph(p, spherical_position_Get_ph(p) + M_PI); - ph = FMath::Fmod(ph + FMath::FPi, 2*FMath::FPi); - if (ph > M_PI) ph -= 2*FMath::FPi; - if (ph < -M_PI + FMath::Epsilon) ph += 2 * FMath::Epsilon; - th = FMath::Fmod(th, 2*FMath::FPi); - if (th > M_PI) th -= 2*FMath::FPi; - if (th < -M_PI + FMath::Epsilon) th += 2 * FMath::Epsilon; - } - //spherical_position_Set_r - //FReal rh = spherical.r; - if (spherical.getR() < 0){ - //rh = -spherical.r; - //spherical_position_Set_ph(p, M_PI - spherical_position_Get_th(p)); - ph = FMath::Fmod(FMath::FPi - th, 2*FMath::FPi); - if (ph > M_PI) ph -= 2*FMath::FPi; - if (ph < -M_PI + FMath::Epsilon) ph += 2 * FMath::Epsilon; - //spherical_position_Set_th(p, spherical_position_Get_th(p) + M_PI); - th = FMath::Fmod(th + FMath::FPi, 2*FMath::FPi); - if (th < 0.0) th += 2*FMath::FPi; - if (th > FMath::FPi){ - th = 2*FMath::FPi - th; - //spherical_position_Set_ph(p, spherical_position_Get_ph(p) + M_PI); - ph = FMath::Fmod(ph + FMath::FPi, 2*FMath::FPi); - if (ph > M_PI) ph -= 2*FMath::FPi; - if (ph < -M_PI + FMath::Epsilon) ph += 2 * FMath::Epsilon; - th = FMath::Fmod(th, 2*FMath::FPi); - if (th > M_PI) th -= 2*FMath::FPi; - if (th < -M_PI + FMath::Epsilon) th += 2 * FMath::Epsilon; - } - } - - const FReal cos_theta = FMath::Cos(th); - const FReal cos_phi = FMath::Cos(ph); - const FReal sin_theta = FMath::Sin(th); - const FReal sin_phi = FMath::Sin(ph); - - FReal force_vector_tmp_x = ( - cos_phi * sin_theta * force_vector_in_local_base_x + - cos_phi * cos_theta * force_vector_in_local_base_y + - (-sin_phi) * force_vector_in_local_base_z); - - FReal force_vector_tmp_y = ( - sin_phi * sin_theta * force_vector_in_local_base_x + - sin_phi * cos_theta * force_vector_in_local_base_y + - cos_phi * force_vector_in_local_base_z); - - FReal force_vector_tmp_z = ( - cos_theta * force_vector_in_local_base_x + - (-sin_theta) * force_vector_in_local_base_y); - - const FReal physicalValue = particle->getPhysicalValue(); - force_vector_tmp_x *= physicalValue; - force_vector_tmp_y *= physicalValue; - force_vector_tmp_z *= physicalValue; - - particle->incForces( force_vector_tmp_x, force_vector_tmp_y, force_vector_tmp_z ); - - //--------------- Potential ----------------// - - FReal result = 0.0; - index_j_k = 0; - - for(int j = 0 ; j<= devP ; ++j){ - // k=0 - harmonic.result(index_j_k) *= local_exp[index_j_k]; - result += harmonic.result(index_j_k).getReal(); - - ++index_j_k; - - // k>0 - for (int k = 1 ; k <= j ; ++k, ++index_j_k){ - harmonic.result(index_j_k) *= local_exp[index_j_k]; - result += 2 * harmonic.result(index_j_k).getReal(); - } - } - - particle->incPotential(result /* * physicalValue*/); - - } - -public: - /** P2P mutual interaction - * F = q * q' / r² - */ - void directInteractionMutual(ParticleClass*const FRestrict target, ParticleClass*const FRestrict source){ - - FReal dx = -(target->getPosition().getX() - source->getPosition().getX()); - FReal dy = -(target->getPosition().getY() - source->getPosition().getY()); - FReal dz = -(target->getPosition().getZ() - source->getPosition().getZ()); - - FReal inv_square_distance = FReal(1.0) / (dx*dx + dy*dy + dz*dz); - FReal inv_distance = FMath::Sqrt(inv_square_distance); - - inv_square_distance *= inv_distance; - inv_square_distance *= target->getPhysicalValue() * source->getPhysicalValue(); - - dx *= inv_square_distance; - dy *= inv_square_distance; - dz *= inv_square_distance; - - target->incForces( dx, dy, dz); - target->incPotential( inv_distance * source->getPhysicalValue() ); - - source->incForces( (-dx), (-dy), (-dz)); - source->incPotential( inv_distance * target->getPhysicalValue() ); - } - - /** P2P NO mutual interaction - * F = q * q' / r² - */ - void directInteraction(ParticleClass*const FRestrict target, const ParticleClass& source){ - - FReal dx = -(target->getPosition().getX() - source.getPosition().getX()); - FReal dy = -(target->getPosition().getY() - source.getPosition().getY()); - FReal dz = -(target->getPosition().getZ() - source.getPosition().getZ()); - - FReal inv_square_distance = FReal(1.0) / (dx*dx + dy*dy + dz*dz); - FReal inv_distance = FMath::Sqrt(inv_square_distance); - - inv_square_distance *= inv_distance; - inv_square_distance *= target->getPhysicalValue() * source.getPhysicalValue(); - - dx *= inv_square_distance; - dy *= inv_square_distance; - dz *= inv_square_distance; - - target->incForces( dx, dy, dz); - target->incPotential( inv_distance * source.getPhysicalValue() ); - } - - /** P2P NO mutual interaction with an offset - * F = q * q' / r² - */ - void directInteractionOffset(ParticleClass*const FRestrict target, const ParticleClass& source, const FTreeCoordinate& offset){ - - FReal dx = -(target->getPosition().getX() - source.getPosition().getX()) + FReal(offset.getX()) * boxWidth; - FReal dy = -(target->getPosition().getY() - source.getPosition().getY()) + FReal(offset.getY()) * boxWidth; - FReal dz = -(target->getPosition().getZ() - source.getPosition().getZ()) + FReal(offset.getZ()) * boxWidth; - - FReal inv_square_distance = FReal(1.0) / (dx*dx + dy*dy + dz*dz); - FReal inv_distance = FMath::Sqrt(inv_square_distance); - - inv_square_distance *= inv_distance; - inv_square_distance *= target->getPhysicalValue() * source.getPhysicalValue(); - - dx *= inv_square_distance; - dy *= inv_square_distance; - dz *= inv_square_distance; - - target->incForces( dx, dy, dz); - target->incPotential( inv_distance * source.getPhysicalValue() ); - } - - /** Update a velocity of a particle - * - */ - void computeVelocity(ParticleClass*const FRestrict target, const FReal DT){ - const FReal physicalValue = target->getPhysicalValue(); - // Coef = 1/m * time/2 - const FReal coef = (FReal(1.0)/physicalValue) * (DT/FReal(2.0)); - - // velocity = velocity + forces * coef - F3DPosition forces_coef(target->getForces()); - forces_coef *= coef; - target->incVelocity(forces_coef); - } - - /** Update a position of a particle - * - */ - void updatePosition(ParticleClass*const FRestrict target, const FReal DT){ - F3DPosition velocity_dt( target->getVelocity() ); - velocity_dt *= DT; - target->incPosition( velocity_dt ); - } }; - -#endif //FSPHERICALKERNEL_HPP - - +#endif // FSPHERICALKERNEL_HPP diff --git a/Src/Kernels/FSphericalParticle.hpp b/Src/Kernels/FSphericalParticle.hpp new file mode 100644 index 000000000..b925392ac --- /dev/null +++ b/Src/Kernels/FSphericalParticle.hpp @@ -0,0 +1,27 @@ +// =================================================================================== +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. +// =================================================================================== +#ifndef FSPHERICALPARTICLE_HPP +#define FSPHERICALPARTICLE_HPP + +#include "../Extensions/FExtendForces.hpp" +#include "../Extensions/FExtendPotential.hpp" +#include "../Extensions/FExtendParticleType.hpp" +#include "../Components/FFmaParticle.hpp" + +class FSphericalParticle : public FExtendForces, public FFmaParticle, public FExtendPotential { +public: +}; + +class FTypedSphericalParticle : public FSphericalParticle, public FExtendParticleType { +public: +}; + +#endif // FSPHERICALPARTICLE_HPP diff --git a/Src/Kernels/FSphericalRotationKernel.hpp b/Src/Kernels/FSphericalRotationKernel.hpp new file mode 100644 index 000000000..e9ae4d660 --- /dev/null +++ b/Src/Kernels/FSphericalRotationKernel.hpp @@ -0,0 +1,612 @@ +// =================================================================================== +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. +// =================================================================================== +#ifndef FSPHERICALROTATIONKERNEL_HPP +#define FSPHERICALROTATIONKERNEL_HPP + +#include "FAbstractSphericalKernel.hpp" +#include "../Utils/FMemUtils.hpp" + +/** +* @author Berenger Bramas (berenger.bramas@inria.fr) +* This class is the rotation spherical harmonic kernel +*/ +template< class ParticleClass, class CellClass, class ContainerClass> +class FSphericalRotationKernel : public FAbstractSphericalKernel<ParticleClass,CellClass,ContainerClass> { +protected: + typedef FAbstractSphericalKernel<ParticleClass,CellClass,ContainerClass> Parent; + + /** This class define some information to use rotation computation + */ + struct RotationInfo{ + FReal* rotation_a; + FReal* rotation_b; + + FComplexe* p_rot_multipole_exp; + FComplexe* p_rot_local_exp; + + /** Get z vector size */ + static int ZAxisExpensionSize(const int inDevP){ + return int( (inDevP&1) == 0 ? ((inDevP+1) + (inDevP*inDevP)*.25) : ((inDevP+1) + (inDevP*inDevP-1)*.25)); + } + + /** Constructor */ + RotationInfo(const int inDevP){ + rotation_a = new FReal[int( ((inDevP)+1) * ((inDevP)+2) * 0.5 )]; + for(int n = 0 ; n <= inDevP ; ++n){ + for(int m = 0 ; m <= n ; ++m){ + rotation_a[int(n*(n+1) * 0.5 + m)] = FMath::Sqrt( FReal((n+1+m)*(n+1-m)) / FReal(((2*n+1)*(2*n+3))) ); + } + } + rotation_b = new FReal[(inDevP+1) * (inDevP+1)]; + for(int n = 0 ; n <= inDevP ; ++n){ + for(int m = -n ; m < 0 ; ++m){ + rotation_b[n*(n+1) + m] = -FMath::Sqrt( FReal((n-m-1)*(n-m)) / FReal(((2*n-1)*(2*n+1))) ); + } + for(int m = 0 ; m <= n ; ++m){ + rotation_b[n*(n+1) + m] = FMath::Sqrt( FReal((n-m-1)*(n-m)) / FReal(((2*n-1)*(2*n+1))) ); + } + } + const int z_size = ZAxisExpensionSize(inDevP); + p_rot_multipole_exp = new FComplexe[z_size]; + p_rot_local_exp = new FComplexe[z_size]; + } + + /** Destructor */ + ~RotationInfo(){ + delete[] rotation_a; + delete[] rotation_b; + delete[] p_rot_multipole_exp; + delete[] p_rot_local_exp; + } + }; + + + /** This class holds the data need to do a M2L by rotation + * it is precomputed at the beginning + */ + struct RotationM2LTransfer { + const int devP; + const int expSize; + FComplexe** rcc_outer; + FComplexe** rcc_inner; + FReal* outer_array; + + /** Constructor */ + RotationM2LTransfer(const int inDevP, const int inDevM2lP, const int inExpSize) + : devP(inDevP), expSize(inExpSize){ + rcc_outer = new FComplexe*[devP + 1]; + rcc_inner = new FComplexe*[devP + 1]; + for( int idxP = 0 ; idxP <= devP ; ++idxP){ + const int rotationSize = ((idxP+1)*(2*idxP+1)); + rcc_outer[idxP] = new FComplexe[rotationSize]; + rcc_inner[idxP] = new FComplexe[rotationSize]; + } + outer_array = new FReal[inDevM2lP + 1]; + } + + /** Used in the initialisation */ + void spherical_harmonic_Outer_null_order_z_axis(const FReal r){ + const FReal inv_r = FReal(1.0 / r); + FReal tmp = inv_r; + + // l=0 + outer_array[0] = tmp; + + // l>0 + for(int l = 1 ; l <= devP ; ++l){ + tmp *= inv_r * FReal(l); + outer_array[l] = tmp; + } + } + + /** Used in the initialisation */ + void computeLegendre(const FReal inCosTheta, const FReal inSinTheta, FReal legendre[]){ + const FReal invSinTheta = -inSinTheta; + + legendre[0] = 1.0; // P_0,0(cosTheta) = 1 + legendre[1] = inCosTheta; // P_1,0(cosTheta) = cosTheta + legendre[2] = invSinTheta;// P_1,1(cosTheta) = -sinTheta + + int idxCurrentLM = 3; //current pointer on P_l,m + int idxCurrentL1M = 1; //pointer on P_{l-1},m => P_1,0 + int idxCurrentL2M = 0; //pointer on P_{l-2},m => P_0,0 + FReal fact = 3.0; + + for(int l = 2; l <= devP ; ++l ){ + // m from 0 to l - 2 + for( int m = 0; m <= l - 2 ; ++m ){ + legendre[idxCurrentLM] = (inCosTheta * FReal( 2 * l - 1 ) * legendre[idxCurrentL1M] + - FReal( l + m - 1 ) * legendre[idxCurrentL2M] ) + / FReal( l - m ); + + + // progress + ++idxCurrentLM; + ++idxCurrentL1M; + ++idxCurrentL2M; + } + + // Compute P_l,{l-1} + legendre[idxCurrentLM++] = inCosTheta * FReal( 2 * l - 1 ) * legendre[idxCurrentL1M]; + + // Compute P_l,l + legendre[idxCurrentLM++] = fact * invSinTheta * legendre[idxCurrentL1M]; + + fact += FReal(2.0); + ++idxCurrentL1M; + } + } + + /** Used in the initialisation */ + static int getTranspRotationCoefP(const int n, const int nu, const int m){ + return m*(2*n+1) + (nu+n); + } + /** Used in the initialisation */ + static int getRotationCoefP(const int n, const int nu, const int m){ + return (nu)*(2*(n)+1) + (m+n); + } + /** Used in the initialisation */ + static int getRotationB(const int n, const int m){ + return n*(n+1) + m; + } + /** Used in the initialisation */ + static int getRotationA(const int n, const int m){ + return int(n*(n+1) * 0.5 + (FMath::Abs(m))); + } + + /** Used in the initialisation */ + static FReal A_div_A(int n, int m, int nu){ + m = FMath::Abs(m); + nu = FMath::Abs(nu); + const int min = FMath::Min(m, nu); + const int max = FMath::Max(m, nu); + const int i_stop = max - min - 1; /* = n-min - (n-max+1) = n+max - (n+min+1) */ + + FReal num = FReal(n-max+1); + FReal denom = FReal(n+min+1); + FReal A_min_max = 1; + for (int i=0; i<=i_stop; ++i, ++num, ++denom){ + A_min_max *= (num/denom); + } + + if (nu == min) + return FMath::Sqrt(A_min_max); + else + return 1/FMath::Sqrt(A_min_max); + } + + /** Pre-Compute */ + void rotation_coefficient_container_Fill(const FReal omega, + const FReal cos_gamma, const FReal sin_gamma, + const FReal chi, const RotationInfo& rotation_Info){ + + FComplexe** rcc_tmp_transposed = new FComplexe*[devP + 1]; + for( int idxP = 0 ; idxP <= devP ; ++idxP){ + const int rotationSize = ((idxP+1)*(2*idxP+1)); + rcc_tmp_transposed[idxP] = new FComplexe[rotationSize]; + } + + FComplexe _pow_of_I_array[7]; + _pow_of_I_array[0].setRealImag(0 , 1 ) /* I^{-3} */; + _pow_of_I_array[1].setRealImag(-1, 0 ) /* I^{-2} */; + _pow_of_I_array[2].setRealImag(0 , -1) /* I^{-1} */; + _pow_of_I_array[3].setRealImag(1 , 0 ) /* I^0 */; + _pow_of_I_array[4].setRealImag(0 , 1 ) /* I^1 */; + _pow_of_I_array[5].setRealImag(-1, 0 ) /* I^2 */; + _pow_of_I_array[6].setRealImag(0 , -1) /* I^3 */; + + const FComplexe* pow_of_I_array = _pow_of_I_array + 3; /* points on I^0 */ + + FComplexe* const _precomputed_exp_I_chi_array = new FComplexe[2*devP + 1]; + FComplexe* precomputed_exp_I_chi_array = _precomputed_exp_I_chi_array + devP; + + FComplexe* const _precomputed_exp_I_omega_array = new FComplexe[2*devP + 1]; + FComplexe* precomputed_exp_I_omega_array = _precomputed_exp_I_omega_array + devP; + + + // cos(x) = sin(x + Pi/2) + for(int m = -devP ; m <= devP ; ++m){ + precomputed_exp_I_chi_array[m].setReal(FMath::Sin(FReal(m)*chi + FMath::FPiDiv2)); + precomputed_exp_I_chi_array[m].setImag(FMath::Sin(FReal(m)*chi)); + } + for(int nu = -devP ; nu <= devP ; ++nu){ + precomputed_exp_I_omega_array[nu].setReal(FMath::Sin(FReal(nu)*omega + FMath::FPiDiv2)); + precomputed_exp_I_omega_array[nu].setImag(FMath::Sin(FReal(nu)*omega)); + } + + FReal*const ass_Legendre_func_Array = new FReal[expSize]; + FReal* p_ass_Legendre_func_Array = ass_Legendre_func_Array; + computeLegendre(cos_gamma, sin_gamma, ass_Legendre_func_Array); + + for(int n = 0 ; n <= devP ; ++n){ + // nu == 0: + FReal c_n_nu = 1; + rcc_tmp_transposed[n][getTranspRotationCoefP(n,0,0)].setReal(c_n_nu * (*p_ass_Legendre_func_Array)); + + ++p_ass_Legendre_func_Array; + + // nu > 0: + FReal minus_1_pow_nu = -1; + for(int nu = 1 ; nu <= n; ++nu){ + c_n_nu /= FMath::Sqrt(FReal((n-nu+1)*(n+nu))); + rcc_tmp_transposed[n][getTranspRotationCoefP(n, nu, 0)].setReal(minus_1_pow_nu * c_n_nu * (*p_ass_Legendre_func_Array)); + rcc_tmp_transposed[n][getTranspRotationCoefP(n, -nu, 0)] = rcc_tmp_transposed[n][getTranspRotationCoefP(n, nu, 0)]; + minus_1_pow_nu = -minus_1_pow_nu; + ++p_ass_Legendre_func_Array; + } // for nu + + for(int m = 1 ; m <= n ; ++m){ + for(int nu = -m; nu <= m ; ++nu){ + const FReal H_nu_minus_1 = ( nu-1 <= -n ? + FReal(0.0) : + (cos_gamma +1) * rotation_Info.rotation_b[getRotationB(n, -nu)] + * rcc_tmp_transposed[n-1][getTranspRotationCoefP(n-1, nu-1, m-1)].getReal()); + const FReal H_nu_plus_1 = ( nu+1 >= n ? + FReal(0.0) : + (cos_gamma -1) * rotation_Info.rotation_b[getRotationB(n, nu)] + * rcc_tmp_transposed[n-1][getTranspRotationCoefP(n-1, nu+1, m-1)].getReal()); + + const FReal H_nu = ( FMath::Abs(nu) >= n ? + FReal(0.0) : + sin_gamma * rotation_Info.rotation_a[getRotationA(n-1, nu)] + * rcc_tmp_transposed[n-1][getTranspRotationCoefP(n-1, nu, m-1)].getReal() ); + + + rcc_tmp_transposed[n][getTranspRotationCoefP(n, nu, m)].setReal( (FReal(0.5) * (-H_nu_minus_1 - H_nu_plus_1) - H_nu) + / rotation_Info.rotation_b[getRotationB(n, -m)]); + } // for nu + } // for m + + for(int m = 1 ; m <= n ; ++m){ + for(int nu = -n ; nu <= -m-1; ++nu){ + rcc_tmp_transposed[n][getTranspRotationCoefP(n, nu, m)] = rcc_tmp_transposed[n][getTranspRotationCoefP(n, -m, -nu)]; + } // for nu + + for(int nu = m+1 ; nu <= n; ++nu){ + rcc_tmp_transposed[n][getTranspRotationCoefP(n, nu, m)] = rcc_tmp_transposed[n][getTranspRotationCoefP(n, m, nu)]; + } // for nu + } // for m + } // for n + + for(int n = 0 ; n <= devP ; ++n){ + for(int nu = 0 ; nu <= n; ++nu){ + for(int m = -n; m <= n; ++m){ + FReal A_terms = A_div_A(n, m, nu); /* A_n^m / A_n^nu */ + int abs_m_minus_abs_nu_mod4 = (FMath::Abs(m) - FMath::Abs(nu)) % 4; /* can be negative! */ + const FComplexe p_H_tmp = ( m >= 0 ? + rcc_tmp_transposed[n][getTranspRotationCoefP(n, nu, m)] : + rcc_tmp_transposed[n][getTranspRotationCoefP(n, -nu, -m)]) ; + + /*************** T_Outer_n^{nu, m}(omega, gamma, chi): ***************/ + rcc_outer[n][getRotationCoefP(n, nu, m)] = p_H_tmp; + /* H_n^{nu, m}(gamma) => T_n^{nu, m}(omega, gamma, chi) */ + rcc_outer[n][getRotationCoefP(n, nu, m)] *= precomputed_exp_I_chi_array[ + m]; + rcc_outer[n][getRotationCoefP(n, nu, m)] *= precomputed_exp_I_omega_array[ - nu]; + /* T_Outer_j^{nu, k}(omega, gamma, chi) = i^{|k|-|nu|} (A_j^nu / A_j^k) T_j^{nu, k}(omega, gamma, chi) (6) */ + rcc_outer[n][getRotationCoefP(n, nu, m)] *= pow_of_I_array[abs_m_minus_abs_nu_mod4]; + rcc_outer[n][getRotationCoefP(n, nu, m)] *= (FReal(1.0) / A_terms); + + + /*************** T_Inner_n^{nu, m}(chi, gamma, omega): ***************/ + rcc_inner[n][getRotationCoefP(n, nu, m)] = p_H_tmp; + /* H_n^{nu, m}(gamma) => T_n^{nu, m}(chi, gamma, omega) */ + rcc_inner[n][getRotationCoefP(n, nu, m)] *= precomputed_exp_I_omega_array[ + m]; + rcc_inner[n][getRotationCoefP(n, nu, m)] *= precomputed_exp_I_chi_array[ - nu]; + /* T_Inner_j^{nu, k}(omega, gamma, chi) = i^{|nu|-|k|} (A_j^k / A_j^nu) T_j^{nu, k}(omega, gamma, chi) (7) */ + rcc_inner[n][getRotationCoefP(n, nu, m)] *= pow_of_I_array[- abs_m_minus_abs_nu_mod4]; + rcc_inner[n][getRotationCoefP(n, nu, m)] *= A_terms; + + }// for m + } // for nu + } // for n + + + delete[] (ass_Legendre_func_Array); + delete[] (_precomputed_exp_I_chi_array); + delete[] (_precomputed_exp_I_omega_array); + FMemUtils::DeleteAll( rcc_tmp_transposed, devP); + delete[] rcc_tmp_transposed; + } + + /** Pre-compute */ + void transfer_M2L_rotation_Fill(const FSpherical& inSphere, const RotationInfo& rotation_Info){ + + // Computes rotation coefficients: + rotation_coefficient_container_Fill(FMath::FPi, inSphere.getCosTheta(), + inSphere.getSinTheta(), inSphere.getPhi(), rotation_Info); + + // Computes Outer terms: + spherical_harmonic_Outer_null_order_z_axis(inSphere.getR()); + + + } + + ~RotationM2LTransfer(){ + FMemUtils::DeleteAll( rcc_outer, devP); + FMemUtils::DeleteAll( rcc_inner, devP); + delete[] rcc_outer; + delete[] rcc_inner; + delete[] outer_array; + } + }; + + const int devM2lP; //< A secondary P + + RotationM2LTransfer** preM2LTransitions; //< The pre-computation for the M2L based on the level and the 189 possibilities + RotationInfo rotation_Info; + + /** To access te pre computed M2L transfer vector */ + int indexM2LTransition(const int idxX,const int idxY,const int idxZ) const { + return (((((idxX+3) * 7) + (idxY+3)) * 7 ) + (idxZ+3)) * devM2lP; + } + + /** Alloc and init pre-vectors*/ + void allocAndInit(){ + // M2L transfer, there is a maximum of 3 neighbors in each direction, + // so 6 in each dimension + preM2LTransitions = new RotationM2LTransfer*[Parent::treeHeight + Parent::periodicLevels]; + memset(preM2LTransitions, 0, sizeof(FComplexe*) * (Parent::treeHeight + Parent::periodicLevels)); + // We start from the higher level + FReal treeWidthAtLevel = Parent::boxWidth * FReal(1 << Parent::periodicLevels); + for(int idxLevel = -Parent::periodicLevels ; idxLevel < Parent::treeHeight ; ++idxLevel ){ + // Allocate data for this level + preM2LTransitions[idxLevel + Parent::periodicLevels] = reinterpret_cast<RotationM2LTransfer*>(new char[(7 * 7 * 7) * devM2lP * sizeof(RotationM2LTransfer)]); + // Precompute transfer vector + for(int idxX = -3 ; idxX <= 3 ; ++idxX ){ + for(int idxY = -3 ; idxY <= 3 ; ++idxY ){ + for(int idxZ = -3 ; idxZ <= 3 ; ++idxZ ){ + new (&preM2LTransitions[idxLevel + Parent::periodicLevels][indexM2LTransition(idxX,idxY,idxZ)]) RotationM2LTransfer(Parent::devP,devM2lP,Parent::harmonic.getExpSize()); + + if(FMath::Abs(idxX) > 1 || FMath::Abs(idxY) > 1 || FMath::Abs(idxZ) > 1){ + const F3DPosition relativePos( FReal(idxX) * treeWidthAtLevel , FReal(idxY) * treeWidthAtLevel , FReal(idxZ) * treeWidthAtLevel ); + preM2LTransitions[idxLevel + Parent::periodicLevels][indexM2LTransition(idxX,idxY,idxZ)].transfer_M2L_rotation_Fill(FSpherical(relativePos), rotation_Info); + } + } + } + } + // We divide the bow per 2 when we go down + treeWidthAtLevel /= 2; + } + } + + +public: + /** Constructor + * @param inDevP the polynomial degree + * @param inThreeHeight the height of the tree + * @param inBoxWidth the size of the simulation box + * @param inPeriodicLevel the number of level upper to 0 that will be requiried + */ + FSphericalRotationKernel(const int inDevP, const int inTreeHeight, const FReal inBoxWidth, const int inPeriodicLevel = 0) + : Parent(inDevP, inTreeHeight, inBoxWidth, inPeriodicLevel), + devM2lP(int(((inDevP*2)+1) * ((inDevP*2)+2) * 0.5)), preM2LTransitions(0), rotation_Info(inDevP) { + allocAndInit(); + } + + /** Copy constructor */ + FSphericalRotationKernel(const FSphericalRotationKernel& other) + : Parent(other), devM2lP(other.devM2lP), preM2LTransitions(0), rotation_Info(other.devP) { + allocAndInit(); + } + + /** Destructor */ + ~FSphericalRotationKernel(){ + for(int idxLevel = -Parent::periodicLevels ; idxLevel < Parent::treeHeight ; ++idxLevel ){ + for(int idx = 0 ; idx < 7*7*7 ; ++idx ){ + preM2LTransitions[idxLevel + Parent::periodicLevels][idx].~RotationM2LTransfer(); + } + delete[] reinterpret_cast<char*>(preM2LTransitions[idxLevel + Parent::periodicLevels]); + } + delete[] preM2LTransitions; + } + + /** M2L with a cell and all the existing neighbors */ + void M2L(CellClass* const FRestrict pole, const CellClass* distantNeighbors[189], + const int size, const int inLevel) { + const FTreeCoordinate& coordCenter = pole->getCoordinate(); + // For all neighbors compute M2L + for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ + const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); + const RotationM2LTransfer& transitionVector = preM2LTransitions[inLevel + Parent::periodicLevels] + [indexM2LTransition((coordCenter.getX() - coordNeighbors.getX()), + (coordCenter.getY() - coordNeighbors.getY()), + (coordCenter.getZ() - coordNeighbors.getZ()))]; + + multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); + } + } + + /** Before Downward */ + void M2L(CellClass* const FRestrict local, const CellClass* distantNeighbors[189], + const FTreeCoordinate neighborsRelativePositions[189], + const int size, const int inLevel) { + // For all neighbors compute M2L + for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ + const RotationM2LTransfer& transitionVector = preM2LTransitions[inLevel + Parent::periodicLevels] + [indexM2LTransition(neighborsRelativePositions[idxNeigh].getX(), + neighborsRelativePositions[idxNeigh].getY(), + neighborsRelativePositions[idxNeigh].getZ())]; + + multipoleToLocal(local->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); + } + } + + + /** M2L With rotation + */ + void multipoleToLocal(FComplexe*const FRestrict local_exp_target, const FComplexe* const FRestrict multipole_exp_src, + const RotationM2LTransfer& transfer_M2L_rotation){ + + memset(rotation_Info.p_rot_multipole_exp, 0, RotationInfo::ZAxisExpensionSize(Parent::devP) * sizeof(FComplexe)); + memset(rotation_Info.p_rot_local_exp, 0, RotationInfo::ZAxisExpensionSize(Parent::devP) * sizeof(FComplexe)); + + rotation_Rotate_multipole_expansion_terms(multipole_exp_src, transfer_M2L_rotation.rcc_outer, rotation_Info.p_rot_multipole_exp); + + M2L_z_axis(rotation_Info.p_rot_local_exp, rotation_Info.p_rot_multipole_exp, transfer_M2L_rotation.outer_array); + + rotation_Rotate_local_expansion_terms(rotation_Info.p_rot_local_exp, transfer_M2L_rotation.rcc_inner, local_exp_target); + } + + /** Needed when doing the M2L */ + void rotation_Rotate_multipole_expansion_terms(const FComplexe*const FRestrict multipole_exp, + const FComplexe* const FRestrict * const FRestrict rcc_outer, + FComplexe*const FRestrict rot_multipole_exp){ + + FComplexe* p_rot_multipole_exp = rot_multipole_exp; + + for(int nu = 0 ; nu <= (Parent::devP/2) ; ++nu){ + for(int j = nu; j <= (Parent::devP-nu) ; ++j){ + const FComplexe* p_rcc_outer = &rcc_outer[j][RotationM2LTransfer::getRotationCoefP(j, nu, j)]; + const FComplexe* p_multipole_exp = &multipole_exp[Parent::harmonic.getPreExpRedirJ(j) + j]; + FReal minus_1_pow_k = FReal(j&1 ? -1 : 1); + + for(int k = -j ; k < 0 ; ++k){ /* k < 0 */ + p_rot_multipole_exp->incReal( minus_1_pow_k * + ((p_multipole_exp->getReal() * p_rcc_outer->getReal()) + + (p_multipole_exp->getImag() * p_rcc_outer->getImag())) ); + p_rot_multipole_exp->incImag( minus_1_pow_k * + ((p_multipole_exp->getReal() * p_rcc_outer->getImag()) - + (p_multipole_exp->getImag() * p_rcc_outer->getReal())) ); + + minus_1_pow_k = -minus_1_pow_k; + --p_rcc_outer; + --p_multipole_exp; + } /* for k */ + + for(int k = 0; k <= j ; ++k){ /* k >= 0 */ + p_rot_multipole_exp->incReal( + ((p_multipole_exp->getReal() * p_rcc_outer->getReal()) - + (p_multipole_exp->getImag() * p_rcc_outer->getImag())) ); + p_rot_multipole_exp->incImag( + ((p_multipole_exp->getReal() * p_rcc_outer->getImag()) + + (p_multipole_exp->getImag() * p_rcc_outer->getReal())) ); + + --p_rcc_outer; + ++p_multipole_exp; + } /* for k */ + + ++p_rot_multipole_exp; + } /* for j */ + } /* for nu */ + } + + /** Needed when doing the M2L */ + void M2L_z_axis(FComplexe* const FRestrict rot_local_exp, + const FComplexe* const FRestrict rot_multipole_exp, + const FReal* const outer_array){ + FComplexe* p_rot_local_exp = rot_local_exp; + + for(int j = 0 ; j <= Parent::devP; ++j){ + const FReal* p_outer_array_j = outer_array + j; + const int stop_for_n = Parent::devP-j; + const int min_j = FMath::Min(j, stop_for_n); + for(int k = 0 ; k <= min_j ; ++k){ + const FComplexe* p_rot_multipole_exp = rot_multipole_exp + k * (Parent::devP + 2 - k); + for(int n = k ; n <= stop_for_n ; ++n){ + p_rot_local_exp->incReal(p_rot_multipole_exp->getReal() * p_outer_array_j[n]); + p_rot_local_exp->incImag(p_rot_multipole_exp->getImag() * p_outer_array_j[n]); + ++p_rot_multipole_exp; + } /* for n */ + ++p_rot_local_exp; + } /* for k */ + } /* for j */ + } + + /** Needed when doing the M2L */ + void rotation_Rotate_local_expansion_terms(const FComplexe*const rot_local_exp, + const FComplexe*const FRestrict *const FRestrict rcc_inner, + FComplexe*const FRestrict local_exp){ + const int Q = Parent::devP/2; + + FComplexe* FRestrict p_local_exp = local_exp; + + for(int j = 0 ; j <= Q ; ++j){ + const int min_j = j; + const FComplexe* const FRestrict p_rot_local_exp_j = &rot_local_exp[Parent::harmonic.getPreExpRedirJ(j) + j]; + + for (int nu = 0 ; nu <= j; ++nu){ + const FComplexe* FRestrict p_rcc_inner = &rcc_inner[j][RotationM2LTransfer::getRotationCoefP(j, nu, -min_j)]; + const FComplexe* FRestrict p_rot_local_exp = p_rot_local_exp_j; + FReal minus_1_pow_k = FReal(min_j&1 ? -1 : 1); + + for(int k = -min_j ; k < 0 ; ++k){ /* k < 0 */ + p_local_exp->incReal( minus_1_pow_k * + ((p_rot_local_exp->getReal() * p_rcc_inner->getReal()) + + (p_rot_local_exp->getImag() * p_rcc_inner->getImag()))); + p_local_exp->incImag( minus_1_pow_k * + ((p_rot_local_exp->getReal() * p_rcc_inner->getImag()) - + (p_rot_local_exp->getImag() * p_rcc_inner->getReal()))); + + minus_1_pow_k = -minus_1_pow_k; + --p_rot_local_exp; + ++p_rcc_inner; + } /* for k */ + + for(int k = 0; k <= min_j ; ++k){ /* k >= 0 */ + p_local_exp->incReal( + ((p_rot_local_exp->getReal() * p_rcc_inner->getReal()) - + (p_rot_local_exp->getImag() * p_rcc_inner->getImag()))); + p_local_exp->incImag( + ((p_rot_local_exp->getReal() * p_rcc_inner->getImag()) + + (p_rot_local_exp->getImag() * p_rcc_inner->getReal()))); + + ++p_rot_local_exp; + ++p_rcc_inner; + } /* for k */ + + + ++p_local_exp; + } /* for nu */ + } /* for j */ + + const FComplexe* FRestrict p_rot_local_exp_j = &rot_local_exp[Parent::harmonic.getPreExpRedirJ(Q) + Q]; + + for(int j = Q + 1; j <= Parent::devP ; ++j){ + p_rot_local_exp_j += Parent::devP - j +1; + const int min_j = Parent::devP-j; + + for(int nu = 0 ; nu <= j; ++nu){ + const FComplexe* FRestrict p_rcc_inner = &rcc_inner[j][RotationM2LTransfer::getRotationCoefP(j, nu, -min_j)]; + const FComplexe* FRestrict p_rot_local_exp = p_rot_local_exp_j; + FReal minus_1_pow_k = FReal(min_j&1 ? -1 : 1); + + for(int k = -min_j ; k < 0; ++k){ /* k < 0 */ + p_local_exp->incReal( minus_1_pow_k * + ((p_rot_local_exp->getReal() * p_rcc_inner->getReal()) + + (p_rot_local_exp->getImag() * p_rcc_inner->getImag()))); + p_local_exp->incImag( minus_1_pow_k * + ((p_rot_local_exp->getReal() * p_rcc_inner->getImag()) - + (p_rot_local_exp->getImag() * p_rcc_inner->getReal()))); + + minus_1_pow_k = -minus_1_pow_k; + --p_rot_local_exp; + ++p_rcc_inner; + } /* for k */ + for(int k = 0; k<=min_j; ++k){ /* k >= 0 */ + p_local_exp->incReal( + ((p_rot_local_exp->getReal() * p_rcc_inner->getReal()) - + (p_rot_local_exp->getImag() * p_rcc_inner->getImag()))); + p_local_exp->incImag( + ((p_rot_local_exp->getReal() * p_rcc_inner->getImag()) + + (p_rot_local_exp->getImag() * p_rcc_inner->getReal()))); + + ++p_rot_local_exp; + ++p_rcc_inner; + } /* for k */ + ++p_local_exp; + } /* for nu */ + } /* for j */ + } +}; + + + +#endif // FSPHERICALROTATIONKERNEL_HPP diff --git a/Src/Utils/F3DPosition.hpp b/Src/Utils/F3DPosition.hpp index 69349f2a4..b876a1b43 100644 --- a/Src/Utils/F3DPosition.hpp +++ b/Src/Utils/F3DPosition.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef F3DPOSITION_HPP #define F3DPOSITION_HPP diff --git a/Src/Utils/FAbstractSendable.hpp b/Src/Utils/FAbstractSendable.hpp index 12c5a6360..e260c08f2 100644 --- a/Src/Utils/FAbstractSendable.hpp +++ b/Src/Utils/FAbstractSendable.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FABSTRACTSENDABLE_HPP #define FABSTRACTSENDABLE_HPP diff --git a/Src/Utils/FAssertable.hpp b/Src/Utils/FAssertable.hpp index 7dd09fd85..884e41d59 100644 --- a/Src/Utils/FAssertable.hpp +++ b/Src/Utils/FAssertable.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FASSERTABLE_HPP #define FASSERTABLE_HPP diff --git a/Src/Utils/FBitonicSort.hpp b/Src/Utils/FBitonicSort.hpp index 34f1d716c..775ca2561 100644 --- a/Src/Utils/FBitonicSort.hpp +++ b/Src/Utils/FBitonicSort.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef BITONICSORT_HPP #define BITONICSORT_HPP diff --git a/Src/Utils/FBlas.hpp b/Src/Utils/FBlas.hpp index 908b59cc8..65c4add4a 100644 --- a/Src/Utils/FBlas.hpp +++ b/Src/Utils/FBlas.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FBLAS_HPP #define FBLAS_HPP diff --git a/Src/Utils/FComplexe.hpp b/Src/Utils/FComplexe.hpp index 15acf6606..f183411a6 100644 --- a/Src/Utils/FComplexe.hpp +++ b/Src/Utils/FComplexe.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FCOMPLEXE_HPP #define FCOMPLEXE_HPP @@ -162,6 +157,13 @@ public: return *this; } + /** Mul a complexe by another "c*=c2" */ + FComplexe& operator*=(const FReal& real){ + this->complex[0] *= real; + this->complex[1] *= real; + return *this; + } + /** Test if a complex is not a number */ bool isNan() const { return FMath::IsNan(complex[1]) || FMath::IsNan(complex[0]); diff --git a/Src/Utils/FDebug.cpp b/Src/Utils/FDebug.cpp index 50683d257..d2bf1583c 100644 --- a/Src/Utils/FDebug.cpp +++ b/Src/Utils/FDebug.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FDebug.hpp" #ifdef SCALFMM_USE_DEBUG diff --git a/Src/Utils/FDebug.hpp b/Src/Utils/FDebug.hpp index 2283d4574..42c7650f4 100644 --- a/Src/Utils/FDebug.hpp +++ b/Src/Utils/FDebug.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FDEBUG_HPP #define FDEBUG_HPP diff --git a/Src/Utils/FGlobal.hpp b/Src/Utils/FGlobal.hpp index 216cf30fa..58a401101 100644 --- a/Src/Utils/FGlobal.hpp +++ b/Src/Utils/FGlobal.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FGLOBAL_HPP #define FGLOBAL_HPP diff --git a/Src/Utils/FMath.cpp b/Src/Utils/FMath.cpp index 8e278984f..00c9bba74 100644 --- a/Src/Utils/FMath.cpp +++ b/Src/Utils/FMath.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FMath.hpp" diff --git a/Src/Utils/FMath.hpp b/Src/Utils/FMath.hpp index 4f47105db..afed00ee7 100644 --- a/Src/Utils/FMath.hpp +++ b/Src/Utils/FMath.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FMATH_HPP #define FMATH_HPP diff --git a/Src/Utils/FMemStats.cpp b/Src/Utils/FMemStats.cpp index 339e533c8..ff2c4205a 100644 --- a/Src/Utils/FMemStats.cpp +++ b/Src/Utils/FMemStats.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FMemStats.h" diff --git a/Src/Utils/FMemStats.h b/Src/Utils/FMemStats.h index f4bcb84b6..b4dc2c4d9 100644 --- a/Src/Utils/FMemStats.h +++ b/Src/Utils/FMemStats.h @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FMEMSTATS_H #define FMEMSTATS_H diff --git a/Src/Utils/FMemUtils.hpp b/Src/Utils/FMemUtils.hpp index 56b804a12..42dd1da2a 100644 --- a/Src/Utils/FMemUtils.hpp +++ b/Src/Utils/FMemUtils.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FMEMUTILS_HPP #define FMEMUTILS_HPP @@ -74,6 +69,14 @@ namespace FMemUtils { dest[idx] = source[idx]; } } + + /** Delete all */ + template <class TypeClass> + void DeleteAll(TypeClass*const array[], const int size){ + for(int idx = 0 ; idx < size ; ++idx){ + delete[] array[idx]; + } + } } #endif // FMEMUTILS_HPP diff --git a/Src/Utils/FMpi.hpp b/Src/Utils/FMpi.hpp index f360a9018..aad83ac0b 100644 --- a/Src/Utils/FMpi.hpp +++ b/Src/Utils/FMpi.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FMPI_HPP #define FMPI_HPP diff --git a/Src/Utils/FNoCopyable.hpp b/Src/Utils/FNoCopyable.hpp index d524f0fbe..bb5ca6093 100644 --- a/Src/Utils/FNoCopyable.hpp +++ b/Src/Utils/FNoCopyable.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FNOCOPYABLE_HPP #define FNOCOPYABLE_HPP diff --git a/Src/Utils/FOmpBarrier.hpp b/Src/Utils/FOmpBarrier.hpp index b46aca20d..7b5c4f7f4 100644 --- a/Src/Utils/FOmpBarrier.hpp +++ b/Src/Utils/FOmpBarrier.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FOMPBARRIER_HPP #define FOMPBARRIER_HPP diff --git a/Src/Utils/FParameters.hpp b/Src/Utils/FParameters.hpp index 646b12b2c..d870d4622 100644 --- a/Src/Utils/FParameters.hpp +++ b/Src/Utils/FParameters.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FPARAMETERS_H #define FPARAMETERS_H diff --git a/Src/Utils/FQuickSort.hpp b/Src/Utils/FQuickSort.hpp index 1aca9d1a6..f7c03f506 100644 --- a/Src/Utils/FQuickSort.hpp +++ b/Src/Utils/FQuickSort.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FQUICKSORT_HPP #define FQUICKSORT_HPP diff --git a/Src/Utils/FSpherical.hpp b/Src/Utils/FSpherical.hpp index e1f452919..d62829832 100644 --- a/Src/Utils/FSpherical.hpp +++ b/Src/Utils/FSpherical.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FSPHERICAL_HPP #define FSPHERICAL_HPP diff --git a/Src/Utils/FTic.cpp b/Src/Utils/FTic.cpp index 38801bd3f..b2e539297 100644 --- a/Src/Utils/FTic.cpp +++ b/Src/Utils/FTic.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FTic.hpp" diff --git a/Src/Utils/FTic.hpp b/Src/Utils/FTic.hpp index 5315e9a3f..f32125aba 100644 --- a/Src/Utils/FTic.hpp +++ b/Src/Utils/FTic.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTIC_HPP #define FTIC_HPP diff --git a/Src/Utils/FTrace.cpp b/Src/Utils/FTrace.cpp index 58721ff29..2678308ab 100644 --- a/Src/Utils/FTrace.cpp +++ b/Src/Utils/FTrace.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FTrace.hpp" #ifdef SCALFMM_USE_TRACE diff --git a/Src/Utils/FTrace.hpp b/Src/Utils/FTrace.hpp index bd59d5918..c43a482bb 100644 --- a/Src/Utils/FTrace.hpp +++ b/Src/Utils/FTrace.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTRACE_HPP #define FTRACE_HPP diff --git a/Tests/testDebug.cpp b/Tests/testDebug.cpp index a3121d715..70df84f33 100644 --- a/Tests/testDebug.cpp +++ b/Tests/testDebug.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "../Src/Utils/FDebug.hpp" diff --git a/Tests/testFmbAlgorithm.cpp b/Tests/testFmbAlgorithm.cpp index f3ceeb15e..c681a57c9 100644 --- a/Tests/testFmbAlgorithm.cpp +++ b/Tests/testFmbAlgorithm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> @@ -28,8 +23,10 @@ #include "../Src/Core/FFmmAlgorithm.hpp" #include "../Src/Core/FFmmAlgorithmThread.hpp" -#include "../Src/Fmb/FFmbKernels.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" +#include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" +#include "../Src/Components/FSimpleLeaf.hpp" #include "../Src/Files/FFmaLoader.hpp" @@ -43,19 +40,19 @@ // Simply create particles and try the kernels int main(int argc, char ** argv){ - typedef FmbParticle ParticleClass; - typedef FmbCell CellClass; - typedef FVector<ParticleClass> ContainerClass; + typedef FSphericalParticle ParticleClass; + typedef FSphericalCell CellClass; + typedef FVector<ParticleClass> ContainerClass; typedef FSimpleLeaf<ParticleClass, ContainerClass > LeafClass; typedef FOctree<ParticleClass, CellClass, ContainerClass , LeafClass > OctreeClass; - typedef FFmbKernels<ParticleClass, CellClass, ContainerClass > KernelClass; + typedef FSphericalKernel<ParticleClass, CellClass, ContainerClass > KernelClass; typedef FFmmAlgorithm<OctreeClass, ParticleClass, CellClass, ContainerClass, KernelClass, LeafClass > FmmClass; ///////////////////////What we do///////////////////////////// std::cout << ">> This executable has to be used to test fmb algorithm.\n"; ////////////////////////////////////////////////////////////// - + const int DevP = FParameters::getValue(argc,argv,"-p", 8); const int NbLevels = FParameters::getValue(argc,argv,"-h", 5); const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3); FTic counter; @@ -70,7 +67,7 @@ int main(int argc, char ** argv){ } // ----------------------------------------------------- - + CellClass::Init(DevP); OctreeClass tree(NbLevels, SizeSubLevels, loader.getBoxWidth(), loader.getCenterOfBox()); // ----------------------------------------------------- @@ -95,7 +92,7 @@ int main(int argc, char ** argv){ std::cout << "Working on particles ..." << std::endl; counter.tic(); - KernelClass kernels(NbLevels,loader.getBoxWidth()); + KernelClass kernels(DevP, NbLevels,loader.getBoxWidth()); FmmClass algo(&tree,&kernels); algo.execute(); diff --git a/Tests/testFmbAlgorithmProc.cpp b/Tests/testFmbAlgorithmProc.cpp index 861487d6b..7b2d804a7 100644 --- a/Tests/testFmbAlgorithmProc.cpp +++ b/Tests/testFmbAlgorithmProc.cpp @@ -1,30 +1,24 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "../Src/Utils/FTic.hpp" #include "../Src/Utils/FMpi.hpp" -#include "../Src/Utils/FAbstractSendable.hpp" #include "../Src/Utils/FParameters.hpp" #include "../Src/Containers/FOctree.hpp" #include "../Src/Containers/FVector.hpp" -#include "../Src/Fmb/FExtendFmbCell.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" -#include "../Src/Fmb/FFmbKernels.hpp" +#include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" #include "../Src/Core/FFmmAlgorithmThreadProc.hpp" #include "../Src/Core/FFmmAlgorithmThread.hpp" @@ -53,11 +47,11 @@ // to test equality between good and potentialy bad solution /////////////////////////////////////////////////////// /** To compare data */ -bool isEqualPole(const FmbSendableCell& me, const FmbSendableCell& other, FReal*const cumul){ +bool isEqualPole(const FSphericalCell& me, const FSphericalCell& other, FReal*const cumul){ //return memcmp(multipole_exp, other.multipole_exp, sizeof(FComplexe)*MultipoleSize) == 0 && // memcmp(local_exp, other.local_exp, sizeof(FComplexe)*MultipoleSize) == 0; *cumul = 0.0; - for(int idx = 0; idx < FExtendFmbCell::MultipoleSize; ++idx){ + for(int idx = 0; idx < FSphericalCell::GetPoleSize(); ++idx){ *cumul += FMath::Abs( me.getMultipole()[idx].getImag() - other.getMultipole()[idx].getImag() ); *cumul += FMath::Abs( me.getMultipole()[idx].getReal() - other.getMultipole()[idx].getReal() ); } @@ -66,11 +60,11 @@ bool isEqualPole(const FmbSendableCell& me, const FmbSendableCell& other, FReal* } /** To compare data */ -bool isEqualLocal(const FmbSendableCell& me, const FmbSendableCell& other, FReal*const cumul){ +bool isEqualLocal(const FSphericalCell& me, const FSphericalCell& other, FReal*const cumul){ //return memcmp(multipole_exp, other.multipole_exp, sizeof(FComplexe)*MultipoleSize) == 0 && // memcmp(local_exp, other.local_exp, sizeof(FComplexe)*MultipoleSize) == 0; *cumul = 0.0; - for(int idx = 0; idx < FExtendFmbCell::MultipoleSize; ++idx){ + for(int idx = 0; idx < FSphericalCell::GetLocalSize(); ++idx){ *cumul += FMath::Abs( me.getLocal()[idx].getImag() - other.getLocal()[idx].getImag() ); *cumul += FMath::Abs( me.getLocal()[idx].getReal() - other.getLocal()[idx].getReal() ); } @@ -103,10 +97,10 @@ void ValidateFMMAlgoProc(OctreeClass* const badTree, } else{ FReal cumul; - if( !octreeIterator.getCurrentCell()->isEqualPole(*octreeIteratorValide.getCurrentCell(),&cumul) ){ + if( !isEqualPole(*octreeIterator.getCurrentCell(),*octreeIteratorValide.getCurrentCell(),&cumul) ){ std::cout << "Pole Data are different." << " Cumul " << cumul << std::endl; } - if( !octreeIterator.getCurrentCell()->isEqualLocal(*octreeIteratorValide.getCurrentCell(),&cumul) ){ + if( !isEqualLocal(*octreeIterator.getCurrentCell(),*octreeIteratorValide.getCurrentCell(),&cumul) ){ std::cout << "Local Data are different." << " Cumul " << cumul << std::endl; } } @@ -175,13 +169,13 @@ void ValidateFMMAlgoProc(OctreeClass* const badTree, // Simply create particles and try the kernels int main(int argc, char ** argv){ - typedef FmbParticle ParticleClass; - typedef FmbSendableCell CellClass; - typedef FVector<ParticleClass> ContainerClass; + typedef FSphericalParticle ParticleClass; + typedef FSendableSphericalCell CellClass; + typedef FVector<ParticleClass> ContainerClass; typedef FSimpleLeaf<ParticleClass, ContainerClass > LeafClass; typedef FOctree<ParticleClass, CellClass, ContainerClass , LeafClass > OctreeClass; - typedef FFmbKernels<ParticleClass, CellClass, ContainerClass > KernelClass; + typedef FSphericalKernel<ParticleClass, CellClass, ContainerClass > KernelClass; typedef FFmmAlgorithmThreadProc<OctreeClass, ParticleClass, CellClass, ContainerClass, KernelClass, LeafClass > FmmClass; typedef FFmmAlgorithmThread<OctreeClass, ParticleClass, CellClass, ContainerClass, KernelClass, LeafClass > FmmClassNoProc; @@ -191,6 +185,7 @@ int main(int argc, char ** argv){ FMpi app( argc, argv); + const int DevP = FParameters::getValue(argc,argv,"-p", 8); const int NbLevels = FParameters::getValue(argc,argv,"-h", 5); const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3); FTic counter; @@ -205,7 +200,7 @@ int main(int argc, char ** argv){ } // ----------------------------------------------------- - + CellClass::Init(DevP); OctreeClass tree(NbLevels, SizeSubLevels,loader.getBoxWidth(),loader.getCenterOfBox()); // ----------------------------------------------------- @@ -244,7 +239,7 @@ int main(int argc, char ** argv){ std::cout << "Working on particles ..." << std::endl; counter.tic(); - KernelClass kernels(NbLevels,loader.getBoxWidth()); + KernelClass kernels(DevP, NbLevels,loader.getBoxWidth()); FmmClass algo(app.global(),&tree,&kernels); algo.execute(); diff --git a/Tests/testFmbBlasAlgorithm.cpp b/Tests/testFmbBlasAlgorithm.cpp index 2427e3160..793b16f72 100644 --- a/Tests/testFmbBlasAlgorithm.cpp +++ b/Tests/testFmbBlasAlgorithm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> @@ -30,11 +25,10 @@ #include "../Src/Components/FSimpleLeaf.hpp" -#include "../Src/Fmb/FFmbKernelsBlockBlas.hpp" -#include "../Src/Fmb/FFmbKernelsBlas.hpp" -#include "../Src/Fmb/FFmbKernels.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" +#include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalBlasKernel.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" #include "../Src/Files/FFmaScanfLoader.hpp" @@ -47,19 +41,19 @@ // Simply create particles and try the kernels int main(int argc, char ** argv){ - typedef FmbParticle ParticleClass; - typedef FmbCell CellClass; - typedef FVector<ParticleClass> ContainerClass; + typedef FSphericalParticle ParticleClass; + typedef FSphericalCell CellClass; + typedef FVector<ParticleClass> ContainerClass; typedef FSimpleLeaf<ParticleClass, ContainerClass > LeafClass; typedef FOctree<ParticleClass, CellClass, ContainerClass , LeafClass > OctreeClass; - typedef FFmbKernelsBlockBlas<ParticleClass, CellClass, ContainerClass > KernelClass; + typedef FSphericalBlasKernel<ParticleClass, CellClass, ContainerClass > KernelClass; typedef FFmmAlgorithm<OctreeClass, ParticleClass, CellClass, ContainerClass, KernelClass, LeafClass > FmmClass; ///////////////////////What we do///////////////////////////// std::cout << ">> This executable has to be used to test fmb algorithm.\n"; ////////////////////////////////////////////////////////////// - + const int DevP = FParameters::getValue(argc,argv,"-p", 8); const int NbLevels = FParameters::getValue(argc,argv,"-h", 5); const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3); FTic counter; @@ -74,7 +68,7 @@ int main(int argc, char ** argv){ } // ----------------------------------------------------- - + CellClass::Init(DevP); OctreeClass tree(NbLevels, SizeSubLevels,loader.getBoxWidth(),loader.getCenterOfBox()); // ----------------------------------------------------- @@ -99,7 +93,7 @@ int main(int argc, char ** argv){ std::cout << "Working on particles ..." << std::endl; counter.tic(); - KernelClass kernels(NbLevels,loader.getBoxWidth()); + KernelClass kernels(DevP, NbLevels, loader.getBoxWidth()); FmmClass algo(&tree,&kernels); algo.execute(); diff --git a/Tests/testFmbEwalAlgorithm.cpp b/Tests/testFmbEwalAlgorithm.cpp index ef558d327..4c1352b40 100644 --- a/Tests/testFmbEwalAlgorithm.cpp +++ b/Tests/testFmbEwalAlgorithm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> @@ -27,16 +22,17 @@ #include "../Src/Core/FFmmAlgorithmPeriodic.hpp" -#include "../Src/Kernels/FSphericalCell.hpp" #include "../Src/Kernels/FSphericalKernel.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" #include "../Src/Files/FEwalLoader.hpp" +#include "../Src/Components/FSimpleLeaf.hpp" /** Ewal particle is used in the gadget program * here we try to make the same simulation */ -class EwalParticle : public FmbParticle { +class EwalParticle : public FSphericalParticle { public: // Type of particle enum Type{ @@ -75,7 +71,7 @@ public: // Simply create particles and try the kernels int main(int argc, char ** argv){ typedef EwalParticle ParticleClass; - typedef FSphericalCell CellClass; + typedef FSphericalCell CellClass; typedef FVector<ParticleClass> ContainerClass; typedef FSimpleLeaf<ParticleClass, ContainerClass > LeafClass; diff --git a/Tests/testFmbGalaxyCsv.cpp b/Tests/testFmbGalaxyCsv.cpp index 8b9b66a7f..284835ee9 100644 --- a/Tests/testFmbGalaxyCsv.cpp +++ b/Tests/testFmbGalaxyCsv.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> @@ -30,7 +25,7 @@ #include "../Src/Kernels/FSphericalKernel.hpp" #include "../Src/Kernels/FSphericalCell.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" #include "../Src/Extensions/FExtendVelocity.hpp" @@ -38,8 +33,9 @@ #include "../Src/Files/FFmaLoader.hpp" #include "../Src/Arranger/FOctreeArranger.hpp" +#include "../Src/Components/FSimpleLeaf.hpp" -class FmbVeloParticle : public FmbParticle, public FExtendVelocity { +class FmmVeloParticle : public FSphericalParticle, public FExtendVelocity { }; template <class ParticleClass> @@ -72,8 +68,8 @@ public: // Simply create particles and try the kernels int main(int argc, char ** argv){ - typedef FmbVeloParticle ParticleClass; - typedef FSphericalCell CellClass; + typedef FmmVeloParticle ParticleClass; + typedef FSphericalCell CellClass; typedef FVector<ParticleClass> ContainerClass; typedef FSimpleLeaf<ParticleClass, ContainerClass > LeafClass; diff --git a/Tests/testFmbRotation.cpp b/Tests/testFmbRotation.cpp new file mode 100644 index 000000000..0a6ac6d76 --- /dev/null +++ b/Tests/testFmbRotation.cpp @@ -0,0 +1,127 @@ +// =================================================================================== +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. +// =================================================================================== + +#include <iostream> + +#include <cstdio> +#include <cstdlib> + +#include "../Src/Utils/FTic.hpp" +#include "../Src/Utils/FParameters.hpp" + +#include "../Src/Containers/FOctree.hpp" +#include "../Src/Containers/FVector.hpp" + +#include "../Src/Core/FFmmAlgorithm.hpp" +#include "../Src/Core/FFmmAlgorithmThread.hpp" + +#include "../Src/Components/FSimpleLeaf.hpp" + +#include "../Src/Kernels/FSphericalRotationKernel.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" + +#include "../Src/Files/FFmaScanfLoader.hpp" + +/** This program show an example of use of + * the fmm basic algo + * it also check that eachh particles is little or longer + * related that each other + */ + + +// Simply create particles and try the kernels +int main(int argc, char ** argv){ + typedef FSphericalParticle ParticleClass; + typedef FSphericalCell CellClass; + typedef FVector<ParticleClass> ContainerClass; + + typedef FSimpleLeaf<ParticleClass, ContainerClass > LeafClass; + typedef FOctree<ParticleClass, CellClass, ContainerClass , LeafClass > OctreeClass; + typedef FSphericalRotationKernel<ParticleClass, CellClass, ContainerClass > KernelClass; + + typedef FFmmAlgorithm<OctreeClass, ParticleClass, CellClass, ContainerClass, KernelClass, LeafClass > FmmClass; + ///////////////////////What we do///////////////////////////// + std::cout << ">> This executable has to be used to test fmb algorithm.\n"; + ////////////////////////////////////////////////////////////// + const int DevP = FParameters::getValue(argc,argv,"-p", 8); + const int NbLevels = FParameters::getValue(argc,argv,"-h", 5); + const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3); + FTic counter; + + const char* const filename = FParameters::getStr(argc,argv,"-f", "../Data/test20k.fma"); + std::cout << "Opening : " << filename << "\n"; + + FFmaScanfLoader<ParticleClass> loader(filename); + if(!loader.isOpen()){ + std::cout << "Loader Error, " << filename << " is missing\n"; + return 1; + } + + // ----------------------------------------------------- + CellClass::Init(DevP); + OctreeClass tree(NbLevels, SizeSubLevels,loader.getBoxWidth(),loader.getCenterOfBox()); + + // ----------------------------------------------------- + + std::cout << "Creating & Inserting " << loader.getNumberOfParticles() << " particles ..." << std::endl; + std::cout << "\tHeight : " << NbLevels << " \t sub-height : " << SizeSubLevels << std::endl; + counter.tic(); + + { + ParticleClass particleToFill; + for(int idxPart = 0 ; idxPart < loader.getNumberOfParticles() ; ++idxPart){ + loader.fillParticle(particleToFill); + tree.insert(particleToFill); + } + } + + counter.tac(); + std::cout << "Done " << "(@Creating and Inserting Particles = " << counter.elapsed() << "s)." << std::endl; + + // ----------------------------------------------------- + + std::cout << "Working on particles ..." << std::endl; + counter.tic(); + + KernelClass kernels(DevP, NbLevels, loader.getBoxWidth()); + + FmmClass algo(&tree,&kernels); + algo.execute(); + + counter.tac(); + std::cout << "Done " << "(@Algorithm = " << counter.elapsed() << "s)." << std::endl; + + { // get sum forces&potential + FReal potential = 0; + F3DPosition forces; + typename OctreeClass::Iterator octreeIterator(&tree); + octreeIterator.gotoBottomLeft(); + do{ + typename ContainerClass::ConstBasicIterator iter(*octreeIterator.getCurrentListTargets()); + while( iter.hasNotFinished() ){ + potential += iter.data().getPotential() * iter.data().getPhysicalValue(); + forces += iter.data().getForces(); + + iter.gotoNext(); + } + } while(octreeIterator.moveRight()); + + std::cout << "Foces Sum x = " << forces.getX() << " y = " << forces.getY() << " z = " << forces.getZ() << std::endl; + std::cout << "Potential = " << potential << std::endl; + } + + return 0; +} + + + + diff --git a/Tests/testFmbTsmAlgorithm.cpp b/Tests/testFmbTsmAlgorithm.cpp index e4f0cdd69..4cba5ca4a 100644 --- a/Tests/testFmbTsmAlgorithm.cpp +++ b/Tests/testFmbTsmAlgorithm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> @@ -29,8 +24,9 @@ #include "../Src/Core/FFmmAlgorithmTsm.hpp" -#include "../Src/Fmb/FFmbKernels.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" +#include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" #include "../Src/Files/FFmaTsmLoader.hpp" @@ -43,19 +39,19 @@ // Simply create particles and try the kernels int main(int argc, char ** argv){ - typedef FmbTypedParticle ParticleClass; - typedef FmbTypedCell CellClass; - typedef FVector<ParticleClass> ContainerClass; + typedef FTypedSphericalParticle ParticleClass; + typedef FTypedSphericalCell CellClass; + typedef FVector<ParticleClass> ContainerClass; typedef FTypedLeaf<ParticleClass, ContainerClass > LeafClass; typedef FOctree<ParticleClass, CellClass, ContainerClass , LeafClass > OctreeClass; - typedef FFmbKernels<ParticleClass, CellClass, ContainerClass > KernelClass; + typedef FSphericalKernel<ParticleClass, CellClass, ContainerClass > KernelClass; typedef FFmmAlgorithmTsm<OctreeClass, ParticleClass, CellClass, ContainerClass, KernelClass, LeafClass > FmmClass; ///////////////////////What we do///////////////////////////// std::cout << ">> This executable has to be used to test Fmb on a Tsm system.\n"; ////////////////////////////////////////////////////////////// - + const int DevP = FParameters::getValue(argc,argv,"-p", 8); const int NbLevels = FParameters::getValue(argc,argv,"-h", 5); const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3); FTic counter; @@ -70,7 +66,7 @@ int main(int argc, char ** argv){ } // ----------------------------------------------------- - + CellClass::Init(DevP); OctreeClass tree(NbLevels, SizeSubLevels,loader.getBoxWidth(),loader.getCenterOfBox()); // ----------------------------------------------------- @@ -95,7 +91,7 @@ int main(int argc, char ** argv){ std::cout << "Working on particles ..." << std::endl; counter.tic(); - KernelClass kernels(NbLevels,loader.getBoxWidth()); + KernelClass kernels(DevP, NbLevels, loader.getBoxWidth()); FmmClass algo(&tree,&kernels); algo.execute(); diff --git a/Tests/testFmbTsmNoTsm.cpp b/Tests/testFmbTsmNoTsm.cpp index b30b0d2d0..01f43ad70 100644 --- a/Tests/testFmbTsmNoTsm.cpp +++ b/Tests/testFmbTsmNoTsm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> @@ -25,9 +20,9 @@ #include "../Src/Containers/FOctree.hpp" #include "../Src/Containers/FVector.hpp" -#include "../Src/Fmb/FExtendFmbCell.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" -#include "../Src/Fmb/FFmbKernels.hpp" +#include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" #include "../Src/Core/FFmmAlgorithm.hpp" #include "../Src/Core/FFmmAlgorithmTsm.hpp" @@ -47,23 +42,23 @@ // Simply create particles and try the kernels int main(int argc, char ** argv){ - typedef FmbParticle ParticleClass; - typedef FmbCell CellClass; - typedef FVector<ParticleClass> ContainerClass; + typedef FSphericalParticle ParticleClass; + typedef FSphericalCell CellClass; + typedef FVector<ParticleClass> ContainerClass; typedef FSimpleLeaf<ParticleClass, ContainerClass > LeafClass; typedef FOctree<ParticleClass, CellClass, ContainerClass , LeafClass > OctreeClass; - typedef FFmbKernels<ParticleClass, CellClass, ContainerClass > KernelClass; + typedef FSphericalKernel<ParticleClass, CellClass, ContainerClass > KernelClass; typedef FFmmAlgorithmThread<OctreeClass, ParticleClass, CellClass, ContainerClass, KernelClass, LeafClass > FmmClass; - typedef FmbTypedParticle ParticleClassTyped; - typedef FmbTypedCell CellClassTyped; + typedef FTypedSphericalParticle ParticleClassTyped; + typedef FTypedSphericalCell CellClassTyped; typedef FVector<ParticleClassTyped> ContainerClassTyped; typedef FTypedLeaf<ParticleClassTyped, ContainerClassTyped > LeafClassTyped; typedef FOctree<ParticleClassTyped, CellClassTyped, ContainerClassTyped , LeafClassTyped > OctreeClassTyped; - typedef FFmbKernels<ParticleClassTyped, CellClassTyped, ContainerClassTyped > KernelClassTyped; + typedef FSphericalKernel<ParticleClassTyped, CellClassTyped, ContainerClassTyped > KernelClassTyped; typedef FFmmAlgorithmThreadTsm<OctreeClassTyped, ParticleClassTyped, CellClassTyped, ContainerClassTyped, KernelClassTyped, LeafClassTyped > FmmClassTyped; @@ -71,7 +66,7 @@ int main(int argc, char ** argv){ std::cout << ">> This executable has to be used to test Fmb on a Tsm system.\n"; std::cout << ">> It compares the results between Tms and no Tms (except P2P & L2P).\n"; ////////////////////////////////////////////////////////////// - + const int DevP = FParameters::getValue(argc,argv,"-p", 8); const int NbLevels = FParameters::getValue(argc,argv,"-h", 5); const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3); FTic counter; @@ -82,6 +77,8 @@ int main(int argc, char ** argv){ // ----------------------------------------------------- + CellClass::Init(DevP); + OctreeClass tree(NbLevels, SizeSubLevels,BoxWidth,CenterOfBox); OctreeClassTyped treeTyped(NbLevels, SizeSubLevels,BoxWidth,CenterOfBox); @@ -123,8 +120,8 @@ int main(int argc, char ** argv){ std::cout << "Working on particles ..." << std::endl; counter.tic(); - KernelClass kernels(NbLevels,BoxWidth); - KernelClassTyped kernelsTyped(NbLevels,BoxWidth); + KernelClass kernels(DevP, NbLevels, BoxWidth); + KernelClassTyped kernelsTyped(DevP, NbLevels, BoxWidth); FmmClass algo(&tree,&kernels); FmmClassTyped algoTyped(&treeTyped,&kernelsTyped); @@ -153,7 +150,7 @@ int main(int argc, char ** argv){ do{ bool poleDiff = false; bool localDiff = false; - for(int idxValues = 0 ; idxValues < FExtendFmbCell::MultipoleSize && !(poleDiff && localDiff); ++idxValues){ + for(int idxValues = 0 ; idxValues < FSphericalCell::GetPoleSize() && !(poleDiff && localDiff); ++idxValues){ const FComplexe pole = octreeIterator.getCurrentCell()->getMultipole()[idxValues]; const FComplexe poleTyped = octreeIteratorTyped.getCurrentCell()->getMultipole()[idxValues]; if(!FMath::LookEqual(pole.getImag(),poleTyped.getImag()) || !FMath::LookEqual(pole.getReal(),poleTyped.getReal())){ @@ -161,6 +158,8 @@ int main(int argc, char ** argv){ printf("Pole diff imag( %.15e , %.15e ) real( %.15e , %.15e)\n", pole.getImag(),poleTyped.getImag(),pole.getReal(),poleTyped.getReal()); } + } + for(int idxValues = 0 ; idxValues < FSphericalCell::GetPoleSize() && !(poleDiff && localDiff); ++idxValues){ const FComplexe local = octreeIterator.getCurrentCell()->getLocal()[idxValues]; const FComplexe localTyped = octreeIteratorTyped.getCurrentCell()->getLocal()[idxValues]; if(!FMath::LookEqual(local.getImag(),localTyped.getImag()) || !FMath::LookEqual(local.getReal(),localTyped.getReal())){ diff --git a/Tests/testFmmAlgorithm.cpp b/Tests/testFmmAlgorithm.cpp index 64fbb48ca..84ea8dea5 100644 --- a/Tests/testFmmAlgorithm.cpp +++ b/Tests/testFmmAlgorithm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testFmmAlgorithmPeriodic.cpp b/Tests/testFmmAlgorithmPeriodic.cpp index 298ebf568..c43c71aab 100644 --- a/Tests/testFmmAlgorithmPeriodic.cpp +++ b/Tests/testFmmAlgorithmPeriodic.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== diff --git a/Tests/testFmmAlgorithmProc.cpp b/Tests/testFmmAlgorithmProc.cpp index 9e885ff76..90472cd0f 100644 --- a/Tests/testFmmAlgorithmProc.cpp +++ b/Tests/testFmmAlgorithmProc.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "../Src/Utils/FMpi.hpp" diff --git a/Tests/testFmmAlgorithmProcPeriodic.cpp b/Tests/testFmmAlgorithmProcPeriodic.cpp index a581f3785..880f88afa 100644 --- a/Tests/testFmmAlgorithmProcPeriodic.cpp +++ b/Tests/testFmmAlgorithmProcPeriodic.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== diff --git a/Tests/testFmmAlgorithmTsm.cpp b/Tests/testFmmAlgorithmTsm.cpp index 31d2d8450..ab4baccb7 100644 --- a/Tests/testFmmAlgorithmTsm.cpp +++ b/Tests/testFmmAlgorithmTsm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testFmmDemonstration.cpp b/Tests/testFmmDemonstration.cpp index ed79da83a..40f5cd117 100644 --- a/Tests/testFmmDemonstration.cpp +++ b/Tests/testFmmDemonstration.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testLoader.cpp b/Tests/testLoader.cpp index 24a4e3a00..8fb4adac2 100644 --- a/Tests/testLoader.cpp +++ b/Tests/testLoader.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testLoaderCreate.cpp b/Tests/testLoaderCreate.cpp index e776c7e92..168c1f2d6 100644 --- a/Tests/testLoaderCreate.cpp +++ b/Tests/testLoaderCreate.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testLoaderFMA.cpp b/Tests/testLoaderFMA.cpp index e417a6c6d..d02f7b578 100644 --- a/Tests/testLoaderFMA.cpp +++ b/Tests/testLoaderFMA.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testLoaderFMABinCreate.cpp b/Tests/testLoaderFMABinCreate.cpp index 7c043fa0a..2b6ba72db 100644 --- a/Tests/testLoaderFMABinCreate.cpp +++ b/Tests/testLoaderFMABinCreate.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testLoaderFMACreate.cpp b/Tests/testLoaderFMACreate.cpp index 5e9b8dfaf..ac4a1eae8 100644 --- a/Tests/testLoaderFMACreate.cpp +++ b/Tests/testLoaderFMACreate.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testLoaderFMACreateSphere.cpp b/Tests/testLoaderFMACreateSphere.cpp index 06ec55c74..a67aa7a65 100644 --- a/Tests/testLoaderFMACreateSphere.cpp +++ b/Tests/testLoaderFMACreateSphere.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testLoaderFMATsm.cpp b/Tests/testLoaderFMATsm.cpp index bf4ab675e..599ee4186 100644 --- a/Tests/testLoaderFMATsm.cpp +++ b/Tests/testLoaderFMATsm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testLoaderFMATsmCreate.cpp b/Tests/testLoaderFMATsmCreate.cpp index b9f2e3eb5..5e51c9292 100644 --- a/Tests/testLoaderFMATsmCreate.cpp +++ b/Tests/testLoaderFMATsmCreate.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testMemStats.cpp b/Tests/testMemStats.cpp index bf2e91622..f58a4a7a2 100644 --- a/Tests/testMemStats.cpp +++ b/Tests/testMemStats.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testMortonIndex.cpp b/Tests/testMortonIndex.cpp index 84b5f055d..8f78f7163 100644 --- a/Tests/testMortonIndex.cpp +++ b/Tests/testMortonIndex.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testOctree.cpp b/Tests/testOctree.cpp index f276a8be0..139c093e6 100644 --- a/Tests/testOctree.cpp +++ b/Tests/testOctree.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testOctreeIter.cpp b/Tests/testOctreeIter.cpp index 7d7c8173d..50d5d918f 100644 --- a/Tests/testOctreeIter.cpp +++ b/Tests/testOctreeIter.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testOctreePrintMorton.cpp b/Tests/testOctreePrintMorton.cpp index 25ee82033..eca795ee1 100644 --- a/Tests/testOctreePrintMorton.cpp +++ b/Tests/testOctreePrintMorton.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testOctreeRearrange.cpp b/Tests/testOctreeRearrange.cpp index a6a805ffe..b3a5bb90b 100644 --- a/Tests/testOctreeRearrange.cpp +++ b/Tests/testOctreeRearrange.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testOctreeRearrangeProc.cpp b/Tests/testOctreeRearrangeProc.cpp index 50dc14366..9011a9221 100644 --- a/Tests/testOctreeRearrangeProc.cpp +++ b/Tests/testOctreeRearrangeProc.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testStatsTree.cpp b/Tests/testStatsTree.cpp index 8b1101081..bb199b8b3 100644 --- a/Tests/testStatsTree.cpp +++ b/Tests/testStatsTree.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/Tests/testTic.cpp b/Tests/testTic.cpp index 27e165b90..525892311 100644 --- a/Tests/testTic.cpp +++ b/Tests/testTic.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> #include "../Src/Utils/FTic.hpp" diff --git a/Tests/testTreeIO.cpp b/Tests/testTreeIO.cpp index 27012041f..5303f5c79 100644 --- a/Tests/testTreeIO.cpp +++ b/Tests/testTreeIO.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include <iostream> diff --git a/UTests/FUTester.hpp b/UTests/FUTester.hpp index a4ee9adf3..4424e9aca 100644 --- a/UTests/FUTester.hpp +++ b/UTests/FUTester.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef UTESTER_HPP #define UTESTER_HPP diff --git a/UTests/utestBoolArray.cpp b/UTests/utestBoolArray.cpp index 49be6dc93..f7b2e2f07 100644 --- a/UTests/utestBoolArray.cpp +++ b/UTests/utestBoolArray.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" diff --git a/UTests/utestFmb.cpp b/UTests/utestFmb.cpp index 22e09aabb..11a1ee18d 100644 --- a/UTests/utestFmb.cpp +++ b/UTests/utestFmb.cpp @@ -1,26 +1,20 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "../Src/Containers/FOctree.hpp" #include "../Src/Containers/FVector.hpp" #include "../Src/Kernels/FSphericalCell.hpp" #include "../Src/Kernels/FSphericalKernel.hpp" - -#include "../Src/Fmb/FFmbKernels.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" +#include "../Src/Components/FSimpleLeaf.hpp" #include "../Src/Files/FFmaBinLoader.hpp" #include "../Src/Files/FTreeIO.hpp" @@ -35,7 +29,7 @@ */ /** The result of a previous simulation has been saved and will be oponed */ -class FmbParticleSerial : public FmbParticle, public FTreeIO::FAbstractSerial { +class ParticleSerial : public FSphericalParticle, public FTreeIO::FAbstractSerial { public: void write(std::ofstream*const stream) const{ save(stream, getPosition().getX()); @@ -68,21 +62,20 @@ public: class ComputeCellSerial : public FSphericalCell, public FTreeIO::FAbstractSerial { public: void write(std::ofstream*const stream) const{ - saveArray(stream, FSphericalCell::getMultipole(), FSphericalCell::ExpP); - saveArray(stream, FSphericalCell::getLocal(), FSphericalCell::ExpP); + saveArray(stream, FSphericalCell::getMultipole(), FSphericalCell::GetPoleSize()); + saveArray(stream, FSphericalCell::getLocal(), FSphericalCell::GetLocalSize()); } void read(std::ifstream*const stream){ - restoreArray(stream, FSphericalCell::getMultipole(), FSphericalCell::ExpP); - restoreArray(stream, FSphericalCell::getLocal(), FSphericalCell::ExpP); + restoreArray(stream, FSphericalCell::getMultipole(), FSphericalCell::GetPoleSize()); + restoreArray(stream, FSphericalCell::getLocal(), FSphericalCell::GetLocalSize()); } }; -typedef FmbParticleSerial ParticleClass; +typedef ParticleSerial ParticleClass; typedef ComputeCellSerial CellClass; typedef FVector<ParticleClass> ContainerClass; -//typedef FFmbKernels<ParticleClass, CellClass, ContainerClass > KernelClass; typedef FSphericalKernel<ParticleClass, CellClass, ContainerClass > KernelClass; typedef FSimpleLeaf<ParticleClass, ContainerClass > LeafClass; @@ -193,10 +186,10 @@ class TestFmb : public FUTester<TestFmb> { } assert( memcmp(testOctreeIterator.getCurrentCell()->getLocal(), - goodOctreeIterator.getCurrentCell()->getLocal(), CellClass::GetExp() * sizeof(FComplexe)) == 0); + goodOctreeIterator.getCurrentCell()->getLocal(), CellClass::GetLocalSize() * sizeof(FComplexe)) == 0); assert( memcmp(testOctreeIterator.getCurrentCell()->getMultipole(), - goodOctreeIterator.getCurrentCell()->getMultipole(),CellClass::GetExp() * sizeof(FComplexe)) == 0); + goodOctreeIterator.getCurrentCell()->getMultipole(),CellClass::GetPoleSize() * sizeof(FComplexe)) == 0); if(!testOctreeIterator.moveRight()){ if(goodOctreeIterator.moveRight()){ diff --git a/UTests/utestFmbDirect.cpp b/UTests/utestFmbDirect.cpp index ee4af0e20..2684f05a2 100644 --- a/UTests/utestFmbDirect.cpp +++ b/UTests/utestFmbDirect.cpp @@ -1,27 +1,22 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "../Src/Containers/FOctree.hpp" #include "../Src/Containers/FVector.hpp" -#include "../Src/Fmb/FFmbKernels.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" - #include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" +#include "../Src/Components/FSimpleLeaf.hpp" #include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalBlasKernel.hpp" #include "../Src/Files/FFmaBinLoader.hpp" #include "../Src/Files/FTreeIO.hpp" @@ -36,7 +31,7 @@ */ /** We need to know the position of the particle in the array */ -class IndexedParticle : public FmbParticle { +class IndexedParticle : public FSphericalParticle { int index; public: IndexedParticle(): index(-1){} @@ -52,12 +47,11 @@ public: class TestFmbDirect : public FUTester<TestFmbDirect> { typedef IndexedParticle ParticleClass; - //typedef FmbCell CellClass; typedef FSphericalCell CellClass; typedef FVector<ParticleClass> ContainerClass; - //typedef FFmbKernels<ParticleClass, CellClass, ContainerClass > KernelClass; - typedef FSphericalKernel<ParticleClass, CellClass, ContainerClass > KernelClass; + typedef FSphericalBlasKernel<ParticleClass, CellClass, ContainerClass > KernelClass; + //typedef FSphericalKernel<ParticleClass, CellClass, ContainerClass > KernelClass; typedef FSimpleLeaf<ParticleClass, ContainerClass > LeafClass; typedef FOctree<ParticleClass, CellClass, ContainerClass , LeafClass > OctreeClass; diff --git a/UTests/utestFmbDirectPeriodic.cpp b/UTests/utestFmbDirectPeriodic.cpp index 447ee7e78..927489efe 100644 --- a/UTests/utestFmbDirectPeriodic.cpp +++ b/UTests/utestFmbDirectPeriodic.cpp @@ -1,27 +1,21 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "../Src/Containers/FOctree.hpp" #include "../Src/Containers/FVector.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" - #include "../Src/Kernels/FSphericalCell.hpp" - #include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" +#include "../Src/Components/FSimpleLeaf.hpp" #include "../Src/Core/FFmmAlgorithmPeriodic.hpp" #include "FUTester.hpp" @@ -33,7 +27,7 @@ /* In this test we compare the fmm results and the direct results. */ -class IndexedParticle : public FmbParticle { +class IndexedParticle : public FSphericalParticle { int index; public: IndexedParticle(): index(-1){} @@ -135,16 +129,16 @@ class TestFmbDirectPeriodic : public FUTester<TestFmbDirectPeriodic> { } Print("Direct..."); - for(int idxTarget = 0 ; idxTarget < directNbPart ; idxTarget += 8){ + /*for(int idxTarget = 0 ; idxTarget < directNbPart ; idxTarget += 8){ for(int idxOther = idxTarget + 8 ; idxOther < directNbPart ; idxOther += 8){ kernels.directInteractionMutual(&particles[idxTarget], &particles[idxOther]); } - }//todo exchange - /*for(int idxTarget = 0 ; idxTarget < directNbPart ; ++idxTarget){ + }//todo exchange*/ + for(int idxTarget = 0 ; idxTarget < directNbPart ; ++idxTarget){ for(int idxOther = idxTarget + 1 ; idxOther < directNbPart ; ++idxOther){ kernels.directInteractionMutual(&particles[idxTarget], &particles[idxOther]); } - }*/ + } // Compare Print("Compute Diff..."); diff --git a/UTests/utestList.cpp b/UTests/utestList.cpp index e89f4643b..304320e3a 100644 --- a/UTests/utestList.cpp +++ b/UTests/utestList.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" diff --git a/UTests/utestMorton.cpp b/UTests/utestMorton.cpp index 0df8e6568..b945d0ca1 100644 --- a/UTests/utestMorton.cpp +++ b/UTests/utestMorton.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" diff --git a/UTests/utestOctree.cpp b/UTests/utestOctree.cpp index c7bd3736c..3f644f874 100644 --- a/UTests/utestOctree.cpp +++ b/UTests/utestOctree.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" diff --git a/UTests/utestParameters.cpp b/UTests/utestParameters.cpp index 599822234..5fde70a90 100644 --- a/UTests/utestParameters.cpp +++ b/UTests/utestParameters.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" diff --git a/UTests/utestQuicksort.cpp b/UTests/utestQuicksort.cpp index 6184139d3..a05ca002f 100644 --- a/UTests/utestQuicksort.cpp +++ b/UTests/utestQuicksort.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" #include "../Src/Utils/FQuickSort.hpp" diff --git a/UTests/utestTest.cpp b/UTests/utestTest.cpp index 843022430..40f7d9061 100644 --- a/UTests/utestTest.cpp +++ b/UTests/utestTest.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" diff --git a/UTests/utestVector.cpp b/UTests/utestVector.cpp index c5372d745..4d6d38877 100644 --- a/UTests/utestVector.cpp +++ b/UTests/utestVector.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" -- GitLab