From 5578d988b0f769bfd5b034e6bbfb67485ed32073 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 2 Oct 2014 16:48:18 -0400 Subject: [PATCH] update colvars module to the latest version from the git repo --- doc/PDF/colvars-refman-lammps.pdf | Bin 506078 -> 614297 bytes lib/colvars/Makefile.32-bit | 42 +- lib/colvars/Makefile.fermi | 42 +- lib/colvars/Makefile.g++ | 42 +- lib/colvars/Makefile.mingw32-cross | 42 +- lib/colvars/Makefile.mingw64-cross | 42 +- lib/colvars/colvar.cpp | 255 ++-- lib/colvars/colvar.h | 29 +- lib/colvars/colvaratoms.cpp | 220 ++-- lib/colvars/colvaratoms.h | 6 +- lib/colvars/colvarbias.cpp | 566 +-------- lib/colvars/colvarbias.h | 166 +-- lib/colvars/colvarbias_abf.cpp | 60 +- lib/colvars/colvarbias_abf.h | 2 + lib/colvars/colvarbias_alb.cpp | 42 +- lib/colvars/colvarbias_alb.h | 2 +- lib/colvars/colvarbias_meta.cpp | 73 +- lib/colvars/colvarbias_meta.h | 10 +- lib/colvars/colvarbias_restraint.cpp | 530 ++++++++ lib/colvars/colvarbias_restraint.h | 153 +++ lib/colvars/colvarcomp.cpp | 53 +- lib/colvars/colvarcomp.h | 44 +- lib/colvars/colvarcomp_angles.cpp | 18 +- lib/colvars/colvarcomp_coordnums.cpp | 4 +- lib/colvars/colvarcomp_distances.cpp | 98 +- lib/colvars/colvarcomp_protein.cpp | 7 +- lib/colvars/colvarcomp_rotations.cpp | 59 +- lib/colvars/colvargrid.cpp | 2 +- lib/colvars/colvargrid.h | 406 ++++--- lib/colvars/colvarmodule.cpp | 1480 +++++++++-------------- lib/colvars/colvarmodule.h | 155 ++- lib/colvars/colvarparse.cpp | 51 +- lib/colvars/colvarparse.h | 9 +- lib/colvars/colvarproxy.h | 87 +- lib/colvars/colvarscript.cpp | 301 +++++ lib/colvars/colvarscript.h | 49 + lib/colvars/colvartypes.cpp | 613 ++++++++++ lib/colvars/colvartypes.h | 29 +- lib/colvars/colvarvalue.cpp | 18 +- lib/colvars/colvarvalue.h | 27 +- src/USER-COLVARS/colvarproxy_lammps.cpp | 42 +- src/USER-COLVARS/colvarproxy_lammps.h | 17 +- 42 files changed, 3484 insertions(+), 2409 deletions(-) create mode 100644 lib/colvars/colvarbias_restraint.cpp create mode 100644 lib/colvars/colvarbias_restraint.h create mode 100644 lib/colvars/colvarscript.cpp create mode 100644 lib/colvars/colvarscript.h create mode 100644 lib/colvars/colvartypes.cpp diff --git a/doc/PDF/colvars-refman-lammps.pdf b/doc/PDF/colvars-refman-lammps.pdf index 24aa2aaf0a5b842c30f376612bb6faf829863471..07908cfdf663b0a579b89e258a3d85ba8779aa9d 100644 GIT binary patch delta 259492 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⪼x*9xp_lG?C8Z1>U zbHePq6D3F|_0Bfijh@Q6XWY%5mbsf53Cz2V<(xY(Xtt!_`?u~p9ge-FB^f3s`~phO z2Pbhi)MFs$eI6RR)riy^Y6mYQ95F9dBbH{Zz9YvX<|fT2ZC%H6V<}%`SHioyeR(fR zOAsrDId)!qrxU7r<$i_TP!5}B8ILh$BU<;G2p7>?Nq%9F=c6nRX&LOef6M5L}sL+ zj)@b0eYInmbj;<49XPgQwfw0BtCNmG_lnrKzDO$8%ToZEkz2QZwb(n0*OhtJABvXk zxzzi5*OxlI^+7p?M-4(;uF5Y;h!FSD5fA%yxss=un7a889*z9TTju}T?c~CzgIHd_ zW5%YuFH#N)5j1)S+Ze;=)X0-qa1U8EmHqyS`wVh~V@D_^1aU6P5sW&;7N91x|IO z$-_(n|HFef;R8GX2?0N0Mcdj3PhY}==kTE;6Swv;k-(Y8F#p3NH{p&N3G5Jo&lw?r z5kfQxf)BF-1HUj0oM|J$r~#++{AgbHfAUgjbOaOD6bZDF8IpnD!~(6!*$Fn~*b~|^ zn4MsMJ@y0#&Wpi;3o-=5fulqe!7ixTXl!gKdh{nru(Wfy8G^y>L=x@TMdnWA42?)y z@L+s$1`0eY);pocsH(d5@59tw*a^p}jh;$?#wy0#hJU9d!&C?Up_05`rr$PKnsKn? z#YeT*i1@{2F8&qW%W~rQAz3Zw%`(SEf`u)QW2EY~V197E>$K~yU$wr?U8ODfexk>4 z-^hnXJ@J4eC(nLPO=w8FXgkkrq{c9zLcKkwNrtjhEq-q|o!=8s@j(o(fu#o$ZVs@ljaDkTir%3;+EG?Ev z#<_g%k}+#E-r+jV`#1?AU&~YPR;9RAWJJd=%DQ8BfZO2Q@W9qJZ|aLNR)+D?D|HLa zdn<$Nl%@Hee|{KLl<9$??L+Fd+D{Z~w`q{3337F3>It-g&R-v9yd*SnES&1t5na+cyjM6*RCk%dzI#yV0!Xwp21$u zz~CC$A^8_~1fe;|%p$E%WF5Wk=F`GkPi_=>Vtmn+dNaIssb*%J)uq$VOe7a3H;W%U z`A{pza;;dSVE6WWyC8p2V)A3V-aT21OrEylr zxrLhXYKfUyMoBxx?Kg`iuYL1|H}U!Q!#kqOT1@WV3M~n~!PTO9n(N7hur_gf7xx10 zozEV(S9GVWd!^#lEcIi_iU9E*FY(VPw+#Yc*qR<4DSVyf?zh{*61^V#n)`Of6>I%p zXWEuZ3;%F)2{iBfRzkXw-)7>X53Mp-a?ZmujCG5xVOvex+scKT1qc%kxOSUANq=dWDFcU z3lFcc+{U|sU#e;WdvoS-{Ix^90|J8zHUbLAiuN}aV);`N72X)toD^shk4iiGQ>cI( z`}1D@dnIb1fMb>W0~QCtq$3Wkg9-X`8`Zw;S-MaBPFYtNB5Vy?saxcO<#*PI8JF+P z&b#}5qvXffC+D^oAzHaNcdRrvbUGdaovvO{s^oqc+7Uc7@T~Dl)y;ED{Vu+m$C+~K zlk>L=C%<|}a0_0olmBtLfL+t}z4RP@%hJ~e8+d$rWZK`U*1r$x_*UjS@OC#gW1!^& zR=z{JI7NNM6T_ux?~816xNR;8pW<1@gAzPSEv=bvdDW(p>PEF{E+LjYGCmjdcuvz7 zXp>R?)A`Ef1sBc~<2Ho7TdkPg=Vry(@6o*KR@$04rRE?MvRFZP^GV%JXCrqZPU+0s zFp#E`^jrT+v!R^Rfg~dzzFKuQKKaBYBW0@ux=NjIj0B}d;y#_E`uYX$Uh7z#`RZ5I zUVhP{X1UJ?yoIZ&(%rv?OMcrg32&f5Q)t4kbYZ7CoO3cXrT>=01ZWCy)W3wL06@^8 zCn(gy&=Z`vHTp=0q!Tu}{D%kYf}?%mLx2!i2ml2l7{USLSzylwd`=#Gg6IrKRLz8B zXu>nH>p!coLz90x0%S|DT?1e}utyUEey#!wjuTRZx8i`k;V9If1)H+}jHb;$3I@&o zNDR=JfDiM6$En~gny|*;EsWqtI>2eWGa%+sjZJ}Av|kE=1%u!TyMLy#$r>9y#{vB8 z2@(zV1c4be91KapnU;#E8MYOUiUj}`0PxIv;wBucN<&!88$V|LwYUj~W=#1U*#8ao zSOZQsdBh6?&TSi?%A4kMXn30+*aMyNhO+dUNiR#YQ`UUAw)SSWJfzUvvOTu#q7vB? z@2Qt$xuDYje8HYlpSLv$a`x+1*PA5$vZ>DB{i=hqr&(7V=^Y)e+)*9PeN)b-G@^y= z>VvLMOZ>*+RNY@cJ>=~8Oo~y9v07Y@qSW|(R`nbzPW+ni!K`|x-pQ5r%3^FT?^46? zBm5q5j;=$d)yuiI2^85upZf}Jg72*^+7^BC6Z>1Y2M#WV$F%ue#8s9w`rf#}(Z+ZqoLJXi<>cXtR9+@0X=?yiMH za3{Ds1b5fq65QP#f(Lj-y8E0?%RPP1yFVeU)T&i`*Pdg_H!xQ>)+w8vw4-Vkw!+~C zSA4_-Q7$D*pZrY~#m`_2MWQ=p4h&%HFa`1lt35Mh_d%p2)K$O6i!dt2zkI=n&xhwn ziMY?JQf8vU#}o`X`pfjInQ6y`Vw39uRU-^189QhJg_V-p zPyq-?(L_LI0ae(m=u@LHuycyw4EGH2vKQj76843%rARO_Hy{y~jmI>nG&fqg!hEe# z7krImHOgunF}x9XzLoo=yoDM|p`pWk6E3aSBNdwGRM&HNvh49G?QC8P5f0Cefk&*a zYQXym?FCu)8@qX=vvEPl!~tl&3j$>UV{Z_fKqmcAOuim^Mgc{eD;#=r95dCVIhu3aC)NOy}zaK$6aP9wplmn68nzJYi>bg7UYK=EFM7 zJp4mj?rHQhG(`Akp$4zBBy2(SH0sC}yX4>!MBlcUxCzeRxud;Qqyhs0>-UE3Ub%+q zh}azYfJDDiV(3YxBTOcF5*1hFwiz06&Gxy1LL~};Jf6O`SEw7LHnWJc)P%}FG%57c z5+JxT$kTG{9X6A7&KvKB5&{OY9uH%Vp$VvgKFib)70>1iDVVHcfg+mgfTXuhT#g zerp+UeusmAi-$JP{sxEW$Wn<}^h-({z=VSDkrGt->yA#r4B4xvj3nV>djWEv_Nl>( zZ+d&Ij^URj$c7B{>t>4Ybyf-_3$~nEebbmctxPr#FIKy4UwMq&>FYJ&Nm`-rjJ&xa zbSTyEcmv*<%zop1CV?v%0`a?u3yl=n%qFp|Slkq*=+)>Ra6ME5P(J4N7knzIU|r0MiGSuNYjXGX^gcd3VY{ADL>) zO6FCkl$Z9#zZj30EsY}@9Z?wRzj9xyA|{OuiN+$KIm#^KqQy{=jR(I; zs*h!nRptABlE9ztdkVyJv}gm^G9;W|-GP0)Pn>0e@_moF$QGhBdRpAdydD~Q0yE90 z?YGb{!-$_vr#Mc^mfi6c26yN5JpIyJRn5EXE(7GcoZ5YlQed}k3)>;h2n44T&sg%B z>S3^j3D9o$Ksg$3NjHpD#e%>Wa+*o}hA%``2B7u94%)_l9jse)${z%PJdIEUGVkMZ zaLRkKR9}2am|69yI}Lwq76BVpOmN;NgF@tm!e;BrC5Iy4D3i~5G~(!#h|-O)1O*{> z^-jEJ$68E2)g6n+Mx({smWeo=xyk%#o@DEaZ%b-|5ai&6XZes$Syc%!LQV7E3PR25 z7QZfgB|BTGE^n(RiZ9dyP*pdN>E}KqC1n!WMdUP8em(xoda!Ex(Sx1ds8&ZbTDYQM0N=z-8dbcvhn0wJA@!cNUXl_B2x z_WWvBcm>Un+$d>;c9?ZA^wMbzVUO)skw+9=6)0vt`a73pR0 zsz^s~XshYZh=EpH!Mu1Wk7U3RJ_|!dX+TasdqVx)ZpPh3_{Acgo}e z(U9*415k)3L7WR+I_=wpb{gDdyV}GiXnj!JUSjP_oRAuE?>It27?N|#5+SWFA{x}^}=jtuhmM|oyycq+znmJe;%o|~U(n8`CUy_nR z+2G87=rJF?zJ5{m2u|+#0wDnu72*}(hbQ6Bn(Ge|8W=x6hu*)J&`iHL8vZxconO5a zfnF@n|0$3a@vE8QGp_K5r2f@R5hx^o{rQ(F596<9ia$y0|9{U00I-Vl3l;&`BlZj} zW&t96p7{g7hAkT4h!oKN4Txc5`5PhYplkP=Hv2PB;>SDu`DFiGiu#9?J)pfeP{jhN zaKG;EnJo3}?)Q&(_a|1)k7NHo0+9pZCqVxu;Ajxgag7ytcF)WP2H*=Y0Y{ja{|%l0 zi9Y%3xdHy9wSQa(|LNHN8UF7XY6Zmn{cB&$!0yCn8`9tH3n=LSFkAKO#{QI?_;FqS z-|UMXNMZsO7N3hOfFCXgz-x^in9F*uve5lqVe$9Z+MkM3|Fstb;LmQL&rOnS!0O8L z_MUh5j0ywVhW+#1{izW2cP_P>JE{YE+c*Vo7& zZ&aoqCb7R=cfgzr)2}YF|Ec5jCp_Sv)-eFlen2u4BapKDr)14D8t89d@R=_Kyt{!J zwLh-=<)QG~!rvu%eoE#1l<{G}6a6<%Cre2B4}GMuAiFI?DpC_ObC2; zC-7~p%WV0u)-v7G{o3&`?i1C8WaoNxT>rLZ8~Na;9o?8J219b0{bA`S(}Sb;Cy!7i zd$G)*iiuu$Ux3Z-YpZjH02CJl6c=r`rX?6z0YfjXG=aSQ6}vJs>+-3%Vw?AfvfMwiLguE%j{qV%z?9&_G`klak&1 zuS*$V!_~gW%}ve3(SQpi?6KQ>1zOqxww>%Wtowo{T!o1e6Bs6WBEo~3a`N?W4fQA5 zZsq&sB(b>88M>cA7nJZ5! zldc>O2$RSCpagjO9`N#oZ^i1KuDC%nz~Nj0OQ$WJ4Px%txAjR$VO~fxc2q^6gB4z z0LxaCeSZK$h@L!DmnxLt+FzCmmeBor+u8DiaSM+G|fXSXqsm9VUekneJ&)zGjGOE&k*Cb~&c-ce z7B`ww-sy@ zj&HQ}YzHAEn{N184pps%q-|=j1^@>)GHY+md)jOt6 z8lr+HD;i+=yR>01c^PC(LzplI@6n(D#k6LrN&D_K1ap@7Qgs-kax! zx}KLoXu7E+jdGdmde;r^eZG(YhaQ#@HPR!KpBb- z#k^rN$s|IE$mXO{5ke2FdzxwC`IhjCGn+esdiK)&stcj~~0=|gtu;y9Vyz2Q< zorNlvfQ8gXXn$4e4;Dkn{YaS<8i6S^6I2HA zX}TcIlrfKa2g))7OC+1i0|%dcVctU@#3Cc<{rC+=bJ8@aF8B&P4t)QV>RrL%N6r_d zS7rb)B#B;^tNnaT&I|Dw`%i|A2k=bgGF*9_&Bi*xl`tpEGiVB9kqC4%Y)sGBCN47tHM|OL9H=J|8 zb?(&&F(@?YKT9>{PKrWyEiI54<_%J-q;~)qkj(rthJA%v#+MG=J_mMF&z+QDCEDHN z8yQSZBJ2o>1r5>bZA~Y+alMkBy#28t^8rnY)0>a?^(@z=$Yh(091Cxn=!e4iG?E~F zu6-g8ysfhgF22i1riM>og;hh)F-3b!yCK}Jr?EY{oSaeZ$YGaFZ1xEx5RF~2h116X zM$ki$59{K!^{6qa2i$~>lpTrerLVNZG&(UumYsZgm5L>tZAa60Njbc(+jFF^jJJf# zB~D7}P#CTG5VSr*Bl6DlLGaJX*pYR3u?D1NCo82IK{)to2Kgps&E=qlYn_r{zk@t! zPOCqa$h6q^H;VC%NyjJbIHY*|k)Ysqtmrx3^6tT;);?y&0|V38tpW z?-amCnOQ(Kc*jBG$zer{AEnw{nTJv?wwjjfZGw z-Xz(@U)58~ViP*9`8CzPhyVGbgzqORYZ{FT{)sId4!60OAZz z22F|$I+R!(0H4wL)%tPZc;@;-Xo@h-1y^p>X=--rGC7=rz0UAcotMK)-Dm>WQ~KF- z`z;?PrWYsaichKd<&13Tb?6gY!%spQoz9=Vm}o4)Y6(KbwePM#7y7RvbH{lyulbJV zpBzVBd~DuJxpwf~#3K5x!qTPG1HdH5c*3e;{Gj~k!^TLN`$(cmUxVvDQP;Fd+`B(z zW0a>K1-69wnqD=DM^Mc=B44y#g5MeqRnRkMyH}=5jFGBWz3f+oKWL`{jR~1~j3}h) zZMQ2!j6ComyJ$%g?YACdp`?FP26_zU!v^qJ(CY5V_0_51I5WQUYQ+odHLFyfkU;gN~knsPnZVK!J z1?a#8}`4au@IQ~{vi2rRR z`F}YB$3)MZuo?`C2ITBiOoLMZ#H|*8^!x1=KsLf@q4Z>sMKU>#XYkK{B-m7`?uYGQ33*=sP1TB zSy5zNMEfIM;4*?VKbmaO(zh^} z!Axp3MC@Dh*?2IFyLMGfE{AxfrXMz&bsThZHD zY_1r!$mfg;u`TS0FH&%LU(iS|)!S}ecJa>sYBh_j<@U727d4MPh!ByWeMco&0BT$S ze_PZRgKW-{1zik)2i?RS*aHRrhEV91SK>ACR*hUzSaQ9`Ch9u>b|I8V-{Vw6qkf>*JWu|6XE3!Hg0% zioqxO5NX3-H4fvc84&6#OxnFNa*QhVn4@q~S486@@ev8$T~CPaxP7ADa{soi$bxBR z6a332_qG4$4t+*$_gx#Mv~XD3`N|hkCL96W=iX=gfRixa5o!nGB(%tWmy;Bwi%)Bl zQ#8bNykg)?p9Y%_MTL5oj$LbPWaXw~upubw%&sd3GEp%x<4I;{qMKomlL&f+msSEv zQt@ee>kBSwV9B$Vu>sJfT@%^;4@@hJUPB)S?up!AXv%=2830~)B4l8jzZi7tq;=~Y z=?2GF1@uM@-GB-VlF0;?d7*M*Wl<*}Dw^d7m47o7@ZHvQu)jae4Y~^=fjK2n8$LKs z)Y<35gfh2SF240VGcBSP-5@9nwurkXDdBZq|9INVlaVuhhV5xUmb^ISTwZ|FgtNbb zjB!1%kF1$z*&5-|KJ_@d(BM9YAhX?#SD@N-!w8OoLe z*(SdJ(yT{Tsl?ko*lywU*`xmO8mSB+;S>?vIRzVp(;M`(kG1=rsJn^zqj&~;<4GY` zJsd!JvR9#Dtk%iBi$_CaKAtx~0%Q&J`z^Fr1zivXVcTXgOPP|vG3sG+27eX%3k+C2 zO8+_NBoB)Ek=KM|28Dr_j`-ZYU>Xkf5a1^Rs+R^j9BF1o2)t|TV$v9eR;u5M6^c^? zG-=KCV9L;kUC$jSnU?hes5Xk@)eP9lt`Gs!nltnFYAL--c{mH`eb;X|1ilW1Acb1q@cdTCipr(N=llc3HP&|@vCS| z4Fd5eM0KYo%kb~LVZ641JztXBTSb&POV)U=1o@>2a9y-4H*ZqFtmB9_b2zKFsq{8m1NX}f5xV6=o8E)Qvle&E>Oz3HLR$XVK3{XKync<@*4e3q zd3?+m?j>oQZpP2-j%5?x@vj#p>r$Kc@}zq1Oj^Y2uI8GK587ym<%}cc!*9f)@#u9P zlWWIE%uqPR6Z_fkOdgNQW4{pBD<@wAhE;cjxpecs&ecl#&nua)e1EWcLhw*|i-^A1 z9QJLwITKNb*1UKk@dE&YBl(0RAH&eP!$+?v*n9(#Cwhkdj9%~NTCbJrKzrSuvQ26W zTUi9oUt78CZM6v+R#P=BPK@FNzVJTAJrd{xeLkOCU!kgbBrYs5wX4SV>;sIZn4>p? zD9<|sf&mn}J(n^H7+5GDgPhlmY_Uw;JEB;2@kD1IuUNo8m)E^QhvKLaW`4lt7YV=w z{}QMk(_tQ}>BB`n+x!G#FXw9WOPuVxKK=2Jzr_~+fAJ}hi3S|WVZZ}AOVU4kegHc&pBo|R>3{*(@9IZCIqw?SIOzQ5 zGW4ey^~Z+)Z}tXEMgK7O20BXuSb)uc&(5aLV1#FH$^Q(%1G@M8VVdc=F!t}5>^YeG z@u~iU$qu$ZbP)c$5SUzk_Vxzu>`zhPj|VKA8X808o z$IQ;~3norgJZ7;TzIC*0S8Y;ZAygzdt2$0HuBBF9bW65>WcZ3V+fbTPR=ma4+40c> z#3xoDtaqc5Rl%)Kl;{Qo8tewd@k`UaM)UoIm6hj{)E-WR%G(`xC%5@6_E)OM z_9<0tpaVA7+!PCU6Pg7DyLTs7FJ505vn4<9ZgK+d@C3fTzw&L6d75<0<;^-sa?O}t zBJ@}iLr&yU8mIL&3Evjs7Zz_k30-L7YLN7@HOKKS%D2+e`0P-hzj2Ili#D;_uzN)i zj&L7Q2k_p&t=FgM-wR5pEfiw|;yKGSrWP4fAO~c{w{pnIfPtOk@XA7m`$-<;yIA^- z@-cv<*}OLk&3+P=fm=gum`T904R+Z~tzA`s-B#a`L&1E&5u#|CK%Fyej^?Nv8rPMA zO8ruAo~`)W%>h@6Q2Cx{0peskzI0-cLBWf8iGoknh*}e$EJv$$AEWLbredc8+0d`% zy+ByS--*P(TjkVCOpEopzfx;NnV(NizQO@mxRi`7aw~j+M7+;!^6NE^p8WD~6en2= zzatk+>~n&^N7p024pLj_<3hw{)F9XSu3aw85&QGT>Aq_zrJcKxgUM**_L_=3l;#>n zYTXD-7Euh#qfQ-he@L&#M;M1@{Eeul^_4vA`C}Wb^TzU4;0QGTyAH?+n{^i@wEz!5 zB!do~miEi{wZqz;uUl6dmjxIL<=RMLR};%v9AEi{X~pF>AoOS)h2NNru6@5WzLRts zAQmUxTCTCM;4xBbHr8$54`WBu<0`o^e=GVjzWZW0T`HM#k!n!D<*mn@!n6wOmNeQR z;~MMZg~^15?yO_(=p*{)M-3y-x03SQ0L!DHHBr3BlbC)rbacst;(wAi3#k?zb1fIoNtX%#mX$Bd0oRc2ot7(OPI9QZOehNfE zyRcDJuZyydO*#XWdl2o}9T0J(HUnXEj0+@oa|UOehGb97>!YBP*FB06pxkZM2|IlW){9>ep_14Z4A_()S7cKtSxx{x7$x4$H5 zeSJd-MF=|n3}*VV-oT`TJLm-N6#x{cg}<*Bnf&8SBtmQ(`nAURq7q9V@fk%7(#LO( z@k8{8NogNqyP!$Vc3opqNxXF3KtyIZlXq@tt-I(#Xp3j`@AA+Vha`Oic+Lr?yJ2O2;E#LYhIjM-ZDeT1nlKIfmdh@zN zpc}qJn=*N9SrwZv94j+Jj-}|@Sn7eJ4d_cOS>c$ShX{J^z{cgyP#t%ZEXs2+kk(Dh zqsm9lcnGSRrI=!@-Oh-ZY2l;-K9|vIYOJVhIKNufP3IAV%^BS;1ruZFP*{EYG^(c6 zr)ETwF0JkWN37mhuVH-*fbg;5O{bg3>k)plpBb@nJ#v{3Qjc9NB%NKwIIj=^S~W*n z&e}ts+RM_aX76+!u%}9vvuYhD9AYWp?XF;k1G`3gN>88 zn#njDmj$nkC{*BpHT;bWCrz>=cn_~7%csvPjcaswZaXcdG~2?ofKA38UQVS|=h@Ou zLOs=e2W@Ai2uxNByv6xm>ZhVc5$+=X5MGo@zEU-4{^^V20Sl)a z3%{F<+S_6TG3cP1V}P{_l%sOP(wW78`mQ(WEFN^|8xZ8pLBCfCS)W}4k@QYBOtwhA zff!GMU68w5uJ;xVDr3ldz7jsc;nQaRy3|y;spUm-LWtZsc)z=G$LtTX`DR%zt)^6A z_634!2(55xdOK*ippn@ys(0^pjz72!-csUP2j+|ogmDb}HIR+JoD$?=+pIIxxBlRXsMA z-yLok3MG&>I70JwdlpEMO~T||0!J0a7}LGDVL~Vj62&ydK27UHRWT)^0!$(>wQ?k= zKBVOt#9G;@SS-Ne*OS2IFDkABh-dX;6}TUjRY$xZ0@ z^{;KwY79e?#1B;74l{it9>l?|Fwh6_eGSbu$_E|dPbt7UD`s6m-6~FMnAn$47F3{M zMlp*gUL-tY!HP>KKce5+MjfHdF9jxrIk@N@euqBhl0;Q1`(phHo3U*brj53^@hTiz z_87KM(+#c|kX)Fh#`{qV+Z3VNG|5zh!2pQ zh)7kFi`|0G^*+EqL=t#MOo)uuq@AtQ9?Y-#s%?Q1?J|6DbfcFfA>QkPT(ePWlQbAA zxQfi(3E;Rwtf_hjMqAMqmcS{U7=Doe!g%Z2zPYc`-VIU@sR{GSwg@tSdQpKYm45?q zwEO7wQ@33o=Mm@?NStXKF@v-+MWz3cJ9v+*{;dKT&HKQ07+)~g+>e)5OzMGckR$K0 zs5r%UZ>jM%Ghg-Y)OmTnsW{q8)ALC*7nQ|ENTB!DbU5GSGL%9#Iz4#k(zcn&0!L=b z2v8CQ)ybKU)bs8!rJF%0I@?Sbi8W0SCH)FUrUWBmvO<$><2^IuEqW z{b42~s$*&C;Oc4ubk6%@GZPRg_XlzDtB>=4$}ltikL!RPF94tn0+Q+eLR>tb@NY-* zcjDsTdE}p5Z2o{;``P&hSf==$T@E+!r@!#a`G*>WYtIYTkTT3j9~5rPgdO6;s%t@LAd5IDBtT(Tkx*SQ|J?Zdst zyMwo5!$$#@kFLB*Pw&+=-0cdZ;j@XdUoWUHnKLws8VeQpef7LB`}StX^!|QoC69ZI z*AkO3QBK_nj}!S+s188$9?qbO_F8FcEvTinA+&01mz-Fx`}1Y0$vQ0$GI_3h9jNFm93(-}i6(b>7Enmtb+v)&SCKHtrYHcO@#&Kb8n#M{UHI>f zWCI(KS~HIFCv~AhE?n^sb@-x&KHWo-4(9i!1-0rrv}kcs5`qqW2dl6WPFA4r<5_Q& z5sT-1V@Oj(-t9rAd~h`4sRu5G#892j20&~U&ms)dold>I|InX_I_72f-H z%GY3^07((eMI#j8!2Myk)FsOy>Jv57(ZFI_PN>Ww3GTx+2up6wU|(f zYG9fYDm2SJ&c!M@(FvT4OgwwRmTt<|C|pKo2wC-W36dt@A%(RrceT(z76V zImp|FSFZd@I*Pv*-8T(_rtC_Ej6$JXdyfEcI5nU7tc> z#H*^DIYfH_VFu-LR)v_@i&FLXn3hT}!cc5paN!?Sq{n}Xq{@6X09%Vp6tXlY^N!li z^2L202~7DIH&GNhUaxHqUAedny93m8m0zE-hmNw67G%-jM8OC&SIF`Okq`k~#Jw(0}7kpMCUXg%zEU5qqL=nz&d%&E{-{OORfTujeBMfd> z&evTTW<6Y0$XE2pHg{Cm!$C>!5T-J#?bhgx*Mi`32o+%s?W-(9Or2+YVe1G~*2`JL z2(J+l0C$EZ!xs)Jn=-vVm!FlJeBKtQfJio;*3@p`1L$av#o*`J`p2c_KLI#cB))D* zYQ=?F1SaLN3Ub*|uY@URXgEy;QOWfcFuFo@(iuoHuRUENCM?9R8#c&{x4GTljUCJK zo144`r9mahAJ3*l7iFr>v(vyS0?uH$YLm2(1BTvt5yMwf_Zb$HT=)#MTG~vySy3Kq ze;WexH^ySFg=hu|X4O04ec8IN)6y3Vm)wq}{pu!Cfa^TDwtnzFlR`paLb2s2D5N+k zi}J!VX$q5;^HZ3U!ZK>D&>PB;7qJzcpr9l6J)lq^2e6hqAZjNVBM+oIA@gUh&IV~= zVgPF2K*rXEjD^DxC(iL@=NGj|zG!=iI>_yp?GA!%R2U@+vD)MO7)CE!mmu3&4 zEchE+vbWl6B*PS;*(tk682Z=(a!WCDWYMF9zI=vcdrJW?PrwW(6a_foIed3fXd%kb{nEEgI9L&&s`?n%Pt%Zfiz9n(qBOv4yCu0f%I&64Yq5@(sqFP~6X9kT zLffV3LS3eW%x~B936652Ae5qs1bWV1zX9bV!+e4@&%td>yh>w@Vw^ALaU;zGJb_2k zLsO%F0H^1y_zbSKwJ~<=e#U>qXOZcLy??3rb$2*-c$+8J5Op=QB#CdBPcrj}(#^h8 zJclT{oE_y>d*M{D8~zQ5%nE%f|2e|!0vRcc??tlOT$p4?;t;Ip>*lf0o^Du_%P;SF z-kf^BF^h;NZ?7r@-vRjbp_}+h0Tf|6N)8MLX4FeQ2?la46^K*L5VAhVY}Z;N1{kH; zwxfr!8tzt|qrMh!%Vxf<3dn(u|*CM;ngbWq+nwtKx)E=(pp*6HH*ld z$6m`m=k$J#8zqXJb;4JD@hW8vBxbB3z2R#|PZKi4EHhg4yV8K54iA}8R6xcJc9&;f znv1PU7p*iVlc*L5piG8ow5?gj4gssPO>`(?WPPGsQJ+ZV^!Sy#0I&1olW)yA(R8cR zoR^H>T5hS9fA4u^LrCO%djibTvyU0}Yo~!ZhuzK?Kp?TRllRN~H?_z-FJ0hDSP7Zp zlGm-z4o>W=0-f5YVKUmcH34;;=6+Kpt`~znZHI!%tmF_}0-#+wCSqSFDGs9o5m_?X zjt2FQ6e|Isc_e-IC+FyEU^+~(Ef@kMbFU((Nh(l{BEoXd*(o6LtL<4?7Fh*KlwT8E zTPdI@&q;g+3yMb)Gk_k~Z5VQY#eJ~o0M#i$*cyqdvOq)7HHyUSD zPnGco=lUwWl(Md@Xg)Id&9}zJ+;$pkqhCmv*=ssZ(ujRxCO2;Pzo8JwAaUjo-aeux zQB7z*OxPz-=QK>qG|vFe6h8Rbdyqo1O?02aL{+e_5UU)Hi%1w~C3JawOk{H}^oBIc zuij1>x{wYBwU;Z>^m^-^&=uT(X6VW12WKU-LE9~#E5G}5OR^;kBL<_7}m zBOpXdiv!{N;pKWrrni-S#Mo-iT0gD6GcSk~@5F||@svEP___mNtHSJBkABEou~W&V z$SsCl@oU7#3{LVY8C@(?t?DZPGWP8G`Z6ELo_|FL6#a}9)?$6U-KO@+YE8i72@pn| z)+JcuF%|ph1I8{pk;aE-alSxuR>tKDFi&o2F!Q?B;E?FRm&rwReaW>fkh>?W@^TP! z4E>hKkqq=JQ3@u&Xq9|oG&>MQ_tob>u;Vt}z~U3mZ=@oO4amSG31-!pV6l}k4^+AB ztBJ3>Ms_9&EcYX@r?bJGzyIpgF_4?3t#&k5U5Pcl(jsyWCm)=(+K=(8@m2G%x1DYS00;_F z_>C>~Y!YIaR+#p%5(e0iEwZ>ueYa6_Xtf9o9|IqC^X{_Y@~L=lcl7UWM<2Jxze{p* zB&X{mwH4VVie==gyL*0Xj!m&Dgsl$lx!b3cJPP}$(dLS_4Plb*jd;RSl{!xqk=A83S;a9(R==_Np{gX`jop&d#5RePU1oS3-u9X3$ z4bZarhx`1mjyi0%R(kRV_CQP@t&D&W9_cke=e4XrQEXW?GnglwdM}SPbt|E>G;f*x3RaTXx?h5ew)bh9gN{ z&wTxi6C;Hf?h&fAJgvr4t4P&QcP8^Tk>Y~B>~J3wRmzL#TCNP#Y@TTvRDiE0fuI5L zS=dBC>PIrC38G=kF1EV`s-=4Zhm(FvXDIz7pM*J@f#H{C+O|^6f}mSV=7OH|L+J~2 zBTJa5ac>KyDj|hX21UJmVA*i#GWpM71b7}?#LovlM$w=nBkU8ow}ZK9lu&mg8&sp* zDXYngP#%WSqwz?HFl_Ok%K>oMWOJaKjdL`Qs(KMsVnoQ6E3UrC7^9kW&QIfUGQ@ts z&}7Xwheo`%3ocO}b~uG$qh^crmRof+NRS(kvST6?dC9v(FzdQXSZmx00`g=YoveG* zHIvGm9kiG9aG)d2US_w;99K@!ueVln<)0U1`A{HEIG#1`g(!e500xjv41%Hr2V#5Y zd+w5%$cMh@mM>cSe~OeOSZ|_x^WhMZBUrjHBbg~8xG(7kfEE3%BqE%bep2^v_%e4o*y``C@c{~h;+-n32zo_E_amARZ?D449lhOuqG za*5x*IM5go^=S4(4bqe9^i3giM?oO&(sEtb5SD6^LgFit@xe@h2F(U2iYm@rkGRA_ zlk-?usjo36xd7p?Yg7DSHJvYl%q-kjRX53K4uHD1jxh#?7Z{=t*bWFy1ac=XVTnxh z%ct`V3(dDAROw$!gj@IPky)4ypu}JMEnutOp#@SXn~MpNvoGjYQPX5OmlM7MTS9uD zcO1K4WC3)wq&(RHtjfQP3;@@{L&U%nB1^&8y`beepREM~XZgzWzR=P|-ZUci0gMTTJCloYhzCt~AiC%- z7-wY{0xhsRcctlLW!gW3&k!o>NEA2hFg#BKKd^$Kkdq8e15i2eK zB=NNqUW{j!7am$@&Vxt!BMOq^7)a+xqn9<6L zIE3603!j8Dg_d{vl!uL!F_ZR42KjD6S$Nv0;1J3CIzp?+DC)^+UG6~d}e(d0X zsO2X_P5oQ|JTGRGnv_dzh3NJf$7~K zDynE*kP#K4dfss>j<2LTJsw}aOkbe2()_-)KsGO`rSD1N#G0=W4-*H`)II8l+bPj- zKjo%?dN;rGMfC)c;=HA)m{E?IH*MAkVz`CKXogA&dw1r z*e`fIJABs(C+V3ln0TF>A1wz9bElqKOex`TR9rjvK^r?*n{#lO+6>3hv}jwx7vNr2 zB1Ryc{Cx=3MP4rdAT#;R+c?)Uf|Jh!HvD-^Ltlr{b+x{ zhs^5rg`U#rQi6~B2&A_1I*azSHZ(X2AZ`5+W3L;z+|L_5Gi;0uYNox$&%7Pk->_AC zdB!`hZ1zw;)Km$`oHZ&GCb#l|&WLX^RRfL4?iQMjNQ%KYFBYW(^IYF63(Eoy(Lhg6 z1;$xgdN(|GO|rOT2T{FeG#qpw$+3lp-`Q*o)>!bUVzpinYK2tcZOadSU}rY)m(tip zI~a`n;9MWRt$5B8c*ymhoTEg6u+kv21~_{Xm*9_H(_l6&1!$yxh(Wk37 zq-JtkRg8$j#y;aMOd||`e`F*8awHbdq33IQ`)joi=PfndW6B2`4bH~re7Is7N(sR! zaE~|#wKrjnie@}B!vs)yA!r#7=msd5D*Z0qs(UI4-)o)>?-O zlA=2Dao8Xtf${lmOi+5b#R20l0gFlx)R)y^5Q7jLNglgytH>Zye*WTsXaXZo(x7pr z)N3L*+u4orGQ)aootCf+9!N-?%}X?AEKH(-b@t{}TBZPt$XZVjfKdxRQZIL5yW@V0NQb(+f(du+ytEl_jh{ zwq~bY2I?=$5aaJ5@5n>|W~06BVdkN~_T7i$Sc3@|Va5%Z;1{R6l9j$%H$|M(TpcL; z%rYZVixWZ2(Co1=i6|AB$?ImB2wx7qb&-3WyNv`&l1pZvQIqcz&qLi72|Yl7lQru? zcMPR~kZx%1F3daXT}i-3@o^2uy>^Vp067O+?^BE`%NP$a3%#8&Amc+2tU{p^KyB^- zq}I1j701vxU}TA!&fW>-09u_3$+Nb-Q?Po?K$LBt7D=a>pA|{RgQr;p6uVEs)oNfm#Sv8(zJwHN#Mn5C`6Kp|8P(|smb@>;PE*edK$py2}*;p&|l=ljG z2l+S!fk=Xs^a|HwfXn#@dpSINtHpQqLuw(6$#+4(3hY_>q%f*aps=`f!g0wPv$q9p z`fLE7sWcge#le7R&SH`c`)qg9RNd5RVKbSVh?JTu72n389E<{myG^8;YBsGR_2elh<5shs#Nf>+! zBbY>(5$wIhh9wFcdA%Q_W#R+$vBXGjtnH{#GqgjpcnxL0VMz4IMnL-jd~e5yy?DIH z1$CsM!Cz{O0c^>^xdMmBa__<43GFn$W2dz_l`irqK+F>^ocqoO?ldiQ2qEJ~)bWX0 z754@m$FwUcQb{*LRQ6-!s*3+`E*@*P=NEKh5NW=sqE(wY5da zMQ4mF&Z6SaPlq8oveoNoAEqYkd??uf?w8xcZJyigjR5i9gy2+E?hpIQ%YvRv%iiNY zL5Fm4zH{Gu-JvXaBXpS1AM4cez&N2w41#fS3w0>uk|V5Qyc;@Y^GxrDLG(pCTpGXJRz5s^YCgADDxrAiF$_;UxsYaS(PXMXrgkrn@AB5+ zid>q1lpB!gr^3*ZIVKMk%c`_ffNwNk>uzom08WCf16H{2dTHnW1sd;~AktUG$ew_n zQ;nH&yV1wA?ckQ4SW$ctS|GaQt!JkTHQ22K#fKEmS0|YBP{TWLbhq8#8aFh(*z__B zvK7xc;P!gfUl^V`&7ZoG_U+=Iwbs|y4g;3mTfhK*2~2O_kz!=jO{EcQlh#;|b4bZ= zF|Ri&3p-ZY!@QY~oCp@_1wbGeVq7R5#|57n+9#-c@!$yaLA@0OrjVxRzuillPKln3E?b(3}zqbFuX7vTbhlqKEmE0B}H zqIm~!D_H~YC$?K%?k=A>r@dE1;wb`KdpCz-q%P$3q0U7(HCr;QyiNk;ux*%#w@~?p z;!#hO4@p$Yv}6d*luYAz8E~Vu!eH$uroT79NrT|a767IqZ?xUWrauF}?l(c0l9RxH z7{yYq49niprE<-AhMX5+f$VmT)=7PJNGQp`*^1uteGK&I+jp_z{nG9xOt|+(0vj89 z1er3e5S%g@iOL|SwnwNmL9GogXB-d%-tT@5$$qcp|0X2+b&g8Tz|P9SR?ol=kBRX| zqTs&@$$me|^&{y3q(%G?&CWasN z(K`1{@Ya`r=WzJ9ZTB`d2o}K zQVdk6biE~0;Y`pK$((3)emerZ5xP=lVFIYb6zO*)M_K~vwEz5#4quNH20?; zU?VjIC5Y|}%{-ob+{vR21XLEfwd^Nj5F{T1M~`LK3azO7Q$WKp_0rbGjui6u`7CPv zNDo*JEi|tsjb4<+_`&h3;C`o+{x(f1!HW|0nGPk<`kV+exq+G&b8yO$;Ti&c9dqFm zo@lvIk-hl^d4If2c(qvVCxQ_M@w<}37Y?kP;V=V4S)98BxJlVtkAN}ed=^(fHF}OU zQP~2=J}Zj+thzTTB^UcSce|Od1qq&eFd$J$qh#g%PMd5FjEo7Y80>bm^Is>PNT@uQaem{?s;vl~gTZkJkZ8!GKQS!EFbYnf9kxjJ~ zF+_QoL8_*9DxE=9(&^!{4VnO>_;Fbm2%|SHY!RDJb=+zUt#*sn$MF`^x1aXff)KH| zVMpvif}~LtxVveD$)p7_8T6wq?c%(R0CKPo_T#s;H{WKCwfx8S+g;|BOakB?J?HQr z7OA7CYqc#PtQW0A87dxVIJwC?8P^OK4naSCcp0dh_4s~#-EtbkF2^DEWokb59Gh&1 z%Ugr$w!UY|)+m(leQj_jDTPq3MEejJELp0#odPRO3zA|8X%u|$iJZYg4_3NReSq4- z?w;)x+lBy)2^cd065AcO>`XBPW26YUJW2YxEDM`q2@3KmqHyB5EQq8X4W;FZ{n3U6 z^gtK|u2}qgkB{%l*|6TP?2-5#c!y;t@VvEYNRsLPA}-DpWlim)DTNvdP9!hYRnuRx z{)$_B%^0usV1G45>WmLcwSY$Iu-yWoa3w+yhIyj%v$vI6L_ZCG2`&-u3+yZ&GOE zlr@$I|10wcWfPO*I)QpKqiN9Y9g_oRnVGM0SWo5zerU5% zd0Sl$CFP5t9o*t-Ca4^(SSj(spdBvXAGaq%m55xKW=Yv#uJPib=^M-`V){j50R6R@ zjW!s6@SF8XXBA7$1@!GO(ieZ7!eE}n@RAc^Q?0HZoyj8I%^Vk|xkKxH4EB3ib? zWs*C0pw+7Dkw%+5_-b@(-PPp-%1`5J^$FW-YjmgtuC@vPVcpqalVRC52?_*2!^?R* z_V^(h+leYUF;N5))B=9>&ps-{vT#Tw{A`*5Z)2HLJZewVUh4_m9Z z5=oyM_H1k26%8zhJ+{)RbiqbST06`@A;4euGj!|rVhyJFQ|E)0 z+`Cnw6n}7tVz21|!3dr?$>Iy5uvtsz0|K0RUm9$r!`iY1p7^r&S@gG2AkCnPF5@s& zUwG{iv*-~N((KAJr{EL&l;HC_LxUfzkI5uULqNGi%yt5hcX=hV=AdFj1rikR(4IgKe)dIBi#_}jtMbICei7xL2`dl;)hUP4&X5Z=<0k#vQ5@L#R8 z?xY)D<;uwB-W}DDp16!)!o2@@}Q9m_N2>-|w271{4(tbzYf_uRM z*nUDH|GWVQy59fjw*LT`*#0x6>pwZC{h_k_t=AR<0Grt#75s}0{57Qrc-y}}>F-VO zPwRll2WU&c1eCV^8TkNh4*!0g955yr=!XF`lw|wM!XJUb|ETn@7i0xy6SD(fN&mQD zvfb^^Px>cp1$`(Z&Jvav(h|!pDgpwisX?oAf+v&MIfbl?{D-#$i&Ah>2DLjBd_RI(owf=wK*&$p}0wn6;5Iu}2br)99(Q13O-%5raqB4hCg%=foInvRJBVzD$=r>4 z|7u`(j=soEQ?}~GsCS;a;5uB?!B!DjNv{o;1hs;Bh%AY=$q4gdI-pVa+S{OpJbM}O z{b#A*3%fRN-;$SKhphp*g>>)PN^A9~=0c=7^vOT2%;|l@q4pX(CD>RE##jF&lI6T| zly?iCE9o6LauogIu{(k{>E;UuzFks^r}j-?@>~r8Et$DX3IEx4s~0^m#J36DwkPfD zGa5whO$x?Q_YC9Sob{l!=QgM}SONE0la&73keNPkrXf0ZE$>ptbH`~oTfW6%SlxrFjAH~lIFAa~Hd`yU9v^q#qqKBY2qZjnDUG&))k9la z^VX)t-le&*Zf;NjTv@VA^(51L?>fO=YSi($3B#%esq!%zh(mU~N#{6pK#HfDfE>ov z-z&R)B&*m>{3fDwFX_&ULH-zEOo_*l-P((w0I$rUs0I{ABcP)r8{v52D<_FyLf1Dh z>$elgw=~n4tK7vG=E4|rGhV38DPrf$M`#C5u7|b^7I^vtOkbA=_4<|dMTxhtgB3#% zytB8YxM>7=;~sYd<;-pu`T}#egDMKSk1DY1+5rZan)Oyj|161?oGh=U$E**J$*&!= zmvb9Z7bA8Rc__tmd`yh%TEMMmv^m`tRk4oA4&J9Pci)j6EOXCa#fh~fm0k5lc0?C9 z+!UgxBV|q&;4rkA=V-xz%pf8RNf0Yd^vTsGoaCs7^q}$aDTsd{ZgiWCG!0Z<uSGz{1aA($_jvb(^L%y4jhrS_GQAGLxzK8w>R zQNaKpFNMOs?QN_*6vcn^a*%0bw+Ud(a7YpoM~g13C3B@93eFTDG*q@a63_6`IuyAW zMpsTG0~A~Z^+{F32f#+ACXk9rj_@Ws__5+SwC*^*?eeOL5|!oP&|Ac06^I7I5K^x_ zj->?^zNqy%qMJp>_;Q=*e(9zB=73YY!xL^+A8s}in zkHg_-qQk1U;ot#GQ)S2rSm8QyInOUF2RIeyRTrPmOP64@Dr43sx8A{fl&XOGCN`Sn zG!G8t&}It)VLW@zVF;@8>!vkU%O?EBnedtBeVX?gcS&;%=g`U05G>vjlc8FK@hEwg zw*dJ{Z*s9B0h2~&+z#9V4iAkwR(=H~SYc%*&qgc-%$C@%!iu>zkr?knsQ85%a10B* zIOg$~6xfBhRC+j?{jCbjArEJ8=30pYC<~VxG)oxYS$)ET^WaxGYriV??Q(TfOb2Zt z8aO`7TB;Vo4zAfC!chvj^N~ams<0-i-Ltxq65}73SD@LLZvO;(%2c#xn1~(x#8Z8g z*DdF%a4F?uQk*<-`dF(j6(^GANyO1*yi6OML{_0$vH=~^_36&oWU9eJ{`6C&U}dih zm1~t3^D_fZ?=}GTmR!p?$lgl2rOEe-u^S0h^at^3@e?okH(kW9J=Y()2=*V=(*K@# z{e@@xuJ%e6Mu5Nsa%R9!|6k`b{teOkBb)T65Ai>)0}^y>KsQ>TGtxgk#DDEJe#&b6 z)Aazvz^;K681TsiRIvSdA={6e`t6E;AX@+Uk^d8&`ZIaQ9(k z$2L#*qxMu<@q1Ut%Q;l%hHrBvHtk>gUI?c#a=^FVK4Bt{-Dp&_-Wh%gUZvY<(9~U` zJI@$+MX!>@T5e?8a_e$8`C!M$V3x*kGFY7RwKmVZp(q{jwY*4mDtp4F>%e8NF-L#y z>ErR}yr)EsRhp~bS8;Q_6be2!aV@vggM!d3n}eL&bQ)Z|9nd&V{sPtf{g=y}7%sY}FIDnL0#+mGP9O+LG!*3wt%L z*#OPf-f~@lcAXJ+vW(eKIY~gROG(}3aA!Rkh(%-&gcvkQN6FXYw9#HyVBidwJ);N; zr-)~H_Q9a1s+QGBxZ1*D+F<$hJMmtz*5-wz5_+F1n*GMTx0gKL>$W8<2y1<#sC#8L zL$CG9cSi<2=QhkoTJ^DQEcH^dN$TJ2RHZXqy9|3fQH5MI7R(^`PDX(cl zmTx-e0X%Pu#>Z4qi*;gPKT7K4q^{2}mB}lfeWYJ(MZ|aWb+lT!C6^*}L3y)qXjepi z&pG}0{-bv;+&nmu*=kp$C4-r*X3k_$XPXU3mq8=v8a)4#NP%2x?t5n?fc3EuPwM@W zm6=`BdL!Hem`gx>NsEh}vEv}7Y{&~;PQTckXh6AmkT139)XH4Cab=lN>TZ_G02|RK zUCs$iunAMn6%P%Eg?I8V%mgRoPK7lEKgiQU1i0C;eCEb+sQc(&9(I;Yl|M}!;$?3T zS3ACswuDYH_zo#0Fbujz1-b^08K{-gowQI!6~bIYmVj|78GV4mdFpQXq(=PQjp+9E z3qIiC#K-@ftNHv^lV!l?ey;sR^w5dvWzaD)d3z_23tX%U zSt7VVCkC)r>LbUlE1BmKNP*;rdmoRe+i3`=z|meDWWQ$?Lxsl`+tO6xHOHR#+z06>^dXKozw48!B{V5TVhVQ zJmmy82sC1`bBl{>AsN=y?wZqEe`0z01RRQ#Nak(j^wEuF#;P!OvaP$-@|B>=ZrbKM z`gZc9O*toOqH51%-a(M?r@K67I*NBga+L@Ks41{qWG?NBQw*Xb7rZ;pwwbEEGK`{pBUEuW;Q;+hq-Biw4Z7&;h;njR$CG4#gSp=O`STEWNW-yXh-kLabqMWFD>TOaaO^rPS+B!Ulq6XDMU>S zv2Y5#x899HMvB&lh~}4IYrJOwpkS`azG7>3yg1E>uT2sgNDsG=C7*FI0N*Y}o6fOI(Yzpget`l;2|Txq$e( zaHH-rd!uf?b<;mx8XEe^O>r0bN#5}kgo2neRog%WsRJ8sk0dq?8oVemjeOhEFNqQa zaUNee_?!%O3+P9}28g~*hjYJf;A~;+Bqr~Al}Cj{JB-R)9@kECclac4?exL_6~Z;{ zC$iy08!CLy@cMp#9Hhr+Irt;Hw}kIaXcg!#rN3k_K$76y@hSO#aA!kZM>)GN=ib~4 z7fO=9yy2!OA9%X&QV^VW7lu`qtNQl#3f2G?{Vp~uOjQKrnGKLC-TV1mq+h~XTwL6{ zCDJxt@_>T3J|}GNbz>Xp5&@YYB#EtZw8Co_nj}Gp#PK5jx>G1rTBQl1PY!&}^qfzZ zQMAKg#!Y8^%zM_nKmrxSt?Fnq@?yYsS>gm7V)JBRQAnXLu%1%nh9o^9rfN4KpVUAo zPO|c8Qr1Y@w-&HeI57>M29;@U@59CNMVBSp9M#4-i+_|lbm+?($eVs96JDqpIM|C} z)iI+2q)}{QH!x}m@-YX9i&~_c=z{S~QA4yCG0}Svymkr%YHA;}&jq;EQrW&eUgJA6 z6;H8;kSv?;=l7_YU$h#PX!O4fZblt^Td=4q2F{XY`Mv=_j71!qOy%|wFO?v%O+ZH> zOS&HtyH6uzht<)Cg;df50Nc~<&6}=j?{SECL%6v)3tvOFSBnU)T4;yl085CZ2|AnB@ogewD?&Dp zsC<|E`Ae7pwYw(0$te2KSK}oExPq6G?dezx60AnscL#h&qX`|G%Obe~R?*(^$(SvpsI})HJ7Mw6w)sMo0S()za5jI;vltTjIz<`M+?7evFi=mn= z`!%o!Ez6&XnqU7$*wqE5fD){ni{L5)>2vtdPOf6j5O-2meRf9P7+ZF-RD_bWE)@BI z^FG3dle&?tCuKAleVnE@L**BQ!XbhLgU zq2HSKUyAzAl>pyMWBNx-&39ihHXv!q4$Qk?Wnm>|X9e2L0_j=~AZ^IZ{j=RH!0wgZ zkCFR-=`;4D^8Y`@F|z?p&%T@T0%PMjIf0(I%pBiMU4d?BTpYk87_R>|odbwNe(dM} zSRFv;=e=Y7p0fgcgzOy5K=)f9jmiS74w$0zJqm+~`7d?_Keo=v;WAyOd5kj6DR9~hc*L5MnPX-^aKQV^x8;e5fCnx(f2?jTn6WA7y zMunzVJA4#fnhKpXQY9LEqxiYxA=|oc`n?l@a=8&HsbcMpbT=Em1TGC+-8@PN#7tI0 z9d2<<7wa=*Oxr3PGf7vjzyC8Ipk)?@kNL6!V6JgNL>b{zv!vda-Msj~|L7pF$37k`=EXGWOu(-qOg{_^;GXX*eqNlr!grkq&ixy$m37DRc#l#dX@Zhr2TQe7Tw0! zsIr60@F88A`dEunqltM(8+4Xd>}Pwr%pgy%1v`An;6!=pPwLnj`lR{pvFJi#Zed_) zcHIxZZkfHJ>DqZXEZ#n{5I_LwOm#p}&$LBM&TV4>NWQT!M1eT16h#kbA_-G|T6r(H z^uBiTM=C$pi5*`3*#rt7Br(Jz1WL9t~%X4)$it(V@4GWwLZnZ2-=G%%aSOx^j zJy$;NjZhiqVE}eZF<8$>8IYU@85q`kvOK&&&lS?K_l+?(`h1@%zs*stS(lWAsLtHF z^}LCyM^6E4UgsaRR5+WNsM5OQ zam}ZGKqyLf$}slv*jc*mMYkQ+!T9FFUYRJtnMt1mXW?bPXhrTj= z{fJ~IJQw-J#m7uwO7%mMbCMGcOF(Z0x6>;rg*}P8iNir0)6W4NN8b{9^<>@lNTwIP z7&&k1uk1G@`ie^c3wkXsZoYjk(>h712@xI}&e-|T$>>;_kFul|V_jzKi|T3#@b37K zZ=u!E@L5;UMq$Cv?bz2(x1_RT)w#snNJ>$eQl;eb=aA7FHN{_zVXHtg=fh1=o{cc{ z;RF*%f9d1eXhSwveDS7UNzqikf0Hu!o~~+So!IzQ_plZ;pc*m~I$`MgBmQB@_Pl1o zyVNLA++G+Cg%Tn*TOl6yw6+c~BG(b)X?aVfr(~XXC3kS@C}{=PCriQu&>l;YWSX|r zcElWcEiIxCPE06)=N{-G#j;o+a(IKF+pQRHiIYb9s8wE#sDAR6p@^3|Ppu$WSh571 zN7ibvwh%PI15`>EZU_(1b6Cn)Kg!XX!YN}NhQ&No7bz*Iq`&kN%dx>N~qdeQB+J=z<8^l*pCX*zw=BpLqX-%_R`R! ze?3CCJ)G-PYg4t^93`45^^w~$iStyQ1@G0umNG=uOT#P(`8*@kTqYh#87-Br=8rNM=Mgq_*n3v!D zW~B479nwICIfmJ2Dg{3Jenr=1go(kBQaw+p0wHGQk;W;mb*Js-E=m^VT>La+qk7!J zH$PVwHRv-B-zkxZElqL3LtHsD6b}sP=$0%}J;4JA5Z2Yy#aM8s!4b7#!7_#K6@_qtrLi9K0|kcP9y;p$1Sv#+nzvw7{v2)zTwn7q%mJr~mPrt@xqh=uB$6oBXY?zHrU#!is=_=jF^ z2k;ueEuGMZm=N9*xaP3>+=HX2 zbmz$7kf}R3K13hwW|Y*UWD`>?5NR6pRB8Yn3vCd*hk8WPT!#0j57roFAL-}SDF);d z=MN{F@w7VPQ+K&pJ6z|C`%R>%eP2^#`GGnDjJ++@AOZ^^@-l9Z;WIZ!IKrORq}#b= z1@|Cdskl77nV|(sjyor8B^vY{Y;YnrM7T$2pd58T(#)d04Sw__w{2Wy;@Ib#Vqevjn(;=b_0p^P{3+G4cz)@ZV?SQBfS9Ers?l+R* zv^xgEp^)t4ftgHh4w4?3K1i&X-i584FvUl=6l~*qm2GuDZ&na8oEqSPn<_H;Od>C$ zJCe9tFVtPS#R0d~P=&~n1-1BQ2gI)uP!#X|88)9_x=$B9l9bLSnN!Ip)8-Ay;B7&f zYkehN^YaV!2X;!u$<@g-tF_Y2tfQ^~w&?fyJ?1>08bn2dgYZPV9x?_ImnXTOsptKt zdaR=p-JD!$C{6mwA7`_!-Q$DV(opQ-M|@7#R8Qk}px-BtFq%UWImKoj*kz(y176#( zIJsYvug9!AI&j`NT6IhlCA^x1H5dJc`Z7$=UZ-)$W%`v~Lj}O4wge}S4vjiObMR$S zwf*hBxeHoW^p2qv@Qsy$SU$#UIA2Su1I%_w{pxB2W#7Ur+(?4M+lOE*Z54LlPLKox zGXdrOPO~7Y(}jiXla?(Klc`Y|Pyj)_Mc_zD9QRcfayD#?dBt=*KMJA@NPd7(+o98=*h}3Z$`T>J>^m|6) z)Yg67Wsm#Q32ja92VeK`8nGbZW?ur59urZaUs-eUZ;{*?c4mi!7ba~R59sQ*emR75 zWI8I%^WzpyUdCMp254M^rSiKYO4XwbyeAK2Wsf(nFYYZ&AC1lP&WY!+Ayuc6Euy{G`1TR_rj*beHj4hVf)rH zeT$U#qah~hRcOZHFhIRq(=dj`wkg$`TO;fQM=XVC;5QiwE#;Nmf8-WodV!~rd3eH*TUk{0S{4Bn zRG)cH{fMnom$nWXOuz*phIIy=1DxX(b`2Q%`J10t3ASiI(|O_J6pSeCL-<;}sV z?j#1UDqs*>+cr=Sb=0@#_HE5LRR(g7{L$E^ea}38a)#zj4g|q9a!}Re@8FT!?**CLq{zDlh$!^)kq%e|u$E6>Z)tb!r z6qOUP>bM(FWA|a(1bSdm#p<8Ic!M0?CzH@ZU?kHJLLmGNP6rM;`~|1~hXSF$;&hH5 z=Y-#F7ry^e;MZS7=0DE7{(;kf{LpXU>i-i?{}pTghSPswP41s1`~MkE|4DK5e=Cle z?K|KFk_SK^a1KrmAWmoJV&DKyM6k1S15-5r7nuHiJO9_6`!TKYJH^2QO!{F54*Rly zcM$}hg|cun1E~!lY-eL<;AZ(BiUXdj{$AX7l>S45^&3iOCILS>!*c4l+MA; z01R{e3rgqy^Bm5f*0FK|kB5I>1|a^GDEc*&*NT{r4-ROR_@_dFXdM_Y$_C6B`ZFu= zQ^4v!SqF^z0q*Eumaze2ioS0Q;GbWRg#{Rw`#sB)oq+>b*`F^8y!k(D>%XBQ{v{J( z@#le#-_?hV5aHf{nZ>4WW?JV2?5SjoMdIM3&G_!F7TnQ3deld4?|Ws9uZ)3H`p?CIPI1%@~IS zttc63o#fJTMPd8Ue!U6v*GxQn%C>d!Hoe_Yz_We5dxhsjYC9{ppJN*D;A`78H?6qD z9J;*IcE1T-w@0s;=;?y9Jlqa&f0b@A<&{q@b@T|= z2K6A?ZlsC1jI=Ysw) z1;G9#;AEqm!L4T5rRnQ_@l0RN1kq6r?x48AUT86Mc#vR^W*K{MsMX{gVGnxg6~0z(II>#xae^<04GuGbhg%W{r&TuRc%H1+Ux?O0;>c= z8qNEv91Pf(rMmH=5?{>bj*eKE;yWTYs_aJUMV>$PJ%XovxYsWkX(pBqSBa;8tCH%f zmx97d@{$aaUty)yE1UXCyh*K7S|z=8;ox;CelF5xiMHF_IL0IYCp%&IM(D$gY;`XM zUqD^Jetn>3 z;VU`g$dEVRUP{o4^O1>t3{nXa7ohLp8N`y{+5lyCCDlM_Z9jeoe)=L^x$v58u$2a2 zZjlgY39cG)*9(EUL%bhdAOH|p;@l@e*3l;#*hQ4HRW64y4;L_qyq|JnOh}ny? zo|s7h- zjrwLRL+I}4msBsDCSQ=}+<*^UC-fWum4v0Lwh^sdPlM%kCKwBZ_eO$?hkT-w3Qq=& zkqB#i=?w^jMJFs&<}67A>IVL&Rxe<-dj0#$6Tp>8*&se(w?K)r8F6|>9p=oSyp?zL z?XdBN&HFs&=S$tN?x(Kn_m&Sa^XGmy7KE16#f1t6S&y zFw_Viz3;Tkb32E}iRwP4>GiP@zhUT%~_)kGHJHTWP&i2o+TO zLT4W3Mrkf3e`#=@4S(02K$j{Qwf#0B^UJ+eM9y?KzNpX4v{`Tfgga=Zwh7>BQ`QR1 zZ)@eN$ibdxEv^VG<1neOy}*PeY%DJdzt&!7v>kZ3yK8Pc zDyMi-wONzd9z*R=IIznNV}%8ry<(7a%0w3(Qi^IcIyC-9?su7@+NH|gy$$E!kFYx2 zNJD&hm>_?>$Gn<1G_K8-Ip1)aJx<@qp%gvH&jf49T!uHP2bC^NV!Dm_d9k1-ubdo~ zvkDHU({woKzy@V^Az%|!vq4)-79}j6lc@=(Aj$&urls6i$mAn=-3MR5;dS7JDl%^IkJr}T2V-&so|c4{h&U2OZ=jq);pSrVJ{H z*wmH_+9dm{#X!LrM1zO|Fc1JUdf7=cWM=GnCMo)n;mQU|! z^lLaIU=hQ%l#=s@mGNQWf`fNTR8VqEd!t@#e3S>oHDraA_uev;NneB3Metcyp*&4#fc05S*&%sUgzd9Xvx;z@3PS@Ue#_@Ojat zeKwnzWu?PwtFu`5z>e~asEa|BMZq-3Itr*$6Em+g0-fm-GixW!HXu7d_|)zpiLJDyK1790>&*XjO?7nT4%CSgb_mjCX=fw&tL9zQ-u=B-=-i& z-RebVYEdCfBSEir3378Y$=PzZ3j%Z73d3cfgp6~vsQ}GkY`Q8u_q>PcNV4UN=!X`C zVVv$)#xaw0oIH7XL!!zzuY(l2XM;RaxYxL(sZ&mCN-sW`1I)ajtoT&b{UNvJqIw9C z&AP7zHXj_{gZ4l)?qg8b5vjh@%yR$8#@mGLqa~UQ(G)9hR?(L6vD*Y~G{-_nnp9)7 z;lfEs^#jIEBNoE_J0=)rtEmTn2UG_olwoBk6O9jvauC!Mw`WB};)z_yHn*}D?Ws%| zl2@oq6v!QWoq+U1FoQ~2pE}>L>Yj=km%uxv6iUUss<2CArlHA$D!MUgvZO8ZvYlic zYa}a;_b>5yg0ZhsQ`;c|q_(W=ckZI)Q$C2r8g?2OqpPTq#9XdBo%PSeR2=KKG(C)L z>WfYDI=y9h^#o=}edBf_xZZ;&@btMoHi0ria@wV>-w<#B+u%F0ezeqPe4|akj8sm$ zmR!a#V8_hs88J8UynNVg^E!FS%JnjBj=x~qCle$N#uc=BGc_C)1r#S$Jw<*Rbrn`w z3u8nn&8!0wDkQL&Bf-A6X`J{CPcfAF{r-AeDGKI;4Cf;ax_xj=mNUb0h5Sw@QUIN! z#@xX56FZcrS zaxe)~U%`CM19W?nOi;@%p1uv3KTrAuGd z;$9r_+8G2-V-+j7F&Ko)eh%<7&}46Wb#*Ve^j1g1tVK}O7BJdmN3dqz^wecyNiCf%a2IJ86S{30?<~(F^IxEQ?MSaqt4fKJ!)>C5JKAq||lS>i4+~YxB z>lp=LC~txc?=wF==9W=o?A==GnY%CiK&X3&^*6H0Sz0uZ#L&FYQ{LXOL5-0*b=r( zqo~qdKwKB?kSLroz(Aw&`gTkOMo#VWD(<-u5Il>y{Zc7=%hKSpoQtNKFOY&tguCDoU*1$0Ul+ht;ZCmxBO92W#h#dxf!;3CmC zY3s$X@3eAK=*Xz|^pWMAi*Pf#!6VWa!pk=Cb|HosO%Yzi@Ckwij5pf@W_f|S3q}JN zXxDv42o>NBwEHc*R^Qzd!`hY>oV;S82{hyjyrEfEF+7FQDCm_>zMPtVn{H})2DyMJ z*85J5{GEP*>sOnCKS-W`=!*XX=YoI2i~Ooz_@QV9@*+Tl^@AVb1VUfHccKJ1`}F-k zei8=*k=O5l`u|2nuy6qN48YTHP9}B+R-nTK3n$Rh0Ejw)%41+Q8S6iX`~T2003(6_ z98H!?QVNX@_`k|4SUG`mir>{0-@}HPn3(@5_wbKmfQFvGg}D6#(f_ia|0^-_vwYz@ zYr_nbd;qh{fU*T(rZ14R;RFu8v2p;VAe=u@N&v~(+0faS3Q^N?AAyum*y??0{XedphzWbZ9aB={J_Q0>e zD!DlR>4W{ZK^4GX_xtYspk00u0WoR<{iUHF~p;bH~+b>&}zn>l~JBr7l}ngjUi`tv2f|8f4!T>>x3{GF=<7RAEB%D@Ta z=zd)d_=7U!kM9-#HB0o8x#Oc?xS zRO4^wAbxtMOD28~jsd~K!OrsQ9E7aXMlWjXfyOCTu?)c&e!IF&F~@=Rpa9o9O#u%d zKPjc|G!Pt+NV4bq%Vs~&DGW=G8MB?BJ~n86{v`vzl4#>+gYh20^4-Jx`h}7TfkM*` zssW2$toj9U32fLAn0Ke2w7z}**5AIpCm{Bc(L@aVTz0#dp<9V0!#hRu)UxEtRg7HCR zhcb2_@{c3>o}!+EBLO7nF9C^!*3)c9+f63HqetSDs%<(I5u)!`jwDIP%~}Pqmhgwu zQi(k^L9IUusl6;Ba2?Y;JKOfmqtX+&J7D}6oIfdRA5WKMz*BZ#$9EX9%+IFd#?PiV zmpr3;mwDl(T{=Xw;`Z640|IW*$T*-P!p3*;rsnEnuL4(`b2XcEp#flOlRp>%iRr#}zddCZsS2hD3O7ZS zw#jUC)Y?4I8?Oj9^D6?pg%`}m#c|%As<&P0)hN|k@^ROA@nF)rBG^#Ssk!aYBIr7% zyO(|FmV(Wc85dMVEnozXMzNYeEJ+ay-4E(#p0DMgfT3F9-@ASW(xLx}io+`BGfzZR zU{EF%(fHV0PXi{0PcO{YJwggKQhO2Q@)L9q3xQntnYjJS@nt^13iQXZOUHyKIB#i% zjR=7V;tk4Ck+&$M0YOrQG1GbzP>arQS3^DhaLHzI<)w;44J)c*@`CcbPseAY4u=<3 zjUGpJ8UlrMP6qFn;Rz0yJ3qP`SxS6D6VSh;-Pk(Fu`M1$WpvG{Zsjw^F{^~%m+Q9> zhEM~9e|wgU#O)OXn9M)EWL7mI3e=I`N`^^`L{BSRi8no7*mhq%5l+r|G)MG6zp|-J zno5=&L(VjiWF6+Zcq5@gQNWWiRt0EKx7w>Wv0=}0?4>#3k$VTWzXe9-4gGWizFVTOnW1+eW;5+xn9T3cENRA$F_!a49?tFa~cYKU4RTr@Y z+!SrCRjtdq0DjMlpE(J0x~sv>>(7zK?sJx%ZF89!b)zko@QF7Su49vJV&@w*I+jo2 z>gzuw!i+LjyEV6Z2I9eYdOOF-#`V4OZl#C=YgeM2jJktbN?`*4oZ+0lvwEN)OG&mWV8B@O31oo&GCRBG4xr&-gBUS~{@@8$MjR`rOwIB5$|4%Gr!;3i=No zI)`j@m{QXZ>@Cv!s=-b;iH-D?-I$dPm((k}9SKzV)wbq~#@GhBhoMEzA5N zeI2YLaRjTF?KJW1htTGHVsD&`h>i!aFr|;C$eTgwKz|Fy@FqucoF{ll z>B$Uxm1VV}`kPC2%u+cwaBfW{c4lPyW?)yUgO9GrHlITM|_ieTog&Il1AaerE$6SYN=;xG=QO%gqSwqZqMoA2cz`mvI9@99vLu?aaE;wp!LGsD ztXE4sRoCO5wwgFN2=E_Yh;ePI%U;xuB&&BrCPvReK$#Q~!}6>3%TvFr@f0gUt7`@{ zg;WY$XA#JJNS-SVCn&yG>K)U>uH=GNywqyv6+EMSNwN+d)1fY^=8bR#MuqR29{m&{ z3>7#~=r;`m?vUMcAeNfOaU(y*z{7n8nx&u^{TU_Y^<)EGTXc*O0%E-5-PZ#cr%pV7 zQ#>uu2B9=3o{pAULAauj>Bv*Ch$;OFta7nlQ zQpK^gkpyYQ_>5iniz?+CG+wQA+t8qDjZqvnQS}{Hu~_>=8_>=DlX{Kk2A1$Ikl?RC z6ayV>shDPs_4FQZ(eOR(J@njYJa<0fFv&@9Ga24h&yXi` zy?DsXQ1E$OVA57Fc~+x9Y2cFa09f4X4pyKPV$AQBec@;eqQoGlktM!!Vx-bv3TM$K zEe>_2<*ltyvo)6AWcZ+@h`f!Z@_8VUO>ety#A=eZe~EwXk(J7{H=3*STYlMa5ZT9s z1`fR8%qC>lKHeD#e~qNMuG$rLz1Z+eX~jKKZsiIxGK3UmeN6WmJ=03dJ%D%=8&8%- zO4KZ-4Jr;2S-iF9>^gTkcexNBl6x%yZXvZH6Euh*?(=IDynAq`@Y!lJw(3ujDa7`@EVdbrvti@zt^qN)RinnX+x%>_A=l%YaMsZV+DZHH#cO2B?#MRbS@yKO zZFS;vk?)6J8;Egxu49m^AZ_iU@1v2l@fAHSpofOgyj*a-kudNN4Z}AT&HL8rnsD$= zruS>I-J^88zqvf0^%vv~?Z`)_(kn#BqhLt^t6UaQMwr)a7Y0@1P%}1Fw2;X8v@RP~ z(@n;iM7)fLw3?`m;$0_OT$@ee_j3&qNIMMn=vI=SqngAeAWpEDJBX=NKk2Y#!`nmS zdXc@;9QYIv2CA+RvR7Dhq%yOxCT0%z_y%(bDFxPE~5pTYuxa&}C+E+9IVb<)LKYw+zzsaLW?^Av0B`}n^H*f@M=Yx= zwG-0kH!6H|^+Lka9WM|R;gPe%q`k>pD_^*V0q9b&-_r5h*Ukxmvnpe9_y*r8qz!%_J({0w86BZ712ky5Xz;c@L)7G&64NQ+5} zj42Ar%cDs~ybiFq(mB?Z--fwWy-;-R`p&+gxsO^-Hp=eZ5#h=*T1|+;z}K@I?omgEy^oS3_9%N4e}>X>KpXkbMO}7-g5u~Md;d2b}U*g(D?@4QnAkJ zPb@V=YP>Y|jwS;}c4KhZ;N0C^`QOB=4`mCel<=-8hvL{ogb&cvzS4T%XWJBo$~d5v#KqM; zvG95^eecc1EZc%kDt&$BhHEZEt$1|#81()vF3CRlhiB`XI`*+3%M1pwj#Mh67`h6U zrZf~WYYH)>zRcDZk?yv)nR1E5HPO%0O_Lfsq~lxw$GT63mT7!Gb@0%zipmU5Bha1| z<0J7ZLES}}`za^28M)Bc_u92f%#AY{n3iYm71hIRp3LcBb}K8Zy{wKr8>EJ%7x5d}eG?^qgd= z=IXWtq`^_JaJD3*m%MHCbBkpjAoH_)i7Jb$93_WKJ-e!F#2 z-Vme2dLb1Z`|G89RdeAxNC5?1a}MWwh0hCSa1y*Jh;2N6FiU*T!I7- z;eS%q)t##9?tAb1euMKcpR@Mb`vCK|#vCI|%r}wQtt?2n?Sh|&^h;{Yn~dNv-~-09 z{)ziy;=xu!*4cn*b1hPyJ&`pPC{uhIp19r1936i5kb~peh$2){Pz5PxFWD2AF>gDJ zL{1YTY}x>g;0%|8JTVNHOm;m1{gqT%WK#2wuj~CRuLZulS6%XLpSlUo+k4F4O@H3X z>;mq6dzU^adGa_}@z|(6z|Ciz0GfO}&qCzZUuwsOhj~#mhMUl9%FFV)dSk`bk5f{L z*6(){3y)N_BJ8^vgnWy#?`CZxpQ7xRin-$HkPxUx+Mb?eTHL^m2T`t;W|@=v)*pme zzo2OA6w0+Sp1#RoVAc`2aMn1S8IImWR)l`iIXbOCHP+A&B=^1^Tl$<{AE+T4{LzlE zulp9qRi9ly-2Ng9ag zk&r2MK89FM38ZCVG~&EfHUd6Nr6G38sG#C#DF@$79)D#P48&ixz?jVOfA3zwKFi5+ z109k-z>4c?0)C{7nK(SYKbvo0`pCH$MEKUq3`ImMg?Ud@>pQEs-Ke~I)nVVA|8y_{ ziP1Dc=zPuvcDweA9QcE`Gok3%S;(ge7vsdyU&&+{xL#%=R+F@F=Vb#XoA$(c9tcn} zqR>#4ud<6>@G^>_bp?#QLC{43)wK!~nk$G*#oX|rS54!r;kWC?X76ySA6vS61urzI zhlE!^YR;Y)%>n1>eCC(aD_!T@=4E$F+~+glY{wMp?^=)XjaN3tP%L zKTHJ|>2d)-a@Ha+O)SyPNK+3#2ThPaYw%=ejSS9}?G1hf%lS7TN+$%3;Dy!;G zYcbi+1#U*8``^3v=(E%fJV*BljWmgd(G_Fs?6_q#^clx7d@I`xXGL~b){ly|8%>~O zbxTu8)gKOJ*~zje)5c=Lh5adm+O4%k;dIK91dbD$9?ptLu|GUbB01tASU1Cn3SUtA zy+V1`8=h$F6rhf*^jYz~=45>q-H$D#)Seth4`wrqaj5*zH1f~}SKH%xhEul`Wq&fy zUDIpxyd4v?TeurT2M-&R92*rvPtnP(1P^U&$^Kkra31feS@I1uEB{;XVpuidMQCr; zA=cWVXWWIRc$nS1l5jj(@#?~oVf`UUtV$bh#4@Clk$`#~;$8h#W`J5O$IUmY%^ah^ zD3LF@10fm6EoW~NN7SG=Ctf7wQIuJnttL$!MF>>D32oA#COU9;;X8fXgu_?7uuXM|X-cgfw+^X;b|jeJ9G{!TFssQ-{L zQth$;Y=FBWi(b`E9`~`GT3>hAFyx1@lQE?Oc)=z^%<%;@xw$U&G?(wh+}{qSvyaq- z#;1;?u1Q&7#jQ&=5_Aj8;V5*GzMF7-yPEJ-&2wOH&>u9QYvQ#)#8yT>tIFRjDsFpU zMV@)JmW@a{lBLy_eiG68f`?Hb%8BlANbPzaJ=vDm5%O+-4bdpn(TjlC$W= zL-D19(yNCPxKKC8Kf^4P^8AR_EiiH9HrF<$A7eOMG8XTv@6avi$mjJc=G-L(WeN_p zM%Do1Wh|y%mU{N5d}o;7!s^}`JDaLJu#@KqGV^%{?wGGM$XR*T!#EP7VDy^3s zedUMVu#U;wlx~neyo@)5x1VNY!t%VZa~>Kr%AH(a*IxMZ8 zNv3^c5k5X{KKyJk*_$BfR{XrLQ;3qcI6xIJW~__p)utPJUl|f^?7~ry-YTU2n(~;B z&5f3G9JLaJpeY68O$prH7u~3EX=F`78oME_fUWN#MDihK zIAsb!Z1AmpscTeNpU!4sNk8Pxz+R*0NpYhVe9n;$IzfsC z@I?c{6FF@;+ch}#H8MGlr*!NLTo)EL-|pM+)J!v%A|4hyWS9m}AY|&lXkW>WU{Cdd z!RRU&Dxa9rdn#={CH1KE*olD<T$u|t?=Q(!j1r!4!>^nQ z@*JOt8>X~V1uC}A%^e$8oL8_Bi}hk|*DlW*gy%))ppdUJQ~1Wtsyq~amNAgeF&s)h zJv2j=#HR>Oqu>=?hQZ{7mGC%bKLYZQl_r{>?1r93PL0MkFb_qq2{*)y4D_c>HwGx% z!;Z})tvmUB`+kbMz#|@Qr_q95kS8&)0}2|AICH`*?rz#pD#-98A!HrxcU}8V>_}9S zF!X7}?{2R5%e){T+96tXsOyfGt(YBr$W1G}=* zFx9(M1sVMU-oL13#sK=grb94&Ejc>nah8@D`jZI^I?2|~D5_`Ks5716fuyB*^Rk}+ z4hu6>@4Qrg@Hu9vA1Nz&=FI-(9mrD%J~Qv!Xo7kLH{FaGwwY7L_@!92W=>yEZ?C18 zaI2f>xE7l%Cr7feA2YtDju5cz$5wdhxYi|E;@UJ5jDANzr^I-D&YXaK8!mbBAoX&f z5>470Ua&DvA!Ykm!MWOUlgKuNL?-NsZ!?t=jDsE*=hp$8T`CL@o9I-M=yo&uVlj^n z&LYZAaT)d(+u{Aex|@lu8)=Sh<~DX6@KB^L6u#n1%wLn^bgM~REXx4s)MaF9&xL85 zQ!H=y)T{)$RxrIZGf&Ltc!w@#+D(uydi{BQF@-W;@>;VRqm5t_TJqL8LIUHe`o8wL z^C}Q`k`VLy$U35C6~h(HRa|^2@NS1=wgGA`OspF(XxJwUGM<>(lkemo{c!7!`N#mD z+zdj`nBXtzOIZo=Ie7^{V}!Mjod4(%mJ?dC%kLjZn?5>uEc#F|=mW2A$%h5<4VNoA z1jaW%PP&HK9?ZN_Pc!mGaX>BYvyTQU4MY}{WTof z67sZPK$A|N_;b4J)teNzyEm6jR&e^H>43qLU~XlVKNxK7NBDooZ6Cgj8Y zAZ>qGr)U}@i0~5t%B%ZK#4{WOnD0W2Xke34IdWQ#n9GYnCw77~&Q|ppEGc#d+~$3_ zISB$XCw7CdFPd$w{pedl*jc^2g~bfjTvD{Ov96RD@V|_M4nf?@>;l!tY!MQ8B8}fo7cE71`cyL(2pJeyH%Nf*6tu0YF zq?{bxEgjtPuZv!q=0FS`WBi6rYEPnf;KcLG0PmRUT zqg}|10IvWSMAX1T#l-^|TYy;1@`1P^S_^*Q-=2Q|Q`P{{W&BlR@!P`xzpm}i=kgGv z1Av_u!k&1*5HSa2DhCWPY2bw9k3hT?*!jW#UjOkwMqB*0q5sG_dMtQ=?r>58eu}B(J2PU8+c-qpiO1QaQU6LjoXeB!-=#b9bXRLMad{6DP1SR zr+Fnxrwp&~CBApm^}k%V_CNc6a979Cxv;O`oN{4MQFUFe#9c7XvMsQM9CM^2_8z|N z?)q|Ls7pu8iD&olvv);q+0K<6?JGS@z>B`~)WeUgOiI0Nrpo57m8h)omQ1epaw7T5 z;hgxKvf@+~IU8E#De58_AKZK*7MK~ji4KvBP3P*}xp@mmTkUf12@Bz&XO~ykWC@Nz zEuH-L_thcQH(w6(ijy~Yvv8=G^UZf<*(J009Z56 zxgmVMa6nn>w_Nqf1yIc}vF$%gt zw78|z2456|$G+d`Gd1&2(g&wm=gpf;Dxg1Rg(|`l!oS-zWSI(hG-eWd!5llL;<{O7 zFv_kd@43t*RG3#_O(i5wBv1FU6iBk<%0!KUQ((KQy~y{@-h`2VM6R6+O^F(H)V&-~ ze(~yEVVxj-QL=4=2h%26eh_YfmJ3$liX%+TrFgE!?cJxUm5t99#x$pUnw;ddEGMo)dOO&V`H!d;$zajgULo zy?C~_KT(y3Z6e7Kl|*MYh7`3jW-NIPhE#=(3yvk{W z$)Og=Vseo@^L-^OX)CH#?OTU+)mZt}B{SbmE!@+qY-|xpBoc*unG z%6GeNYSg(|H{D}we0ytHbPwRo!l$^^#$!)y*quF~gO%j*!!|^A-pQM;!#d8?x)OXg-b! zog2tc65H%%r5653zaq$>=bxX}3x8VXYCn-~Wn*R=1Ny>-`4(ooJ2KsMGpIp0h;?ty z4VCCkkP6u|o)te=RRYAWXC?|1e)a|9F5=;2Q12!z$~Mz$(DEBK5vS4d&1*-~h6iud zbeb&PFx^AOY3)fxT?k+R{^q+A6p+&+EFk=~tFlP{0s|c(Z`~MPV}x^!>4BGIO@Z7?4sr zr{{(&IK`G(IFv6o$A-E=k^a=@GpEWD6c)_5$CDtYJ<})g;zPs$q3|ZY8|LAp>D{y^ z`(`v9?2$G5_od`j6#wbDY)nAFShRg1#hfJJ3#{Z0(_*FuBktX}QxTt8WPh zn}R8>c?R8g1OFz#%hj ziOOf9d$`z=jE~|3Q23l{$k{(0)JZp0mEN-&;k&@m{2>d2uZXsDy)BDPwfp)|21hwq z#!V3Qy$&W3@z+Z{H_V|qwbpOPi<&cN3#VUn_6S+guqf?P_g+7{WtVlaN>iCp`ZPkG znl(q@Yb$T+(_>zo1S*}MrQ+bYAWC4-KayQ?mRE|+gQb=Z0*X}CpcUK_Y7OE(*+x7m z(#tpi-F8Z+8{8ndEid@{*uMTUu?B6Cx;De6{4Mb){efxFjTmlwScAxC7HK&T#EZ4= z1}{NeZ!}(5N9@*T`~BhPU2g#{np1z1>5%hBpocg$E>y=LfJf9u7YAbGQTdaj-J%!o@(08^UrlZ}P3_3I zsTgrtLu?peKC7>|rl_KM$L#gCykBWlA3!v6%lRSm1&EB+f`P`S86ZwL2WzC{<{K*z zBidtrpLMGZOz8c>QRLh>{?rs@-|)QM_2q?j$#WWG_H^08W@l^~f-w!I>2GT?{=|x5 z8htn81#Vk>;ZZ8~VU2Ct!y@K4 zD`X8R+W`JtxrbaUf4B$EkMXbq5&DU#cXv2O#j&{lN=5vE6qeW2KH3=OMqG?NLm8oZkx9JL z>BoSt0X=FgG?YhDgAK z=VoW}S6ZNKMz?Iol}R7rJMs;U#iG+~4zzEo4{Fa`EN}1bUs{a-y>|hC;8LKMonLid z(lnwlp2-SJpS#G`NFA{VTq#}yLcX!+;yUmuWUL5!xkUQG6j|zE+!`m4@{$3{MD}Zc zjiS?hD?Gagrnc(YRMV9v_t#=tCkHoecGlO1xA>ki4*@m5T;?BtkmsRyD27844H#rEdUB z+y_`s9t&ASB8@w%_VHlcjHk8nQVYWq(Ideo=|tR64nC~l7iyd8M976@(U~jg=F{)` z5JUI#TcU!Rvn;np=eHuM&VPCL8_NSiX0RYXTC%Wj({7OeWtPU z`i1lR2120@WUVIiL4U#m%3)R6%g22Mq)#I6oN`(=@$^MPq5|v$<+71La6tqj?OhEf zX>omRHngOP7%z;LYd84!T96%@wq2Z2_S#Nl0$A?7W(XR3@dl33PJVX6VQYkwjnDsSS2`p4S9mkLA__8&&-RM#{)W{Mncf@5cgB#o!G` zUwJY*C_H)p)xYbFL!$HHnCUV+J*{l4A^$fd*dqgF0!Ft?JW^%5K>usr?T^}ish=L) z)hFN)zh>>e*ZpP>2$q<&bSW*l1L=h=)k|8PFFY6W9DD_d8_UDK_c(pIKT_io_Fr$U z$#nH*8e=$^b)CK_RmvppN8?DYKBB*lASC~0dELyHjPE^Z2v+Ot8QJ=A@PpeXsW;v;k1fnA_aZfL<#!Y5XMq2t-A}tIcYm1UKQ>TKoud&09viaOO6Iv|V#zevG zxz~4!&=hbmS6%GGy&eZf9O7iA%gp&a=*gFMVlVlsyX#@F=O)(h<&*WZ$Eh6WGFoeG zh?!-lLkRmS#j_HDUFtd&i_dOYC9Zv}x;n?td?ib{7f#WQa_e4cz6D}cNJr)^QDUYz zZ-|O(Yo2ejO3A%{riHz%KjrJ=)RUIr^kJ9CPbV(!v=t_B4wuEPM7R>Y&(9ESIWyDV zpt6!W{nDz45SCT~1$6l_#m^O3};x^?*{ z_wJutY%lSQrW<`E5HtsF8x07&>S8ci-i{Kwdu+@ic?ecF<`I)j^@a@?pm-00@EPOI z-qZ_=h-qfYvAubXor=p))r}Et4A?_iF*h!8k`TRQih0`lG6MF~gaA=2C`U_;_;i2Q zD}Yv7ibtu|T0V@%nI)8CCQEg<80J`7ig0mDPl1qXU(uCfan`OKL{^&-Q%@rl8o4D77-nH zi8K);vc7`Ap!7N{6nCCDc!q+fhW)-L&&F>6WI%W&yLimwHrI4%d#W2u#f|Ig!pO9l z>8h*Z??!;Aq6`M6ryDEmNmjE3SsnteN#5NbY_f~D7R4(D>|0e551hy`ZZ0sqUY4Mb zS|0^uI3O;tQFt&$YeU@>AokTIqk-6L^72 zDU;MR6wW886H8ycuj!?wUu)>>CgV`~I%+QPG11uQ>zN=xaB%ruFy6xq$IAX(w@pR> zMHW4cNP6NbbC1QJ3-)g3uI>?9c1DoyXWEmSyQ`(?i=SUXT22%&=vP7izXd^%b`R1~ zL-aNO8omL8{xOfEY-wR@DhW7wQ~ib$csU_W`EPy|YNoCbibMtG{EhdZ{6c~tS*(8p zKfk^9M+f|W2R{&+@GmP3FeESZ=aM1gE0C5OvI2qM5QYGR`|$s1VC0_@8NXm3-oIcU zFz9!?h=008{JvlR^3nLsMgxF!+JB`95T^5I4)N#8e-AIfpr4rRkBxxHivC&zp+=CA zp}*1x;OBk(3uXCRB?R4oA<n>--C3`CH*n-~nMje=qzeXaRn=?)YmZn2!rG&-B;D z+M)b3IQg$v3FhR11W^5w2ldCp`qzPuf4n0=^;56~84luu3E%+F=sMI56nsacRqG&wP!N-k>qYe0k%v%~AHGr#7phHs!1rhk zT-nIHFlEQD3>m6C;82B|hOG8XmR_Vcb(l?JFhyhVy=tNiD2zaOlmll)!jHN;Es1!(=)(rIt`Hjf&sTq}G=u2W1PV;bM z8D!^T#e0)1kwAi#HX*8EIat=ha=Q$z~eU)Rljzg6lm?Y|flN7kVo7+US*GPox z``)-B1me_FF2yjDH=L9Gud?W^iQlAx7<>nJ&@e9S{Xy5=#@LP$W3P#v=qkR>%l;sH zZXwz1^UQNX-LoJZ_n69_S(I>Ml(?AXz1MBNi&)02n68g{%c4x@t2#lhARlDL<~uIM z`ES}h_RL#jbJ0(<)*|5z>0k2c(Nx_~p#z~PNk zC9HkIW^9n#2x#W%vzuiM9e0X;*w@%S!gElhY!D9;H%B8e^Cj+d-pX6ZJL`61WM5yQ zHg>dzPl!Yow)JL6hY^Bu86)#}(VgO`3r_F*fQ!Ld1odN;*1e5|Dhwy%Wi@Y`D{2@y zaK3M4%=cobaU`nJ9wADvVmOH*%WKsfc6CVw6&X=P03h`oRqR#qnXMzvx8X}bO?$$( zHxZw}i*s37z6RbJHGG3kXgsl#D0%3)Pg35#th>50*UC#sH`$!=gV)?HL&($(LkNM0 zHiEI~enRdvGch>4UWI!I5I*YO_;5Q5#^*JXV;xUMzq?zv2&APxwOFz9UA<1}j~!nN z(#IAb0no8!G1U?Tc8}3;Us71e%vGaKjLfo#SBR>NSIqglBi) zgkjP%ct$swoD)O$cc*9Z>XU}Lv8zADt0+i0!;xc<^(Z36Y8*TUKVD`+zhAfNZcBC$ zT#ISM&PhMCH%&Y|n~uOnx8a<&jLSY!$?lhb2H+Ik=)ZNR&obe_R3Yn;|NO|m57#E= zf&6(7kM0iV0K8lQZ=oI)qJ<+zXkey5$Xd zprgPplf$^WlZbKz1KQTIbC;3`)I&R z1UvyL^;y~UQQ=K|uwR__@v>R7z{>v6*^z-PGGQo}%@-In3kF@!!81KobMQPgQ|B?Z zQcy0)BYTRPG9S6{37gC!NbZP+jlzYTBF^N3QS}p*1m4HilC>?e`!`gij|a>v>lc7Q z#i-!*K;cndbE5*?5;GCp=V==D*o4YrX{Ix>A=+2NGtxm=T%WrIFkfPM>IsFALt_C4 zk1!m46$n^Xhg@`@RNB=U71fD_KAzvy!heOLKXDYQ6eM zFkrs4d!{$N^_tr=H`FNW9dF)^-jbqmXvep)9;5SCqF^x*^F@M<95}!I=<3u!;-xXY zCL9wEVL0-uUQLra-%{He!p_De)V5VXIt*&OXDBkJE=Y;RtngMgf5!e$C(M@+CUM3# zXfO!{MiZN$@_Z>DN(j18h)tiom)8f`K{2L6pk=-0aFOk$PbH$B<6Cdcj=4nV)$DM9{){Eq zX@bPKdH?#3Q&ShJ!y>E6&*HI*z!F~&?1DR|`J8n~@OOd4AG%T!rD1AVfdWiO926+M z&k^A*Kj%^LT&ZE%uG7N6=Yd0mL4!mnFv^JV^zz-~6i<}tO>Gab^EM5p=NElUM7*|r z4QXg|4WZ#OMzgzq(5oAEc@HiE4XK~yDAQ087+uH^kIHa-epKr1C?2x3wT0mxQW3Ll z=qhixRl%UVV-|mzjA2jc6IbmU#5v2)zfr-hRi1_>zGWeIc3t+JPg;1LUP`Dcz+QP< z8g=&>$6AJYW3H)HP2HgkUhr0cKu(5Q7!U@VF2?gdPHQ7nfnDO0n<@z!@Zec9?4^9= za{PwyZAZlJl@EFLL=fFlH}W*1nuE;#w`d?xgn*kFvFtgfCVrd8$9@^8guE}b;5*T- zv8zL?`r$niFk@oWCmQOi)3L)1qP&ozFxFGrCHNB0AHLA`vS1%_bB=^UOk^irL)X&L z2YbYHIX;6-?Q+LSXSR%5AZoibK5nX<*Qe%5xpE_W=Z@l-blS+u0FNNTz|73ZoZ8y0 zjxUQn+=oo0x#HJ}5-U%0RY{Yzp}7Qn)%o)Zd~f1Ea(V4?iHLew17Eya{2U3hPsi-^ z9qJgw63;mu)f191Z?-gg*?;W~A*0hLRkHa%+#rhaHanmVXu zGc{_o&vCrH9Qp00qHEn1Yzd5CNOM+~4H$jz4g+iK@ar_)@vOb5)(LLV6zndfUXHb~ zUZ>eWms!?~G=Z}e{Z#TyH(8EcsrE=pTMwL8{G;CCNw1iD0-(gBl9bOQhjR1K7$i&VVwh|K$BY0`~} zQYXrs%!n%m)xa}o9W<`&4f${7HEVU4WRx2jWl)NV=<_Y`kyZ;ihk{+&7?X&KG`e;= zwEiyK5-FQD5kMF`@F9*;&|~**j)Kjk;TSgA#d}O+CR{^gynH>uql(bTH#~aqtuO^B zNL!8fPIBYjbJ%ZUM=jkbMRQ`Cef`T{NS3B|zem&uN@river~6frUcoU4)~Aw&x{Oigs~SMCRYG6q`vLgxQiB79)Yk9gkOHA^j$bIo z4Q(ikVZq7CKR?z&R1ni3L~jhvq@KT9=hYD{e^g7ojbl91*+_iso-NTo+uikrHx5m^Iads5R`oDhn_MwSveL8?) zDDH83^29N|j$PI}gm1*hPc{3Nigxwr!!2uWbiXzbgX8bLAyGqJtBbL3TAr8PL?Z1q z|54u6xTA4-^2@LY`gi~aQ{Cu#OHWUmg#_derN-v~k3)NZgB4)y2rd}*L%D00ksyZX zPSuMfwV~n)Pr9!Hgfo!nI^GdnIwbJITbT^bTpF^@v(jU+;wUAXS;l%39b_XO(^)@t zgJxxbeDDJd6^K4EL87Y0tCh^Xpfn0`mhHn#>6shRO7^Nm)%wTnPjjpA2pLLBU$0hQ zwN0C?u9H)SZ3aefBO@}EUzNq3p2^<7#=uZpR`pK17e}Pv@&(HhJzqLR%{s#&ElE4_ z6mNw_WI?$Q7&MHFcJK~Q0n2Kb#iXd~u&?U^U!x@y?yHnbP7aSmzn*L??}`C;IiV6* zMkhT^L!iva0W|BA-qwE1CcZ~_9a?AHe*;DSG~M&>p$MeQ`zsWIm}fv<0{+KAq`yNE z2($QE`X|Sc-(UNqTm9cd5#V=0$Dbu9+}sdz1&H;-Pay{glDy3gNiBi+XHY?;G3>nD z|6b7XKPgVYzljt6Sl~}s@!Pfme}N8p7$YSsMU|ELP=DX6rKYUbm_7u@e*Jbd8I7}<)kU~{Yd$Z^Nv zC}8;DI<`<&a_~8?apBmdWMwe6Y;QEpeUL6MxFsh#Pvlz-G}1vP&#H|aaYA5_Vat8Z zF)OX;?DPDH(2W=NW|<|nZyMs6u@g5c(y0`7iub!#^4g;#cLn5eJsQ5p&`JCN8ox_3 zJE_^XR6lzqX^f#4U+!tm5_`dpE2?WDsdWObK6EU4)_{1id(pYF#?`Pggiyer5YtB4 z;cd_%rJk8uMUH~^0zvDt*i&;pvxYs)6_tRx#6aXNbxcU+(;_+Fx}9`78u^{FEcX%I zIeOttPtYrfPN&?}-YD#YsME3n5QjOM*?8Qj4Lf`M{+aU9a06)2qSeWWlRsy)ju5S3h%7&T4`)&3`q{=rIXK|3Jhkq zeiCEInaDcO;DwWe(!`tDdOQ}`?DWXpTi=GzV68-*n+~&ks(bPyibF5~m?hl=#tfH} zCkF2-jnkiQ5Hs>z4{FGWgu}8}Dov!`tG?h);*gs6nVy3|XfT9V0~7b;`>j5^u44Q4 zf_K{mX&9CjEkZNS5+Ka~Egfs{LFw)%Rgl`P*4ut=w2HufIR9W&(o&}SB<{20pfUAO7-o)ucrGXgg zSYmo}di~v&fbIDcTRVo=0oJw`EoU1Zjx>$VjI)!(oZhC+R#Q|2I`KUO>@>3RxnP(j zl>8JJ13KkShd^U1=3D(2fphU+Ja*{blgw&AQ|Nj(5y1H5Atg*e6Yu;W#@=DBT^{CG zN1qo_Ss8|>Z?TZB5pYw-xmkm|C-#aEV~!kK!c^*&>au!D&0osj7SJr@O9; z_|{=KR^hohES!m)witoOWjU??Xf3!%G7}w#TRHz|%J59Hg?Qy;fhmMqHM{(?&-8d*z3;UW#xyPAyMRMP?;Md(pI{L7W-v= zw%#dm;1Uym0$|6b{>f+=^-Redl-{)Pi2GHguitK1qj>09+0)_hxYe&ZDxMQjF?osm z#(~4l<{H8q*{Q>747FaP>+vrLrt3f7_)u_YY}eKMTDnVo+yq5tD@S_+!_Y6ZSy5NG zo5`>&_mMaS@5wuh#W}grhTsF{U#!f_JzLJZf%3p&u!6N zPxE=Xnn+41+G^`_O}i03XrOTtCiG&gyjX>0c_j}lxjEm)Y*5d>Wc+sTSjxDa5C% z$tQDi{zbV_c=2w>c>cAUE}2+&)L_Lk!hi_0zLT8t&X|IR7ib~V1Vw;)D0a%gAQjh5 zH|-2?jVMwX0YyH4CuV|+6=9%*oOZLiT;kjay|)Hw7nC~9Pb9?X~4?f|B zOPlOj96x!hi}Oa!qwQ8;G#XDn-!^PSdN+&HS~|4Dm+){NOLDh9R2r8H89Q>rlyVDN zp}RuTn%kEsUjx>vF0`<5B7k~$YNt(BwNI)0WNwh-%{f<-{{u1>%} zS|Rb={bXhLyhY%MX`hhZeF08Ln+L<3X!ifuYX(L$-exO`&CL(tT8u-Y)D>_R}WPtEo8SSD&>H#`zJ zdnz|!-ML@J^SzVIRF1bgEVts#)71J#4&(YW3nwa9}e0Wx{i(3U6%7ZjYGNc8uYY#5|8x)w8lJC)rdSO_DR<)xzE+ zZQx4VqKV4{LW|?la7;lAM^v6t1m5rhH+Y1faH}0)#3{r~xk56N2UN3idsLa=zlWxp zU4_pNS#=|@i!;G0V(ZeBjLK6W9TDTmC-Pt!{}jZi)7^~1;5i(8ISPr;85v%!FRMeq%#D`?(yo_oXHl?1kWViiPGX{H`b)PJjBqQc2sGu``E-@gi_$uG3bk3>7C&{Ef46I4p z@R$omW+zTCEf*}uC~UOWoF8LPiaB7ZJ2WjU_iNL8aZN6`Se7OH^I?QduSoNAfY{qL=2rw7p+Fi@#tXU(&NAe|kAZ$7}i_2YF8a?(`UtdJ4_%bY9d;EY`uuDsDcW;6-`o43zf7UuNeWIxUhIQR|3?+qA!s-?}DaQ&7Js~iK`b0_ST z)Fb6aT{Hej2SxHEk=60xRi;X6%?m3HiLQQ5Fi0nxCtG~#L7R_B6NQZBK1w1jVszI= zMFXliBB3zGu+J?r-F#X5m;f_JNyC~+h%~BSrL3iYzJPLeh{;nD(Cb%;n@pv?`NBhq z%YPTNJt^!jY3-tN9LUilHiJwCI)}@C_i-a~&+<>rMFQ zQXe--&z0Pb$GD{oA}Pn-spnpTU@`UZRS#Vv#xy)+o?%KRTVyQEok%E#fGo^=mSXZ9%4O&y!}e<}RwqY3Hw{@y$P*6jV!ivA=F ze<|dGM27x-kOTbN=KN9iO9%UFpZagl`R#wVPyAD#`k&ibNDmD0YWY93rhn>8Q(wM? z#)IV-;7L_Kg@vStD#mU7c4~k6gcoEb9f@fhEHbV{u|yUOJu4A(bRzL$?uDu4$V`Es zV3(*iTOtnF)$8k*B*ifrW}TWGV|<}yVTZ&CM@x zk?+BQb{d*cUH!CnW!0n_?e53qH`lfC;Ciil^K@J+F%c+2@vJxgwpez%Bs@P@8Pk}` ztmvWl?6Ur1iELs@K9P54*wZhe^f-<&V}Gb`S>1`$;2h++t=91RzV?XB&1z`->TrP! z!Og#G6(ZI${7P@nrrNKjS?LLt?EQOnFDRakdz097D2{G2Sm#*df-ooz3-bJ}Qnhs-m9p8u&3Qxf?>R_Lgw(=N=XK(}FyH7YUkSJNrOspFP>AAPUhD4x zw$i`!96omJAi$4lBQ0pxEwy$9Ta|@eTE5zu^&Bc=uIzy_?ibV(FK&k~`EI$Zq&cCH z-q|B`iPt2gsat%#FIBC?F^jn3kP^L_d6PLSmtwtob)Z3mk@`ULoQ!J~kK1T`24?mV zudmY7HhwLSB91qXYM_Vv(;Q1nvgOVfKu<*I#F3t_DyWDJ0Jp&(zog&^T@X^utaTL0 z5LGjZPKhezlU9Uh7O|P=MWLI?gAMkGx8myIug0}4Cg!*yb_m7 z%~GvI4N=L1IITQZz11rfq|BWPHIi6ErY>aNLs{l?G^|mFye~){q4m>aEiMRZG8|hS zA^2}@bnw_UKy@2P`NAJFM>b$2fJd^j2c>C(LAc~`C?e}up_{Lkq#2Z;btJzR;U1sq zwywIF*xaAlP^&DH#q?#E8;hpF|2Tq<*QH>(o&I`yAC*C9gH*zKvKP>k1eez;A{pzl z+QQTxTlw8+pG=?H^@V-72P{*L=eY*iU==b)&g0136LB{3q_E-RY7boK9>Bi;SQyJ+ zJWvX|u|{%7DLBAyn6?0aEJ8;d9baRpMljQSw_vPSjk}nuA*fAi^>P8uxWlP?%8y%^ z81tFx@tz$tYRsKjztY#dL|CqFfxU>`jlNr_r;@|I3I5TtZ;)o84d8VukMRo;yo01d zKhG-rSCXMMl4Ndz6y8!^H3Qyny`Jw(Phxz^FqPQIQnKzw6&{p#&@Uz8iBbB;6#uCVlgB%PUB9Yw3|&@0jju{fy3)z7i#L`QNRXR}=zUZqU?dAT>Hl zmc5>X9feGRMJ-|7)S8@ROZL;i5Wi3hGZsFE-vE1|#uGn<68;jqj#Se`8vQX&Uvr78YU|HOhidpA!0_i&`-Q`*<4{L1@`1rdQH=0(4&5^2FC6;8>XK4+@UXY0z+`Ad<4hPV$2y^n$iAV^0zd9OaYYQ>z8H{2>Vp5QF<8H zda2gLdwUl2=)uOo*KXGo<(r!Zyti}yAA@CJl%u(ZrNwOEZgFb7h#*6@u%oj8#; z!JeV#?(IgalMUuYORdE)$~xpp?N#rC(uVDzL_PEDwnL#{;T5UW#>tOmP7CykgCpx9 zfezh)Z@+hzrI}UQH#NW2@VHYQ+)3u{+hHMQh?;0UKh=aIcKadE!5UGMk=y9L2lMy2(G-Xzu- z0mqP8iCVf=G|a<&$XWEAv701Ap*JqO+#H@0NZDnKhfv_Dgu{Xh#+~tb|D&aBJR5eN z;n~O)mNpq50PTEHVjId@0pB;*0C%|tN{+(DX~$&>wnRLHCoo$!)%EWF`j}Sb(Jxq{ zH%x5u{X_Q1#~O<34ylFrvzY-o9F8&;{3waqdS`v;PB}+B^eO=x^u>dyDT=o&0=FzJ z)ie!>>Y=2IPoqM&HEB=Ad=+(-Uo(>$1*oV>r3~a$0+S3D@dy_2lkw0$7-ZPJ^rhKF z%AXWu2MY)Ud+m;1y7<80yVf*MI^(B$dZfrE1(Mj`Dc4{Jier34Hs<0S|&ZT7kq!CX9D18%Hjm2vI?_x+8d!JGGRjYJm%POuQuGaq@HBaj0r&q% z`|7x=)~##0k?sbO?w0Np1f(1325E#vgHnQYqolM*mvonODG1WtA@D6c=iFnQxbOY` z+OmH@nt;W88b{<7V?IFD9yqCL0MW;f7O5z`Q@D5?)Z+y0Y^}<-P zYAyS^m?XSjfBn@6DH+-3M<0K`iL6^oDJ5OG`tq+IF zp46Ya8tRC3e|<-$qu7ZAP)zY6Nb3X{BsB&a9TX;>v1sN!sx2Q z++Em??)U0w-SW&*E=_01GN9{{Nh&vT&`Vn`4I!~M)~MODDiAe^ z6L_ur5(z2w=-x?$g1neW;==$gh0KQ<#Q~0|$3bI3fll_f>4ypLGa+Gt8VsM)(qSq!Q%A>`OjVC5mkAwN zYMp|CN6cPiv`DXw;v{ze4^MT9u8os=wn9sD+lu!q)#&HjksO^d8M9`S8ea;ws`#_CR4P~HXQ#~8 zMz>3O0KoV4!MUpX4PV(n6ldR(<-k3o!8HK<^W$pi8mfn5@dnH$Vd-Uk_(GvB$8SWXI!~_Yl(d? zSAiT;tyk(F=t;BHD9_!Q;Agqq<7d~maw-He?dwkz zHmRA8CPw*S>t5U2nkzeoe$}gL^%<|4&$9C+L4wPC^_7j)t{chN2$rwfKT$_ipsEtz zmdU(o$FlIG8K0vBS_<+m!_@{lGfT=6ohNXZCYTpmF3`Hx|EZC6v|etYCRq5T)}9sh zGq$NjHnf=*YS6rlFuHs=0$Sw`jXHIE|9ZO&OiI8L8YDhQt3IqQ z?xJlngqqHNzrI@8Bx0j$HaNSNgho(7qlm=PtvHnHeHA&>d5M&oD7dILl6#LkV^uB^&`!*_Z<_61}c}e}y9oCPsi76J(GZ@wSTafvm;PWQDK;eAYoinH> zhP=+1iF@N`idIFXlrCMiF?O=huhd>GiM~lTXwL8KA_;6h@j$umsdxu5f?Fhzws3Xx zc9T^7v{;3k*)M2MQ9`+SFqp0{9XSI?Ips$k@0>k&q^ATK#-V%};#0Qj;3XaGyNagZ z#lX_WqQUsZvt7@NL}UPP3~6YaeC*2N{O0{o8w1`l)ZnUqlqlKc9kI_22lpN0pw`cw z-kOJeaE=oRgpt`_J;>2$i86J;V`NifH+hyBdvETJFF~)TZk1mijY6Gqcw;{;AUyU! z+?CrM@yfWDm6+YkJ2NPcQCa4N_ffACK%^=N0Y*$6)OPdT=bB!Nb6beqE@v20zQLi> zpt77Megy$pYC@&6!1`q|i*CqeT$W0W#eh#ag;}Qo+v-&Iw%U0Yh$WwU6_x#X4M+kp?l%dzlsC&GCy-xYKYV0*j2rs~vGxbPA zc|<8JOP$bO-Dc2M?%A1HSU6@*)VYLbQ+n`)W9=$LBs?*{!p4_c8YhVgs!ufO{N9ITG>qX-h#t96g#KK&5X=}kxHffO_bvb4;o(|H7?-~h{tG3 zI0jORyiCb{%VKp8h$_wwOy2?=^6A7OAkrKi;x0tp*Kp5T;{vRYjNi4jbqLp1Vau!( zXZ4$%6WkbuBfGk?xEy^56gV=HNZ~GVao!bq^4v^sAD0VB%AF4Bp?8E-N0*mX)?z_& zAr_wh{rzcbNzbS3G=vDax=-~K1K;;+@I~7>zNIQ$XmC**KFyKZr)- zs*=x7nnroTYJ8wq@_kHpg$=V$>{~sY1)rD{hbWm}JxuHGK{QDdUiYp+X2VROOcEje z-k8ve&}PO++jH!UbUuakVxA`$|`Q?|Nq|3tGcd&hfl&Xk+k-q8CdEm1iiOW21jU zdiLq7Y4IXEbW3LahtKo(dzZvdms1U&MQU-bEHG>HVj<8`yrjd6MZPEY@D9a!l*?mr zEty&vQs(XTEXyI6#3G3F)2WF|6hZkr6)Owp?%ow#W3e*vHDC8V%77g?ggeWMWumg` z7Yv50A5OdHQ#}s@ldIJOCRl7epLj zhQ}|JBQ+4UsJzs|#!(hP`#k2Rqlf;vbgv$+u4J?vm3joj3z5;33WE1;a~@EYvut*d zF~oa3%2!da@YH=6AIE?;8RFLH;VYcFap>aOx*5SBMI29e=( z@xqb@UgjpSur+>_L-l!ljx6N;qoM0VE4pIX*EHHg57NB1sQCt#6*GAK#b+C;&Jqk5> zc5Le-R4ZsJB53Lz5)T_Sydw^SX^?WUG)|^mIe{~RPr;D7*ue;=OeB&1br&(PTXRk` zs)N%Y1ob`X{#$??xW4lq^9Y+7ri%4`kJxsskxht9q`+u?jJoxj+WziHcOmT=~ zX|`^;KYqFAJ2K2v)4w@`N-n)Qnf?j|W=R2IhJTCGDO$G<7qAcVN&3jS7#9Dkj>{qT zGRkQ5PWif7nccG)iqGyFVH#L%<&t7Akl1#ghtg0Su*L;%PfsS5*&2t{TGQ=CSO#zO z`8-q2ho4E+YR!<`!!+h&4WI=(>e5g$+(#l@Fz;@}$@EE>+OXWH&?;4&O(OG$3tMG{ z=~Lg04!n+pybDNUT)j|@YT3mROSY|B3MTbw!O(4;wxV5qrMt&W(&*Qb~PY?)#LHcWN zc`k6M4`lOyfC1l>ivR8{{}+2*6N zE-##4i#ibWyLY-eB|#DzvaB`Y*nmQk!&42v^P82Eak7unBf+pfxF$AFyrxW&hOo+I z{rl0xe6dsbckMUGL*9JaamRK))xmXtOE^YWonZ&~4YdL1tB9vMaq){DUvFIgFQ|b zwfWKWYq^`|)ZVWWJeR7LLW3!XIR)E#P+cDhB$!#o<2`cd5suhGp*+^qtjpfK75eZt z&Xnil2GL|6uoVu0oW->6X27DDMJ1dX2zL-3Tc#0`tG1;5#7|xeyBmht5AgzEpR8Nl zqCzZu`cQn0Mqql2_fXZ$`6~L*!ZBjm&<9simngIUMg9Zz__uV3kWh7k@0*-B7TjeD&7Fu}x(KkR~sqP`_{cvI`O4{O#E2Z0^qZ zcIbtiIT!y>!0!HBrmaS2ElCQSnP+ zJ^k~!)B7hwPd2AkU&@);4R9D8B?o=X5iRx+?GmrqLbRFlaEv=bGe*~)MfZ(Bg*34f zFQay_5CrgzCK@4x>hNO5cVNYQIk0Atl`H#lUUTJ!>)PSL^ z;NINbFr6R*A&DF>w$AdvnSe@h9{**u4rwAh3j^?OW)eoYZ;1O|?Nim=kUFB?q+)1l z?YRaI`=%FaLXR+Q^A6K+;jKe!7T)<~_%y8+ljhAOol+k={&Fq zQBZ|gM1C9;7_Uw9;?yuIQ~X)vlXl@=NmY?Ky!A7T87h?*NA}mWl)iWav$>ln^70%a z!(i@1BOkTIiZ_PH1sp2Ey@rxNo|-y|OBH{_m^W@H2VvcRnX?%<~qP z0&LuoZgnLB_ffqRUdU~rAF$TSXyEtPWWbC70Y|5}y^#U(=ZLY&)4Hdj(-K4Oeo53q zQQPCqHT`H|kn)#gicUWFY{U|471qL7S7JXwg?<<@qai=^80 zj;y6u&jy>J1_tU5N|NX&hWJ>0-OGLR{<8uC?tK^rs4Z#snh_HVwwRVaDgy7o&Z5CR zV6b;ilEbk89{*^my~%fuKd#l-puK9veOtlpMNiRCx`~(F2D_UScJ~`f56F_Yn<X5NgNT{&eIYMq5> z95(BT^RsT4WxqhC)|Eqsb{EoAUXNEo#9T*Iu*Q?s`Ar$hM4d`w!GJ4)?MBEmZ%Cw5 zWf2^q>kLb(r*ob+NR5eD{JhS%T5z1~5miOV$KydfNTS0Qt(!J5(TSO_2T(8=>?rY@Kxk$_Id=*DEbz#xTGZ(XnYCSqvUSNV@ ziaVvgm=T>#Z*(aGk<$m!Ahtx;xa!Svn z#5K(yQ}tvCJImjua;sx z)@xUGZK9!Q6p4SGh`+jDu_``0^L(;9QqnP^_`wEAX_Ugt3-xQFvEg@<9s&-IJruk& zTSP)snY0maw{A8#gsF0NQgT(scyE+enIg8CNi%9BhRA9Zw%0=7moPT1AxO-r&I{IK z{RCCw*qOgNc;aJq*|#Wstlkg~0NxxHR$!aYttN4eM3X)| zx|Rx;R+3>_Xu0|7tRik}W+EbFv*(SU@6yp5pCpDg7q)k3@D#%-DFvNH;wi@O@5G>( zj-bR^y(7HrKeFHnf7+ueUa$n>a$)OyUY3x)y=P*O_3Wdz0o5T{7t z=9?fhL7)Rsm+|*ugI3=ZywnZ+NruiV!M1A7hIxS2ZT zb-!X6Z>Hff2W+RE_H;d0Vw9xIC+sSswsH<>r{YB93u~-nd_v(xz1MXSlvbXLkf;os39<8u);1Ru zW_Om|mUN)LN)j48pljM>ntbf1P;~!u%1nRs8~w`4t${?V_nw}D6CcoEfDm}<%Pg)g z)9OS|M|wObOaHB>`rOWDnH_>M(wgDMiTLnFs{Q^0IqT)BFXAZp6nm0Am*3jIE*pF$f=8jel!qU znINgaUi$o`H=MG{QG$w@6KIrBa>lJ>RgBi^%=+w$F5cHT#)QYbf2?J81!bPNWEIY#6KkKk6qkkp6y4YM-1kp#|X+ElyH;{!IO2g#d z(q|%Dm~IkjCWzmG5a*ybmb1WYA~XH@L;bAA4QvrzVD4`~2>8MFhx6ZUf4&V6{fLG* zzfI!&F9U8IT);Oh!3EkJ-(m_bj&Cg&@b$Lmar^Uc6F)z|C64cV4F6ZO^y2^=Co2Ft z=YV|@HgI5y7o33OWaDP$1sz;&(|o~zOfm)5N`h0)qR7SfY1-EneSU&|Gs(uw0E~>kPVa_f|GWj z{SP@CX#B)=TP!E&Va>(&pA!qHlC%8B^66jB?Dvy*|9{1?-_8Ys7T;_f0C+}0Lu(M4 zgAPt0Z2zgeU#k24%>D|~Ie&)f-|po<1`7W+vkpK4cLu!I{~UJ+J^?}V+%h3@ODpVF0rCBUokuD!wJ2uhZ>|b5-W6$kJNxoYs*HaWn*Aq{x|!0ojSvQ_(oggH-iP;>7^GxH zk*n$&b@nA<#Jbhg5h&R;XNo@-8R$1RUahB0G9FWK#F)}$j-WS>#u8>KoQVL4i(gxOs*c!KT6r_Nxx1gE9hJ&BaP??8;%|TT~thqAEb0 z^~px74pDN4o3zRam1HQOr@#Mz5<<+Hi|C7{o+9BuDau5Yj-HeYx7LNL@cPB(e&$}T z=BH~5+?~2>P3~idhT4w^Qs%z(`gG8*w8srNYCi(pL&t{Xb=#T~#WPxfgtyzfU1{X9 z-9EkInUPo5?)in{p~g`)eYxd{g>MT6AMo8zb+LZ`f_8wY?|q9?4N}a#AR|;hh_cv{ zdj2O|0`DJq46I+Yami1X_2~ya%&C398uxqyWjRr9J@&-&ZH$)Xf=Wz4<}*Xeve<`~ zF=dQ89uJXZFHF|h`ziHo$ACMFOD2|~6c^-3bD9{jyQQMbZz^jXSr`!d8ogD~=I>RN z!cg^Agk9p^rArLJAG{*j(Ny0E>Y(vnKz&VzVHio2j-{97Hw)!~tTeq5$&lEW$FQh8>ozf+4UveRSsF{@mQ!YhKF#br&0igYrWLG>dKX{P@An1ZG4=PVXWcB!7wjs| zXSyzXzFc0vIPry47`6fQ3@VQI$MUHHYn_Vtkv|pYss~(EZAqgzAlN+>AnjsQovyR$ zHOem(0rN-??SD4$imE)fKBERx+qg%(fVz<8wS^MZtj)#D2u5w}bS&<$Ha^P-Jq9ed`f-l9Ci0|` z^3W{4m>ML^N}&qLKE3kRQ=8}YKeMXXb_+`ja0A~T;OJ+B*&r$Re56Xfeh-lk0x~%27fA*7n;#|X($@_G{Zg5=D zOiCZS#O%a0@31)pAH3qZsas1s>*=o*a2fH!7(!~TD0rAlK1LjPp=3&ZgpMH=6Rxzr zCmv`^4s{S`@Ohj~o3AHJ5dm2MS29Fb{Qar`>ab}LJZ$N7EO34H?h^`xR+6IRV2X?> z622LPw9IEn1eI>fFhGJ9mGvD4Ary-J5|<)m)xv&VrJ3f*EFnr|sf(s~pP)#l-9Y0r zlkurzMYq^OGoD0p#!PyayT~La>ZJ(d$QOw=TM40wPV>zWH0surlnBdD*xP^(Bq+q* zA>Vh11D}lB4FN@;)a1{IW7)`7@hTzt%c_r&Go0VN*{mOW0dJS9GJ~7&0IS%DwV z%f&`obZyRczWs&aF>md3J@1`v?l4dMHdhz|_=)zh_Qoh9dBiWOt0$B*v@!_p`JA#A z^emUnq33`F)WT$$(ZWq^hny8{P5a#NP@FTq72QC9pfJ#3Etn3^wmJ%J#Giem_pX^c zEdc(+mQzVa@0s?2Tl5tkTAd*0Xm zf-y@%j8;D8k(&u#unDjBxfqwe*M=(;zm$!zj@&NN--8 z&UOX;tZDrS0zzcV(9JB(>#-W~#R4Cs0q3hY67uX13X}^Q)x9H0ce7t}>T!DZ#k4F} zcD4HzC!=xUBSpR;9&DUhWEIWr3 z#g)3?6;i2V_^EIwzq6?%eDAq}(nhPOEdR+oqB$e43_5nb%b9T)QF=tM!??mwW}5iT8uhMsxBd) z1Ja#tltNA7+QH?-;;vMH_*qaIQkaIi=PqW0+9aNvzBsGkDb}Nv~R<+u18R)tDvA`8r z8W^pRj7@z~Y&db|s3MpQOLDM?P@9RF|JEU?dF~7 zL?x~x86;oDH(fFX91QOXZAJ3!X!dJ0_yyHILI(u+vFX=^ThRLHxp8_%?UzJ(sV)-3 zx2hYE9((i&BzKuU!KI&IY4-AFDj=!>vcnD!u%CyAt!AF=T_CPz1|1EFx~%zc_r1AK zmKR{4na^}JI|BnPr2L$!p^B7ANBl~1zTK-9%9D>T3NKR`6D>Bv|E?rvf7oz4#o;EO z;FkBsz`12(MOt22SDtZkaJf)?Byk}Vqi?1lBjqYTe#myu{q}_glPmo|xB}-!U>-Y4q%yELX%~d54GGzN5389A9KuBGmP;v>QCgNIl$7tOH_J zOdRR;T%_@qBHTZe>36Q$PM=n8z`Hrwmb55A;|GV}DRVF*#jsiqWtbZFpI*0jmp#jj z*L9AZa)9~F=S)O|b}*~yWmdPk3PiXbm{#bMn+gog0Wi@eki)*kuX)UR3>=wBNzg^F z`=01+!}PR< z%HLNpTy&;|H>Cho#@qFBMiZY~$rgK3VqkOpoba+3L&g5Y!&wHwI+ zksA7)snNP0)LNWk;>r+gIxv%n_NkwZEc2_G9($|ahSTcvDf^wlxX3aOvn}$WVn(Bu zoa`0>t1s^_ADbUy7i|xj8dSYzw%MD;J%v!Kw(BsSz5g|?H7jtoa;yH(`8gJ$6VhT% zH|douz0841KY!g@93Gbd#KxRKkIr-sMR(kRHNy_1`S&Jr8x6+Mxa&ZpFyz}QG^;WT zOhG-M<>u}}BopvSEb$`WnJ{ltV?~lb{W!{b`0@NyxGhgoH_X1D(UgKP^^8rlMRdlw zd5PwE!8UVC|E&7^^Fe`iE4m~p*p9lnxV#{2bQBacM1`}NYX}(1HA0?hnJqL=EXtas z3ww!;M^2@?gSEmg-sC_sA^|TN`KQZPTM`aw+TN5Q(#K`TCESwN9>dV}5t-)~rqGQ8 z9)QCjbcgL=g1Yh7*!6q8H>#oXeT)rll;SLFJ*mM}ld1;QaaS1<$$liv8SoDZv#~Py zk#1~A-3%$2Vmu!UG;#KYc%l{H1T~eTPv%m$Bw&n2tN{d_hjhSlYcXBlfs1O2aMe5P z(SBTSK8ftbxp3U7%8a3MlJuffHV3sch6ut?%V3`!xJ!yhVO=F@#q$I6dwO0%b^`{H zwcCVmy-HR`rYleCnJ?P0=L-@r@-@EAUPAv~vRVcM9y@t0IkWl=&XMgK# z%=If8|0$}Bi~Dz8>N|((Z(7>_qH+IC01N)!H*Vw!xekaIe`ln?+$&b#mYVuDzIglk zTRWWVcc))2&}#S_b@jU?%`NHh+t0sKT%ftm?ax0@THpTjKaljlQwu+lMz;n0>2%Ew z#)WZ#n4TN#{DU9&w(Wf@2;c_Ylfj9~{}3PFGYfwR0GPR%+1P(3v~EA}f9QeVY6JdP z%7~2zq&vX9MI|g>**;v6TQcy6!#mmFY&hvvuIPfE5q~c=f$@JhhAu!1-H|pba@Y2k34M+Nu9Vl|L3~Vrr-43|0uTg1<;SzFoTi zhXQY%)&C5M`;isoyxqOqZToE(Ir&&Y$`W+K`gIq7tWVtX@nd^uXG^d?u3t9rdu|In z$AIbo2WtslYapx4$peyFp!$NHjRPDq2B(yHL8_JKpDfS5s}K04!0)H0|NkyRPEfeR z3);4GfI^)>Il#Mzm7C{ZpD#a0C~|!pmi|9neBhM_HVytJq43tY4s>SY z;N)iJ24@l2IC;RU@0Kp)1u4w`p|zwmr}{{1>u!o|&T+qC)PjQxDvZ-OcCdgTVAHaY)d?4Jv?c>AZ- zAZ5&ZYn%t#-~EMI|7~ypD>?AD2fy|Bzm3e~0{@bM!meMKXRw*_4+p<}CV*EDJ2x+Q z@LwGZxc->L`Aw+zCvOez=ieFqf6qbxAnyXd25^9n$=k02U~a&lgfz%o|EcKuIS=4> zdRyYRMIbf*pRfV&TL#B(PLt&S9iz>Y;1~mm1p{VDawn8eK+^)1+VW49xG|e9HP&d= zI&=lj`fcC#*ifrY512K0B`rfJzX)WMq<`8!b$&b>0Y@&DE0`Ysq+BEul9TZ2tj?(F ze$mth8BhO}&l9)9>T0d3&x{3{9U5+zY82|Qg_!ZJlXk~GX*2?hDLRArI?d-R+bilO zHuLuGwG+)s!Gtuxd?a*)Gtf<5(~jmBTlR-i8paH^d^p}?4Zo1^zAX9FZLGIxDvFTAntowAAo5Zh^(bJ2 zjN7A1F|)LH!cBTx!zTGo$I-|;_>Jc<@F)`gZH^4Q7Md-Peptju_&j3%ZMC#DIwrWV zl3Vkw>l`#RG{9)-yyJ&+N0WFN+`xAnZTU0WEF=OE?dRhkjI~;GbhS5E>g!WJ+4G{5 z;}{^;^b6>HNs^IZ);L~Yxhe&1$;!#p8Kc!|FD&Sk7?MJv@NCp~?XI``*=Lkx*r9d9 zT9RE?FGD)QDh4zbn?FC3Ih^DZiSrlJ*oVB<{46a0ff2a6d+8@u8Dh3iDtZRhFm2ww znD5qTr7uo%2d#0ugJ!bVph+DdbPZdT$4Vb;FVoR}mVn6M&ojD`Ig7TC&~kvM-k(IH z(A}-#5cmYzi^Fw+KihCq{L=$-R->N6V_Ct6=CcuFB08PX`WZxOuLWoIrK?gD^WZ5T zmM!ezfF@vQ510Z2{bZ!}Xa#iY5#P9NP7hwzCAsEl+Y`7+##>*Ri7oJ?Dz=EJ^uG~0cbdpr?vNPS`+sm375#{Wj15) z2zN%&0^vLNzw)p9@`O86$v>w*{7~!036T@?#&9s()UVUTHiL2lYY^?lWH|lQ@pzb);bC0qx z)ViAQMK=2cI={(=!3ukKiAV9)`YLizua@@^lMldSiFvaB#VLNor^^4hAE~f ze_(4_xl{GpKio{Zaa80DQbDl*q=y&p@3&=2mPw=yMqDS)tqyHuZ%~yD zUp5T03p47#Drw^SZun?@VsJ$zSW=@LYe>Y4eb%5$**PffE)GS-Z6UDA(bP^QOm;38 z-^h3nXL*5?#iBGd9y~#v;Dp<`$4~96Y0Nx(=dtj(g|0=N!^jN*r-V4=AqFOGn~F&c zz{;yY!!x#%Uk*)<@WQy%D+12ApvZRd9fXiv3cLN;j9=2DyL^3*)0~mc>^Kr)vylKSg-ik;joFf7gfE9F|4rOX(9|`jCd| zaI`&%44;#cJ1MzTFd+}P1zj-161VQO$VjHT3 z@n(;>Y5Sd04peI&RK?Doea&^)fr;mvmalSoa8`Flmk^~)aYw3w!GA>&&BeazZb2(G zzYJy`Cqg&dv*_|z?|t_C{o1_E=DTpd@5Zt;R$q_q9M(E^v@pC^+90%aKhc7n4?aoC0)PGsy;8`sx^+= zk0>QJxL>sfDKD|!E1MnRuEqP4Lio)YN!c7|@)5Y5*EBIzPbQ_e4E%5eD&fNjPGvrE zdqcfNIgbux&baJbB|Uh|;s2Es0d*!KonQRwDbu{`td`UgCs7^UaWG=bF8r08^HamMPp<0F4brX5{V4f;JAp4}C2wBzNj!(JjV<=3IEQ?SqmVur z)+7S;6_p`K5A_;J`kC+7%a8@B_=ZUH(;2#yxfUi4+a38d z2*y-G_ZYe+Yo9z1JD_$&8AEnOY2>1e=q%>RLN}qFu-}I&z7RWQgcea{5(Vam3Ao;! zhkJYup*LgwkP_f1@X7n;<=1D)CdafRuo1#85hZz2295lvR;5>7liZqBEOCRMvc#ms zkkV?6cT|Vet=PhP`DjT1<@f{|b~JTt2eHo<6}(?!=-SCqFx6t%JUsldcMuO~JcVHx zVL$JGp+%8t3Jw|Xgk{$J`a%ZqWB2-M9EV6W#N6k_lg`I;2PS~DpsmJlq;w_y42E9d z;=FCl3&r;^rR187Yb4RKO0#f&P&c&5wQU#jX#khT-D$!viAikLnv*5o*rd2*EoFgv z`a4kaO=0B^r9z3X+Fj0>1Hzyr;1VewE8*=rc%?rg$gZ9&pv-$iNkeKz0)uUIz0hWwciJ^|)(uP0{P;>fWl87XqJWTfZJRCONxPMPx8Q z*ukaX%`)((QHoLaCEw{FqAEDSeciU!+8{nxf5oLkfTPWcIw-l`x@9t-#e}vXChfa zT7zYcDo^;r9fBDvKK)5QU^56`aWPZwnPa;oZmH@^pW)dTJb`Fv=Z2lIE&1NQ)OL5$ z5D7i;2YPVz9D9{(w<&~b#4+Tkx-EySI^Zs;_MuMTvGmzSnrrY~>om||Yx1uUOL z+TRR&hqPh_l_EZQ`}7Uq9u`Kt_qbWKOb*r_V}ihH9Gx$3^}(8|5tK!pw^fdjpwAe0 zNU-RNj1Eu2teit|S0(gfNek-RuN!Z5b~og9kfffjY{-So%16y+DJyv^iI50Y`AqR1 zyyknzt^B#us@x7`T3W^FTqU}~gRQEFIki8BeHGH?j^z7n96u5Q;4zXXag_k&9u+qQ zL|nV(-K^JE4`0wBQ(qPGBG4-@11qc$rm0ogj7^_oH9LI97_CNN+a7M-r;T|W78=mo zvd+Q#g-29g1%+pRp$dtBQqj*u6s@ad8kPJRfvP$=PMYlw302lCyb_vcFzvm;8zm&e z;DErR_DCk&kREAR6X5x7hUc&s99HVs)fNV2WU*Gd2_D(CrO4jvI-a~9M<11tiSSWH zVXUDmoxOvTIjOYI=flhphCQ#&7{t9!G$c>bN?IIwD$G&KWZ|Qofh!a{)vjhj2oY^R znz;_E&Ji4((AStdS$WGC18#0SH}I!wGBw{3yTBhAW<0+N=zb=4K_hn%H~lb?1xmcW zz4dR#48Ib)pmV}42m`=ex^MsB0(}i`-{AT-iS!du`|X$iK%ajS0{;sizzI$kvGIby z@0K{>V+TM=3UuMWHLC~3VSH@=P6+(Mqk-WoCD;1SouJrjGc#>mGytw zwr_+)0!i>b*{&~B=a|TM?IJm)AkZot@^(7e9?Dg4U5$GM3A!74^+|*Zj?XB8NZ{F z{+aGcsBMBFf#%`nO)x@%0sSPkqUOF?ovc;o``JojyD7zRaA9Vz=y{D7j+BVJKT<&-!zGPm#8%-7rV5+|xb4zfVB5S4H z)8-GFsjIcW6r06Zq}yP8)D^2>%AAZ~(64Sj)1=aLPE?PY=#>S;L zzSn6TD>b*!w&d12(nQ_CM?HGeqP8_fICH6c0bE{qXoYnK*%+lcW*?2w*=B{1T z42{Zs{^Oi9J?#hLESg*g=s}qsxJh3hX;TGfRT*vM+TIxsZaE~a(MqOQ#!MK`r@35V z8u^H;(A9p3wG;-x665eiQyzBaa!&OY_m+jk`RlpcY_a3*IE)dfQf1VAYCAobyAsa} zI}k??T$7R!v4e4>(C!REZ=`>&Yxv$Jr1*>iS~!AT+Lcnvw_owy?7m!z0=zD(SKG%B z@;gP&60}#GSp17L9%7q52!Z70XxRxBlYQ2l-c%I@kx`SL4?Q7cn%t)39yGB5}USJHFXQx z)|$*#F5`8AfHz2cgpa9;NJeHJWE6Lod@NK&w7$07JY(;En$*7IOq~J572aW&h7Qw6 z-_x7Lzp`kWXYZyxHWlcRAlc>7FntrZV}KX5gW~076QFB2|75B^wDt&V@r19+HYY8{ z?u4>+T;2Y-k&xj@#n3%r%Qf*B$4k!b6M&iJ-rezm2tgT{rgfHC&nsx}M@rLnF--B<4O&R_F6)BLa?O-QgM={;}R- z&4U!?`f`9==^En#Ta+a1L(`gRH>Zai_uTv@dU|hU&Le09P&YVYw8*^HyPW@Xt7hXd@A@DE183) z!#9J9DUvky_!NnzVd;p=-_0uKn&qQ5@2NAa2 zbm^nq08!qPEH5m;&swu1H?Xqw?iP0Wn`2X_yfLE*?4jWR4;R}f$riR6EuG0R*n1j0 zZ5Az-goYpC>+>xQMTi2|5k^(k8+jU5MViqA&tw#zqkD7T5jNc?Fmdn!Xa|C{xp>8< zYac-Wzc88N0@{G#;SJ%mF|*cLD90Im4XqgA6Xddl*tV`p7K}}N zaXjt{hnDH5o=wm`L50xW1{{ z8k1JEfUnkY31>GHRWJrSiqU7rO)BKAeKcQTi_MCnaG!ojeOF#;dq;S^Nsn zMl&I^O?p{TAY^%}KKRY!E{B?Kwa1{c3}wO45Zr6tqp!|_iIUBN$xjcA(dj;%%p;ZF zmKq;Cg=qa4$bwE;UH4JHmvoxXBRC)ondf>1SH=j(uHGT=gbNanOzoYiicuYkwQg@4 zN7*BLD)U5hbPNEMl7Yx@L;5}UmnA$zAk8;6#TKf$OV5s9u^^5NdO@@@yav``8`=UqB+Hy;0q&x)ZLW2pP$MBy^!cS#n} z1)()5Ut3eQ)rf3bT9FI88p~L{3ut8eGHWK^oNsSMcaap3yls=KtN|f+i$^C z+hRP&LreFG2*BH(vXQz+AQqTZ)!r)}@4yDD_Sr}2L=-~jgcjM3fJR0liA8hxvbljbMbPn!d9CtZ#1 z&!rVu@0YcNB&n*mQ*&m96z-SX5F<)_Y1+PUsvw7vF3vTNhat`;WCitH{&!)8X_dyb z;~=wWD){O;@x-t1(Lq`klNPWw=1&R42EPdL{c6IT8gHcXnrrBl6C`J3!>KcXFz6-Q z35&n=`e9=>eP`3831M~W$>RV4F??s190H^_W{oS1jZb~Z!|@433^c4fSKE1tD}t{) zDIGR?XqSBUXH9FU$GbAmnEl+Ld%9ue|s&s*Oo0|E((9jEbUe-w$Hkno8T<)RJ z2d`{E5- z96VZwsi@d1Q5$P%Jn2*w?F&xZK9wiCOOt8NLt#-?w(|J#*gPnM5$5g6DY2u&(hv(2 z`f|^K4oaAKFx!>bMqLNGrm)W)rzS%di;uP4gbc$-)4FLUWV=dug!_c+#$?T)Zu~uWn8W+OC5f%1}NK`9zRc(DCuuztSiE=IObOlFLea3A}t z*v02-LvE!$aOst7duocQ2WKXiz8F~;z1X5JGrM|A zm3ZnzqqTQtz6j9Me4ZBJx!8A+@7Xa;*t$M=v3EK@+D6vgf2fz-?xK=cpEp`k@>sc7 zFKNs%rbVXWlKDa`V{EMMN_1KF=uqeZ<+$QS#TA+o00eDMJ9*K4W{eh@vv1gl#w#A= z-FqWWza&uDMzQ3`+Q?Cb9NYIL_to>TwN)9QMQFGJbQ@xZID&|jvF5-@HZl8VUn z${Oss14xtd=%ds_AC`TtuMp9>XPSM{#8vm~G^9xG6-%rtXJq)In{%#hfyX=B!YDu!7MrJ0x8q^#H+z;pMCVT1pw z?@ifJLr#`Qs;P(Oeld+y!o6a@&RI7D_G*Xjj4H)~z8d=HBJDQXO4_-Oh}&_?pLEcC=b0x-_w@99-}kSgfKzqqRMmCeYp=CG+cIWLmA1$_Qhb^BYH6Q$lZex@ zCgDSLfL(g2W$ix4Xtw|3r-!Hh-lv_5JGDQK2cDuXu z!30T_@k}zXBL>n4*%1f!o;^fo^lUs02eceVW9_xdT#V@C&u(LIg?-<{&G$`wN`~3s zLGrLay8$VRO|aP`_4s$z14vU4i36T!-Bc>TD|6HWY$xh--EH4UP&W@FVY zO$#bgx!^K|J-W#@)+Azb_izh9o`6-u==MwC_BZ|v8z5)hp?to{Sm>x5GzG5y{XNgt z^*a$oxSm7mp;~@JBgL+ubj|JYNkUQ|V_VZLvyZRWi_oEbIJH~n99ND^$Ke7i2D`2J zcXg5Zb_~PP$iR_fe8!Q2R;U$Bj8Jw?drViFSNvyt2^eHxx!WTWIJNJ9*Q_5rKiin6 z+v|?&UbjE+G;Wx?X;t-m`pOS#(lVL5KnfFd-$+>?@YRcq@0h)8w5wcWYujXl{Z@HFTUp zSOP|t{9^(%L51sOsBP~BpflxyixjBh?BpSpgGU?K^9a03K$z*&W$sz=7!+0 z5=$raw!B|2#$3+Vf^*8CKy&4ywqArJQ)T;fEPAo0Ym~YGO<0=#(ca?i)hWtlqhgnX zbek0Jplif?;z{I`Il9mnc>92Vu64lHS05D3XmliP1UoU$>hxEzHaF&Yy>}tkfbw*u zx;T?43OgLErYZF`DG+`TzKg}l&S&vjItXP!Pk1DOv-sfkXpS?wir2n#HjaXc9n}U~ zf?Gu#dGO=w22WdWlB&gU;f_G~-MknoK1&FZy7>-{NySK~=X~DKnp63+xYidg;8uoJ z6<@}mIer8uNMqnTy-vM}jP%CK<%1%$4&o{G#FWK0fPP9aTL5CnIdsKTKCqDO;n06T z_m2~>bj--eqJ@28L-s}Ga(*|&&cNFD*q&HT#__XZHjS`=;%Na*^~JyaYmCLVv#X<+nfZc9%*`?C2b%pgi+HYT|Rqhg0zhvKOZh ziW!dp3bOrrNW+Z{beG+bDbj zZ2^u2WJ%0l-7_CqKzG?UPm@fOCIQc2k@+E{0J2&FuaP;6jS1pR|3kOJB z=c>z+c2ms}uQKuHr=pSKr3zy)DqKA$2YP9f03Rx~Umyv~ErI4pFlU`d)Iybab4YQ? zo8F+dj*UogpQ<2Z5^LOkL8GuOtfd;7uqa~B53JbO-Ii~^!hLKAB5%1^pd!_eP9g0i zrSDkazBf7{;WIHS)!sFh2*oh#b713aM~$?@wcd@B_WP8$?8i1n&_m>Oz8heUJA4CaWS*0&Jxf)oP;0hs)DRNE5eyhUL6>nAlPI zd6|NuACDpu15Z399Fb*w8imQr9LqiT0OOaqQFTq$gpVEkL8TWGUdgq6e5EBLKKzag z+GCVRXpg6Bjf#{SNVs$eH>Sd%ea5t7k3?NvWX|&9JDNW*uMEAf<|!MHM-VVsW9z_p zM2GNl#!alcU4{^t)WeNp0Z&9+?wCOFSHLMyB0!SO*^Z(YB^=yubv&xSH7TS40!X1! zDX4`qXg%JpN0J8Kn44KrLmzKF0|VozG*>>#a(GmTMvH%4Uw10QuWVQi8s=pD z!aCZf({}rCz%-Yui}!7O`>rDRyDXiOJd~~7M{BD(<7Mm{%NcC-CWRpS6c^2@@1ucL zEPxJYQ_2g6S?rzTnd|GN-Ox#wL*5UYwe3$&QhZ;JrjM>Zzt}6#rSct?lVU^`*1a=v zGCDWZROKfMJ%5~wWF@Ho(0A=Ixi47}?M&vM7@{&E$CP;D|DkIBTkFoEWO=0CV&rr^ zx~Chx-`nJ99^PcN`Ek~{^u=wdfJIJY-LC+;$KqASxOUYmHr44j-`20adwq|V$tKyq zSDH1rjA+R$VOyF~mVZm0X8W9HZ8sLUKGU>N$TfYqFs_$c8&KK2du{0wI4$AIi|bMt za;l<>liNJr)LCJV>94)Pim@12#czxFKAxWQV#9`_o8v`MI`7JusU|zdL(#V{)%Om- z+SPcgMfG>aOVx2F#^69S#TW0O37Lq>J^0fU&Dyzl;#}v@#Msy?YHZ_{YS}0=UJ1XpZJMQ*H+}~3ig}e-IW7}IQ8kgtqWsn9#KP;3Ef@ZA9g^&;R=8?D!c}V> zH|eNWtux_Jg`03q+#&*HAE6=vcYUZ&SJnGVr33P9U7Ov!bO#>VX<{}JuzZBGm4|ET zgibCW81~)Cb9LlRQLZsSN!H+NyIsUI9R&HLZN~eOyN4;249~^D&^m%58|@g`5Iyfy z*PAl47cAn`M_SrJ63M=#qeFg6C+MWM`NVq4@_|PfOGac^)apekQ2AFt)*%w6OAfAs zdV9dulFJZHR|-dJ&B(aBIL}SV^2dWLRURek_1W$X8B|MsEm2FE?HreryYpOO3Olp) zqxyW(r$ZRhr{jF+qp8s*14!&6t3D*Hnjs&Ai7Z1_6|szC>AMu!do$Xm{E_3Lvz9KU z<)zV#l#!CwKr6>|?`|Z3n`zH;_gmq-v|~ZX#YXV~c3W!{4(1E^bA?`8!8F(B&sQ^a zmzF|gBLr`u`yjA&o-UKJU4wg~3c_GCpNN!*gdP`4q ztrj#X8KJ-Ej4?cx5xBBX+3h!YYl1B;(!2h^#4k53mUyjV0}HKDiNa-(KB(fML?J4Ean!y zAJI; zLl@8*$O~@0?%y+Dz^yMpEcS@zxRvD7a#n&xtFNS9srk?odxVI0YI)xwW+$Y1)X^v7 zc6w|cc}%Qeqa-(0iwd1a0dig3Z7cN1DteUm<0Q%C{DBHY+(?H(RBXgMO3BLMQ$ID@ zH#Dz+GD{u|#hxRDE`R72R=Q7HokIG_Xjl^bH~xXUv~h1bh|P_ZmOe#~*ji{w2fi6F zaiqjhKAZ}n*#W-MM+Xm%4amrwXn0V*vY+5-l8vP^3FV__Y_f}gr3Gu74?^n;s`q^O zDtyoOOzUeU2Mqkq6+uYRMg!Sn>t1N0Mc>&vv6q%_+Cj0%d!o?*RBhr)*f5yxudHtr z1xAF+MA!@Csan1wi{oP8-z21$IO{lydzvoN6x61ZA58%bl;0vkgjgUTq^kSSOd13n z%d@ckbgN3hk61tYQ@9j|gDFi~a-YJmv<)y25H@W~*6ZgtIbzj;(kHPUM%KFYP z_r(UyC5)T(5SZetEGKGS;gZo4A?1xAnLS1iVpixcT3#f~1+<5i<24%3EG=Cnhno+s zNY+!@-H`+EPTrwxxs0pa^K~93bt4MqfxGR>iHsgENDJULWNPqS9x>;Qjh^Hwj@~@w){BHx>0)DK=A(bg01&X@!F=^1>+mbmuSk(xq)8; zD_h_7zxN)B!^q_nwsRW<(U7Dl2$iO5KPro#MK{i&#jBKA%oYE{`{S}mGKw2_;(COA>bSb z3g2C>N+#{6Aez*K?jxg3W8N!&B#NRb2ri8z_RvnY2rP&4w<*Mi!mdEQU^XN&(AEcX z?+h@W4h1F^@4g|(dt(pUH?%b*ZP>^N>H?*DFzcUi!b93RArZGB`N)YnAPbov)v{2= zNhu%&474Y2-x-Sr<8G?-GO{?gA&3{#@CAaYKIR5^Rrr<1x50p~e?tR{a;{`Kj4w7l z7__OHEOzC|vYpoO(|z_%G@7Goqy1{=%h{XM=tKj9Wasfu!`?X2dkQ|C1?M5s)L($c z^59+DW#xWo7$F@qtIg!0?Gk;$ifskiv|((Stci0@dahLxCXu>69h;?fq}T!GrP$Uc zgy+5BivD{_tEPkNIUj}dWb@LRLf=h5fx#_HelO@o#zde)Ue6V>c2Qh{(_6IsK=$?S zrn!+>I4wkp3Q8m5ENmn1Rgxj=8$3S%y4jFIk}k`2rDV+=L$iHOI`<9Xc5YXcmlz$J zN!bTGOaV0l$U=kwGWO=Dcl52!MPTJKj4|yUP!>V~VMmfAPRLQT-;(1eJ2d*rU_o_bq`6!D5W=mYLF71yI~Zp2nh+y~Bu>1sqm25--&JF$5*Z9@^gOvt0YZ znY=kxKPU`-`G9-tfmU6TK*++_6t*Z8owAQosd&9E1a3OQ1rf9#V;#fVu!5pLmxR(75K>^{|Zd#146 z@=eYSGdE57W9`_q4pQmBMC97|SEVF#LZQwwWk-{)lgJQREdC=A^4>}m9#OsXn-cT% z$L#F)p)JbouVglh6Q*z0rg~C3i`u-|?LAQ(-^^s+_NKaH$2n(d)b|36!w!KVN0G_~ ztKU?y4;6`f&}xqen?U64czQX57ns`1BSVIsyZy7B1j>=hQ_x}9-*bI+JZfoBH$i%E-{XnJG+Am)hMrB97f82BMdR0!E-YsNSRrBA$qt$@@{p;$-Op(@|jlO z1y?TMk*|m0pP0mTCD;VmMz>OP@*woTi_==KkZo10o_$H9_f`&>Hs*sLxh%gfn~&(I z*KSoQAuf@#6Pb)@0A|)}$qJFoSgy+9&%z06&*%E9jT}TL z{iil}8U1(GAV|PJaVmap{Qp0D13f$gC#Zd#1prkE*qA^+{Afo8P0wQi^%Zlm{;HE&S2)4hoNhI3j-* zTR_qGf3uL8n-u^B;z6em!r=ak9PrQ2`d@GOFNK=_u{QHt?Dn@fEvONj^}jeRp#JN> zjdN|#y}xTXpgX@A?Egcb_J36B;b2N6$$&(MWM$<_R5*pC0Zn?3T>{ze2kM8zOCf=j zgzf^W+Co$7YCE!FcMy&@iP%=aq^HpvV3^UZ*OLk z4)>2~n(ppIO@Ov$m$UAJ=4J!UB9`tlD-?B#HX7D=ljrHz>ipy{U(MbJw!W?%wr|-? zmKo_Pxo;?K0uC~)TEA~NbbKGxOehHZfV1rWoiWCndO#&U8I4-Wxy|q$Nr(eNjG+sY zS~?AMPI(N!iHnITW^1lY!!xUqo65?N8aga^oB(=6H}fP6$Kvy^+n>ZeaKyfI^RY%x zvA)YXF4s)w8|%_>8@~8TaJ@^|bZ%rNpQ1Y=zQ`5XWeIpJIv%~}e}Qs+<2bR|RM%FW z(TJLo^~5}QyKG#tZlVRY+%b#LMt7>#)P<0ArP|_4h3C@u%#~3uNw3ajzb^ z>+z~i4>FULmwLLzvisO(cv=YlSzXKG$R}J+jFm>*xcqr zvmFucI&k7VYhPbP53^7xpnI;vDgJUi>fX4&@JN3}naf!D2Km--Vq8~~<&9ajX8o{s zTIF-V@x@rukObySmGf0+gn)u@pR665y%$UOPb+1;<;H&=Ab7`^)pQG)SJgF4Gv z05I2PetC%tmJlcJ3TH|^dcp4%=@nA^ReoH!Z&Ha);qpv&=wz(_9_5H!3oILr$wXD;8 zQ$gdwC+2;*$=O>`YtyCFuNPKRax1dVUO?G*n>&0%r3QvWzI~6yAy;cwF9-#jSn%Bs zxi&g6H;H+O*Lhv&_acIyb3f@)D!cJGZL5k3qOn2_z!&ujvvUy9j!y zDJu_|`Ki3CP1$emE6JysoJcdENrJP}h|o09#4;g9LeLwNY3M^|#ZAWodzM*Mq6Lik zt51B%xxHg-w|VB`=oT(1e{#u)VDiAj`i!r+r z!dCfZMdT+$=fR7q?&;nu)m$a`w{I=hP_VjHQq-p%HQiZNbS+0*UJ!(KCj$cDnfLRU zO?c54hMV{0Z`)}pk9cXI1xDqg+Ax7N8EaRW84_p@uFsV77~Fo-7Y)8IV|VoFNQ%WP zoAl>mhnxiudS7q)ahn_`PSQKDJIH%{R)d)*d(GLapHvh3nNfCtKz1IdcxW94>w-fp zLx|QnhJWj+wl!HJdv?z!xY3KwnFrj~dps3ZppVL<{2b$Xr0Mheb4{o+B)B)gCp1!< zQ8hR;SVVkVNwL-5+V+k^HIf=Mh8Q=x3=y2MR zzciXE2lTUod583ujzwTi!%IQSj5(8_=|siy5bPV=60yu%WXM$A3}{`1 zB4z!?E)@(BbdV8mutJ$A9COlvfMWw;biNmSfvcimHd%rL78;a%z)j@rtZG88$*G1y zOUG>AB}K&oVa}^si@W(aTncRyFLpiq=%~yERx@1L9p@Gm8c_-ZqXB$+7{TNsg%sqX;%+;biz9T5Q?N$hS0B2 zUa3N=*!nPeFLf(iA+32Et5~?z_ii&COP1BX-Iy?-QJOF%s6VC%pJRf7>v137ve8Xk zsExW+uoP013ZSi8*RibTs{Zt-MLOw~85z7i@nARoSk~P|liJHG1UVM{Bqy5i8&wCxKv4XdIPKKIy|v!Z zY|i6W_Wd>q$9rh+(o0P?b)ky*^$J2&T@6d&k!keW@DV^rJyNUy*EaAGxU1DXFZj zun9%C@EuQrYrj{K0p?*2zz&DLllJ6u)Vg%(xJH!ey> zlj8B(>@d zdsur+v)%D6rjc`QRff4=7{4!;az;AflZoz}BeZw3<;+cm9^2`-ek?*||MF${aC|v| zFMdATG>mLq5-6E7NhrkChNKzyz;sD59^6|RQ$-e-je*6;FEez5AI>`1U3AiLH^6x{ z-|G{v5!%qB;oH$sln6iU0Aa86$(z9`57Og)P~ux~bZ#EDGq~@bsxCP|g!F}&qzjwy zL5V;Db8R!#kUJ7GeXq&Un$bwU%S>B09yc8{b5h0Y7_i>56+P5>s0&9acSjb*J(}Gv zGKFS)m`d=e;I1Fkqhn~mwYcl3NnI(Mx5a~)ivSB2D7mF4#zKwFGOU)#7s48aW#vqP z9YiTqBexJcT6GU(Wl1(U*fPbJ;lhUb@QAHf6<5#Col;YwtGopj`mF`czcle!o=ocT zy+AbXDgY+62QEcTkXgUL?0A(pS$c+y@k(Je+vfvy(l*BRo`*-$^2?jv1O{olqCu&r zMlPorf5U~~#8CZ%_m1>1*oRmU%T^8Mtt+@Bb4CNU+{xukzL8)`Ni!KJP}z7({-HP}t~gt1pa zZZsH=V7tJ}N}|3Kza=PVRQcd$Zaz^dc59sYE@f0!EWU7~Kopr*3ESS(auqX7J{tj$ z${OYg2qk8>#CJVYh+N6h_Lnd`6*EU6qPGz95abD^-=rba&V1vEB;E+;%b8N zpaQ(X&2$+pUP}ch-EomUFM3c7lgJC9e>}|jyk+{qJAwMYQCu^ zV!Ru6`k9-jRWITZqxID^tEv{OI8$?6UGgVivw*>v@IFYdp8lxHq3Fu@c}t3FP|P9~ z56PH(k0paX8;}%yw*pLUezOb9dRKz8Zmz&-k@BsEcJduk`b}%?lu8iIFk*u@qfPZl zz>?vzOMFX^i{5ub?t^<^)ftq8L!Cr=DEl5kidP0;p-z1!6V9F_8d@w5fyq7>F>JEY=NKnOBr%jv%|knbht2?Q z!hQB3HS28gfaa*Sa*c6_(33OavoHmZIS0q5$m77biMI`rUyw+FInRx_a zOQ==G;v;7*;QXvP1oxircjoDZ%c=Wu@`53(w?rBWnLW!38VGk#JNrjG_D!**jTkK@ zuFIZFhL6L2n#k4|Ow7H*Dd;9WJ?95TFZP~M)C`r=rjpWEi}GlE(ck4Uz^J1^K+M%j zXaRGmePQ?N(C9nCI)xB_r0`DN4nyqs*s9eg3)O;9rz3lBL8A938l3!#T>hLv-IOH$ ztVxybO)8>#21Uau7i^;7Tm%Hg?q7>FpLiy`wsY3kuGCuyPY88C4@MW3e!frwUS)8) z7xX&LZR+9&Bqwuxs`j(Jb3)v17c)L;%h*Ow616*v-hk?Tl8OW3HohD&*)J^fJx1hu zv+chS>pSaMr%}KYAyd@~LeHZ2aJbmuuQ{vv@XvJ>4yIqD*}p`=0Y>2;0LLHM2M!Rm z3?zGhZ7=8esc=ER`aidqbAT9)KQuH4)6Xd}#;Xk(i|GK;1 z`=r@Gl@&Hn8RSPh`493R8>q0t3KH@x0EjEd#QMJ@`u>D#{^LCVf8QKn2ujAYvVhVg zAfy@#sKuNGv@4J}2jS#EK)4?*=4^itjrsNL>>Ld2j1BGISz9r%GBE$s(fv{2_{Zn( zugb_T$rk`rH2M_@3xWXrUK;srB?t(~04h`bVC?I(0G}Dv-k&t5XAOl1#$BJ zUIe2IY2_?~mQY_6D3ThCrpSBFy1~WsiA34&`}?y8Z5>I@uPG-;fe_@O-Fp6| zg_MR)?nEg+m8=~+p8GQTP%DepF*uD?I}?Ww4pHwaPOJwbKJ^^=@0QeR7gH!fO~{W= zX%9ZzbJ5i$P|4IolfHO-i2N*aD|)g}bwXcmULH3OG{l%#FW#44<*AUWRA#)gE@ISN zZ27E{QTu&y#*^^<$5m^~10YkF`gzh3aV?X+6uNy&i#^1*-o-_N-7*v@crvn$``kE9 zkOh}35w3Xbvy8K%mgrGgfqO4(xtMzY*|@tZY+_53H0$NN6|19#ASQg0Q*^1`1;n7K zc4SpdG`Ttnu6fckYB&|+rczPxAf<2c(z>?bs$5RQF;rRz`}g_BN5Jgk^h};#~=?nte*9dxG@?3LP%Ir!C;fglB`GxP*tjk2hLi1MU zlsQzsn|~bk?FOsUYo6Y=UwGr&pccxPwHPhob1S(l=PxJDFcl}OQF_Jr{9QJdYngA- z6+U(O4o?u_^o2xUJ0DQGYn#8LCD}<@<{ctRJJt2gOxyg5m+GJy4?+8uF^!Oo4bBhY zwh?Jq8a*YBS(eRfFr-*G7adIQZOphAzvkN+&M%z>;grPzr7k^RqD>*(T<~ZJC&s*# zl~s}DKw!U}eB@6X@&=fCoz8PoFJrzVqmHi7jxf9Z&x zv!=O0j5{8P1HBk^ylN~w8;=VtC#X)N1#9q75ga1Ay=#oQhC8YqUXV2;l+Kzq<0{%7 zsVh&-VyJSQ^y>xiFf1?WhOg6p&u z;LZ4oi8_LfItRVg8U;J#*g!(RJU9X4*kn??F=yc-^e*5npdGuJJ?DbXZLs3)_ZtQOMX{M>!kkuwNs6VLDOo`&GCIX1QXp zjPB6rpCN|r3!%!gH7D^>K)zVJE==grLH{V?kLqMRFwQ2 zlO3*1Xh&P~1y*V($0*^z^wflA6`%=UFajPAr*)2_Q{C6HilU-sYJBQCdOY?8c>#il zjxw?{P}$sVi%tjjxb0rY{%Ni_FDtGeU65Tv16=@10TQe4kX)D5TTi_8gYP>!A#SY? z_g4@suCMl_+T8Fm;c6|XuA05{>;x#eE$s$Y#;_I@T940?P*PY<10ZxZk zk^JK)q}mke{oW2{IPGHuXH<}pba+|?R`mdhoj9NOMXvRPOi24|&)G0(h#mZ=u3o(s z&sw^?2Q1t06pER#lZFy-{x)WD@rWe~L<0Fh0i&)C!@eBitq2)B9`3Wg!|s6io`?1a z&b&xtaC1#Jrf4Q~xQsHV2MK0-QNg*T+i$ssA2w2ZXX5deuD%l06%(=`i^ktLgrM*KE_!*yQq=Mbc%1FU|fa7O2<(6u8% zlnQGKg{myRd})*5kbvx<7bf6+*!3)B&6C+q^ES7e(=rIj z+oRomM>VINKP!-D_bb0XvKhj+i{xTHMW#tZcy2syz3>eA%$*Hp2Zc6E#Vs|fLBu>k z8VsVXw62~c5f!J6}XP^P}rg{nk z+2*S6Lw#L_9J0UM`__r%wCi9PX63CZ9%pCeSnUhL9@AJ5$pi+kTw8cQw?$wOSaem1 z6%tP`=%8*E}QJ_h7R=}*%OlwVJOj6Y%S38}sf7+xZ7VIp9QztpMBfVz>TMN%$ zF{bGdGS0P^ZFw{&;_rW_H$v+|;%>f)&{t3?}o11zH++bTlu!u6^##&K^ zfn4bI-QI|7SFNNwpa@yn_e!K^%laY2yVTRX5g?W;H6EC$b|z?LRGn=58j~s~QqtwW z2L+n3Tv8o5m1J~@)SOGI`6%s=P8}&x%MTbz?7ju0_RfMIBI#Q<&>vuI z8b-Gpb5jz~1NH40Pq6mIwvzuse1isD{wZ_+$Ta+z9Pp?1{s-3jf7RYUAoM>H3%?BQ z-~i#Heu(eih1IW}0smL6{fC<6-~jpBpkWLklp7ZaGtb7w0&=WDurm-l4#c7V*DSJs zFBpGz75t^YKvp_vY{$=+!1%v(jh7B>LOD^Ech>}ZX;Ma6vXZOD*|?E|%Q0{D zA|k>2rdXmS-aD&X8y3uPyx8r!#)8B+Ld!&yQ~(}AF^N52L%6DGhBjYpfi*yAD{>kh*!j7NkF zCwwcl%Y2U(%0`i@C{$R&{YIvDwXRt7X#`g@_>-->SUV-UbkAj=b6O8JKU^WT4G?4p zvM!WV?u^V#(>!IFyb1FINV@}=sj#Nz>~po9`8gaU$);?R!n6W#C(e-$T>Uj z46n;m^hoExKcHki3cLKO!KFS~Ez>mQLPKTZ*x?O`GT~^`_55K#umqM)1m>-&^lG!!aFHMrf+3tLyL zr^1{8*sw&aZ4lev@Dud6XJ;>P3A-Gw$iE~Ca@)G^;Oce_bLmM1sE@xvruAe)4$8l* z_n?j_u;=8DG`v(8$4r|Ekwp7GZKDN1C#4&7V5Xtq?rcK8#`jM3vqmkJSpsS_o`cAbOPpm4W(4>(S|}d9o{}$yYM=gi*oW^R*K` zEkns(n==}e6g5KsXn}x9T)QXXBP7BM9IM1!YH|0bacZ=3WCK6b2-0cvr|Z+ zRqNH<`pRnC_SGD`sLoH-U}mSU1+DJ?8aAKY zgvDJ@%k6Wh&k?lb&am?cspkWDn4drwfYIg?{T%Y}Nsh*?OnXriX(Wyk8I8NzSc{Lp zqXoh|M$|j~Wk%GAb!uzT8>x2mN-(O2`8#8Vsm++|{B9;=Y2lpCggRk#R17XT#iaM1 z1WPx#FNwdCqpg=+r_0}rK$A-oc*P40DMRC+W z8~mJM*@#C)vIcu54MAbb9LX3aLyor1LR-UaG-k`T*UUKjIh^@~W^##tWdZ0ckp_?1 z)EI$0GmiP%#UjhkR+r-i$H@O^6AD>URFyp%zRJU3RXsKBD5oVPmGH^GCIaP6b(z)7 z8=Q82c=6&dbIti?ePp@K5YT5|d*lTKS&TDBISRf}!$CjzXdd@}dYSya7mxNCkl`(* zPS2a9a#!^xCfdmpkwzt|FFzdMzV-*Wr?I?s1=e+mW|MZ9)Fdwpsxk}*G#3Vv6Y+)+ zVHkQ8(2$T6u|>|fj~ip|S5%T$A+5Gu8KfGKjgs+^$Tikduc$}*Pr9Es?y(*);nQxr zDsq30T1=fev7KL=T53ulL<85p_NN_rJ7b~HI(rJ4TZH9voW6iWobn#%n{1UUUmv9P zelmTO6Go5QfG8_VtrU;G^Avd%WghgMzgAMg^_x4sNVQr$tU_$@={NXu;!E7cBi1IU z5Z3fv3mpjO;I8r*h=VpY)|+{FcD3yO5^3VtEJm=LN^E$;#j-Q39-Hdm&-?HS()r3( za1jIj?p|DCT-saP@7Lsk>2G2T4{JvQ)vPSLb^58FFQFF1B`T!wObboFtpR>_UNG-C z(QLr_Fv)jqv+%M*vcOomhUTGOM#T#TxmgPHXS`ReVRQE)2}cQ-F?IlD5BzQ8%w1;! z8M-e~)pOaVAv!T01rpWQ)^14E>#-UzRMv6;-skT&xhttAD*J2zzSm`(p*q+kmkuaN zWGyqrxQR1igQ4N zykWu87XGN7lrcm$BTN{&_~3Zb&txk&XenXG&$=`-c?|>31UKD-gvr!W@F+~ko{KR%I1Oi5hrz~Z)lCMcSXZD7rx z;%44bVmv->OxI2hi*xlo=d9#K#@x%0ZWdj(tv8-o)6YQIZx&AN_Wqvo%t)kD`#d(J z-F>E0pTOwkf&FOx+C!3;lJ)hQ1$HO~P2I0?$SI3Cw-oS20p(cOIUYk=)a9FHXX52A z)8DIk1;%H+LeUYL*C=3(V&?Z9M#Jw_TqyDV?6Rr7jK{1?z}1HJ1coX-yxQx z&iN9~zgvLmX@ljWk#QhaIuY)%+`}8{f$nX42`o)_U~IPnEp&U*V|~jXf&z4zion70>jmpC9^Nk&9ti*Xr;Gqiu>bk1|HZ=lhm81LMR5Hi2g?Dv z#Qz~DI9PtzD?e_3$bmoQ#jowd|5thOd&HNGn;n#i<_4(=0E7qzp^n)>nO{z(A6_2l z4;&o-a-P-CQD8#)wnh$yhCkdqu0JiQpD*IC%l-dwgTVh}HZuP(8$s-4E*8+tC}L(7 zkk<$jB5XfB$lpfh{XXpN-|g?`;r_8dz{<+{KVxkFeuAI~F$3EVz%IzhWBbeZ0u8%j z1En;zonsT~LbqhaUGEeCnw0-``d5)>#O{$82?3k{%SXZ^d#_ixBYJs>|fl% zKa$$N+mgQ~wSO@m|1%-V%0!%~6c70vf|dCnP5INB%XW+PXu!?ej?YSyI1~cU$uAr& zV<OQsxnnHYZox%Ea9wJ}XDiowf_p$C`#V;nbTY_w)_#cyFEQFN4zhgt5yShb=1nDAb9dxT`BG0y zPk{Luuo!Ie%(l4kyGW0iWq4HS``lx-wqMFdqxNST^b<4tIc5Od(=A7hV-$4s7i#u4lihj&^rR%UTzLS0#4Fc-hu?Fg*4D|wx@HBw;@frss9 z>c1+`K$g47JxezLXF9J^3KToMY;$Bx)FtkhNV8?UB<8JbnB2%5a8ztfeU0{{qd5Q= zzMP3~+D*g^7gD^c@@UA-C#6igLtZRXbp2e9Ig)yKDOG2j6VcO*EoxWKH`;ROw3vq| z%nA$r4e>^`AR_(&{Az`P5J&Axf9B0~+LZHL!;G|T#omq=&;#!zPsB<%bFG{I(Vt!e z6+T!N zIp&TRgTE(acaBz-(P%mjaB(#|E|(DM5FSl{U{0J0*l{zhWa2Qc@l|` zGn}u@$i0H9WNo9lJ=-UWK$W?H0!mHeG&PsBuhdklD3)if_B!F20(~MF(&%X7v2Z0f z5%sZT_&srq5tT3wS)x2J^m3>gp6Mlyb&~vlti5Ga+*!J}jXMN_6Fj)PdvLel?k>T# zu;3cp-QC@TySo$IT>`w->C-daJ#)^P^Q`w%eW^|DwfR$PU)(=QJ6XnF#{FtcUr?HX z=w|yeZ|`-2IK6h%Ld4=;RuK4Vo~>oiYkMCWt- zOqdze!yTYZu_d}HVXgc|DrG2FcA^gpOI4Dfzmx;~II1SZ@Qt8%uG(hqrKoVTZO;Mv z@?pqmkLW^j+&?j)(RM4{1cPy9lD2uYvim0oAb?Myhb~X9YFpvSXwN8dnq1r#cV%lR zgzs|EtJ(nqXcHeCWsMeKww>KghQzRm@6 zt9=C^i8)%ew)-z|=xH`XmM@!2eUZxMPJQmN*iw|t%82I3(xb2XtQXyr&ErX63|@9c z=twEUk`)pK#jtm4XyoU4qQxyJsk_oTb~W=pqapsoM{0xY1CuCED`ifPcjD8})0+j4 zX6KI0wie~DJL6_t&B$J?Qxfq1>3$!=tD%3>SJ_&t)XQ68x2DOx#tJK zDHL`%eVbR70d(5vUJkUxEiUUN?5>~j>2)4XM#!%rGd`_YGZ>)6LVr%APzJqeuLD$ z9_*I+7a@W**nCYMFfQ=Mv@hj#KVmNcUn@Wnk8#)v7z`mVSysT=1FF)l86{0Nc`8}4 zvJs(7CK>%amF0ceKoUR=*on0&7p>xwKc;P7QyHiW8f55{ef(bF(6SA}POjaZN(w@p z0obLZOYYam(J-i5ZKEhiSZSP|2K%sK@$;=&m6Yd&9HN4RM_~5Q%C`?nFeHK$a3EPV zE`;}7%?mz-ZM&8C{qFIKf@INa=W8qRt)NA!h2T3CS2G@vjjm-3gVSgLg1VaJmHns; zMmxlT<@Z>7Gqq4y=JOHQvBCfoB9TDlNQ{08qI@YkDstpHLS!)o2mueDU4`<``CORP z)h9MR25Zg>112KZRcy)!%BQ0yfUkB?x|_QyEuV==M6+t(GNxh#>+BCi%CQZ{vHDGC zS`!wxPP@nJIuU{hCQG&pZ3efA4FbGvh zLX9usWv&p-liw+|C<}Nqc&QC@s2zz4bJ#lz+Y0)Yh7ntn$lH~vT`zPX7db}!rrQ<{ z`t8QRT^_BsgWZf(z%3{Tb-&}_yH`ILVg%HHHYmZs&*kL4OUEjXE)7>TJ))8?BcJz8 znv%umn?vk%mEq4%LqOO;Yykct+*dpaU3nz_K2uEzW6W8Qpr4<+54*EW?I5|Qej*pu z>7HS5KCqP&$#`t-Q;S-;9@CWt1oikkrYJAFJcg5IVCq` zBT48ivdl%W*{s$;KSaTG34RF71w+?^CWosUS?wsG>zSuH8;!>qqLasRi7Kw^UP3~n zDr`7hZpjC}$1maLX(<)Av5C2ysZD39OxUIvx2|U`XYKwbl}H(yL5a|t>Js&40lvx@ zg8#fVZ*a^0yyaXrVGc-%?iXOz%j6&`vy*U1lbdhrXnvyq$YRIxZ$>`AqT7F7DgQmI z0qCR)M^4NLVmZv{^@cKtQG&~2mZQ>{tj*b>i`94 z@BAMY{^m?&1v*uMiBbO|)%&&EKW@MO{U!GQc!&LOFQ<^d##xCi?;!EOSs4DSz4f;N z$!-G*Feqv&inog`u`rU5ar0pn1Qyu?nSarHQvAf+&FMz`C_Vk#+}dZLkD$IE(D)-K^%>%=CimB*Cnb8FmwxaC2yGyfSs zy_82rXlwsEZr;{&BfH;u*q*@vfPeL;=QAc@jEy)&0!-FN_FE zT!)m`d|r%1lNJqfn%srV!f)mkJzOuBSlYc4EgD8NK~Fq$UYKhFU`*mQ0*^tlrv}H= z<4w`}^Tu@>2u`g12ZwRVo&~Cob7O*}7X0Z)F&gbVUzhvz3`>o%nI)Lc0S#g0pT-#W zNhe1j2P*}8+yN!2CR+1$5!FpGvg0PU;HqAmbfd|kL+pTUEw+Tgxiy|j{OHs*!J`05 z2hx)q>XgD_I(_Galc<+TFhh;qF13xdC?{j{fCGV^r$B1$l?hF)E~#Z^l;eiu=;LTnu*{v#~E2rW;6o^bL-?0K*2T9zp0W{!$4u z=yJ4~y(9TdXpcJZr+0z1Cimd@U7V@@aicKwhnaaSsp{XW^qLu`n=$Xl#Fk{P5L=lH zr$@K>MOeSrv0WF7_3Q@1xwE|RvdWJ?oSa0kJd3$!&!7XNGt}JpUYus7B;tEsuOf!L zrd(pZ*hRbuT+!-J00s3*3cOAtnu&&SZJ8Yk!*2mf=iYLe8FT~ZtoZTD(3lA2OOT&h z@pH?%K{1|mZ@N-G)Dh&t-7!DQX?*9M@*_W1VS8>Z>{4Zcfl01nQ6iXpzRie8p?#{L z6P=hccV@pG6RGM3Kh(#$NHXIaw%3xk4kyp;ifOSF}wI+bFAp*bP$=k@lj*sWedi= zXSs7N89`-x>J!f{E+Kz5Ey3|z*Fzi>NAEqLb*{wxRd!ZdcUE@$^62U+i1&d&tP zOvep!B>Atq0wVS&;minSOx^12aE~1fJ8Sm~=)#I_cRi0+0mk7z0AjJ*-hEJB0p5sp zUyO1Wz8}R0XXWQm3R8E=n$-%Cx4lQB2fL%Yxk zkE4LkA9Rbk_c{2>1$k@xS0S_UVsMGm;f40`ae&)Lr3&2WjLVo3pjdhGE(V324pT4< ze<{GgRk)q6oxP3KEv;;w-qP`O=-{aNg5<-W8h<8p%MEYlnZ(!B5p71dH=M-~K!MKv>K=BT9C& zx266PE2~^@jfWoOrmJ1CYAaP(K^sfl8mO+nb*M;5v`4xJ2$_;L3roiy!N$Odoughw z9U!S3JNvGZ8;4j8ltdDun(i>g>^mvt3U~q-^{n22n4vua|y8kD-_x ze`-!{KapF#aGm{T5vg%*U_@9!TY)tQ;|S37d@BU9H5xP+tlkSv_PYS7yp9&H%L_2K zE$(V1Tm*rTbPP(==!Ce_Fap3{D;$(yq;#p#{Xs!P>!xVR+CBa2nWe~K1K76tWxx-v zTvlVN+-R~7deWxrf^8wEa}0FX8^kr%J@H)~vqFJlLjr77!m}>5EJW~9k8tw15CEw- zOtPqB==-{qAC71rgRDM5b&rWkt9~UGJFQCD11nj5D|Z>9NI5P}@}nxP%al zJi?;)GJ_{nAV&E#Z%JmQmAV<*;ox_{elX|J>lDGs2Om z{B-DQXQkA9VDSZH!1>}Mgq}THb2wn=kumnsiVG6tkUTAPPyAE8uA@5_c$zsbT^GH^ zXcAQ?)Po>I?ODJMdqy$w-bG6Xw*bg#i9uI+!Ah+xZ$MM5PgAU$$0USpV5Xc}s^7vy zu?wl8Yw9PY_7>hQhq{iPF9qZU?hiCM^?kw&F| z>GpExXOtyS!NQ_r6}X3@@q{zC{g@MO#+#cVV?iUPl1iZVhCZ1({44mCZ_=k$Lw=M> zf-^ZS+%ZK0HME4~`;rzsZ|N2mcFKUx9GrlY{Gz?u4x_sgx@K_cgxq7DNy^@f9xK9~HzJQ_!`f12K>2h|ARzRuhSkqImNf2wEUr%~jP~4fzmY7$M_g_RH8MX|i$7gPivtyU=UR9{g)aD`E1c{E`^8#mgDp?>7ormbVjglhPTxhE zj}r*!JC*DhKDZ;B3;SBHDJd#Zl{RD2+9J2$3=0#V2HJ3Ac(n63%5}6_i zpN9fATsMr;NmL34z#j3wtY5wfvI2ng4^saFokxV7eLHp!Cb`=01rCXry07Og0T5X+e_rs zH=&Y+Y3oH9Pr;gdad)V z<9P^0J-ijN6%Mw0o5VLaaGRfO`$evi`W+OOd(9>w-3@H*5GfqtCD<>A0^soJE)N@H z2tZl&^cCr|08sbDvt{tE*^8zGbWTbeh`0Iq*znYRnLd024Hp2V%|uH?_&0JWHe9Dh zYuE0&B}|n4+g2%$pf_e3YX>~1>p1x--d7$1Otxo}ln5kDP6PS0Hf-hhR04Vl5u8mv9YO0Ia77v;9vURBr z6O_}Cg4LD>A^FaMAloeXmT~rOUv_>d+RV`$lsv;=E;8( zTdIxu+Jk0B7!ZhG$8+H7rL|Y68VN!#3NLqV71UCB^gfM-l#mk^)m9~Qd0y7F^~l!t zkm`Lg>kEuC0W&+pj>ogKKJiiI3+;Z>?ou=+0-!secN>y6;^FF9OD}22#=l3)-_V|X zB3W^WtzpezUMDm66){|p29|Zc>WeTxZPCc*p6XAJ?w`-Hv3L@3gUKeX@ew#WzoC9F zIb`#DC3Z-^!OEm~XSp^8@v`splKpd!WK%^u`el=*`?5i_^`W`bR{`Sq!m>tW(7KWy zM%!3j;V_^gxNfQOWz$2&1)gi^MDCGV;zT#J6k{%2`~DMvGb-aGrofgrA9UjMOh~VP zvC&(w&B##`B)077zF}ojyrM#=C!#p#!wh0hj1R=6ZH@nXX?R^X)kl+Q)kgYP*vtK{ zM1DL-bin^UePsUE=_B+1ZTk3Up#9r42f)VsyQT1dCE8zL{Rfx+hQfbY2vh_D$8i$Kz z2{hvU2Iz_8nc#>JOzg}IiPiJq6u(OYe|1_WiLq`f2rKRr!)(^?bb+?PY)bq@-WM!4 znV=|5;NqIk_ziv0Nfiq!*ASx#<;HSdXKz2F&kc>e$b7jjB!_+T2Hfwu(ARE@lGw*9 zZ||LXDh;L*7jKh%T|eAApOWa5dcSl$Gt*l>YV61}NTOkKLNfIekhOx6qK^LJ7_F}C z5>}8b^&-CW(p4uW1D<=vGCl3*{d#6sYJ@%p9^-VHzvf&>s`Sik%bjK(P@tEE&9!Wn z=4w**R-EdFMGyjFyJ6nZwuBvg;C!ce@!XOAK+`n9fA)$n-Hc8(J{_7rDSL}@hNwhX zHH)64XkS4>!w}F5VA4%|v=v1bK9OKgvJE+jT23;993h#$a;m~LQu$iL?}ZUM!1lQZp|v`b&f7Q2>*qlqgtA6LWs z$@b0(Frm2`b!!gVB1V>7{(1Jmd%l0vZl;!U_#a$(ML9q0FF`Y5~rz(Q-{Kc1Mc!mZPC`h_-giN+j)rg5RFcK$;qa;Rp}d7kU&` zbuxvi&ouDHcqSDC9=!af*jTlL)WBgCk8GdhD{@U5fJSy^RI!bb>>$jw&KW2AVYL6F z{6nF+Hs_^A6Cn))yIl`~a4B>_MESMn)Dn=|RnBNqe~Oi)dz= zMwK=~0BUrbo(ox8Qu00;wC+qsCT|~Wm6aMTJrLQ9jdHGN#yvyo2A7-&vkBo6u!*!4 zsv0p#lkB)t%wVkzD=(f+`oyz5Ux*8)R0a2hzeX!TC6%5#C2>cKw$L$Dh1^ei!lHiL zTm_`GyiC584ft}EIx(=1isWL_6>C8 zG>-_2sWfpbui3bU-wfAHFIfPegnQB?=L_JS2PHFYPH~48qPT$v=xiDpzfcc{5gz%~ zMF>>5kAtP{WYgkD}n8zJ8-_IAPT?wkMvh^c6xe{Q?i)Vvgd9=-kCgn<;hykJv;zzCjPj zb@(7Tw?ydqNvf1XMn(9+>!8Fq4TBm|6qf>)&?;l)c{1{=xyBWLfSMmk-l{9PS%78> z2S-C8DuoY75rsiEmG0SqnBv(_h9or5l-Ss^OtawdygE_E6tp~i(<4t=8oR!lpC;99 zN7y1qtHv?N*|!-fmu z+=jLw+TMc*s&G5HP<3iMnYQr{lpKXaP;?f|y|iJtnmDUdcR;uLP(kA4A5k@uDl=3J z@vQ5GQgxcD+NpZEbB4=QfuMzeL@8>HgB0F-%FBr8^+j)@b=kyA^^?I*wk;0;T0dDZ z!EELkg0C2FG{(tpNHXAx+k4x?o%y$A?y4{aV!hmQa-2BTNi>aNaqfB4mlSKwi|=Mq zl598p6f!_`g8p&}d)moT+kvF?Y!5pB<)mq0$2Nh}-_p30PA8kTAR5#sjeGEf5hW|e zMIyl}p7aJH!hin`)tzUq`XJOC(6G0LipqOI*FMKu7g4dbunCqi#3fhl`MNM2$wqOF z&L256J)&eUtcDP;gPq9jM&}%jZKzVUX{8l!=HrX4D-hhO1$D%G55ulL(1Cex2eQWf zU=rv1Y*U3xVd>%)8yZIIi{C$)(MYKbDX?pv>C9$!la>sh`|S&}4frt?z}-0`qN3p@ z-w{sh=$V+JOQNliB8$T!H77jS?j~Ao&{|52Ie!Yl>}*(7Enewin9*6^_SBT?PG(n3 z8Rvn3-_civPfeVqQm*o044f&aS(_Gbq%4Yd8BO=j*Kqo}&V%Uy9NA<;g)jLBmAFNN zxZND}=$z}dhr^3rN&I&SKy&f%fXin=A3E9|%ua|c%IKHCC>q=BuIXnNnu<<;IU2s= z`bhExmPj~Q}& z4bsX}wkeMYO0s>w*fop;PZ+a2E&OGd^i1&&L{GUyBrt42r68EmFSJDR{8F8 zp^ImHTmv@T{kW)YLhY=oJMXR_bQU*UgIM;{TM>%N238&Yq+W!%E{=LhTqW!0r!j}u zfyhy~#A|Wk5qwnBXTXxr@qD$-UV7B)k6Wqn`TngM7pFJWu|iyTI6e{R%+k~rOBHAS z^o>`z8}Lf)aN*m-Q-)V8h!64opPxj~r0*%z79C-5Zk-Vjlcd4lu@HS*&&73@bvfY8 zlGlm!ckGQ^k6{s!4#q24{Q;BNJwt=Bgt-}K{yM|ybO#7600DTU#t@}RR;!dvYEY|m z8&^tW$!0?7qcM>ce{bAP$9LUkT!+@b?qdjE;b$&-{E*ZqLNduMWnnT#SqShj{HKITfBNm8=v&odKFdGFe3mF?ONwI(h_ux*7DG9gM@kQ?05OWPP)y?_?U&?0kz3U||4bj5#F@J9a?$LzcMs zb_#Jl;o;E9f-QRsC|_Wt;eH&duW0TEvl~q~=Y8#}=hx3&8@2?xFE2#0E=IthR@lZfS?fRI}uG3;DwiB zG>dv!9oW6_=~}wBx^jhi3lVdyF09nVPx~6>5v`ywzs7O{+LtS;0PCoNlqP^hV-+ul zWTkTlJV9haxCK=(w9oz_Zt!Md0MK*$jtR{^ZiY3)lG$Rjbh~T1>%5%7t_e6(zBhEs zR+##ThpfwjnW$w+_Zf#K+!n)NLN=#!8x2Rx8x;Xify)wNIi!ZoWnRe8np}SHQT_d z&3Ty%P?|w4JI%Xd$4f;qX<6{WACX>D9?aA~$;L3JCy}Q;N}f9XfoL}C6;yOL4yHVry_qUCb55=3oXF0_iHuR&tcwYGNvtq z$&5g5KTvZnXg_Mgm-QHejJh4j^@4>Tz~NoxO3R9L0KiOFLZCygFPS$cbVkAiq2prH zNZd^PIawe}#=khq1y0&GG8keIbj(@yOCBdt-UUw9ebyvI{S&mVc68>jNf7BLz5x9u z02U%LR4T)h_i^B{A=T}660h&68~P!er;Vs8j&5DOD0p;jv74|-!D5r$1c#%lYr=F3 zHn9tC7l2`H{o^N2v(4z2`(=qhbFwe-T#eB4?2e{(YnpT<3B*uu-9-Z}o26~bD~J!C!=3c`0y- z^qSU}_)R9HZSI00b1hY+yD7DkgIG#*WuplaOag8#o_*vvPNe6UpH%htO|je72lY?TS^V$#6ZVLJbl1|;EGjQvO1 z%+P9Vm7t|Iw-RBr2i13MoDAckkO4POfh~Y$w*e9q-y64OZqGBC#>AIQHarde4Bz_2 zaAJqMB;)6KN>~u?^&jyhh94l>3Z<;^?&{bxr_qFxnQ-&^SOkY8O}=(pQh==BkPx_@ zm01ZiQVzw<$|HynR+S^ZgHMh2?Vj|MjI_3hnSRmlUeo6MaQB^4{|hX}fyG+nrV0c= z;)wPuxj=OfVOhaJ&{!VM)sma+^CRxVrZdg@L(n;cZS|dNu0O;&fhNb3nvCHvqg~!g zNg+xHfp-x6$L`}g-aV~#^wyI8Z<@PGN_*Br%#qk`DCvDBYOz_RL+5LrhjK_Z1KWF8 z(T%$h>xwe-ewVh_$i%RKjTpLO6BIkZoz0c4QN#2=ALbnedVqr7V@^0sbGWNN)sL`X zR0~5>);dS05$Rk0&kRLw-2!KieRrotEY$c_fywIm<=-+m>l98eiY+WQMFvZc3ixnj z5&d82aleC!vyQrn`Da>D5zRP#xh!3T31t+geSOM$@bPo4jozdZ6L_tAV#be7>*D;l)#uT*r<;HcB#dDcI0{>xk-(sEVX~K*OdYD35?)XfTCa>( zWp>2stQ3%w;$DxLAJiJ|#e^^<07&1dJi-J4RvbEvJli`T0ExLoN*hr}4 z^PQ0gt)P(h9F~&q=qt>g403829rky~M1<|g7V@NXrKvca(Gbg$m|G&BX`_PR=B-&2 zEgfB|nBfQbSt3k{4EkAL!!V6SeHx<^8A;3r>>BK!gq^_!2t&mxNdW5-baA+nqj9$I zu0yR>Nz^zdSS(y@0X%x)8ZPMQn%4Dx-^3;Ek9D^aMfJFg_Dm_NtR=`M*V1eI`wvE5 z8}Y0jWQ%?1+^CtiUl)ztMMTAr_b@i791haJ5b)Pu#lbD#UwC;2Z8+M#Tbg}AkF}i* zhK?)h_0wDx0X+t28UhSsnq7xUhu}o@nC1tMhA|ZNg{)Eaz{msSITUHs%bvN`V-%>pVH zRN!bm$$wmA3Ga`J2MRoot(B&T%|`oaF`4#oD(ms33kbV&+yH0C_@BCXk9+eQBoGLv zZ6ST2j+9uHc}&oTK?dh^8&2-F;STN>%?bu0?!s4&4_7fqhXgTLa5p2QZbFT2k4upU zShVe>W8DCpA*b&Mv6XXDGnAl^u^cjCi6{xLVIc6EK%d&Q*#y~8^5EZK$q%jD!^sa| ztT_S=o^1Y*YAIFrMrTq0bRec9EVk(Veypl(6QW9bf1%;Wn=`4=>6u zUn!Rze80yUs}iNpGN_g41HaR&$PupOVc9`u^a|jMRUOsl8-#ncY9P4rfl1QsHaOA6 zWQ)&PnNYA6To+dNA7o9Nx~ARMB+3}to9C@BYtjchi2*MUy}czU`|RAj!*nqa^R9fj1Z2^FIe$Ma(^_>%LdLR&L7%__H5dUB;hU z;=KyUq_XTJXLWPP9Oe>BH`XTOZ)DpEL#UxnoyJ(N@?rQ?oB9AX6OWV_x^su4S!#E; zs}l|R*ns|%ZF@a`#ADPqz4U;v6DE}ISp*6;C59N2THW?{`l9O9#t@WQJ5D&7ub^P2 zKT!#{9dC>$-rBf`Evb+STOb^JUT=IS4MZ{kz4F9Lhl*Nv6A(#v{vkf8vboWKWr!rh z-gq$YM}c}?Go;>{x{4p8%3MzvHJoj)^ z0nET3$P9EJF|z~RN6c(=Ou(~c{>^>F`49KeznYJPjcrVU-ZIXA+1#J)Jpa+b0jEj- zIJv*>4%h-h2P_0(1ZHe70(&lgOOE6K`ivNXGE6p3jz64H|A)Q(UEc`|?)cSk^1oB> z-)&L9R{r6q`ki_ifyejvK^oJqXX}sO)o-}`w}n8j8~~Wf@h=P6em&oREc`nz|Mutu z$87&kwEX9M#$N+Cl3#yZg#R-;C*rU|;(>9n|6zanM;3<|;yi6Eaq&mn$f&QFVIo!d zR`_W=MRO-ML>9$jVq`nInOx#{yf{(T5Q}T%G0MeiBJ-D@C9EPpR6jn$Z)NbWcevj2 zMY1UdBoFTH-Bk_MFi6glp{P@^l%23=`fb>Fx4#UO-jgkn=qJGB%;=ZQnNarv)cT}J zlO$6(TRGw+T9OrBB8m-I3;nXC1&DKsL_^IRNt7jRl#@8=9#K8=mrS@7UWmg{EsArI zKB7OKW+=+i$Hhj^g9J_t_uG7g{vu#(Zq0MvvdP_%Wsei@KU= zWx4QOiEOmvlIQzVf$DU-)(R~W;OkI@v!+%9cNk2C5}mX`b1JM-E;}<-p^47?!OKN2!e=il$v_fOkW?^}H$rQ)UVa}*1b7#ge5R3NB1Ah!QNv!7Y{G*S>JZmep*ShC+U_p%eH->)ZJ!= zw}N%AZ<|j~E#U7itnU609_==wn^+$!PEV)UgLp9I_teI_{HojgXqZVLn1PO`h&ODe zJhP7I_Cw^9&Q1T`Gny&{c>X$gyB#N?7~}5-A){yT=^r)Uqheg=m@Rv$6SzqZZ-0r9 zgWRj8erB^Jzzy3ry8rY8dpQI8-j1YnxgRb7$51Rj)8+YR?tZmNhJBI2>ES1~M)h- zf&Aifa=r#Ov1`XR-fRTOcbi~O4XfExi0w{kV%R63r2LCH=dRsS>hoSJCqaG{ePI#9 zu=B%Jisg`JZXrFwlF<8sp6bOzH0JGs)l1u&I)@{*xkkzMwENK9;GL^0VdeJ?bTl{- zl4;N2@#U@Aq;G;Yg@CsERhqD@L##`6c3F~1w~=k?(#6hR*@M`1YDI)p)8IeT1A*ib2r1UN+Ka z`O*G4%gue58~=m`o9b*G!BLsHW1tz1I)xxLumhQ5Uj7zOZWxe~sr^Y6>SI-INA3lu zQ1)1Y?>mUBN%2hW+(DY6MQ-CHY*c&4@3t5*2WxBcDg+)Lhx3H~Xk5x%cbRGPsHyY) zN&koU{exI?W#WOGocqO!L&(|kAm3?jQfGa z6^z7s&&;;JgHa?$KY_>p}_7kXFqXvp~ zF6AE%TXGl53+V43#BRo;jT#Vr*MwK-Y`Za5syxFX_d)Ns-q0BS(Vz(-jy-#JR?tN9 zvbOc!T|xc2W-JV~QZe*WfzCzn8)4wPI#Lcc9S*Ocd6hH3GOmbIUHyou?4a18)trtN zGV%x^VLu^Zg`bZrS=%VhM0Gohwe7tn^LbV-!q}v4;48h$Wc_aQO)w4IXR^+9ZhqMz z&%MmHiM#18N-ln0mhm9?K@72eI1}mYo1Vf+^lD;SLc?TJ+|T(WKi~XwRibATO`#~V zwoyDHxEs>}r{~&|$N^*#c9dvPSDY?vx`$)(gKk57K&>19*E*GTaiK$_!m4?89_nX}wMIfvOjeIzZbD`xzVTjZ}bJdakiRl#~njHkgjhYQx7>Ex}{SzU+{1^gT{k zIE+-xrBoEeW*lh3J*uumE-v=ED)Icz-bia$lx?7Zb1CR%jblTI+-CK)3K_ z1<8eBILN}`hk$33r%PVK_vPc!nRR;!Oqg&7^(o45aH3mdGl6lo`}yc~%oY zX|E#!N(Uj08g64wB)IMJ>Q}g?htv6J?17}5`gT$4V+j&F>sLY^VeEZqKF(IjjnBv8 zulZr{*5}X`gl3EE+$|l^q2XBB!Gah3;enJB+Ff*uijph?tGwu7ca>@gZabDapTyWG zPQTu-b_F#(7nihatL(ea5+`7@d)!^pFRTtATzO&fxTil9j~87%K3}_-NK2@C%$H&_ z*PfqLeOB77Hei`Fd{KgLb)DwRnI@KZ?D z{o2B=*R*r=G9)HkNQ}haECT^E30y=-36`t_e{uZTCLS4;7(BbzQ%;9>^y9k5t0bU% zC;us-E=9Gr>zYDj8llx=Q$f{j7bicw;ONoUsf-PMda|gx*vC`#Q#8EkcFS|aEGD%AwsnMAN%>bmhmHxR^&aP>N2X~ zne3rTq%U|;aLa159N2;l2?D=~6#4^nFPOxb)RMm_h{m8f2&X|cvQsWn%zXJVK@zZ^ zO;!ZYvjR;fP!YZdy0`EgL7EccoEzAPp? zrKsF1FqG4zzyDa@gvk3eG7dRAWBjUP^}bZ6+z3l%OoxwF@2muGv9U{(*e?z+Kk_x% zYRcedjdL@8u=K+K*5-BkRzE8Er}HCV)w7Yko%2C8y%%?vDjxpZF8-^uB4^<0HtV(b z%;-m|&Zy4BVdu5aAorKWX5*$zKGjS|!xMK>`Qt8Mjm8^FX<@*T6$*6;!ui7^glMey ze5}fhx0KUrYga)+hgRtI=#O^(v0HYOQfcILrm_t2#D zF&{mYUg8&tMIdc^K>V;X36(&T)TfHrPtZTtYKJ(gf z%xE8hk4`Lm^R)$)A^+%8DeSjMntH=xlmqaDvj;FeE(djCRbs?-&Z065K)cxKQ%QKB_CnVCOflLDud5qh9fNDsS9sGcrCp1&nji3>=I&@iKQz*pyX5z#*Q z80t)+uB)E059V#0+)9g`0of*tJ4djsiewP#raH-c>$G50mHfQ4H^w5{(WA27fvQ8=IMpZXGjO1HbS zmu}fzS`TUa8z6iqDC9bOMCwUPm;BL260np*65!_Dtn8@7vNZs6uXn-)S!|0~%yMO< zwD8UpUv@j}66mXI19+Cf9HM^?;COmezAI&AZAMpq51KfEcnUW|Kj*iUtAX69aMp5Z zNkt_{7~9`{9J#@UNdaEA62V3Ku=`rqpC$N0_%!mhDpH@M?V_Z|E-+1h&z+2cIJ_hm z*3J;h^@4kGZnaV*NgCjo8IY+d*K{IG)63DlZbHXSv#HIb0?^S@HUzVH`tB3@K)Q}7 zEH%R1f&Adzh77igy3M*1g1l3l!0=He6D~@uibsc7DW~D(N+=hGN*&QvEMGs(OhsJ` zKF0;9D1^AV)*k&gOboo(|8vOpuSg64f-D_{>sFR48U|m;6#uaSW&FcU`1{uX0H*)z?*7J|zz7aTw%?(c9r(fo>`nMByzr0B0qFk~ z*?)zu$p03|p${x8{ChPe+ph!t|7UlMi~wNoBO4nbFxi9wm<_|o%m~~q2O%Q^6CFGI z|A6eOX29(MH~072M>b&U$Uh&q-yrqZ^Y;hc{;8tiztTbgg#VSp!^HAGt_12!fmM_Y zz`l!r;o`rX$G?0eknvf5D*^r2oDsI)o^ilG2GIWm<3EK<{w=HWPbyQOGWE~+`xlw& ze+Se5hKteZm5p5;|N0LjHl{@VAqZ4(Mi!3WMX6&rBayoemmRuOVysoU!S9QMd~w+# z7wml?d>J_*oRO?Tm}M$8j^=u6cPi!3ON$oFocq_YF7h9#zJ2a#6UCfmNF zZ?t{A(J_Wb`6{9u+zXr|hrLr*4u}a*aC#u3kYP?bD^f3(GZZvgh3%MrdP+wE3 zv;w5&hWlkk2|?Y;wWT*KhhAZ`wHJc)e+AeDFe66stoA9Zu+Q3_vjwfzYY%DbY49JI z9GE{C=H=WE3IsghEa-_oXd5a`u{JEFsWseA45&f2?Dz-Dz8MW?pW?rCD`=%QdMI1C zSZqZPIE1lGE?B;Z$EKLECrDnRcqaW7($^N*G~r6_ZO~ssLH8^WS=Tngv9H zk3~k{xi&C)EiJ|B*U@~O1Ly6!$2WKV=o5M{xkgZQ{nBWQ#LscS5{J|U-#_TeL8Js3y5Ml^t8({g>HK|T1UXy)y75jR zqjMd#P-{EVodMv|mE!wF$LZ!NJqvDX_x!AJNO)Vc!1)Pxt#5FeZ*Z4@@@RehZAdJ! zbli;<{K7j2)PWw_-t6p963`c{0SidzpkaSx{cPp%APoI9(pT{sQ(o;1j1j=dXNaf_ zkFINcZ>qR2J!i)a6$(rWFN1d|^<_~isP{3i`}F9dBzvMz=|3$ zWCm8c25Fr|UnE#?DK8YR8Dd*F9ktf5Ea;1-|MHzcMt}`Vx^!i z=ZYm?WJ5#YcqArRQnkS+1c!BI{Y0MkU1<*w9eC#x;JU2N4b6qGo97Gh9X5H8Pgc6= za7^2!(1K2WwOvIeTF8vB2a3!(vcUl2uZC8{s^N}1Bf({2!KmjrX02)ftEhrgyo;`z zvn^z!E%k>hTNcI6mXN@PLfVwTc*=CCb$ia&^`>aw_SCj_GI7=m$*;?7=!})omg=C3 z;|PWeH+4nDhuwSKTv{gvA+rzS9}}3u!z89IZ~41rKY#DewT#`wyx;SH5(pqp z5r(&kc3c3tQu}acCY+Q9IDlM+oF4udq!Z;%f^bkR0Ruu2r?;x&X_;PuY)++pMpR=M zUmKC>n~}>O)hq4xo=;S~M%*u|$HibnB4YNA%NVIE_5loYP93wob z`eeEL5p%!s06~5f%0%GkTN6x2t7dm)x!6%!_)aRwDdm;HSYzoSz)Evz8fpG3el@X* z&07V@tzjVKNlzYbSbr*6|%#i_z%b?qFvA7c&mbyH@)KWc31yVL+(+2BT< zjEnNfC>iV}@mk_70o1QSmUUy%5yPBA9`t)k6A;w5eHe|GK{(qOK+lVkS8gfG4VW!WC{D zebn#Y%=Es9YB7?xHMli_J#{D~8lr3q`h0`KMafM#FD4Wm05E7)xE%JG7Q{Gc(@}=l z#~AAcM?Au)hxc$~a(oi&y7qfnZRQDvbuIh^ra=IY?99+TRD7(cl;PwsQJPesH!_s2 zxu+a#BlxcNndIV#DKV8@;>Vo~nfcQ-vn0FNC}WD1XRDfQxLsK+%J<~MK&Mf>|%^z5(S`~X^Ta9`fSu}u&w>bsI9ATr25qv_dfZ+xAmA)5$V9JPJd)J2^@z%bH{ zK4WLR9fKjE=@VJP)Rt_-aL<(FCP7q5v&|4On*tCocP7HveX-_0p~`?rPCxC&|6!g~ za3nHJ9_)IafNq;HXH%_sj?k`Pno*5G9P^=UVP8;n92-D)spL+6N3u6eWHZcDH4}H9 z4t0t`?b~aCk^##C@fGG(W~rdF->Gd{qFI?MS^jEhMy^B&eTE+oJf^F;d~w*PkXpE* z7_8}nRyUDCJiN*YoxqG8n|V~LwSi?5ECPBrT^U5pDqTysaq+Z`6zo!eq>P~dxQu|z zbDrQ#_&s2w86I*6;q=F{^LGZ^C!t6^)Ck_XgH`TELv4i(W1h*#h_FRV**m?x3QPJ| z7N`=ZiGjP*yPP3c2GN!snTF!gxvqCAvCh-MnsJ)0?zNTn7v3RHWlRFNXk#cR!dl~p zxOGTkW|p5I1YBIJNGrcQqIC6V-)e1IAeJq|(<=eiOh9$d&=J4XQ{m`=BC0e^Q>i+O zqwB|5=iobAMTgDjQXyyn~6lZVkJ;D-_ zP0oK)?LBjJkZia-`_?ultu)6L{&VP~_6x*P1t|dIV<&gr;6H4P~0-EDgTDX`-r|L+DZNg5!aK*8U){Z$WuAT9=}v}up!@AKRx@Mb~Q;%#z*B| zYF&lp?dA0$d9dDie%-q*BQ$@ZlDM*ApITDD9kq`gC-Mq^;%Z(eY4cJ`s#61~ecfo^ z@rbvQ&Q95FA+?wo$Bcq})5vu34FN4KdOlP~f+XyL!L<;x3vy66*XW+#5AT#X5@P8X zFTlz47B@!1!e?YJ-yuW_W;d_X3)!gKs%|^XZUkvf7FdNEQv|}2p~9lOUI{u_ORAvP_VKh8pv{BHH2672eYl5?jr<4 zW3#nOo?G3t>BkQ$B?*2A@Eu&CsW?y>P7u~sIq#|V^A1pW$zriHkgxmXg*~lnG#vGb zeMi57d70)54tnjuNR^f;i&xBUhr%}l>?|gb^~146kbv1$;HUQXwBd!R6L+tpO7t5K zU39Y-NT&AozK@EH6|!xpTQruSP-OH>NU zk`XGUmC~jpiIlA*NeG3cMM#UXrbU(zS^wwGnXgAMS7t0OKTjl%&UeP~T zpT6og)^yeEmBQr_FDUD8dRlFsbA zDZ5=wJ(*{vUJ3s(?>+mx7u1BRKjYnbnqj@LWZZhM(WwKjtYo(r-Q}eTYopjDJ@mbrm7m7Kjx2b%* z8c|#!u6}63QcLUFh-QH+A+MYR=elpn&uE&w?XkqBhnT%+u4C#6bLa5oO%t0;9a6fU z1tphIKE0S#w*VXRBe_N2x=2$y`Eq>V8-cUm<%1XPeI-y?CRTP){zu3u-yq*zJGnxh zv_F#gSU}QAGak6Hxfksxj*wLh$*IV=BFJktOXd6{ zJI@@uxgqy&UByfV{0&U)aC%{k~{I=PhrBwuO4- z(^H@9_s%$eV1dfE=9}3cjLz^I&b=zoHMTPQ>VohO-#!Xdl9VQG%u~=iyvNINj`+Nj ziuqS`R`@p5yq7#;wOBr#`l`bFvUgUX)QlPu57+)Z!ksT3bd>XAVKiFPI%9YB5siDZ zoDOH7m5|)Oc-GaLhjrvJI{e>s?+gi8HN{^;Q)%OpntMWeD%qZrz5x~HHnUY*`FKhc z?da0L6BC)Y@S;96&W3roo`E4;_Olt@y?Ns`U0Y7*JvDLK+nIQKmB#z;zCF zP-&p_%0d_&xUKtJmJgGi^3z}d_5yaL_m3Ub16ng^Q1q0dO#cZSD6g1`%3$F2fsWGG zjShNhZ~yDuD``FzT#cOYHUWBKJ~>d+F4FSTu7C zzcQF8etyFeh!=3!1V#!Pk+gYurLKSZB;k8cA?!M8%t*D1NAG;Cwp@Nrd&jq#=ePo5 zbPvyv@_tyKvUL2h8Fv<0=q-x8;#}O(Di{p?L<9dVoY}GRulxkJulynQvPq%A)%lra z&Z0B!PQ!G3<~rQU32ENCac##pue=!trITmIy5<-k7`HRVYFA{5(aT+Jt2Z(PmYWrQ zO~2~?UO4bkNleP#73UT@X7bIyT<-C94i-`MCfnKY^zLh4oR;2?eY*90(a9I1tRybI zauYKs)xacpXK5E53YIr>s;c3A*vOC&VGPM+=uCfp&+3)N(_}BR0RLEiccTE;6HjJ+ zyFVwt)vfS;lf106b?B#%hGi8~#=EH(?6DD?T^U~Ts-iM+bkMD&87~WbR(dYe%u?Na zxY|ZS{N+c|t$RBKzfp&rHMfx5=CDTg;EyWH*&3&xkcF|No~;hvNser{>P zy4kawtx{X;IHGJazg(-5JN-d4CBgJ2_oU0*hs%64N=Wj;LD8yi+D?0~3(x#8?aO^* zo;J&h_j_Cl$e~G^woy$}&r&zqDjXG{fIG$Tp00WM>Y-(8o_W4|q$9MjOgF8y$z^%d zr(mAujf$JT1Z86L_Z4J$9q(AIOsb3X4$St}9opzdJ1bcg{;=l?qrTr1SMRR% zu5YrQ>})aRX+x7o=au&J<;u^eQWvKrB|H13M3rz}Sx=?w>lik_D^pN@H7}Dk+TBIF zRV7qjt#!?q(*5JTO~PBSVV_JJo%i}3@%$nw{JkZ|_qz9?E06X))e1SQFTmfRKle%c z+l5sUJ`)l{swa>8WIyB0!SOp@zFuh(>Rh1la+tmE4GGJV3rcE7MjeyY{&3DdVO{6s z3C5iqs=Ub#xm+8*`?st&G+S!(?MDiw%E7gTbC+7c$?z#wo8~UBuF1T)d_0E#P z(8@q`6|~$etCAcsyY)zu0iOQzg~&6+fW#-5toH=Dh} zev#X}N!D+zC!ccIY+~=v8UJl&iO7QpcVyiJ_O>Ni}lb!R*Qevp4 zACpVH%Eb36d+Oh={>=N)8C$6u#c9$U9C_H|>YD(Q4n^Ja+~MvAi%*&TaH-Fo zBGVC5u%_L5(~P`Fitp#Hx1P7~new|cb+T8MO}rkwJ0P>3duE=5K-27nCdDN&TNO54 zd#MnbyVxh?qO9{IAO5D-Z+Cq^@MJxoO`xk@z?w8=vwhfz+4O3snzf3-))%nd7P}S} zS{2+?`?5W4$P5Sa3a2H_n&NQ#l%?Me1tsPb#y<#h&~vEKE=rEBwDuvt9kpTe>)iC$ z>ve9wUFjX%a)|@sQ+$1;G;pI8s9;BdNj@>iJ`9OczOvt)eDm zQXhSg_lXKQccfsX{ILg{r!E;*Dz`yE%->|A#{A;FyI)K^R&fo!#I;a%oYl>VPZTy| z`!mVg{dXl~W|_8liW#P#Hb2y`*LUs4#KrZdmxdgXoksJR?3cUEiIZAA&9v*UJ}}MUVhBG2`a-y#&5jz`QDSW#j@?`64Tbq6qNjMeV$aN^Rdb);}0CWJtQRc z{q3zo){Kt4%y;~4h)=zI-u#ONQbWQsKXfTEyjEi(t;gvi-V4=3QdjUSp1I}y92=z- zNsAOkLuYfC@7Xpo@v(4jMrUx|v+NFyXU}s*1Zw@oA4hn+5{%m5-X$6@RCbhlZ-&om z%b`wfw(~%Q3CM2g8Q?+%F$$8h%uK%37brQT!}K?_RXY!uFFb*Mn<3CmyVw@}&Oanf>`3`}7r$ z_t?9gI4}= zQ+(}550j_kWJ{}q>r84j-xRk zWp>`vj>}Hf3Ao1f-iB_^Cm{1}L9^h5r+%*ixLLXjfM+-hJ z2^ABVtvB)D_~$mWW;M2l)Lw~o*|jM7-P;kybJR3;H`R@9u+!KuZtHEqm)4Vw zxRcVV-IY!o%V}lS=4%sQNIkhkTa)bkDE6Rqz{I&#Dnq1qecqEC8D+}IZO)g}T~qWl z;PZd5OXG$7hrJjz;>KmyN^!qef|SSWKepA}-_V%3yjE}3`G|rW*F!H@RQb#l z)%H{vZ6DFhwWKSnnQKIokM`jRXH6_@OvnR!pGlmGjcMK|6nr-2jLz9|TW898A3;yk3+LrVm-=#q>*~uVw4L$a&$sl8A4*2=W(czf<*i#8e|ad!O9l+ zeGH;K@cc1<6YYV(IA6pkU=!4LNusCGzj6tctfx>1#?d{2pOu(-$Z*5 zn9cl6vNlXCg#QKDE<`Rc+o@kHI)#&(YfareI9)=Ex28oqO=)_7SbYdkEI&+Z|kT3`U znd_jyZvsHP$St%(CIBRsWT)e0df_~?7BB1x0GVZr;5W2~A(Svn8^NAvkeP)HzljE! ziOTSs_+ld7o=(Ku(}{3g#v}mdymsU zfW=g*+2Q&lu)rmbJll|m086{Tx*y6a03Hp%gi=hj{-fHNV3DR`C`!ABe2NdpfzkCx zU@4On7|?afWI7mHAesQu6%g`Z*%X=*%fN#5PE!~FTR3z0M^LelMWR5w2o?K@Eix5K zF|*+MJ+RQo{X4L*ZrWnO1t|$YXFtIrkzo0oe#2J=LKYgPzYCSsuP9zg0r(RQQcQp! zl7OI8fGf~c=n4$w!GI$5wLYDayUsfj!^4C46<0WJba4J7Qlcrri_xM*5TF9{5lNW> zqy=C>0t^W$T z?H@r!p(@ZotE5rLkkdkixECm&0BR?VN`WXRW$M7#qOya981O#=3y_83eMo}!rht}+ zE~EgtllouP3CC4GKn>2(2cauWQNySYM`s}mjK4IP!Ml+K@mjP27Q-3{EHpU{jw|f9 zCmOIxlVRLZAwEnQ1P>DINgyB4U}YyI(jXHJJGO9nhyV-w+Za0)CTUTXVGk1x8CGCI zq(wzl>`8-6G-M_}z|QYp z??e(C!Q;~6KY|MU3nY-qs4%Y}RKZ+~foMjh&=kl6#MCi?Vv`kc(e+;dg@Fh|CvZgq zCI#MChRH6^U;DP@7 z&da#g(?7QU7+I`71WASl=1Nu{f*(r({8@mke)3WWBKiN!GK@H~*z#j> z1@*VO5c{Qu1NpZ&vPi(t(J+Li7?Hq7A%px!A7tJku?c**y4(k<-(PWY0PcX8C`^Oh zlm#+8g*?c-(+4ah|KaL;AGm&doyFc@k%4C-1&7Rlg&=`DkU^M0Ix1NOhGl;)WK5F~ z0NF_kwuz;GFV1d4+0uBIzJCGU5m;#wRh=S7(RDaCk2h^R(AYoxhc_ssRpwGd& zkhtzl1{SOQ`(227a9{@i3zpT7{6|dEWDt@WU}z!1{6nKbmx4$SQSbvZc=l0V^vJ542tqO&@`V9jaaeJccV>|5*tGK2C<=Lx#)>x>C13PX;|h zi89Ds_;ayXj98!(veSQwt3O2*h@xoG*ltt-c~KdCpu!Bc$ttqOAUm%9lDqe0?u4NT zEftFoL8hSy1I`6wk}}8?O;YMJLo@A#zaXsNL>5K@tRTID#DGZ#?15-)T_h=^$%n!i zWG?*Khs-WyS}*?;Dr~*tBE`k*Gc+MMpsEZs#2N^-f&_*C7?eS#!anSMGe6UoIv`j~ z`X6+P?%9b1AH@X*2wWlfC<&AwGGnm0ki82Di_AYU_7S{+L;<4%=o7eN0eceY*I+Om zm}3ED^)dD_EzJXB>kln7OdBMkC>1aivuuzg(8)*)g1=*ZijpveKX!EeX9mwsT7&>k z0zrmCg1Rs)37!OHN|Y&sO@{1X{RW30d?2Dl<_PJJpe+@!g@CPwMOvVgbz4UJu|Trv zU`(IDZ}%WJxOJP5NI`ohgFTAHNzsfrm;tgMpax>^u;TPDW@z>fBoGDts04y2fhe>x z_yDD3m^9T_v1d975uz|LQvxGF?gk2r4pxEEK_ryc1M7z_Il!?*#i)hJHa+X<8Hs+Q2l57I|c0SG_bG{egF!%1HicUYd-+Fx4i-MFFNjp>29Nb8{ZYw?;(@k6 zkD!3|j0~hS*n_`faCb#NVEsaZ$Ns?Ai}J|vUIe|B0=?OdtzUTt*l7#*rz6_JPyqGc znf`!9F)NpWhXDDUSo{G+vx6yq5b+O~JlNlR_Qhduw>NV5fYWcWa(6pIl<}<(=wB%Q-9?MV1a?nWn~C313~^# zj}fvJvba;g5W|wK*e&jTojGKBU(LDK;>&-BEuzOLVA=-L5Y!DMD`2S8e%iJN@Idzi z)jwkC7zCuSxB)UEBVmTc4Ss1v?q}5fDN6@o3Y6u36?zu7082=uVo^Bdm*!eFA*P>| zzFE@3A3Jkc;sVQD%Ob4-&9y8`5s3{f6w&mroH^ZKA#*LneszNdLe^mBS`6laz7*eU zo$|k6>G zWAl3Qc$mytL-9|QdX}cjGDA{Hpg2Qd&M(c7J;6F9V!<==Zzn+ru0rwwvOF@t4ufW7 z5D$K7c%-uQn(n$a%vi;q`1uR;P;v2q1P)3i5QdPjg65k343F5ho`O2HTS6eJ>Ci!w z{8yIt?oLC7M~KqJI}Jm<_AAR{KVbbrQ2%W?9U>aK;R4Ge1IczQV(Mvm?9cGX4%VNS zXdXDCfu+_kEsxZ0M)ga>V>fMei&ukGXa3_!kP5wr)EdI@hy-J#o05KEd8GFB?=oX< zw_%{w{Jm1c0t#6kAv&1_)UPa$090R#cCQ-8e>v5Vn3@(8+eUe(R0vcgQ}i`5K_13c#W%HXWpXFj-R8K?Lja=GB5xRg6aC^eK7;{S=?x#yf2V7h*#fsae$Hnd8(^&Uh8H$Dqpt9;zL(`!A$sid@dypMwC*fLHj;V(R|QXLm<`L;)#?8~hi zp*2%;gshR1dFW#uXT>6HmPb@bO=Ig2hbXQ_>5`W4uNT6WEYeF!POBX?YECBoSMn#Oxx8ct0jJJONoP7^)1(Nk9f~J zX*nu*wz@P6j=~Jb+BkPTS>1U}UH?$?xW?vpF{G(x*$t;7SC4C$S+H@Ko5ya~X|oC+ zt`*TAn!b=ud68qLD}A~8>Or@HN}YhM&E@akNq2tt+_EcCOm)UX|MxO_?#rw?Z=1Mt zcZ{jRs^m^qZyqDOZ-t|*#bWV28z0Eu8tuckT3FC({(PA;cf|cMIZA&1As@?q0YmRD zT9C7OhbpU)<)}+ z`VI+xoB3T9MrS@*A1JvvWa5=a`i1(u+LIDqe+sWy}nt?svma7pl_RYTe_A86SlyA447?pHz1L;z)lUNb zRRd&3(-piM`nlda-+*wxeRkzj*ULI3n@C+KvRr&2v^wt2ZDVbn z#BwefO8lF{0mqA;#qG|0=i+JC9C-BU^iSSP{Id?;cTA8!e)7&#gPNQb+FQ3_CzOny zQ#Xe2O1Y$;wdYYE8v+)N!OqPQm*3R8l=*O?IuM1F;AvOQEQrl8n)YCZJwtmtMw-H%fX&c}q?F-Cmax1iwLCP}K=&|7zX;_XM2Uf$61dW_!aCDHwU!(yMzX+$6LIQV}qp2y^Wz0!gi z%*-CV<^^WGL4DgUSv;BKH`1c$L=AsBQ6&>aX5zU$G$J>MS%*`Wj%NWw#tgGmC+vyb zAZDU5{6jPj85ch(TRL5I-O{c$k&4SC}smhz80Ox*P;{oT67{` zi_Ty+NGI~O=tQ~}ok-WB6X{xXB3+BlOxJ?6Dk5JC60(^u!XvEUi@;Hbe;JXlMF-m# z^EUw?9-M;iV*=Q-U@5bkdecS!I?!);dRURTklzJfLll$2jKu((KgidESaR9r)?TGA zadL%vqW>|d4N3DTOdoek*KRRZ;0j7<0wV`r zpcKSbWk@3EH~x>6X+iE=)Rm5psDA_$kvyObng>Kmb|()&8CqnV86;|%UB<@;_&)** z;B5M2>vL5>CTPvgduK^#5(fc2Zkh`zQ6tiLcHBB=qn=g7cMSP`#~cL5Hc zL1LmPY?fV|{SAgKFi!k#m=7}1pzHw}xGaGCAwv=hiK0O;waQ>2Q4}`o8_tZGP(fPP z-)SGLVMs%c6|i%$(q+Ir4h!lG?6{yX3BE_B1s$Io21C~G`M)q>J@%^~Jg^^d_qIvUJGBpTE+Mr#j2;0pK@2Z=82rxSbXT>rTbF=oCf z5m7@!K0_1~MMRgY5DLgBXxsU*kM3a{VKqi1<6sB3Ib$0r&!i`Sn3PXcaRMSm3RYlFF{$j zPeWyp39%orelG|R=>Io_8Y1o$xm=YY`JNT`N`)Cog*w=T$i_^2l@$W6g(4mPvjoUY zn4v=I71+apwwO5}$gWCJ86-xyCyU3-fzbJx+QUC0c_I)HIf7wsW<>&0Av}XYWt$LT z{$Y9V`WcA-gvH|=o|P|y+&y?w1CcKSnXV8kKZp>|&b0nv<~>;nV-_kv?rE@(cPCp= zKm-F>XF#?E9o&~|;fmfLcOllVUzmk0ATWq$`d6@?ITnN3#zmkIYoPmw{rQbNu|W>1kR7>HMc%`Rm2!S;`0Lr|>}21@q_ zvIfl${9;JmV$wAk*&9>_nO#V1Ix}vw8Dz8#;I8X8+z$ezaT$RG`V}h1(48m%98;M( z$n?Ut$OzMfGzeIK!~_WC6vP7s$YB6%F=b*B3IkMOn_qrTFYMUr&ba>v;eITIi-ao9 zpoL0_iZdjrI0FH>1CK-mR-bUcf0=R5%Gd$@N(tmomgGW0?!@kORACZk^Nx{vaR?+M z{L7SkVkDA4zoOD1+>e!40VQW3UU?8~u|w6(%6ls|f1=l5tYi;Dg&@HM10`ozx;zOc z7>3Fq(;hp;AI z>u<$$>}R$;zR)wMSSS|;3VlP62$35DT7BOv(Vh`C>`?uFw*5BjSM|hLG3LsUBSS?? zWD}hTiD{4)HV9{68-o31+i%5SeeyryR|LC4$~pt#3d}(aFdI{0N<@o;DMJweGU*SX zf^?t1FObF3;i;@VA|+r?;GbXx{(*N5>pk{@>c2bTSaIDn2+N{EbweU;fd+;m$oc(UvO?)r|1i~_)qzw{BpBdL?e0KG z*M`75cBs13t=OskZ&~|K&d!Rwr9v$nsA^4g9~BHTbWC{=F{W?-F~9)+(`F38R?HxP zUq@*%-TthO?-6T7o%1*GRpe89E^>--F~};+#s6-tF>(rADC*uEeOl{-l+dTy7wOr4 zmA67Ov{oux9X-#R5jR0uaEV0B_^#H-&zmhhIHzyFv9#F1ar>ue1(Q*>^)aTtIpU9x zTHRK3-xb;9c};)X_|dnUeHYD;5Aa@6|KO`jJt-l!Io|jiBgVqgDaT~n`099 zPnuC09-(on&2T8coC)t3-=ouWSKCP{tdiIEeCcdhRjHHUqigq7Ji5IlD#rEHq?JSE zupHYnr!Gdv4Re22S;ewy?&&{(Sa+i;(ijmGOp3>m(WlABLHyGC<1tWkekmu{09>=Z7~Zd0p^c6GJnPZeCIKWWLK&tk@TTc7-xd<8orJY8->+S1Dgt^UFbwa2%QyI*ox zYMoTvt4r>ypH)2MoIG5hf+KfM#5K)*hq%7UR~&DA=DYZ#h{aULy6CtWZ=y}?cg5!~ zv-^B1Ixp#)&ItQ;Uku)rZx5rbJ~ZZni^zB1y`i}{#$(}LUx=zowJ3Hw>>qd3&@<|>nY6T$0rqr5c-ORj-=e2|lzcWjQ_?i*3Mslla4z55I@QQ*llqaR z=1*5NMm_y;HiKS}I4N3e#v$|S9iC$L0xVH|IO^>*G5rwiwv%wl+F(c^}@NHQ=N%|e5@d2e49=3SS0J;mVo-lvn~qRbXe z)4Fmv(LDFP-eMk!``fieV<{UKEEL?SP;}p|-0JbF3HBlj_!$1Nj-M8PQCF5bS!b)h zFqk_+iL2|vl5nmwvRnA6O3syAGfS~WI~GkoeKC&TU0&kz_1F60dk%YZKjB%-V^FKK zrpQHWd64egxW^oUSM=mgwq!Pm@T{OhOs`E@s*hf`Z#mW^l67po=oO{8 zd$_{q$pl$)F6_(@KE#=7IokAi)(F#)57nP=*&g9|XpkmWZT*54eHV=G5ooZq_V+B>5S%5^If6iVcThsJ;B zpnYk%Jol2^@VC2e#Tyw#NzY582{MknNR#?>+?R6&wP?Zdal>6cIHFu zjmzp)H#wEB`6|)&B2Rd_<_=2Kdb{@uUJdq7_{5`1yh-*W%sy>AKl`4m-M2kAJ+s1u zq77Ef7U%tNa8&q_YTM^i8{bE&jNIurtSa(AnX91xM_1Ak?$v8lJ(aLC-gT!ewC|J@%qFEVhf;Z$#&a=RpiI%D`H z>gb3C3r>vi8xq;*CO(=sSs*XTD3gP0uda%~oB8&04^QuSdS$zUp1g<-H$`-Dw1N41 z-$|>+OiMB6o^17Ecu3Nv9WRf6#mFX6jF?aE;d|e@`p?}m&0*e&WfG2}GUh6$xlfLq z($y?V9?oxjCo!wbcl?Dz2KOZc_D4?KtGjnsaGFA~tw7zRt{AR6JBM?L%kAlP``cw1Ok};(WG;n3`ne@B2NWltQJmc7po?LO zPyBq9_Ru9tA6MPHE)q3dlQK*0^g7q)%fyG-bO=;vXgUi%|5A`Dvq7ZDDS7ew%6XD? zeo6jPm3IHc3jeY=RHx z?8vAvpK#w%t4XSc#4DR&uNHns?BmQGKIxdlshYzxmA80VZt=`Xyl1~JZqY^e4?Bvs z6jX=Ltzk^5%iev+kbgu$l)as>CSUE{>C;T6-o18Z>&+{X*=Lq;d=PR-2;M5FQ1L`4 z#MEEi_{+(;dOxgR7UkA(d)*nYtF~KN!8ZNt+b@#R3!jHq@gG>VaulN?{qo`|k~cI& z+bzF*#WwQ0N2>j z()`FdLG^YgHs9&}vZ-DAdJm;a1nL>Ccjx+USGE$>%90=L`s&AnYxf>pt-ZwFO0Eyx!H<_>Tr5XZVp&tzT*aTuuZcktUbmo+OZe!Dws8$IsL ziW>i~^Uw?h<`gQHuh1|1sQqEhu?hEbu5#XlCNAcl1By%a*dBoW}#?v#ZS7(HX zo?3c4T`xH8{r#(6CVS>_j@16*c+TREee)(y@2PTpS}Ezg+@sc2=|AwmZ0`DwFA`1Y z9O^Z6U9_y7*W|U)Mf*#*$8K6?=Th-v{a5~q>&`PSd=KQ)I8_@jQoUZteCf@z@fmX; z2FoOlxvf66@bN_<+GXXg{XwL_*pU~x_hrv}&vEj(RH@$#YU~(|xy7=swVUjUL_SKD z`Gve#=chHqxkgnqAaU5ybJ6X)tTCG#KE>{DrbmB@Or@mX8S>>(>6YRs#hRxk^KZF- zy**b(@em*FlosZ#_R>h`-J4Yw2`C5mibHR)jke5*|lusUhNExS=q1Zv<}a0 z54ZlfkZ#z<8yHad$SN=2UsEhmN}xPyPu2X!OV{out*bT3HX33T(&%wR(YayKP4{i* z&9>cZbAD=&U-6-v}lQ{tGzw63%Bb8 zyWC2*|4N}XoEts6rse49G83s68U@dc6}FnR3#pE?xX@2HZa;~6gq69yKD8bKw@-6uDLrOBgGL$Hy@pu;$bAg3%zk7;)qlbi6)cHVu*Y|U1y*7xq1Fu+7{3Rw{je2?U_hnK zpQ>kf5B?{x$V$j`2+@ofXz66|uOY7_6e^O1^$Ebg_9t#XCYAqJY+;CUf2!$ZFdo8S zps}DrX=vbC{v}jwPId;q?8UF4`mG2YGL;NfG^jtpqCv3_umb%WtiC1`q;*kF6rTI>NAvwk4TXZ=?skHA6c0aPf%s*F|z0I(o44x&H7vjxU} zcEc1aG^ii2dK!WLY9wMtsDuR>ayOwgEJUS30T~zp(5a|+I%GEt3>Bqs7B6%5_`^N~ z=STlBI6zYr2!f{qXQx0FATn}m0mr98sGicGYdWxlHJEi6bNHkBfjDi!^oeR%gQI~- zTfi`Y!=tJ|e}pYOMDHJEro!tXMTP?LmUKuMp+W2f4cTMC&818lBr1TS)YtjPoa+Cu z69?!+60j)-3`8_rGw_8cAgl`pA_eTj48j@Gzw?j6X7wanzAdmDQln#?C8rl$O)AuV8 zuN?G2SXKq+>-d9Mk4kr_P|)B{qKOl@3fn7tSswa950rle_R|lnWb7B@gA%+z0b+Y2 zWTFiUDkSQ_2w^84rnQ6BAq%$|ZgqfMA-0v-d#>5uV=?yMtNB2o+zvGzTFZ%@nEb(a zbG>+CabsXV=9+%$J@qx$04V}__AuATGMK9a{?b~*fGG*tRzST*8LsxSMqub6tSiJq zgT1UH_%#+<{z{@ZqCi+7ii1(XAh;ie>p&bk4UmY(T+s&6GuZMf891c>8LB>k6(G5z zG;0X<1-Su2u3+GyWigQrhcQ@{hq8?XmlvWz3+n)~_%JMt!Sd-#n=N+_ymJ)&)R2|oj0h!Pzc zp;SIP1om`aA-_zAgilE_5E>K=45ex6)u-gV2UQ3&Eif&j)&aQ@5s@yB~*V1=;W3=RwlghljX^ksCg!t~rokTD5$xTPcniz}z#?)Ypbte@M$ICuqYa&B9itWp+>|kR z0NnuHhBgM;;9>MiGSs3#*AUET>;EI5%TO1w8bC!o;Gu5%f@B`RD$Z}IDB%H2X!w7` zd*Q>Ox&rJV83^QBw*NG+x&bKo|DIQYhR}JioB%1Hg+*BZK|6v4PVxVAWGH}ThS7hN zqYd{k|MzGUwT$>LehSrV>AAtzLO>|`XtaY8BmgM$e^0PbiFu$;w*TNY0pQsGLplS3 zh1h{b7phBu%LvpDSq516(FPUD;8lbFXTWRKf3WR?`3cYo z`2*-26VFWC5~n~YMpp*?rG$3|WV!;bm`yNS9q2y^)JKF}kgf5)!5?S6feA^!znE_z z&__UtMg`Fx`ghVDg0bd zB=)3C#Ab=HiuW?}J{(&hW?}eL0>ic^n9P?#z$w`Kuj=I;{TPI$N^bi8Hx`;W+BQ{gNG+egMmkp}~o>AejGfwqKa-wV zeZxcp`o%nt52hZ(NJ#knM$F6o5@V0s2@^j*Sh^7RVE)JOj=*uoe4fc%na38244KAa={Kpbh`k&u{`j9ZtkBrg-Q{9>qi&Bs2EZ#;-%z1rkWmF%_gP){9_F0A2ii0lJQ^p;xf(M|;#h>zST= zoc?>BK*y*Nw4p{=8#=E7F9xb%Zb;liu?xg+Tp%U{W@H-$l^y?j1Ry$Q-OJkJ@1!Y1 zbu*$7{6-`RB54|-2DvxTm%$z?(Bjauz79Q%Uc%b<{5o`uHgp~BQTzDI;2G8)waIKB z<{wrg2uk!2+VGdc1Bkohaw@JRpib!q0YF5`KzEbyo%lR}PN17$s_xaJ#CQFq8t4^f zVjt*eJz)F)JqG*JKrduo8Tk4@&;8MPSjToi0RE_<|JY8y^iRCFM^_O>SLi8%I#~l8 zkw2m`)Z=I)2n4T1h_2zp1n1E`J;yZb81T=01S*?#4_K&I(v6gX1~?5~@jC;&KO`bx z&<1UQ{R0|88-f%qkc*E;7z#ZHE&6J79&PxS0^#HL!58+_h*|fs20y|8>p3(YSjXr* zYKKgR@rMo|)dyuwI33=^oJNIdp+}0&yq!fxev8k7$oK3QtjBWTOZ0o6(Ib@B*CWz%haX z-OSuWVTGR`#sUth>8uyhK@Ubt*x}cpmr!%)9NOcI37td0F#+sBvfX+o8_7cFBD|p{ z@b@!YgQ9T&7K;g@i|D4F-`De)b)7|mAmMf+7yoWVxA+@~J^lgk3f2R}qy+RweC@CH zti}+W-5Wfs0tRS=OcuSej&a%}$O9oCwU0;z-PcWvi2k~7MDzh&+p{73Q&5YnR$1ST z_Q2h9(2s)KXAZ$m_;Y(Hx4p_3N;QJG~T0wyLB;E z+h~tA{86IG!H&_r82$hR|3N83<^~Uf%^2z7KY0M_>wBUKe-MB|_o27oj0#~2TE$Ta z`(Dq%HFO@~p4GN83G{E&5NpHv05paQM0A5rpcehcUkZEt81BLEgX?I|LTUGNa38A+ zx}Sr45l}3Q($M&)pnwW|OfgZwq;nPssEO`jkJ|1&fxe>qN8iDLF5rv+p6F%-%y#fs z5&{CUzoB*rDk46O^$7?n)+^Dn43MYDL<@8ldI5e8_BbaX&fzacix{&^!FZuv+yaHZ zyypfl#(I%I3r%>xA>NMOfgbv!K4tNCCX2xd3%-lhHliW)P0YP66QAe@+R#m`8_^!I zSk^Vx9v{rm0Qyik*W*KJr$|eAMv9UlSchMcS;rm7LWM*-bv$aQ*iayAs>-S32e~F= z=TBO!7F+wWdD*N{$D%kVgzl?3u~qnTD38QOo_)c0Ptu#InPb1Z8C1KaJPxRSBP~qUzj5pH|BNq@&JANV^U&6tax|W@o|aCjn?;}Q@f0|`zfAqkC|%1R>EUbc}6&ieW-AV_t+y{`b6r9sp|+$ zBRxlzQJPin*S8c6eRbzYmt={P!8mTt`<=6M=V^D{@D#`z&aKoH7CvfY_UCB1z(|Iy zEMu}j+SD~Zp@RAMIl1@DHsid*5nw97NR=`lzRz?!)~V2xmM+50F=WR4mDtS)NhzM4 zyb?RM%Z?bD+SJzYly2rdL1#+FyYji~b02eZm*l^ExuU?p?R!;rm%rT1;f}n!V!1f0 z)i^mhWYj%ng=A8z-iJ~jr*<7rb4*zwvT^88jy;%8yuJc~cInrm^a@d^~_*fhBq}KZDec@v~ z`I7Bz;s+T^6{5Ogzo+roZs6rqna$PGdDHyEAtkO6!WEt8=3~Qxx+1kklYA;`xk^8j z^PawMYB_H8I-jjmmn#IDYKiV&Na|GV#I>sUHv7+XJ2Z!Dd*D@ZvX>Uggd90|vu!}QL zyV?6=)Q+V-H4$)tMeT&6&t1o4FWr4OM=sIk-N;LK3(>**k(b(hUDX-E_DhG&Ol`v=RIHVbb%`_pIkN)M~gGrC_} zuG*E+)v4QY)8nIUy->Yegpt};5%Di6BF69Di}3Du9h$OD3Ja^0@!7R-7=o(Rlo& zNsUL>tI2L$nAv8bi3w>@B!+#99$z-Jb8>4fSJ?u=@?oBPg0a;jG$kq=qWMaX`U{BF zKRVk*5*HTfNM9kVp3u;-E`_h6b^m@h9|x-p>`4cY=6lysZo{_Qjg|O#)J#K=)5)td zmb3I^PRBiUhn6qfcgB09bvg_wP5vU|WB2Im(JzOlwC?B0ct0&H6N59)8x-4LHdvGn z(MaIw`Xa+$AK!5*GS#P9jC%*~8q-`iueCnhZwk3@8yhTMmJl0#xK2aQP3+^+b>chR z4A=TthK!64_nKVI&mVCyZHHrGy=w~>Jxbc}mZp1&L38E3PZQdg>V(hEyB)P|&4c{5 zbJ1DNc^m8! zQ8B|C9?bjjaOJUEYc$ep3@Zb_iW}Oxo7!(#G=J8Yx8Ax7=ZddBsT*{Bt?eRgU*b16 zbG|~?A%f~#YP!NXcO2o$`>tBIQd@SH`ImVA4eD_pzOLq7>QZ07=f;g0b;a8q)5|5& zLMYPaD_>rjk~ZG(cIV>}>n+dJY`oGgfBq_On9PzhKdcXGsr|UAX;)``0%?IOZ; zxu=U3AJMs07{oD;(#nx7VDFfH;=^;7r_=MwuJYZ#dnjf_=eT+G$^JBnY2SAqcxvI2 z_Ck1#|6W_jJ5u)ZnJI3#} z9v&4h>Jqa#vh|67+V=0al$$AMK8kG(+i-Mjkix-JnKvkLG7Teh^NwvjAm_yy7E?vt z5E55&bDYclmj|)OZ`W(32kFE-T9H|OWBJ|fMr#D;)w+Ne1p{cp|o_+nZ=A(_3mg*AI)7yiJb?>HJ&goj>==N;$ zg(>&f&wTjgMn`rNk7BX&F6TGf+lnUK+#`P^r6aL4yp1YU8};QNX7O0$V43{n^7ze7 z5A(_6Id*6rvsG64Fh!r?7IurYAmWQ3*|f#>vA&;0a_7C>;YKFsQgWYcSeRM2adx3+ z`-V1oo&3!*&o*JCH}mvA$-bPo@$l{=<(po8o;bBosC3h3z4M|SdzW<-EGeOrR+Zhq zaC%~!bhV{_+41^!vG2qqpI~v(&o#os-^}~2FB9lJG3!d^Qo$1(XX36HEOjNv+pN6s zb+X8vsU^1!d2@XaoeVM89CKx>%<#LTc>P=bm+w^FSsydkFZb2KsLVjM*shZu8w3r1 z==0JnKHv3B9h-eBGEHe;T+5Xj!?tfi*AFiD`|Oyx`OftrRXiWU${h1U4Rq+3m4?PU zg~XtnKK9`^7SH1mZ zcrrWW!o}wo78o4ZQ!_DRbU|bOs}-^j$|5Zjyp%=nA9z{nrka07FLX;6@0F$orR}-- zAr*?(N1n1BT2^BaLlat=v?F$`YTUuMH@3f!7wXvg;>^d@<70gFeH!TLvqR0UocKIV z<;5B-dd;QPD+=`PO}<%luF1&TZn^PW_lVnTp3FCzR5Po*b#Z&a$x)8Cm5Q&fZ4|vR zf1#H)*Cno2zHbVpqYf$t$B8WDKWt*v{QA_@YJN)K`-;~(2QNM~sCaqZ_bz|tqN`47 z#_?NosYmzmEERQ}kZYmRY@M3-o~$a{Op$u&5VP=y117Mu^SMOWmvK7#o~$%KoVfVg z#pS!JR_`z@YF3|2e=o9swX$JR(RhU;6R)hY-WYv)|MGdEPip*~H??@|CBNSVghlz%^GL>3|B&F@Gb1J4R+-3e^j15yS9Z;Yyn|a#KR-YB z%i4wzmo)RmT#j;Pn9Li`MT!eXb+&5Hxg;o4A8MsBVI*bJ)5GWAgv<;Vc>Hy|cXi|G zPobd_)S`n^-j&{;`QRL{ZTpP4$5*FL)T_O5e(bt?Q47qMy>pxv5T1M}ZrT+4PZFO` zo@K}^JL<3aBGHo9IWxwQ_Bws~#fV22mVMn!UM=!yhl0)3(JJ|CwzZGLf`lBZ{rGO( z+MpyR#eG_PhU9fY*Qtl|eVm3UMA77JL%Su%UdiD z?atdXt??;;hKGaK-tuJy7rb7JiDM;sZ^kFu>Fkqfy1REAx7PKW?ix1F_xv!vG&{G! za>wcAy50$CmM_v=-^*^TGo4gW=X>&_ztnkkJt>oE(w`zBCwfriEnck=k zUrAfa!Z}{oZh2_pH{Cu{dc{MdriHgQ&eE(@@r_=8Q|ZgcMPkucbL2%v?-x{C?iaXH z#TA7D16va;BFb@w9%bPQ+u*xSb}F1}Yt;;05YSqsx2+I4c3EXrLy^_Y*_c#z{u>L6 z1N@&BR1MRKJX?Bh^@tOpVh&r@>~p&ibB^Onk@E-fQS+_+v_A&B)-UI};ME4pj#+12 z4q7$ib@j60#_dBIC{5}7COJ#yMc;k4&B8XgLvqDF#V;ZvZefdTl#Vo3uimF~C2sbG zeSWIt3f_+&p1l+K%AA&d)wjYxPf-v1aINJ=!jFqBUev4#~7@2ORVjDkr|^sHaxlW#KCEEiajyE=&ZY+&sI%wHc;}vG^s(idQ%NO z(jfWS>?IM?Bm6FPR2Ls;{B-A8`C*gtti2fqac+?Yn>V@_@g8qqJVVmo>-q;N+Z&2f z=I_W!_xuk;epu>qh->R~S^tBz8j=@$^K(8&etJ89`oyM`&()J}&popJY@A?qXJ~e& z$jvX|5pCC#u-jc5-iNIn_i#v2=p6bj2M(7-^}8}cJ6Y$bhNL(%Dwnib2sNE zk0X^P&9(DN5?bQnw#zI2cA&*)*Vh?eu@_oD>OLfWDm0%e8;O-z@~$e_H2&io{-ixw zvzD(=U2)%fYiEZ1+U+qNr`GeQpIUi$lF#*sTheE2<(q@&x>V#XJrY^DYxH)7;(EP% zBsraw$!8<49XVH<-%g&CcMKb`hJ43yS4vf}QDIit!yKi>($mJg5(r+q;+*ccuIx!Q zk2+pl)!i}YdSm-Ku?F*2EKyk{)=#D@CnR$}PvnFsZdt7m=@G+sU-!7^=@1kZrE$c=lHIyfo2ScOP|>`jIu1+Hs9E=7eH~Rje_&^%nq6zKjsm)ro?PWNb#E*fpC4RhudqH zD@MGM7V1ngD}S~xXZr=K>vNLNOj5yauMyi^F{10B#zei=goKB$*QnpnbI0&MYWLjWalBcRWI}GA-$-NMXjTDFPX64H`;&I z^9c$jZ?tGr&2tJf4yF#P-felpy6M>IZ_-}UhF1l5+z7B z!w%4@lIrI?3M_p2XveL+%eMJ;o-%!0SGaGq&Z_H}QOF$H(8jcnBJHaeD+PHf#u{B7 zr~4$U_8g_gtVx3OIP|R6hRZKr@Vv48MnEJZ}WNZrtnzun1p** zmz)f(H=`di*>v`yiSHY7+8NvS2M?*Y9=SaCwY<{th4Xm&sq9%8--gVN?Jn7>W??cK zSBf@-N9B53V5;J0=>NyrbHGKhJ8ePiy^944A}SnrT;Xi=CPkVQ5%GYdH>rx^+7%l` zrHEYt8}clOih`n|U~i}hC}IJnSOEd`o9ym!yL;&Wz3=`0-zPVlOeQmvnMpE9UIrX0 zDBP7+J#A27ZcEPUk>wrD*#R-P2A`Pkan@~1-sRfycjsJm+7i_%_fhb@c}L1FKHp%X z+<0%R?aZdpZ%iJ38C`tzp;kBVgi&>= zVRwJIjjyqnuGpuBLqj^nZyQ-NBs7E--cRFlfS=8e?OV%lhHO*tu>EK^b&K%Ajm}u! zo(`3pZ!U~1HmDn1_Otlb>}vb7lfKN3`FwkOtme|Cjp-DyHb*yEb6^bTSWDV@ww~^nbzfI^ z>GR~;xdSC8F*ymjMMu_k?QIgXUrTi4;e?rsLywHQrM)b6uWsa?=+y@!Kk-UR#t+gN z*JbXB(^XzG((3K&3%V$F{%k+trp3Cr*Oen<)=qJW!%XDGk46iz{AY8udljxSJT@-nUZ1pWzGs|uALv=-EIGPE`PCjh+ifrU4!cn_OnK?Y`*%YPX0kYw zyLTRbFH(2Qsxgixm*%JxM9k`Kb~C4bx$~G&<&H1Q3YV%0e(1&>)WE_G1cSpvo{V$q z64p04!D;-o%pAQ=N|A|UF{Q72HKsoaY%cU2>NPN8tY>HOt(CzWj@HfoYWQ$KL2UGX zOi;VM;-z6oE4Q%2R|m5ezWtV;i;cX^r!U(wspI%LC6}FssQ(_Z(B$AN%OByEr8yO% zm%R&|b{D?Y{KN`f`ShRU{=%bJbF=!_c_*(LU-SF2wm#73$Wg5)%THbXxv+=-uALcH zu7wGkPJc>U>G2_HV~@b=no|PmN!>e% z+CHk>v*p*OSsfTZXg9~B{`#Gt2~pD)YXvPBG`e(LPfmpeRFX*jb@&0{Iy+8>BH`&#jh)6Ieq`KWz;>hq>L5sIwqB- zICscN_0@`Fl@C0!ZG9hwFxQJUJ4{#m-70YFn%<##?W+!AkJ9DiUH`rkI@ReIk zSDH+(Pjc%$cjU#iflsa;N}to^o7@ZwUW8rU2n-vhKIHL($C=Yi(znjG4^MaAcvACu z(gDLaMrqSVeoo8#t>QcUi-Ex%uMG8j$~r}AG0$TgyMo+aJ942pnI@x@kKm@`ik^9J}MK?T@cN$|^V% zzH#e{_olvM!2Zfj_^ftaxpYK&?w#ew79JU8V3@k3&Y^Va^7BP+7EU~s&i=Ms6or*u zi(cR#6vZuix_LrCI+cj8p{sOHn>u<$^XNzOq)>^Nea)3YCBHa`*C&A=Q}ae z!XlLCg&im}iW$B;c1zKK7nScDc4Q5>RF!ABc=D;KJ}__0io%9{ztd%8TG64gD*l5v zsDv178`9jT%kDkT>eAixHwN|>edx2_eVI<;LA5nnH|K=T(`t%(v8HOq-Jk)%eTt2? zDr*et^fp8O^W830>@LrpzOY_hR?it<{Kl_n{fHV+GwY{~ui8F|0&+PY&_moYzmb}L`MKHqfyqOgPcGfS`Clk3vB73=cI zz&>2-Xvnf8?~15F;s0>>4Z>M^$K2Kgj~C~RELX6yjyH^K{*>%&@NV;_XNNzW-@CQ; zpV}2S2A;OK=r_Utr1{j!I+Mo`lClj71-3M_^2$r zd8y$}YPIDO?7-Br0e9~f&mB?q(7HyHIkG(ZO8M5x&(p4aKDoyuwS48?wKMMA+*ML@ zVOho9hdWL@F51^Esl$7lvBOPO+-{j9W%iq1AKp7Rl&!b(imie0;Xg;JrYa=)C*J!N zS-HkoXb>8B%jd|hafN%PJ!#w>>oG8M=AExTpEEKB`CUwY-fhrSY(@sl>iCN8Cv@-l zdarG`wsr8dH_Zc6XDPF9t-V~|KPIcQvE#_Hfm71o=eL+%&I_7ovdl2*uy5E&%QrR2 zky$5KT8ufm!>jaG=GiIVtnb(i7GImpS@U{#_tnw*Pd~ckMqckXE9#v6{Q{3ANk;nP zAII{FGyJOy4%dBi^*I0OediRccgeAh#l{2OR;fk2jp%ai-3O(jlKFl0-rb9g+Os!u zO{j03ICIjmfF9fS9WjVWoHqFNhkI@(7h|C@o$lK_imUf*Q2l(&>R4mc*2mn1JMOaO zJ>JLoZdv2!yG~(hZO}CL=-L=3!{#L~b%KVytp8O1fuEAnGRnB(p!%E-LBA*Wyoj|5 z8y7cOU0WID`rQ1gM#7AIh4?8$fA)2;@4oc-KC^}?=E91kNlPpH8%(}8q3gUQS6%u= z)(mf1qPr|+Lssw=@Rn^r7sv~8Na=kZRWbyP7SQVY_bf^o!#J4kvYc1izaT{n+BWZJyf~ zr`A!YZ?1nm@26%VXT;B-JH7VroT8#SzDKdYd9Uv)3T7@d3l(0{&d%qoF37*PBrRdU zq0-=wiL%ZK&aWB023y;-8nZmFr?Hx|9W&$aw+^M2T+Zre|9e#lSbeLL|= z`%zQLYJGVuZSa;+2{(hsyBLrDu|qUAwC89)Mf;wWC$&2&e2p``ydc~7m|^*}`oZH> zdyAA#$Nrk#=iuH9#S=@uhwq%-;d;%*Wiz(^EIGkaGPz_hE_Cvo4;^+wDF^SqTYeB~**myHL?g2UHaCBi)`>-WT-9T1__ zA}aa4Hlj6b#jFKpnLb_{#PNglu!i$bM_f(XZu9%l%ZKB_hHOm@oS&C5FZ=Mi=nZcU z$9Q(+y)Qp@x8T5jy$5OQL$RS(M=0;lW&M=HO1?ia+TyWasU~k@_Xpb!9C zJ9f{yzWCSL;@wlK=bDSh9ILzD<#A7*uJ2nb?}R?yH~ohF+Qd8eN;wa#{LVGqcU_z_ zSAJmk^em&%>TkPs3NfpW&-;A)MDU0YL0>;^VXYY-eQ=)R8++GI@3xtxO~1O*15=uJ za>mEaZ^bij?e&=)wP;iAWxtfL(Uqp|hdOC(J2CD|p!1!kb%Jp|;qIm(uMULW;V*8j zs2y_c+|V&%tAl}hW3vjz^f~U3lXQFhtNw%bRi&1)2lpAe{ij*o{3b(1%xhZmg$UJ< z(v5|;ydO_IvnpGC0`F&9T7*#D=k$Ai_o&%ehR}T0Z115}G2ERGmQ~NUG8nY-!u$lg zxlSXw;r1;WqMgkPE?t{*JD|saK4$rAddZ*vw)4=K;V!v{)3~4i@jtk=^z2}D_Ai5@ zC2MX}rWUHyKkKKWKDOJ5?(2ui`%fx*!4cjW!;8xBU+A|#aa7r@s}T>Ej&kb9O$)WC zAI;vxO2Edu&KkbS|3SH};RWS@uDLb0f5h)xvbEG?M%>k?u+}4U?J95F4-x$ODt~ZJ zcHGfn(Pw_~7Iijwv;CfFc7tI;UIxplnf0u6yZJ7wVA1yF$_H#3{g*y9o!$3=|EZy_ zU1JaA?!EN0bT2=XqPqJN&iJAkQoe`_;(jr-w|lP`#r3xO&a; z1A4vsPu9F&m;HS8s$Yve7MiRKdROF=7@wUrpt#9n&Ur4+F~>8#R;0^HTEKcW>4rkU zfo~@`C$erdqX7MgN$V8^&4>_xQRE=0uMF z8gwWm^5yG`o%h}7m{aajP_?6KliSw8^MAWeY><29sU7ekx;l_sQ?N>3sGn=4@Mc7W z{Vs)vVIM1-w2k^t*r!sfw2`Oy?fb3F$|GNTPoMr+Z|I1!c@q=r!bcl?!#bzO+C(i8 z*7-S}PCnt5>ZxS9=%`)m+i=^KV7}GGITuGSbGr0EKa%tGthREj9qSbW>(PTx~Ql7<}qay9Unz1p6oNk=jap4Y80F;oopXwBpglEauz675S!%*x-A>(`)+Z+j zo^!B!_da;y&b0N`2KEz=W#;>Bio5sa=DppYViZ!oUl=@^ zc8BJz*2OxZV=gRG3fv_e;+~RKc|THJ&h7iSV^?F-ZYRcWc^PEjG$Crg#reg>D_t@( zUBz;(?80Tgs((6 zb+pzkug*MqS6gtgrNCT%K6l&u;rqeaX(yIx=RZl#KXGalcDwhyT^3$hE~4FQ zoFY5T%gnPkeSONL--xWf;|{8S-=R>qB7Mkitt#=d*lF0C+M_L>4!yIzQ*$_Z#p{Gd zn;!}vI&IxLYvm_f!^_*_cZjNUM(;DWytsSB(g6L|)E92Q;_@F?&Cy`pYaHhqXTQs4 z(4!fdxv%yYb+KWYd~}x+toeW?Cx?z)kb0rJVUfYYE(KmQ2W%f_Uzj~1tL{tjhu$5d zCT~=!*IFr>JN!q6gGE`fcdSt5l45IkAH{@kySv|b6Z=NR(&u`d`^a~9LX@sp)s!q; zwl(6tS;VwYYmdAiE!7H{(6G95%Io7n?49?%r{M{C>c{?JKC%8+>yG0uds6m z*T-ran)Hu}lz-XdVC&Y>IS}^4%(%Kc&p_$^OsykkS|w(m_vLlxW#kN~J?-~q*n*hw zn*8Thul%rwD~@Cx@Zk0G9M$5Q5&4pR!CXA}MVh}>tzPY+o4lUG_Z~LdVw3U0w^L!5 zrc;L8pvC#m&ql0R8tZxK$spo?@2yd;ae8OKqLcOxSRy;t9(B0OuuN7)A?h~g=rBJPb^b*`1)WkwqV5fnFc1w1MHsJe{@JOO=|wo zHS+kl*xMhnPHoaxNI6ni6E|hhaJgl%r#8g+ZRo31Iw!0A_~YYoE)JIiYThi}{yWwfOQQ@@%k$mFNTe}}UNKrWWW2wEnvEewrX-UK_H-mV+Bi|pEFJBrrdUo14 z!J^OlHoH=kl><#3yf@lls>^w~)B5hn_So92r8q+^4W&bdga(U6{_q#^rl%$(5lU}* zATHEE7cl6HL)?PBgF*v?d$7=N3z0uuHR$N*U~XkH#U#KjFd!t*PZTPGuYMxW5JfIg zOjkE>v7(bITTzt_*C@ez7mz-Q-=q=ZCWaeK;P_k*mYyicSnTbIdBJavpa%;zg+4+R zjUFtMP?4Xvn@)hIpIA{H9wrGD``bai9xMk`3F>fp@I%i_6l^07Rh-1qVd=8;So$mj zmLbaszanoo%Zz2tvS7_&S+cBH)+`&AEo&~zj%CksU^%kpu|zCama8ZjW4Q*4+knEzmD80RF$fzli0|60`88SspA8?{G281FocHd9u7%UQ2?!!~raC zmJiF9<;U`81+W6V1H`O=Fn?EZaEP~O04tCc2!J3~kSJIjfVYJI1?@opSwZ4p??89f zBG#g?z)-Qfs~;}0$qHeGh{FMOi1%VvC@a(}SS)6RMg+3LSYZL~fZ8oESj-A% zMX(mLmarmOk>cP$wSd47KT(L63LyzYZ(yJ%WTd0ZRiuw8YqmWfo~SuTzIVF!rY_?# zP1HRJP?o65K`ts6;cC0nD9ei zjFIw(ONjm;e=ev=oBTD{RQZbnJSlQ?_4Z^*A-FUVsEzx&j34+XjF1eiAp9V!;Yix* zNq$j3wpEn0=gA5dxqG{b{GggAE7aT1T^!-<4gwP|4n;!{BSLz^DWdnd1rUK3%#Y7AxPq00q;$W7aI3z@({Ou?$I#NR81-~O3F=J5n z@>^XDMgcRZS4aIXeYKfmV{2^%%&`6wFW{mOk{56rEgTK~J1_LHHiO0F1?Vqnu!Mi) z1VvlvR!6)jOynn3RpKvPrC33JVIfj|84UV@ztm3SQKF7Xmx0+&tGakA0E4JE|NJio z*_oS~**OA(Y;69-A!rWgkPvQ26Y%iM4BJ;0#1Va$|IHu)ID)nj%|!~=X3-Z(dx|=W zj(E^I%EwdO2W8vK$?H#quKpJXW};_kq^pm*>iDOw!bKLUxaoqs2*GqwyccN3|8rm< zqu18kzu7OQ@nVUBg99T7B@l(c(D4rO^%sSDAqR&3&m9Awfiz0o=Ea~4@?ik*2d~N^ zhn#;C%@V0RD^4}}3zJY(-u|v(AvU4_ zGgaL{Klk?47y^FOWw@Y29qtw)uR5T*q)5z10fO*!`U=4Ae4xu;TSx_6A5t3HYjoOR{7p? za6bhctb#LEay+5BCh^K!m`&LH?M^vL6H+J06?RM=o-|z7TI`jYqBEiEuwfo6hP!rv zPlMDubnIUpA0Jc|-={i$fZQRc=uLZ;-aY?P`10o^?BdeQ?={NB3sMrDo_09wwf^kN zV+X7p6deXl=y~7p+_S|CdmXphsU3B0b=Oy&wx3CR^OmQ-FzyrfVCb6o=~(HAP1*;y zXPg{*asR=t+P6wZb?DgfvZ7<`nd1|hTze1rt^tPqjUSBI$Q{vS~@CP+u5?n z%c<{B%^tq5Dn4w~zg+vRV%VAWIjSSa_xvZXs^;a~juq8d< z?xZtAiyB@2nb}F)xOBqwzV__#gYxfmKC!|$98?C+qakYz)zOhEw3FMn82B)+4u^J-?!Ot zfZB!uJnz$*?@yT=syEe|V^v%md~vS3#c>0(Va?mkm73EMPxm@ww|(=Tv1|4i&s_CA z$1C~b*{M&4oY(%%Kb-vCanP+>X9g?HPidYQ@oVMqdezj?k*h7a+q7=<_xq8O(nm$X zbGhNzwRf}o>m(o3TE!2292fJ=-DLf=58E*v3mp-Q^)lnPdeCibX!wt-je6_y=S3c? zh#N8~>(Fn@!y}Z=hTd9tXKG`bpYxoVZ`QljUYZ`ZruVqyIpv>N^&7)nW~J2j8*yNq zI2tQpn;Trse>il~k?L`R0Mok(+}5+H;oAFF&yMVMc*CiAr&StWFX2>fOKE;LZPWUR z$t5+d*c+?4fBgecsvf|f2AJRn&pC`plN*&@fzGA|`CX3~#OE-3`aIyc!Roc4Cm$$?1{Jn)= zuiWiCYe4_9*40B^S{1L|rmHgi%)9BWo3)$IUnn`u_c?SC(;nEL{h&jaU~hxq*GJ>{ zWk*K860fejGtc|i<%g?dC(eGnQrOZv=H1BLE#F(}mV9|P>PEBh%ChkM8CPf4XuPrP zayMkgB>lbo?uCVcu0#9(+`9P7mJ20CpO(FOaIf3ya)^4Idq<|& z_b4eVxmM7sv?$%>!;GRn&H-!BZ#1*X8YXw3&b_B_WNacoev#%old*wcNB!d!?wIhX zPrOCrrEVtf%k1v>4Suyx`>T8CmS5W(`u8^PHM~!QV(bY`v$!YK=K4!4ejmYHt}dNi zG&Ns*efgISKQ=fmy%js!AV&Uh^3=x_9-lYNT5a6>UP+&?-Nv8eoILj7EO+qmsdr7! ztm`r%Ip5aKnWMM)t4iaSxaS)}9=_1Gv!6WGXk*&Cxfkd6`4yfv^ZSAUF*$>po|}|8 zCq$my+0t5h;U7Jhscsd1YIWTf8tqKI5M+e?QktGW_kl-5qvCp>g;xK(vOHX6=(pqJ zyUVSeqWo4zpY&T(x@F$lwDc8^FQ_hy$XgP=`+4QU)A6_Z7Uc}jbSg0WmOP^Q_~5M{ zOBZ=WEXmDCRA|)nNe(*fU}mvmR>3OUU72_Eed}8GRP7kEbzbYrgqa*U1D8mf;MZCo z&xb`l+JQx7n5KSnzvj0-XziB`@k;N%z3--TTRi{9tq(iRQ@W2jmFs+W?y5l^Eu;E= z-D!FvJ$-fH>CBkWu06JIsEk=Wqz@~(aI0WwdH!Rqj91Uk`6T;asd(x*VyCWp_j;ru)H#)E6@fKk(b$Hs^T6(p?f^hl*Nkdtd~@LGGi zAR)iN%Hs2*v6Y@JVO`$zv&)?*crtZ>!y3J=uTviyj9mIQ!fnv7l%GC72Ft%!R=1w& zbTV!A6xA20HIw6B$6UsO?f#iEPfmH~dcV;z(|TX(=Biq2Ry8rxIVf%$2Cu$G4kjTF~cG!ig zA@L`!TE>=txb5S^x^y;2<@fHv2Xux-4skjb8KT?i*j>(~)aOI`mhMa(Q2iV;(GPf> zx~SOFbiwp56X%YUgmkmh z5nWOzExA8YwbrTsoZ4G=Gq<}~#iv^(R(8q{pBz1W$Izga3+&b$==EwxbfZs%^^TokflRh=0Hkl_2c4ay`yiuC`Npwc(!g6fSyS`0HkItB`-}G@_;K27Ef9_hq{ay8= zI_K)x)!H{NcwSrZ`~LFq>Z7YNe;06@L$+vq2e0<*WwO)Ic9R0cC(bC>A+`Epp zp7G1~Ecy{(c{2Hf)$@t5U3$)_kz25&Y?7Q+#tDa1y+X6(ds+KUs;b{EDQ|HXZnsOY zE);ma>u_|R>kfHN#rLLn(GE%ZJoDmh2Nf#n?z;M%ycdfFhNrw(v0Q$XR^xVCmq&)8 zRFe_6zc+Y%IazF{vWq|J=AoQ7OL@l{?S=^heD{k-?;N%V8&YjOaI$0b@B;HUny#$; zE5R+pHMd&EzcR&^zu!Mr^ZquYeF`;kSBj0*#S<3|&pFibx=}aP8UBaQmPS0!dFvlN z=$TjlUwbZ(b+4=WjjicFr~gh?Vt500$K&wOsWaTf@i|5MGhUqWT^*Oy>E^d(Q`o|S zZQE_)bLy2^cSnC;s_uCpf>*AWK4IZT=R!_{`>V?I=T`4^k5=u95=XnaoJwsdE_tYa zyjb3D>B|LICnvtX;O%%#^~UwNYt{On7MfSb)#i)pzqx(Ar19*2@@<`%9x998APGNz2o@P4s z_ZyblM<-+6xfwC8fls+nrpINl0`DJjH80$;?QoBV503q-D-Ze^RP7hty>@eR z>i5zgDXWs*)9+oWt9!a_OoLW>+3)!yU6ZybD%=b`|Luu^icUqcmG-li$I591Wetn5 z`?HhGgk=@u4TE|epSwiJAOCY~NfpnuIPFTP@pYU`ouJkv#!OxLw`&%eAr>{ z;-D4_lfsBzWyjB+kGPZeW+*3M`_&z8S5D5=JLy{5`SZ6csZa0UAIvMccfj|n)7}wv zk!4}J3T}RTn;zXdzihCXm+#z#b;WBkpNnUFcx)bg`orQrF$2Q zXTc6TLuZ$GE%QxkE{ZV}sU&z=d^yN6=(_fty-&H``TGk`v}kR_64TOsCUqIS`FSsk z1+m$6mvYsP_uKvH;Y4}YydgTbwSuC}vM%&9*%VW8XGd-I`SV)8R(eOc1vFJwDk(&j zE53ZT|KREP+Ax#ltkkt{W~`p;%9;9j>BLK$zWbM4xMMNJmN(K%HDL3@eerK!cFA_! zkkM_FLC0VhxnifP4fSh#HO6E0M=fr7$%!4GPtIN6d+n&Nx2s;<-!-ZCq0Hv|W`)&5 z(_3#x7;@S3cbD90mfNwwUkEnUanx%63hZIk?q zkhSxkZOgq-lDzxH5rxY}t0TVOoqi(O@}@!WU&h9(AG|qPZK&Awf&DZWyG)(^UuI(S zjXd!Ar-f-3c%d~sVMZ$@{*n1rwzHWYgrR2vjbEQ|GZS1mB zMdRXp@9de6bt#+C@6fA6?Wg(gN&=I&iBji}2)R1h-0OU`t9lQ4cwOG(1pDGDk>itcyEDbFz9paDP?Gv> za^tr&?+v?$Ke_a5ZMwp`kz1TxZdS)cPd<9lpzJ~DQPa&c8(wE(hZ@sc&s@(Qw5(Oz z`>fH1$zSd47?NZq*cqV6HZhs8$scI~?99ewiovI#YV za@>r58rC}9|8)G)qk%5@j}8pOHY#ix@Nvw9L%LZ@=4Xd(-+MS}lGTiiA7}mv&>by! zRM^D5r5R_qjWx0RHv{1rw_<&8vzJC{4cva`$-d}cOET0%Sr=0Oxjs}izj{pg)27V> zwlys|+ZeIWXtqm5+(3J`GbPW)_AYV`oaEU(a)GE?Al5sxK=nq{2*19K{Z4NF5RVym z9-uMj)b2-YVMTz_Evq@E5f5L?JGHxe4+D8_XT#-9-{Sp0PfmYXla`_)A3Whs*^IzP zhC}CNc`H;-8G2uLrukm)!?zCzZrDv4bfI)sfy(Veh5pat0#rkDFa3CR#PP+(-%sv! zUVJR1%aGKJL8D7%Puw+m?MJ>~Y@FP8?%6$8BC%_)v`cbyX8z#Z-TbO^Qp3CK(Sf|X z0dxEAwG7ZU)H#!w7HhO&o=$3#nvI2Ty52MWOK!L4f4-(@;_O;7;@x4F=W!8Z&jvpW zpZ5H!!nn&}86!QvUkYeioX~t}!qh$M+#JKVn*2Oy7g{N(?BH3z@w1*=*Z1gKzpM4O z!?Rd7Jt}u%JF$`{?>^*eaB4&yH_xwZ9Wu_qcj~3IJx_-(T5Y7_AkuY>)DdS_Y;e@# zw^rQE-h6wnnMId3DN3=qx%207?>qS9l_eeB@O9b2x2r$eM{j+7UzBpiFgj-4&#sTw zO^dMJ;lIK^IHwm^RC&eDdCP9C4;i8I4-Ip#X&No_8fmAbi}l#Jp1o{&@j|UNL(cPy zT^6tU%753eH6r?ZiOBkv`)1qdfDb=7hOmkoJ>dQR^5zpOcgB1_dPFPlx{Z@(*^Ai7 z@u98GUxNzVr*}#Ske?ZJbyVVrn7sOeM_QW??V4xV=g|@euiF!Dx|UH;IqQ?(_|?lBL^iMce13mp%*ol79Hs9c zmA}3G(9`qyO;*IsAl8cdAx1s=J#A@G79=?Lbht3lZgZX3eQ*czJgJt^R6 zi@0ge6@?|8Z~EPidPW<++B~v)Zs^Be zfhXRVM!RlXBpAJ+L*wyWODFFc6%VyA^U2F!9aUT4H6mGT9PuNikL{j@sAJ*Ib>kd9 zRmeYy-TM7v*4_J_b@7GIK0OFrd9(Y|NBes{Yjr%;b@VyC=^@#T;ifD5yt=zlboboq zik^$@w|eZkmA!w+Xr0{rCr|gM9Gt8=%Ik-f-mj+*8YcRjbDDd*aMhFvqq9E8ju!<9 zjRp#_+XL%*e6D&q{QC`o_QZh-_7ly9y|}ZkTjsLftN|RoM6vaQM92A)-79SFjkCU; zcx&6$;cs@I?{%fd|BSv|e9;Iy!Km{?l6tK8XWxZ{rfo-cBi$79-gq@1bFNqJ68N)W zY?q=ZPuC6$cNwmBZ^o4ONhdb?+08m$(%Ja+@_5gX^WNo{_3$0Ruf|TpMlRklUNtA@ z3~RqjeR7IQ85|J25>&PQV)Ik&A%}n8G@EH^c5F~(N#8h@&y}xJj*kCq_iafjcc8|V z8ye+1a)bRH?{X78x}I>lufIh3O^R!W>hy98 zoIl=r)8r^lzgMc8T;odpTKT_&eYFBPo3aDQM*F*mVZB+&Ww)a@8=;4!|=lllpF zj=kt`e`)8wMfpo7%I&=J)}pB4ioC!xxWqsA`k5IUqt`qsysSUwvhUTaURw^>I;7cl zd$HxT-R)I~9)Wma-*k<>&0KM%!j;U^A|-IyrTk z_l-gK4)zsx4lh-(Ih*Xg%~$8g3B`<0vwy7e;Y8J&?0@ts=gSxyPS@|-pROGoQ$EIj zr^6`u{KpAL51&=>{jRQTxOC4^orDX!f*$k=WwJ9eXp2wbEJL;qI*t5SPT6zRt%+A}^ zeep*HEVZU;%gm0;&%fU{>C=4e%`?|V4t+Yz{=r-aPS>TAD?`3S=WzmeKUtBafAGpD zOUG&F6n0vK8%*hLx3oz6#ZvS9!&4WZsz23SRUCgUBya!L4Bqmpc~7#e4;))r{oV1{ z@UH6Yon4=dxqfb7pZjqwBSKdkR;YeG_Sn)334$)eTQf5numgRDst>Mt?RWA^OWg8V z@jk3tkGEQCH#PrRJom)w)5e|ieZEgS!k>~Cl(RMlXj_G{ z1%rN4HY5I&wgibal+6eZZ4X9=%vYMtGKCB!5liG27Al6!B*;DT4t5Lk_wW-hCKHg_ z(vMKykr$*J5vfL!)FRl6#CId{R3JzMl5Xyx#1cruV(wZ9vtf59t~;g)S91PqUb1xO zSR0!eO|c0T1-Qe;v&|BJvp?_=&_ebPx-k%5l7I{6D4TTfAYvOM@dPkUY62LC1N)ur zZtK97mt<21?)jr`>gbF8LPab~Z`kODoEx;`9TXhs9_ALx3JHVktx)g404YNdKiYOI zk#Ys1=YTZHEz2V(D^SN_YErGtUFqrD!DE2=hrqJU5rxE=TZ!yin_Ahc^u=Z^+s z+e;PpIEmdp3WI3u5%~pqLBg9Dc;t?A%2yN=Bx3oA{9WBetU!OUrwApQgnEno+`T>IAXCVx;182Mk4P;^aZ z>zK_UN2+z8zeS+XOx0ZM?)?WQLK=ap23%N+UndFq8q}N}!~qe8XBi?M3gNeOw5kKo z+SM^OeKQzk545v&D9JLE<`@!Ni1sjsA+J!HQrMPXNaSPuEvN8brWHyCd|NgfEk#J0 zN+=FNT5k;_{N z&p^es1!H;m{qIE7f1@!dw+zofCDf)Z6%|h?lH{clox*<+a114^5>QIYs=qgpI4ezF zWoR8rg(MSM|E7B~JMHkUkWa`GvNMcZA@5yRz_rT z+*p`QvNEnQC|UVWS<3%LFQiGy?PvlrEuoN&jD(0ubCBs4L?-f}J%&l7ei=Y2xjW>; z0@J|#z=#NN6T>5r97Mc_pP~>?hgM_@+C~XndCMXO13b@*D=S9oVS8o~o&&>^C&@^P zOxPyVt_j^lxzl)(Hp;IiGOh6hZ#>l-D>|?C$$}2AI!qj>fjM5pokbp z@QO*hx#<+c0uRzq@=x&eba>T7Vn-0y;bL#ePkgK?3i-tN#6?1g-yOr#R!}}VH4!}! zlFk?5EN;l?XXpl=~^+G=_p$F73f-X<8*%n=seV zB|&g_0|CLz=!!zb_!FBfW+FfB*axJfBdcl+7STI6Bou{0C|lnQvQY8A*~pUFd%K5v zVIlDN5{j9r>2Vr=I9KvFdYD=340`Ykcp5!Cu(f8QQ6xotn3UlJA$m~giPMwNSxx~@ z%lli)j1+NZ!$jvOj6jiM8z+#BZ)=z7xpTmvoIji{_#=O?P({`s^FryYB9cvMoZ^F_X(Nn{ zGCw7h;kWujSxFE9k0qCgwfVT;HWiP zE}|`r&?zJqU1$UfLC_Rdawr56)<&w38t_8t-}r{L=l%Y+;J_qK#^3@qQrb|evV?g& za$M1*j6ZNrB^P;#|7P(1Hi2eRD`Si?8o3g!#Fdg*!};3?(!jg)->7BGu`psa2hI1% zNfwi2nSn&3m1I^4B#IP6xgSBkG3+%#A6z3YD9$AbSa7e zqhCTN{<0aAMT&r-84egH8N-f;DgTkRjB^AG5(P4<3gX73G*X4H!5l}NcFs~+iaf<3 zFvATDL+5vUuq@F*)==`@C+MH4w>z4z5y7IO2E1Pa;(>y@y6S{{P>#szI1F{9P&3Di_x6iGOh=fd>n5ZYW~t#0aBREC5>XU6v?$_Zrkx&>FK9`*(%}e;FU1k!oUl=ICl7# z;4~LsA^{%2W6X@M@-SQ~bUpibt@22Y@<>kd;2|8;cX*4H_!nO8#(xuir;3#)RVKH# zlV1O_RUXkN^v*Yq9X4f%e@VEIfb-$#2*B}H6F$ie#)x3{PmREC1eBJjET8NWAD+5K z$oaVQg@55N8U7nZ&InG-C8%BF|3Qjadjo~hDk(-jaexy}wi8_wkV>OTGF+2jFtt@U zNe=}5MT%^Q^CZKQ-l`^{sx)l)!)<@Tra>9(LR`uc&Jkt;#xy=~LFMqF1pi{hDP}nL zPih6O0<^)79vA<6C%~e%b%NF`pG^vcY=z(l6+6}g9y=KWQkP{XDfLsF}G6PQbkYJag9gghDVkaFI!cJBvS-~M}3#bFm3YlpU2ZvBO3w|D* zox^DWe8d25Qzs@qvM&THaMGwjFNZ$b2v(3D6UmLR5_IHfo=tYX9ctSV95F0$Js_-4 z8$O2I2ty}9E|DUki3Fw4vKfYykwbQc)J0Vds(d-^$QNHZg6hyI!n3sz!I3meNPsYu zG<0-Wuw1S{|<1wux|I}BD322Mgc*^yaNKhL3iTta);mN-0I9_^7XJDAx*4%vUejyqSWeA{Rz@e#CBSV7z0vc=Vf zjqhsV%E%_-9||i-;t6$;j4DG6t<*}1CnQR+MiRlRa;ZF`N8V(!Z4zaZJNy!@(!|{& z>J{P-xdb+d ze@NaDfg>(xIAcs$1yUSMPPIkCw-4rI*8 z$f?c#(~*<02+0+)9~32$iKE1TQEG=7VH5*5)eK_st=ZC;ip_|r=*T6WjzlhFlG_QD*wRpm%?Oon+?d2RvdM6RWI5?^ zDJ;joQz%D-OXDUsBW|J-P79mZ)Ub)T(v96t+{Bi~O|XLg7e%B+O_FX<2yZ89Ligkl zfe6??M%culoF-36)YP^(!fq#MVoQT2NGJRY;m8R}<8RoV#LH4BZzqIeOG79&8A7#r z9m#0L!vTp8C3J<1n5ekX@C|gu$W1=Nut-BANE`VxH z(L*F$9i;&hd5xN6)JsvJj*#TxoFwBRDOyU{BZ)fs;Qz^S$q0Jrc&WmcA-A3QM;iVx zq8|xboI)UovCo8mrZZ6*>@Z>-sSuG2X}(dSQG^J|zz5$^P?SW8qy!;%S;`X(#xR#y-?VBc%T{RJ6!PCh%z|?vaK)jHri>mMTFCxfqd9-cHCP zjd&OV4;?Snu*!rx%xDK<25GE=hdOxtL9SO&=OH*jRNI8NN|%i^v|&Uxbj_fmm8c(~ z7(gDbe}ra`%$67z+B$-)!Ig$S%*coI7PuEC#-mijWa1pO{?|4HnPCnU6IFgPD?{yt zIFbkl!b=hl!Dfm3#p#o*e-NfuhFV#ZDvfPOQ$sFBP?;Oq#x*} z3WrOALsb+xgjH0WWCFMUsr2nQA6;rd5HG!O)r8VTSc08R;< z6flG93qu)=5{+?H=oLXJ{{t5!*`xr9kUNw_5lsZZ$2eI+ zhycWn+9WscP_ddWoU93RbMxk?t3zSFWD`hAu%zvFiaYnfs60lxz@(gLBMg$wp#dNm zE=45xihs}p=8J>bLQO;#VcHdmcJ#d6+yX;GQ7zPOa_f=&78n*9;w=h+Zx}F{OPFS| zqP{3NTugKZT~>(85N``^V)O(!w8SS&1yw3cGKq%Ts?a5bgiQ7mV@Z?=$6)9k2$v~y z)Y+g68iY3|$ubHKbA>xE{ZMa(&?7#%>qazWEQT~+AP%Vvxh+Tgz()EUCA5$AvkE@5nB`bwpgXo^;k-eIZ%p!FBl|GfjDAs7vCl`@6d zmY`a}B47miLhjTP%~*@jCsM9(8#kqrb(nXgsyU<=Kz=lE2`MuXf{}f;_kyZ`6Lpzn zE=C}A7YED)}!ZkYPqQ*uBLIaPCAkSb@8=R+x z%SnT@927WkflGwVwBkrUlEFwRjdYsWO{J9vt>Fss@h|Ne<|J(%CrkR1r^aJg7Gx>@ z*eRYGj81fYIzD13)F3gC`=C_h$g;3C@%3jKm1rar^K1&3uf|3;l}sd%q5(KEq=fO6 z_KMOeoGeBKim0$2LR|0u*ez%Q8D=8>rc;FYDbq11kN80Dk<%JRj3DNoQaqR%R6ur9 z!Z;6a&#+)Ip&$%dQF=vCHL0yIrAN>qs@s+fw;)K0L0CBw9ufcy)SXMLhA2)VKv0NF z=1hM>?g5xkQ{QsSIr865+T6 z0u1F6(*p?vI0={S6Dmlw4eA8ftWqG*8FUB_v=kAFN!%(?8d@d#%%Q2i5MPO4>Ihzi zgBVCmG$mCL10_C_D1#VCEF(zDAO@nP3t0b=fPjNMV#PxO0cv=JY-D(fnk6Zvk5VBX zceGC`QcNOlmDCkr2t>vN1g&UXlKCWL1879jL;=KW5Ro*AM*}ySZA_){lmo32h@cc* zPr#SV&kn2?SWkCl=u(5Fm#yWh!0% zs9BO$K7&?@&u(+sIKwnR3;ASz6U5P?K8DA1f5fI>^fHv^Bz(Y-% zs&auGO+t@kNJY((qzV|MYW{KjbAgANGz$Y%Xwb$P5TPM)emJ2(g9c3>kTsx@iHreZ zXeCs_Nf0NJI4Dj0C1g<9p4$r%yCGLT88_5qTGpgCAR6z)I;Wx(2zmM|zl6n|=x zX}Nls$2B%`aXHKerCg0vxqca~`kBxQjh4n`VF2@H)O(uGSvNc;>C zu%0bpeMp$Aq$CGXE^%ZuIM7cpNy2x;c2o^R@emL)iBX*1i}oBEtpZ?RlU9rdhweyR z83nF^OAYT6Mr&CEF^;;Tp$U?yi5ZSjv|$n(K{&#IBC?j zQ5CxAs55YhiI+4EZDTw{Et^ReeBmK-*%BW>sRFSNlC~_pe1wW4nL^WQ04ffd@<%0? zuZG4SN7lwtD&qvwE72qf0&H)_O~JrN0z?m&;E^%y10U=!hbluUZ-JFK|0!zC_y`Vz z-DY~=8{;$L5_M28J|nhsi2RQ~=q^q--gB9%bQ!ldZ%5QHsv&ujNw{rTG2D!Tu%WXc z3N}?pjOxHdHg#+=J|mk%9ioiS;2hY*NF_!v`5Eay-Z)r)cKdq3Km@&Lqn<*%CPVL$ zdbT&H8Q3szNo=ZW(7%I_sCJg|5h=i*m4|~AfNBTmwV@v{hS2(Fd;I}f5Hm=oZqSji zf&6y3!5kp%g(QT6U=rVfga8sIQo-B93G$VMcCxyKq$^p(ko}5eOEn9WK48!+5&_j~ zQ9i2?E=`gYEM3%+Z3Kvy;RLEpA1Y`xQ`G{GKbXikxJ_(xxChe=qoao1e^b+7C89~UJ$kEyg+dkIth%Q(W3eWX>Y-# zqyBK(7Z3W1On&=D5PgO2aN4(l=qq#wgBM1mcA4HVvf500MT~g98XiKxiyo-%pLs!& zFT)E|o8Sex{{qi~Fcbq1kZ6)ejiTPRZ{*Nd)Z6x>5o*V9EE1A1B94Vs2vnUWAADa! zA|5gUo!DcCEpcK-tx0To!*9YHYmz~)CUcpIwpK1(6ybsYXEchW!EBURp(Yk;tidkf z6HWM+kQ^~NM{pTwP*$P9d=Sw+eHIGw7cH@c=%yfT2S*WTWKDHW3g)e~676_?KX|kl0s&-#Ag!Mrlof7D%K^ z3K!W{hDpXJtiWdsAAAx5h{aSPIbww5G900te^GPNb~9RSPo=0{5pNW85)%7oa7PI# zPGZ3s-C2SUOd&D1rgoRI@A5C&q&gqC<^(oTgv6*uJHPOd9)6>i5TCqC6puKRqX&;g z`US#0AC~Aq87MifcRg5=a}@x=Nro(Cd_zbm*`q?`%>&`un7JWhNnsp`naEY_7cyf8 z%OcD_#7Q0g(6C|Y&zi-CzwketXUziq@S>FtZfGDj#6?2cqZV?6iEoZ}6?IfkG(6UI zJPQbica!b!tgfyM_nAP``tW9*;w1fPXt7(JS|l;)Sl8JYsDnDJHLHSNDo(N$ zJ1CmLBavX*)rD{ojH|aOKt<6v2;S@p5sMVV(X)_&0g5~|bv1Pr3MGq!#U4H2ZW#^r z9B4dXBlTygTQ$VROgb>*mDh&SSpsgb&49!`nFb>?P zfL5;BV9>rgAjG5dHX#04T?4HJFkoC{=%_F_x`=PfP+@=%D$~oscP`pxpq7Kbc^I;w zR3Jjgq#736glLn5S`Pl^p#@ha4DD=EVXzyjjv{#~4DjK{p8y6yC#ekZ13$z@Er?*q ze^6lvA)4_~VSrG8l3}PY_#0niVZbzzy_Uj&|8O9T(+)yD3ag|A@jvl*EEzD|G*V$4 zJ{-=X${0QZf$%>Wd_n>AAIB`^0$du#=p9D@CoX7I6A0061+`(&Uv*?8m@wp#sW6U! zho5XkFig@gkjF)~kXjHB!VNnzFgygKmg5M7_@P274De|%bqny}hsP-8kp4r`D}&X5 zP=H(>r66JMB8w18g>nKzh2aXV;y=*EB@PR>uO(!Z45OUEPCazRF@rMkP^-i9kjtmF&hlLecx#Mr|QY&*H&_O$>R2U!>pb(S_1AKU>#Dp=;HwOYH5Id5; z)Z79>KH8z7!eD?xpJibveUe&^Bjn=8QK>M%$3w}AR2bmHlg|klCh<-jc$JM_kRt>Q zVXzty;@hbVgdDUX%YbR1g)Axz;X|wGR2UCEc8b=esX*jQP~63Yp)^q{3=nFfNQnvq z0`Ut3s4&3CL)%;o7$1!=oc|IVfDp>settW{4s523VsZpb4+xf@%al71h-c7~#9(A_ z0K-$3LK!6lg!uk3wI_g3o!Kz-7!RGP6@ds)-1Vh`&R2b4CwC6~L0Y3bQ1{DT% zIhd?}=Yl5DDmF|8gM>HM#hlvzz`ioiV$?s>mnFhD@Omd#eaZMgK0*A zLOgqc+AvhcPr5K+%)k@y;TM`v%OQLWBZc@6b0UTYBN)?fYe1G1(?tV9na~~Tf_};L z7~e3a5`*vwxQzG@5W>xnGL^aQAe1puU@sxArq>00>dfH@1oF_r22PA5{zE|K)Cmyc zPcKuchC)JSJP&mth@dx&U^3ngGCpX=2M}WjAwwnr<_ToI9XK6^ro-h*cv1?3K+Sfz z)gBD3X5r(n%>=`}i|wojXz*oiKTpW?5kRz%Iak!+!-fh&`=P^l2r0c0f`#wXrYtQWBi^(Dh#XOK_+6yiBnR2U${Z;W8V zm@%OSOg@>@IKZdDR7}7JjWFUr1Z1*WL%_zfW~dDVLj3j(Dh%p!QAz^?Cc}Q1uW`}l z8d;8r{{SI=T8~*-Vx^=m8j>|7Lx-F>X~6V_X_f(BJ24?l4;Y*V{fF5UL!OXHB4hO+ z&siuN4e6p8G-lmLuJ^OT7H02DBTM}UD^(|Zg%lQh|(#sG%iAxD2oJHm#@j3Fi{ zC$p>vFh0hNcmXJ2dMtnmnGq5M0r0!)KB>;T52hwi|C0Ky8OOd~QL3(A2^nB^eMk?9=-&@$}T;4+tO z;IuJcgBkw;5Y}2{8WEz+dpfIOk&7|xfYY$hB~y-SZt>YRlxs8TZSfyk>0??mfC-s# z0Gv$*)nqmTH>$}H1ChH7F%aa?ISA{|u)xlA8~~FENI0FF}#la9g zMl&`BSK)9ASDhLE0YY%J^xi>1nMEXk;afbkhS@MHXVe9v@!Oo~f zlNs9JJ@MOG$Z|yd2fgDl!*4FEe=rpe%HdHfwGo(t2$*7ma`=6F)N;UnzKoILU@!?} zXe(64&&E(IgG6L@z@QwSWkxFp=UABT7)c4`%rnXnHU;rt!hS#~WBbvDA#-d)> zOoY%fLouOTJKUnLq~Y?1f|B(ZDKQYIFozv%-pH6ySX!3ZxB#L#Oof9sgiKEfQ4_4c zGR7=K5CW#004B4Z3mcU%PfcHihCPStP4YJ;=U`|MPLZ zxw2m;-eT?#TPp#`GuJNjd#=}%6M{x(ZU#N_M-(UD5Z`F!I^kP))pi4vyUaMD4C$(G z-18|9tUdF3X^_|Ad*DB#*1j5h+&gI# zYb~18R?&8m?im!9MzmwgNB(-P)cE9Z%c~K6owAPkyYHEkbr0PyUAx|a3ck{;&wkqL zbg2*8H1WaFgbB&za7B`HFm%9fb|%M}%3PAR&o{5@j{oRt&}aWaCk*gU8lV_~N3Lh( ziD}zPx9B+W!o>(r^Gkan*0bhCd&%Ikwuc0nlZ>`N`|pVdl&+Yl$T8x7DrnASbohHI znMo*T$ChcmgS%UIshYX}6*P+GO1t4dAAHFizh84aWhia(x^={)j^~Mn=;T~Vii%1V ze3?9KZ5kW12czOG_QK?ZJ433_ICaYTr7h*z?*(N152cb$Xbx1&?kozLYiuZqcqb>E z;Fc4&ZVbFh>x%ynTT7iA2OLIOSI4jCJSD#Ol+LHYNGQidE?mm8fbOuTeb;ekwq!I@ z6G{Sh&~oyMv2^&36G>b4|EA4!vaU?-HWKKbzJSIV$DjP@y6CoT%W69&`x&EcBj<1U zPgb%52TpAHfM_DR`w!~4R4~3%s%kXB{b=jQU8-2bV4S;TRD=-gj!#@9_&Az3)q0oe zI2S4YaSUfLBmWKKDlFWJ@ZdD%rjc^3042WD+!)-q6%`4+pzV}h-1*k}4>7eA+PY$~ z{~%wbM0kW-A0HfkZ4YUj22GZPF>HPqO>S*GF{KAY8Ox84^I~u`8+fPSUKWL2X z+hEN9E`CmB4#o$Md5+Oe8RarNXCga!kK886v7J;>5YI}0Dnm*MM8^}w&q2eYDJ|KEm+R6!@E_uOynZ(mQM1(Z z_*jJOSlwr?G0!3`ptj+vlfO*mafiu`Kyt7mS~g~(AvS;Ae%%gwXqje1TeaF-zA4Ti z|C|X)r}7d1=p})!@+dNjrQsxD6Af9n=i319_z!WtV6Yn@h?!sm-)Rb@_k7fM59Ylk z$sE9COi9J;(cYPfiR2o)!aG-|V=z?_Vd<(;YL?`52>j=@gL1crmcAWY<@aoAbu>Ac zPQOoG&3(`}{D(*lRO1RV&dKTZbi_(B-gwEqB|)7Nx#+lje>7R58cbNS zwYSXY!HWkOsG7(IttQ{ReF>cC2aXs^g=q_k0INwwA<;B84Hi zAcK&W{O^VXxVkBZ2kohRe>HQ@85^3Udin=w>t|)QQk_9>(A5?H0W_t}j!N%S6MAl` ztk{HON(v%mp`>h8UPDUjG9k|-x<=8oLt=cX_Rk63C;eVv<0yDl9gAViR!D~@B!6ZQ@++8W7YD@(^mirjTaIh6nw3tsK7h}7L%rb zhjytjxlWF??kBErE{XNb6Cu^U-tgT@3(Z-KK}*TMEvNb4#m`6-#uwGja*C-B*h1*( z%raG>+CdfAR@B2M)4n%iBY#8yJVxk>TWK@b-3l8>-KS31aow6Q=q}F{Hn?Q)P~KnZ z(0(uyd9ENdt<*9QTpH5_z}lE7SJ1k_e;U^@kv6KvfK++2Zt3O8QG`&5C})_}-%f=5 z5&6Pf;-WPQ9>+D5inex5wLNF_`=ENHRJCLr|0f$O)eaq?@hx5c*sN!kC~O423dMtt zT%zp5e!J2h`0vb$#TrljY8^3!R~b^l=Xy(ZvaU$ZuD_o!bq?VRz<+0ZE0qdlmYWdY zyplNI+kUX3C-`J`i|<^jS{&#p@!#Q0GnBZ5f=e<}k(`~(eT|~E4iMhCThBZG6K2U0 z3vgc5QGQT}tY+6~SZ({ftB*?~b}_Ze@1YfhMiVaG4+gCa5!!m*XuC{k6nM3r+Ja?& z?&~?uN`eTq^>ao04+0x;O7N}6s)Db4e|(!V?<@X86amZ;%C0u8N-QAE%8ZYPmE~Ay zU{mxV{w?VjL@r3WSmJH#0hImh4&3@`Tex4_^*Ca*UEp@f|8_nxuKTciMh;)CJA2o( z(*0aY;5`TUvb|aNhW{{Dxeb~voQ=DRosUYc#kYPmaX%3{s`xIRg$yFMyiFrKghCmtrO8BdlX2MAbnX;t6FiC({@xF3uH_)yFEc9nE%{SnL2 zmoz2VO8T;%M=v=wc;?yD@v_b%_O`>3vHtkkR^mr9Ix_^Rkgh@ir`XxE&A z`QOD)_oSO7<>&fY4n{deE(zF~I6&Jf)j_*uKHvHs`6E_oHCm-tr{XJt1zHuUpdH@f ztD95!j+ca2h$@kC#@xMH5>9VPMqO}jI8o%p3lPq&eCL7x5KoB%CT)~Bz|W#q5dzx! zZJpijS9DQcG>2$k;6nZyueUg(aiz-et;a3)e5zwgTA~iQKja1W9qZS=d^P|1-ewcR zovAFu6YCrU#_18c3Dl>FA@5V7nBuyecl;*~U$+?1-Z@T?XIe#(w91AusKqzW`|c-q z;X0{c-4lmai6gX1JfkV72nj-yb&TCGX}*byRQzwwQ+{xEX3~J6JP~}rjQ3lTO1;fi zy+_G!_>W&Ad7qs~>g47Unn?e^8p&^GTLSC>7C`mm!U|ksJ=w`BD#lkAlZKW7=b@EO zLCd@m7ka$tWq%&KU!B$7KXXh}&&Q@gJ5~i0+A(8DXceq>wPF+Ez2ZMLM`9K!LS{Rx zm=n96h}#`mDVWT7Pa$r)U1%&@^dbLVc^-O88Dubmgz3Qu?mR9MU2j8(x7BTF_cHv& z_vo#0YL@)(7I3DQM{$Y*b0c}#qtKA2x$8v0yQPBFPHime75`1yMUD_kuO*?QGGHO> zdoI;_?xdtQb}MW80)JGQENOYaelIRj{JNklJXYoSYNM+d5$)mcU6)A);4KY1^1q26 zQGO~qR!^8dAPZ3;8YbtM(i$^#Pc+;*9{ax06>I&49O?l96 zb@=e*%g68k{>y*=z1~y${%_yD{qC76;+kIv{>y)U{^mce)_;Hg_>V8g^H;vdJUnoI z`RV!f<;Sm|j(_@r0<@`q`0?rR$B+MqR#V%wg0qDeBbZQJ+1YwtSe)IGOuSAS@H?CS2{ zdY-ki2Pn4h2qh_$#U&Y77&%}m{{9~KZ5G=?`9d!a6MH+{`azs$%}hLFliOQfmh zDU0Zcl9H0ZqQ;1$rVbiW-X)r+B~Qqdv&e`vQ(LO0sA_`|D>RAFo*=}88&6^T9@!35A@m5&{3CM zo5LYrQNp?-?otq#Fn-u3Dvykz=A&?yJs^;D#Oa6BjmF-ZB2}i8MWJyJ?L}d6XbH#@ zEIp7M=3s&-WSDXANW>;1^QJ1hnCi(md=btTW1ylq*)`Ub!cp|3t0BD2Q9f|AQYa@7 z>cIG0?LjAsBK*@K(&T`3>Pf4jw3IKLs9Acr$}-)|py{);=2c|HG6`NZWkrh=H;f6K6NpCjj0ZI0lU|4?^;sIw z1oa_QVId9T>|%IK9Ht=s!#;6zDc1ZxU!a5(miyy&fUCQ^tl##u-o?3ClTw4x+_T_6 zhl4-$!1kZvVOQ?Y?SJL-7cTIC$^R0f&m7al8wUG<|#4E7eEXwq9tkoK)#cZZjk zpCR9zULEx`UIws&y&g}$8G9rj4z_U_^u?~)io0rP1q01aCAl<>hR}3Ly8m1bY68h{ z@PnN^>>v-P1Uin%y1O@bKv9s82L$Fsxd|`xbHeK!`ux}3$}vsWB9`Oza?9KJqBO{w zN)$sM`l+OaEX<+wi#`G6Se}l--bdZt|7Hm44D8M^6ZxgPmo$#Nm`lfsggD;e3V4Fx zX<80+iJvo_n6-0K1kWu>F3Ogk_J9ewlgJfAB`_p^FRj(6l|LK*a(E++4M zf8{$IIh5guL0-*hr38EuGvY6n=jbpKV<5E6A4_ecq-t%Ypsh31AuF4V%y&j zrG=pEI3z@qfWf8pCFk50q)KG>`K7Nm1D`DW?nHvTMXq&C(DW^TkZ<VxW zumj%fL&HI_m1jV*vr)cj5^y=aeug~su6;;o`tud#P$?zdUaWBa7}Q;B<5_6GV&j$Q z952aY@R^PFCC{ZH%bWy{zGz5eqU`&G@S&UKnBw}lq-Ujkfr+&{*sAVB`|LJ*RiP0Id^5R1+9UQOUA--3Sb>BBW`NGzY}d5U__QY-|& z^(A4$Bzm--bAmsU4O}Oc({l9Z3Xd=3N^-<`{Un7e#S0|6hxfSZ^$~HyC@wHCGoieF z-WA%hS_BU+-#baXRU&LhB!t=gF{efEGuj~9SVe9d`FMxmpHzOVtJ7ulMB?DoU+FfX<7rf1q z?>J770V%%SIk(-`=q8f+%6FQHv0CU_n~cUCFIpeuc5CunGKd$PUu^1z-Qt}7GdC>` z%BsGK7wZ#eWjq_|vN^W0-?qW>ubixms?6}^VH^4>0epQ_##bmVzt<;H{AYcw{AMel zA(#6~C!K zz{}?)v^M~hD*6@pYh@2Np_s>QdKBR5ca1=GAC2L+J3`?fCw-eP zdj#LJ>xZo;N-t(kZ|$?(Op^F}Qd3CJ71xKjYl>B2@B8$72v|iH7p#z@Z-fK57%$x` zl`+?blpwfzJg0ec=~4vm8=lkWkP zEcAu26eAz;0~kbPft)#TWiqMIeg_@ zVZ&_TdpI(j>BbOab3JB8Bs~&Ng*AKz4+cWnP{Ljy3MBn~#eYQl$Eh63WRhwFfc7R8nA~!rvMgVi zB>;vtz)etP)oY3pduGck29W1uFSpBR=BD{BSJB45wQf-WqHd@MqVM>Ffz)ZM5-p75 zhz25G62$sDG`z3>Z6m_Jyg|s#H1b)BYqd3hnF>V`RCVu$A4uvU@WN!vcB1+)5 z7hL&yn<`m}_b)~J8&A59cpxw$gICJ`8n|*sQ_c#urX#k1IGfC_%iPF17SwJEbm>KQ zaY@>)bUHR|GhHyNh>~|?%dNU`YGJaTKJz%{dDF5x+qjpENAUyop{7S7rihUC0v23R zmp7ES5>n78=-{1G`Q)sc51z>q4r7uK{Wv=Y45Duvs~KCw?7W-hNKHhKraR&JzQ--f zN3i8%R=@pGc{_)gsztxEUW?*jj%D&mQErkXTrpF~o-r@lr?qs50rZ%-{NZcH2|^7O zBF(L0K2Mvh&9I8i&S&4J;z%r*0S0&X`^6L-AmuG9X1C3j39w0JyUl#++Lt7adHuO2 zO|`l&oMhZS{vA@UDWf$wIw<8^rGGkPCLqd}mgD!4Kq36v%9%5=tX z7%`1fcBG_O;geWBrA{xR4@#HqH0RM`K((e_=H0Ng_83e5OjndHP_RnihsC=m?P=!L z#gsMavB3dAPIyrw6RAAzt5Q`aUx-eXUVEVUz?KPYheIh^=+j2SCC?8q2$&|fNuMur zTf$+sSkLOtjUfx|Wxh@t13x`XhOE0YeCrYnVmui|1#cF-+)%>#vDWH9-=GD3+cLzS zAjL*4l&l!iaTwO&aJ5s~Q&Rtk(YhNhiqpXo6l65PM^z^e{WyFKP=Oyz-m?D@7Plxm zf%K?4?%j@}cEZdoixRJE`)!JM^j6eD8ytLtB5?0g6?yqy*Lw!$4vcBV-m5u}YO`wH zE}C3|Q55QY(yWSF%?8a`z1qxMknFT2gR+Y3t|5}mRnFG=m(5{kI_^oJRaga>*3StZ z&EB#!Wzky{?^5w8F{N#Jgfp{6tq5n^nnBgT@rPd6;zG&m24n+64*lH;%T zuoa#qB){rwSod@-0EfDepL7)T6LZypfky@~ut2$!8`13z=&ZK{0)Pl!ms!GRqEJs3 zn!dr3uci*=Dra?tYu{d={IBb_Un)|BZeM0w*ujD2!P8_=+Qg`hJbgk}Q~U3^B3B1JGio=+uc8+T9Wfx`5vNfR=6V#DB7v!oNa^D!yjJHf&% zm&-jKrlp){`GO*3OsQ(qRm+^H{XyulNWq8l$P@ReMwixPs)*1-7qZK%XAfuQ;u-{h zwS7QT`-L4RkkgcGUr6>(TQ$U^o8qeN-6x1$=Ao<=`-QC73!IXZx54ny?M4H^s~NWE zkXYX>F-Y@2Pu^1;^ng2F7{1}wIJ&=1%CX_fzNVQFslax2OAE=g9M4(Lua?@O+wc8* ziEU+N0fnt2M!js`Z1%N92{?ZC?KfX8vY9A5zln=MU}QNfS?HvXwmb2mw1%8*?q3Q! zENFtp;)6Aix4u@paOt%J>j9L&)vK2b(4c70BD%K5m7_sO48j9B%q`4?W$}S4y4^pp zOu0AR^Li05eGMflLmK8D{Vo+WIZZD>PZSiw(p}m!INX0eQ+#c3bL_xT_QRR(u3j0f zCjGNhAmQ?8@XMe(IAP&De2gHWgo@Xw{?Z_@hX8ecxT|^#1J+e z{I86VyOq+zB1gpc(8Sh5kju}%C6hb`rll8~t*9`9%LATkfs)OW0m!z(sIHMFF7H-R z*Qd{6++x&3K3?=|FT*94!S04%5#PkMCm+>zz=4Wx#?0i=`Cb^ z;{8WSdM}1p^|)rJuFSv%mHpo!0YlY$-$#M}#GYikSa{YNw<4Ch=zF{;VC$B@o8)ex zfiESV$xmZ-1(-r;qWA4Lwj08pcJo&nuqROKacr<0)@qV5_j)KZDLe*kE1!Iv0iV0( zQ$M0Y)FEJ!p2VZo?;b`^o0(cxKcHjbRMY?WC(Opi^?$_j{}Ze8Fmn?BcZ1Eu83QE) zDmbk(V~^kX$Ka=msctlhHS6`X<(F&Za+VTw6Ua0FQ{6XDP>XjG%Iy_~CU7X%ME4Ee zjavOIIC&Fd0H`dsP|*Q($R&++F#)v*6?#BsW0>V+BL&rglLT-Sot2w7ZMNrJ3XU)DZn>*1zZ8TaI{52=W)-a_E+SutX#V<^&EE=d$n$R(HM zQ7)Zu%T?%GlbQdj)NJnj^zPi){p z-ev`O2-$Okc%}vqq|q{Ij6PF=SV#V#h$`wcKIaY+8G~)U`e{;gWo9#a#(598=@a3i zM0*HoHpi_jq0}wPWm5|t=o-Q1x8$-5X4Yz=QD(UtTQg;NsA&A@Dj|{qepDIrBNqO2 zc*Ue~rWW(2ZZS(($%&{DzUa?Io@(pgNTg;bMpCf-qik7R2tT0}2)H*l5We7_C{^^M z!Ehm1sYaKCZ8saCazd?DfdW_N(z%U9vt5%%)#57TNwr^IzC)5#gPy>fMx3TB+{$`P zqnb{qSMrvR{bH7pPDtJdz9yru@XV9Vn2UF8cT*JJht*g#1mB>;Z|EJc@Y2Q%M-Yqf z0p6r7a$pF#X0jQpsdrcwi3NRX=$=JVq5PyL&#`OAT^M>iytGIRV^@SFYLY zWVMlpWY9?K!6j6&RXdoVem?1E>gUrM9gq+TZO6|XB*Ld2H6V~caN>5eV?J6;hTlv2 zUD@NOn6a=+cCpBUP4_Uv!L+enaXCcG+Ww8kNa`*uzP1P=-#jGS?5Ww9g$CdA5DnQB z|7NzK7(V-aFImX>Ulk$U3qceV6_h8s{i*TW@TpkKQ8hApCHG@@xKH)Rt{$7|3>UK zU7bWcF4Vx4hF!CJ;~0-yU2IVQS}xG#C=|TaOTI55%mg79LS)($8 zKzLJIGf!1?yO2c_1|E&ym5Oi(eq_K6e;1ZDZG+~oKa4inO)+vf9~@oyw*!`$4g$o- zVQ6XfhT}LFrju;5rbwLNx}$%OqE-O8kbKhdQr;{ZLvBFO&?kW$!EC|>wpOm^wf=3;^Zw_G@Z0w4krB1BqECv8l^y(BvbcKwE ztcjX`%GC?^vlU;)g$TgRgLGm+2>}u>gC|GX=tA^B z=q4C(%n=HCKCC!?Ctl^&88sF^^9-C?*S_&tHyBn~!9|6Lr{zjz5FB*H>S;8!ubILK_-hJ}tVJ zo3F!@`I`QUFP2}9P@wdiflZJnW73L_NN<-fqsM(HVYei2Q@|_B9VX5%7(|ZfFSo8U z=NPrmu8rlxheKPJEvBDS{f!^@uGP7pZ_qz2`d+!)0!G)35OKbJ`k@N#Z-6~_rO^7g z3Brfi^pAk9n~oc=*r$^T#%T_~OKk3d_Op}2$H92ZTW;b?e(r#7?~Uby)rJBRx1aWt zEuGbaQTNv~B+$OO$~DV(&42+*se@=!Vo*H9WhQ-RR@l@^%0wHew=%H8YY49^`n6MSrktpFZhZ$C(6K!+>o08QIJ^t4%l&1?1|=cdlR5tEh=}i9eU85=Jy>C}^Jgg+vtVWW58|n!5ba(|$0q)z52GX`B%CVfoMW`; zNruAn)f zGoaRQKdPWh6Qe`q{;?rOYYdYoULyq-0+Crsm>*S6+0l7~(m)gs6jfsg-%W<9rLetl zV+srm%px>|#Os2>K)Tfn6KF5q)=*M?<)UwGMa>gm*H`eBT*N4qm$AX?qbd02Gf9TQ z=X?NZ4>fjaak0NMmVHEJQB0O(6)TG6iHR_U%z)S@Ky=Lc-A#!4FgKeL};W4n?RM~llw&t~+wVE|# z{Z$~FceBsf(;jvRG=v*{C6tMr<1qwr)}C#sPX_pC4;iSi^sPe3G{d({c@U01%MHQl zVMFwTJDQ+1t6po})lCl8a7a75fSQ-WahKp=U=m?qAD%HJcX_ySfR=<2Y1aCB4HMe> z=5#4q64%e}_y777LH+eXXE*e%-{hff0&4@jc|QU9mKxm7QyebhtAecOajiv|)BjOnIzyERJtgiVtO zp-u&2UPj1ir2#q}!zm4$z+Ie_1Cr zBHekAEWd{)j+SLhDUK}-#7;{k;?>ZnXT^`T2Gg4nNm3Z=uD}jOMBmrgATnsTqQx#f(*Wz0)n+IS5bF&0Uk)RRIOTfaU z@672*5v`COXwr%`i5o%TlU;7_+{5VpNTpW{agPU$77_zWk?aSYnA>K z!edyLC&GpJhYOhoT=(WPT3^LQ-u!>{Qgm{8uSswHQU2<6q!j~QUZqd zawjKJVH!v5VY)GSOhX#WixlmwTP(4X@pn4S&IlKo z+hq%N-SqM*18pq{20s`mMT&OAtT+I>2tU5vlSUrtO|5P)(iy{rG(XzE1(e-2ETJxV zNh(sMibaP^_V7y6c2A0}Xj)PUrIO|<_V~nv`R)w+!jCup)=A?CNeZ>I-kB*NpRnzg z+y`?5qCsR7x_~Poj5VwU=7ovw6S;Q;r&O30M`m&m<-`@KNa9t=ge`uEV6Mp_FRF50 zkw$u7K&~xs{uQ2t>;%Wf*#}2(<3HF9)558J!!m&VzC|8I8cjV`2(Hmps-`MnNIH-% z1p+tPDrBQfbGcnfx~@L#Ry5ftz2#O~7|lKY*J}_+Qth~PU+aiviPFU^070_GN{)aR zH0_Tv8aWQ=(I=OzPVbvrtYkb*a50O$^jHP9?LP|nOIBnb4( z(k+&t!*Ac*wGbmALI0=xCb}V=S+^$N&4yZi8#3*J>ZJq6C%JorfKJaP-x7GGk)Ee9 z=mP)Kn5iblShVDx^97B7CHPV04utu20RcGws8V~Sifa7xHulLy-K>#@*RZf(HL+J! z=h5ozz!|Aoic8t4uZKG(;*#vC$~0sCIT0qReJMxpMZ_h(eTAbCt!DZ4L0!Wh$2xnk z-vtFLW8_A^%a_TAo9RSG&&ChpUpZPe%RQwVw7D*aR?Jhkwgz$L@S@WePOPegZjuIeT$BF>-8Z<7^SqAKjIAMQB!Vybm@*Q@0(0?Si^2&*?OF0Ai zd}ZXIQ>sf?j!|6;V*3l#>{a2f)>1zyC0fWVyS&HKWA_5@b;%F>CCV{rEjatwp8k?1 zO2b>ioruULKVpnLB#bqzE&mR=SIby}15W+n((xqZ;ql@mX?_YL-lKjt*T1eKkvxD^ z+DmnjNI{`k1uYH9Qd_XXQNG^ii4o&z>FQ?-)85q`TkvOJD*P2poAvkEVfoP|=XmN9 z<1C-Uho6HR4f)mSPh8~>CvSKXDkk@yH_ErSi%fFxe216{nxQ%WnjqSfzW~D15%5u; z3+i2%ahlR!yAkVAw>|v<5==ygY+dpZYyu1z=l!NIO;p*#o+`$vYB7oB@@PRxU_jNY zXy9(9t#0nL&b2SpNHVu@27sT{i%B065n_#IQmKVcxcF}7kKLn|R|sL55tHX*n^jD( z_jDcXSW!eYVL!0tcR29LvuWez0iHI7ogz~jfFX%k60&kZWv@GGaTWgsp|`C+VK{P4 zK+RZDW8tRR3y6SwOPl3+A0N`bFzPz7_GHqz@h+1KNTs+r`_gtlX|Iy=1z$uY7`YQ} zAQn6y!@>}D>B_UEDxS8{fk4?r9M2L^n}S~%@Ikejo=67Qi0Yy+TR2tf23j0?bE)B$ z0>(SAVYqzzp3@R(56S+%?_WxNw9|bdBSP^9l)O>VgS@MYesWNzTCAb>WB1AS+0xi# zH{Pdar~)@tGiU^4HQa|lko{+C{v0H`o9KD5`)9kOKg-Hhw%uE-it*Oi@#u?X)$n&M z_3W(etRJ2Bt{ytAX9~^n(Qf{y+-!OUiBKWt z(^2`OxwM;_Fm_0=3aobN3@h~#TV4cYCf~Dc|W5hY$w-eaP3?!5sRa*KCSKxHp@hdnI(YJ&T^P-O}&-H(FT%-qhXq9DF6=rgT>yx8Z5h0hAaYSi|fCSGfH6+Pgx9 zf$12e zStNz-AJR)Qillb7<~CB`U4lS8fcgBE#{hQt(FBr<(OaGUqrS3JUU$BB(toEm9und2 zp|+hnx%=$VqB)?~zW~I4{|wrJU0=hU#$06~3EJB{p*x^^J%ox|{0 zqzz%U6BgBs1u)1e|?Uag1lHF-)KI%1$5b18edE>sDO?~F-Ne*(FA_| z`NjlHbnr4eedTo26Gl|uMJeSl)HVh5Pi3vvmHYeDM3=ht^z@?`JnGGlelnf9Iyf4* zyuqK|0~5_8P8!%$vgSUGF^gi&@@<9f6g@7 zwNKN$YC^mhn!v&43Ol6)hEdj$mGoPfk~dW!VE-~2&4koF>8uOHIm50Tv^Tz5yoJ~< z$UZj>Rt$ry@SVRn3jU4FhrbRtNwDqQ-(SR1mn&FBJ3sHgzX+mGKaWV2)%P6mJ--7# zn$MfkrfZ#6gSu;;XV+$5q@xUjxwkBG^gm)CTVY6ly12b@Ifq7zU*H2FpUn~SGXD}V z8C!-VcLex#BL)(510>(euI$+3KeCC_cWd+A%5yJ7L03)Y+w8dJIT4!8z>DGsXr4ub zWH5K>x;(cs$C$=S`~DsTQyi4$V3~ZM>KETw9Wr>0bDrV1`%uEv_4MIX*i+0F84}&o-b!91w=i ztFdXf@ZL53%&#x})Cdy}_O{}qR?1Ivm%nZzQuTUISZ?CF-ZriZ3t@^18rFyZFa*9` zubp$jp|eKv*?DI$x*TQl&z$Q7$1u z!sb6Iq2tvz&)1IrFs6eLm0HE`mUL4Vhowy1YfS-|I?&ct1GelW-3qtysfr0^Hm1;{ zG)3}8q#?IZ3+>zP&1dZu7K*WWY&@oV!ZlE*9kU963KH+K1?{Dg%LfRUz%eYG|vRZ7{V z09ZOje^D6BXIMSv5FeA9s>Z*65H6udKh5@@=r3EoP=o!@HTOz`We;+tobBR)N=K^4_lxL~(oNv!-J~+d*1dRbjLz>-bGBunh0hr9p&|NZ z`PWIm=r4 zvdqK0Np2%qYq*K@IBHVr+Hc$rHnYr)IdF2I(XbC>aYse$^jVz7_+L~oES@{-Q~I0E zsuK=uAM$^zc?IYT96XDtj3%@cS{NOxe9_(1?uC z{fWPY;OiQQXnuRItd)cjF6j_=!^*y*#-GpPtWATjqqZpkQk20hhgCA^BY*vgo}*eO3fWIw!-T}#o5~kpPR3&j5y0`DWGuFY+F0LgnmA+n2dgowv?Oq~)udyou^9ktx=B5n)MT?11D~08a}cSD0JiAD{`Pg4vxsVjVZ=+9&PtIyf`!*} zxOFL3f-7Z>8M6JV)kgFfl={ne3kA2+QJhv^BMth6aJ#(#f}$5PH|=o! z?pA=`AHl^6r2`Jyt_*y2(M2WzDA9#OW?gd}J>TB9wz6N0-orDxQlm4S9hjHU)*3p6 zWYzCrbc7l5#8d-YCHa5KI)m^Z6KL`Cbmb*YQzD3mnchK$8lnDX&k_L z{mL=7oOPMg#EI~9@6r|~iQ?~lyvos#J5lbt*-nI98-Ul4#e)jyfJ~-7q6V(PMU?yX zeL#3N(uX%P zu+;iI)K(1{n<~ezrcdi(6k*U4I7YpsGI$g?Dt6R8Af(<66646H_f1)Oej^Kahny(R z^qkW^%*g72&`c>+`roA80f(d0RXS=$Qk%Q_f3qv&PQCAaL|5&IISq|YP^!CGG z@E2DB`lSv?uvYHh9Z*}mhrNiQ()c?pxhxI|M=R z?@2O|7k83GhZ1E{GkG_CL!CIyc*eAHiz?Rvds!~<=xjD2lJQRma&ECBc1k3=5i2F- z%x3#LkrRtRPPaF7zp{)p;v)9*8CSEDq#2^8vVgv|k#W`K#^O=EI2;Oc8T@(>Rlx-7 zP?&uGV{{xnNmw?>kC$Qf{#^FAWTAKE{-+Svr-F9Mbi{!AZ$*WM{XaAF-r`6@oodta z0HsE})nAAUp>#L!-rKmoyW?L%kOnWrqV`V3?lKOU7|Y<)z?vwDF74yfU1ugU{(Mn9 z9(*w4y1k2H%pu;!Mi^Mg z4|j#lN}(hLuC+qrps2v+MBrVeOY9~;cgaE^PIG@>z_SwM#>oFyVguLz5GFet>wgg@ zJ#a%3HL%c#gqR84nB~&);g8&|2WteDoz+SK1Q@rEbuvRViv%ryZT9DT-8roxD~B05 zXHtL)*GFZ`Ma_9e$9hBW(iC3e25@uB-w#imZm%mkGiqteF`c|V?o;ECqQ1hIT(8e7 zhf$!Gi#0`2?_x)OUGoV%;Ah{bnRyjU5xD(VTc_zAdtMllk^m5B1L6miGp+$bm;=#uXFN zb!4P&VRyZ8lR>VYd;w*m?2tomIjnjfD*}219vF zGrA(47Kf+8QYvRcbuVamVV5;)GLvmZ8cV#1L>J<&jU;&XKR|{+PFU9-1QtsYb!oXW zxwtR3995m6beFElmB+51UJgYZMJ#1i1%@=TS;U&gOwb@ee&Y!8?@YSaR9RJt)Le;- z4Za9iB(f&7Lv5)hl7pbDCZBu)LY7Z@S>$tVX0+i+k>t}-Lq-_xZv8g286%F@IHhe* zbx<&iDn!XYqlAcIjU#Lrfx=M#q+A4#HCE)o@9apX^uW3{)<3tiSp&4=yfC^+6$?f( z_k{aF)+@v7Wx~zUJw{Qhud^6%4`J=j{s;?zav+zx;LjoN#gZx93=M#BR8&uHY`(7$ zf+|uG(*#~Cd@YGo5^jAR4N|+Hu^eaosy%GEOKkRXN4(juRk%l3(ngWW#o(IC`RXch!p* zpH&h1JGiX8!C|?A!EU2Q9S8bd77>Zqi)c%5t)g$np@v~#^eLW%>Ag3U1J%<*nC$$m zu0^HR(Io+!#ZTl~4V(ZOwmTlP&|1wTk(*#Ud?U2UKocCd(0G}z&aE~lZ~i69x2!Y+ z!yX8qvo8d$z$5(r5^sCIVhK$bq(xm!NpvP{Xe~)Go zzoF3h@hD$G(gIV9pY=cCi%LChri`$RAo677#9{1GQ7-tD2B1Dm01W=eO|F)Z(u~c+ zww2flnl);V2&?x^f-Ek^h8=kKs1{1WpSVa583(~`9HB^l#G3hNgT*s2yMVky{DhuN zWHs2cm?mw{p*gt_+1uq)Ra3;Km7ug|Y~;`g^C0Tk?thpl%-t3uuYs;KAnM2@-1d$g zCEvzaJD=WO55NzE`zK9P3gSPc+?TK!F{?&pwNtVgdIf#=kIStpP=0^YosKA!B80S`=+RzTfXp13PyL z*D)yK)x^k*1*`<4QYL)d>Pqr! zGGkHN-^de-flVHOR%nMA@!hg%W3?*v7VHou)n`8S->y{%L3s=X=|YaAMyiGX$^$i3 z?A%hXuz`M`B6S%Rwr>A?WC8-ReBX7?cUKO_>l+iH<}%Vq=IGe%wVYSp3D@BV z0~ql2rVhOFZ;%)~p6WR`JRZu=lCJi%!)*Wk)RI-9V)+R~)N+yN2VU3KfFL3>Mq3`yV3D zo}yB|rQ@ul)6pwk_pJXXfzctnd!iCpA3-8OUvH=O*f8V#vF=e;cZ;`e$^_boJaXtq zbUo&WYghadVWZ+2j7Y6w*?rs)S7=Y4I+kBfA$WBoPo(ePbV6}&(K?a zu;^o0D7kjXv%a%y_Ukx-AsGQZpGOf3yKnK@#@hw7zQDqydZX$8oji&=W-=%gKET7t zyxKZ)Lb0_yW(!5f>6XSCRplh{e^24B}4kR3gfBRQ# zCx1Pd0@r@oKiOyo<(|VJs;u=_PA8P1*LRp>>G{P9ohh6nq994!4gK@9BPZusrt0y7cX#;qr=Ex=f6sEt_Uv|vubO#cr z#__8J;`jB3O$CzccUvOujyiJJ^lmPa?HGE)M0=+c%d4F$J~h7+h9?oOG~2bjH<5<9 zv^|=^W0-M854dy6YVEh3&z$Bdv&Q!}eLPdTvm#7ev@Ml&&@BJ~X=RB}WOwipsn+T{ zaa?>=u!I_St(VMX;%k&T3bDFDq* z71pcS_={hs$HEJ=X%i7}g|*rJ8y8wx+GJ2XZMmYSHMJZ-w1Fe zTRlOB)ogY-rmP82Q&XIvZ4*}IfyYg%6q#~$Wyec`7fZ??0>A$or1qhriAjV!_Qf4N z`0Xty63Tue~Cf%~Km%!g4G4+W6bKu*3W_KJcFzfEZS zt2#&U4R}fJQkKI@W9rK(Z(oZQKq}s#6%;^38FkBJW}5N(Nq-Wi6rrh=oX<}hx6%M? zYg+SiW?6vt3&sRtoFu}!+U|DV zaHwI z_f1bDMi$(yQ!)yG*-}=O!_;^K)TLS&Q2U?pR`TD9xIp zCffs1KKM!jPVrxTYroO%H&Gfm3Z(J~2<7hC3?sON4s1U*w-c_bA3=1+Zw047@7|P@ zp!!huT=4d?D2J@c@E5W1*$9qhCmQ9I5x^OJ9eziPPUPZxogja`nS%u0;LU&F{aenx>{!*HU}T1-<3dW>eIIQ- zm{pt!tquL~_{#76{x;)cKoIPCbqC+!X16ey0_UXfePa!Zzo+gXdSOPR+Dq8Faxn<; z`DIqJj@i&h!Kqd`&F~pW@!AR_!tiS2gF1S?^pD!?aZ|+lQlpp~# zV!MlaIEs3hmk(XHB8~v^_J8{F5(U)diN!Jw;3QuZL!%OL+}>l}itRqIM*5^PROYAN zG_E$Zy;@Pd+uj7Q4(st)tg)U+vM&R>lVO%Gx%ff-HUm&}vp12CmHZKf_#;Oym}f(L z#Ip{NDunh>j^L6a9}o-5H!F4uKlx9L3O_ycM^rKjzm8>%r1lxCBKrP*bjixDSTcKD zaWD(PjxhH#w_H`phKS4jv)d-A>#65g8}47ZE57k@&s!oOgGp%L{6e#!`ZR)eZ1{#K z*#?Kp3_<{)XP$xs;Qy;M5E`7Do8!OYc^V+DLd!w>RsX>6j&p^TYUy(~w?CFG`JM}w zls=1uDTI&o>zcH3j5JqzFDw5sDFOt#dNyqMQd3D#0U{tHSOiy!J=QNDTJz^GR|hpa zeM-&wQNKxPN3QQW>3$htVwj*0YqfpQyz2Zp+;d6<{y%J;V|Qjzprm8lwr$(CZQFih z+v?ct*jC53Z95%I-?^CkVSd6{>!42Ur>gK)uL3qGmC=^QB6_0D=JMG=03_|{W!+~6 zxWf=t_qjFl@=T-^{&#zjA>B%bR7wh9x?sT zcwHZxN!QQlHB`Bb(rdW=0UYkTml&8=FI7|`S!7*3O2#Odq1y0e4vK-l%IIW(?EJB_ z8|%9;+7(T(mwHOGFvR4L>>9ko`M?PH3Ag7ABLZZJQSMw4Fd9V$3D_FlJEwvOzG#su zV?zqORmPCo5;Ytn2oT8K5dE~}GYyV}pGbcizcu+Fs01Ll?ATU5!asJ?H zQK2d^eaSue$b%{(vcNz{@Dv2KE6ewVj7%fh{E0{6^MKRi-Mp6XjlpLZDlAEZK@AUw(-AGz1yFHZ?$DM8*L4H=F2og%Mp+mqI;{^%=|>y6AQU+Sjy%e_sj)Lieic$yHNZFG2U~ai zS;K35Kau+Er)!+2Tz*-OjnCM^6R(#tWm-yT58SJYZR*YHH-Kra1zxcjx^SzgbU1hX z6ICuMZZWHeb*k?A(jzn0&VHKMr<&@m)7r~|D;L_t_5)rOtllU~!nA9CBj{0edh|!{ zwL3jEKHY(B;l2G>N{wNVO*1E+OqVy=&JCWpn2Z-Wf(9ZxurYzSzzirPb+955TAjcD zI!NeYhIu|-1pxHLR*-<>{u+cHd5FLuuP?xUX#7gqfQ!=GQ`)AIYNdb~=GJco%Y{42>;Tb-K-{OKiwT z;y3GZSpq~G?J$d#1HP2-RZ`ZND6J|;Y=bqA*^T#fH~^NyQ*lEdxfQRG1pDM{_v9ru zJye6dzmyOnWF=uQg?hlecRlvoJF{Xsq-12_OoTb??;!?tL!_87mcx7!$>!skMfLWi2*hq%cKibVIVPIL7g7wkfJwP!9%bO*gP-;ILzXs_zhRwzwXU43nF7O* zJeTd87QmqH%xCRAI0>WLt2WAOz)y0{*$VLpy$vOw4xto_)3ps}MUNA(((+W9?DGp zsKdF@R?}!L>1G(HkUCf@9R$PXVEUnLG6BfzVYqVuAF4mQJYY%T>2-+N zA=Pf!pE?YYKRAS`XhU~1gV6hTv0?T6Evnwj_DBFTEKTGpU1*b>g{l|B^JAS0oJcxn zF@O$P%;t;hz`uX8Do*qG4EMxmWY3|~qV$N;pMjb4OX;uMqO~=_=cX!a6O;yCCdFoU z;qULjA#^d3E;3bLg}Gi_4*8wE>4mp`?%?-`2EmIMne45bk}Q*(Ons^K=p+||lDymDR3N-cB0Sc{et?QCO}PA zE&EWa2c0f9jM#BoV^7xLi3{zZ?$wh5;e4>hrrk|)P;{}fT!C4Ow}TYdaz>ep5FG_Z zz+|hSUUMa)-*UBmnoy&@nGJH&jO;iWZht-6Alxq_qx^%-EyUizPRng;?MErD2=grcis~EdC}^Tbq$<)g5>K}L5_UScBy_KO1}#;V=Am$)IX^ItMA30B$ngVsD{yv3w2wv z(S~}ykH6z2OD%|y_8j%52rw`Ot?TObg6J+DRtwjBz5m%mA%=NU^0eHlgM+{L#36}g zrv1o%d3mfeed}y^bANRX20OrD!{tPutS`&ciBU}a-h0;i5D@kW@+Q6Q3%TzssSRW& z+!Oax5YJh6;WeCr&brIWgR?ml7Oa+}p_U51Y=9BCcQiuFp*PzY3_v#>!ZFr7n$Wfg z4SCrz_FV}wrHtvFp6gW61#`SyP%z6@wJeZm*ZLr+IK!ZW3oRQ1ZzIi^?w7xISuEzL zTXCrf39=n*v-Zz+wPw)2B(citFleNL2U8z%>C3fK6Fl`#78D5SzgX#r^CW>{KW{@1KYCkA-R1-H z--b`=IckY(-+{?2rtc}*leV@gDH-2>{gZ=G11Ja@Bu@as|m<_m69ZU5r0c3H}dLYO50L3byVcMZ^ z3AIEVIbDuY$zlp$I$W?WWA;0V3xHb8xG!q0;>7n{iuv6#0M&V$x=0b(*nXMVK+d+d z>Jdh!=^sGPF|^@qcoe%cTWB*>>_LL1{rDIxxXo^Kk9><+JLHJV!hmOdd_J7nb+lq_jQ(03Wtq=!#`W>jgQp2R(C^}LBCL$0PdV__TkFB?lWPgcd(suu}Sk5 zNni*FU6>A1UN$Y4qBogX(l8z!Zk&4R>ep4WeEW=U=(q#A&nOO?+SV%QG!UiNGSZtg z;YwX#5R&{hCl9+j4#BC|2 z>oKjy1#~KL`3;}iG#Sipxx@uGS2%ZIObaLsiPbIqsT$=1%-vp0V+iBOvuqG$g=(|u z8&f=E`oE!3{{dd+ho9h5TereXtQKxm|FF37FZ#r&USL)z<>q{bs^gh1URnYzIP#le z4_+j>Yj}s>7Qqx*+!EC9Xyvav@ZkR)l#t|!s-^XVbU`TY�Qy`(*0c*LZ_GLojBb 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 diff --git a/lib/colvars/Makefile.32-bit b/lib/colvars/Makefile.32-bit index 62c6e2dcd9..8a5859ed1c 100644 --- a/lib/colvars/Makefile.32-bit +++ b/lib/colvars/Makefile.32-bit @@ -13,10 +13,12 @@ SHELL = /bin/sh # ------ DEFINITIONS ------ -SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias.cpp colvarbias_meta.cpp \ - colvar.cpp colvarcomp_angles.cpp colvarcomp.cpp colvarcomp_coordnums.cpp \ - colvarcomp_distances.cpp colvarcomp_protein.cpp colvarcomp_rotations.cpp \ - colvargrid.cpp colvarmodule.cpp colvarparse.cpp colvarvalue.cpp colvarbias_alb.cpp +SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias_alb.cpp colvarbias.cpp \ + colvarbias_meta.cpp colvarbias_restraint.cpp colvarcomp_angles.cpp \ + colvarcomp_coordnums.cpp colvarcomp.cpp colvarcomp_distances.cpp \ + colvarcomp_protein.cpp colvarcomp_rotations.cpp colvar.cpp colvargrid.cpp \ + colvarmodule.cpp colvarparse.cpp colvarscript.cpp colvartypes.cpp \ + colvarvalue.cpp DIR = Obj_32-bit/ LIB = $(DIR)libcolvars.a @@ -50,34 +52,30 @@ $(DIR)%.o: %.cpp # ------ DEPENDENCIES ------ # -$(DIR)colvars_main.o: colvars_main.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarproxy_standalone.h colvaratoms.h colvarparse.h colvarvalue.h -$(DIR)colvarproxy_standalone.o: colvarproxy_standalone.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvaratoms.h colvarparse.h colvarvalue.h \ - colvarproxy_standalone.h $(DIR)colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarparse.h colvarvalue.h colvaratoms.h $(DIR)colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarbias_abf.h \ colvarbias.h colvargrid.h $(DIR)colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvar.h colvarvalue.h colvarparse.h colvarbias_alb.h \ - colvarbias.h + colvarproxy.h colvarbias_alb.h colvar.h colvarvalue.h colvarparse.h \ + colvarbias_restraint.h colvarbias.h $(DIR)colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarbias.h colvar.h colvarparse.h $(DIR)colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h \ colvarbias_meta.h colvarbias.h colvargrid.h -$(DIR)colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h +$(DIR)colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ + colvarbias.h colvar.h colvarparse.h $(DIR)colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarcomp.h \ colvaratoms.h -$(DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h $(DIR)colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarparse.h colvarvalue.h colvaratoms.h \ colvar.h colvarcomp.h +$(DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h $(DIR)colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ colvarcomp.h colvaratoms.h @@ -87,14 +85,22 @@ $(DIR)colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h $(DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ colvarcomp.h colvaratoms.h +$(DIR)colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h $(DIR)colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ colvargrid.h -$(DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarparse.h colvarvalue.h colvar.h colvarbias.h colvarbias_meta.h \ - colvargrid.h colvarbias_abf.h colvarbias_alb.h +$(DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ + colvarproxy.h colvarparse.h colvarvalue.h colvar.h colvarbias.h \ + colvarbias_alb.h colvarbias_restraint.h colvarbias_meta.h colvargrid.h \ + colvarbias_abf.h $(DIR)colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h +$(DIR)colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ + colvarbias.h +$(DIR)colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarparse.h colvarvalue.h $(DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h diff --git a/lib/colvars/Makefile.fermi b/lib/colvars/Makefile.fermi index efd0018f21..c2fae557f3 100644 --- a/lib/colvars/Makefile.fermi +++ b/lib/colvars/Makefile.fermi @@ -15,10 +15,12 @@ SHELL = /bin/sh # ------ DEFINITIONS ------ -SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias.cpp colvarbias_meta.cpp \ - colvar.cpp colvarcomp_angles.cpp colvarcomp.cpp colvarcomp_coordnums.cpp \ - colvarcomp_distances.cpp colvarcomp_protein.cpp colvarcomp_rotations.cpp \ - colvargrid.cpp colvarmodule.cpp colvarparse.cpp colvarvalue.cpp colvarbias_alb.cpp +SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias_alb.cpp colvarbias.cpp \ + colvarbias_meta.cpp colvarbias_restraint.cpp colvarcomp_angles.cpp \ + colvarcomp_coordnums.cpp colvarcomp.cpp colvarcomp_distances.cpp \ + colvarcomp_protein.cpp colvarcomp_rotations.cpp colvar.cpp colvargrid.cpp \ + colvarmodule.cpp colvarparse.cpp colvarscript.cpp colvartypes.cpp \ + colvarvalue.cpp LIB = libcolvars.a OBJ = $(SRC:.cpp=.o) @@ -51,34 +53,30 @@ colvars_standalone: colvars_main.o colvarproxy_standalone.o $(LIB) # ------ DEPENDENCIES ------ # -colvars_main.o: colvars_main.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarproxy_standalone.h colvaratoms.h colvarparse.h colvarvalue.h -colvarproxy_standalone.o: colvarproxy_standalone.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvaratoms.h colvarparse.h colvarvalue.h \ - colvarproxy_standalone.h colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarparse.h colvarvalue.h colvaratoms.h colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarbias_abf.h \ colvarbias.h colvargrid.h colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvar.h colvarvalue.h colvarparse.h colvarbias_alb.h \ - colvarbias.h + colvarproxy.h colvarbias_alb.h colvar.h colvarvalue.h colvarparse.h \ + colvarbias_restraint.h colvarbias.h colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarbias.h colvar.h colvarparse.h colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h \ colvarbias_meta.h colvarbias.h colvargrid.h -colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h +colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ + colvarbias.h colvar.h colvarparse.h colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarcomp.h \ colvaratoms.h -colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarparse.h colvarvalue.h colvaratoms.h \ colvar.h colvarcomp.h +colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ colvarcomp.h colvaratoms.h @@ -88,14 +86,22 @@ colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h \ colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ colvarcomp.h colvaratoms.h +colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ colvargrid.h -colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarparse.h colvarvalue.h colvar.h colvarbias.h colvarbias_meta.h \ - colvargrid.h colvarbias_abf.h colvarbias_alb.h +colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ + colvarproxy.h colvarparse.h colvarvalue.h colvar.h colvarbias.h \ + colvarbias_alb.h colvarbias_restraint.h colvarbias_meta.h colvargrid.h \ + colvarbias_abf.h colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h +colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ + colvarbias.h +colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarparse.h colvarvalue.h colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h diff --git a/lib/colvars/Makefile.g++ b/lib/colvars/Makefile.g++ index 80422be3a3..ffdbeaf19b 100644 --- a/lib/colvars/Makefile.g++ +++ b/lib/colvars/Makefile.g++ @@ -14,10 +14,12 @@ SHELL = /bin/sh # ------ DEFINITIONS ------ -SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias.cpp colvarbias_meta.cpp \ - colvar.cpp colvarcomp_angles.cpp colvarcomp.cpp colvarcomp_coordnums.cpp \ - colvarcomp_distances.cpp colvarcomp_protein.cpp colvarcomp_rotations.cpp \ - colvargrid.cpp colvarmodule.cpp colvarparse.cpp colvarvalue.cpp colvarbias_alb.cpp +SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias_alb.cpp colvarbias.cpp \ + colvarbias_meta.cpp colvarbias_restraint.cpp colvarcomp_angles.cpp \ + colvarcomp_coordnums.cpp colvarcomp.cpp colvarcomp_distances.cpp \ + colvarcomp_protein.cpp colvarcomp_rotations.cpp colvar.cpp colvargrid.cpp \ + colvarmodule.cpp colvarparse.cpp colvarscript.cpp colvartypes.cpp \ + colvarvalue.cpp LIB = libcolvars.a OBJ = $(SRC:.cpp=.o) @@ -50,34 +52,30 @@ colvars_standalone: colvars_main.o colvarproxy_standalone.o $(LIB) # ------ DEPENDENCIES ------ # -colvars_main.o: colvars_main.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarproxy_standalone.h colvaratoms.h colvarparse.h colvarvalue.h -colvarproxy_standalone.o: colvarproxy_standalone.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvaratoms.h colvarparse.h colvarvalue.h \ - colvarproxy_standalone.h colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarparse.h colvarvalue.h colvaratoms.h colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarbias_abf.h \ colvarbias.h colvargrid.h colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvar.h colvarvalue.h colvarparse.h colvarbias_alb.h \ - colvarbias.h + colvarproxy.h colvarbias_alb.h colvar.h colvarvalue.h colvarparse.h \ + colvarbias_restraint.h colvarbias.h colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarbias.h colvar.h colvarparse.h colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h \ colvarbias_meta.h colvarbias.h colvargrid.h -colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h +colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ + colvarbias.h colvar.h colvarparse.h colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarcomp.h \ colvaratoms.h -colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarparse.h colvarvalue.h colvaratoms.h \ colvar.h colvarcomp.h +colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ colvarcomp.h colvaratoms.h @@ -87,14 +85,22 @@ colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h \ colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ colvarcomp.h colvaratoms.h +colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ colvargrid.h -colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarparse.h colvarvalue.h colvar.h colvarbias.h colvarbias_meta.h \ - colvargrid.h colvarbias_abf.h colvarbias_alb.h +colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ + colvarproxy.h colvarparse.h colvarvalue.h colvar.h colvarbias.h \ + colvarbias_alb.h colvarbias_restraint.h colvarbias_meta.h colvargrid.h \ + colvarbias_abf.h colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h +colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ + colvarbias.h +colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarparse.h colvarvalue.h colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h diff --git a/lib/colvars/Makefile.mingw32-cross b/lib/colvars/Makefile.mingw32-cross index a137fbbf84..d11465dacb 100644 --- a/lib/colvars/Makefile.mingw32-cross +++ b/lib/colvars/Makefile.mingw32-cross @@ -17,10 +17,12 @@ SHELL = /bin/sh # ------ DEFINITIONS ------ -SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias.cpp colvarbias_meta.cpp \ - colvar.cpp colvarcomp_angles.cpp colvarcomp.cpp colvarcomp_coordnums.cpp \ - colvarcomp_distances.cpp colvarcomp_protein.cpp colvarcomp_rotations.cpp \ - colvargrid.cpp colvarmodule.cpp colvarparse.cpp colvarvalue.cpp colvarbias_alb.cpp +SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias_alb.cpp colvarbias.cpp \ + colvarbias_meta.cpp colvarbias_restraint.cpp colvarcomp_angles.cpp \ + colvarcomp_coordnums.cpp colvarcomp.cpp colvarcomp_distances.cpp \ + colvarcomp_protein.cpp colvarcomp_rotations.cpp colvar.cpp colvargrid.cpp \ + colvarmodule.cpp colvarparse.cpp colvarscript.cpp colvartypes.cpp \ + colvarvalue.cpp DIR = Obj_mingw32/ LIB = $(DIR)libcolvars.a @@ -58,34 +60,30 @@ $(DIR)%.o: %.cpp # ------ DEPENDENCIES ------ # -$(DIR)colvars_main.o: colvars_main.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarproxy_standalone.h colvaratoms.h colvarparse.h colvarvalue.h -$(DIR)colvarproxy_standalone.o: colvarproxy_standalone.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvaratoms.h colvarparse.h colvarvalue.h \ - colvarproxy_standalone.h $(DIR)colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarparse.h colvarvalue.h colvaratoms.h $(DIR)colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarbias_abf.h \ colvarbias.h colvargrid.h $(DIR)colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvar.h colvarvalue.h colvarparse.h colvarbias_alb.h \ - colvarbias.h + colvarproxy.h colvarbias_alb.h colvar.h colvarvalue.h colvarparse.h \ + colvarbias_restraint.h colvarbias.h $(DIR)colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarbias.h colvar.h colvarparse.h $(DIR)colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h \ colvarbias_meta.h colvarbias.h colvargrid.h -$(DIR)colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h +$(DIR)colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ + colvarbias.h colvar.h colvarparse.h $(DIR)colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarcomp.h \ colvaratoms.h -$(DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h $(DIR)colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarparse.h colvarvalue.h colvaratoms.h \ colvar.h colvarcomp.h +$(DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h $(DIR)colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ colvarcomp.h colvaratoms.h @@ -95,14 +93,22 @@ $(DIR)colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h $(DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ colvarcomp.h colvaratoms.h +$(DIR)colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h $(DIR)colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ colvargrid.h -$(DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarparse.h colvarvalue.h colvar.h colvarbias.h colvarbias_meta.h \ - colvargrid.h colvarbias_abf.h colvarbias_alb.h +$(DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ + colvarproxy.h colvarparse.h colvarvalue.h colvar.h colvarbias.h \ + colvarbias_alb.h colvarbias_restraint.h colvarbias_meta.h colvargrid.h \ + colvarbias_abf.h $(DIR)colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h +$(DIR)colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ + colvarbias.h +$(DIR)colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarparse.h colvarvalue.h $(DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h diff --git a/lib/colvars/Makefile.mingw64-cross b/lib/colvars/Makefile.mingw64-cross index 6547d3b183..09a30ddb1a 100644 --- a/lib/colvars/Makefile.mingw64-cross +++ b/lib/colvars/Makefile.mingw64-cross @@ -17,10 +17,12 @@ SHELL = /bin/sh # ------ DEFINITIONS ------ -SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias.cpp colvarbias_meta.cpp \ - colvar.cpp colvarcomp_angles.cpp colvarcomp.cpp colvarcomp_coordnums.cpp \ - colvarcomp_distances.cpp colvarcomp_protein.cpp colvarcomp_rotations.cpp \ - colvargrid.cpp colvarmodule.cpp colvarparse.cpp colvarvalue.cpp colvarbias_alb.cpp +SRC = colvaratoms.cpp colvarbias_abf.cpp colvarbias_alb.cpp colvarbias.cpp \ + colvarbias_meta.cpp colvarbias_restraint.cpp colvarcomp_angles.cpp \ + colvarcomp_coordnums.cpp colvarcomp.cpp colvarcomp_distances.cpp \ + colvarcomp_protein.cpp colvarcomp_rotations.cpp colvar.cpp colvargrid.cpp \ + colvarmodule.cpp colvarparse.cpp colvarscript.cpp colvartypes.cpp \ + colvarvalue.cpp DIR = Obj_mingw64/ LIB = $(DIR)libcolvars.a @@ -57,34 +59,30 @@ $(DIR)%.o: %.cpp # ------ DEPENDENCIES ------ # -$(DIR)colvars_main.o: colvars_main.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarproxy_standalone.h colvaratoms.h colvarparse.h colvarvalue.h -$(DIR)colvarproxy_standalone.o: colvarproxy_standalone.cpp colvarmodule.h \ - colvartypes.h colvarproxy.h colvaratoms.h colvarparse.h colvarvalue.h \ - colvarproxy_standalone.h $(DIR)colvaratoms.o: colvaratoms.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarparse.h colvarvalue.h colvaratoms.h $(DIR)colvarbias_abf.o: colvarbias_abf.cpp colvarmodule.h colvartypes.h \ colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarbias_abf.h \ colvarbias.h colvargrid.h $(DIR)colvarbias_alb.o: colvarbias_alb.cpp colvarmodule.h colvartypes.h \ - colvar.h colvarvalue.h colvarparse.h colvarbias_alb.h \ - colvarbias.h + colvarproxy.h colvarbias_alb.h colvar.h colvarvalue.h colvarparse.h \ + colvarbias_restraint.h colvarbias.h $(DIR)colvarbias.o: colvarbias.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarbias.h colvar.h colvarparse.h $(DIR)colvarbias_meta.o: colvarbias_meta.cpp colvar.h colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h \ colvarbias_meta.h colvarbias.h colvargrid.h -$(DIR)colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h +$(DIR)colvarbias_restraint.o: colvarbias_restraint.cpp colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvarbias_restraint.h \ + colvarbias.h colvar.h colvarparse.h $(DIR)colvarcomp_angles.o: colvarcomp_angles.cpp colvarmodule.h colvartypes.h \ colvarproxy.h colvar.h colvarvalue.h colvarparse.h colvarcomp.h \ colvaratoms.h -$(DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h $(DIR)colvarcomp_coordnums.o: colvarcomp_coordnums.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarparse.h colvarvalue.h colvaratoms.h \ colvar.h colvarcomp.h +$(DIR)colvarcomp.o: colvarcomp.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvar.h colvarparse.h colvarcomp.h colvaratoms.h $(DIR)colvarcomp_distances.o: colvarcomp_distances.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ colvarcomp.h colvaratoms.h @@ -94,14 +92,22 @@ $(DIR)colvarcomp_protein.o: colvarcomp_protein.cpp colvarmodule.h colvartypes.h $(DIR)colvarcomp_rotations.o: colvarcomp_rotations.cpp colvarmodule.h \ colvartypes.h colvarproxy.h colvarvalue.h colvarparse.h colvar.h \ colvarcomp.h colvaratoms.h +$(DIR)colvar.o: colvar.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h $(DIR)colvargrid.o: colvargrid.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h colvar.h colvarcomp.h colvaratoms.h \ colvargrid.h -$(DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h colvarproxy.h \ - colvarparse.h colvarvalue.h colvar.h colvarbias.h colvarbias_meta.h \ - colvargrid.h colvarbias_abf.h colvarbias_alb.h +$(DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h colvartypes.h \ + colvarproxy.h colvarparse.h colvarvalue.h colvar.h colvarbias.h \ + colvarbias_alb.h colvarbias_restraint.h colvarbias_meta.h colvargrid.h \ + colvarbias_abf.h $(DIR)colvarparse.o: colvarparse.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h colvarparse.h +$(DIR)colvarscript.o: colvarscript.cpp colvarscript.h colvarmodule.h \ + colvartypes.h colvarproxy.h colvarvalue.h colvar.h colvarparse.h \ + colvarbias.h +$(DIR)colvartypes.o: colvartypes.cpp colvarmodule.h colvartypes.h colvarproxy.h \ + colvarparse.h colvarvalue.h $(DIR)colvarvalue.o: colvarvalue.cpp colvarmodule.h colvartypes.h colvarproxy.h \ colvarvalue.h diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index 8838f55442..b47ef947cb 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -1,4 +1,4 @@ -// -*- c++ -*- +/// -*- c++ -*- #include "colvarmodule.h" #include "colvarvalue.h" @@ -13,21 +13,20 @@ colvar::colvar (std::string const &conf) { + size_t i; cvm::log ("Initializing a new collective variable.\n"); get_keyval (conf, "name", this->name, (std::string ("colvar")+cvm::to_str (cvm::colvars.size()+1))); - for (std::vector::iterator cvi = cvm::colvars.begin(); - cvi < cvm::colvars.end(); - cvi++) { - if ((*cvi)->name == this->name) - cvm::fatal_error ("Error: this colvar cannot have the same name, \""+this->name+ - "\", as another colvar.\n"); + if (cvm::colvar_by_name (this->name) != NULL) { + cvm::error ("Error: this colvar cannot have the same name, \""+this->name+ + "\", as another colvar.\n", + INPUT_ERROR); } // all tasks disabled by default - for (size_t i = 0; i < task_ntot; i++) { + for (i = 0; i < task_ntot; i++) { tasks[i] = false; } @@ -57,19 +56,21 @@ colvar::colvar (std::string const &conf) cvcp->check_keywords (def_conf, def_config_key); \ cvm::decrease_depth(); \ } else { \ - cvm::fatal_error ("Error: in allocating component \"" \ - def_config_key"\".\n"); \ + cvm::error ("Error: in allocating component \"" \ + def_config_key"\".\n", \ + MEMORY_ERROR); \ } \ if ( (cvcp->period != 0.0) || (cvcp->wrap_center != 0.0) ) { \ if ( (cvcp->function_type != std::string ("distance_z")) && \ (cvcp->function_type != std::string ("dihedral")) && \ (cvcp->function_type != std::string ("spin_angle")) ) { \ - cvm::fatal_error ("Error: invalid use of period and/or " \ + cvm::error ("Error: invalid use of period and/or " \ "wrapAround in a \""+ \ std::string (def_config_key)+ \ "\" component.\n"+ \ "Period: "+cvm::to_str(cvcp->period) + \ - " wrapAround: "+cvm::to_str(cvcp->wrap_center));\ + " wrapAround: "+cvm::to_str(cvcp->wrap_center), \ + INPUT_ERROR); \ } \ } \ if ( ! cvcs.back()->name.size()) \ @@ -120,6 +121,8 @@ colvar::colvar (std::string const &conf) initialize_components ("orientation", "orientation", orientation); initialize_components ("orientation " "angle", "orientationAngle",orientation_angle); + initialize_components ("orientation " + "projection", "orientationProj",orientation_proj); initialize_components ("tilt", "tilt", tilt); initialize_components ("spin angle", "spinAngle", spin_angle); @@ -135,9 +138,11 @@ colvar::colvar (std::string const &conf) "inertiaZ", inertia_z); initialize_components ("eigenvector", "eigenvector", eigenvector); - if (!cvcs.size()) - cvm::fatal_error ("Error: no valid components were provided " - "for this collective variable.\n"); + if (!cvcs.size()) { + cvm::error ("Error: no valid components were provided " + "for this collective variable.\n", + INPUT_ERROR); + } cvm::log ("All components initialized.\n"); @@ -165,7 +170,7 @@ colvar::colvar (std::string const &conf) } // check the available features of each cvc - for (size_t i = 0; i < cvcs.size(); i++) { + for (i = 0; i < cvcs.size(); i++) { if ((cvcs[i])->b_debug_gradients) enable (task_gradients); @@ -200,7 +205,7 @@ colvar::colvar (std::string const &conf) for (size_t j = i; j < cvcs.size(); j++) { if ( (cvcs[i])->type() != (cvcs[j])->type() ) { - cvm::fatal_error ("ERROR: you are definining this collective variable " + cvm::log ("ERROR: you are definining this collective variable " "by using components of different types, \""+ colvarvalue::type_desc[(cvcs[i])->type()]+ "\" and \""+ @@ -208,6 +213,7 @@ colvar::colvar (std::string const &conf) "\". " "You must use the same type in order to " " sum them together.\n"); + cvm::set_error_bits(INPUT_ERROR); } } } @@ -225,8 +231,9 @@ colvar::colvar (std::string const &conf) } get_keyval (conf, "width", width, 1.0); - if (width <= 0.0) - cvm::fatal_error ("Error: \"width\" must be positive.\n"); + if (width <= 0.0) { + cvm::error("Error: \"width\" must be positive.\n", INPUT_ERROR); + } lower_boundary.type (this->type()); lower_wall.type (this->type()); @@ -267,19 +274,21 @@ colvar::colvar (std::string const &conf) // consistency checks for boundaries and walls if (tasks[task_lower_boundary] && tasks[task_upper_boundary]) { if (lower_boundary >= upper_boundary) { - cvm::fatal_error ("Error: the upper boundary, "+ + cvm::error ("Error: the upper boundary, "+ cvm::to_str (upper_boundary)+ ", is not higher than the lower boundary, "+ - cvm::to_str (lower_boundary)+".\n"); + cvm::to_str (lower_boundary)+".\n", + INPUT_ERROR); } } if (tasks[task_lower_wall] && tasks[task_upper_wall]) { if (lower_wall >= upper_wall) { - cvm::fatal_error ("Error: the upper wall, "+ + cvm::error ("Error: the upper wall, "+ cvm::to_str (upper_wall)+ ", is not higher than the lower wall, "+ - cvm::to_str (lower_wall)+".\n"); + cvm::to_str (lower_wall)+".\n", + INPUT_ERROR); } if (dist2 (lower_wall, upper_wall) < 1.0E-12) { @@ -292,14 +301,16 @@ colvar::colvar (std::string const &conf) get_keyval (conf, "expandBoundaries", expand_boundaries, false); if (expand_boundaries && periodic_boundaries()) { - cvm::fatal_error ("Error: trying to expand boundaries that already " - "cover a whole period of a periodic colvar.\n"); + cvm::error ("Error: trying to expand boundaries that already " + "cover a whole period of a periodic colvar.\n", + INPUT_ERROR); } if (expand_boundaries && hard_lower_boundary && hard_upper_boundary) { - cvm::fatal_error ("Error: inconsistent configuration " + cvm::error ("Error: inconsistent configuration " "(trying to expand boundaries with both " - "hardLowerBoundary and hardUpperBoundary enabled).\n"); - } + "hardLowerBoundary and hardUpperBoundary enabled).\n", + INPUT_ERROR); +} { bool b_extended_lagrangian; @@ -320,21 +331,24 @@ colvar::colvar (std::string const &conf) const bool found = get_keyval (conf, "extendedTemp", temp, cvm::temperature()); if (temp <= 0.0) { if (found) - cvm::fatal_error ("Error: \"extendedTemp\" must be positive.\n"); + cvm::log ("Error: \"extendedTemp\" must be positive.\n"); else - cvm::fatal_error ("Error: a positive temperature must be provided, either " - "by enabling a thermostat, or through \"extendedTemp\".\n"); + cvm::error ("Error: a positive temperature must be provided, either " + "by enabling a thermostat, or through \"extendedTemp\".\n", + INPUT_ERROR); } - get_keyval (conf, "extendedFluctuation", tolerance, width); - if (tolerance <= 0.0) - cvm::fatal_error ("Error: \"extendedFluctuation\" must be positive.\n"); + get_keyval (conf, "extendedFluctuation", tolerance); + if (tolerance <= 0.0) { + cvm::error("Error: \"extendedFluctuation\" must be positive.\n", INPUT_ERROR); + } ext_force_k = cvm::boltzmann() * temp / (tolerance * tolerance); cvm::log ("Computed extended system force constant: " + cvm::to_str(ext_force_k) + " kcal/mol/U^2"); get_keyval (conf, "extendedTimeConstant", period, 200.0); - if (period <= 0.0) - cvm::fatal_error ("Error: \"extendedTimeConstant\" must be positive.\n"); + if (period <= 0.0) { + cvm::error("Error: \"extendedTimeConstant\" must be positive.\n", INPUT_ERROR); + } ext_mass = (cvm::boltzmann() * temp * period * period) / (4.0 * PI * PI * tolerance * tolerance); cvm::log ("Computed fictitious mass: " + cvm::to_str(ext_mass) + " kcal/mol/(U/fs)^2 (U: colvar unit)"); @@ -348,8 +362,9 @@ colvar::colvar (std::string const &conf) } get_keyval (conf, "extendedLangevinDamping", ext_gamma, 1.0); - if (ext_gamma < 0.0) - cvm::fatal_error ("Error: \"extendedLangevinDamping\" may not be negative.\n"); + if (ext_gamma < 0.0) { + cvm::error("Error: \"extendedLangevinDamping\" may not be negative.\n", INPUT_ERROR); + } if (ext_gamma != 0.0) { enable (task_langevin); ext_gamma *= 1.0e-3; // convert from ps-1 to fs-1 @@ -414,7 +429,15 @@ void colvar::build_atom_list (void) temp_id_list.sort(); temp_id_list.unique(); - atom_ids = std::vector (temp_id_list.begin(), temp_id_list.end()); + + // atom_ids = std::vector (temp_id_list.begin(), temp_id_list.end()); + unsigned int id_i = 0; + std::list::iterator li; + for (li = temp_id_list.begin(); li != temp_id_list.end(); ++li) { + atom_ids[id_i] = *li; + id_i++; + } + temp_id_list.clear(); atomic_gradients.resize (atom_ids.size()); @@ -427,7 +450,7 @@ void colvar::build_atom_list (void) } -void colvar::parse_analysis (std::string const &conf) +int colvar::parse_analysis (std::string const &conf) { // if (cvm::debug()) @@ -443,8 +466,9 @@ void colvar::parse_analysis (std::string const &conf) get_keyval (conf, "runAveLength", runave_length, 1000); get_keyval (conf, "runAveStride", runave_stride, 1); - if ((cvm::restart_out_freq % runave_stride) != 0) - cvm::fatal_error ("Error: runAveStride must be commensurate with the restart frequency.\n"); + if ((cvm::restart_out_freq % runave_stride) != 0) { + cvm::error("Error: runAveStride must be commensurate with the restart frequency.\n", INPUT_ERROR); + } std::string runave_outfile; get_keyval (conf, "runAveOutputFile", runave_outfile, @@ -484,30 +508,33 @@ void colvar::parse_analysis (std::string const &conf) acf_type = acf_vel; enable (task_fdiff_velocity); if (acf_colvar_name.size()) - (cvm::colvar_p (acf_colvar_name))->enable (task_fdiff_velocity); + (cvm::colvar_by_name (acf_colvar_name))->enable (task_fdiff_velocity); } else if (acf_type_str == to_lower_cppstr (std::string ("coordinate_p2"))) { acf_type = acf_p2coor; } else { - cvm::fatal_error ("Unknown type of correlation function, \""+ + cvm::log ("Unknown type of correlation function, \""+ acf_type_str+"\".\n"); + cvm::set_error_bits(INPUT_ERROR); } get_keyval (conf, "corrFuncOffset", acf_offset, 0); get_keyval (conf, "corrFuncLength", acf_length, 1000); get_keyval (conf, "corrFuncStride", acf_stride, 1); - if ((cvm::restart_out_freq % acf_stride) != 0) - cvm::fatal_error ("Error: corrFuncStride must be commensurate with the restart frequency.\n"); + if ((cvm::restart_out_freq % acf_stride) != 0) { + cvm::error("Error: corrFuncStride must be commensurate with the restart frequency.\n", INPUT_ERROR); + } get_keyval (conf, "corrFuncNormalize", acf_normalize, true); get_keyval (conf, "corrFuncOutputFile", acf_outfile, std::string (cvm::output_prefix+"."+this->name+ ".corrfunc.dat")); } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } -void colvar::enable (colvar::task const &t) +int colvar::enable (colvar::task const &t) { switch (t) { @@ -528,13 +555,17 @@ void colvar::enable (colvar::task const &t) if ( !tasks[task_extended_lagrangian] ) { enable (task_gradients); - if (!b_Jacobian_force) - cvm::fatal_error ("Error: colvar \""+this->name+ - "\" does not have Jacobian forces implemented.\n"); - if (!b_linear) - cvm::fatal_error ("Error: colvar \""+this->name+ + if (!b_Jacobian_force) { + cvm::error ("Error: colvar \""+this->name+ + "\" does not have Jacobian forces implemented.\n", + INPUT_ERROR); + } + if (!b_linear) { + cvm::error ("Error: colvar \""+this->name+ "\" must be defined as a linear combination " - "to calculate the Jacobian force.\n"); + "to calculate the Jacobian force.\n", + INPUT_ERROR); + } if (cvm::debug()) cvm::log ("Enabling calculation of the Jacobian force " "on this colvar.\n"); @@ -545,9 +576,10 @@ void colvar::enable (colvar::task const &t) case task_system_force: if (!tasks[task_extended_lagrangian]) { if (!b_inverse_gradients) { - cvm::fatal_error ("Error: one or more of the components of " + cvm::error ("Error: one or more of the components of " "colvar \""+this->name+ - "\" does not support system force calculation.\n"); + "\" does not support system force calculation.\n", + INPUT_ERROR); } cvm::request_system_force(); } @@ -573,9 +605,11 @@ void colvar::enable (colvar::task const &t) break; case task_grid: - if (this->type() != colvarvalue::type_scalar) - cvm::fatal_error ("Cannot calculate a grid for collective variable, \""+ - this->name+"\", because its value is not a scalar number.\n"); + if (this->type() != colvarvalue::type_scalar) { + cvm::error ("Cannot calculate a grid for collective variable, \""+ + this->name+"\", because its value is not a scalar number.\n", + INPUT_ERROR); + } break; case task_extended_lagrangian: @@ -586,8 +620,9 @@ void colvar::enable (colvar::task const &t) case task_lower_boundary: case task_upper_boundary: if (this->type() != colvarvalue::type_scalar) { - cvm::fatal_error ("Error: this colvar is not a scalar value " - "and cannot produce a grid.\n"); + cvm::error ("Error: this colvar is not a scalar value " + "and cannot produce a grid.\n", + INPUT_ERROR); } break; @@ -605,19 +640,21 @@ void colvar::enable (colvar::task const &t) break; case task_collect_gradients: - if (this->type() != colvarvalue::type_scalar) - cvm::fatal_error ("Collecting atomic gradients for non-scalar collective variable \""+ - this->name+"\" is not yet implemented.\n"); + if (this->type() != colvarvalue::type_scalar) { + cvm::error ("Collecting atomic gradients for non-scalar collective variable \""+ + this->name+"\" is not yet implemented.\n", + INPUT_ERROR); + } + enable (task_gradients); if (atom_ids.size() == 0) { build_atom_list(); } break; - } - tasks[t] = true; + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } @@ -689,6 +726,16 @@ colvar::~colvar() for (size_t i = 0; i < cvcs.size(); i++) { delete cvcs[i]; } + + // remove reference to this colvar from the CVM + for (std::vector::iterator cvi = cvm::colvars.begin(); + cvi != cvm::colvars.end(); + ++cvi) { + if ( *cvi == this) { + cvm::colvars.erase (cvi); + break; + } + } } @@ -798,7 +845,7 @@ void colvar::calc() if (tasks[task_collect_gradients]) { // Collect the atomic gradients inside colvar object - for (int a = 0; a < atomic_gradients.size(); a++) { + for (unsigned int a = 0; a < atomic_gradients.size(); a++) { atomic_gradients[a].reset(); } for (size_t i = 0; i < cvcs.size(); i++) { @@ -840,7 +887,11 @@ void colvar::calc() ft.reset(); - if(!tasks[task_extended_lagrangian] && (cvm::step_relative() > 0)) { + // if(!tasks[task_extended_lagrangian] && (cvm::step_relative() > 0)) { + // Disabled check to allow for explicit system force calculation + // even with extended Lagrangian + + if(cvm::step_relative() > 0) { // get from the cvcs the system forces from the PREVIOUS step for (size_t i = 0; i < cvcs.size(); i++) { (cvcs[i])->calc_force_invgrads(); @@ -949,15 +1000,15 @@ cvm::real colvar::update() } if (tasks[task_Jacobian_force]) { - + size_t i; cvm::increase_depth(); - for (size_t i = 0; i < cvcs.size(); i++) { + for (i = 0; i < cvcs.size(); i++) { (cvcs[i])->calc_Jacobian_derivative(); } cvm::decrease_depth(); fj.reset(); - for (size_t i = 0; i < cvcs.size(); i++) { + for (i = 0; i < cvcs.size(); i++) { // linear combination is assumed fj += 1.0 / ( cvm::real (cvcs.size()) * cvm::real ((cvcs[i])->sup_coeff) ) * (cvcs[i])->Jacobian_derivative(); @@ -1052,10 +1103,11 @@ void colvar::communicate_forces() bool colvar::periodic_boundaries (colvarvalue const &lb, colvarvalue const &ub) const { if ( (!tasks[task_lower_boundary]) || (!tasks[task_upper_boundary]) ) { - cvm::fatal_error ("Error: requesting to histogram the " + cvm::log ("Error: requesting to histogram the " "collective variable \""+this->name+"\", but a " "pair of lower and upper boundaries must be " "defined.\n"); + cvm::set_error_bits(INPUT_ERROR); } if (period > 0.0) { @@ -1071,7 +1123,7 @@ bool colvar::periodic_boundaries (colvarvalue const &lb, colvarvalue const &ub) bool colvar::periodic_boundaries() const { if ( (!tasks[task_lower_boundary]) || (!tasks[task_upper_boundary]) ) { - cvm::fatal_error ("Error: requesting to histogram the " + cvm::error ("Error: requesting to histogram the " "collective variable \""+this->name+"\", but a " "pair of lower and upper boundaries must be " "defined.\n"); @@ -1132,11 +1184,11 @@ std::istream & colvar::read_restart (std::istream &is) if ( (get_keyval (conf, "name", check_name, std::string (""), colvarparse::parse_silent)) && (check_name != name) ) { - cvm::fatal_error ("Error: the state file does not match the " + cvm::error ("Error: the state file does not match the " "configuration file, at colvar \""+name+"\".\n"); } if (check_name.size() == 0) { - cvm::fatal_error ("Error: Collective variable in the " + cvm::error ("Error: Collective variable in the " "restart file without any identifier.\n"); } } @@ -1383,7 +1435,7 @@ std::ostream & colvar::write_traj (std::ostream &os) return os; } -void colvar::write_output_files() +int colvar::write_output_files() { if (cvm::b_analysis) { @@ -1391,8 +1443,9 @@ void colvar::write_output_files() cvm::log ("Writing acf to file \""+acf_outfile+"\".\n"); std::ofstream acf_os (acf_outfile.c_str()); - if (! acf_os.good()) - cvm::fatal_error ("Cannot open file \""+acf_outfile+"\".\n"); + if (! acf_os.good()) { + cvm::error("Cannot open file \""+acf_outfile+"\".\n", FILE_ERROR); + } write_acf (acf_os); acf_os.close(); } @@ -1401,6 +1454,7 @@ void colvar::write_output_files() runave_os.close(); } } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } @@ -1436,7 +1490,7 @@ inline void history_incr (std::list< std::list > &history } -void colvar::calc_acf() +int colvar::calc_acf() { // using here an acf_stride-long list of vectors for either // coordinates (acf_x_history) or velocities (acf_v_history); each vector can @@ -1444,17 +1498,19 @@ void colvar::calc_acf() // representation but separated by acf_stride in the time series; // the pointer to each vector is changed at every step - if (! (acf_x_history.size() || acf_v_history.size()) ) { + if (acf_x_history.empty() && acf_v_history.empty()) { // first-step operations colvar *cfcv = (acf_colvar_name.size() ? - cvm::colvar_p (acf_colvar_name) : + cvm::colvar_by_name (acf_colvar_name) : this); - if (cfcv->type() != this->type()) - cvm::fatal_error ("Error: correlation function between \""+cfcv->name+ + if (cfcv->type() != this->type()) { + cvm::error ("Error: correlation function between \""+cfcv->name+ "\" and \""+this->name+"\" cannot be calculated, " - "because their value types are different.\n"); + "because their value types are different.\n", + INPUT_ERROR); + } acf_nframes = 0; cvm::log ("Colvar \""+this->name+"\": initializing ACF calculation.\n"); @@ -1462,11 +1518,12 @@ void colvar::calc_acf() if (acf.size() < acf_length+1) acf.resize (acf_length+1, 0.0); + size_t i; switch (acf_type) { case acf_vel: // allocate space for the velocities history - for (size_t i = 0; i < acf_stride; i++) { + for (i = 0; i < acf_stride; i++) { acf_v_history.push_back (std::list()); } acf_v_history_p = acf_v_history.begin(); @@ -1475,7 +1532,7 @@ void colvar::calc_acf() case acf_coor: case acf_p2coor: // allocate space for the coordinates history - for (size_t i = 0; i < acf_stride; i++) { + for (i = 0; i < acf_stride; i++) { acf_x_history.push_back (std::list()); } acf_x_history_p = acf_x_history.begin(); @@ -1488,7 +1545,7 @@ void colvar::calc_acf() } else { colvar *cfcv = (acf_colvar_name.size() ? - cvm::colvar_p (acf_colvar_name) : + cvm::colvar_by_name (acf_colvar_name) : this); switch (acf_type) { @@ -1532,10 +1589,11 @@ void colvar::calc_acf() // set it for the next step x_old = x; } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } -void colvar::calc_vel_acf (std::list &v_list, +int colvar::calc_vel_acf (std::list &v_list, colvarvalue const &v) { // loop over stored velocities and add to the ACF, but only the @@ -1545,10 +1603,11 @@ void colvar::calc_vel_acf (std::list &v_list, std::vector::iterator acf_i = acf.begin(); for (size_t i = 0; i < acf_offset; i++) - vs_i++; + ++vs_i; // current vel with itself - *(acf_i++) += v.norm2(); + *(acf_i) += v.norm2(); + ++acf_i; // inner products of previous velocities with current (acf_i and // vs_i are updated) @@ -1556,6 +1615,7 @@ void colvar::calc_vel_acf (std::list &v_list, acf_nframes++; } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } @@ -1568,7 +1628,7 @@ void colvar::calc_coor_acf (std::list &x_list, std::vector::iterator acf_i = acf.begin(); for (size_t i = 0; i < acf_offset; i++) - xs_i++; + ++xs_i; *(acf_i++) += x.norm2(); @@ -1589,7 +1649,7 @@ void colvar::calc_p2coor_acf (std::list &x_list, std::vector::iterator acf_i = acf.begin(); for (size_t i = 0; i < acf_offset; i++) - xs_i++; + ++xs_i; // value of P2(0) = 1 *(acf_i++) += 1.0; @@ -1617,7 +1677,7 @@ void colvar::write_acf (std::ostream &os) cvm::real const acf_norm = acf.front() / cvm::real (acf_nframes); std::vector::iterator acf_i; size_t it = acf_offset; - for (acf_i = acf.begin(); acf_i != acf.end(); acf_i++) { + for (acf_i = acf.begin(); acf_i != acf.end(); ++acf_i) { os << std::setw (cvm::it_width) << acf_stride * (it++) << " " << std::setprecision (cvm::cv_prec) << std::setw (cvm::cv_width) @@ -1630,7 +1690,7 @@ void colvar::write_acf (std::ostream &os) void colvar::calc_runave() { - if (!x_history.size()) { + if (x_history.empty()) { runave.type (x.type()); runave.reset(); @@ -1653,8 +1713,9 @@ void colvar::calc_runave() if ((*x_history_p).size() >= runave_length-1) { runave = x; - for (std::list::iterator xs_i = (*x_history_p).begin(); - xs_i != (*x_history_p).end(); xs_i++) { + std::list::iterator xs_i; + for (xs_i = (*x_history_p).begin(); + xs_i != (*x_history_p).end(); ++xs_i) { runave += (*xs_i); } runave *= 1.0 / cvm::real (runave_length); @@ -1662,8 +1723,8 @@ void colvar::calc_runave() runave_variance = 0.0; runave_variance += this->dist2 (x, runave); - for (std::list::iterator xs_i = (*x_history_p).begin(); - xs_i != (*x_history_p).end(); xs_i++) { + for (xs_i = (*x_history_p).begin(); + xs_i != (*x_history_p).end(); ++xs_i) { runave_variance += this->dist2 (x, (*xs_i)); } runave_variance *= 1.0 / cvm::real (runave_length-1); diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index 6f6692e904..a78a5dcd85 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -1,4 +1,4 @@ -// -*- c++ -*- +/// -*- c++ -*- #ifndef COLVAR_H #define COLVAR_H @@ -155,6 +155,8 @@ public: /// Tasks performed by this colvar bool tasks[task_ntot]; + /// List of biases that depend on this colvar + std::vector biases; protected: @@ -283,7 +285,7 @@ public: colvar (std::string const &conf); /// Enable the specified task - void enable (colvar::task const &t); + int enable (colvar::task const &t); /// Disable the specified task void disable (colvar::task const &t); @@ -355,7 +357,7 @@ public: /// Read the analysis tasks - void parse_analysis (std::string const &conf); + int parse_analysis (std::string const &conf); /// Perform analysis tasks void analyse(); @@ -374,7 +376,7 @@ public: std::ostream & write_restart (std::ostream &os); /// Write output files (if defined, e.g. in analysis mode) - void write_output_files(); + int write_output_files(); protected: @@ -430,7 +432,7 @@ protected: acf_type_e acf_type; /// \brief Velocity ACF, scalar product between v(0) and v(t) - void calc_vel_acf (std::list &v_history, + int calc_vel_acf (std::list &v_history, colvarvalue const &v); /// \brief Coordinate ACF, scalar product between x(0) and x(t) @@ -444,7 +446,7 @@ protected: colvarvalue const &x); /// Calculate the auto-correlation function (ACF) - void calc_acf(); + int calc_acf(); /// Save the ACF to a file void write_acf (std::ostream &os); @@ -485,6 +487,7 @@ public: class h_bond; class rmsd; class orientation_angle; + class orientation_proj; class tilt; class spin_angle; class gyration; @@ -523,20 +526,6 @@ public: } }; - -inline colvar * cvm::colvar_p (std::string const &name) -{ - for (std::vector::iterator cvi = cvm::colvars.begin(); - cvi != cvm::colvars.end(); - cvi++) { - if ((*cvi)->name == name) { - return (*cvi); - } - } - return NULL; -} - - inline colvarvalue::Type colvar::type() const { return x.type(); diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp index 11b5b8e14c..ef4f0ee13b 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #include "colvarmodule.h" #include "colvarparse.h" #include "colvaratoms.h" @@ -45,7 +47,7 @@ cvm::atom_group::atom_group (std::vector const &atoms) cvm::atom_group::atom_group() : b_dummy (false), b_center (false), b_rotate (false), b_fit_gradients (false), ref_pos_group (NULL), - noforce (false) + noforce (false), b_user_defined_fit (false) { total_mass = 0.0; } @@ -63,7 +65,7 @@ cvm::atom_group::~atom_group() void cvm::atom_group::add_atom (cvm::atom const &a) { if (b_dummy) { - cvm::fatal_error ("Error: cannot add atoms to a dummy group.\n"); + cvm::error ("Error: cannot add atoms to a dummy group.\n", INPUT_ERROR); } else { this->push_back (a); total_mass += a.mass; @@ -83,7 +85,7 @@ void cvm::atom_group::reset_mass(std::string &name, int i, int j) " atoms: total mass = "+cvm::to_str (this->total_mass)+".\n"); } -void cvm::atom_group::parse (std::string const &conf, +int cvm::atom_group::parse (std::string const &conf, char const *key) { std::string group_conf; @@ -98,9 +100,10 @@ void cvm::atom_group::parse (std::string const &conf, save_delimiters = true; if (group_conf.size() == 0) { - cvm::fatal_error ("Error: atom group \""+ - std::string (key)+"\" is set, but " - "has no definition.\n"); + cvm::error ("Error: atom group \""+std::string (key)+ + "\" is set, but has no definition.\n", + INPUT_ERROR); + return COLVARS_ERROR; } cvm::increase_depth(); @@ -135,9 +138,11 @@ void cvm::atom_group::parse (std::string const &conf, for (size_t i = 0; i < atom_indexes.size(); i++) { this->push_back (cvm::atom (atom_indexes[i])); } - } else - cvm::fatal_error ("Error: no numbers provided for \"" - "atomNumbers\".\n"); + } else { + cvm::error ("Error: no numbers provided for \"" + "atomNumbers\".\n", INPUT_ERROR); + return COLVARS_ERROR; + } atom_indexes.clear(); } @@ -147,13 +152,15 @@ void cvm::atom_group::parse (std::string const &conf, // use an index group from the index file read globally std::list::iterator names_i = cvm::index_group_names.begin(); std::list >::iterator index_groups_i = cvm::index_groups.begin(); - for ( ; names_i != cvm::index_group_names.end() ; names_i++, index_groups_i++) { + for ( ; names_i != cvm::index_group_names.end() ; ++names_i, ++index_groups_i) { if (*names_i == index_group_name) break; } if (names_i == cvm::index_group_names.end()) { - cvm::fatal_error ("Error: could not find index group "+ - index_group_name+" among those provided by the index file.\n"); + cvm::error ("Error: could not find index group "+ + index_group_name+" among those provided by the index file.\n", + INPUT_ERROR); + return COLVARS_ERROR; } this->reserve (index_groups_i->size()); for (size_t i = 0; i < index_groups_i->size(); i++) { @@ -183,20 +190,19 @@ void cvm::atom_group::parse (std::string const &conf, } } - cvm::fatal_error ("Error: no valid definition for \"" - "atomNumbersRange\", \""+ - range_conf+"\".\n"); + cvm::error ("Error: no valid definition for \"atomNumbersRange\", \""+ + range_conf+"\".\n", INPUT_ERROR); } } std::vector psf_segids; get_keyval (group_conf, "psfSegID", psf_segids, std::vector (), mode); for (std::vector::iterator psii = psf_segids.begin(); - psii < psf_segids.end(); psii++) { + psii < psf_segids.end(); ++psii) { if ( (psii->size() == 0) || (psii->size() > 4) ) { - cvm::fatal_error ("Error: invalid segmend identifier provided, \""+ - (*psii)+"\".\n"); + cvm::error ("Error: invalid segmend identifier provided, \""+ + (*psii)+"\".\n", INPUT_ERROR); } } @@ -210,8 +216,8 @@ void cvm::atom_group::parse (std::string const &conf, range_count++; if (range_count > psf_segids.size()) { - cvm::fatal_error ("Error: more instances of \"atomNameResidueRange\" than " - "values of \"psfSegID\".\n"); + cvm::error ("Error: more instances of \"atomNameResidueRange\" than " + "values of \"psfSegID\".\n", INPUT_ERROR); } std::string const &psf_segid = psf_segids.size() ? *psii : std::string (""); @@ -231,17 +237,17 @@ void cvm::atom_group::parse (std::string const &conf, } range_conf = ""; } else { - cvm::fatal_error ("Error: cannot parse definition for \"" - "atomNameResidueRange\", \""+ - range_conf+"\".\n"); + cvm::error ("Error: cannot parse definition for \"" + "atomNameResidueRange\", \""+ + range_conf+"\".\n"); } } else { - cvm::fatal_error ("Error: atomNameResidueRange with empty definition.\n"); + cvm::error ("Error: atomNameResidueRange with empty definition.\n"); } if (psf_segid.size()) - psii++; + ++psii; } } @@ -252,24 +258,25 @@ void cvm::atom_group::parse (std::string const &conf, std::string atoms_col; if (!get_keyval (group_conf, "atomsCol", atoms_col, std::string (""), mode)) { - cvm::fatal_error ("Error: parameter atomsCol is required if atomsFile is set.\n"); + cvm::error ("Error: parameter atomsCol is required if atomsFile is set.\n", + INPUT_ERROR); } double atoms_col_value; bool const atoms_col_value_defined = get_keyval (group_conf, "atomsColValue", atoms_col_value, 0.0, mode); - if (atoms_col_value_defined && (!atoms_col_value)) - cvm::fatal_error ("Error: atomsColValue, " - "if provided, must be non-zero.\n"); + if (atoms_col_value_defined && (!atoms_col_value)) { + cvm::error ("Error: atomsColValue, if provided, must be non-zero.\n", INPUT_ERROR); + } cvm::load_atoms (atoms_file_name.c_str(), *this, atoms_col, atoms_col_value); } } for (std::vector::iterator a1 = this->begin(); - a1 != this->end(); a1++) { + a1 != this->end(); ++a1) { std::vector::iterator a2 = a1; ++a2; - for ( ; a2 != this->end(); a2++) { + for ( ; a2 != this->end(); ++a2) { if (a1->id == a2->id) { if (cvm::debug()) cvm::log ("Discarding doubly counted atom with number "+ @@ -287,14 +294,15 @@ void cvm::atom_group::parse (std::string const &conf, } else b_dummy = false; - if (b_dummy && (this->size())) - cvm::fatal_error ("Error: cannot set up group \""+ - std::string (key)+"\" as a dummy atom " - "and provide it with atom definitions.\n"); + if (b_dummy && (this->size())) { + cvm::error ("Error: cannot set up group \""+ + std::string (key)+"\" as a dummy atom " + "and provide it with atom definitions.\n", INPUT_ERROR); + } #if (! defined (COLVARS_STANDALONE)) if ( (!b_dummy) && (!cvm::b_analysis) && (!(this->size())) ) { - cvm::fatal_error ("Error: no atoms defined for atom group \""+ + cvm::error ("Error: no atoms defined for atom group \""+ std::string (key)+"\".\n"); } #endif @@ -329,17 +337,17 @@ void cvm::atom_group::parse (std::string const &conf, if (b_center || b_rotate) { if (b_dummy) - cvm::fatal_error ("Error: centerReference or rotateReference " - "cannot be defined for a dummy atom.\n"); + cvm::error ("Error: centerReference or rotateReference " + "cannot be defined for a dummy atom.\n"); if (key_lookup (group_conf, "refPositionsGroup")) { // instead of this group, define another group to compute the fit if (ref_pos_group) { - cvm::fatal_error ("Error: the atom group \""+ - std::string (key)+"\" has already a reference group " - "for the rototranslational fit, which was communicated by the " - "colvar component. You should not use refPositionsGroup " - "in this case.\n"); + cvm::error ("Error: the atom group \""+ + std::string (key)+"\" has already a reference group " + "for the rototranslational fit, which was communicated by the " + "colvar component. You should not use refPositionsGroup " + "in this case.\n"); } cvm::log ("Within atom group \""+std::string (key)+"\":\n"); ref_pos_group = new atom_group (group_conf, "refPositionsGroup"); @@ -357,8 +365,8 @@ void cvm::atom_group::parse (std::string const &conf, if (get_keyval (group_conf, "refPositionsFile", ref_pos_file, std::string (""), mode)) { if (ref_pos.size()) { - cvm::fatal_error ("Error: cannot specify \"refPositionsFile\" and " - "\"refPositions\" at the same time.\n"); + cvm::error ("Error: cannot specify \"refPositionsFile\" and " + "\"refPositions\" at the same time.\n"); } std::string ref_pos_col; @@ -368,8 +376,8 @@ void cvm::atom_group::parse (std::string const &conf, // if provided, use PDB column to select coordinates bool found = get_keyval (group_conf, "refPositionsColValue", ref_pos_col_value, 0.0, mode); if (found && !ref_pos_col_value) - cvm::fatal_error ("Error: refPositionsColValue, " - "if provided, must be non-zero.\n"); + cvm::error ("Error: refPositionsColValue, " + "if provided, must be non-zero.\n"); } else { // if not, rely on existing atom indices for the group group_for_fit->create_sorted_ids(); @@ -384,13 +392,13 @@ void cvm::atom_group::parse (std::string const &conf, if (b_rotate) { if (ref_pos.size() != group_for_fit->size()) - cvm::fatal_error ("Error: the number of reference positions provided ("+ - cvm::to_str (ref_pos.size())+ - ") does not match the number of atoms within \""+ - std::string (key)+ - "\" ("+cvm::to_str (group_for_fit->size())+ - "): to perform a rotational fit, "+ - "these numbers should be equal.\n"); + cvm::error ("Error: the number of reference positions provided ("+ + cvm::to_str (ref_pos.size())+ + ") does not match the number of atoms within \""+ + std::string (key)+ + "\" ("+cvm::to_str (group_for_fit->size())+ + "): to perform a rotational fit, "+ + "these numbers should be equal.\n", INPUT_ERROR); } // save the center of geometry of ref_pos and subtract it @@ -398,7 +406,7 @@ void cvm::atom_group::parse (std::string const &conf, } else { #if (! defined (COLVARS_STANDALONE)) - cvm::fatal_error ("Error: no reference positions provided.\n"); + cvm::error ("Error: no reference positions provided.\n"); #endif } @@ -431,29 +439,39 @@ void cvm::atom_group::parse (std::string const &conf, cvm::to_str (this->total_mass)+".\n"); cvm::decrease_depth(); + + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } -void cvm::atom_group::create_sorted_ids (void) +int cvm::atom_group::create_sorted_ids (void) { // Only do the work if the vector is not yet populated if (sorted_ids.size()) - return; + return COLVARS_OK; std::list temp_id_list; - for (cvm::atom_iter ai = this->begin(); ai != this->end(); ai++) { + cvm::atom_iter ai; + for (ai = this->begin(); ai != this->end(); ai++) { temp_id_list.push_back (ai->id); } temp_id_list.sort(); temp_id_list.unique(); if (temp_id_list.size() != this->size()) { - cvm::fatal_error ("Error: duplicate atom IDs in atom group? (found " + - cvm::to_str(temp_id_list.size()) + - " unique atom IDs instead of" + - cvm::to_str(this->size()) + ").\n"); + cvm::error ("Error: duplicate atom IDs in atom group? (found " + + cvm::to_str(temp_id_list.size()) + + " unique atom IDs instead of" + + cvm::to_str(this->size()) + ").\n"); + return COLVARS_ERROR; } - sorted_ids = std::vector (temp_id_list.begin(), temp_id_list.end()); - return; + sorted_ids = std::vector (temp_id_list.size()); + unsigned int id_i = 0; + std::list::iterator li; + for (li = temp_id_list.begin(); li != temp_id_list.end(); ++li) { + sorted_ids[id_i] = *li; + id_i++; + } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } void cvm::atom_group::center_ref_pos() @@ -464,13 +482,12 @@ void cvm::atom_group::center_ref_pos() // This is called either by atom_group::parse or by CVCs that set // reference positions (eg. RMSD, eigenvector) ref_pos_cog = cvm::atom_pos (0.0, 0.0, 0.0); - std::vector::iterator pi = ref_pos.begin(); - for ( ; pi != ref_pos.end(); pi++) { + std::vector::iterator pi; + for (pi = ref_pos.begin(); pi != ref_pos.end(); ++pi) { ref_pos_cog += *pi; } ref_pos_cog /= (cvm::real) ref_pos.size(); - for (std::vector::iterator pi = ref_pos.begin(); - pi != ref_pos.end(); pi++) { + for (pi = ref_pos.begin(); pi != ref_pos.end(); ++pi) { (*pi) -= ref_pos_cog; } } @@ -679,14 +696,15 @@ void cvm::atom_group::calc_fit_gradients() std::vector cvm::atom_group::positions() const { - if (b_dummy) - cvm::fatal_error ("Error: positions are not available " + if (b_dummy) { + cvm::error ("Error: positions are not available " "from a dummy atom group.\n"); + } std::vector x (this->size(), 0.0); cvm::atom_const_iter ai = this->begin(); std::vector::iterator xi = x.begin(); - for ( ; ai != this->end(); xi++, ai++) { + for ( ; ai != this->end(); ++xi, ++ai) { *xi = ai->pos; } return x; @@ -694,14 +712,15 @@ std::vector cvm::atom_group::positions() const std::vector cvm::atom_group::positions_shifted (cvm::rvector const &shift) const { - if (b_dummy) - cvm::fatal_error ("Error: positions are not available " - "from a dummy atom group.\n"); + if (b_dummy) { + cvm::error ("Error: positions are not available " + "from a dummy atom group.\n"); + } std::vector x (this->size(), 0.0); cvm::atom_const_iter ai = this->begin(); std::vector::iterator xi = x.begin(); - for ( ; ai != this->end(); xi++, ai++) { + for ( ; ai != this->end(); ++xi, ++ai) { *xi = (ai->pos + shift); } return x; @@ -709,9 +728,10 @@ std::vector cvm::atom_group::positions_shifted (cvm::rvector cons std::vector cvm::atom_group::velocities() const { - if (b_dummy) - cvm::fatal_error ("Error: velocities are not available " - "from a dummy atom group.\n"); + if (b_dummy) { + cvm::error ("Error: velocities are not available " + "from a dummy atom group.\n"); + } std::vector v (this->size(), 0.0); cvm::atom_const_iter ai = this->begin(); @@ -724,14 +744,15 @@ std::vector cvm::atom_group::velocities() const std::vector cvm::atom_group::system_forces() const { - if (b_dummy) - cvm::fatal_error ("Error: system forces are not available " - "from a dummy atom group.\n"); + if (b_dummy) { + cvm::error ("Error: system forces are not available " + "from a dummy atom group.\n"); + } std::vector f (this->size(), 0.0); cvm::atom_const_iter ai = this->begin(); std::vector::iterator fi = f.begin(); - for ( ; ai != this->end(); fi++, ai++) { + for ( ; ai != this->end(); ++fi, ++ai) { *fi = ai->system_force; } return f; @@ -739,9 +760,10 @@ std::vector cvm::atom_group::system_forces() const cvm::rvector cvm::atom_group::system_force() const { - if (b_dummy) - cvm::fatal_error ("Error: system forces are not available " - "from a dummy atom group.\n"); + if (b_dummy) { + cvm::error ("Error: system forces are not available " + "from a dummy atom group.\n"); + } cvm::rvector f (0.0); for (cvm::atom_const_iter ai = this->begin(); ai != this->end(); ai++) { @@ -756,9 +778,11 @@ void cvm::atom_group::apply_colvar_force (cvm::real const &force) if (b_dummy) return; - if (noforce) - cvm::fatal_error ("Error: sending a force to a group that has " - "\"enableForces\" set to off.\n"); + if (noforce) { + cvm::error ("Error: sending a force to a group that has " + "\"enableForces\" set to off.\n"); + return; + } if (b_rotate) { @@ -803,9 +827,11 @@ void cvm::atom_group::apply_force (cvm::rvector const &force) if (b_dummy) return; - if (noforce) - cvm::fatal_error ("Error: sending a force to a group that has " - "\"disableForces\" defined.\n"); + if (noforce) { + cvm::error ("Error: sending a force to a group that has " + "\"disableForces\" defined.\n"); + return; + } if (b_rotate) { @@ -831,12 +857,12 @@ void cvm::atom_group::apply_forces (std::vector const &forces) return; if (noforce) - cvm::fatal_error ("Error: sending a force to a group that has " - "\"disableForces\" defined.\n"); + cvm::error ("Error: sending a force to a group that has " + "\"disableForces\" defined.\n"); if (forces.size() != this->size()) { - cvm::fatal_error ("Error: trying to apply an array of forces to an atom " - "group which does not have the same length.\n"); + cvm::error ("Error: trying to apply an array of forces to an atom " + "group which does not have the same length.\n"); } if (b_rotate) { @@ -844,7 +870,7 @@ void cvm::atom_group::apply_forces (std::vector const &forces) cvm::rotation const rot_inv = rot.inverse(); cvm::atom_iter ai = this->begin(); std::vector::const_iterator fi = forces.begin(); - for ( ; ai != this->end(); fi++, ai++) { + for ( ; ai != this->end(); ++fi, ++ai) { ai->apply_force (rot_inv.rotate (*fi)); } @@ -852,7 +878,7 @@ void cvm::atom_group::apply_forces (std::vector const &forces) cvm::atom_iter ai = this->begin(); std::vector::const_iterator fi = forces.begin(); - for ( ; ai != this->end(); fi++, ai++) { + for ( ; ai != this->end(); ++fi, ++ai) { ai->apply_force (*fi); } } diff --git a/lib/colvars/colvaratoms.h b/lib/colvars/colvaratoms.h index aac8c857db..663871ffa6 100644 --- a/lib/colvars/colvaratoms.h +++ b/lib/colvars/colvaratoms.h @@ -1,4 +1,4 @@ -// -*- c++ -*- +/// -*- c++ -*- #ifndef COLVARATOMS_H #define COLVARATOMS_H @@ -137,7 +137,7 @@ public: std::vector sorted_ids; /// Allocates and populates the sorted list of atom ids - void create_sorted_ids (void); + int create_sorted_ids (void); /// \brief When updating atomic coordinates, translate them to align with the @@ -193,7 +193,7 @@ public: /// \brief Initialize the group by looking up its configuration /// string in conf and parsing it - void parse (std::string const &conf, + int parse (std::string const &conf, char const *key); /// \brief Initialize the group after a temporary vector of atoms diff --git a/lib/colvars/colvarbias.cpp b/lib/colvars/colvarbias.cpp index 328bc6a662..d88611b9b9 100644 --- a/lib/colvars/colvarbias.cpp +++ b/lib/colvars/colvarbias.cpp @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #include "colvarmodule.h" #include "colvarvalue.h" #include "colvarbias.h" @@ -27,12 +29,10 @@ colvarbias::colvarbias (std::string const &conf, char const *key) get_keyval (conf, "name", name, key_str+cvm::to_str (rank)); - for (std::vector::iterator bi = cvm::biases.begin(); - bi != cvm::biases.end(); - bi++) { - if ((*bi)->name == this->name) - cvm::fatal_error ("Error: this bias cannot have the same name, \""+this->name+ - "\", as another bias.\n"); + if (cvm::bias_by_name (this->name) != NULL) { + cvm::error ("Error: this bias cannot have the same name, \""+this->name+ + "\", as another bias.\n", INPUT_ERROR); + return; } // lookup the associated colvars @@ -43,7 +43,8 @@ colvarbias::colvarbias (std::string const &conf, char const *key) } } if (!colvars.size()) { - cvm::fatal_error ("Error: no collective variables specified.\n"); + cvm::error ("Error: no collective variables specified.\n"); + return; } get_keyval (conf, "outputEnergy", b_output_energy, false); @@ -54,19 +55,45 @@ colvarbias::colvarbias() : colvarparse(), has_data (false) {} +colvarbias::~colvarbias() +{ + // Remove references to this bias from colvars + for (std::vector::iterator cvi = colvars.begin(); + cvi != colvars.end(); + ++cvi) { + for (std::vector::iterator bi = (*cvi)->biases.begin(); + bi != (*cvi)->biases.end(); + ++bi) { + if ( *bi == this) { + (*cvi)->biases.erase (bi); + break; + } + } + } + // ...and from the colvars module + for (std::vector::iterator bi = cvm::biases.begin(); + bi != cvm::biases.end(); + ++bi) { + if ( *bi == this) { + cvm::biases.erase (bi); + break; + } + } +} void colvarbias::add_colvar (std::string const &cv_name) { - if (colvar *cvp = cvm::colvar_p (cv_name)) { + if (colvar *cvp = cvm::colvar_by_name (cv_name)) { cvp->enable (colvar::task_gradients); if (cvm::debug()) cvm::log ("Applying this bias to collective variable \""+ cvp->name+"\".\n"); colvars.push_back (cvp); colvar_forces.push_back (colvarvalue (cvp->type())); + cvp->biases.push_back (this); // add back-reference to this bias to colvar } else { - cvm::fatal_error ("Error: cannot find a colvar named \""+ - cv_name+"\".\n"); + cvm::error ("Error: cannot find a colvar named \""+ + cv_name+"\".\n"); } } @@ -86,13 +113,13 @@ void colvarbias::communicate_forces() void colvarbias::change_configuration(std::string const &conf) { - cvm::fatal_error ("Error: change_configuration() not implemented.\n"); + cvm::error ("Error: change_configuration() not implemented.\n"); } cvm::real colvarbias::energy_difference(std::string const &conf) { - cvm::fatal_error ("Error: energy_difference() not implemented.\n"); + cvm::error ("Error: energy_difference() not implemented.\n"); return 0.; } @@ -115,518 +142,3 @@ std::ostream & colvarbias::write_traj (std::ostream &os) << bias_energy; return os; } - - - - -colvarbias_restraint::colvarbias_restraint (std::string const &conf, - char const *key) - : colvarbias (conf, key), - target_nstages (0), - target_nsteps (0) -{ - get_keyval (conf, "forceConstant", force_k, 1.0); - - // get the initial restraint centers - colvar_centers.resize (colvars.size()); - colvar_centers_raw.resize (colvars.size()); - for (size_t i = 0; i < colvars.size(); i++) { - colvar_centers[i].type (colvars[i]->type()); - colvar_centers_raw[i].type (colvars[i]->type()); - } - if (get_keyval (conf, "centers", colvar_centers, colvar_centers)) { - for (size_t i = 0; i < colvars.size(); i++) { - colvar_centers[i].apply_constraints(); - colvar_centers_raw[i] = colvar_centers[i]; - } - } else { - colvar_centers.clear(); - cvm::fatal_error ("Error: must define the initial centers of the restraints.\n"); - } - - if (colvar_centers.size() != colvars.size()) - cvm::fatal_error ("Error: number of centers does not match " - "that of collective variables.\n"); - - if (get_keyval (conf, "targetCenters", target_centers, colvar_centers)) { - b_chg_centers = true; - for (size_t i = 0; i < target_centers.size(); i++) { - target_centers[i].apply_constraints(); - } - } else { - b_chg_centers = false; - target_centers.clear(); - } - - if (get_keyval (conf, "targetForceConstant", target_force_k, 0.0)) { - if (b_chg_centers) - cvm::fatal_error ("Error: cannot specify both targetCenters and targetForceConstant.\n"); - - starting_force_k = force_k; - b_chg_force_k = true; - - get_keyval (conf, "targetEquilSteps", target_equil_steps, 0); - - get_keyval (conf, "lambdaSchedule", lambda_schedule, lambda_schedule); - if (lambda_schedule.size()) { - // There is one more lambda-point than stages - target_nstages = lambda_schedule.size() - 1; - } - } else { - b_chg_force_k = false; - } - - if (b_chg_centers || b_chg_force_k) { - get_keyval (conf, "targetNumSteps", target_nsteps, 0); - if (!target_nsteps) - cvm::fatal_error ("Error: targetNumSteps must be non-zero.\n"); - - if (get_keyval (conf, "targetNumStages", target_nstages, target_nstages) && - lambda_schedule.size()) { - cvm::fatal_error ("Error: targetNumStages and lambdaSchedule are incompatible.\n"); - } - - if (target_nstages) { - // This means that either numStages of lambdaSchedule has been provided - stage = 0; - restraint_FE = 0.0; - } - - if (get_keyval (conf, "targetForceExponent", force_k_exp, 1.0)) { - if (! b_chg_force_k) - cvm::log ("Warning: not changing force constant: targetForceExponent will be ignored\n"); - if (force_k_exp < 1.0) - cvm::log ("Warning: for all practical purposes, targetForceExponent should be 1.0 or greater.\n"); - } - } - - get_keyval (conf, "outputCenters", b_output_centers, false); - get_keyval (conf, "outputAccumulatedWork", b_output_acc_work, false); - acc_work = 0.0; - - if (cvm::debug()) - cvm::log ("Done initializing a new restraint bias.\n"); -} - -colvarbias_restraint::~colvarbias_restraint () -{ - if (cvm::n_rest_biases > 0) - cvm::n_rest_biases -= 1; -} - - -void colvarbias_restraint::change_configuration (std::string const &conf) -{ - get_keyval (conf, "forceConstant", force_k, force_k); - if (get_keyval (conf, "centers", colvar_centers, colvar_centers)) { - for (size_t i = 0; i < colvars.size(); i++) { - colvar_centers[i].apply_constraints(); - colvar_centers_raw[i] = colvar_centers[i]; - } - } -} - - -cvm::real colvarbias_restraint::energy_difference (std::string const &conf) -{ - std::vector alt_colvar_centers; - cvm::real alt_force_k; - cvm::real alt_bias_energy = 0.0; - - get_keyval (conf, "forceConstant", alt_force_k, force_k); - - alt_colvar_centers.resize (colvars.size()); - for (size_t i = 0; i < colvars.size(); i++) { - alt_colvar_centers[i].type (colvars[i]->type()); - } - if (get_keyval (conf, "centers", alt_colvar_centers, colvar_centers)) { - for (size_t i = 0; i < colvars.size(); i++) { - colvar_centers[i].apply_constraints(); - } - } - - for (size_t i = 0; i < colvars.size(); i++) { - alt_bias_energy += restraint_potential(restraint_convert_k(alt_force_k, colvars[i]->width), - colvars[i], - alt_colvar_centers[i]); - } - - return alt_bias_energy - bias_energy; -} - - -cvm::real colvarbias_restraint::update() -{ - bias_energy = 0.0; - - if (cvm::debug()) - cvm::log ("Updating the restraint bias \""+this->name+"\".\n"); - - // Setup first stage of staged variable force constant calculation - if (b_chg_force_k && target_nstages && cvm::step_absolute() == 0) { - cvm::real lambda; - if (lambda_schedule.size()) { - lambda = lambda_schedule[0]; - } else { - lambda = 0.0; - } - force_k = starting_force_k + (target_force_k - starting_force_k) - * std::pow (lambda, force_k_exp); - cvm::log ("Restraint " + this->name + ", stage " + - cvm::to_str(stage) + " : lambda = " + cvm::to_str(lambda)); - cvm::log ("Setting force constant to " + cvm::to_str (force_k)); - } - - if (b_chg_centers) { - - if (!centers_incr.size()) { - // if this is the first calculation, calculate the advancement - // at each simulation step (or stage, if applicable) - // (take current stage into account: it can be non-zero - // if we are restarting a staged calculation) - centers_incr.resize (colvars.size()); - for (size_t i = 0; i < colvars.size(); i++) { - centers_incr[i].type (colvars[i]->type()); - centers_incr[i] = (target_centers[i] - colvar_centers_raw[i]) / - cvm::real ( target_nstages ? (target_nstages - stage) : - (target_nsteps - cvm::step_absolute())); - } - if (cvm::debug()) - cvm::log ("Center increment for the restraint bias \""+ - this->name+"\": "+cvm::to_str (centers_incr)+" at stage "+cvm::to_str (stage)+ ".\n"); - - } - - if (target_nstages) { - if ((cvm::step_relative() > 0) - && (cvm::step_absolute() % target_nsteps) == 0 - && stage < target_nstages) { - - for (size_t i = 0; i < colvars.size(); i++) { - colvar_centers_raw[i] += centers_incr[i]; - colvar_centers[i] = colvar_centers_raw[i]; - colvars[i]->wrap(colvar_centers[i]); - colvar_centers[i].apply_constraints(); - } - stage++; - cvm::log ("Moving restraint stage " + cvm::to_str(stage) + - " : setting centers to " + cvm::to_str (colvar_centers) + - " at step " + cvm::to_str (cvm::step_absolute())); - } - } else if ((cvm::step_relative() > 0) && (cvm::step_absolute() <= target_nsteps)) { - // move the restraint centers in the direction of the targets - // (slow growth) - for (size_t i = 0; i < colvars.size(); i++) { - colvar_centers_raw[i] += centers_incr[i]; - colvar_centers[i] = colvar_centers_raw[i]; - colvars[i]->wrap(colvar_centers[i]); - colvar_centers[i].apply_constraints(); - } - } - - if (cvm::debug()) - cvm::log ("Current centers for the restraint bias \""+ - this->name+"\": "+cvm::to_str (colvar_centers)+".\n"); - } - - if (b_chg_force_k) { - // Coupling parameter, between 0 and 1 - cvm::real lambda; - - if (target_nstages) { - // TI calculation: estimate free energy derivative - // need current lambda - if (lambda_schedule.size()) { - lambda = lambda_schedule[stage]; - } else { - lambda = cvm::real(stage) / cvm::real(target_nstages); - } - - if (target_equil_steps == 0 || cvm::step_absolute() % target_nsteps >= target_equil_steps) { - // Start averaging after equilibration period, if requested - - // Square distance normalized by square colvar width - cvm::real dist_sq = 0.0; - for (size_t i = 0; i < colvars.size(); i++) { - dist_sq += colvars[i]->dist2 (colvars[i]->value(), colvar_centers[i]) - / (colvars[i]->width * colvars[i]->width); - } - - restraint_FE += 0.5 * force_k_exp * std::pow(lambda, force_k_exp - 1.0) - * (target_force_k - starting_force_k) * dist_sq; - } - - // Finish current stage... - if (cvm::step_absolute() % target_nsteps == 0 && - cvm::step_absolute() > 0) { - - cvm::log ("Lambda= " + cvm::to_str (lambda) + " dA/dLambda= " - + cvm::to_str (restraint_FE / cvm::real(target_nsteps - target_equil_steps))); - - // ...and move on to the next one - if (stage < target_nstages) { - - restraint_FE = 0.0; - stage++; - if (lambda_schedule.size()) { - lambda = lambda_schedule[stage]; - } else { - lambda = cvm::real(stage) / cvm::real(target_nstages); - } - force_k = starting_force_k + (target_force_k - starting_force_k) - * std::pow (lambda, force_k_exp); - cvm::log ("Restraint " + this->name + ", stage " + - cvm::to_str(stage) + " : lambda = " + cvm::to_str(lambda)); - cvm::log ("Setting force constant to " + cvm::to_str (force_k)); - } - } - } else if (cvm::step_absolute() <= target_nsteps) { - // update force constant (slow growth) - lambda = cvm::real(cvm::step_absolute()) / cvm::real(target_nsteps); - force_k = starting_force_k + (target_force_k - starting_force_k) - * std::pow (lambda, force_k_exp); - } - } - - if (cvm::debug()) - cvm::log ("Done updating the restraint bias \""+this->name+"\".\n"); - - // Force and energy calculation - for (size_t i = 0; i < colvars.size(); i++) { - colvar_forces[i] = -restraint_force(restraint_convert_k(force_k, colvars[i]->width), - colvars[i], - colvar_centers[i]); - bias_energy += restraint_potential(restraint_convert_k(force_k, colvars[i]->width), - colvars[i], - colvar_centers[i]); - } - - if (b_output_acc_work) { - if ((cvm::step_relative() > 0) || (cvm::step_absolute() == 0)) { - for (size_t i = 0; i < colvars.size(); i++) { - // project forces on the calculated increments at this step - acc_work += colvar_forces[i] * centers_incr[i]; - } - } - } - - if (cvm::debug()) - cvm::log ("Current forces for the restraint bias \""+ - this->name+"\": "+cvm::to_str (colvar_forces)+".\n"); - - return bias_energy; -} - - -std::istream & colvarbias_restraint::read_restart (std::istream &is) -{ - size_t const start_pos = is.tellg(); - - cvm::log ("Restarting restraint bias \""+ - this->name+"\".\n"); - - std::string key, brace, conf; - if ( !(is >> key) || !(key == "restraint" || key == "harmonic") || - !(is >> brace) || !(brace == "{") || - !(is >> colvarparse::read_block ("configuration", conf)) ) { - - cvm::log ("Error: in reading restart configuration for restraint bias \""+ - this->name+"\" at position "+ - cvm::to_str (is.tellg())+" in stream.\n"); - is.clear(); - is.seekg (start_pos, std::ios::beg); - is.setstate (std::ios::failbit); - return is; - } - -// int id = -1; - std::string name = ""; -// if ( ( (colvarparse::get_keyval (conf, "id", id, -1, colvarparse::parse_silent)) && -// (id != this->id) ) || - if ( (colvarparse::get_keyval (conf, "name", name, std::string (""), colvarparse::parse_silent)) && - (name != this->name) ) - cvm::fatal_error ("Error: in the restart file, the " - "\"restraint\" block has a wrong name\n"); -// if ( (id == -1) && (name == "") ) { - if (name.size() == 0) { - cvm::fatal_error ("Error: \"restraint\" block in the restart file " - "has no identifiers.\n"); - } - - if (b_chg_centers) { -// cvm::log ("Reading the updated restraint centers from the restart.\n"); - if (!get_keyval (conf, "centers", colvar_centers)) - cvm::fatal_error ("Error: restraint centers are missing from the restart.\n"); - if (!get_keyval (conf, "centers_raw", colvar_centers_raw)) - cvm::fatal_error ("Error: \"raw\" restraint centers are missing from the restart.\n"); - } - - if (b_chg_force_k) { -// cvm::log ("Reading the updated force constant from the restart.\n"); - if (!get_keyval (conf, "forceConstant", force_k)) - cvm::fatal_error ("Error: force constant is missing from the restart.\n"); - } - - if (target_nstages) { -// cvm::log ("Reading current stage from the restart.\n"); - if (!get_keyval (conf, "stage", stage)) - cvm::fatal_error ("Error: current stage is missing from the restart.\n"); - } - - if (b_output_acc_work) { - if (!get_keyval (conf, "accumulatedWork", acc_work)) - cvm::fatal_error ("Error: accumulatedWork is missing from the restart.\n"); - } - - is >> brace; - if (brace != "}") { - cvm::fatal_error ("Error: corrupt restart information for restraint bias \""+ - this->name+"\": no matching brace at position "+ - cvm::to_str (is.tellg())+" in the restart file.\n"); - is.setstate (std::ios::failbit); - } - return is; -} - - -std::ostream & colvarbias_restraint::write_restart (std::ostream &os) -{ - os << "restraint {\n" - << " configuration {\n" - // << " id " << this->id << "\n" - << " name " << this->name << "\n"; - - if (b_chg_centers) { - os << " centers "; - for (size_t i = 0; i < colvars.size(); i++) { - os << " " << colvar_centers[i]; - } - os << "\n"; - os << " centers_raw "; - for (size_t i = 0; i < colvars.size(); i++) { - os << " " << colvar_centers_raw[i]; - } - os << "\n"; - } - - if (b_chg_force_k) { - os << " forceConstant " - << std::setprecision (cvm::en_prec) - << std::setw (cvm::en_width) << force_k << "\n"; - } - - if (target_nstages) { - os << " stage " << std::setw (cvm::it_width) - << stage << "\n"; - } - - if (b_output_acc_work) { - os << " accumulatedWork " << acc_work << "\n"; - } - - os << " }\n" - << "}\n\n"; - - return os; -} - - -std::ostream & colvarbias_restraint::write_traj_label (std::ostream &os) -{ - os << " "; - - if (b_output_energy) - os << " E_" - << cvm::wrap_string (this->name, cvm::en_width-2); - - if (b_output_centers) - for (size_t i = 0; i < colvars.size(); i++) { - size_t const this_cv_width = (colvars[i]->value()).output_width (cvm::cv_width); - os << " x0_" - << cvm::wrap_string (colvars[i]->name, this_cv_width-3); - } - - if (b_output_acc_work) - os << " W_" - << cvm::wrap_string (this->name, cvm::en_width-2); - - return os; -} - - -std::ostream & colvarbias_restraint::write_traj (std::ostream &os) -{ - os << " "; - - if (b_output_energy) - os << " " - << std::setprecision (cvm::en_prec) << std::setw (cvm::en_width) - << bias_energy; - - if (b_output_centers) - for (size_t i = 0; i < colvars.size(); i++) { - os << " " - << std::setprecision (cvm::cv_prec) << std::setw (cvm::cv_width) - << colvar_centers[i]; - } - - if (b_output_acc_work) - os << " " - << std::setprecision (cvm::en_prec) << std::setw (cvm::en_width) - << acc_work; - - return os; -} - -colvarbias_restraint_harmonic::colvarbias_restraint_harmonic(std::string const &conf, char const *key) : - colvarbias_restraint(conf, key) { - for (size_t i = 0; i < colvars.size(); i++) { - if (colvars[i]->width != 1.0) - cvm::log ("The force constant for colvar \""+colvars[i]->name+ - "\" will be rescaled to "+ - cvm::to_str (restraint_convert_k(force_k, colvars[i]->width))+ - " according to the specified width.\n"); - } -} - -cvm::real colvarbias_restraint_harmonic::restraint_potential(cvm::real k, colvar* x, const colvarvalue &xcenter) const -{ - return 0.5 * k * x->dist2(x->value(), xcenter); -} - -colvarvalue colvarbias_restraint_harmonic::restraint_force(cvm::real k, colvar* x, const colvarvalue &xcenter) const -{ - return 0.5 * k * x->dist2_lgrad(x->value(), xcenter); -} - -cvm::real colvarbias_restraint_harmonic::restraint_convert_k(cvm::real k, cvm::real dist_measure) const -{ - return k / (dist_measure * dist_measure); -} - - -colvarbias_restraint_linear::colvarbias_restraint_linear(std::string const &conf, char const *key) : - colvarbias_restraint(conf, key) { - for (size_t i = 0; i < colvars.size(); i++) { - if (colvars[i]->width != 1.0) - cvm::log ("The force constant for colvar \""+colvars[i]->name+ - "\" will be rescaled to "+ - cvm::to_str (restraint_convert_k(force_k, colvars[i]->width))+ - " according to the specified width.\n"); - } -} - -cvm::real colvarbias_restraint_linear::restraint_potential(cvm::real k, colvar* x, const colvarvalue &xcenter) const -{ - return k * (x->value() - xcenter); -} - -colvarvalue colvarbias_restraint_linear::restraint_force(cvm::real k, colvar* x, const colvarvalue &xcenter) const -{ - return k; -} - -cvm::real colvarbias_restraint_linear::restraint_convert_k(cvm::real k, cvm::real dist_measure) const -{ - return k / dist_measure; -} diff --git a/lib/colvars/colvarbias.h b/lib/colvars/colvarbias.h index c4e6493151..c3624784d1 100644 --- a/lib/colvars/colvarbias.h +++ b/lib/colvars/colvarbias.h @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #ifndef COLVARBIAS_H #define COLVARBIAS_H @@ -9,9 +11,6 @@ class colvarbias : public colvarparse { public: - /// Numeric id of this bias - int id; - /// Name of this bias std::string name; @@ -22,6 +21,8 @@ public: /// Return bias energy virtual cvm::real update() = 0; + // TODO: move update_bias here (share with metadynamics) + /// Load new configuration - force constant and/or centers only virtual void change_configuration(std::string const &conf); @@ -44,7 +45,7 @@ public: colvarbias(); /// Destructor - virtual inline ~colvarbias() {} + virtual ~colvarbias(); /// Read the bias configuration from a restart file virtual std::istream & read_restart (std::istream &is) = 0; @@ -58,7 +59,9 @@ public: /// Output quantities such as the bias energy to the trajectory file virtual std::ostream & write_traj (std::ostream &os); - + inline cvm::real get_energy () { + return bias_energy; + } protected: /// \brief Pointers to collective variables to which the bias is @@ -81,157 +84,4 @@ protected: }; - -/// \brief Bias restraint, optionally moving towards a target -/// (implementation of \link colvarbias \endlink) -class colvarbias_restraint : public colvarbias { - -public: - - /// Retrieve colvar values and calculate their biasing forces - virtual cvm::real update(); - - /// Load new configuration - force constant and/or centers only - virtual void change_configuration(std::string const &conf); - - /// Calculate change in energy from using alternate configuration - virtual cvm::real energy_difference(std::string const &conf); - - /// Read the bias configuration from a restart file - virtual std::istream & read_restart (std::istream &is); - - /// Write the bias configuration to a restart file - virtual std::ostream & write_restart (std::ostream &os); - - /// Write a label to the trajectory file (comment line) - virtual std::ostream & write_traj_label (std::ostream &os); - - /// Output quantities such as the bias energy to the trajectory file - virtual std::ostream & write_traj (std::ostream &os); - - /// \brief Constructor - colvarbias_restraint (std::string const &conf, char const *key); - - /// Destructor - virtual ~colvarbias_restraint(); - - -protected: - - /// \brief Potential function - virtual cvm::real restraint_potential(cvm::real k, colvar* x, const colvarvalue& xcenter) const = 0; - - /// \brief Force function - virtual colvarvalue restraint_force(cvm::real k, colvar* x, const colvarvalue& xcenter) const = 0; - - ///\brief Unit scaling - virtual cvm::real restraint_convert_k(cvm::real k, cvm::real dist_measure) const = 0; - - /// \brief Restraint centers - std::vector colvar_centers; - - /// \brief Restraint centers without wrapping or constraints applied - std::vector colvar_centers_raw; - - /// \brief Moving target? - bool b_chg_centers; - - /// \brief New restraint centers - std::vector target_centers; - - /// \brief Amplitude of the restraint centers' increment at each step - /// (or stage) towards the new values (calculated from target_nsteps) - std::vector centers_incr; - - /// Whether to write the current restraint centers to the trajectory file - bool b_output_centers; - - /// Whether to write the current accumulated work to the trajectory file - bool b_output_acc_work; - - /// \brief Accumulated work - cvm::real acc_work; - - /// \brief Restraint force constant - cvm::real force_k; - - /// \brief Changing force constant? - bool b_chg_force_k; - - /// \brief Restraint force constant (target value) - cvm::real target_force_k; - - /// \brief Restraint force constant (starting value) - cvm::real starting_force_k; - - /// \brief Lambda-schedule for custom varying force constant - std::vector lambda_schedule; - - /// \brief Exponent for varying the force constant - cvm::real force_k_exp; - - /// \brief Intermediate quantity to compute the restraint free energy - /// (in TI, would be the accumulating FE derivative) - cvm::real restraint_FE; - - - /// \brief Equilibration steps for restraint FE calculation through TI - cvm::real target_equil_steps; - - /// \brief Number of stages over which to perform the change - /// If zero, perform a continuous change - int target_nstages; - - /// \brief Number of current stage of the perturbation - int stage; - - /// \brief Number of steps required to reach the target force constant - /// or restraint centers - size_t target_nsteps; -}; - -/// \brief Harmonic bias restraint -/// (implementation of \link colvarbias_restraint \endlink) -class colvarbias_restraint_harmonic : public colvarbias_restraint { - -public: - colvarbias_restraint_harmonic(std::string const &conf, char const *key); - -protected: /// \brief Potential function - virtual cvm::real restraint_potential(cvm::real k, colvar* x, const colvarvalue& xcenter) const; - - /// \brief Force function - virtual colvarvalue restraint_force(cvm::real k, colvar* x, const colvarvalue& xcenter) const; - - ///\brief Unit scaling - virtual cvm::real restraint_convert_k(cvm::real k, cvm::real dist_measure) const; - -}; - -/// \brief Linear bias restraint -/// (implementation of \link colvarbias_restraint \endlink) -class colvarbias_restraint_linear : public colvarbias_restraint { - -public: - colvarbias_restraint_linear(std::string const &conf, char const *key); - -protected: /// \brief Potential function - virtual cvm::real restraint_potential(cvm::real k, colvar* x, const colvarvalue& xcenter) const; - - /// \brief Force function - virtual colvarvalue restraint_force(cvm::real k, colvar* x, const colvarvalue& xcenter) const; - - ///\brief Unit scaling - virtual cvm::real restraint_convert_k(cvm::real k, cvm::real dist_measure) const; - -}; - - #endif - - - -// Emacs -// Local Variables: -// mode: C++ -// End: diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp index dcbfba6acd..cf5825650c 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -1,3 +1,5 @@ +/// -*- c++ -*- + /******************************************************************************** * Implementation of the ABF and histogram biases * ********************************************************************************/ @@ -13,6 +15,7 @@ colvarbias_abf::colvarbias_abf (std::string const &conf, char const *key) gradients (NULL), samples (NULL) { + // TODO relax this in case of VMD plugin if (cvm::temperature() == 0.0) cvm::log ("WARNING: ABF should not be run without a thermostat or at 0 Kelvin!\n"); @@ -44,13 +47,13 @@ colvarbias_abf::colvarbias_abf (std::string const &conf, char const *key) // ************* checking the associated colvars ******************* if (colvars.size() == 0) { - cvm::fatal_error ("Error: no collective variables specified for the ABF bias.\n"); + cvm::error ("Error: no collective variables specified for the ABF bias.\n"); } for (size_t i = 0; i < colvars.size(); i++) { if (colvars[i]->type() != colvarvalue::type_scalar) { - cvm::fatal_error ("Error: ABF bias can only use scalar-type variables.\n"); + cvm::error ("Error: ABF bias can only use scalar-type variables.\n"); } colvars[i]->enable (colvar::task_gradients); @@ -84,11 +87,11 @@ colvarbias_abf::colvarbias_abf (std::string const &conf, char const *key) if (get_keyval (conf, "maxForce", max_force)) { if (max_force.size() != colvars.size()) { - cvm::fatal_error ("Error: Number of parameters to maxForce does not match number of colvars."); + cvm::error ("Error: Number of parameters to maxForce does not match number of colvars."); } for (size_t i=0; iwrite_multicol (samples_os); samples_os.close (); if (!append) cvm::backup_file (gradients_out_name.c_str()); gradients_os.open (gradients_out_name.c_str(), mode); - if (!gradients_os.good()) cvm::fatal_error ("Error opening ABF gradient file " + gradients_out_name + " for writing"); + if (!gradients_os.good()) cvm::error ("Error opening ABF gradient file " + gradients_out_name + " for writing"); gradients->write_multicol (gradients_os); gradients_os.close (); @@ -257,7 +260,7 @@ void colvarbias_abf::write_gradients_samples (const std::string &prefix, bool ap std::ofstream pmf_os; // Do numerical integration and output a PMF pmf_os.open (pmf_out_name.c_str(), mode); - if (!pmf_os.good()) cvm::fatal_error ("Error opening pmf file " + pmf_out_name + " for writing"); + if (!pmf_os.good()) cvm::error ("Error opening pmf file " + pmf_out_name + " for writing"); gradients->write_1D_integral (pmf_os); pmf_os << std::endl; pmf_os.close (); @@ -278,13 +281,13 @@ void colvarbias_abf::read_gradients_samples () cvm::log ("Reading sample count from " + samples_in_name + " and gradients from " + gradients_in_name); is.open (samples_in_name.c_str()); - if (!is.good()) cvm::fatal_error ("Error opening ABF samples file " + samples_in_name + " for reading"); + if (!is.good()) cvm::error ("Error opening ABF samples file " + samples_in_name + " for reading"); samples->read_multicol (is, true); is.close (); is.clear(); is.open (gradients_in_name.c_str()); - if (!is.good()) cvm::fatal_error ("Error opening ABF gradient file " + gradients_in_name + " for reading"); + if (!is.good()) cvm::error ("Error opening ABF gradient file " + gradients_in_name + " for reading"); gradients->read_multicol (is, true); is.close (); } @@ -319,7 +322,7 @@ std::ostream & colvarbias_abf::write_restart (std::ostream& os) std::istream & colvarbias_abf::read_restart (std::istream& is) { if ( input_prefix.size() > 0 ) { - cvm::fatal_error ("ERROR: cannot provide both inputPrefix and restart information (colvarsInput)"); + cvm::error ("ERROR: cannot provide both inputPrefix and restart information (colvarsInput)"); } size_t const start_pos = is.tellg(); @@ -343,10 +346,10 @@ std::istream & colvarbias_abf::read_restart (std::istream& is) std::string name = ""; if ( (colvarparse::get_keyval (conf, "name", name, std::string (""), colvarparse::parse_silent)) && (name != this->name) ) - cvm::fatal_error ("Error: in the restart file, the " + cvm::error ("Error: in the restart file, the " "\"abf\" block has wrong name (" + name + ")\n"); if ( name == "" ) { - cvm::fatal_error ("Error: \"abf\" block in the restart file has no name.\n"); + cvm::error ("Error: \"abf\" block in the restart file has no name.\n"); } if ( !(is >> key) || !(key == "samples")) { @@ -359,7 +362,10 @@ std::istream & colvarbias_abf::read_restart (std::istream& is) return is; } if (! samples->read_raw (is)) { - samples->read_raw_error(); + is.clear(); + is.seekg (start_pos, std::ios::beg); + is.setstate (std::ios::failbit); + return is; } if ( !(is >> key) || !(key == "gradient")) { @@ -372,12 +378,15 @@ std::istream & colvarbias_abf::read_restart (std::istream& is) return is; } if (! gradients->read_raw (is)) { - gradients->read_raw_error(); + is.clear(); + is.seekg (start_pos, std::ios::beg); + is.setstate (std::ios::failbit); + return is; } is >> brace; if (brace != "}") { - cvm::fatal_error ("Error: corrupt restart information for ABF bias \""+ + cvm::error ("Error: corrupt restart information for ABF bias \""+ this->name+"\": no matching brace at position "+ cvm::to_str (is.tellg())+" in the restart file.\n"); is.setstate (std::ios::failbit); @@ -397,7 +406,7 @@ colvarbias_histogram::colvarbias_histogram (std::string const &conf, char const get_keyval (conf, "outputfreq", output_freq, cvm::restart_out_freq); if ( output_freq == 0 ) { - cvm::fatal_error ("User required histogram with zero output frequency"); + cvm::error ("User required histogram with zero output frequency"); } grid = new colvar_grid_count (colvars); @@ -440,7 +449,7 @@ cvm::real colvarbias_histogram::update() if (cvm::debug()) cvm::log ("Histogram bias trying to write grid to disk"); grid_os.open (out_name.c_str()); - if (!grid_os.good()) cvm::fatal_error ("Error opening histogram file " + out_name + " for writing"); + if (!grid_os.good()) cvm::error ("Error opening histogram file " + out_name + " for writing"); grid->write_multicol (grid_os); grid_os.close (); } @@ -472,15 +481,15 @@ std::istream & colvarbias_histogram::read_restart (std::istream& is) std::string name = ""; if ( (colvarparse::get_keyval (conf, "name", name, std::string (""), colvarparse::parse_silent)) && (name != this->name) ) - cvm::fatal_error ("Error: in the restart file, the " + cvm::error ("Error: in the restart file, the " "\"histogram\" block has a wrong name: different system?\n"); if ( (id == -1) && (name == "") ) { - cvm::fatal_error ("Error: \"histogram\" block in the restart file " + cvm::error ("Error: \"histogram\" block in the restart file " "has no name.\n"); } if ( !(is >> key) || !(key == "grid")) { - cvm::log ("Error: in reading restart configuration for histogram \""+ + cvm::error ("Error: in reading restart configuration for histogram \""+ this->name+"\" at position "+ cvm::to_str (is.tellg())+" in stream.\n"); is.clear(); @@ -489,14 +498,17 @@ std::istream & colvarbias_histogram::read_restart (std::istream& is) return is; } if (! grid->read_raw (is)) { - grid->read_raw_error(); + is.clear(); + is.seekg (start_pos, std::ios::beg); + is.setstate (std::ios::failbit); + return is; } is >> brace; if (brace != "}") { - cvm::fatal_error ("Error: corrupt restart information for ABF bias \""+ - this->name+"\": no matching brace at position "+ - cvm::to_str (is.tellg())+" in the restart file.\n"); + cvm::error ("Error: corrupt restart information for ABF bias \""+ + this->name+"\": no matching brace at position "+ + cvm::to_str (is.tellg())+" in the restart file.\n"); is.setstate (std::ios::failbit); } return is; diff --git a/lib/colvars/colvarbias_abf.h b/lib/colvars/colvarbias_abf.h index e82d2f08ac..6873a8f9b1 100644 --- a/lib/colvars/colvarbias_abf.h +++ b/lib/colvars/colvarbias_abf.h @@ -1,3 +1,5 @@ +/// -*- c++ -*- + /************************************************************************ * Headers for the ABF and histogram biases * ************************************************************************/ diff --git a/lib/colvars/colvarbias_alb.cpp b/lib/colvars/colvarbias_alb.cpp index 41e01d9695..867203a8ab 100644 --- a/lib/colvars/colvarbias_alb.cpp +++ b/lib/colvars/colvarbias_alb.cpp @@ -13,6 +13,7 @@ colvarbias_alb::colvarbias_alb(std::string const &conf, char const *key) : colvarbias(conf, key), update_calls(0), b_equilibration(true) { + size_t i; // get the initial restraint centers colvar_centers.resize (colvars.size()); @@ -29,7 +30,7 @@ colvarbias_alb::colvarbias_alb(std::string const &conf, char const *key) : coupling_rate.resize(colvars.size()); - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < colvars.size(); i++) { colvar_centers[i].type (colvars[i]->type()); //zero moments means[i] = ssd[i] = 0; @@ -39,7 +40,7 @@ colvarbias_alb::colvarbias_alb(std::string const &conf, char const *key) : } if (get_keyval (conf, "centers", colvar_centers, colvar_centers)) { - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < colvars.size(); i++) { colvar_centers[i].apply_constraints(); } } else { @@ -52,7 +53,7 @@ colvarbias_alb::colvarbias_alb(std::string const &conf, char const *key) : "that of collective variables.\n"); if(!get_keyval (conf, "UpdateFrequency", update_freq, 0)) - cvm::fatal_error("Error: must set updateFrequency for apadtive linear bias.\n"); + cvm::fatal_error("Error: must set updateFrequency for adaptive linear bias.\n"); //we split the time between updating and equilibrating update_freq /= 2; @@ -67,21 +68,21 @@ colvarbias_alb::colvarbias_alb(std::string const &conf, char const *key) : //initial guess if(!get_keyval (conf, "forceConstant", set_coupling, set_coupling)) - for(size_t i =0 ; i < colvars.size(); i++) + for(i =0 ; i < colvars.size(); i++) set_coupling[i] = 0.; //how we're going to increase to that point - for(size_t i = 0; i < colvars.size(); i++) + for(i = 0; i < colvars.size(); i++) coupling_rate[i] = (set_coupling[i] - current_coupling[i]) / update_freq; if(!get_keyval (conf, "forceRange", max_coupling_range, max_coupling_range)) { //set to default - for(size_t i = 0; i < colvars.size(); i++) { + for(i = 0; i < colvars.size(); i++) { if(cvm::temperature() > 0) - max_coupling_range[i] = 3 * cvm::temperature() * cvm::boltzmann(); + max_coupling_range[i] = 3 * cvm::temperature() * cvm::boltzmann(); else - max_coupling_range[i] = 3 * cvm::boltzmann(); + max_coupling_range[i] = 3 * cvm::boltzmann(); } } @@ -89,7 +90,7 @@ colvarbias_alb::colvarbias_alb(std::string const &conf, char const *key) : if(!get_keyval (conf, "rateMax", max_coupling_rate, max_coupling_rate)) { //set to default - for(size_t i = 0; i < colvars.size(); i++) { + for(i = 0; i < colvars.size(); i++) { max_coupling_rate[i] = max_coupling_range[i] / (10 * update_freq); } } @@ -123,9 +124,9 @@ cvm::real colvarbias_alb::update() { bool finished_equil_flag = 1; cvm::real delta; for (size_t i = 0; i < colvars.size(); i++) { - colvar_forces[i] = -restraint_force(restraint_convert_k(current_coupling[i], colvars[i]->width), - colvars[i], - colvar_centers[i]); + colvar_forces[i] = -1.0 * restraint_force(restraint_convert_k(current_coupling[i], colvars[i]->width), + colvars[i], + colvar_centers[i]); bias_energy += restraint_potential(restraint_convert_k(current_coupling[i], colvars[i]->width), colvars[i], colvar_centers[i]); @@ -193,7 +194,7 @@ cvm::real colvarbias_alb::update() { ssd[i] = 0; //stochastic if we do that update or not - if(colvars.size() == 1 || rand() < RAND_MAX / colvars.size()) { + if(colvars.size() == 1 || rand() < RAND_MAX / ((int) colvars.size())) { coupling_accum[i] += step_size * step_size; current_coupling[i] = set_coupling[i]; set_coupling[i] += max_coupling_range[i] / sqrt(coupling_accum[i]) * step_size; @@ -294,37 +295,38 @@ std::ostream & colvarbias_alb::write_restart (std::ostream &os) << " configuration {\n" << " name " << this->name << "\n"; os << " setCoupling "; - for(size_t i = 0; i < colvars.size(); i++) { + size_t i; + for(i = 0; i < colvars.size(); i++) { os << std::setprecision (cvm::en_prec) << std::setw (cvm::en_width) << set_coupling[i] << "\n"; } os << " currentCoupling "; - for(size_t i = 0; i < colvars.size(); i++) { + for(i = 0; i < colvars.size(); i++) { os << std::setprecision (cvm::en_prec) << std::setw (cvm::en_width) << current_coupling[i] << "\n"; } os << " maxCouplingRange "; - for(size_t i = 0; i < colvars.size(); i++) { + for(i = 0; i < colvars.size(); i++) { os << std::setprecision (cvm::en_prec) << std::setw (cvm::en_width) << max_coupling_range[i] << "\n"; } os << " couplingRate "; - for(size_t i = 0; i < colvars.size(); i++) { + for(i = 0; i < colvars.size(); i++) { os << std::setprecision (cvm::en_prec) << std::setw (cvm::en_width) << coupling_rate[i] << "\n"; } os << " couplingAccum "; - for(size_t i = 0; i < colvars.size(); i++) { + for(i = 0; i < colvars.size(); i++) { os << std::setprecision (cvm::en_prec) << std::setw (cvm::en_width) << coupling_accum[i] << "\n"; } os << " mean "; - for(size_t i = 0; i < colvars.size(); i++) { + for(i = 0; i < colvars.size(); i++) { os << std::setprecision (cvm::en_prec) << std::setw (cvm::en_width) << means[i] << "\n"; } os << " ssd "; - for(size_t i = 0; i < colvars.size(); i++) { + for(i = 0; i < colvars.size(); i++) { os << std::setprecision (cvm::en_prec) << std::setw (cvm::en_width) << ssd[i] << "\n"; } diff --git a/lib/colvars/colvarbias_alb.h b/lib/colvars/colvarbias_alb.h index 20ad20cf75..a79a9861e1 100644 --- a/lib/colvars/colvarbias_alb.h +++ b/lib/colvars/colvarbias_alb.h @@ -2,7 +2,7 @@ #define COLVARBIAS_ALB_H #include "colvar.h" -#include "colvarbias.h" +#include "colvarbias_restraint.h" class colvarbias_alb : public colvarbias { diff --git a/lib/colvars/colvarbias_meta.cpp b/lib/colvars/colvarbias_meta.cpp index cbdd2c20f6..5f5c021ebc 100644 --- a/lib/colvars/colvarbias_meta.cpp +++ b/lib/colvars/colvarbias_meta.cpp @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #include #include #include @@ -64,7 +66,8 @@ colvarbias_meta::colvarbias_meta (std::string const &conf, char const *key) get_keyval (conf, "rebinGrids", rebin_grids, false); expand_grids = false; - for (size_t i = 0; i < colvars.size(); i++) { + size_t i; + for (i = 0; i < colvars.size(); i++) { if (colvars[i]->expand_boundaries) { expand_grids = true; cvm::log ("Metadynamics bias \""+this->name+"\""+ @@ -79,7 +82,7 @@ colvarbias_meta::colvarbias_meta (std::string const &conf, char const *key) get_keyval (conf, "dumpFreeEnergyFile", dump_fes, true, colvarparse::parse_silent); get_keyval (conf, "saveFreeEnergyFile", dump_fes_save, false); - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < colvars.size(); i++) { colvars[i]->enable (colvar::task_grid); } @@ -91,6 +94,9 @@ colvarbias_meta::colvarbias_meta (std::string const &conf, char const *key) dump_fes = false; dump_fes_save = false; dump_replica_fes = false; + + hills_energy = NULL; + hills_energy_gradients = NULL; } if (comm != single_replica) { @@ -144,7 +150,7 @@ colvarbias_meta::colvarbias_meta (std::string const &conf, char const *key) replica_state_file = (std::string (pwd)+std::string (PATHSEP)+ cvm::output_prefix+".colvars."+this->name+"."+replica_id+".state"); - delete pwd; + delete[] pwd; } // now register this replica @@ -316,7 +322,7 @@ colvarbias_meta::delete_hill (hill_iter &h) "")+".\n"); } - if (use_grids && hills_off_grid.size()) { + if (use_grids && !hills_off_grid.empty()) { for (hill_iter hoff = hills_off_grid.begin(); hoff != hills_off_grid.end(); hoff++) { if (*h == *hoff) { @@ -458,9 +464,14 @@ cvm::real colvarbias_meta::update() case single_replica: if (well_tempered) { - std::vector curr_bin = hills_energy->get_colvars_index(); - cvm::real const hills_energy_sum_here = hills_energy->value(curr_bin); - cvm::real const exp_weight = std::exp(-hills_energy_sum_here/(bias_temperature*cvm::boltzmann())); + cvm::real hills_energy_sum_here = 0.0; + if (use_grids) { + std::vector curr_bin = hills_energy->get_colvars_index(); + hills_energy_sum_here = hills_energy->value(curr_bin); + } else { + calc_hills (new_hills_begin, hills.end(), hills_energy_sum_here); + } + cvm::real const exp_weight = std::exp(-1.0*hills_energy_sum_here/(bias_temperature*cvm::boltzmann())); create_hill (hill ((hill_weight*exp_weight), colvars, hill_width)); } else { create_hill (hill (hill_weight, colvars, hill_width)); @@ -469,9 +480,14 @@ cvm::real colvarbias_meta::update() case multiple_replicas: if (well_tempered) { - std::vector curr_bin = hills_energy->get_colvars_index(); - cvm::real const hills_energy_sum_here = hills_energy->value(curr_bin); - cvm::real const exp_weight = std::exp(-hills_energy_sum_here/(bias_temperature*cvm::boltzmann())); + cvm::real hills_energy_sum_here = 0.0; + if (use_grids) { + std::vector curr_bin = hills_energy->get_colvars_index(); + hills_energy_sum_here = hills_energy->value(curr_bin); + } else { + calc_hills (new_hills_begin, hills.end(), hills_energy_sum_here); + } + cvm::real const exp_weight = std::exp(-1.0*hills_energy_sum_here/(bias_temperature*cvm::boltzmann())); create_hill (hill ((hill_weight*exp_weight), colvars, hill_width, replica_id)); } else { create_hill (hill (hill_weight, colvars, hill_width, replica_id)); @@ -680,10 +696,11 @@ void colvarbias_meta::calc_hills_force (size_t const &i, // were already saved with their types matching those in the // colvars) + hill_iter h; switch (colvars[i]->type()) { case colvarvalue::type_scalar: - for (hill_iter h = h_first; h != h_last; h++) { + for (h = h_first; h != h_last; h++) { if (h->value() == 0.0) continue; colvarvalue const ¢er = h->centers[i]; cvm::real const half_width = 0.5 * h->widths[i]; @@ -695,7 +712,7 @@ void colvarbias_meta::calc_hills_force (size_t const &i, case colvarvalue::type_vector: case colvarvalue::type_unitvector: - for (hill_iter h = h_first; h != h_last; h++) { + for (h = h_first; h != h_last; h++) { if (h->value() == 0.0) continue; colvarvalue const ¢er = h->centers[i]; cvm::real const half_width = 0.5 * h->widths[i]; @@ -706,7 +723,7 @@ void colvarbias_meta::calc_hills_force (size_t const &i, break; case colvarvalue::type_quaternion: - for (hill_iter h = h_first; h != h_last; h++) { + for (h = h_first; h != h_last; h++) { if (h->value() == 0.0) continue; colvarvalue const ¢er = h->centers[i]; cvm::real const half_width = 0.5 * h->widths[i]; @@ -756,8 +773,8 @@ void colvarbias_meta::project_hills (colvarbias_meta::hill_iter h_first, for ( ; (he->index_ok (he_ix)) && (hg->index_ok (hg_ix)); count++) { - - for (size_t i = 0; i < colvars.size(); i++) { + size_t i; + for (i = 0; i < colvars.size(); i++) { colvar_values[i] = hills_energy->bin_to_value_scalar (he_ix[i], i); } @@ -766,7 +783,7 @@ void colvarbias_meta::project_hills (colvarbias_meta::hill_iter h_first, calc_hills (h_first, h_last, hills_energy_here, colvar_values); he->acc_value (he_ix, hills_energy_here); - for (size_t i = 0; i < colvars.size(); i++) { + for (i = 0; i < colvars.size(); i++) { hills_forces_here[i].reset(); calc_hills_force (i, h_first, h_last, hills_forces_here, colvar_values); colvar_forces_scalar[i] = hills_forces_here[i].real_value; @@ -935,10 +952,6 @@ void colvarbias_meta::update_replicas_registry() } } } - - // continue the cycle - new_replica_file = ""; - new_replica = ""; } else { cvm::fatal_error ("Error: cannot read the replicas registry file \""+ replicas_registry+"\".\n"); @@ -1279,7 +1292,7 @@ std::istream & colvarbias_meta::read_restart (std::istream& is) } } - bool const existing_hills = (hills.size() > 0); + bool const existing_hills = !hills.empty(); size_t const old_hills_size = hills.size(); hill_iter old_hills_end = hills.end(); hill_iter old_hills_off_grid_end = hills_off_grid.end(); @@ -1299,7 +1312,7 @@ std::istream & colvarbias_meta::read_restart (std::istream& is) cvm::log ("Read "+cvm::to_str (hills.size())+ " hills in addition to the grids.\n"); } else { - if (hills.size()) + if (!hills.empty()) cvm::log ("Read "+cvm::to_str (hills.size())+" hills.\n"); } @@ -1314,7 +1327,7 @@ std::istream & colvarbias_meta::read_restart (std::istream& is) colvar_grid_gradient *new_hills_energy_gradients = new colvar_grid_gradient (colvars); - if (!grids_from_restart_file || (keep_hills && hills.size())) { + if (!grids_from_restart_file || (keep_hills && !hills.empty())) { // if there are hills, recompute the new grids from them cvm::log ("Rebinning the energy and forces grids from "+ cvm::to_str (hills.size())+" hills (this may take a while)...\n"); @@ -1337,12 +1350,12 @@ std::istream & colvarbias_meta::read_restart (std::istream& is) // assuming that some boundaries have expanded, eliminate those // off-grid hills that aren't necessary any more - if (hills.size()) + if (!hills.empty()) recount_hills_off_grid (hills.begin(), hills.end(), hills_energy); } if (use_grids) { - if (hills_off_grid.size()) { + if (!hills_off_grid.empty()) { cvm::log (cvm::to_str (hills_off_grid.size())+" hills are near the " "grid boundaries: they will be computed analytically " "and saved to the state files.\n"); @@ -1656,15 +1669,16 @@ std::string colvarbias_meta::hill::output_traj() os.setf (std::ios::scientific, std::ios::floatfield); + size_t i; os << " "; - for (size_t i = 0; i < centers.size(); i++) { + for (i = 0; i < centers.size(); i++) { os << " "; os << std::setprecision (cvm::cv_prec) << std::setw (cvm::cv_width) << centers[i]; } os << " "; - for (size_t i = 0; i < widths.size(); i++) { + for (i = 0; i < widths.size(); i++) { os << " "; os << std::setprecision (cvm::cv_prec) << std::setw (cvm::cv_width) << widths[i]; @@ -1692,8 +1706,9 @@ std::ostream & operator << (std::ostream &os, colvarbias_meta::hill const &h) if (h.replica.size()) os << " replicaID " << h.replica << "\n"; + size_t i; os << " centers "; - for (size_t i = 0; i < (h.centers).size(); i++) { + for (i = 0; i < (h.centers).size(); i++) { os << " " << std::setprecision (cvm::cv_prec) << std::setw (cvm::cv_width) @@ -1702,7 +1717,7 @@ std::ostream & operator << (std::ostream &os, colvarbias_meta::hill const &h) os << "\n"; os << " widths "; - for (size_t i = 0; i < (h.widths).size(); i++) { + for (i = 0; i < (h.widths).size(); i++) { os << " " << std::setprecision (cvm::cv_prec) << std::setw (cvm::cv_width) diff --git a/lib/colvars/colvarbias_meta.h b/lib/colvars/colvarbias_meta.h index 8c3eb91003..42faac9d5c 100644 --- a/lib/colvars/colvarbias_meta.h +++ b/lib/colvars/colvarbias_meta.h @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #ifndef COLVARBIAS_META_H #define COLVARBIAS_META_H @@ -224,7 +226,7 @@ protected: std::ofstream replica_hills_os; /// Position within replica_hills_file (when reading it) - size_t replica_hills_file_pos; + int replica_hills_file_pos; }; @@ -417,9 +419,3 @@ public: #endif - - -// Emacs -// Local Variables: -// mode: C++ -// End: diff --git a/lib/colvars/colvarbias_restraint.cpp b/lib/colvars/colvarbias_restraint.cpp new file mode 100644 index 0000000000..f5e2ae8e76 --- /dev/null +++ b/lib/colvars/colvarbias_restraint.cpp @@ -0,0 +1,530 @@ +/// -*- c++ -*- + +#include "colvarmodule.h" +#include "colvarvalue.h" +#include "colvarbias_restraint.h" + + +colvarbias_restraint::colvarbias_restraint (std::string const &conf, + char const *key) + : colvarbias (conf, key), + target_nstages (0), + target_nsteps (0) +{ + get_keyval (conf, "forceConstant", force_k, 1.0); + + // get the initial restraint centers + colvar_centers.resize (colvars.size()); + colvar_centers_raw.resize (colvars.size()); + for (size_t i = 0; i < colvars.size(); i++) { + colvar_centers[i].type (colvars[i]->type()); + colvar_centers_raw[i].type (colvars[i]->type()); + } + if (get_keyval (conf, "centers", colvar_centers, colvar_centers)) { + for (size_t i = 0; i < colvars.size(); i++) { + colvar_centers[i].apply_constraints(); + colvar_centers_raw[i] = colvar_centers[i]; + } + } else { + colvar_centers.clear(); + cvm::error ("Error: must define the initial centers of the restraints.\n"); + } + + if (colvar_centers.size() != colvars.size()) + cvm::error ("Error: number of centers does not match " + "that of collective variables.\n"); + + if (get_keyval (conf, "targetCenters", target_centers, colvar_centers)) { + b_chg_centers = true; + for (size_t i = 0; i < target_centers.size(); i++) { + target_centers[i].apply_constraints(); + } + } else { + b_chg_centers = false; + target_centers.clear(); + } + + if (get_keyval (conf, "targetForceConstant", target_force_k, 0.0)) { + if (b_chg_centers) + cvm::error ("Error: cannot specify both targetCenters and targetForceConstant.\n"); + + starting_force_k = force_k; + b_chg_force_k = true; + + get_keyval (conf, "targetEquilSteps", target_equil_steps, 0); + + get_keyval (conf, "lambdaSchedule", lambda_schedule, lambda_schedule); + if (lambda_schedule.size()) { + // There is one more lambda-point than stages + target_nstages = lambda_schedule.size() - 1; + } + } else { + b_chg_force_k = false; + } + + if (b_chg_centers || b_chg_force_k) { + get_keyval (conf, "targetNumSteps", target_nsteps, 0); + if (!target_nsteps) + cvm::error ("Error: targetNumSteps must be non-zero.\n"); + + if (get_keyval (conf, "targetNumStages", target_nstages, target_nstages) && + lambda_schedule.size()) { + cvm::error ("Error: targetNumStages and lambdaSchedule are incompatible.\n"); + } + + if (target_nstages) { + // This means that either numStages of lambdaSchedule has been provided + stage = 0; + restraint_FE = 0.0; + } + + if (get_keyval (conf, "targetForceExponent", force_k_exp, 1.0)) { + if (! b_chg_force_k) + cvm::log ("Warning: not changing force constant: targetForceExponent will be ignored\n"); + if (force_k_exp < 1.0) + cvm::log ("Warning: for all practical purposes, targetForceExponent should be 1.0 or greater.\n"); + } + } + + get_keyval (conf, "outputCenters", b_output_centers, false); + if (b_chg_centers) { + get_keyval (conf, "outputAccumulatedWork", b_output_acc_work, false); + } else { + b_output_acc_work = false; + } + acc_work = 0.0; + + if (cvm::debug()) + cvm::log ("Done initializing a new restraint bias.\n"); +} + +colvarbias_restraint::~colvarbias_restraint () +{ + if (cvm::n_rest_biases > 0) + cvm::n_rest_biases -= 1; +} + + +void colvarbias_restraint::change_configuration (std::string const &conf) +{ + get_keyval (conf, "forceConstant", force_k, force_k); + if (get_keyval (conf, "centers", colvar_centers, colvar_centers)) { + for (size_t i = 0; i < colvars.size(); i++) { + colvar_centers[i].apply_constraints(); + colvar_centers_raw[i] = colvar_centers[i]; + } + } +} + + +cvm::real colvarbias_restraint::energy_difference (std::string const &conf) +{ + std::vector alt_colvar_centers; + cvm::real alt_force_k; + cvm::real alt_bias_energy = 0.0; + + get_keyval (conf, "forceConstant", alt_force_k, force_k); + + alt_colvar_centers.resize (colvars.size()); + size_t i; + for (i = 0; i < colvars.size(); i++) { + alt_colvar_centers[i].type (colvars[i]->type()); + } + if (get_keyval (conf, "centers", alt_colvar_centers, colvar_centers)) { + for (i = 0; i < colvars.size(); i++) { + colvar_centers[i].apply_constraints(); + } + } + + for (i = 0; i < colvars.size(); i++) { + alt_bias_energy += restraint_potential(restraint_convert_k(alt_force_k, colvars[i]->width), + colvars[i], + alt_colvar_centers[i]); + } + + return alt_bias_energy - bias_energy; +} + + +cvm::real colvarbias_restraint::update() +{ + bias_energy = 0.0; + + if (cvm::debug()) + cvm::log ("Updating the restraint bias \""+this->name+"\".\n"); + + // Setup first stage of staged variable force constant calculation + if (b_chg_force_k && target_nstages && cvm::step_absolute() == 0) { + cvm::real lambda; + if (lambda_schedule.size()) { + lambda = lambda_schedule[0]; + } else { + lambda = 0.0; + } + force_k = starting_force_k + (target_force_k - starting_force_k) + * std::pow (lambda, force_k_exp); + cvm::log ("Restraint " + this->name + ", stage " + + cvm::to_str(stage) + " : lambda = " + cvm::to_str(lambda)); + cvm::log ("Setting force constant to " + cvm::to_str (force_k)); + } + + if (b_chg_centers) { + + if (!centers_incr.size()) { + // if this is the first calculation, calculate the advancement + // at each simulation step (or stage, if applicable) + // (take current stage into account: it can be non-zero + // if we are restarting a staged calculation) + centers_incr.resize (colvars.size()); + for (size_t i = 0; i < colvars.size(); i++) { + centers_incr[i].type (colvars[i]->type()); + centers_incr[i] = (target_centers[i] - colvar_centers_raw[i]) / + cvm::real ( target_nstages ? (target_nstages - stage) : + (target_nsteps - cvm::step_absolute())); + } + if (cvm::debug()) { + cvm::log ("Center increment for the restraint bias \""+ + this->name+"\": "+cvm::to_str (centers_incr)+" at stage "+cvm::to_str (stage)+ ".\n"); + } + } + + if (target_nstages) { + if ((cvm::step_relative() > 0) + && (cvm::step_absolute() % target_nsteps) == 0 + && stage < target_nstages) { + + for (size_t i = 0; i < colvars.size(); i++) { + colvar_centers_raw[i] += centers_incr[i]; + colvar_centers[i] = colvar_centers_raw[i]; + colvars[i]->wrap(colvar_centers[i]); + colvar_centers[i].apply_constraints(); + } + stage++; + cvm::log ("Moving restraint \"" + this->name + + "\" stage " + cvm::to_str(stage) + + " : setting centers to " + cvm::to_str (colvar_centers) + + " at step " + cvm::to_str (cvm::step_absolute())); + } + } else if ((cvm::step_relative() > 0) && (cvm::step_absolute() <= target_nsteps)) { + // move the restraint centers in the direction of the targets + // (slow growth) + for (size_t i = 0; i < colvars.size(); i++) { + colvar_centers_raw[i] += centers_incr[i]; + colvar_centers[i] = colvar_centers_raw[i]; + colvars[i]->wrap(colvar_centers[i]); + colvar_centers[i].apply_constraints(); + } + } + + if (cvm::debug()) + cvm::log ("Current centers for the restraint bias \""+ + this->name+"\": "+cvm::to_str (colvar_centers)+".\n"); + } + + if (b_chg_force_k) { + // Coupling parameter, between 0 and 1 + cvm::real lambda; + + if (target_nstages) { + // TI calculation: estimate free energy derivative + // need current lambda + if (lambda_schedule.size()) { + lambda = lambda_schedule[stage]; + } else { + lambda = cvm::real(stage) / cvm::real(target_nstages); + } + + if (target_equil_steps == 0 || cvm::step_absolute() % target_nsteps >= target_equil_steps) { + // Start averaging after equilibration period, if requested + + // Square distance normalized by square colvar width + cvm::real dist_sq = 0.0; + for (size_t i = 0; i < colvars.size(); i++) { + dist_sq += colvars[i]->dist2 (colvars[i]->value(), colvar_centers[i]) + / (colvars[i]->width * colvars[i]->width); + } + + restraint_FE += 0.5 * force_k_exp * std::pow(lambda, force_k_exp - 1.0) + * (target_force_k - starting_force_k) * dist_sq; + } + + // Finish current stage... + if (cvm::step_absolute() % target_nsteps == 0 && + cvm::step_absolute() > 0) { + + cvm::log ("Lambda= " + cvm::to_str (lambda) + " dA/dLambda= " + + cvm::to_str (restraint_FE / cvm::real(target_nsteps - target_equil_steps))); + + // ...and move on to the next one + if (stage < target_nstages) { + + restraint_FE = 0.0; + stage++; + if (lambda_schedule.size()) { + lambda = lambda_schedule[stage]; + } else { + lambda = cvm::real(stage) / cvm::real(target_nstages); + } + force_k = starting_force_k + (target_force_k - starting_force_k) + * std::pow (lambda, force_k_exp); + cvm::log ("Restraint " + this->name + ", stage " + + cvm::to_str(stage) + " : lambda = " + cvm::to_str(lambda)); + cvm::log ("Setting force constant to " + cvm::to_str (force_k)); + } + } + } else if (cvm::step_absolute() <= target_nsteps) { + // update force constant (slow growth) + lambda = cvm::real(cvm::step_absolute()) / cvm::real(target_nsteps); + force_k = starting_force_k + (target_force_k - starting_force_k) + * std::pow (lambda, force_k_exp); + } + } + + if (cvm::debug()) + cvm::log ("Done updating the restraint bias \""+this->name+"\".\n"); + + // Force and energy calculation + for (size_t i = 0; i < colvars.size(); i++) { + colvar_forces[i] = -1.0 * restraint_force(restraint_convert_k(force_k, colvars[i]->width), + colvars[i], + colvar_centers[i]); + bias_energy += restraint_potential(restraint_convert_k(force_k, colvars[i]->width), + colvars[i], + colvar_centers[i]); + if (cvm::debug()) { + cvm::log ("dist_grad["+cvm::to_str (i)+ + "] = "+cvm::to_str (colvars[i]->dist2_lgrad (colvars[i]->value(), + colvar_centers[i]))+"\n"); + } + } + + if (b_output_acc_work) { + if ((cvm::step_relative() > 0) || (cvm::step_absolute() == 0)) { + for (size_t i = 0; i < colvars.size(); i++) { + // project forces on the calculated increments at this step + acc_work += colvar_forces[i] * centers_incr[i]; + } + } + } + + if (cvm::debug()) + cvm::log ("Current forces for the restraint bias \""+ + this->name+"\": "+cvm::to_str (colvar_forces)+".\n"); + + return bias_energy; +} + + +std::istream & colvarbias_restraint::read_restart (std::istream &is) +{ + size_t const start_pos = is.tellg(); + + cvm::log ("Restarting restraint bias \""+ + this->name+"\".\n"); + + std::string key, brace, conf; + if ( !(is >> key) || !(key == "restraint" || key == "harmonic") || + !(is >> brace) || !(brace == "{") || + !(is >> colvarparse::read_block ("configuration", conf)) ) { + + cvm::log ("Error: in reading restart configuration for restraint bias \""+ + this->name+"\" at position "+ + cvm::to_str (is.tellg())+" in stream.\n"); + is.clear(); + is.seekg (start_pos, std::ios::beg); + is.setstate (std::ios::failbit); + return is; + } + +// int id = -1; + std::string name = ""; +// if ( ( (colvarparse::get_keyval (conf, "id", id, -1, colvarparse::parse_silent)) && +// (id != this->id) ) || + if ( (colvarparse::get_keyval (conf, "name", name, std::string (""), colvarparse::parse_silent)) && + (name != this->name) ) + cvm::error ("Error: in the restart file, the " + "\"restraint\" block has a wrong name\n"); +// if ( (id == -1) && (name == "") ) { + if (name.size() == 0) { + cvm::error ("Error: \"restraint\" block in the restart file " + "has no identifiers.\n"); + } + + if (b_chg_centers) { +// cvm::log ("Reading the updated restraint centers from the restart.\n"); + if (!get_keyval (conf, "centers", colvar_centers)) + cvm::error ("Error: restraint centers are missing from the restart.\n"); + if (!get_keyval (conf, "centers_raw", colvar_centers_raw)) + cvm::error ("Error: \"raw\" restraint centers are missing from the restart.\n"); + } + + if (b_chg_force_k) { +// cvm::log ("Reading the updated force constant from the restart.\n"); + if (!get_keyval (conf, "forceConstant", force_k)) + cvm::error ("Error: force constant is missing from the restart.\n"); + } + + if (target_nstages) { +// cvm::log ("Reading current stage from the restart.\n"); + if (!get_keyval (conf, "stage", stage)) + cvm::error ("Error: current stage is missing from the restart.\n"); + } + + if (b_output_acc_work) { + if (!get_keyval (conf, "accumulatedWork", acc_work)) + cvm::error ("Error: accumulatedWork is missing from the restart.\n"); + } + + is >> brace; + if (brace != "}") { + cvm::error ("Error: corrupt restart information for restraint bias \""+ + this->name+"\": no matching brace at position "+ + cvm::to_str (is.tellg())+" in the restart file.\n"); + is.setstate (std::ios::failbit); + } + return is; +} + + +std::ostream & colvarbias_restraint::write_restart (std::ostream &os) +{ + os << "restraint {\n" + << " configuration {\n" + // << " id " << this->id << "\n" + << " name " << this->name << "\n"; + + if (b_chg_centers) { + size_t i; + os << " centers "; + for (i = 0; i < colvars.size(); i++) { + os << " " << colvar_centers[i]; + } + os << "\n"; + os << " centers_raw "; + for (i = 0; i < colvars.size(); i++) { + os << " " << colvar_centers_raw[i]; + } + os << "\n"; + } + + if (b_chg_force_k) { + os << " forceConstant " + << std::setprecision (cvm::en_prec) + << std::setw (cvm::en_width) << force_k << "\n"; + } + + if (target_nstages) { + os << " stage " << std::setw (cvm::it_width) + << stage << "\n"; + } + + if (b_output_acc_work) { + os << " accumulatedWork " << acc_work << "\n"; + } + + os << " }\n" + << "}\n\n"; + + return os; +} + + +std::ostream & colvarbias_restraint::write_traj_label (std::ostream &os) +{ + os << " "; + + if (b_output_energy) + os << " E_" + << cvm::wrap_string (this->name, cvm::en_width-2); + + if (b_output_centers) + for (size_t i = 0; i < colvars.size(); i++) { + size_t const this_cv_width = (colvars[i]->value()).output_width (cvm::cv_width); + os << " x0_" + << cvm::wrap_string (colvars[i]->name, this_cv_width-3); + } + + if (b_output_acc_work) + os << " W_" + << cvm::wrap_string (this->name, cvm::en_width-2); + + return os; +} + + +std::ostream & colvarbias_restraint::write_traj (std::ostream &os) +{ + os << " "; + + if (b_output_energy) + os << " " + << std::setprecision (cvm::en_prec) << std::setw (cvm::en_width) + << bias_energy; + + if (b_output_centers) + for (size_t i = 0; i < colvars.size(); i++) { + os << " " + << std::setprecision (cvm::cv_prec) << std::setw (cvm::cv_width) + << colvar_centers[i]; + } + + if (b_output_acc_work) + os << " " + << std::setprecision (cvm::en_prec) << std::setw (cvm::en_width) + << acc_work; + + return os; +} + +colvarbias_restraint_harmonic::colvarbias_restraint_harmonic(std::string const &conf, char const *key) : + colvarbias_restraint(conf, key) { + for (size_t i = 0; i < colvars.size(); i++) { + if (colvars[i]->width != 1.0) + cvm::log ("The force constant for colvar \""+colvars[i]->name+ + "\" will be rescaled to "+ + cvm::to_str (restraint_convert_k(force_k, colvars[i]->width))+ + " according to the specified width.\n"); + } +} + +cvm::real colvarbias_restraint_harmonic::restraint_potential(cvm::real k, colvar* x, const colvarvalue &xcenter) const +{ + return 0.5 * k * x->dist2(x->value(), xcenter); +} + +colvarvalue colvarbias_restraint_harmonic::restraint_force(cvm::real k, colvar* x, const colvarvalue &xcenter) const +{ + return 0.5 * k * x->dist2_lgrad(x->value(), xcenter); +} + +cvm::real colvarbias_restraint_harmonic::restraint_convert_k(cvm::real k, cvm::real dist_measure) const +{ + return k / (dist_measure * dist_measure); +} + + +colvarbias_restraint_linear::colvarbias_restraint_linear(std::string const &conf, char const *key) : + colvarbias_restraint(conf, key) { + for (size_t i = 0; i < colvars.size(); i++) { + if (colvars[i]->width != 1.0) + cvm::log ("The force constant for colvar \""+colvars[i]->name+ + "\" will be rescaled to "+ + cvm::to_str (restraint_convert_k(force_k, colvars[i]->width))+ + " according to the specified width.\n"); + } +} + +cvm::real colvarbias_restraint_linear::restraint_potential(cvm::real k, colvar* x, const colvarvalue &xcenter) const +{ + return k * (x->value() - xcenter); +} + +colvarvalue colvarbias_restraint_linear::restraint_force(cvm::real k, colvar* x, const colvarvalue &xcenter) const +{ + return k; +} + +cvm::real colvarbias_restraint_linear::restraint_convert_k(cvm::real k, cvm::real dist_measure) const +{ + return k / dist_measure; +} diff --git a/lib/colvars/colvarbias_restraint.h b/lib/colvars/colvarbias_restraint.h new file mode 100644 index 0000000000..1e55c6e079 --- /dev/null +++ b/lib/colvars/colvarbias_restraint.h @@ -0,0 +1,153 @@ +/// -*- c++ -*- + +#ifndef COLVARBIAS_RESTRAINT_H +#define COLVARBIAS_RESTRAINT_H + +#include "colvarbias.h" + +/// \brief Bias restraint, optionally moving towards a target +/// (implementation of \link colvarbias \endlink) +class colvarbias_restraint : public colvarbias { + +public: + + /// Retrieve colvar values and calculate their biasing forces + virtual cvm::real update(); + + /// Load new configuration - force constant and/or centers only + virtual void change_configuration(std::string const &conf); + + /// Calculate change in energy from using alternate configuration + virtual cvm::real energy_difference(std::string const &conf); + + /// Read the bias configuration from a restart file + virtual std::istream & read_restart (std::istream &is); + + /// Write the bias configuration to a restart file + virtual std::ostream & write_restart (std::ostream &os); + + /// Write a label to the trajectory file (comment line) + virtual std::ostream & write_traj_label (std::ostream &os); + + /// Output quantities such as the bias energy to the trajectory file + virtual std::ostream & write_traj (std::ostream &os); + + /// \brief Constructor + colvarbias_restraint (std::string const &conf, char const *key); + + /// Destructor + virtual ~colvarbias_restraint(); + + +protected: + + /// \brief Potential function + virtual cvm::real restraint_potential(cvm::real k, colvar* x, const colvarvalue& xcenter) const = 0; + + /// \brief Force function + virtual colvarvalue restraint_force(cvm::real k, colvar* x, const colvarvalue& xcenter) const = 0; + + ///\brief Unit scaling + virtual cvm::real restraint_convert_k(cvm::real k, cvm::real dist_measure) const = 0; + + /// \brief Restraint centers + std::vector colvar_centers; + + /// \brief Restraint centers without wrapping or constraints applied + std::vector colvar_centers_raw; + + /// \brief Moving target? + bool b_chg_centers; + + /// \brief New restraint centers + std::vector target_centers; + + /// \brief Amplitude of the restraint centers' increment at each step + /// (or stage) towards the new values (calculated from target_nsteps) + std::vector centers_incr; + + /// Whether to write the current restraint centers to the trajectory file + bool b_output_centers; + + /// Whether to write the current accumulated work to the trajectory file + bool b_output_acc_work; + + /// \brief Accumulated work + cvm::real acc_work; + + /// \brief Restraint force constant + cvm::real force_k; + + /// \brief Changing force constant? + bool b_chg_force_k; + + /// \brief Restraint force constant (target value) + cvm::real target_force_k; + + /// \brief Restraint force constant (starting value) + cvm::real starting_force_k; + + /// \brief Lambda-schedule for custom varying force constant + std::vector lambda_schedule; + + /// \brief Exponent for varying the force constant + cvm::real force_k_exp; + + /// \brief Intermediate quantity to compute the restraint free energy + /// (in TI, would be the accumulating FE derivative) + cvm::real restraint_FE; + + + /// \brief Equilibration steps for restraint FE calculation through TI + cvm::real target_equil_steps; + + /// \brief Number of stages over which to perform the change + /// If zero, perform a continuous change + int target_nstages; + + /// \brief Number of current stage of the perturbation + int stage; + + /// \brief Number of steps required to reach the target force constant + /// or restraint centers + size_t target_nsteps; +}; + +/// \brief Harmonic bias restraint +/// (implementation of \link colvarbias_restraint \endlink) +class colvarbias_restraint_harmonic : public colvarbias_restraint { + +public: + colvarbias_restraint_harmonic(std::string const &conf, char const *key); + +protected: /// \brief Potential function + virtual cvm::real restraint_potential(cvm::real k, colvar* x, const colvarvalue& xcenter) const; + + /// \brief Force function + virtual colvarvalue restraint_force(cvm::real k, colvar* x, const colvarvalue& xcenter) const; + + ///\brief Unit scaling + virtual cvm::real restraint_convert_k(cvm::real k, cvm::real dist_measure) const; + +}; + +/// \brief Linear bias restraint +/// (implementation of \link colvarbias_restraint \endlink) +class colvarbias_restraint_linear : public colvarbias_restraint { + +public: + colvarbias_restraint_linear(std::string const &conf, char const *key); + +protected: /// \brief Potential function + virtual cvm::real restraint_potential(cvm::real k, colvar* x, const colvarvalue& xcenter) const; + + /// \brief Force function + virtual colvarvalue restraint_force(cvm::real k, colvar* x, const colvarvalue& xcenter) const; + + ///\brief Unit scaling + virtual cvm::real restraint_convert_k(cvm::real k, cvm::real dist_measure) const; + +}; + + +#endif diff --git a/lib/colvars/colvarcomp.cpp b/lib/colvars/colvarcomp.cpp index f509d8fcc3..f333f5db3e 100644 --- a/lib/colvars/colvarcomp.cpp +++ b/lib/colvars/colvarcomp.cpp @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #include "colvarmodule.h" #include "colvarvalue.h" #include "colvar.h" @@ -78,18 +80,14 @@ void colvar::cvc::debug_gradients (cvm::atom_group &group) // this function should work for any scalar variable: // the only difference will be the name of the atom group (here, "group") - // collect into a vector for convenience - std::vector gradients (group.size()); - for (size_t i = 0; i < group.size(); i++) { - gradients[i] = group[i].grad; - } + if (group.b_dummy) return; cvm::rotation const rot_0 = group.rot; cvm::rotation const rot_inv = group.rot.inverse(); cvm::real const x_0 = x.real_value; - cvm::log ("gradients = "+cvm::to_str (gradients)+"\n"); + // cvm::log ("gradients = "+cvm::to_str (gradients)+"\n"); // it only makes sense to debug the fit gradients // when the fitting group is the same as this group @@ -131,7 +129,8 @@ void colvar::cvc::debug_gradients (cvm::atom_group &group) cvm::log ("Atom "+cvm::to_str (ia)+", component "+cvm::to_str (id)+":\n"); cvm::log ("dx(actual) = "+cvm::to_str (x_1 - x_0, 21, 14)+"\n"); - cvm::real const dx_pred = (group.fit_gradients.size() && (group.ref_pos_group == NULL)) ? + //cvm::real const dx_pred = (group.fit_gradients.size() && (group.ref_pos_group == NULL)) ? + cvm::real const dx_pred = (group.fit_gradients.size()) ? (cvm::debug_gradients_step_size * (atom_grad[id] + group.fit_gradients[ia][id])) : (cvm::debug_gradients_step_size * atom_grad[id]); cvm::log ("dx(interp) = "+cvm::to_str (dx_pred, @@ -141,7 +140,45 @@ void colvar::cvc::debug_gradients (cvm::atom_group &group) std::fabs (x_1 - x_0), 12, 5)+ ".\n"); - } } + +/* + * The code below is WIP + */ +// if (group.ref_pos_group != NULL) { +// cvm::atom_group &ref = *group.ref_pos_group; +// group.calc_fit_gradients(); +// +// for (size_t ia = 0; ia < ref.size(); ia++) { +// +// for (size_t id = 0; id < 3; id++) { +// // (re)read original positions +// group.read_positions(); +// ref.read_positions(); +// // change one coordinate +// ref[ia].pos[id] += cvm::debug_gradients_step_size; +// group.calc_apply_roto_translation(); +// calc_value(); +// cvm::real const x_1 = x.real_value; +// cvm::log ("refPosGroup atom "+cvm::to_str (ia)+", component "+cvm::to_str (id)+":\n"); +// cvm::log ("dx(actual) = "+cvm::to_str (x_1 - x_0, +// 21, 14)+"\n"); +// //cvm::real const dx_pred = (group.fit_gradients.size() && (group.ref_pos_group == NULL)) ? +// // cvm::real const dx_pred = (group.fit_gradients.size()) ? +// // (cvm::debug_gradients_step_size * (atom_grad[id] + group.fit_gradients[ia][id])) : +// // (cvm::debug_gradients_step_size * atom_grad[id]); +// cvm::real const dx_pred = cvm::debug_gradients_step_size * ref.fit_gradients[ia][id]; +// cvm::log ("dx(interp) = "+cvm::to_str (dx_pred, +// 21, 14)+"\n"); +// cvm::log ("|dx(actual) - dx(interp)|/|dx(actual)| = "+ +// cvm::to_str (std::fabs (x_1 - x_0 - dx_pred) / +// std::fabs (x_1 - x_0), +// 12, 5)+ +// ".\n"); +// } +// } +// } + + return; } diff --git a/lib/colvars/colvarcomp.h b/lib/colvars/colvarcomp.h index 6a4315d9d1..1785d090c6 100644 --- a/lib/colvars/colvarcomp.h +++ b/lib/colvars/colvarcomp.h @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #ifndef COLVARCOMP_H #define COLVARCOMP_H @@ -296,8 +298,8 @@ inline cvm::real colvar::cvc::compare (colvarvalue const &x1, if (this->type() == colvarvalue::type_scalar) { return cvm::real (x1 - x2); } else { - cvm::fatal_error ("Error: you requested an operation which requires " - "comparison between two non-scalar values.\n"); + cvm::error ("Error: you requested an operation which requires " + "comparison between two non-scalar values.\n"); return 0.0; } } @@ -1050,6 +1052,31 @@ public: }; +/// \brief Colvar component: cosine of the angle of rotation with respect to a set +/// of reference coordinates (colvarvalue::type_scalar type, range +/// [-1:1]) +class colvar::orientation_proj + : public colvar::orientation +{ +public: + + orientation_proj (std::string const &conf); + orientation_proj(); + virtual inline ~orientation_proj() {} + virtual void calc_value(); + virtual void calc_gradients(); + virtual void apply_force (colvarvalue const &force); + virtual cvm::real dist2 (colvarvalue const &x1, + colvarvalue const &x2) const; + virtual colvarvalue dist2_lgrad (colvarvalue const &x1, + colvarvalue const &x2) const; + virtual colvarvalue dist2_rgrad (colvarvalue const &x1, + colvarvalue const &x2) const; + virtual cvm::real compare (colvarvalue const &x1, + colvarvalue const &x2) const; +}; + + /// \brief Colvar component: projection of the orientation vector onto /// a predefined axis (colvarvalue::type_scalar type, range [-1:1]) class colvar::tilt @@ -1199,6 +1226,7 @@ public: simple_scalar_dist_functions (inertia_z) simple_scalar_dist_functions (rmsd) simple_scalar_dist_functions (orientation_angle) + simple_scalar_dist_functions (orientation_proj) simple_scalar_dist_functions (tilt) simple_scalar_dist_functions (eigenvector) // simple_scalar_dist_functions (alpha_dihedrals) @@ -1379,7 +1407,7 @@ inline colvarvalue colvar::distance_vec::dist2_rgrad (colvarvalue const &x1, inline cvm::real colvar::distance_vec::compare (colvarvalue const &x1, colvarvalue const &x2) const { - cvm::fatal_error ("Error: cannot compare() two distance vectors.\n"); + cvm::error ("Error: cannot compare() two distance vectors.\n"); return 0.0; } @@ -1404,7 +1432,7 @@ inline colvarvalue colvar::distance_dir::dist2_rgrad (colvarvalue const &x1, inline cvm::real colvar::distance_dir::compare (colvarvalue const &x1, colvarvalue const &x2) const { - cvm::fatal_error ("Error: cannot compare() two distance directions.\n"); + cvm::error ("Error: cannot compare() two distance directions.\n"); return 0.0; } @@ -1431,15 +1459,9 @@ inline colvarvalue colvar::orientation::dist2_rgrad (colvarvalue const &x1, inline cvm::real colvar::orientation::compare (colvarvalue const &x1, colvarvalue const &x2) const { - cvm::fatal_error ("Error: cannot compare() two quaternions.\n"); + cvm::error ("Error: cannot compare() two quaternions.\n"); return 0.0; } #endif - - -// Emacs -// Local Variables: -// mode: C++ -// End: diff --git a/lib/colvars/colvarcomp_angles.cpp b/lib/colvars/colvarcomp_angles.cpp index bc2aee0598..7733242405 100644 --- a/lib/colvars/colvarcomp_angles.cpp +++ b/lib/colvars/colvarcomp_angles.cpp @@ -1,3 +1,4 @@ +/// -*- c++ -*- #include "colvarmodule.h" #include "colvar.h" @@ -6,7 +7,6 @@ #include - colvar::angle::angle (std::string const &conf) : cvc (conf) { @@ -75,6 +75,7 @@ void colvar::angle::calc_value() void colvar::angle::calc_gradients() { + size_t i; cvm::real const cos_theta = (r21*r23)/(r21l*r23l); cvm::real const dxdcos = -1.0 / std::sqrt (1.0 - cos_theta*cos_theta); @@ -84,17 +85,17 @@ void colvar::angle::calc_gradients() dxdr3 = (180.0/PI) * dxdcos * (1.0/r23l) * ( r21/r21l + (-1.0) * cos_theta * r23/r23l ); - for (size_t i = 0; i < group1.size(); i++) { + for (i = 0; i < group1.size(); i++) { group1[i].grad = (group1[i].mass/group1.total_mass) * (dxdr1); } - for (size_t i = 0; i < group2.size(); i++) { + for (i = 0; i < group2.size(); i++) { group2[i].grad = (group2[i].mass/group2.total_mass) * (dxdr1 + dxdr3) * (-1.0); } - for (size_t i = 0; i < group3.size(); i++) { + for (i = 0; i < group3.size(); i++) { group3[i].grad = (group3[i].mass/group3.total_mass) * (dxdr3); } @@ -307,16 +308,17 @@ void colvar::dihedral::calc_gradients() +dsindB.y*r34.x - dsindB.x*r34.y); } - for (size_t i = 0; i < group1.size(); i++) + size_t i; + for (i = 0; i < group1.size(); i++) group1[i].grad = (group1[i].mass/group1.total_mass) * (-f1); - for (size_t i = 0; i < group2.size(); i++) + for (i = 0; i < group2.size(); i++) group2[i].grad = (group2[i].mass/group2.total_mass) * (-f2 + f1); - for (size_t i = 0; i < group3.size(); i++) + for (i = 0; i < group3.size(); i++) group3[i].grad = (group3[i].mass/group3.total_mass) * (-f3 + f2); - for (size_t i = 0; i < group4.size(); i++) + for (i = 0; i < group4.size(); i++) group4[i].grad = (group4[i].mass/group4.total_mass) * (f3); } diff --git a/lib/colvars/colvarcomp_coordnums.cpp b/lib/colvars/colvarcomp_coordnums.cpp index d08a5e505c..8b6448419f 100644 --- a/lib/colvars/colvarcomp_coordnums.cpp +++ b/lib/colvars/colvarcomp_coordnums.cpp @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #include #include "colvarmodule.h" @@ -276,7 +278,7 @@ colvar::h_bond::h_bond() colvar::h_bond::~h_bond() { - for (int i=0; i #include "colvarmodule.h" @@ -40,6 +42,7 @@ colvar::distance::distance() b_inverse_gradients = true; b_Jacobian_derivative = true; b_1site_force = false; + b_no_PBC = false; x.type (colvarvalue::type_scalar); } @@ -143,8 +146,9 @@ colvar::distance_z::distance_z (std::string const &conf) b_periodic = true; if ((wrap_center != 0.0) && (period == 0.0)) { - cvm::fatal_error ("Error: wrapAround was defined in a distanceZ component," - " but its period has not been set.\n"); + cvm::error ("Error: wrapAround was defined in a distanceZ component," + " but its period has not been set.\n"); + return; } parse_group (conf, "main", main); @@ -162,8 +166,10 @@ colvar::distance_z::distance_z (std::string const &conf) cvm::log ("Warning: explicit axis definition will be ignored!"); } else { if (get_keyval (conf, "axis", axis, cvm::rvector (0.0, 0.0, 1.0))) { - if (axis.norm2() == 0.0) - cvm::fatal_error ("Axis vector is zero!"); + if (axis.norm2() == 0.0) { + cvm::error ("Axis vector is zero!"); + return; + } if (axis.norm2() != 1.0) { axis = axis.unit(); cvm::log ("The normalized axis is: "+cvm::to_str (axis)+".\n"); @@ -234,6 +240,15 @@ void colvar::distance_z::calc_gradients() cvm::position_distance (main.center_of_mass(), ref1.center_of_mass()) + x.real_value * axis )); } } + + if (b_debug_gradients) { + cvm::log ("Debugging gradients for group main:\n"); + debug_gradients (main); + cvm::log ("Debugging gradients for group ref1:\n"); + debug_gradients (ref1); + cvm::log ("Debugging gradients for group ref2:\n"); + debug_gradients (ref2); + } } void colvar::distance_z::calc_force_invgrads() @@ -422,16 +437,19 @@ colvar::distance_inv::distance_inv (std::string const &conf) function_type = "distance_inv"; get_keyval (conf, "exponent", exponent, 6); if (exponent%2) { - cvm::fatal_error ("Error: odd exponent provided, can only use even ones.\n"); + cvm::error ("Error: odd exponent provided, can only use even ones.\n"); + return; } if (exponent <= 0) { - cvm::fatal_error ("Error: negative or zero exponent provided.\n"); + cvm::error ("Error: negative or zero exponent provided.\n"); + return; } for (cvm::atom_iter ai1 = group1.begin(); ai1 != group1.end(); ai1++) { for (cvm::atom_iter ai2 = group2.begin(); ai2 != group2.end(); ai2++) { if (ai1->id == ai2->id) - cvm::fatal_error ("Error: group1 and group1 have some atoms in common: this is not allowed for distanceInv.\n"); + cvm::error ("Error: group1 and group1 have some atoms in common: this is not allowed for distanceInv.\n"); + return; } } @@ -640,8 +658,10 @@ colvar::inertia_z::inertia_z (std::string const &conf) { function_type = "inertia_z"; if (get_keyval (conf, "axis", axis, cvm::rvector (0.0, 0.0, 1.0))) { - if (axis.norm2() == 0.0) - cvm::fatal_error ("Axis vector is zero!"); + if (axis.norm2() == 0.0) { + cvm::error ("Axis vector is zero!"); + return; + } if (axis.norm2() != 1.0) { axis = axis.unit(); cvm::log ("The normalized axis is: "+cvm::to_str (axis)+".\n"); @@ -700,8 +720,10 @@ colvar::rmsd::rmsd (std::string const &conf) parse_group (conf, "atoms", atoms); atom_groups.push_back (&atoms); - if (atoms.b_dummy) - cvm::fatal_error ("Error: \"atoms\" cannot be a dummy atom."); + if (atoms.b_dummy) { + cvm::error ("Error: \"atoms\" cannot be a dummy atom."); + return; + } if (atoms.ref_pos_group != NULL) { cvm::log ("The option \"refPositionsGroup\" (alternative group for fitting) was enabled: " @@ -715,10 +737,11 @@ colvar::rmsd::rmsd (std::string const &conf) if (get_keyval (conf, "refPositions", ref_pos, ref_pos)) { cvm::log ("Using reference positions from configuration file to calculate the variable.\n"); if (ref_pos.size() != atoms.size()) { - cvm::fatal_error ("Error: the number of reference positions provided ("+ - cvm::to_str (ref_pos.size())+ - ") does not match the number of atoms of group \"atoms\" ("+ - cvm::to_str (atoms.size())+").\n"); + cvm::error ("Error: the number of reference positions provided ("+ + cvm::to_str (ref_pos.size())+ + ") does not match the number of atoms of group \"atoms\" ("+ + cvm::to_str (atoms.size())+").\n"); + return; } } { @@ -726,8 +749,9 @@ colvar::rmsd::rmsd (std::string const &conf) if (get_keyval (conf, "refPositionsFile", ref_pos_file, std::string (""))) { if (ref_pos.size()) { - cvm::fatal_error ("Error: cannot specify \"refPositionsFile\" and " + cvm::error ("Error: cannot specify \"refPositionsFile\" and " "\"refPositions\" at the same time.\n"); + return; } std::string ref_pos_col; @@ -737,8 +761,9 @@ colvar::rmsd::rmsd (std::string const &conf) // if provided, use PDB column to select coordinates bool found = get_keyval (conf, "refPositionsColValue", ref_pos_col_value, 0.0); if (found && !ref_pos_col_value) - cvm::fatal_error ("Error: refPositionsColValue, " + cvm::error ("Error: refPositionsColValue, " "if provided, must be non-zero.\n"); + return; } else { // if not, rely on existing atom indices for the group atoms.create_sorted_ids(); @@ -897,25 +922,30 @@ colvar::eigenvector::eigenvector (std::string const &conf) if (b_inline) { cvm::log ("Using reference positions from input file.\n"); if (ref_pos.size() != atoms.size()) { - cvm::fatal_error ("Error: reference positions do not " + cvm::error ("Error: reference positions do not " "match the number of requested atoms.\n"); + return; } } std::string file_name; if (get_keyval (conf, "refPositionsFile", file_name)) { - if (b_inline) - cvm::fatal_error ("Error: refPositions and refPositionsFile cannot be specified at the same time.\n"); + if (b_inline) { + cvm::error ("Error: refPositions and refPositionsFile cannot be specified at the same time.\n"); + return; + } std::string file_col; double file_col_value; if (get_keyval (conf, "refPositionsCol", file_col, std::string (""))) { // use PDB flags if column is provided bool found = get_keyval (conf, "refPositionsColValue", file_col_value, 0.0); - if (found && !file_col_value) - cvm::fatal_error ("Error: refPositionsColValue, " + if (found && !file_col_value) { + cvm::error ("Error: refPositionsColValue, " "if provided, must be non-zero.\n"); + return; + } } else { // if not, use atom indices atoms.create_sorted_ids(); @@ -965,17 +995,20 @@ colvar::eigenvector::eigenvector (std::string const &conf) std::string file_name; if (get_keyval (conf, "vectorFile", file_name)) { - if (b_inline) - cvm::fatal_error ("Error: vector and vectorFile cannot be specified at the same time.\n"); + if (b_inline) { + cvm::error ("Error: vector and vectorFile cannot be specified at the same time.\n"); + return; + } std::string file_col; double file_col_value; if (get_keyval (conf, "vectorCol", file_col, std::string (""))) { // use PDB flags if column is provided bool found = get_keyval (conf, "vectorColValue", file_col_value, 0.0); - if (found && !file_col_value) - cvm::fatal_error ("Error: vectorColValue, " - "if provided, must be non-zero.\n"); + if (found && !file_col_value) { + cvm::error ("Error: vectorColValue, if provided, must be non-zero.\n"); + return; + } } else { // if not, use atom indices atoms.create_sorted_ids(); @@ -987,13 +1020,14 @@ colvar::eigenvector::eigenvector (std::string const &conf) } if (!ref_pos.size() || !eigenvec.size()) { - cvm::fatal_error ("Error: both reference coordinates" + cvm::error ("Error: both reference coordinates" "and eigenvector must be defined.\n"); + return; } cvm::atom_pos eig_center (0.0, 0.0, 0.0); - for (size_t i = 0; i < atoms.size(); i++) { - eig_center += eigenvec[i]; + for (size_t eil = 0; eil < atoms.size(); eil++) { + eig_center += eigenvec[eil]; } eig_center *= 1.0 / atoms.size(); cvm::log ("Geometric center of the provided vector: "+cvm::to_str (eig_center)+"\n"); @@ -1038,8 +1072,8 @@ colvar::eigenvector::eigenvector (std::string const &conf) // for inverse gradients eigenvec_invnorm2 = 0.0; - for (size_t i = 0; i < atoms.size(); i++) { - eigenvec_invnorm2 += eigenvec[i].norm2(); + for (size_t ein = 0; ein < atoms.size(); ein++) { + eigenvec_invnorm2 += eigenvec[ein].norm2(); } eigenvec_invnorm2 = 1.0 / eigenvec_invnorm2; diff --git a/lib/colvars/colvarcomp_protein.cpp b/lib/colvars/colvarcomp_protein.cpp index 1750782b7a..5021f60598 100644 --- a/lib/colvars/colvarcomp_protein.cpp +++ b/lib/colvars/colvarcomp_protein.cpp @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #include #include "colvarmodule.h" @@ -162,10 +164,11 @@ void colvar::alpha_angles::calc_value() void colvar::alpha_angles::calc_gradients() { - for (size_t i = 0; i < theta.size(); i++) + size_t i; + for (i = 0; i < theta.size(); i++) (theta[i])->calc_gradients(); - for (size_t i = 0; i < hb.size(); i++) + for (i = 0; i < hb.size(); i++) (hb[i])->calc_gradients(); } diff --git a/lib/colvars/colvarcomp_rotations.cpp b/lib/colvars/colvarcomp_rotations.cpp index b77c563878..0c52b989bf 100644 --- a/lib/colvars/colvarcomp_rotations.cpp +++ b/lib/colvars/colvarcomp_rotations.cpp @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #include #include "colvarmodule.h" @@ -57,11 +59,12 @@ colvar::orientation::orientation (std::string const &conf) "assumed that each atom is the closest " "periodic image to the center of geometry.\n"); cvm::rvector cog (0.0, 0.0, 0.0); - for (size_t i = 0; i < ref_pos.size(); i++) { + size_t i; + for (i = 0; i < ref_pos.size(); i++) { cog += ref_pos[i]; } cog /= cvm::real (ref_pos.size()); - for (size_t i = 0; i < ref_pos.size(); i++) { + for (i = 0; i < ref_pos.size(); i++) { ref_pos[i] -= cog; } @@ -167,10 +170,61 @@ void colvar::orientation_angle::calc_gradients() for (size_t ia = 0; ia < atoms.size(); ia++) { atoms[ia].grad = (dxdq0 * (rot.dQ0_2[ia])[0]); } + if (b_debug_gradients) { + cvm::log ("Debugging orientationAngle component gradients:\n"); + debug_gradients (atoms); + } } void colvar::orientation_angle::apply_force (colvarvalue const &force) +{ + cvm::real const &fw = force.real_value; + if (!atoms.noforce) { + atoms.apply_colvar_force (fw); + } +} + + + +colvar::orientation_proj::orientation_proj (std::string const &conf) + : orientation (conf) +{ + function_type = "orientation_proj"; + x.type (colvarvalue::type_scalar); +} + + +colvar::orientation_proj::orientation_proj() + : orientation() +{ + function_type = "orientation_proj"; + x.type (colvarvalue::type_scalar); +} + + +void colvar::orientation_proj::calc_value() +{ + atoms_cog = atoms.center_of_geometry(); + rot.calc_optimal_rotation (ref_pos, atoms.positions_shifted (-1.0 * atoms_cog)); + x.real_value = 2.0 * (rot.q).q0 * (rot.q).q0 - 1.0; +} + + +void colvar::orientation_proj::calc_gradients() +{ + cvm::real const dxdq0 = 2.0 * 2.0 * (rot.q).q0; + for (size_t ia = 0; ia < atoms.size(); ia++) { + atoms[ia].grad = (dxdq0 * (rot.dQ0_2[ia])[0]); + } + if (b_debug_gradients) { + cvm::log ("Debugging orientationProj component gradients:\n"); + debug_gradients (atoms); + } +} + + +void colvar::orientation_proj::apply_force (colvarvalue const &force) { cvm::real const &fw = force.real_value; @@ -180,6 +234,7 @@ void colvar::orientation_angle::apply_force (colvarvalue const &force) } + colvar::tilt::tilt (std::string const &conf) : orientation (conf) { diff --git a/lib/colvars/colvargrid.cpp b/lib/colvars/colvargrid.cpp index a300b91340..1035cc5ac5 100644 --- a/lib/colvars/colvargrid.cpp +++ b/lib/colvars/colvargrid.cpp @@ -1,4 +1,4 @@ -// -*- c++ -*- +/// -*- c++ -*- #include "colvarmodule.h" #include "colvarvalue.h" diff --git a/lib/colvars/colvargrid.h b/lib/colvars/colvargrid.h index 1095e0b845..c3a61dcaa0 100644 --- a/lib/colvars/colvargrid.h +++ b/lib/colvars/colvargrid.h @@ -1,4 +1,4 @@ -// -*- c++ -*- +/// -*- c++ -*- #ifndef COLVARGRID_H #define COLVARGRID_H @@ -55,8 +55,10 @@ protected: for (size_t i = 0; i < nd; i++) { addr += ix[i]*nxc[i]; if (cvm::debug()) { - if (ix[i] >= nx[i]) - cvm::fatal_error ("Error: exceeding bounds in colvar_grid.\n"); + if (ix[i] >= nx[i]) { + cvm::error ("Error: exceeding bounds in colvar_grid.\n"); + return 0; + } } } return addr; @@ -135,9 +137,11 @@ public: nt = mult; for (int i = nd-1; i >= 0; i--) { - if (nx_i[i] <= 0) - cvm::fatal_error ("Error: providing an invalid number of points, "+ + if (nx_i[i] <= 0) { + cvm::error ("Error: providing an invalid number of points, "+ cvm::to_str (nx_i[i])+".\n"); + return; + } nxc[i] = nt; nt *= nx[i]; } @@ -220,20 +224,23 @@ public: for (size_t i = 0; i < cv.size(); i++) { if (cv[i]->type() != colvarvalue::type_scalar) { - cvm::fatal_error ("Colvar grids can only be automatically " - "constructed for scalar variables. " - "ABF and histogram can not be used; metadynamics " - "can be used with useGrids disabled.\n"); + cvm::error ("Colvar grids can only be automatically " + "constructed for scalar variables. " + "ABF and histogram can not be used; metadynamics " + "can be used with useGrids disabled.\n"); + return; } if (cv[i]->width <= 0.0) { - cvm::fatal_error ("Tried to initialize a grid on a " + cvm::error ("Tried to initialize a grid on a " "variable with negative or zero width.\n"); + return; } if (!cv[i]->tasks[colvar::task_lower_boundary] || !cv[i]->tasks[colvar::task_upper_boundary]) { - cvm::fatal_error ("Tried to initialize a grid on a " - "variable with undefined boundaries.\n"); + cvm::error ("Tried to initialize a grid on a " + "variable with undefined boundaries.\n"); + return; } widths.push_back (cv[i]->width); @@ -303,8 +310,9 @@ public: ix[i] = (ix[i] + nx[i]) % nx[i]; //to ensure non-negative result } else { if (ix[i] < 0 || ix[i] >= nx[i]) - cvm::fatal_error ("Trying to wrap illegal index vector (non-PBC): " - + cvm::to_str (ix)); + cvm::error ("Trying to wrap illegal index vector (non-PBC): " + + cvm::to_str (ix)); + return; } } } @@ -437,9 +445,11 @@ public: /// of whether it fits or not. void map_grid (colvar_grid const &other_grid) { - if (other_grid.multiplicity() != this->multiplicity()) - cvm::fatal_error ("Error: trying to merge two grids with values of " + if (other_grid.multiplicity() != this->multiplicity()) { + cvm::error ("Error: trying to merge two grids with values of " "different multiplicity.\n"); + return; + } std::vector const &gb = this->lower_boundaries; std::vector const &gw = this->widths; @@ -479,9 +489,11 @@ public: void add_grid (colvar_grid const &other_grid, cvm::real scale_factor = 1.0) { - if (other_grid.multiplicity() != this->multiplicity()) - cvm::fatal_error ("Error: trying to sum togetehr two grids with values of " + if (other_grid.multiplicity() != this->multiplicity()) { + cvm::error ("Error: trying to sum togetehr two grids with values of " "different multiplicity.\n"); + return; + } if (scale_factor != 1.0) for (size_t i = 0; i < data.size(); i++) { data[i] += scale_factor * other_grid.data[i]; @@ -570,25 +582,26 @@ public: /// \brief Write the grid parameters (number of colvars, boundaries, width and number of points) std::ostream & write_params (std::ostream &os) { + size_t i; os << "grid_parameters {\n n_colvars " << nd << "\n"; os << " lower_boundaries "; - for (size_t i = 0; i < nd; i++) + for (i = 0; i < nd; i++) os << " " << lower_boundaries[i]; os << "\n"; os << " upper_boundaries "; - for (size_t i = 0; i < nd; i++) + for (i = 0; i < nd; i++) os << " " << upper_boundaries[i]; os << "\n"; os << " widths "; - for (size_t i = 0; i < nd; i++) + for (i = 0; i < nd; i++) os << " " << widths[i]; os << "\n"; os << " sizes "; - for (size_t i = 0; i < nd; i++) + for (i = 0; i < nd; i++) os << " " << nx[i]; os << "\n"; @@ -605,12 +618,14 @@ public: { size_t nd_in = 0; colvarparse::get_keyval (conf, "n_colvars", nd_in, nd, colvarparse::parse_silent); - if (nd_in != nd) - cvm::fatal_error ("Error: trying to read data for a grid " - "that contains a different number of colvars ("+ - cvm::to_str (nd_in)+") than the grid defined " - "in the configuration file ("+cvm::to_str (nd)+ - ").\n"); + if (nd_in != nd) { + cvm::error ("Error: trying to read data for a grid " + "that contains a different number of colvars ("+ + cvm::to_str (nd_in)+") than the grid defined " + "in the configuration file ("+cvm::to_str (nd)+ + ").\n"); + return false; + } } colvarparse::get_keyval (conf, "lower_boundaries", @@ -653,8 +668,9 @@ public: upper_boundaries[i])) > 1.0E-10) || (std::sqrt (cv[i]->dist2 (cv[i]->width, widths[i])) > 1.0E-10) ) { - cvm::fatal_error ("Error: restart information for a grid is " - "inconsistent with that of its colvars.\n"); + cvm::error ("Error: restart information for a grid is " + "inconsistent with that of its colvars.\n"); + return; } } } @@ -675,9 +691,10 @@ public: (std::fabs (other_grid.widths[i] - widths[i]) > 1.0E-10) || (data.size() != other_grid.data.size()) ) { - cvm::fatal_error ("Error: inconsistency between " - "two grids that are supposed to be equal, " - "aside from the data stored.\n"); + cvm::error ("Error: inconsistency between " + "two grids that are supposed to be equal, " + "aside from the data stored.\n"); + return; } } } @@ -710,169 +727,167 @@ public: return os; } -/// \brief Read data written by colvar_grid::write_raw() -std::istream & read_raw (std::istream &is) -{ - size_t const start_pos = is.tellg(); - - for (std::vector ix = new_index(); index_ok (ix); incr (ix)) { - for (size_t imult = 0; imult < mult; imult++) { - T new_value; - if (is >> new_value) { - value_input (ix, new_value, imult); - } else { - is.clear(); - is.seekg (start_pos, std::ios::beg); - is.setstate (std::ios::failbit); - return is; - } - } - } - - has_data = true; - return is; -} - -/// \brief To be called after colvar_grid::read_raw() returns an error -void read_raw_error() -{ - cvm::fatal_error ("Error: failed to read all of the grid points from file. Possible explanations: grid parameters in the configuration (lowerBoundary, upperBoundary, width) are different from those in the file, or the file is corrupt/incomplete.\n"); -} - -/// \brief Write the grid in a format which is both human readable -/// and suitable for visualization e.g. with gnuplot -void write_multicol (std::ostream &os) -{ - std::streamsize const w = os.width(); - std::streamsize const p = os.precision(); - - // Data in the header: nColvars, then for each - // xiMin, dXi, nPoints, periodic - - os << std::setw (2) << "# " << nd << "\n"; - for (size_t i = 0; i < nd; i++) { - os << "# " - << std::setw (10) << lower_boundaries[i] - << std::setw (10) << widths[i] - << std::setw (10) << nx[i] << " " - << periodic[i] << "\n"; - } - - for (std::vector ix = new_index(); index_ok (ix); incr (ix) ) { - - if (ix.back() == 0) { - // if the last index is 0, add a new line to mark the new record - os << "\n"; - } - - for (size_t i = 0; i < nd; i++) { - os << " " - << std::setw (w) << std::setprecision (p) - << bin_to_value_scalar (ix[i], i); - } - os << " "; - for (size_t imult = 0; imult < mult; imult++) { - os << " " - << std::setw (w) << std::setprecision (p) - << value_output (ix, imult); - } - os << "\n"; - } -} - -/// \brief Read a grid written by colvar_grid::write_multicol() -/// Adding data if add is true, replacing if false -std::istream & read_multicol (std::istream &is, bool add = false) -{ - // Data in the header: nColvars, then for each - // xiMin, dXi, nPoints, periodic - - std::string hash; - cvm::real lower, width, x; - size_t n, periodic; - bool remap; - std::vector new_value; - std::vector nx_read; - std::vector bin; - - if ( cv.size() != nd ) { - cvm::fatal_error ("Cannot read grid file: missing reference to colvars."); - } - - if ( !(is >> hash) || (hash != "#") ) { - cvm::fatal_error ("Error reading grid at position "+ - cvm::to_str (is.tellg())+" in stream (read \"" + hash + "\")\n"); - } - - is >> n; - if ( n != nd ) { - cvm::fatal_error ("Error reading grid: wrong number of collective variables.\n"); - } - - nx_read.resize (n); - bin.resize (n); - new_value.resize (mult); - - if (this->has_parent_data && add) { - new_data.resize (data.size()); - } - - remap = false; - for (size_t i = 0; i < nd; i++ ) { - if ( !(is >> hash) || (hash != "#") ) { - cvm::fatal_error ("Error reading grid at position "+ - cvm::to_str (is.tellg())+" in stream (read \"" + hash + "\")\n"); - } - - is >> lower >> width >> nx_read[i] >> periodic; - - - if ( (std::fabs (lower - lower_boundaries[i].real_value) > 1.0e-10) || - (std::fabs (width - widths[i] ) > 1.0e-10) || - (nx_read[i] != nx[i]) ) { - cvm::log ("Warning: reading from different grid definition (colvar " - + cvm::to_str (i+1) + "); remapping data on new grid.\n"); - remap = true; - } - } - - if ( remap ) { - // re-grid data - while (is.good()) { - bool end_of_file = false; - - for (size_t i = 0; i < nd; i++ ) { - if ( !(is >> x) ) end_of_file = true; - bin[i] = value_to_bin_scalar (x, i); - } - if (end_of_file) break; + /// \brief Read data written by colvar_grid::write_raw() + std::istream & read_raw (std::istream &is) + { + size_t const start_pos = is.tellg(); + for (std::vector ix = new_index(); index_ok (ix); incr (ix)) { for (size_t imult = 0; imult < mult; imult++) { - is >> new_value[imult]; - } - - if ( index_ok(bin) ) { - for (size_t imult = 0; imult < mult; imult++) { - value_input (bin, new_value[imult], imult, add); + T new_value; + if (is >> new_value) { + value_input (ix, new_value, imult); + } else { + is.clear(); + is.seekg (start_pos, std::ios::beg); + is.setstate (std::ios::failbit); + cvm::error ("Error: failed to read all of the grid points from file. Possible explanations: grid parameters in the configuration (lowerBoundary, upperBoundary, width) are different from those in the file, or the file is corrupt/incomplete.\n"); + return is; } } } - } else { - // do not re-grid the data but assume the same grid is used + + has_data = true; + return is; + } + + /// \brief Write the grid in a format which is both human readable + /// and suitable for visualization e.g. with gnuplot + void write_multicol (std::ostream &os) + { + std::streamsize const w = os.width(); + std::streamsize const p = os.precision(); + + // Data in the header: nColvars, then for each + // xiMin, dXi, nPoints, periodic + + os << std::setw (2) << "# " << nd << "\n"; + for (size_t i = 0; i < nd; i++) { + os << "# " + << std::setw (10) << lower_boundaries[i] + << std::setw (10) << widths[i] + << std::setw (10) << nx[i] << " " + << periodic[i] << "\n"; + } + for (std::vector ix = new_index(); index_ok (ix); incr (ix) ) { - for (size_t i = 0; i < nd; i++ ) { - is >> x; + + if (ix.back() == 0) { + // if the last index is 0, add a new line to mark the new record + os << "\n"; } + + for (size_t i = 0; i < nd; i++) { + os << " " + << std::setw (w) << std::setprecision (p) + << bin_to_value_scalar (ix[i], i); + } + os << " "; for (size_t imult = 0; imult < mult; imult++) { - is >> new_value[imult]; - value_input (ix, new_value[imult], imult, add); + os << " " + << std::setw (w) << std::setprecision (p) + << value_output (ix, imult); } + os << "\n"; } } - has_data = true; - return is; -} + /// \brief Read a grid written by colvar_grid::write_multicol() + /// Adding data if add is true, replacing if false + std::istream & read_multicol (std::istream &is, bool add = false) + { + // Data in the header: nColvars, then for each + // xiMin, dXi, nPoints, periodic + + std::string hash; + cvm::real lower, width, x; + size_t n, periodic; + bool remap; + std::vector new_value; + std::vector nx_read; + std::vector bin; + + if ( cv.size() != nd ) { + cvm::error ("Cannot read grid file: missing reference to colvars."); + return is; + } + + if ( !(is >> hash) || (hash != "#") ) { + cvm::error ("Error reading grid at position "+ + cvm::to_str (is.tellg())+" in stream (read \"" + hash + "\")\n"); + return is; + } + + is >> n; + if ( n != nd ) { + cvm::error ("Error reading grid: wrong number of collective variables.\n"); + return is; + } + + nx_read.resize (n); + bin.resize (n); + new_value.resize (mult); + + if (this->has_parent_data && add) { + new_data.resize (data.size()); + } + + remap = false; + for (size_t i = 0; i < nd; i++ ) { + if ( !(is >> hash) || (hash != "#") ) { + cvm::error ("Error reading grid at position "+ + cvm::to_str (is.tellg())+" in stream (read \"" + hash + "\")\n"); + return is; + } + + is >> lower >> width >> nx_read[i] >> periodic; + + + if ( (std::fabs (lower - lower_boundaries[i].real_value) > 1.0e-10) || + (std::fabs (width - widths[i] ) > 1.0e-10) || + (nx_read[i] != nx[i]) ) { + cvm::log ("Warning: reading from different grid definition (colvar " + + cvm::to_str (i+1) + "); remapping data on new grid.\n"); + remap = true; + } + } + + if ( remap ) { + // re-grid data + while (is.good()) { + bool end_of_file = false; + + for (size_t i = 0; i < nd; i++ ) { + if ( !(is >> x) ) end_of_file = true; + bin[i] = value_to_bin_scalar (x, i); + } + if (end_of_file) break; + + for (size_t imult = 0; imult < mult; imult++) { + is >> new_value[imult]; + } + + if ( index_ok(bin) ) { + for (size_t imult = 0; imult < mult; imult++) { + value_input (bin, new_value[imult], imult, add); + } + } + } + } else { + // do not re-grid the data but assume the same grid is used + for (std::vector ix = new_index(); index_ok (ix); incr (ix) ) { + for (size_t i = 0; i < nd; i++ ) { + is >> x; + } + for (size_t imult = 0; imult < mult; imult++) { + is >> new_value[imult]; + value_input (ix, new_value[imult], imult, add); + } + } + } + has_data = true; + return is; + } }; @@ -981,8 +996,11 @@ public: { cvm::real A0, A1; std::vector ix; - if (nd != 2) cvm::fatal_error ("Finite differences available in dimension 2 only."); - for (int n = 0; n < nd; n++) { + if (nd != 2) { + cvm::error ("Finite differences available in dimension 2 only."); + return grad; + } + for (unsigned int n = 0; n < nd; n++) { ix = ix0; A0 = data[address (ix)]; ix[n]++; wrap (ix); @@ -1001,9 +1019,11 @@ public: virtual cvm::real value_output (std::vector const &ix, size_t const &imult = 0) { - if (imult > 0) - cvm::fatal_error ("Error: trying to access a component " - "larger than 1 in a scalar data grid.\n"); + if (imult > 0) { + cvm::error ("Error: trying to access a component " + "larger than 1 in a scalar data grid.\n"); + return 0.; + } if (samples) return (samples->value (ix) > 0) ? (data[address (ix)] / cvm::real (samples->value (ix))) : @@ -1020,9 +1040,11 @@ public: size_t const &imult = 0, bool add = false) { - if (imult > 0) - cvm::fatal_error ("Error: trying to access a component " - "larger than 1 in a scalar data grid.\n"); + if (imult > 0) { + cvm::error ("Error: trying to access a component " + "larger than 1 in a scalar data grid.\n"); + return; + } if (add) { if (samples) data[address (ix)] += new_value * samples->new_count (ix); diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 3420618605..772adc7997 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #include #include "colvarmodule.h" #include "colvarparse.h" @@ -7,183 +9,148 @@ #include "colvarbias_alb.h" #include "colvarbias_meta.h" #include "colvarbias_abf.h" +#include "colvarbias_restraint.h" -colvarmodule::colvarmodule (char const *config_filename, - colvarproxy *proxy_in) +colvarmodule::colvarmodule (colvarproxy *proxy_in) { // pointer to the proxy object if (proxy == NULL) { proxy = proxy_in; parse = new colvarparse(); } else { - cvm::fatal_error ("Error: trying to allocate the collective " + // TODO relax this error to handle multiple molecules in VMD + // once the module is not static anymore + cvm::error ("Error: trying to allocate the collective " "variable module twice.\n"); + return; } - cvm::log (cvm::line_marker); cvm::log ("Initializing the collective variables module, version "+ - cvm::to_str(COLVARS_VERSION)+".\n"); + cvm::to_str (COLVARS_VERSION)+".\n"); + + // set initial default values // "it_restart" will be set by the input state file, if any; // "it" should be updated by the proxy - it = it_restart = 0; - it_restart_from_state_file = true; + colvarmodule::it = colvarmodule::it_restart = 0; + colvarmodule::it_restart_from_state_file = true; + + colvarmodule::b_analysis = false; + colvarmodule::debug_gradients_step_size = 1.0e-07; + colvarmodule::rotation::crossing_threshold = 1.0e-02; + + colvarmodule::cv_traj_freq = 100; + colvarmodule::restart_out_freq = proxy->restart_frequency(); + + // by default overwrite the existing trajectory file + colvarmodule::cv_traj_append = false; +} + + +int colvarmodule::config_file (char const *config_filename) +{ + cvm::log (cvm::line_marker); + cvm::log ("Reading new configuration from file \""+ + std::string (config_filename)+"\":\n"); // open the configfile config_s.open (config_filename); - if (!config_s) - cvm::fatal_error ("Error: in opening configuration file \""+ - std::string (config_filename)+"\".\n"); + if (!config_s) { + cvm::error ("Error: in opening configuration file \""+ + std::string (config_filename)+"\".\n", + FILE_ERROR); + return COLVARS_ERROR; + } // read the config file into a string std::string conf = ""; - { - std::string line; - while (colvarparse::getline_nocomments (config_s, line)) - conf.append (line+"\n"); - // don't need the stream any more - config_s.close(); + std::string line; + while (colvarparse::getline_nocomments (config_s, line)) { + conf.append (line+"\n"); + } + config_s.close(); + + return config (conf); +} + + +int colvarmodule::config_string (std::string const &config_str) +{ + cvm::log (cvm::line_marker); + cvm::log ("Reading new configuration:\n"); + std::istringstream config_s (config_str); + + // strip the comments away + std::string conf = ""; + std::string line; + while (colvarparse::getline_nocomments (config_s, line)) { + conf.append (line+"\n"); + } + return config (conf); +} + +int colvarmodule::config (std::string &conf) +{ + int error_code = 0; + + // parse global options + error_code |= parse_global_params (conf); + + // parse the options for collective variables + error_code |= parse_colvars (conf); + + // parse the options for biases + error_code |= parse_biases (conf); + + // done parsing known keywords, check that all keywords found were valid ones + error_code |= parse->check_keywords (conf, "colvarmodule"); + + if (error_code != COLVARS_OK) { + set_error_bits(INPUT_ERROR); + return COLVARS_ERROR; } + cvm::log (cvm::line_marker); + cvm::log ("Collective variables module (re)initialized.\n"); + cvm::log (cvm::line_marker); + + // configuration might have changed, better redo the labels + write_traj_label (cv_traj_os); + + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); +} + + +int colvarmodule::parse_global_params (std::string const &conf) +{ std::string index_file_name; if (parse->get_keyval (conf, "indexFile", index_file_name)) { read_index_file (index_file_name.c_str()); } - parse->get_keyval (conf, "analysis", b_analysis, false); + parse->get_keyval (conf, "analysis", b_analysis, b_analysis); - parse->get_keyval (conf, "debugGradientsStepSize", debug_gradients_step_size, 1.0e-07, + parse->get_keyval (conf, "debugGradientsStepSize", debug_gradients_step_size, + debug_gradients_step_size, colvarparse::parse_silent); parse->get_keyval (conf, "eigenvalueCrossingThreshold", - colvarmodule::rotation::crossing_threshold, 1.0e-02, + colvarmodule::rotation::crossing_threshold, + colvarmodule::rotation::crossing_threshold, colvarparse::parse_silent); - parse->get_keyval (conf, "colvarsTrajFrequency", cv_traj_freq, 100); - parse->get_keyval (conf, "colvarsRestartFrequency", restart_out_freq, - proxy->restart_frequency()); + parse->get_keyval (conf, "colvarsTrajFrequency", cv_traj_freq, cv_traj_freq); + parse->get_keyval (conf, "colvarsRestartFrequency", + restart_out_freq, restart_out_freq); - // by default overwrite the existing trajectory file - parse->get_keyval (conf, "colvarsTrajAppend", cv_traj_append, false); + parse->get_keyval (conf, "colvarsTrajAppend", cv_traj_append, cv_traj_append); - // input restart file - restart_in_name = proxy->input_prefix().size() ? - std::string (proxy->input_prefix()+".colvars.state") : - std::string ("") ; - - // output restart file - restart_out_name = proxy->restart_output_prefix().size() ? - std::string (proxy->restart_output_prefix()+".colvars.state") : - std::string (""); - - if (restart_out_name.size()) - cvm::log ("The restart output state file will be \""+restart_out_name+"\".\n"); - - output_prefix = proxy->output_prefix(); - - cvm::log ("The final output state file will be \""+ - (output_prefix.size() ? - std::string (output_prefix+".colvars.state") : - std::string ("colvars.state"))+"\".\n"); - - cv_traj_name = - (output_prefix.size() ? - std::string (output_prefix+".colvars.traj") : - std::string ("colvars.traj")); - - if (cv_traj_freq) { - // open trajectory file - if (cv_traj_append) { - cvm::log ("Appending to colvar trajectory file \""+cv_traj_name+ - "\".\n"); - cv_traj_os.open (cv_traj_name.c_str(), std::ios::app); - } else { - cvm::log ("Writing to colvar trajectory file \""+cv_traj_name+ - "\".\n"); - proxy->backup_file (cv_traj_name.c_str()); - cv_traj_os.open (cv_traj_name.c_str(), std::ios::out); - } - cv_traj_os.setf (std::ios::scientific, std::ios::floatfield); - } - - // parse the options for collective variables - init_colvars (conf); - - // parse the options for biases - init_biases (conf); - - // done with the parsing, check that all keywords are valid - parse->check_keywords (conf, "colvarmodule"); - cvm::log (cvm::line_marker); - - // read the restart configuration, if available - if (restart_in_name.size()) { - // read the restart file - std::ifstream input_is (restart_in_name.c_str()); - if (!input_is.good()) - fatal_error ("Error: in opening restart file \""+ - std::string (restart_in_name)+"\".\n"); - else { - cvm::log ("Restarting from file \""+restart_in_name+"\".\n"); - read_restart (input_is); - cvm::log (cvm::line_marker); - } - } - - // check if it is possible to save output configuration - if ((!output_prefix.size()) && (!restart_out_name.size())) { - cvm::fatal_error ("Error: neither the final output state file or " - "the output restart file could be defined, exiting.\n"); - } - - cvm::log ("Collective variables module initialized.\n"); - cvm::log (cvm::line_marker); + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } -std::istream & colvarmodule::read_restart (std::istream &is) -{ - { - // read global restart information - std::string restart_conf; - if (is >> colvarparse::read_block ("configuration", restart_conf)) { - if (it_restart_from_state_file) { - parse->get_keyval (restart_conf, "step", - it_restart, (size_t) 0, - colvarparse::parse_silent); - it = it_restart; - } - } - is.clear(); - } - - // colvars restart - cvm::increase_depth(); - for (std::vector::iterator cvi = colvars.begin(); - cvi != colvars.end(); - cvi++) { - if ( !((*cvi)->read_restart (is)) ) - cvm::fatal_error ("Error: in reading restart configuration for collective variable \""+ - (*cvi)->name+"\".\n"); - } - - // biases restart - for (std::vector::iterator bi = biases.begin(); - bi != biases.end(); - bi++) { - if (!((*bi)->read_restart (is))) - fatal_error ("Error: in reading restart configuration for bias \""+ - (*bi)->name+"\".\n"); - } - cvm::decrease_depth(); - - return is; -} - - - -void colvarmodule::init_colvars (std::string const &conf) +int colvarmodule::parse_colvars (std::string const &conf) { if (cvm::debug()) cvm::log ("Initializing the collective variables.\n"); @@ -196,27 +163,37 @@ void colvarmodule::init_colvars (std::string const &conf) cvm::log (cvm::line_marker); cvm::increase_depth(); colvars.push_back (new colvar (colvar_conf)); - (colvars.back())->check_keywords (colvar_conf, "colvar"); + if (cvm::get_error()) { + delete colvars.back(); + colvars.pop_back(); + return COLVARS_ERROR; + } + if ((colvars.back())->check_keywords (colvar_conf, "colvar") != COLVARS_OK) { + return COLVARS_ERROR; + } cvm::decrease_depth(); } else { - cvm::log ("Warning: \"colvar\" keyword found without any configuration.\n"); + cvm::error("Error: \"colvar\" keyword found without any configuration.\n", INPUT_ERROR); + return COLVARS_ERROR; } colvar_conf = ""; } - - if (!colvars.size()) - cvm::fatal_error ("Error: no collective variables defined.\n"); + if (!colvars.size()) { + cvm::log ("Warning: no collective variables defined.\n"); + } if (colvars.size()) cvm::log (cvm::line_marker); cvm::log ("Collective variables initialized, "+ cvm::to_str (colvars.size())+ " in total.\n"); + + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } -void colvarmodule::init_biases (std::string const &conf) +int colvarmodule::parse_biases (std::string const &conf) { if (cvm::debug()) cvm::log ("Initializing the collective variables biases.\n"); @@ -230,11 +207,19 @@ void colvarmodule::init_biases (std::string const &conf) cvm::log (cvm::line_marker); cvm::increase_depth(); biases.push_back (new colvarbias_abf (abf_conf, "abf")); - (biases.back())->check_keywords (abf_conf, "abf"); + if (cvm::get_error()) { + delete biases.back(); + biases.pop_back(); + return COLVARS_ERROR; + } + if ((biases.back())->check_keywords (abf_conf, "abf") != COLVARS_OK) { + return COLVARS_ERROR; + } cvm::decrease_depth(); n_abf_biases++; } else { - cvm::log ("Warning: \"abf\" keyword found without configuration.\n"); + cvm::error("Error: \"abf\" keyword found without configuration.\n", INPUT_ERROR); + return COLVARS_ERROR; } abf_conf = ""; } @@ -249,11 +234,19 @@ void colvarmodule::init_biases (std::string const &conf) cvm::log (cvm::line_marker); cvm::increase_depth(); biases.push_back (new colvarbias_restraint_harmonic (harm_conf, "harmonic")); - (biases.back())->check_keywords (harm_conf, "harmonic"); + if (cvm::get_error()) { + delete biases.back(); + biases.pop_back(); + return COLVARS_ERROR; + } + if ((biases.back())->check_keywords (harm_conf, "harmonic") != COLVARS_OK) { + return COLVARS_ERROR; + } cvm::decrease_depth(); n_rest_biases++; } else { - cvm::log ("Warning: \"harmonic\" keyword found without configuration.\n"); + cvm::error("Error: \"harmonic\" keyword found without configuration.\n", INPUT_ERROR); + return COLVARS_ERROR; } harm_conf = ""; } @@ -268,11 +261,19 @@ void colvarmodule::init_biases (std::string const &conf) cvm::log (cvm::line_marker); cvm::increase_depth(); biases.push_back (new colvarbias_restraint_linear (lin_conf, "linear")); - (biases.back())->check_keywords (lin_conf, "linear"); + if (cvm::get_error()) { + delete biases.back(); + biases.pop_back(); + return COLVARS_ERROR; + } + if ((biases.back())->check_keywords (lin_conf, "linear") != COLVARS_OK) { + return COLVARS_ERROR; + } cvm::decrease_depth(); n_rest_biases++; } else { - cvm::log ("Warning: \"linear\" keyword found without configuration.\n"); + cvm::error("Error: \"linear\" keyword found without configuration.\n", INPUT_ERROR); + return COLVARS_ERROR; } lin_conf = ""; } @@ -287,11 +288,19 @@ void colvarmodule::init_biases (std::string const &conf) cvm::log (cvm::line_marker); cvm::increase_depth(); biases.push_back (new colvarbias_alb (alb_conf, "ALB")); - (biases.back())->check_keywords (alb_conf, "ALB"); + if (cvm::get_error()) { + delete biases.back(); + biases.pop_back(); + return COLVARS_ERROR; + } + if ((biases.back())->check_keywords (alb_conf, "ALB") != COLVARS_OK) { + return COLVARS_ERROR; + } cvm::decrease_depth(); n_rest_biases++; } else { - cvm::log ("Warning: \"ALB\" keyword found without configuration.\n"); + cvm::error("Error: \"ALB\" keyword found without configuration.\n", INPUT_ERROR); + return COLVARS_ERROR; } alb_conf = ""; } @@ -307,11 +316,19 @@ void colvarmodule::init_biases (std::string const &conf) cvm::log (cvm::line_marker); cvm::increase_depth(); biases.push_back (new colvarbias_histogram (histo_conf, "histogram")); - (biases.back())->check_keywords (histo_conf, "histogram"); + if (cvm::get_error()) { + delete biases.back(); + biases.pop_back(); + return COLVARS_ERROR; + } + if ((biases.back())->check_keywords (histo_conf, "histogram") != COLVARS_OK) { + return COLVARS_ERROR; + } cvm::decrease_depth(); n_histo_biases++; } else { - cvm::log ("Warning: \"histogram\" keyword found without configuration.\n"); + cvm::error("Error: \"histogram\" keyword found without configuration.\n", INPUT_ERROR); + return COLVARS_ERROR; } histo_conf = ""; } @@ -326,11 +343,19 @@ void colvarmodule::init_biases (std::string const &conf) cvm::log (cvm::line_marker); cvm::increase_depth(); biases.push_back (new colvarbias_meta (meta_conf, "metadynamics")); - (biases.back())->check_keywords (meta_conf, "metadynamics"); + if (cvm::get_error()) { + delete biases.back(); + biases.pop_back(); + return COLVARS_ERROR; + } + if ((biases.back())->check_keywords (meta_conf, "metadynamics") != COLVARS_OK) { + return COLVARS_ERROR; + } cvm::decrease_depth(); n_meta_biases++; } else { - cvm::log ("Warning: \"metadynamics\" keyword found without configuration.\n"); + cvm::error("Error: \"metadynamics\" keyword found without configuration.\n", INPUT_ERROR); + return COLVARS_ERROR; } meta_conf = ""; } @@ -340,43 +365,58 @@ void colvarmodule::init_biases (std::string const &conf) cvm::log (cvm::line_marker); cvm::log ("Collective variables biases initialized, "+ cvm::to_str (biases.size())+" in total.\n"); + + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } -void colvarmodule::change_configuration (std::string const &bias_name, - std::string const &conf) -{ - cvm::increase_depth(); - int found = 0; +colvarbias * colvarmodule::bias_by_name(std::string const &name) { for (std::vector::iterator bi = biases.begin(); bi != biases.end(); bi++) { - if ( (*bi)->name == bias_name ) { - ++found; - (*bi)->change_configuration (conf); + if ((*bi)->name == name) { + return (*bi); } } - if (found < 1) cvm::fatal_error ("Error: bias not found.\n"); - if (found > 1) cvm::fatal_error ("Error: duplicate bias name.\n"); + return NULL; +} + + +colvar *colvarmodule::colvar_by_name(std::string const &name) { + for (std::vector::iterator cvi = colvars.begin(); + cvi != colvars.end(); + cvi++) { + if ((*cvi)->name == name) { + return (*cvi); + } + } + return NULL; +} + + +int colvarmodule::change_configuration (std::string const &bias_name, + std::string const &conf) +{ + // This is deprecated; supported strategy is to delete the bias + // and parse the new config + cvm::increase_depth(); + colvarbias *b; + b = bias_by_name (bias_name); + if (b == NULL) { cvm::error ("Error: bias not found: " + bias_name); } + b->change_configuration (conf); cvm::decrease_depth(); + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } std::string colvarmodule::read_colvar(std::string const &name) { cvm::increase_depth(); - int found = 0; + colvar *c; std::stringstream ss; - for (std::vector::iterator cvi = colvars.begin(); - cvi != colvars.end(); - cvi++) { - if ( (*cvi)->name == name ) { - ++found; - ss << (*cvi)->value(); - } - } - if ( found < 1 ) cvm::fatal_error ("Error: colvar not found"); - if ( found > 1 ) cvm::fatal_error ("Error: duplicate colvar"); + c = colvar_by_name (name); + if (c == NULL) { cvm::fatal_error ("Error: colvar not found: " + name); } + ss << c->value(); cvm::decrease_depth(); return ss.str(); } @@ -386,27 +426,24 @@ cvm::real colvarmodule::energy_difference (std::string const &bias_name, std::string const &conf) { cvm::increase_depth(); + colvarbias *b; cvm::real energy_diff = 0.; - int found = 0; - for (std::vector::iterator bi = biases.begin(); - bi != biases.end(); - bi++) { - if ( (*bi)->name == bias_name ) { - ++found; - energy_diff = (*bi)->energy_difference (conf); - } - } - if (found < 1) cvm::fatal_error ("Error: bias not found.\n"); - if (found > 1) cvm::fatal_error ("Error: duplicate bias name.\n"); + b = bias_by_name (bias_name); + if (b == NULL) { cvm::fatal_error ("Error: bias not found: " + bias_name); } + energy_diff = b->energy_difference (conf); cvm::decrease_depth(); return energy_diff; } -void colvarmodule::calc() { + +int colvarmodule::calc() { cvm::real total_bias_energy = 0.0; cvm::real total_colvar_energy = 0.0; + std::vector::iterator cvi; + std::vector::iterator bi; + if (cvm::debug()) { cvm::log (cvm::line_marker); cvm::log ("Collective variables module, step no. "+ @@ -417,10 +454,11 @@ void colvarmodule::calc() { if (cvm::debug()) cvm::log ("Calculating collective variables.\n"); cvm::increase_depth(); - for (std::vector::iterator cvi = colvars.begin(); - cvi != colvars.end(); - cvi++) { + for (cvi = colvars.begin(); cvi != colvars.end(); cvi++) { (*cvi)->calc(); + if (cvm::get_error()) { + return COLVARS_ERROR; + } } cvm::decrease_depth(); @@ -429,10 +467,11 @@ void colvarmodule::calc() { if (cvm::debug() && biases.size()) cvm::log ("Updating collective variable biases.\n"); cvm::increase_depth(); - for (std::vector::iterator bi = biases.begin(); - bi != biases.end(); - bi++) { + for (bi = biases.begin(); bi != biases.end(); bi++) { total_bias_energy += (*bi)->update(); + if (cvm::get_error()) { + return COLVARS_ERROR; + } } cvm::decrease_depth(); @@ -440,16 +479,27 @@ void colvarmodule::calc() { if (cvm::debug() && biases.size()) cvm::log ("Collecting forces from all biases.\n"); cvm::increase_depth(); - for (std::vector::iterator cvi = colvars.begin(); - cvi != colvars.end(); - cvi++) { + for (cvi = colvars.begin(); cvi != colvars.end(); cvi++) { (*cvi)->reset_bias_force(); } - for (std::vector::iterator bi = biases.begin(); - bi != biases.end(); - bi++) { + for (bi = biases.begin(); bi != biases.end(); bi++) { (*bi)->communicate_forces(); + if (cvm::get_error()) { + return COLVARS_ERROR; + } } + + // Run user force script, if provided, + // potentially adding scripted forces to the colvars + if (proxy->force_script_defined) { + int res; + res = proxy->run_force_script(); + if (res != COLVARS_OK) { + cvm::error("Error running user colvar forces script"); + return COLVARS_ERROR; + } + } + cvm::decrease_depth(); if (cvm::b_analysis) { @@ -457,29 +507,33 @@ void colvarmodule::calc() { if (cvm::debug() && biases.size()) cvm::log ("Perform runtime analyses.\n"); cvm::increase_depth(); - for (std::vector::iterator cvi = colvars.begin(); - cvi != colvars.end(); - cvi++) { + for (cvi = colvars.begin(); cvi != colvars.end(); cvi++) { (*cvi)->analyse(); + if (cvm::get_error()) { + return COLVARS_ERROR; + } } - for (std::vector::iterator bi = biases.begin(); - bi != biases.end(); - bi++) { + for (bi = biases.begin(); bi != biases.end(); bi++) { (*bi)->analyse(); + if (cvm::get_error()) { + return COLVARS_ERROR; + } } cvm::decrease_depth(); } - // sum up the forces for each colvar and integrate any internal - // equation of motion + // sum up the forces for each colvar, including wall forces + // and integrate any internal + // equation of motion (extended system) if (cvm::debug()) cvm::log ("Updating the internal degrees of freedom " "of colvars (if they have any).\n"); cvm::increase_depth(); - for (std::vector::iterator cvi = colvars.begin(); - cvi != colvars.end(); - cvi++) { + for (cvi = colvars.begin(); cvi != colvars.end(); cvi++) { total_colvar_energy += (*cvi)->update(); + if (cvm::get_error()) { + return COLVARS_ERROR; + } } cvm::decrease_depth(); proxy->add_energy (total_bias_energy + total_colvar_energy); @@ -489,93 +543,45 @@ void colvarmodule::calc() { if (cvm::debug()) cvm::log ("Communicating forces from the colvars to the atoms.\n"); cvm::increase_depth(); - for (std::vector::iterator cvi = colvars.begin(); - cvi != colvars.end(); - cvi++) { - if ((*cvi)->tasks[colvar::task_gradients]) + for (cvi = colvars.begin(); cvi != colvars.end(); cvi++) { + if ((*cvi)->tasks[colvar::task_gradients]) { (*cvi)->communicate_forces(); + if (cvm::get_error()) { + return COLVARS_ERROR; + } + } } cvm::decrease_depth(); // write restart file, if needed - if (restart_out_freq && restart_out_name.size() && !cvm::b_analysis) { + if (restart_out_freq && restart_out_name.size()) { if ( (cvm::step_relative() > 0) && ((cvm::step_absolute() % restart_out_freq) == 0) ) { cvm::log ("Writing the state file \""+ restart_out_name+"\".\n"); proxy->backup_file (restart_out_name.c_str()); restart_out_os.open (restart_out_name.c_str()); - restart_out_os.setf (std::ios::scientific, std::ios::floatfield); if (!write_restart (restart_out_os)) - cvm::fatal_error ("Error: in writing restart file.\n"); + cvm::error ("Error: in writing restart file.\n"); restart_out_os.close(); } } // write trajectory file, if needed - if (cv_traj_freq) { + if (cv_traj_freq && cv_traj_name.size()) { - if (cvm::debug()) - cvm::log ("Writing trajectory file.\n"); - - // (re)open trajectory file if (!cv_traj_os.good()) { - if (cv_traj_append) { - cvm::log ("Appending to colvar trajectory file \""+cv_traj_name+ - "\".\n"); - cv_traj_os.open (cv_traj_name.c_str(), std::ios::app); - } else { - cvm::log ("Overwriting colvar trajectory file \""+cv_traj_name+ - "\".\n"); - proxy->backup_file (cv_traj_name.c_str()); - cv_traj_os.open (cv_traj_name.c_str(), std::ios::out); - } - cv_traj_os.setf (std::ios::scientific, std::ios::floatfield); + open_traj_file (cv_traj_name); } // write labels in the traj file every 1000 lines and at first ts - cvm::increase_depth(); if ((cvm::step_absolute() % (cv_traj_freq * 1000)) == 0 || cvm::step_relative() == 0) { - cv_traj_os << "# " << cvm::wrap_string ("step", cvm::it_width-2) - << " "; - if (cvm::debug()) - cv_traj_os.flush(); - for (std::vector::iterator cvi = colvars.begin(); - cvi != colvars.end(); - cvi++) { - (*cvi)->write_traj_label (cv_traj_os); - } - for (std::vector::iterator bi = biases.begin(); - bi != biases.end(); - bi++) { - (*bi)->write_traj_label (cv_traj_os); - } - cv_traj_os << "\n"; - if (cvm::debug()) - cv_traj_os.flush(); + write_traj_label (cv_traj_os); } - cvm::decrease_depth(); - // write collective variable values to the traj file - cvm::increase_depth(); if ((cvm::step_absolute() % cv_traj_freq) == 0) { - cv_traj_os << std::setw (cvm::it_width) << it - << " "; - for (std::vector::iterator cvi = colvars.begin(); - cvi != colvars.end(); - cvi++) { - (*cvi)->write_traj (cv_traj_os); - } - for (std::vector::iterator bi = biases.begin(); - bi != biases.end(); - bi++) { - (*bi)->write_traj (cv_traj_os); - } - cv_traj_os << "\n"; - if (cvm::debug()) - cv_traj_os.flush(); + write_traj (cv_traj_os); } - cvm::decrease_depth(); if (restart_out_freq) { // flush the trajectory file if we are at the restart frequency @@ -587,10 +593,12 @@ void colvarmodule::calc() { } } } // end if (cv_traj_freq) + + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } -void colvarmodule::analyze() +int colvarmodule::analyze() { if (cvm::debug()) { cvm::log ("colvarmodule::analyze(), step = "+cvm::to_str (it)+".\n"); @@ -617,23 +625,36 @@ void colvarmodule::analyze() cvm::decrease_depth(); } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } -void colvarmodule::setup() +int colvarmodule::setup() { // loop over all components of all colvars to reset masses of all groups for (std::vector::iterator cvi = colvars.begin(); cvi != colvars.end(); cvi++) { (*cvi)->setup(); } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + } colvarmodule::~colvarmodule() { + reset(); + delete parse; + proxy = NULL; +} + +int colvarmodule::reset() +{ + if (cvm::debug()) + cvm::log ("colvars::reset() called.\n"); for (std::vector::iterator cvi = colvars.begin(); cvi != colvars.end(); cvi++) { delete *cvi; + cvi--; } colvars.clear(); @@ -641,19 +662,144 @@ colvarmodule::~colvarmodule() bi != biases.end(); bi++) { delete *bi; + bi--; } biases.clear(); - if (cv_traj_os.good()) { - cv_traj_os.close(); - } + index_groups.clear(); + index_group_names.clear(); + + close_traj_file(); + + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); - delete parse; - proxy = NULL; } -void colvarmodule::write_output_files() +int colvarmodule::setup_input() +{ + // name of input state file + restart_in_name = proxy->input_prefix().size() ? + std::string (proxy->input_prefix()+".colvars.state") : + std::string ("") ; + + // read the restart configuration, if available + if (restart_in_name.size()) { + // read the restart file + std::ifstream input_is (restart_in_name.c_str()); + if (!input_is.good()) { + cvm::error ("Error: in opening restart file \""+ + std::string (restart_in_name)+"\".\n", + FILE_ERROR); + return COLVARS_ERROR; + } else { + cvm::log ("Restarting from file \""+restart_in_name+"\".\n"); + read_restart (input_is); + if (cvm::get_error() != COLVARS_OK) { + return COLVARS_ERROR; + } + cvm::log (cvm::line_marker); + } + } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + +} + + +int colvarmodule::setup_output() +{ + // output state file (restart) + restart_out_name = proxy->restart_output_prefix().size() ? + std::string (proxy->restart_output_prefix()+".colvars.state") : + std::string (""); + + if (restart_out_name.size()) { + cvm::log ("The restart output state file will be \""+restart_out_name+"\".\n"); + } + + output_prefix = proxy->output_prefix(); + if (output_prefix.size()) { + cvm::log ("The final output state file will be \""+ + (output_prefix.size() ? + std::string (output_prefix+".colvars.state") : + std::string ("colvars.state"))+"\".\n"); + // cvm::log (cvm::line_marker); + } + + cv_traj_name = + (output_prefix.size() ? + std::string (output_prefix+".colvars.traj") : + std::string ("")); + + if (cv_traj_freq && cv_traj_name.size()) { + // open trajectory file + if (cv_traj_append) { + cvm::log ("Appending to colvar trajectory file \""+cv_traj_name+ + "\".\n"); + cv_traj_os.open (cv_traj_name.c_str(), std::ios::app); + } else { + cvm::log ("Writing to colvar trajectory file \""+cv_traj_name+ + "\".\n"); + proxy->backup_file (cv_traj_name.c_str()); + cv_traj_os.open (cv_traj_name.c_str(), std::ios::out); + } + cv_traj_os.setf (std::ios::scientific, std::ios::floatfield); + } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + +} + + +std::istream & colvarmodule::read_restart (std::istream &is) +{ + { + // read global restart information + std::string restart_conf; + if (is >> colvarparse::read_block ("configuration", restart_conf)) { + if (it_restart_from_state_file) { + parse->get_keyval (restart_conf, "step", + it_restart, (size_t) 0, + colvarparse::parse_silent); + it = it_restart; + } + } + is.clear(); + } + + // colvars restart + cvm::increase_depth(); + for (std::vector::iterator cvi = colvars.begin(); + cvi != colvars.end(); + cvi++) { + if ( !((*cvi)->read_restart (is)) ) { + cvm::error ("Error: in reading restart configuration for collective variable \""+ + (*cvi)->name+"\".\n", + INPUT_ERROR); + } + } + + // biases restart + for (std::vector::iterator bi = biases.begin(); + bi != biases.end(); + bi++) { + if (!((*bi)->read_restart (is))) + cvm::error ("Error: in reading restart configuration for bias \""+ + (*bi)->name+"\".\n", + INPUT_ERROR); + } + cvm::decrease_depth(); + + return is; +} + + +int colvarmodule::backup_file (char const *filename) +{ + return proxy->backup_file (filename); +} + + +int colvarmodule::write_output_files() { // if this is a simulation run (i.e. not a postprocessing), output data // must be written to be able to restart the simulation @@ -678,11 +824,12 @@ void colvarmodule::write_output_files() // do not close to avoid problems with multiple NAMD runs cv_traj_os.flush(); + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } -bool colvarmodule::read_traj (char const *traj_filename, +int colvarmodule::read_traj (char const *traj_filename, size_t traj_read_begin, size_t traj_read_end) { @@ -725,19 +872,21 @@ bool colvarmodule::read_traj (char const *traj_filename, if ( (traj_read_end > traj_read_begin) && (it > traj_read_end) ) { std::cerr << "\n"; - cvm::log ("Reached the end of the trajectory, " - "read_end = "+cvm::to_str (traj_read_end)+"\n"); - return false; + cvm::error ("Reached the end of the trajectory, " + "read_end = "+cvm::to_str (traj_read_end)+"\n", + FILE_ERROR); + return COLVARS_ERROR; } for (std::vector::iterator cvi = colvars.begin(); cvi != colvars.end(); cvi++) { if (!(*cvi)->read_traj (is)) { - cvm::log ("Error: in reading colvar \""+(*cvi)->name+ + cvm::error ("Error: in reading colvar \""+(*cvi)->name+ "\" from trajectory file \""+ - std::string (traj_filename)+"\".\n"); - return false; + std::string (traj_filename)+"\".\n", + FILE_ERROR); + return COLVARS_ERROR; } } @@ -745,13 +894,13 @@ bool colvarmodule::read_traj (char const *traj_filename, } } } - - return true; + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } std::ostream & colvarmodule::write_restart (std::ostream &os) { + os.setf (std::ios::scientific, std::ios::floatfield); os << "configuration {\n" << " step " << std::setw (it_width) << it << "\n" @@ -775,6 +924,83 @@ std::ostream & colvarmodule::write_restart (std::ostream &os) return os; } +int colvarmodule::open_traj_file (std::string const &file_name) +{ + // (re)open trajectory file + if (cv_traj_append) { + cvm::log ("Appending to colvar trajectory file \""+file_name+ + "\".\n"); + cv_traj_os.open (file_name.c_str(), std::ios::app); + } else { + cvm::log ("Overwriting colvar trajectory file \""+file_name+ + "\".\n"); + proxy->backup_file (file_name.c_str()); + cv_traj_os.open (file_name.c_str(), std::ios::out); + } + if (!cv_traj_os.good()) { + cvm::error ("Error: cannot write to file \""+file_name+"\".\n", + FILE_ERROR); + } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); +} + +int colvarmodule::close_traj_file() +{ + if (cv_traj_os.good()) { + cv_traj_os.close(); + } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); +} + +std::ostream & colvarmodule::write_traj_label (std::ostream &os) +{ + os.setf (std::ios::scientific, std::ios::floatfield); + + os << "# " << cvm::wrap_string ("step", cvm::it_width-2) + << " "; + + cvm::increase_depth(); + for (std::vector::iterator cvi = colvars.begin(); + cvi != colvars.end(); + cvi++) { + (*cvi)->write_traj_label (os); + } + for (std::vector::iterator bi = biases.begin(); + bi != biases.end(); + bi++) { + (*bi)->write_traj_label (os); + } + os << "\n"; + if (cvm::debug()) + os.flush(); + cvm::decrease_depth(); + return os; +} + +std::ostream & colvarmodule::write_traj (std::ostream &os) +{ + os.setf (std::ios::scientific, std::ios::floatfield); + + os << std::setw (cvm::it_width) << it + << " "; + + cvm::increase_depth(); + for (std::vector::iterator cvi = colvars.begin(); + cvi != colvars.end(); + cvi++) { + (*cvi)->write_traj (os); + } + for (std::vector::iterator bi = biases.begin(); + bi != biases.end(); + bi++) { + (*bi)->write_traj (os); + } + os << "\n"; + if (cvm::debug()) + os.flush(); + cvm::decrease_depth(); + return os; +} void cvm::log (std::string const &message) @@ -795,8 +1021,15 @@ void cvm::decrease_depth() if (depth) depth--; } +void cvm::error (std::string const &message, int code) +{ + set_error_bits(code); + proxy->error (message); +} + void cvm::fatal_error (std::string const &message) { + set_error_bits(FATAL_ERROR); proxy->fatal_error (message); } @@ -806,25 +1039,35 @@ void cvm::exit (std::string const &message) } -void cvm::read_index_file (char const *filename) +int cvm::read_index_file (char const *filename) { std::ifstream is (filename, std::ios::binary); if (!is.good()) - fatal_error ("Error: in opening index file \""+ - std::string (filename)+"\".\n"); - // std::list::iterator names_i = cvm::index_group_names.begin(); - // std::list >::iterator lists_i = cvm::index_groups.begin(); + cvm::error ("Error: in opening index file \""+ + std::string (filename)+"\".\n", + FILE_ERROR); + while (is.good()) { char open, close; std::string group_name; if ( (is >> open) && (open == '[') && (is >> group_name) && (is >> close) && (close == ']') ) { + for (std::list::iterator names_i = index_group_names.begin(); + names_i != index_group_names.end(); + names_i++) { + if (*names_i == group_name) { + cvm::error ("Error: the group name \""+group_name+ + "\" appears in multiple index files.\n", + FILE_ERROR); + } + } cvm::index_group_names.push_back (group_name); cvm::index_groups.push_back (std::vector ()); } else { - cvm::fatal_error ("Error: in parsing index file \""+ - std::string (filename)+"\".\n"); + cvm::error ("Error: in parsing index file \""+ + std::string (filename)+"\".\n", + INPUT_ERROR); } int atom_number = 1; @@ -847,23 +1090,23 @@ void cvm::read_index_file (char const *filename) cvm::log ("The following index groups were read from the index file \""+ std::string (filename)+"\":\n"); - std::list::iterator names_i = cvm::index_group_names.begin(); - std::list >::iterator lists_i = cvm::index_groups.begin(); - for ( ; names_i != cvm::index_group_names.end() ; names_i++, lists_i++) { + std::list::iterator names_i = index_group_names.begin(); + std::list >::iterator lists_i = index_groups.begin(); + for ( ; names_i != index_group_names.end() ; names_i++, lists_i++) { cvm::log (" "+(*names_i)+" ("+cvm::to_str (lists_i->size())+" atoms).\n"); } - + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } -void cvm::load_atoms (char const *file_name, +int cvm::load_atoms (char const *file_name, std::vector &atoms, std::string const &pdb_field, double const pdb_field_value) { - proxy->load_atoms (file_name, atoms, pdb_field, pdb_field_value); + return proxy->load_atoms (file_name, atoms, pdb_field, pdb_field_value); } -void cvm::load_coords (char const *file_name, +int cvm::load_coords (char const *file_name, std::vector &pos, const std::vector &indices, std::string const &pdb_field, @@ -876,31 +1119,28 @@ void cvm::load_coords (char const *file_name, std::string const ext (strlen(file_name) > 4 ? (file_name + (strlen(file_name) - 4)) : file_name); if (colvarparse::to_lower_cppstr (ext) == std::string (".xyz")) { if ( pdb_field.size() > 0 ) { - cvm::fatal_error ("Error: PDB column may not be specified for XYZ coordinate file.\n"); + cvm::error("Error: PDB column may not be specified for XYZ coordinate file.\n", INPUT_ERROR); + return COLVARS_ERROR; } - cvm::load_coords_xyz (file_name, pos, indices); + return cvm::load_coords_xyz (file_name, pos, indices); } else { - proxy->load_coords (file_name, pos, indices, pdb_field, pdb_field_value); + return proxy->load_coords (file_name, pos, indices, pdb_field, pdb_field_value); } } -void cvm::backup_file (char const *filename) -{ - proxy->backup_file (filename); -} -void cvm::load_coords_xyz (char const *filename, +int cvm::load_coords_xyz (char const *filename, std::vector &pos, const std::vector &indices) { std::ifstream xyz_is (filename); - int natoms; + unsigned int natoms; char symbol[256]; std::string line; if ( ! (xyz_is >> natoms) ) { - cvm::fatal_error ("Error: cannot parse XYZ file " - + std::string (filename) + ".\n"); + cvm::error ("Error: cannot parse XYZ file " + + std::string (filename) + ".\n", INPUT_ERROR); } // skip comment line std::getline (xyz_is, line); @@ -926,6 +1166,7 @@ void cvm::load_coords_xyz (char const *filename, xyz_is >> (*pos_i)[0] >> (*pos_i)[1] >> (*pos_i)[2]; } } + return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); } // static pointers @@ -940,6 +1181,7 @@ colvarproxy *colvarmodule::proxy = NULL; // static runtime data cvm::real colvarmodule::debug_gradients_step_size = 1.0e-03; +int colvarmodule::errorCode = 0; size_t colvarmodule::it = 0; size_t colvarmodule::it_restart = 0; size_t colvarmodule::restart_out_freq = 0; @@ -953,7 +1195,6 @@ std::list > colvarmodule::index_groups; // file name prefixes std::string colvarmodule::output_prefix = ""; -std::string colvarmodule::input_prefix = ""; std::string colvarmodule::restart_in_name = ""; @@ -965,612 +1206,3 @@ size_t const colvarmodule::en_prec = 14; size_t const colvarmodule::en_width = 21; std::string const colvarmodule::line_marker = "----------------------------------------------------------------------\n"; - - - - - - -std::ostream & operator << (std::ostream &os, colvarmodule::rvector const &v) -{ - std::streamsize const w = os.width(); - std::streamsize const p = os.precision(); - - os.width (2); - os << "( "; - os.width (w); os.precision (p); - os << v.x << " , "; - os.width (w); os.precision (p); - os << v.y << " , "; - os.width (w); os.precision (p); - os << v.z << " )"; - return os; -} - - -std::istream & operator >> (std::istream &is, colvarmodule::rvector &v) -{ - size_t const start_pos = is.tellg(); - char sep; - if ( !(is >> sep) || !(sep == '(') || - !(is >> v.x) || !(is >> sep) || !(sep == ',') || - !(is >> v.y) || !(is >> sep) || !(sep == ',') || - !(is >> v.z) || !(is >> sep) || !(sep == ')') ) { - is.clear(); - is.seekg (start_pos, std::ios::beg); - is.setstate (std::ios::failbit); - return is; - } - return is; -} - - - -std::ostream & operator << (std::ostream &os, colvarmodule::quaternion const &q) -{ - std::streamsize const w = os.width(); - std::streamsize const p = os.precision(); - - os.width (2); - os << "( "; - os.width (w); os.precision (p); - os << q.q0 << " , "; - os.width (w); os.precision (p); - os << q.q1 << " , "; - os.width (w); os.precision (p); - os << q.q2 << " , "; - os.width (w); os.precision (p); - os << q.q3 << " )"; - return os; -} - - -std::istream & operator >> (std::istream &is, colvarmodule::quaternion &q) -{ - size_t const start_pos = is.tellg(); - - std::string euler (""); - - if ( (is >> euler) && (colvarparse::to_lower_cppstr (euler) == - std::string ("euler")) ) { - - // parse the Euler angles - - char sep; - cvm::real phi, theta, psi; - if ( !(is >> sep) || !(sep == '(') || - !(is >> phi) || !(is >> sep) || !(sep == ',') || - !(is >> theta) || !(is >> sep) || !(sep == ',') || - !(is >> psi) || !(is >> sep) || !(sep == ')') ) { - is.clear(); - is.seekg (start_pos, std::ios::beg); - is.setstate (std::ios::failbit); - return is; - } - - q = colvarmodule::quaternion (phi, theta, psi); - - } else { - - // parse the quaternion components - - is.seekg (start_pos, std::ios::beg); - char sep; - if ( !(is >> sep) || !(sep == '(') || - !(is >> q.q0) || !(is >> sep) || !(sep == ',') || - !(is >> q.q1) || !(is >> sep) || !(sep == ',') || - !(is >> q.q2) || !(is >> sep) || !(sep == ',') || - !(is >> q.q3) || !(is >> sep) || !(sep == ')') ) { - is.clear(); - is.seekg (start_pos, std::ios::beg); - is.setstate (std::ios::failbit); - return is; - } - } - - return is; -} - - -cvm::quaternion -cvm::quaternion::position_derivative_inner (cvm::rvector const &pos, - cvm::rvector const &vec) const -{ - cvm::quaternion result (0.0, 0.0, 0.0, 0.0); - - - result.q0 = 2.0 * pos.x * q0 * vec.x - +2.0 * pos.y * q0 * vec.y - +2.0 * pos.z * q0 * vec.z - - -2.0 * pos.y * q3 * vec.x - +2.0 * pos.z * q2 * vec.x - - +2.0 * pos.x * q3 * vec.y - -2.0 * pos.z * q1 * vec.y - - -2.0 * pos.x * q2 * vec.z - +2.0 * pos.y * q1 * vec.z; - - - result.q1 = +2.0 * pos.x * q1 * vec.x - -2.0 * pos.y * q1 * vec.y - -2.0 * pos.z * q1 * vec.z - - +2.0 * pos.y * q2 * vec.x - +2.0 * pos.z * q3 * vec.x - - +2.0 * pos.x * q2 * vec.y - -2.0 * pos.z * q0 * vec.y - - +2.0 * pos.x * q3 * vec.z - +2.0 * pos.y * q0 * vec.z; - - - result.q2 = -2.0 * pos.x * q2 * vec.x - +2.0 * pos.y * q2 * vec.y - -2.0 * pos.z * q2 * vec.z - - +2.0 * pos.y * q1 * vec.x - +2.0 * pos.z * q0 * vec.x - - +2.0 * pos.x * q1 * vec.y - +2.0 * pos.z * q3 * vec.y - - -2.0 * pos.x * q0 * vec.z - +2.0 * pos.y * q3 * vec.z; - - - result.q3 = -2.0 * pos.x * q3 * vec.x - -2.0 * pos.y * q3 * vec.y - +2.0 * pos.z * q3 * vec.z - - -2.0 * pos.y * q0 * vec.x - +2.0 * pos.z * q1 * vec.x - - +2.0 * pos.x * q0 * vec.y - +2.0 * pos.z * q2 * vec.y - - +2.0 * pos.x * q1 * vec.z - +2.0 * pos.y * q2 * vec.z; - - return result; -} - - - - - - -// Calculate the optimal rotation between two groups, and implement it -// as a quaternion. Uses the method documented in: Coutsias EA, -// Seok C, Dill KA. Using quaternions to calculate RMSD. J Comput -// Chem. 25(15):1849-57 (2004) DOI: 10.1002/jcc.20110 PubMed: 15376254 - -void colvarmodule::rotation::build_matrix (std::vector const &pos1, - std::vector const &pos2, - matrix2d &S) -{ - cvm::rmatrix C; - - // build the correlation matrix - C.reset(); - for (size_t i = 0; i < pos1.size(); i++) { - C.xx() += pos1[i].x * pos2[i].x; - C.xy() += pos1[i].x * pos2[i].y; - C.xz() += pos1[i].x * pos2[i].z; - C.yx() += pos1[i].y * pos2[i].x; - C.yy() += pos1[i].y * pos2[i].y; - C.yz() += pos1[i].y * pos2[i].z; - C.zx() += pos1[i].z * pos2[i].x; - C.zy() += pos1[i].z * pos2[i].y; - C.zz() += pos1[i].z * pos2[i].z; - } - - // build the "overlap" matrix, whose eigenvectors are stationary - // points of the RMSD in the space of rotations - S[0][0] = C.xx() + C.yy() + C.zz(); - S[1][0] = C.yz() - C.zy(); - S[0][1] = S[1][0]; - S[2][0] = - C.xz() + C.zx() ; - S[0][2] = S[2][0]; - S[3][0] = C.xy() - C.yx(); - S[0][3] = S[3][0]; - S[1][1] = C.xx() - C.yy() - C.zz(); - S[2][1] = C.xy() + C.yx(); - S[1][2] = S[2][1]; - S[3][1] = C.xz() + C.zx(); - S[1][3] = S[3][1]; - S[2][2] = - C.xx() + C.yy() - C.zz(); - S[3][2] = C.yz() + C.zy(); - S[2][3] = S[3][2]; - S[3][3] = - C.xx() - C.yy() + C.zz(); - - // if (cvm::debug()) { - // for (size_t i = 0; i < 4; i++) { - // std::string line (""); - // for (size_t j = 0; j < 4; j++) { - // line += std::string (" S["+cvm::to_str (i)+ - // "]["+cvm::to_str (j)+"] ="+cvm::to_str (S[i][j])); - // } - // cvm::log (line+"\n"); - // } - // } -} - - -void colvarmodule::rotation::diagonalize_matrix (matrix2d &S, - cvm::real S_eigval[4], - matrix2d &S_eigvec) -{ - // diagonalize - int jac_nrot = 0; - jacobi (S, 4, S_eigval, S_eigvec, &jac_nrot); - eigsrt (S_eigval, S_eigvec, 4); - // jacobi saves eigenvectors by columns - transpose (S_eigvec, 4); - - // normalize eigenvectors - for (size_t ie = 0; ie < 4; ie++) { - cvm::real norm2 = 0.0; - for (size_t i = 0; i < 4; i++) norm2 += std::pow (S_eigvec[ie][i], int (2)); - cvm::real const norm = std::sqrt (norm2); - for (size_t i = 0; i < 4; i++) S_eigvec[ie][i] /= norm; - } -} - - -// Calculate the rotation, plus its derivatives - -void colvarmodule::rotation::calc_optimal_rotation -(std::vector const &pos1, - std::vector const &pos2) -{ - matrix2d S; - matrix2d S_backup; - cvm::real S_eigval[4]; - matrix2d S_eigvec; - -// if (cvm::debug()) { -// cvm::atom_pos cog1 (0.0, 0.0, 0.0); -// for (size_t i = 0; i < pos1.size(); i++) { -// cog1 += pos1[i]; -// } -// cog1 /= cvm::real (pos1.size()); -// cvm::atom_pos cog2 (0.0, 0.0, 0.0); -// for (size_t i = 0; i < pos2.size(); i++) { -// cog2 += pos2[i]; -// } -// cog2 /= cvm::real (pos1.size()); -// cvm::log ("calc_optimal_rotation: centers of geometry are: "+ -// cvm::to_str (cog1, cvm::cv_width, cvm::cv_prec)+ -// " and "+cvm::to_str (cog2, cvm::cv_width, cvm::cv_prec)+".\n"); -// } - - build_matrix (pos1, pos2, S); - S_backup = S; - - if (cvm::debug()) { - if (b_debug_gradients) { - cvm::log ("S = "+cvm::to_str (cvm::to_str (S_backup), cvm::cv_width, cvm::cv_prec)+"\n"); - } - } - - diagonalize_matrix (S, S_eigval, S_eigvec); - - // eigenvalues and eigenvectors - cvm::real const &L0 = S_eigval[0]; - cvm::real const &L1 = S_eigval[1]; - cvm::real const &L2 = S_eigval[2]; - cvm::real const &L3 = S_eigval[3]; - cvm::real const *Q0 = S_eigvec[0]; - cvm::real const *Q1 = S_eigvec[1]; - cvm::real const *Q2 = S_eigvec[2]; - cvm::real const *Q3 = S_eigvec[3]; - - lambda = L0; - q = cvm::quaternion (Q0); - - if (q_old.norm2() > 0.0) { - q.match (q_old); - if (q_old.inner (q) < (1.0 - crossing_threshold)) { - cvm::log ("Warning: one molecular orientation has changed by more than "+ - cvm::to_str (crossing_threshold)+": discontinuous rotation ?\n"); - } - } - q_old = q; - - if (cvm::debug()) { - if (b_debug_gradients) { - cvm::log ("L0 = "+cvm::to_str (L0, cvm::cv_width, cvm::cv_prec)+ - ", Q0 = "+cvm::to_str (cvm::quaternion (Q0), cvm::cv_width, cvm::cv_prec)+ - ", Q0*Q0 = "+cvm::to_str (cvm::quaternion (Q0).inner (cvm::quaternion (Q0)), cvm::cv_width, cvm::cv_prec)+ - "\n"); - cvm::log ("L1 = "+cvm::to_str (L1, cvm::cv_width, cvm::cv_prec)+ - ", Q1 = "+cvm::to_str (cvm::quaternion (Q1), cvm::cv_width, cvm::cv_prec)+ - ", Q0*Q1 = "+cvm::to_str (cvm::quaternion (Q0).inner (cvm::quaternion (Q1)), cvm::cv_width, cvm::cv_prec)+ - "\n"); - cvm::log ("L2 = "+cvm::to_str (L2, cvm::cv_width, cvm::cv_prec)+ - ", Q2 = "+cvm::to_str (cvm::quaternion (Q2), cvm::cv_width, cvm::cv_prec)+ - ", Q0*Q2 = "+cvm::to_str (cvm::quaternion (Q0).inner (cvm::quaternion (Q2)), cvm::cv_width, cvm::cv_prec)+ - "\n"); - cvm::log ("L3 = "+cvm::to_str (L3, cvm::cv_width, cvm::cv_prec)+ - ", Q3 = "+cvm::to_str (cvm::quaternion (Q3), cvm::cv_width, cvm::cv_prec)+ - ", Q0*Q3 = "+cvm::to_str (cvm::quaternion (Q0).inner (cvm::quaternion (Q3)), cvm::cv_width, cvm::cv_prec)+ - "\n"); - } - } - - // calculate derivatives of L0 and Q0 with respect to each atom in - // either group; note: if dS_1 is a null vector, nothing will be - // calculated - for (size_t ia = 0; ia < dS_1.size(); ia++) { - - cvm::real const &a2x = pos2[ia].x; - cvm::real const &a2y = pos2[ia].y; - cvm::real const &a2z = pos2[ia].z; - - matrix2d &ds_1 = dS_1[ia]; - - // derivative of the S matrix - ds_1.reset(); - ds_1[0][0] = cvm::rvector ( a2x, a2y, a2z); - ds_1[1][0] = cvm::rvector ( 0.0, a2z, -a2y); - ds_1[0][1] = ds_1[1][0]; - ds_1[2][0] = cvm::rvector (-a2z, 0.0, a2x); - ds_1[0][2] = ds_1[2][0]; - ds_1[3][0] = cvm::rvector ( a2y, -a2x, 0.0); - ds_1[0][3] = ds_1[3][0]; - ds_1[1][1] = cvm::rvector ( a2x, -a2y, -a2z); - ds_1[2][1] = cvm::rvector ( a2y, a2x, 0.0); - ds_1[1][2] = ds_1[2][1]; - ds_1[3][1] = cvm::rvector ( a2z, 0.0, a2x); - ds_1[1][3] = ds_1[3][1]; - ds_1[2][2] = cvm::rvector (-a2x, a2y, -a2z); - ds_1[3][2] = cvm::rvector ( 0.0, a2z, a2y); - ds_1[2][3] = ds_1[3][2]; - ds_1[3][3] = cvm::rvector (-a2x, -a2y, a2z); - - cvm::rvector &dl0_1 = dL0_1[ia]; - vector1d &dq0_1 = dQ0_1[ia]; - - // matrix multiplications; derivatives of L_0 and Q_0 are - // calculated using Hellmann-Feynman theorem (i.e. exploiting the - // fact that the eigenvectors Q_i form an orthonormal basis) - - dl0_1.reset(); - for (size_t i = 0; i < 4; i++) { - for (size_t j = 0; j < 4; j++) { - dl0_1 += Q0[i] * ds_1[i][j] * Q0[j]; - } - } - - dq0_1.reset(); - for (size_t p = 0; p < 4; p++) { - for (size_t i = 0; i < 4; i++) { - for (size_t j = 0; j < 4; j++) { - dq0_1[p] += - (Q1[i] * ds_1[i][j] * Q0[j]) / (L0-L1) * Q1[p] + - (Q2[i] * ds_1[i][j] * Q0[j]) / (L0-L2) * Q2[p] + - (Q3[i] * ds_1[i][j] * Q0[j]) / (L0-L3) * Q3[p]; - } - } - } - } - - // do the same for the second group - for (size_t ia = 0; ia < dS_2.size(); ia++) { - - cvm::real const &a1x = pos1[ia].x; - cvm::real const &a1y = pos1[ia].y; - cvm::real const &a1z = pos1[ia].z; - - matrix2d &ds_2 = dS_2[ia]; - - ds_2.reset(); - ds_2[0][0] = cvm::rvector ( a1x, a1y, a1z); - ds_2[1][0] = cvm::rvector ( 0.0, -a1z, a1y); - ds_2[0][1] = ds_2[1][0]; - ds_2[2][0] = cvm::rvector ( a1z, 0.0, -a1x); - ds_2[0][2] = ds_2[2][0]; - ds_2[3][0] = cvm::rvector (-a1y, a1x, 0.0); - ds_2[0][3] = ds_2[3][0]; - ds_2[1][1] = cvm::rvector ( a1x, -a1y, -a1z); - ds_2[2][1] = cvm::rvector ( a1y, a1x, 0.0); - ds_2[1][2] = ds_2[2][1]; - ds_2[3][1] = cvm::rvector ( a1z, 0.0, a1x); - ds_2[1][3] = ds_2[3][1]; - ds_2[2][2] = cvm::rvector (-a1x, a1y, -a1z); - ds_2[3][2] = cvm::rvector ( 0.0, a1z, a1y); - ds_2[2][3] = ds_2[3][2]; - ds_2[3][3] = cvm::rvector (-a1x, -a1y, a1z); - - cvm::rvector &dl0_2 = dL0_2[ia]; - vector1d &dq0_2 = dQ0_2[ia]; - - dl0_2.reset(); - for (size_t i = 0; i < 4; i++) { - for (size_t j = 0; j < 4; j++) { - dl0_2 += Q0[i] * ds_2[i][j] * Q0[j]; - } - } - - dq0_2.reset(); - for (size_t p = 0; p < 4; p++) { - for (size_t i = 0; i < 4; i++) { - for (size_t j = 0; j < 4; j++) { - dq0_2[p] += - (Q1[i] * ds_2[i][j] * Q0[j]) / (L0-L1) * Q1[p] + - (Q2[i] * ds_2[i][j] * Q0[j]) / (L0-L2) * Q2[p] + - (Q3[i] * ds_2[i][j] * Q0[j]) / (L0-L3) * Q3[p]; - } - } - } - - if (cvm::debug()) { - - if (b_debug_gradients) { - - matrix2d S_new; - cvm::real S_new_eigval[4]; - matrix2d S_new_eigvec; - - // make an infitesimal move along each cartesian coordinate of - // this atom, and solve again the eigenvector problem - for (size_t comp = 0; comp < 3; comp++) { - - S_new = S_backup; - // diagonalize the new overlap matrix - for (size_t i = 0; i < 4; i++) { - for (size_t j = 0; j < 4; j++) { - S_new[i][j] += - colvarmodule::debug_gradients_step_size * ds_2[i][j][comp]; - } - } - -// cvm::log ("S_new = "+cvm::to_str (cvm::to_str (S_new), cvm::cv_width, cvm::cv_prec)+"\n"); - - diagonalize_matrix (S_new, S_new_eigval, S_new_eigvec); - - cvm::real const &L0_new = S_new_eigval[0]; - cvm::real const *Q0_new = S_new_eigvec[0]; - - cvm::real const DL0 = (dl0_2[comp]) * colvarmodule::debug_gradients_step_size; - cvm::quaternion const q0 (Q0); - cvm::quaternion const DQ0 (dq0_2[0][comp] * colvarmodule::debug_gradients_step_size, - dq0_2[1][comp] * colvarmodule::debug_gradients_step_size, - dq0_2[2][comp] * colvarmodule::debug_gradients_step_size, - dq0_2[3][comp] * colvarmodule::debug_gradients_step_size); - - cvm::log ( "|(l_0+dl_0) - l_0^new|/l_0 = "+ - cvm::to_str (std::fabs (L0+DL0 - L0_new)/L0, cvm::cv_width, cvm::cv_prec)+ - ", |(q_0+dq_0) - q_0^new| = "+ - cvm::to_str ((Q0+DQ0 - Q0_new).norm(), cvm::cv_width, cvm::cv_prec)+ - "\n"); - } - } - } - } -} - - - -// Numerical Recipes routine for diagonalization - -#define ROTATE(a,i,j,k,l) g=a[i][j];h=a[k][l];a[i][j]=g-s*(h+g*tau); \ - a[k][l]=h+s*(g-h*tau); -void jacobi(cvm::real **a, int n, cvm::real d[], cvm::real **v, int *nrot) -{ - int j,iq,ip,i; - cvm::real tresh,theta,tau,t,sm,s,h,g,c; - - std::vector b (n, 0.0); - std::vector z (n, 0.0); - - for (ip=0;ip 4 && (cvm::real)(std::fabs(d[ip])+g) == (cvm::real)std::fabs(d[ip]) - && (cvm::real)(std::fabs(d[iq])+g) == (cvm::real)std::fabs(d[iq])) - a[ip][iq]=0.0; - else if (std::fabs(a[ip][iq]) > tresh) { - h=d[iq]-d[ip]; - if ((cvm::real)(std::fabs(h)+g) == (cvm::real)std::fabs(h)) - t=(a[ip][iq])/h; - else { - theta=0.5*h/(a[ip][iq]); - t=1.0/(std::fabs(theta)+std::sqrt(1.0+theta*theta)); - if (theta < 0.0) t = -t; - } - c=1.0/std::sqrt(1+t*t); - s=t*c; - tau=s/(1.0+c); - h=t*a[ip][iq]; - z[ip] -= h; - z[iq] += h; - d[ip] -= h; - d[iq] += h; - a[ip][iq]=0.0; - for (j=0;j<=ip-1;j++) { - ROTATE(a,j,ip,j,iq) - } - for (j=ip+1;j<=iq-1;j++) { - ROTATE(a,ip,j,j,iq) - } - for (j=iq+1;j= p) p=d[k=j]; - if (k != i) { - d[k]=d[i]; - d[i]=p; - for (j=0;j #include @@ -55,6 +70,8 @@ private: public: friend class colvarproxy; + // TODO colvarscript should be unaware of colvarmodule's internals + friend class colvarscript; /// Defining an abstract real number allows to switch precision typedef double real; @@ -85,6 +102,22 @@ public: typedef std::vector::iterator atom_iter; typedef std::vector::const_iterator atom_const_iter; + /// Module-wide error state + /// see constants at the top of this file + static int errorCode; + static inline void set_error_bits(int code) + { + errorCode |= code; + } + static inline int get_error() + { + return errorCode; + } + static inline void clear_error() + { + errorCode = 0; + } + /// Current step number static size_t it; /// Starting step number for this run @@ -115,9 +148,6 @@ public: /// Prefix for all output files for this run static std::string output_prefix; - /// Prefix for files from a previous run (including restart/output) - static std::string input_prefix; - /// input restart file name (determined from input_prefix) static std::string restart_in_name; @@ -158,26 +188,79 @@ public: /// \brief Constructor \param config_name Configuration file name /// \param restart_name (optional) Restart file name - colvarmodule (char const *config_name, - colvarproxy *proxy_in); + colvarmodule (colvarproxy *proxy); /// Destructor ~colvarmodule(); - /// Initialize collective variables - void init_colvars (std::string const &conf); + /// Actual function called by the destructor + int reset(); - /// Initialize collective variable biases - void init_biases (std::string const &conf); + /// Open a config file, load its contents, and pass it to config_string() + int config_file (char const *config_file_name); - /// Re-initialize data at the beginning of a run. For use with - /// MD codes that can change system parameters like atom masses - /// between run commands. - void setup(); + /// \brief Parse a config string assuming it is a complete configuration + /// (i.e. calling all parse functions) + int config_string (std::string const &conf); + + /// \brief Parse a "clean" config string (no comments) + int config (std::string &conf); + + + // Parse functions (setup internal data based on a string) + + /// Parse the few module's global parameters + int parse_global_params (std::string const &conf); + + /// Parse and initialize collective variables + int parse_colvars (std::string const &conf); + + /// Parse and initialize collective variable biases + int parse_biases (std::string const &conf); + + + // "Setup" functions (change internal data based on related data + // from the proxy that may change during program execution) + // No additional parsing is done within these functions + + /// (Re)initialize internal data (currently used by LAMMPS) + /// Also calls setup() member functions of colvars and biases + int setup(); + + /// (Re)initialize and (re)read the input state file calling read_restart() + int setup_input(); + + /// (Re)initialize the output trajectory and state file (does not write it yet) + int setup_output(); + + /// Read the input restart file + std::istream & read_restart (std::istream &is); + /// Write the output restart file + std::ostream & write_restart (std::ostream &os); + + /// Open a trajectory file if requested (and leave it open) + int open_traj_file (std::string const &file_name); + /// Close it + int close_traj_file(); + /// Write in the trajectory file + std::ostream & write_traj (std::ostream &os); + /// Write explanatory labels in the trajectory file + std::ostream & write_traj_label (std::ostream &os); + + /// Write all FINAL output files + int write_output_files(); + /// Backup a file before writing it + static int backup_file (char const *filename); + + /// Look up a bias by name; returns NULL if not found + static colvarbias * bias_by_name(std::string const &name); + + /// Look up a colvar by name; returns NULL if not found + static colvar * colvar_by_name(std::string const &name); /// Load new configuration for the given bias - /// currently works for harmonic (force constant and/or centers) - void change_configuration (std::string const &bias_name, std::string const &conf); + int change_configuration (std::string const &bias_name, std::string const &conf); /// Read a colvar value std::string read_colvar(std::string const &name); @@ -187,27 +270,16 @@ public: real energy_difference (std::string const &bias_name, std::string const &conf); /// Calculate collective variables and biases - void calc(); - /// Read the input restart file - std::istream & read_restart (std::istream &is); - /// Write the output restart file - std::ostream & write_restart (std::ostream &os); - /// Write all output files (called by the proxy) - void write_output_files(); - /// \brief Call colvarproxy::backup_file() - static void backup_file (char const *filename); + int calc(); /// Perform analysis - void analyze(); + int analyze(); /// \brief Read a collective variable trajectory (post-processing /// only, not called at runtime) - bool read_traj (char const *traj_filename, + int read_traj (char const *traj_filename, size_t traj_read_begin, size_t traj_read_end); - /// Get the pointer of a colvar from its name (returns NULL if not found) - static colvar * colvar_p (std::string const &name); - /// Quick conversion of an object to a string template static std::string to_str (T const &x, size_t const &width = 0, @@ -267,6 +339,9 @@ public: /// Print a message to the main log and exit with error code static void fatal_error (std::string const &message); + /// Print a message to the main log and set global error code + static void error (std::string const &message, int code = GENERAL_ERROR); + /// Print a message to the main log and exit normally static void exit (std::string const &message); @@ -307,21 +382,21 @@ public: static std::list > index_groups; /// \brief Read a Gromacs .ndx file - static void read_index_file (char const *filename); + static int read_index_file (char const *filename); /// \brief Create atoms from a file \param filename name of the file /// (usually a PDB) \param atoms array of the atoms to be allocated /// \param pdb_field (optiona) if "filename" is a PDB file, use this /// field to determine which are the atoms to be set - static void load_atoms (char const *filename, + static int load_atoms (char const *filename, std::vector &atoms, std::string const &pdb_field, double const pdb_field_value = 0.0); /// \brief Load the coordinates for a group of atoms from a file /// (PDB or XYZ) - static void load_coords (char const *filename, + static int load_coords (char const *filename, std::vector &pos, const std::vector &indices, std::string const &pdb_field, @@ -329,7 +404,7 @@ public: /// \brief Load the coordinates for a group of atoms from an /// XYZ file - static void load_coords_xyz (char const *filename, + static int load_coords_xyz (char const *filename, std::vector &pos, const std::vector &indices); @@ -366,15 +441,15 @@ protected: /// Output restart file std::ofstream restart_out_os; + /// \brief Counter for the current depth in the object hierarchy (useg e.g. in outpu + static size_t depth; + +public: /// \brief Pointer to the proxy object, used to retrieve atomic data /// from the hosting program; it is static in order to be accessible /// from static functions in the colvarmodule class static colvarproxy *proxy; - /// \brief Counter for the current depth in the object hierarchy (useg e.g. in outpu - static size_t depth; - -public: /// Increase the depth (number of indentations in the output) static void increase_depth(); @@ -489,9 +564,3 @@ inline cvm::real cvm::rand_gaussian (void) } #endif - - -// Emacs -// Local Variables: -// mode: C++ -// End: diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index 5ccaf98294..486a8f01a4 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -1,14 +1,13 @@ +/// -*- c++ -*- + #include #include - - #include "colvarmodule.h" #include "colvarvalue.h" #include "colvarparse.h" - // space & tab std::string const colvarparse::white_space = " \t"; @@ -51,8 +50,8 @@ size_t colvarparse::dummy_pos = 0; if (is >> x) \ value = x; \ else \ - cvm::fatal_error ("Error: in parsing \""+ \ - std::string (key)+"\".\n"); \ + cvm::error ("Error: in parsing \""+ \ + std::string (key)+"\".\n", INPUT_ERROR); \ if (parse_mode != parse_silent) { \ cvm::log ("# "+std::string (key)+" = "+ \ cvm::to_str (value)+"\n"); \ @@ -60,8 +59,8 @@ size_t colvarparse::dummy_pos = 0; } else { \ \ if (b_found_any) \ - cvm::fatal_error ("Error: improper or missing value " \ - "for \""+std::string (key)+"\".\n"); \ + cvm::error ("Error: improper or missing value " \ + "for \""+std::string (key)+"\".\n", INPUT_ERROR); \ value = def_value; \ if (parse_mode != parse_silent) { \ cvm::log ("# "+std::string (key)+" = \""+ \ @@ -112,9 +111,9 @@ size_t colvarparse::dummy_pos = 0; cvm::fatal_error ("Error: in parsing \""+ \ std::string (key)+"\".\n"); \ if (data_count > 1) \ - cvm::fatal_error ("Error: multiple values " \ - "are not allowed for keyword \""+ \ - std::string (key)+"\".\n"); \ + cvm::error ("Error: multiple values " \ + "are not allowed for keyword \""+ \ + std::string (key)+"\".\n", INPUT_ERROR); \ if (parse_mode != parse_silent) { \ cvm::log ("# "+std::string (key)+" = "+ \ cvm::to_str (value)+"\n"); \ @@ -122,8 +121,8 @@ size_t colvarparse::dummy_pos = 0; } else { \ \ if (b_found_any) \ - cvm::fatal_error ("Error: improper or missing value " \ - "for \""+std::string (key)+"\".\n"); \ + cvm::error ("Error: improper or missing value " \ + "for \""+std::string (key)+"\".\n", INPUT_ERROR); \ value = def_value; \ if (parse_mode != parse_silent) { \ cvm::log ("# "+std::string (key)+" = "+ \ @@ -189,8 +188,8 @@ size_t colvarparse::dummy_pos = 0; if (is >> x) \ values[i] = x; \ else \ - cvm::fatal_error ("Error: in parsing \""+ \ - std::string (key)+"\".\n"); \ + cvm::error ("Error: in parsing \""+ \ + std::string (key)+"\".\n", INPUT_ERROR); \ } \ } \ \ @@ -202,8 +201,8 @@ size_t colvarparse::dummy_pos = 0; } else { \ \ if (b_found_any) \ - cvm::fatal_error ("Error: improper or missing values for \""+ \ - std::string (key)+"\".\n"); \ + cvm::error ("Error: improper or missing values for \""+ \ + std::string (key)+"\".\n", INPUT_ERROR); \ \ for (size_t i = 0; i < values.size(); i++) \ values[i] = def_values[ (i > def_values.size()) ? 0 : i ]; \ @@ -267,7 +266,6 @@ bool colvarparse::get_keyval (std::string const &conf, std::string (key)+"\".\n"); if (data.size()) { - std::istringstream is (data); if ( (data == std::string ("on")) || (data == std::string ("yes")) || (data == std::string ("true")) ) { @@ -349,7 +347,7 @@ void colvarparse::strip_values (std::string &conf) } -void colvarparse::check_keywords (std::string &conf, char const *key) +int colvarparse::check_keywords (std::string &conf, char const *key) { if (cvm::debug()) cvm::log ("Configuration string for \""+std::string (key)+ @@ -383,10 +381,17 @@ void colvarparse::check_keywords (std::string &conf, char const *key) break; } } - if (!found_keyword) - cvm::fatal_error ("Error: keyword \""+uk+"\" is not supported, " + if (!found_keyword) { + cvm::log ("Error: keyword \""+uk+"\" is not supported, " "or not recognized in this context.\n"); + cvm::set_error_bits(INPUT_ERROR); + return COLVARS_ERROR; + } } + allowed_keywords.clear(); + data_begin_pos.clear(); + data_end_pos.clear(); + return COLVARS_OK; } @@ -635,9 +640,3 @@ bool colvarparse::brace_check (std::string const &conf, else return true; } - - -// Emacs -// Local Variables: -// mode: C++ -// End: diff --git a/lib/colvars/colvarparse.h b/lib/colvars/colvarparse.h index d3b3968a79..8ea4ca853c 100644 --- a/lib/colvars/colvarparse.h +++ b/lib/colvars/colvarparse.h @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #ifndef COLVARPARSE_H #define COLVARPARSE_H @@ -125,7 +127,7 @@ public: /// \brief Check that all the keywords within "conf" are in the list /// of allowed keywords; this will invoke strip_values() first and /// then loop over all words - void check_keywords (std::string &conf, char const *key); + int check_keywords (std::string &conf, char const *key); /// \brief Return a lowercased copy of the string @@ -194,8 +196,3 @@ public: #endif - -// Emacs -// Local Variables: -// mode: C++ -// End: diff --git a/lib/colvars/colvarproxy.h b/lib/colvars/colvarproxy.h index c1416f13b7..9cf7ab63e6 100644 --- a/lib/colvars/colvarproxy.h +++ b/lib/colvars/colvarproxy.h @@ -1,24 +1,44 @@ +/// -*- c++ -*- + #ifndef COLVARPROXY_H #define COLVARPROXY_H +#ifndef COLVARPROXY_VERSION +#define COLVARPROXY_VERSION "2014-09-19" +#endif + #include "colvarmodule.h" +// return values for the frame() routine +#define COLVARS_NO_SUCH_FRAME -1 +#define COLVARS_NOT_IMPLEMENTED -2 -/// \brief Interface class between the collective variables module and -/// the simulation program +// forward declaration +class colvarscript; + +/// \brief Interface between the collective variables module and +/// the simulation or analysis program. +/// This is the base class: each program is supported by a derived class. +/// Only pure virtual functions ("= 0") must be reimplemented in a new interface. class colvarproxy { public: - /// Pointer to the instance of colvarmodule + /// Pointer to the main object colvarmodule *colvars; + /// Default constructor + inline colvarproxy() : script (NULL) {} + /// Default destructor virtual inline ~colvarproxy() {} + /// (Re)initialize member data after construction + virtual void setup() {} + // **************** SYSTEM-WIDE PHYSICAL QUANTITIES **************** @@ -38,19 +58,38 @@ public: /// \brief Pseudo-random number with Gaussian distribution virtual cvm::real rand_gaussian (void) = 0; + /// \brief Get the current frame number + virtual int frame() { return COLVARS_NOT_IMPLEMENTED; } + + /// \brief Set the current frame number + // return 0 on success, -1 on failure + virtual int frame (int) { return COLVARS_NOT_IMPLEMENTED; } + // **************** SIMULATION PARAMETERS **************** + /// \brief Prefix to be used for input files (restarts, not /// configuration) - virtual std::string input_prefix() = 0; + std::string input_prefix_str, output_prefix_str, restart_output_prefix_str; + + inline std::string input_prefix() + { + return input_prefix_str; + } /// \brief Prefix to be used for output restart files - virtual std::string restart_output_prefix() = 0; + inline std::string restart_output_prefix() + { + return restart_output_prefix_str; + } /// \brief Prefix to be used for output files (final system /// configuration) - virtual std::string output_prefix() = 0; + inline std::string output_prefix() + { + return output_prefix_str; + } /// \brief Restarts will be fritten each time this number of steps has passed virtual size_t restart_frequency() = 0; @@ -91,13 +130,29 @@ public: void select_closest_images (std::vector &pos, cvm::atom_pos const &ref_pos); + // **************** SCRIPTING INTERFACE **************** + /// Pointer to the scripting interface object + /// (does not need to be allocated in a new interface) + colvarscript *script; + + /// is a user force script defined? + bool force_script_defined; + + /// Do we have a scripting interface? + bool have_scripts; + + /// Run a user-defined colvar forces script + virtual int run_force_script() {return 0;} // **************** INPUT/OUTPUT **************** /// Print a message to the main log virtual void log (std::string const &message) = 0; + /// Print a message to the main log and let the rest of the program handle the error + virtual void error (std::string const &message) = 0; + /// Print a message to the main log and exit with error code virtual void fatal_error (std::string const &message) = 0; @@ -109,23 +164,22 @@ public: /// from "filename" will be appended \param pdb_field (optiona) if /// "filename" is a PDB file, use this field to determine which are /// the atoms to be set - virtual void load_atoms (char const *filename, + virtual int load_atoms (char const *filename, std::vector &atoms, - std::string const pdb_field, - double const pdb_field_value = 0.0) {} + std::string const &pdb_field, + double const pdb_field_value = 0.0) = 0; /// \brief Load the coordinates for a group of atoms from a file /// (usually a PDB); if "pos" is already allocated, the number of its /// elements must match the number of atoms in "filename" - virtual void load_coords (char const *filename, + virtual int load_coords (char const *filename, std::vector &pos, const std::vector &indices, - std::string const pdb_field, + std::string const &pdb_field, double const pdb_field_value = 0.0) = 0; /// \brief Rename the given file, before overwriting it - virtual void backup_file (char const *filename) {} - + virtual int backup_file (char const *filename) {return 0;} }; @@ -133,7 +187,7 @@ inline void colvarproxy::select_closest_images (std::vector &pos, cvm::atom_pos const &ref_pos) { for (std::vector::iterator pi = pos.begin(); - pi != pos.end(); pi++) { + pi != pos.end(); ++pi) { select_closest_image (*pi, ref_pos); } } @@ -146,8 +200,3 @@ inline cvm::real colvarproxy::position_dist2 (cvm::atom_pos const &pos1, #endif - -// Emacs -// Local Variables: -// mode: C++ -// End: diff --git a/lib/colvars/colvarscript.cpp b/lib/colvars/colvarscript.cpp new file mode 100644 index 0000000000..ce14cd8a60 --- /dev/null +++ b/lib/colvars/colvarscript.cpp @@ -0,0 +1,301 @@ +// -*- c++ -*- + +#include +#include "colvarscript.h" + + +colvarscript::colvarscript (colvarproxy *p) + : proxy (p) +{ + colvars = proxy->colvars; + proxy_error = 0; +} + +/// Run method based on given arguments +int colvarscript::run (int argc, char const *argv[]) { + + result = ""; + + if (cvm::debug()) { + cvm::log ("Called script run with " + cvm::to_str(argc) + " args"); + for (int i = 0; i < argc; i++) { cvm::log (argv[i]); } + } + + if (argc < 2) { + result = "usage: "+std::string (argv[0])+" [args...]\n\ +\n\ +Managing the colvars module:\n\ + configfile -- read configuration from a file\n\ + config -- read configuration from the given string\n\ + reset -- delete all internal configuration\n\ + delete -- delete this colvars module instance\n\ + \n\ +Input and output:\n\ + list -- return a list of all variables\n\ + list biases -- return a list of all biases\n\ + load -- load a state file (requires configuration)\n\ + update -- recalculate colvars and biases based\n\ + printframe -- return a summary of the current frame\n\ + printframelabels -- return labels to annotate printframe's output\n"; + + if (proxy->frame() != COLVARS_NOT_IMPLEMENTED) { + result += "\ + frame -- return current frame number\n\ + frame -- set frame number\n"; + } + + result += "\n\ +Accessing collective variables:\n\ + colvar value -- return the current value of the colvar \n\ + colvar update -- recalculate the colvar \n\ + colvar delete -- delete the colvar \n\ + colvar addforce -- apply given force on \n\ +\n\ +Accessing biases:\n\ + bias energy -- return the current energy of the bias \n\ + bias update -- recalculate the bias \n\ + bias delete -- delete the bias \n\ +\n\ +"; + return COLVARSCRIPT_OK; + } + + std::string cmd = argv[1]; + + if (cmd == "colvar") { + return proc_colvar (argc-1, &(argv[1])); + } + + if (cmd == "bias") { + return proc_bias (argc-1, &(argv[1])); + } + + if (cmd == "reset") { + /// Delete every child object + colvars->reset(); + return COLVARSCRIPT_OK; + } + + if (cmd == "delete") { + colvars->reset(); + // Note: the delete bit may be ignored by some backends + // it is mostly useful in VMD + colvars->set_error_bits(DELETE_COLVARS); + return COLVARSCRIPT_OK; + } + + if (cmd == "update") { + colvars->calc(); + return COLVARSCRIPT_OK; + } + + if (cmd == "list") { + if (argc == 2) { + for (std::vector::iterator cvi = colvars->colvars.begin(); + cvi != colvars->colvars.end(); + ++cvi) { + result += (cvi == colvars->colvars.begin() ? "" : " ") + (*cvi)->name; + } + return COLVARSCRIPT_OK; + } else if (argc == 3 && !strcmp(argv[2], "biases")) { + for (std::vector::iterator bi = colvars->biases.begin(); + bi != colvars->biases.end(); + ++bi) { + result += (bi == colvars->biases.begin() ? "" : " ") + (*bi)->name; + } + return COLVARSCRIPT_OK; + } else { + result = "Wrong arguments to command \"list\""; + return COLVARSCRIPT_ERROR; + } + } + + /// Parse config from file + if (cmd == "configfile") { + if (argc < 3) { + result = "Missing arguments"; + return COLVARSCRIPT_ERROR; + } + if (colvars->config_file (argv[2]) == COLVARS_OK) { + return COLVARSCRIPT_OK; + } else { + return COLVARSCRIPT_ERROR; + } + } + + /// Parse config from string + if (cmd == "config") { + if (argc < 3) { + result = "Missing arguments"; + return COLVARSCRIPT_ERROR; + } + std::string conf = argv[2]; + if (colvars->config_string (conf) == COLVARS_OK) { + return COLVARSCRIPT_OK; + } else { + return COLVARSCRIPT_ERROR; + } + } + + /// Load an input state file + if (cmd == "load") { + if (argc < 3) { + result = "Missing arguments"; + return COLVARSCRIPT_ERROR; + } + proxy->input_prefix_str = argv[2]; + if (colvars->setup_input() == COLVARS_OK) { + return COLVARSCRIPT_OK; + } else { + return COLVARSCRIPT_ERROR; + } + } + + /// TODO Write an output state file? (Useful for testing) + + /// Print the values that would go on colvars.traj + if (cmd == "printframelabels") { + std::ostringstream os; + colvars->write_traj_label (os); + result = os.str(); + return COLVARSCRIPT_OK; + } + if (cmd == "printframe") { + std::ostringstream os; + colvars->write_traj (os); + result = os.str(); + return COLVARSCRIPT_OK; + } + + if (cmd == "frame") { + if (argc == 2) { + int f = proxy->frame(); + if (f >= 0) { + result = cvm::to_str (f); + return COLVARSCRIPT_OK; + } else { + result = "Frame number is not available"; + return COLVARSCRIPT_ERROR; + } + } else if (argc == 3) { + // Failure of this function does not trigger an error, but + // returns the plain result to let scripts detect available frames + long int f = proxy->frame(strtol(argv[2], NULL, 10)); + colvars->it = proxy->frame(); + result = cvm::to_str (f); + return COLVARSCRIPT_OK; + } else { + result = "Wrong arguments to command \"frame\""; + return COLVARSCRIPT_ERROR; + } + } + + result = "Syntax error"; + return COLVARSCRIPT_ERROR; +} + + +int colvarscript::proc_colvar (int argc, char const *argv[]) { + std::string name = argv[1]; + colvar *cv = cvm::colvar_by_name (name); + if (cv == NULL) { + result = "Colvar not found: " + name; + return COLVARSCRIPT_ERROR; + } + if (argc < 3) { + result = "Missing parameters"; + return COLVARSCRIPT_ERROR; + } + std::string subcmd = argv[2]; + + if (subcmd == "value") { + result = cvm::to_str(cv->value(), 0, 14); + return COLVARSCRIPT_OK; + } + + if (subcmd == "update") { + // note: this is not sufficient for a newly created colvar + // as atom coordinates may not be properly loaded + // a full CVM update is required + // or otherwise updating atom positions + cv->update(); + result = cvm::to_str(cv->value(), 0, 14); + return COLVARSCRIPT_OK; + } + + if (subcmd == "delete") { + if (cv->biases.size() > 0) { + result = "Cannot delete a colvar currently used by biases, delete those biases first"; + return COLVARSCRIPT_ERROR; + } + // colvar destructor is tasked with the cleanup + delete cv; + // TODO this could be done by the destructors + colvars->write_traj_label (colvars->cv_traj_os); + return COLVARSCRIPT_OK; + } + + if (subcmd == "addforce") { + if (argc < 4) { + result = "Missing parameter: force value"; + return COLVARSCRIPT_ERROR; + } + std::string f_str = argv[3]; + std::istringstream is (f_str); + colvarvalue force (cv->type()); + if (!(is >> force)) { + result = "Error parsing force value"; + return COLVARSCRIPT_ERROR; + } + cv->add_bias_force(force); + result = cvm::to_str(force); + return COLVARSCRIPT_OK; + } + + result = "Syntax error"; + return COLVARSCRIPT_ERROR; +} + + +int colvarscript::proc_bias (int argc, char const *argv[]) { + std::string name = argv[1]; + colvarbias *b = cvm::bias_by_name (name); + if (b == NULL) { + result = "Bias not found: " + name; + return COLVARSCRIPT_ERROR; + } + + if (argc < 3) { + result = "Missing parameters"; + return COLVARSCRIPT_ERROR; + } + std::string subcmd = argv[2]; + + if (subcmd == "energy") { + result = cvm::to_str(b->get_energy()); + return COLVARSCRIPT_OK; + } + + if (subcmd == "update") { + b->update(); + result = cvm::to_str(b->get_energy()); + return COLVARSCRIPT_OK; + } + + if (subcmd == "delete") { + // the bias destructor takes care of the cleanup at cvm level + delete b; + // TODO this could be done by the destructors + colvars->write_traj_label (colvars->cv_traj_os); + return COLVARSCRIPT_OK; + } + + if (argc >= 4) { +// std::string param = argv[3]; + + result = "Syntax error"; + return COLVARSCRIPT_ERROR; + } + result = "Syntax error"; + return COLVARSCRIPT_ERROR; +} diff --git a/lib/colvars/colvarscript.h b/lib/colvars/colvarscript.h new file mode 100644 index 0000000000..5b768cf32c --- /dev/null +++ b/lib/colvars/colvarscript.h @@ -0,0 +1,49 @@ +/// -*- c++ -*- + +#ifndef COLVARSCRIPT_H +#define COLVARSCRIPT_H + +#include +#include "colvarmodule.h" +#include "colvarvalue.h" +#include "colvar.h" +#include "colvarbias.h" +#include "colvarproxy.h" + +#define COLVARSCRIPT_ERROR -1 +#define COLVARSCRIPT_OK 0 + +class colvarscript { + +private: + colvarproxy *proxy; + colvarmodule *colvars; + + inline colvarscript() {} // no-argument construction forbidden + +public: + + friend class colvarproxy; + + colvarscript(colvarproxy * p); + inline ~colvarscript() {} + + /// If an error is caught by the proxy through fatal_error(), this is set to COLVARSCRIPT_ERROR + int proxy_error; + + /// If an error is returned by one of the methods, it should set this to the error message + std::string result; + + /// Run script command with given positional arguments + int run (int argc, char const *argv[]); + + /// Run subcommands on colvar + int proc_colvar (int argc, char const *argv[]); + + /// Run subcommands on bias + int proc_bias (int argc, char const *argv[]); + +}; + + +#endif diff --git a/lib/colvars/colvartypes.cpp b/lib/colvars/colvartypes.cpp new file mode 100644 index 0000000000..a0018c6670 --- /dev/null +++ b/lib/colvars/colvartypes.cpp @@ -0,0 +1,613 @@ +#include "colvarmodule.h" +#include "colvartypes.h" +#include "colvarparse.h" + + +std::ostream & operator << (std::ostream &os, colvarmodule::rvector const &v) +{ + std::streamsize const w = os.width(); + std::streamsize const p = os.precision(); + + os.width (2); + os << "( "; + os.width (w); os.precision (p); + os << v.x << " , "; + os.width (w); os.precision (p); + os << v.y << " , "; + os.width (w); os.precision (p); + os << v.z << " )"; + return os; +} + + +std::istream & operator >> (std::istream &is, colvarmodule::rvector &v) +{ + size_t const start_pos = is.tellg(); + char sep; + if ( !(is >> sep) || !(sep == '(') || + !(is >> v.x) || !(is >> sep) || !(sep == ',') || + !(is >> v.y) || !(is >> sep) || !(sep == ',') || + !(is >> v.z) || !(is >> sep) || !(sep == ')') ) { + is.clear(); + is.seekg (start_pos, std::ios::beg); + is.setstate (std::ios::failbit); + return is; + } + return is; +} + + + +std::ostream & operator << (std::ostream &os, colvarmodule::quaternion const &q) +{ + std::streamsize const w = os.width(); + std::streamsize const p = os.precision(); + + os.width (2); + os << "( "; + os.width (w); os.precision (p); + os << q.q0 << " , "; + os.width (w); os.precision (p); + os << q.q1 << " , "; + os.width (w); os.precision (p); + os << q.q2 << " , "; + os.width (w); os.precision (p); + os << q.q3 << " )"; + return os; +} + + +std::istream & operator >> (std::istream &is, colvarmodule::quaternion &q) +{ + size_t const start_pos = is.tellg(); + + std::string euler (""); + + if ( (is >> euler) && (colvarparse::to_lower_cppstr (euler) == + std::string ("euler")) ) { + + // parse the Euler angles + + char sep; + cvm::real phi, theta, psi; + if ( !(is >> sep) || !(sep == '(') || + !(is >> phi) || !(is >> sep) || !(sep == ',') || + !(is >> theta) || !(is >> sep) || !(sep == ',') || + !(is >> psi) || !(is >> sep) || !(sep == ')') ) { + is.clear(); + is.seekg (start_pos, std::ios::beg); + is.setstate (std::ios::failbit); + return is; + } + + q = colvarmodule::quaternion (phi, theta, psi); + + } else { + + // parse the quaternion components + + is.seekg (start_pos, std::ios::beg); + char sep; + if ( !(is >> sep) || !(sep == '(') || + !(is >> q.q0) || !(is >> sep) || !(sep == ',') || + !(is >> q.q1) || !(is >> sep) || !(sep == ',') || + !(is >> q.q2) || !(is >> sep) || !(sep == ',') || + !(is >> q.q3) || !(is >> sep) || !(sep == ')') ) { + is.clear(); + is.seekg (start_pos, std::ios::beg); + is.setstate (std::ios::failbit); + return is; + } + } + + return is; +} + + +cvm::quaternion +cvm::quaternion::position_derivative_inner (cvm::rvector const &pos, + cvm::rvector const &vec) const +{ + cvm::quaternion result (0.0, 0.0, 0.0, 0.0); + + + result.q0 = 2.0 * pos.x * q0 * vec.x + +2.0 * pos.y * q0 * vec.y + +2.0 * pos.z * q0 * vec.z + + -2.0 * pos.y * q3 * vec.x + +2.0 * pos.z * q2 * vec.x + + +2.0 * pos.x * q3 * vec.y + -2.0 * pos.z * q1 * vec.y + + -2.0 * pos.x * q2 * vec.z + +2.0 * pos.y * q1 * vec.z; + + + result.q1 = +2.0 * pos.x * q1 * vec.x + -2.0 * pos.y * q1 * vec.y + -2.0 * pos.z * q1 * vec.z + + +2.0 * pos.y * q2 * vec.x + +2.0 * pos.z * q3 * vec.x + + +2.0 * pos.x * q2 * vec.y + -2.0 * pos.z * q0 * vec.y + + +2.0 * pos.x * q3 * vec.z + +2.0 * pos.y * q0 * vec.z; + + + result.q2 = -2.0 * pos.x * q2 * vec.x + +2.0 * pos.y * q2 * vec.y + -2.0 * pos.z * q2 * vec.z + + +2.0 * pos.y * q1 * vec.x + +2.0 * pos.z * q0 * vec.x + + +2.0 * pos.x * q1 * vec.y + +2.0 * pos.z * q3 * vec.y + + -2.0 * pos.x * q0 * vec.z + +2.0 * pos.y * q3 * vec.z; + + + result.q3 = -2.0 * pos.x * q3 * vec.x + -2.0 * pos.y * q3 * vec.y + +2.0 * pos.z * q3 * vec.z + + -2.0 * pos.y * q0 * vec.x + +2.0 * pos.z * q1 * vec.x + + +2.0 * pos.x * q0 * vec.y + +2.0 * pos.z * q2 * vec.y + + +2.0 * pos.x * q1 * vec.z + +2.0 * pos.y * q2 * vec.z; + + return result; +} + + + + + + +// Calculate the optimal rotation between two groups, and implement it +// as a quaternion. Uses the method documented in: Coutsias EA, +// Seok C, Dill KA. Using quaternions to calculate RMSD. J Comput +// Chem. 25(15):1849-57 (2004) DOI: 10.1002/jcc.20110 PubMed: 15376254 + +void colvarmodule::rotation::build_matrix (std::vector const &pos1, + std::vector const &pos2, + matrix2d &S) +{ + cvm::rmatrix C; + + // build the correlation matrix + C.reset(); + for (size_t i = 0; i < pos1.size(); i++) { + C.xx() += pos1[i].x * pos2[i].x; + C.xy() += pos1[i].x * pos2[i].y; + C.xz() += pos1[i].x * pos2[i].z; + C.yx() += pos1[i].y * pos2[i].x; + C.yy() += pos1[i].y * pos2[i].y; + C.yz() += pos1[i].y * pos2[i].z; + C.zx() += pos1[i].z * pos2[i].x; + C.zy() += pos1[i].z * pos2[i].y; + C.zz() += pos1[i].z * pos2[i].z; + } + + // build the "overlap" matrix, whose eigenvectors are stationary + // points of the RMSD in the space of rotations + S[0][0] = C.xx() + C.yy() + C.zz(); + S[1][0] = C.yz() - C.zy(); + S[0][1] = S[1][0]; + S[2][0] = - C.xz() + C.zx() ; + S[0][2] = S[2][0]; + S[3][0] = C.xy() - C.yx(); + S[0][3] = S[3][0]; + S[1][1] = C.xx() - C.yy() - C.zz(); + S[2][1] = C.xy() + C.yx(); + S[1][2] = S[2][1]; + S[3][1] = C.xz() + C.zx(); + S[1][3] = S[3][1]; + S[2][2] = - C.xx() + C.yy() - C.zz(); + S[3][2] = C.yz() + C.zy(); + S[2][3] = S[3][2]; + S[3][3] = - C.xx() - C.yy() + C.zz(); + + // if (cvm::debug()) { + // for (size_t i = 0; i < 4; i++) { + // std::string line (""); + // for (size_t j = 0; j < 4; j++) { + // line += std::string (" S["+cvm::to_str (i)+ + // "]["+cvm::to_str (j)+"] ="+cvm::to_str (S[i][j])); + // } + // cvm::log (line+"\n"); + // } + // } +} + + +void colvarmodule::rotation::diagonalize_matrix (matrix2d &S, + cvm::real S_eigval[4], + matrix2d &S_eigvec) +{ + // diagonalize + int jac_nrot = 0; + jacobi (S, S_eigval, S_eigvec, &jac_nrot); + eigsrt (S_eigval, S_eigvec); + // jacobi saves eigenvectors by columns + transpose (S_eigvec); + + // normalize eigenvectors + for (size_t ie = 0; ie < 4; ie++) { + cvm::real norm2 = 0.0; + size_t i; + for (i = 0; i < 4; i++) norm2 += std::pow (S_eigvec[ie][i], int (2)); + cvm::real const norm = std::sqrt (norm2); + for (i = 0; i < 4; i++) S_eigvec[ie][i] /= norm; + } +} + + +// Calculate the rotation, plus its derivatives + +void colvarmodule::rotation::calc_optimal_rotation +(std::vector const &pos1, + std::vector const &pos2) +{ + matrix2d S; + matrix2d S_backup; + cvm::real S_eigval[4]; + matrix2d S_eigvec; + +// if (cvm::debug()) { +// cvm::atom_pos cog1 (0.0, 0.0, 0.0); +// for (size_t i = 0; i < pos1.size(); i++) { +// cog1 += pos1[i]; +// } +// cog1 /= cvm::real (pos1.size()); +// cvm::atom_pos cog2 (0.0, 0.0, 0.0); +// for (size_t i = 0; i < pos2.size(); i++) { +// cog2 += pos2[i]; +// } +// cog2 /= cvm::real (pos1.size()); +// cvm::log ("calc_optimal_rotation: centers of geometry are: "+ +// cvm::to_str (cog1, cvm::cv_width, cvm::cv_prec)+ +// " and "+cvm::to_str (cog2, cvm::cv_width, cvm::cv_prec)+".\n"); +// } + + build_matrix (pos1, pos2, S); + S_backup = S; + + if (cvm::debug()) { + if (b_debug_gradients) { + cvm::log ("S = "+cvm::to_str (cvm::to_str (S_backup), cvm::cv_width, cvm::cv_prec)+"\n"); + } + } + + diagonalize_matrix (S, S_eigval, S_eigvec); + + // eigenvalues and eigenvectors + cvm::real const &L0 = S_eigval[0]; + cvm::real const &L1 = S_eigval[1]; + cvm::real const &L2 = S_eigval[2]; + cvm::real const &L3 = S_eigval[3]; + cvm::real const *Q0 = S_eigvec[0]; + cvm::real const *Q1 = S_eigvec[1]; + cvm::real const *Q2 = S_eigvec[2]; + cvm::real const *Q3 = S_eigvec[3]; + + lambda = L0; + q = cvm::quaternion (Q0); + + if (q_old.norm2() > 0.0) { + q.match (q_old); + if (q_old.inner (q) < (1.0 - crossing_threshold)) { + cvm::log ("Warning: one molecular orientation has changed by more than "+ + cvm::to_str (crossing_threshold)+": discontinuous rotation ?\n"); + } + } + q_old = q; + + if (cvm::debug()) { + if (b_debug_gradients) { + cvm::log ("L0 = "+cvm::to_str (L0, cvm::cv_width, cvm::cv_prec)+ + ", Q0 = "+cvm::to_str (cvm::quaternion (Q0), cvm::cv_width, cvm::cv_prec)+ + ", Q0*Q0 = "+cvm::to_str (cvm::quaternion (Q0).inner (cvm::quaternion (Q0)), cvm::cv_width, cvm::cv_prec)+ + "\n"); + cvm::log ("L1 = "+cvm::to_str (L1, cvm::cv_width, cvm::cv_prec)+ + ", Q1 = "+cvm::to_str (cvm::quaternion (Q1), cvm::cv_width, cvm::cv_prec)+ + ", Q0*Q1 = "+cvm::to_str (cvm::quaternion (Q0).inner (cvm::quaternion (Q1)), cvm::cv_width, cvm::cv_prec)+ + "\n"); + cvm::log ("L2 = "+cvm::to_str (L2, cvm::cv_width, cvm::cv_prec)+ + ", Q2 = "+cvm::to_str (cvm::quaternion (Q2), cvm::cv_width, cvm::cv_prec)+ + ", Q0*Q2 = "+cvm::to_str (cvm::quaternion (Q0).inner (cvm::quaternion (Q2)), cvm::cv_width, cvm::cv_prec)+ + "\n"); + cvm::log ("L3 = "+cvm::to_str (L3, cvm::cv_width, cvm::cv_prec)+ + ", Q3 = "+cvm::to_str (cvm::quaternion (Q3), cvm::cv_width, cvm::cv_prec)+ + ", Q0*Q3 = "+cvm::to_str (cvm::quaternion (Q0).inner (cvm::quaternion (Q3)), cvm::cv_width, cvm::cv_prec)+ + "\n"); + } + } + + // calculate derivatives of L0 and Q0 with respect to each atom in + // either group; note: if dS_1 is a null vector, nothing will be + // calculated + size_t ia; + for (ia = 0; ia < dS_1.size(); ia++) { + + cvm::real const &a2x = pos2[ia].x; + cvm::real const &a2y = pos2[ia].y; + cvm::real const &a2z = pos2[ia].z; + + matrix2d &ds_1 = dS_1[ia]; + + // derivative of the S matrix + ds_1.reset(); + ds_1[0][0] = cvm::rvector ( a2x, a2y, a2z); + ds_1[1][0] = cvm::rvector ( 0.0, a2z, -a2y); + ds_1[0][1] = ds_1[1][0]; + ds_1[2][0] = cvm::rvector (-a2z, 0.0, a2x); + ds_1[0][2] = ds_1[2][0]; + ds_1[3][0] = cvm::rvector ( a2y, -a2x, 0.0); + ds_1[0][3] = ds_1[3][0]; + ds_1[1][1] = cvm::rvector ( a2x, -a2y, -a2z); + ds_1[2][1] = cvm::rvector ( a2y, a2x, 0.0); + ds_1[1][2] = ds_1[2][1]; + ds_1[3][1] = cvm::rvector ( a2z, 0.0, a2x); + ds_1[1][3] = ds_1[3][1]; + ds_1[2][2] = cvm::rvector (-a2x, a2y, -a2z); + ds_1[3][2] = cvm::rvector ( 0.0, a2z, a2y); + ds_1[2][3] = ds_1[3][2]; + ds_1[3][3] = cvm::rvector (-a2x, -a2y, a2z); + + cvm::rvector &dl0_1 = dL0_1[ia]; + vector1d &dq0_1 = dQ0_1[ia]; + + // matrix multiplications; derivatives of L_0 and Q_0 are + // calculated using Hellmann-Feynman theorem (i.e. exploiting the + // fact that the eigenvectors Q_i form an orthonormal basis) + + dl0_1.reset(); + for (size_t i = 0; i < 4; i++) { + for (size_t j = 0; j < 4; j++) { + dl0_1 += Q0[i] * ds_1[i][j] * Q0[j]; + } + } + + dq0_1.reset(); + for (size_t p = 0; p < 4; p++) { + for (size_t i = 0; i < 4; i++) { + for (size_t j = 0; j < 4; j++) { + dq0_1[p] += + (Q1[i] * ds_1[i][j] * Q0[j]) / (L0-L1) * Q1[p] + + (Q2[i] * ds_1[i][j] * Q0[j]) / (L0-L2) * Q2[p] + + (Q3[i] * ds_1[i][j] * Q0[j]) / (L0-L3) * Q3[p]; + } + } + } + } + + // do the same for the second group + for (ia = 0; ia < dS_2.size(); ia++) { + + cvm::real const &a1x = pos1[ia].x; + cvm::real const &a1y = pos1[ia].y; + cvm::real const &a1z = pos1[ia].z; + + matrix2d &ds_2 = dS_2[ia]; + + ds_2.reset(); + ds_2[0][0] = cvm::rvector ( a1x, a1y, a1z); + ds_2[1][0] = cvm::rvector ( 0.0, -a1z, a1y); + ds_2[0][1] = ds_2[1][0]; + ds_2[2][0] = cvm::rvector ( a1z, 0.0, -a1x); + ds_2[0][2] = ds_2[2][0]; + ds_2[3][0] = cvm::rvector (-a1y, a1x, 0.0); + ds_2[0][3] = ds_2[3][0]; + ds_2[1][1] = cvm::rvector ( a1x, -a1y, -a1z); + ds_2[2][1] = cvm::rvector ( a1y, a1x, 0.0); + ds_2[1][2] = ds_2[2][1]; + ds_2[3][1] = cvm::rvector ( a1z, 0.0, a1x); + ds_2[1][3] = ds_2[3][1]; + ds_2[2][2] = cvm::rvector (-a1x, a1y, -a1z); + ds_2[3][2] = cvm::rvector ( 0.0, a1z, a1y); + ds_2[2][3] = ds_2[3][2]; + ds_2[3][3] = cvm::rvector (-a1x, -a1y, a1z); + + cvm::rvector &dl0_2 = dL0_2[ia]; + vector1d &dq0_2 = dQ0_2[ia]; + + dl0_2.reset(); + for (size_t i = 0; i < 4; i++) { + for (size_t j = 0; j < 4; j++) { + dl0_2 += Q0[i] * ds_2[i][j] * Q0[j]; + } + } + + dq0_2.reset(); + for (size_t p = 0; p < 4; p++) { + for (size_t i = 0; i < 4; i++) { + for (size_t j = 0; j < 4; j++) { + dq0_2[p] += + (Q1[i] * ds_2[i][j] * Q0[j]) / (L0-L1) * Q1[p] + + (Q2[i] * ds_2[i][j] * Q0[j]) / (L0-L2) * Q2[p] + + (Q3[i] * ds_2[i][j] * Q0[j]) / (L0-L3) * Q3[p]; + } + } + } + + if (cvm::debug()) { + + if (b_debug_gradients) { + + matrix2d S_new; + cvm::real S_new_eigval[4]; + matrix2d S_new_eigvec; + + // make an infitesimal move along each cartesian coordinate of + // this atom, and solve again the eigenvector problem + for (size_t comp = 0; comp < 3; comp++) { + + S_new = S_backup; + // diagonalize the new overlap matrix + for (size_t i = 0; i < 4; i++) { + for (size_t j = 0; j < 4; j++) { + S_new[i][j] += + colvarmodule::debug_gradients_step_size * ds_2[i][j][comp]; + } + } + +// cvm::log ("S_new = "+cvm::to_str (cvm::to_str (S_new), cvm::cv_width, cvm::cv_prec)+"\n"); + + diagonalize_matrix (S_new, S_new_eigval, S_new_eigvec); + + cvm::real const &L0_new = S_new_eigval[0]; + cvm::real const *Q0_new = S_new_eigvec[0]; + + cvm::real const DL0 = (dl0_2[comp]) * colvarmodule::debug_gradients_step_size; + cvm::quaternion const q0 (Q0); + cvm::quaternion const DQ0 (dq0_2[0][comp] * colvarmodule::debug_gradients_step_size, + dq0_2[1][comp] * colvarmodule::debug_gradients_step_size, + dq0_2[2][comp] * colvarmodule::debug_gradients_step_size, + dq0_2[3][comp] * colvarmodule::debug_gradients_step_size); + + cvm::log ( "|(l_0+dl_0) - l_0^new|/l_0 = "+ + cvm::to_str (std::fabs (L0+DL0 - L0_new)/L0, cvm::cv_width, cvm::cv_prec)+ + ", |(q_0+dq_0) - q_0^new| = "+ + cvm::to_str ((Q0+DQ0 - Q0_new).norm(), cvm::cv_width, cvm::cv_prec)+ + "\n"); + } + } + } + } +} + + + +// Numerical Recipes routine for diagonalization + +#define ROTATE(a,i,j,k,l) g=a[i][j]; \ + h=a[k][l]; \ + a[i][j]=g-s*(h+g*tau); \ + a[k][l]=h+s*(g-h*tau); +#define n 4 + +void jacobi(cvm::real **a, cvm::real d[], cvm::real **v, int *nrot) +{ + int j,iq,ip,i; + cvm::real tresh,theta,tau,t,sm,s,h,g,c; + + std::vector b (n, 0.0); + std::vector z (n, 0.0); + + for (ip=0;ip 4 && (cvm::real)(std::fabs(d[ip])+g) == (cvm::real)std::fabs(d[ip]) + && (cvm::real)(std::fabs(d[iq])+g) == (cvm::real)std::fabs(d[iq])) + a[ip][iq]=0.0; + else if (std::fabs(a[ip][iq]) > tresh) { + h=d[iq]-d[ip]; + if ((cvm::real)(std::fabs(h)+g) == (cvm::real)std::fabs(h)) + t=(a[ip][iq])/h; + else { + theta=0.5*h/(a[ip][iq]); + t=1.0/(std::fabs(theta)+std::sqrt(1.0+theta*theta)); + if (theta < 0.0) t = -t; + } + c=1.0/std::sqrt(1+t*t); + s=t*c; + tau=s/(1.0+c); + h=t*a[ip][iq]; + z[ip] -= h; + z[iq] += h; + d[ip] -= h; + d[iq] += h; + a[ip][iq]=0.0; + for (j=0;j<=ip-1;j++) { + ROTATE(a,j,ip,j,iq) + } + for (j=ip+1;j<=iq-1;j++) { + ROTATE(a,ip,j,j,iq) + } + for (j=iq+1;j= p) p=d[k=j]; + if (k != i) { + d[k]=d[i]; + d[i]=p; + for (j=0;jq3; default: - cvm::fatal_error ("Error: incorrect quaternion component.\n"); + cvm::error ("Error: incorrect quaternion component.\n"); return q0; } } @@ -662,9 +664,9 @@ public: case 3: return this->q3; default: - cvm::fatal_error ("Error: trying to access a quaternion " - "component which is not between 0 and 3.\n"); - return this->q0; + cvm::error ("Error: trying to access a quaternion " + "component which is not between 0 and 3.\n"); + return 0.0; } } @@ -943,9 +945,9 @@ public: /// Constructor after a quaternion inline rotation (cvm::quaternion const &qi) - : b_debug_gradients (false) + : q (qi), + b_debug_gradients (false) { - q = qi; } /// Constructor after an axis of rotation and an angle (in radians) @@ -1091,8 +1093,3 @@ protected: #endif - -// Emacs -// Local Variables: -// mode: C++ -// End: diff --git a/lib/colvars/colvarvalue.cpp b/lib/colvars/colvarvalue.cpp index 18a3bd00c5..ef1b8bea31 100644 --- a/lib/colvars/colvarvalue.cpp +++ b/lib/colvars/colvarvalue.cpp @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #include #include "colvarmodule.h" @@ -18,14 +20,14 @@ size_t const colvarvalue::dof_num[ colvarvalue::type_quaternion+1] = void colvarvalue::undef_op() const { - cvm::fatal_error ("Error: Undefined operation on a colvar of type \""+ + cvm::error ("Error: Undefined operation on a colvar of type \""+ colvarvalue::type_desc[this->value_type]+"\".\n"); } void colvarvalue::error_rside (colvarvalue::Type const &vt) const { - cvm::fatal_error ("Trying to assign a colvar value with type \""+ + cvm::error ("Trying to assign a colvar value with type \""+ type_desc[this->value_type]+"\" to one with type \""+ type_desc[vt]+"\".\n"); } @@ -33,7 +35,7 @@ void colvarvalue::error_rside void colvarvalue::error_lside (colvarvalue::Type const &vt) const { - cvm::fatal_error ("Trying to use a colvar value with type \""+ + cvm::error ("Trying to use a colvar value with type \""+ type_desc[vt]+"\" as one of type \""+ type_desc[this->value_type]+"\".\n"); } @@ -120,8 +122,9 @@ void colvarvalue::p2leg_opt (colvarvalue const &x, switch (x.value_type) { case colvarvalue::type_scalar: - cvm::fatal_error ("Error: cannot calculate Legendre polynomials " + cvm::error ("Error: cannot calculate Legendre polynomials " "for scalar variables.\n"); + return; break; case colvarvalue::type_vector: while (xvi != xv_end) { @@ -162,7 +165,7 @@ void colvarvalue::p2leg_opt (colvarvalue const &x, switch (x.value_type) { case colvarvalue::type_scalar: - cvm::fatal_error ("Error: cannot calculate Legendre polynomials " + cvm::error ("Error: cannot calculate Legendre polynomials " "for scalar variables.\n"); break; case colvarvalue::type_vector: @@ -219,8 +222,9 @@ std::ostream & operator << (std::ostream &os, std::vector const &v) std::istream & operator >> (std::istream &is, colvarvalue &x) { if (x.type() == colvarvalue::type_notset) { - cvm::fatal_error ("Trying to read from a stream a colvarvalue, " - "which has not yet been assigned a data type.\n"); + cvm::error ("Trying to read from a stream a colvarvalue, " + "which has not yet been assigned a data type.\n"); + return is; } switch (x.type()) { diff --git a/lib/colvars/colvarvalue.h b/lib/colvars/colvarvalue.h index e262e7febe..bca8a9611f 100644 --- a/lib/colvars/colvarvalue.h +++ b/lib/colvars/colvarvalue.h @@ -1,3 +1,5 @@ +/// -*- c++ -*- + #ifndef COLVARVALUE_H #define COLVARVALUE_H @@ -695,33 +697,20 @@ inline void colvarvalue::check_types (colvarvalue const &x1, colvarvalue const &x2) { if (x1.value_type != x2.value_type) { - cvm::log ("x1 type = "+cvm::to_str (x1.value_type)+ - ", x2 type = "+cvm::to_str (x2.value_type)+"\n"); - cvm::fatal_error ("Performing an operation between two colvar " - "values with different types, \""+ - colvarvalue::type_desc[x1.value_type]+ - "\" and \""+ - colvarvalue::type_desc[x2.value_type]+ - "\".\n"); + cvm::error ("Performing an operation between two colvar " + "values with different types, \""+ + colvarvalue::type_desc[x1.value_type]+ + "\" and \""+ + colvarvalue::type_desc[x2.value_type]+ + "\".\n"); } } - - std::ostream & operator << (std::ostream &os, colvarvalue const &x); std::ostream & operator << (std::ostream &os, std::vector const &v); std::istream & operator >> (std::istream &is, colvarvalue &x); - - - #endif - - -// Emacs -// Local Variables: -// mode: C++ -// End: diff --git a/src/USER-COLVARS/colvarproxy_lammps.cpp b/src/USER-COLVARS/colvarproxy_lammps.cpp index b089a73ca4..1955b13ec5 100644 --- a/src/USER-COLVARS/colvarproxy_lammps.cpp +++ b/src/USER-COLVARS/colvarproxy_lammps.cpp @@ -32,7 +32,7 @@ // local helper functions // safely move filename to filename.extension -static void my_backup_file(const char *filename, const char *extension) +static int my_backup_file(const char *filename, const char *extension) { struct stat sbuf; if (stat(filename, &sbuf) == 0) { @@ -74,6 +74,10 @@ colvarproxy_lammps::colvarproxy_lammps(LAMMPS_NS::LAMMPS *lmp, do_exit=false; restart_every=0; + // User-scripted forces are not available in LAMMPS + force_script_defined = false; + have_scripts = false; + // set input restart name and strip the extension, if present input_prefix_str = std::string(inp_name ? inp_name : ""); if (input_prefix_str.rfind(".colvars.state") != std::string::npos) @@ -85,6 +89,12 @@ colvarproxy_lammps::colvarproxy_lammps(LAMMPS_NS::LAMMPS *lmp, // not so for restarts restart_prefix_str = std::string("rest"); + // check if it is possible to save output configuration + if ((!output_prefix_str.size()) && (!restart_output_prefix_str.size())) { + fatal_error ("Error: neither the final output state file or " + "the output restart file could be defined, exiting.\n"); + } + // try to extract a restart prefix from a potential restart command. LAMMPS_NS::Output *outp = _lmp->output; if ((outp->restart_every_single > 0) && (outp->restart1 != 0)) { @@ -101,7 +111,12 @@ colvarproxy_lammps::colvarproxy_lammps(LAMMPS_NS::LAMMPS *lmp, void colvarproxy_lammps::init(const char *conf_file) { // create the colvarmodule instance - colvars = new colvarmodule(conf_file,this); + colvars = new colvarmodule (this); + + // TODO move one or more of these to setup() if needed + colvars->config_file (conf_file); + colvars->setup_input(); + colvars->setup_output(); if (_lmp->update->ntimestep != 0) { cvm::log ("Initializing step number as firstTimestep.\n"); @@ -245,6 +260,12 @@ void colvarproxy_lammps::log(std::string const &message) } } +void colvarproxy_lammps::error(std::string const &message) +{ + // In LAMMPS, all errors are fatal + fatal_error(message); +} + void colvarproxy_lammps::fatal_error(std::string const &message) { log(message); @@ -311,33 +332,32 @@ e_pdb_field pdb_field_str2enum(std::string const &pdb_field_str) return pdb_field; } -void colvarproxy_lammps::load_coords(char const *pdb_filename, +int colvarproxy_lammps::load_coords(char const *pdb_filename, std::vector &pos, const std::vector &indices, - std::string const pdb_field_str, + std::string const &pdb_field_str, double const pdb_field_value) { - cvm::fatal_error("Reading collective variable coordinates " - "from a PDB file is currently not supported.\n"); + "from a PDB file is currently not supported.\n"); } -void colvarproxy_lammps::load_atoms(char const *pdb_filename, +int colvarproxy_lammps::load_atoms(char const *pdb_filename, std::vector &atoms, - std::string const pdb_field_str, + std::string const &pdb_field_str, double const pdb_field_value) { cvm::fatal_error("Selecting collective variable atoms " "from a PDB file is currently not supported.\n"); } -void colvarproxy_lammps::backup_file(char const *filename) +int colvarproxy_lammps::backup_file(char const *filename) { if (std::string(filename).rfind(std::string(".colvars.state")) != std::string::npos) { - my_backup_file(filename, ".old"); + return my_backup_file(filename, ".old"); } else { - my_backup_file(filename, ".BAK"); + return my_backup_file(filename, ".BAK"); } } diff --git a/src/USER-COLVARS/colvarproxy_lammps.h b/src/USER-COLVARS/colvarproxy_lammps.h index c6b6bffa45..2ff9e0bafc 100644 --- a/src/USER-COLVARS/colvarproxy_lammps.h +++ b/src/USER-COLVARS/colvarproxy_lammps.h @@ -110,9 +110,10 @@ class colvarproxy_lammps : public colvarproxy { void add_energy (cvm::real energy) { bias_energy = energy; }; void request_system_force (bool yesno) { system_force_requested = yesno; }; - void log (std::string const &message); - void fatal_error (std::string const &message); - void exit (std::string const &message); + void log(std::string const &message); + void error(std::string const &message); + void fatal_error(std::string const &message); + void exit(std::string const &message); cvm::rvector position_distance (cvm::atom_pos const &pos1, cvm::atom_pos const &pos2); @@ -121,18 +122,18 @@ class colvarproxy_lammps : public colvarproxy { void select_closest_image (cvm::atom_pos &pos, cvm::atom_pos const &ref_pos); - void load_atoms(char const *filename, + int load_atoms(char const *filename, std::vector &atoms, - std::string const pdb_field, + std::string const &pdb_field, double const pdb_field_value = 0.0); - void load_coords(char const *filename, + int load_coords(char const *filename, std::vector &pos, const std::vector &indices, - std::string const pdb_field, + std::string const &pdb_field, double const pdb_field_value = 0.0); - void backup_file(char const *filename); + int backup_file(char const *filename); cvm::real rand_gaussian(void) { return _random->gaussian(); };