From b6dbe7957fdab583a3b815d2de0445a9aac17e63 Mon Sep 17 00:00:00 2001 From: SciPhy Date: Tue, 23 Apr 2024 17:33:35 +0200 Subject: [PATCH] feat: use m_fromScratch to catch cases where node removal reduces path to 2 nodes --- DiscreteENN_TSP_table.csv | 34 +-- DiscreteENN_TSP_table.txt | 34 +-- a.out | Bin 140944 -> 140976 bytes algo.txt | 37 +++ main.cpp | 4 +- tsp_discrete_enn.cpp | 4 +- tsp_discrete_enn.hpp | 547 ++++++++++++++++---------------------- 7 files changed, 311 insertions(+), 349 deletions(-) create mode 100644 algo.txt diff --git a/DiscreteENN_TSP_table.csv b/DiscreteENN_TSP_table.csv index 3fcb9a5..3e9744c 100644 --- a/DiscreteENN_TSP_table.csv +++ b/DiscreteENN_TSP_table.csv @@ -1,18 +1,18 @@ name,distance,points,error,time(ms) -pr1002,280407.968750,1002.000000,0.082468,15315.000000 -pcb442,54114.605469,442.000000,0.065710,276.000000 -a280,1844.404663,181.000000,0.284837,10.000000 -eil76,560.789551,76.000000,0.042360,0.000000 -pr76,114190.000000,76.000000,0.055760,0.000000 -kroA100,22749.457031,100.000000,0.068953,1.000000 -pr2392,411187.187500,2392.000000,0.087705,1049157.000000 -st70,735.881836,70.000000,0.090195,0.000000 -kroC100,22543.697266,100.000000,0.086496,1.000000 -kroD100,22713.125000,100.000000,0.066644,1.000000 -berlin52,8191.641602,52.000000,0.086137,0.000000 -eil101,669.608093,101.000000,0.064560,2.000000 -rd100,8263.841797,100.000000,0.044733,1.000000 -lin105,15141.876953,105.000000,0.053055,1.000000 -ch130,6425.749023,130.000000,0.051677,3.000000 -ch150,6910.962891,150.000000,0.058665,5.000000 -tsp225,2754.485596,126.000000,0.296607,3.000000 +pr1002,276678.937500,1002.000000,0.068073,10194.000000 +pcb442,53866.402344,442.000000,0.060822,111.000000 +a280,1874.166870,181.000000,0.273297,7.000000 +eil76,567.772827,76.000000,0.055340,0.000000 +pr76,111553.796875,76.000000,0.031387,1.000000 +kroA100,22999.716797,100.000000,0.080712,1.000000 +pr2392,409888.656250,2392.000000,0.084270,127181.000000 +st70,689.609680,70.000000,0.021644,0.000000 +kroC100,21787.464844,100.000000,0.050049,1.000000 +kroD100,22821.566406,100.000000,0.071737,1.000000 +berlin52,8053.304688,52.000000,0.067794,0.000000 +eil101,664.361877,101.000000,0.056219,1.000000 +rd100,8295.532227,100.000000,0.048740,1.000000 +lin105,15260.703125,105.000000,0.061319,1.000000 +ch130,6436.513184,130.000000,0.053439,3.000000 +ch150,6888.052734,150.000000,0.055155,5.000000 +tsp225,2736.984619,126.000000,0.301076,3.000000 diff --git a/DiscreteENN_TSP_table.txt b/DiscreteENN_TSP_table.txt index 8d7a7e0..6a5cad2 100644 --- a/DiscreteENN_TSP_table.txt +++ b/DiscreteENN_TSP_table.txt @@ -1,18 +1,18 @@ name distance points error time(ms) -pr1002 280407.968750 1002.000000 0.082468 15315.000000 -pcb442 54114.605469 442.000000 0.065710 276.000000 -a280 1844.404663 181.000000 0.284837 10.000000 -eil76 560.789551 76.000000 0.042360 0.000000 -pr76 114190.000000 76.000000 0.055760 0.000000 -kroA100 22749.457031 100.000000 0.068953 1.000000 -pr2392 411187.187500 2392.000000 0.087705 1049157.000000 -st70 735.881836 70.000000 0.090195 0.000000 -kroC100 22543.697266 100.000000 0.086496 1.000000 -kroD100 22713.125000 100.000000 0.066644 1.000000 -berlin52 8191.641602 52.000000 0.086137 0.000000 -eil101 669.608093 101.000000 0.064560 2.000000 -rd100 8263.841797 100.000000 0.044733 1.000000 -lin105 15141.876953 105.000000 0.053055 1.000000 -ch130 6425.749023 130.000000 0.051677 3.000000 -ch150 6910.962891 150.000000 0.058665 5.000000 -tsp225 2754.485596 126.000000 0.296607 3.000000 +pr1002 276678.937500 1002.000000 0.068073 10194.000000 +pcb442 53866.402344 442.000000 0.060822 111.000000 +a280 1874.166870 181.000000 0.273297 7.000000 +eil76 567.772827 76.000000 0.055340 0.000000 +pr76 111553.796875 76.000000 0.031387 1.000000 +kroA100 22999.716797 100.000000 0.080712 1.000000 +pr2392 409888.656250 2392.000000 0.084270 127181.000000 +st70 689.609680 70.000000 0.021644 0.000000 +kroC100 21787.464844 100.000000 0.050049 1.000000 +kroD100 22821.566406 100.000000 0.071737 1.000000 +berlin52 8053.304688 52.000000 0.067794 0.000000 +eil101 664.361877 101.000000 0.056219 1.000000 +rd100 8295.532227 100.000000 0.048740 1.000000 +lin105 15260.703125 105.000000 0.061319 1.000000 +ch130 6436.513184 130.000000 0.053439 3.000000 +ch150 6888.052734 150.000000 0.055155 5.000000 +tsp225 2736.984619 126.000000 0.301076 3.000000 diff --git a/a.out b/a.out index 8c9d2ee4c3bf3d2b9daed7173d43b35dc6b9a183..8d28a5b12f315c72b2729bba61a58c64e01785ed 100755 GIT binary patch literal 140976 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 z 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 D+>Iom literal 140944 zcmeEveOy&l*8fGJsI*Hj7FkYI)M#abia}+8f}UHKBHu!@01<;iAh;-&CJB_c+ij?^ zvbV`;ni;35$?2)aoGetXFTIkz*{h_M`$(oWlcJUUzTb7uxp#xynR-6YpTFbhviDkh z?X}lld+oJf&v9XncU+&C7?<<(bzSNrRM==?GVO%CU-hwLE?1^2-PIp|&u}HVjsP|m zzf3!|XSl`A=7jM!U0;OEm&iyj;b|7y<%Eue44E(5v-c7!#R**r7R-EcjArr=o=o{0 z4p)z`N^n9wpOjZ`OVA@MO11bnp`MSr*|^fmw{c_lF!2~GU%D-ylaK0RzS7keed(Ls z!%SPBPUz^9GV+&h>$7K=i8MZ$^4I0+nXk^y*E7tv>79^e@R|6fZ|47|ygWN!%RN@T zdWP@W^>ad}ysMFqdilAJqt*#_dC}S-{YZtCPlK-SOB&XLJW0ccIR2dHI7AlVM;zNUu{j~DJ;}9bSz%IU zQv7L&3GtbEuB4dyge9>tNhfB`AZ-JFP5AM-6F)zGcjNaP{F?E*7r*=PTY}&H_&tc< zQv4pmkI%0!tNZNwWB<^nu8qMGuFf&>xIqCw)%tz1$b0=w}1`WN&i%qqOfyQTj_s6npj`)jR+G zQS>=Bikxjx=)aF5&&DYF{9P124@c>zL!|}5h{trZ^w(oD(3{?_j8flqQQG&iDD^riO8>ehivK(>NR15xU`EJ}a$MXA?qQQG~TDDp3fGVZiQvA2{cdix}b-d>3! zC)}qi3BR7t%~ABw8l_*{8D)Nwa&+&0;L|Afe{U50APAV$Q%Jy@qxk>xqtHJc#U2u) zwAY)vStBQv)cJB;1vZ$PI;EuAS5lW%U0pPfXwsyPm{eU3 zHnXHMw{m7l>c|^PeAy*6H~A{72!}~VP4rclRopN(H7D@qf_MY2_+S%<27X!Gb`sJ>B@-(5z?FqR{*v-=iDezYTDS!3P|poSmN`cz#5VM z3X0#2*M*RCV%aSb0aH_vaZX9y#L}Xw5|lLC5kbeNj;JZ|hSW)qM75W zD`!Kv5|PVyVL?H0U0rHw>hKvwHD$%HI<~Z@c%m;gwYapXy1-XmROYMk6z5DV!XHZs z(jqBVyN)TUDH&B(b5&JIMYyz7EiI#}vb;QJ4wWC2!jJ>Jo_ABkx3Ck*}oY!t9b+ zMYZMOrtBsH3Y`_UsqQ@~HB~I8rp#AXS&=i#X+6haEx|_4tS*{s$(5dsD7&BqI&_v0 zj%b!0X`R$EpOItAYfBs&>GgUO(+gZk%R|#!%%#;G`ba0HVgK@mKfK?I1hiqxJy>Nr zJ=#{X(4>w6(O6hhQ8ApI^jybDSQSgVrnJo0y=MQt6WPXd;mop{s&aU`ZnmCn*?!oZ zBJRP_hogDR1Z{dK#`bMCVxn(&N%mys)|iLe43%#*bf~A6@n;tNmbG z83hw&z{Qr7*i|optOeC2Gm6TKDvC>H9WaI@Kj`X~nRy*>*RDVqmtMDfHIDmL4XcF1Bb;sr0}} z1(Q+=awc9_fU!54vw$&9Oe>g_T9A`t*(IE&MjTNjCI(Ry8JQbQnxyA-+=n z{OP(4{G9Bx;$N!pk+U#C&9R+fH-A2g-mMnikyBNNZN!QHFUm?C!NLk=!RPu4Drbok zw%nUD?$|w{dmH?6J)#w&cDb2TIE18%13?{nqf1SnSynAG-+2WXnX8L12euak$N*JX zBjSvrnFU4VSPa0IVjfvkFaryk3Jia~V$RUISK=2p=0xAfVhpx+r_;t+rzv`qvZ~5) z>^(d`y#$nBW+g|dx8{;kM-+HwSCwPjC@+Bqipz8IuADf$AWg8g=NP3cqPVEWXOAi2 z;ccwF&WiNR|Kz7fR&o}N9#3)^U^%Ux4YzOUU{o>YAr+M)3Z@Ll^vG9IG!s(|X#b`W z6_sO5WP)bGzV!@du#_esvz%*i6aWih1>9Sy;+O6j4r4sapr$k{VPXQ)%yO| zqoXy?$)R(%n;<;&qTzF`u~*vdKdD9d+0LwZcmZcBSWwd5F{5zC!~bY)qsmL_IBUiXx`G=O_8bj)&>}NS zd_`sDn2qOEm(4E02w7TGQ(A!4Wm)k&k))!egmWjNDG3!ju`+E|c`e{xj5fV!MondT zEtVZo+&j$b=S*mwnz7Gzn`*M}uWX+m^IsnUUrKxFO#_yTp1Ul+|ijZv221YGyXU8hSX6qmY2ir!(6)!=g@I# zfkFG6F%NqSc~{J_?J;5ozi2enY)l&lQ->GVR&)EQfa}UJX|j>ynEEf(qo{^UX=f*f zqc1dRTgA`uCXSToufMc(YYxV_u00!ay54_uU$DdIgJoC*r(68INvKr`u}iFy!&4cw zXk;Nav*c$j6SSssgwf^~GB9F70R@A3hGV?tl{dg^cHd)ga{ufl#Bg>qjH|xt+G1>U z!YNO#n9GUhgp!)t*(ENFT{Y-@nBErOR8U-cQ^72_R@dy3*|RI>l(>-1S2+{um_T4h z5Yzth5>EIq-zb^MRBVLUT^Aj>t_(I}lggI$?4q&?*PNP)D(ocsupcJ6L|4J2B{SWv`su6Kid{=vd#(;`7cULbA>d z$8IP_JqV?eWwC`HKXz=vhzn9&k-JrvBfXQKc&0iOR;;gcjaKr_#_=AGM_ozy<()GRCv_*f znt`_avEkZ*WjK-R z>skqzPYg6T$xb6Yrt?9ZM4sSkwQ*GfAMbkChRXy#&b7^kiv)JNzO~_b?>r0nAyT4M zC;!4B;MdR9--b(t{utM(Hat(@qg?0O@Vn36gcGqNT^Tlfv!oy4%C_M-0>`-~+HkFu z7wei~!@eQ+;Uuq*s}e9D=RPx#^5ivHVViya7slsX_$@u~&IQ!Acde5)hu(n;?R(Em zy&u0!i;Zjf+ZH_<%XO-aW3WQQ57zK2HN10wmB}p{eyB#jQN!P?;oCHPord3{;cwCL zcD*QVnTB`HN6{E^$2Oc~pW_m5t5TAjb7kW13=^Zi8vWfG-Z_^g{kD<1{!M&9 z!#n5t#5ZVo=NzPW(L@-Z>8@{$UN@VxJQe|Dc9<&hLr8OT#c0BnkB78!#nRFFkz#H9~kE1avzU&H5V_zN_AzJ?#B;R`ioxo&4Zm2!PuB3w8h(m~U#j7+(eTSOe7=TX zuHmO@_!Sy{nucGg;jh*3EgF8hhTo{+uhZ~t8vc3>zeU3rX!v#wU!>uchM%F~_iFfJ z4d1EZXKHwtJ%6U1muUES4L?i6CusN^G<>3lFV*l#8vaHNKUl-xq~TLEe7S~C*YLA7 ze5Qu4(C~(auhj5)8oo-y=WFrK#B>@N0mzL7AOl4g>?GYE4DX(k9fjWCyvrc2-n zgt=ri_Z|Y`?8^yrsc5zfJcclrh-RC>7ZK*t&}$CGgRNxzsZY1@1$bOFT1A;DdOxzLZNlGgIL22y?5yaG}792y;nh<_UZY zVJ^kYOo6Kja|vdq2z(=9F1^eofoBjNN;pB_X@t21GhG5tAk3wgx%WqDf5KdHne76P zACh(brxs)=S1s+J4ODMBm;NuB%>10+3 zd^BM$nao0g`w-?*$;=b@U=T2uNM@$M-x220$V?G<7hx`m%p`%g5gtuALEw)Ga|vX+ z1l~-TOCNLZ57PdGGYPi~yq0hl;WmL+5#|!dY!Uc5!ea@q5cny=T+*1!1b%`rmojFv zzz-AV62`0-_&&np30Dbx7h!{Np}>m>bE#tH349CT%L!)+Tuqou6Ej8N8wqnsVkQYZ zgD{sOW`e-e2y+Qyx&)p;m`e|H??GvQ!d!Bg?E;S>%%z6eCh$dsxx_GA1RhS9OAB*_ zz~>U?lEPdj@R@|UlrWnG9!Qu=2(w<`;|X)=U{(oyG+{0o%tC?t5av?B%oF(F-GI47 zFf#@Ijxd)7W{SYO2y;nbCJDTa@O6X}1pb&XmjI?q;LU_N^*8q(koG5BNVr|#wS7hw)S zW}(1~2$vDg6ZjUwHxkYixSH@ygi{2*kuaz5W|F`&2y^OgCI~!@FsJOMOW+BFIaN3J zc1rsb<`ms*7kCWen+dlGd=X(z)y)=xhZE)$-CQB?xr8}2HDix?Ai3GwHJed+7QV#-_GSj*s;-Obq%@q%<2oNx6xrx1WOwU z60g5YoiE`Yl`L82Cl{)LcC1w8L4LB?g4sYsf_O@h0|`_;*pXK!=+ytf8Ji!%?(G8J zWmy4Va=zEUC)fYIS|?@iRR5H)E7$+ET7jq$V3~hn%)iy^->x1()SQooWJ(IzeJ1MOk#{crZW6@$4cD4BzYro!MGO}l6HP_y3k>Aqhh1iWga9~ z&!aCfM!<5e&(_G*g$WBi5WVF`qlJ@FmG16Z5Lx-vj{l&6Bum4|aI2h3a&XsVFI#a@(Y9K~TA$7zKl4u8`**0R*hQC8?MFBM74-s~(Q|$kd#I;0z5h?#UA?{L7 zNeFvKXx?f!yuqqATPd`jCPZ1@0*2I!H~4&V3+ibEA5CsYsEUPnr@GdroG9>qb%o@3 zIk}!hmjdV*Kn7C4FrnG0el0Zflk3!V-;;l1ayllwk*dbShSdZ#whGdWf-fhxLlqQp zx0u!Zks zUy`0q7Ha=zOl8zEsl}uZyezH(1#g@WHa+w~D|4YUsAEtgvqKz)c%F+PvH22U+n#RP z2l#cS2jdo^2&Z;rz?!g@M>5Xs=PnZj*lfqqB05QIBXghRJnl1$-{$-LHX%1m+? zV5wuD^vnMH?QW2Sp6T>p##1+eRq|lLvhxPxcHe60Gzl(9W&XRj#u-Svcme!b&TNpV z!2rxxF+`}(Q8~-v)E|DumRL<6t#+bA8G)RQ;TCo`{T1fH-c*jfmS*UoDv*f=eS~CK zoyp8kF^(cPzfIv+ClPlC%L&GH(E@_2Ij=E-`5RlmI8d>!b^C!cTVg^77B=k#YxU`m zk}ICM>c68HtJ%HP5(~eV@s(D*jx^=?(_PfY$xy6{MTwyUm8-=^qXQmTxVjL$%q~9M&zu!qeis@t6I@VY;gcdLyFsz*UPhn*OtJ6slc)?&WP5|H7Xs_+v}(Pl@hV|AUZ3 ze?{1FhY@%_IfY)WX`e62ocBXCJFoBk&9fjCL3$c_zG z*VwT{l`ApZ`)Atdcs0t78LA&D$7xC)o8;MnR(HSfRD_UdsW^rG>OmWSI`H(5D}Yyv zexe@WBonn3sFl(7*Dx71LwYv`6|sLCC{_QoW0;zBsK41jp?cDerKpGPSe0tFW0~p> ziCvPc79e8whq1EC!uckfs8ki%G2uMP1`5^Xb}U6@+OaA%%8q5K^Cbq(XW1yUza1N_ z+;%Kc#YxQ8W9PS4`G)$&j>W4Th?)N*mOno^o>kuVxNRqDiyf;|Z!s2ZOio}^`?Hht zWDiBGiCG@E+1080!;AxDTxm0wQF|UR9saNaZWK~mwCn7AhMLHH+<^*nzxuGk`|9!z zKP-6%CWhhMeaUaLjgbm|yVp^}PQ=XD^|TjYyXHGKCV_QZC)7~%Dmz=1T4Bd9|FvVK z>QOsZr|z?3@v4+X=L$2cn&ekwCrfM3vVlZ3-HxTG33hC-GVEBUy3~#(sgZUpL7j`3 z3>V?5CfaFr>R3A#uVNYN)^h7*T5ivzzGPp;jHI4DV~YTo6sfoDSfXmRV})v!9ZO*c zc*X|O)gSCwoq7l{^G~`q?sk*$Y_?D>MSFOIXJ^TRBro0*^d=`@&S3caUm&OyBj!6*oI(=^lR-yeR^SZ|{ccf= zORfHfj_@mQ;Ouwjac1+eH<*@z1WrA!-Yrhj2&P?jE=a4fC*}2jBQ!%N+cZN#LyZ3$ z<~Ti^<3#4jL=H*ZheWS`sEZ~3@HK@kPfme@1M6>w0C%#mPFsexiq{X~J*zNNbb0(= zsny?Gi_j*h)9c@bRQl)*n}7|D-YaVxl-#A>-zT+GKRsg6e=p%4wOhhNBJ}7a(g#O> z1f23g43X^+1)oJIn6?1IklUTuj&r2&`av=JP0S}%iY-j1D9sV(B1@PC&Q+;~E@fE4 z7{Q@eGFzD~Q;{vxRD@R15XMVkc6Nv`l6|N8NFcOS+QGrdeh_JWrKH&qHyMFgO57C2j9^`Y;g7o*aW%>WA;yaCYx!Rrx3|&` zAsh-no?L>X|N5}Yb?tRo)3dJ2x<0GGyaYw4lSO&!%*|*O!@myQUyr_RVa;8UR4w{< zJM{~M?$cdn2RhBHNGGxShqrh?I|us3av9CE?!e(KwZ#)0hmzMAYs`z>O%Grv0tXT9 z#_?w$vZg)G1Jm+vfMlw_=n^Y}Mj0fHU~D4eEvTi}zn8Q|aC%(3;aBd{>w!d#^Ad~= znemLT&rEO`4J}EAKd;@$*iyS)91d1uxxq?|tB)qH1kqK&OZIz%B~Wd4ay(Z(Ng#;S z#}lZP*-5;@)p0DQ<|pqp0!xzlIV3hf0zz-bPIu#^fsE{RH~tk7PSm%xZvW`aM&TCY z3G_?$fdAgsHMcCxPVU4^$K5ybhwY(Lz%xTQUniIpdCnGqP7jAB(S z%7lVZ>|4?fRQhpNfv=q{N>IcLM4|6V!>Nl{43ui1tREqP zI!X#cSCf4Q_zLNcR>u|X(-NiE$Dn<>lppTT>py7tKj(<>!?%R!mR0*#HfQw#W5F8q z_d&PHIKNdDLkL=TCi??=QzAlEpYbF{7-vCtI-G$#Nan)G<+3^?*L!@JjjSXdh#Q1b zavFELo03mL8hmrpEa(HpPe+0`aJO_bcr{8OCBU_?2YUQ1+5T-<=*etcUB4K&#zV}W zmW1qqM@2Md5^o2Wm|!%0;%>YHC1Y@W=qz@#vv*1`^Z-Wlj``ipJrk;-?@}el$GAcV z6XNkheb`0(hu8>tp@Y-cggPh1H4Y=e_3yNIrd zJjxsF{~0#$gfet+S__D*p$Q{wqFO|94E&#we6JXE|G$OF+t+_GS*ITy+BR*Sx)OOp z2P#6$(rjh9HJqhK2}vpm)a*kt`G5}VCCAIjRScnM@hSdGlG*q2sX9qO$F2hbpY>KA zRHP1*!Bb511FB{mK-Jj8`QkcW{IeOjyu=Q~W;A{i&)fW#l)Z7K-qgsC5M0j$1Mp)Fk^ za=RO^wWUjOq`MQQp}zi%(&0Ep+TW4x>Esl`wsh$ySkhTIOFE&qrK_@~!_s<5a=K)k zgoB~Or4t60bcJf|tCsHSkip&9ek#kuCblD;2|H0&LORY%mXWEgJ2?Q5LM+`~WJ}j9 zI7>RAr*sf#so<9+*SlDYu*Qtw-O0=%lW1tJon-#E(6k}r_`O(?p9(R>^>BJ~ z+hYXmc~bDn9OTz35c6Dw$f%`@siqQrCL?MboN|3wMxigu?!toEdVFIu{KqT zr0%hJWJ(sKekE3E+XaMA(s>9#9xXPN7)8cbi-%=~NPWUi6@vzk7MhhKhXCX;-=?Y( zqhr5wNa~3p$yA%9SrCoM%XCHpkZOcYwb!O{=^_h2s{S@rp47B4xlpGPfK)qav{3L0 zo2o^p5`a`|Y$|KH03~sr;z%z5sUC5t;*c7!hD~?l*$IT~VVq<>kmUwui!X1w&_3!j zR)GvkNIUa180)>l2}9AUWD8r$G3Kwp_Bu+)sBqE|Sd2wxpR+JNL4^M_K3sfy^zmWX z(Hs*7ttf@h-*gT3Y8(~yk2?jZ*QRCmvxkhxXuu^}J>|uS@VM~qJ|euH79 zwSnP-E!`+HtRckRSZ|X#PAYpKTKF#{jygnqvI?9dg@V;e^Z<8bzOd2;i%v9=x{kd5 z%V1$1%hvk89xO&2CZ{!QyvqqP9CLWs$fKMud`LO}^RV%4e@jkrVS)dvVI%NTPkmYg z$d$I7;Q?eh%u4l#oZ$h)zcw;D!B$Fk{N|@PmTWHfzzx@cu z!x(7-NY7Ncf#+lQA_La8?#4e2!0NsJwscs@pkokqzcObmN1wv?p>+QSwVcZTucOdf zG0SM9(35s*6$L{L>KQuDQ2=_q+iWUn!i=7yP@$cgVDm`Qc?dur7ui&8GA#5Qg-)|m zSJ=aX3_Ok;0+7c(yT(T)M~tu(&&Isyw@5g*uf0 zq$;whR@hW6I+XyVy4a?Y$t#^ZwCrxIMZ0zzUrq#BczoH9lW+DpLoE>XV5Q)UH17?t zmMO`gcgC5)7=5@z$&{iZ3zBvS#@|(eKIJhD(y~WXQ9YB6VK>lhzz4vJ`1c zl+|CZz7n}R*@akfU)X@JCu3R@`r15fbQWdX{G`#nLVJ027 zd$DePhflxu7uuCnj?SnjoHr z+^pqCl3MsYr=Ks&y%Trin>L3ehr>s(6?F_bV6H2DNtPaWTWc6h?lHm5muWTEAkQ5| z&P(h>%UxTUtTo79DVg`OK*TYOV_uauqjqM}D}+$iAerjZ|FJ~u1k&B;u|*v0h&YNO zmc9cK{cBmhB+<0B@lPcu5DxU|=B)n$w;M^boVDb$opqkwT3CT#+em3Mt%q;}&CL^UCZMkk?fsv$O2iqsg}l6nONAXQ(Rs@bMmrc((( zs?TVV&QyTsG+rzyII!%MY@qn3P|U_I9d*o}C1K^GQZRCb z4lcy~hqus_e}&@RFIubc#YZ}frOnLohva;gmCFaMCvXI|FR!2Ha=mgidvG8#MP~M` zyszZn-__=RWv}@U06px7`4hwWe|1>?&FC@V{2>56@`vYaXW@X++=)ZuZUio)YrV&> z4F78lhvMB0FJSJJ+LgI)eXQ^3z(ra9^jC3D(*?MX@7QejKl)uXE63k2-Dud*r{ODD z>?1h5bia7wMOlkaOgHZVfc*jT+v4!M^q28_28W+ve#-y|zg)~yZ22~z>3@NI59#vV z9g#0w-^+fPeA~X&k3huiD7xFlgd*wY}`UZRhU(q7B; z^3o4)uk`Ni^`^)lo1V2eHr;Fy`Mu~3i)oNum=JBu^|uM%xxb9>nfqA}o9_Ss5&!0e zOUW1JuQ|-Cbmsrv$WFtp!?01f0cZvc{bSEdhK_e}1yJ6A(UN(dVcVmnueZ>z!|n6m z_0=Io+x6nzV{u~alA+h&*@9_v;;pmP2i*8NMC$IWm%-m<-h~69oYYP9U#Xv@?)Ktz zyajm6VUgg&tvsFmHg$7W!xx?Y4;$9TdjqiY$sWNCki)ro{n?{kq}%NcW)ECg^S$ z&LeVCaeNq?Y^I|Iy|L_3@^MiFJgnrUwumiK;SCKfT7@@Cg^x61Hkzq6zr)Bb%FX~8 zmq4^tRJt3!w)T0vWyAVBhm%3{X zxZvPqQKY@_Vb}RZ0 zH!<=oGB0v8OL4fdHxtK_x6&x&A_#88dBLGnmHv@MrB#6ga4G{FxG{%1uMj3Mvqot- zbt%j8f6RG`v?MfPs3FYG*_2G_)U>+@G9d*m$|)jA)mhTKd(^2C?o=l*5v3g?aF^;U z;ePc4S_JC_ym2G3THcS(8Mx)q2te(}LV(0r()MG?ER* zdoA`8)Sr-^+U36_+5AWjOnTg^b~o|AiBrp@w8PT+Pzk}&-@Cx*v$ZVsFp{m179^WV zvZ{9yx?+$#OOgkBCwa&sxtk=u-bv9x|k&_bxuXI)TTsCSYL7Rf4-JkdMJlWga6Xjg};RVD(#(YG>tac|jc%OJpX zCTI7Wd^wUwGx_XZlg~r)ub6y9ugUaZU5AjovjvwVzw1p=wF)#XI7U+IKx5yX{7`lZ z)|oF^A+J;3&sC*$v$8%Cy(to%BGC|O@3Erhyh!Sb2&YFP(K{jpH%FqgBLw-8Xhnoz zY9zWa61`EPBEV|NCeh^)4i86Y%dDvRhX~4&f1UYa1T{7iy&w`jNut91*$DH6k?3O) z+9oS%R@vdbcDURQWq--i>M#pM{SAynpT$ZAYB%i+Onu7E`}YXd%@!3?uZ~2QSt6N% zh-fcG@;n)d{>J90wZUPjA)WJ%NZzhUbeGNM{Rk>1Qgqfktcj@Y^hosRNc8(iwp$|6 zl1MZ!61~`pnm^cKoUmDEx~-6kFd~ZRD^yZ+hX^FmTO-(FD{9(yV~zvt>{synBB{GQ z{&%i7a1X3u$KJe2nABn29UT1y_Tah(Tzo~0>)(<2Iq;sVIFQDTVUW@3!|RlBzXB0< z6nsZ@wcGc4*M;x*jy^@`(~f6=7s+@H_?yd&HJzA~tvB8|kF zl&^mDmsi8x)sC2KG>pCvlo&+5^z}CaqyKg#zI`&F9w=1|Vb{mK48oY})l-VV8NpnfqD{e2iRJekoNc`AyU4(n&IH4sgHk6WVJrwh zq5Y!-Q}R)Cf$(jBs+iwS&{QSi@goGa!bsA?b<*O6FF9147;%3o%sta9+OUoPsXi9f3uXB}T= zO+q95fXnBYA7h5o#J6_5{$MGB#undsq0S*qRfr?Zt;e6q&G>WOGW;o7fj_fb@Tay7 ze-^Yu4TVN9m;`D}E8DTL_X@9xd4n^PPuH~4lnw%1YH!%lZUl1@HZ(Cq5(qamB_o!C znBi|4j3|yNjbKwIVnC!IQ0KLf_e5M;w_4lqpI{WXp{m{(-lJ4E$-GBOh^P`HRmolh zJBC@)uUn@K=)~!N@^;E3kN>Mtk)+UjH_Gq3|jRBKw%@(7B)8 zkMZ5AL~R z@i(S+Xcm_K$%|#wf_B=Q`%;XMGV#nkjHUj7a z-CAPwa%|A4iJ(%itmyYVrx5UaWVtp#x+2QsdZUZ{WO+dzC3rw_10gHJ>|(T3-iIyZaC8 z{V2Zt(eU+P>rjwyJAB1SHB<*@mkAe!n(>8?1%d@2NE9L1lWbZn((4j)nR^9%v?oxR z$eor(+_wj->j2>9@Z+eXH&6_+9qz`h0CKT10R*LHNv0{F+w99W0=J-8T)R`#VBOqk zP6TQ&ZaAcS12-mEZzQ`L8^A#=r~a`DNqi-f;6ng$8L4)@Cve-~+(3o+>3*KToOI+; zw<1;OxGhs*k-8g0l*Ipy{ox7TRlUy2W&~;_Teg#pYoZGQ&@kb=J~PjNe8SN1f2amo z41JAwc}iYDHUhWe*tpnXRwK;z|0A4btJ(zs+VCyL>%Qg}@E)GP!oi+Efg|=@$Qp)m^M0M-dMl~+OYRNeI@xVd(DhQoVV=M^OGu03qY;k#)o*N$B4dJi zzOdYHSxJq}atAu$VC^JF?;Z39(my=@pE%IIO8cT;z#xlvp492!!CgB~Fc%{>PAmI* z{Xb*}Qn2HnGuYUWlMZqmJ=Ee2j01Q>1ooYiF*nJ5&x1hc1{UCp9b0{~(Yd)p6t7~y zEjyzs$p`>)-@ORrxq*@d*hXzX^E*ItKICuBLT5E-Wqjaqd(lZV-H)zESFHU4 zHk8@8&)xI_$dP(m6-NJzk9_fs=)CM-ui}TngSUnG`sK0D!Q8rX26yB;{%1i}ZpMNn zcO#C6F%-kYQnHhu*Co3Lo0vGKT9}A)<=w(=9gojl9rr_D5WwyXdsM;;Xi&H~ZHUP# z&?gh1_cSaR?DCz0uU;gv?hD*l4y3l2<6)R`UgcP=|UpwE{4UfKKho zzPKg{`rcr^037z;tri;Sxi~k`hk^W!j^Aq&oaX-`pL``lr_aTqXVY|+KZb&49H@QT z@V{)GxLEg+79Kff)3Kgp1da@3#%7EWEMBm>VBbZ({~~F7x=9QtG7a%r|xducJ)I$ zka}Z6=;Nz*fa0^zuIcZGwoUycv}@|-)@?-(wX|+4duS8O2_4LD4Sjbt;?vh?^Ks<9 zo<&_QyZDYtNKyeG5z>nNcm5^voozF^uyG+X2iRTpGo;aXiI$! zvJBfe_hS5gr~2a1!2-NmGHh*iDv4Mg^^tH5UdIN}C?Pt@A#(q=1!FMybq;H*IXaa< zJ!~5A;58jDMO4Q0>UP0y6#8FMpMwegM}9+|lj8WjkI=!XaY+IX+vtAKF8>y4_m+ek zDC+16pI0Bs@1xtZrHYJck7xN1s|hIpSl}x-i`M>*MWT*i@v#E z>zaYn-wYi;{rlFe3DbXU&6+lKed~;jhkj_?7W2?sp}mvdMw|67vUqQrGag(%ci%~W zfY|ox=R>a*{0p&vS3iYPcf0TW7fa2m8}?=OL#=Bj6zrx1UsLNn>~X^MU9D?woc||(ZtjO;54YE_?e0Y*(1AjA zL*9h|pSl;F4T#0P@4hog`A~KDq6Cs0U$BcZS#n5!YRx)#>IbmhHLYuhJoFhNq1LrU z5B)2&ank`UBJJhU_+v z=$S4maW7gV1cP^(v%3>CdjsRK=Df_4(dlkXf|o_p4ElG6gg3^bNUVFVX#sM0;0Qpk z!7#?ew|;T(+|Izb*w$@XkG&q+JpC&o&@<;fhWCue$A`YV{te`q(GP7peIs<7-wr#t z{-e;g>o$cp=YNj0p?(y>4Cwv|N0JXxr+yatc7Gng8Bf>l`i9N?6#;ZVYyLEhly{k$0)Yi4>g*47kg+Oqo--vP#pV$=KR z#bkD(oXj5&D<|_ulvBGYJb&(PPPk9u|8}xxjoBB=Ozdv7=LWBiffOn3J5GUQtuq!R z4(Fd47z#dU-L@d{>(GMAK?c^12nQ4*#9l>TCL92wf2EZWcc&zLbp)#KP5zO|-;qm) z5pyW?7DmAxm8#=0NaO<|SM`gtu4Qn!6XN(>-Pql7e&@Z&Nbz9n~GBm*a>8-8X za+hvs9Xq*S*WS>NFuttV>4#cpFPFaq@jBIaAWDb{?Oku8cdXA!_$<_kzl%eK>)&;Swygh={sO)^D}DN!)@`1p z=o6l$3b_2Wp|*T{H0Z?dL!AS#?Q~o!epy)Yd<$WIZ1}3LCB}R9z1}5Uz(SS?pVGn$jFcaRehuvlNW4>WbJUkB_Tjq&}=Q&ZcA82dS zy3|ePCiF;*k4E4s^uHt7(~OKY?#5QDDub$2xDTTLvFEW5UK*Ga8}5Q#>~`oY=!DYu z*b}Aibq?MR>S^eIGuZ!Tuv(OW@4%l&=GhdVR zuyW9I5<^x8%=|Z#&}+g9vifUgC+bnV(HY-l|HWPdVhM;1k=ws+kLA4LWG)8t4V;1H zY0F@|L5@_;DzAz6#Tx!=pdH>;3uL0z@u>{H2tIl_uE)6Vh`}ij56)U}X@UoDE$DGF zrJSBz$}_ZdHEcO1h{3pcoOf^|(h zOUWnD|LRMjxIo$%1hVzO(@LI5@nn=kkcx)_c!7@P@tQS}a#_==gC`^8b&pr_fjCfj z8h&!S@AQE;VlnQfX(HK+M=r*lFmm;`lM-*My2h-J9W3$?KpmP@P**>TI?_LnpQxE=D6z@yx>$_)LafEi}A5MlsJXwQC%<%+1AR&x4GPZWToR2c2J!Du~e+t8yMOF z*B<%_{bHGIy39>8;%PD;=^t-`iUv^F?K743_bExu8u0P-U7*-69<{pUV^X=1(MY{Nr=}wagbSh!R=Y#?3yR37tq~M^KXX5 z@QW194msMHy@b8e$+nc)aNfO4@YoN;x>!x=U<2R-UP!d_qb>1$!PL#%Kbb2nfQ=H| zvQSUiK%o)zCHvGd)H(JQ0o18qQ49;1uZ{x%pUO8Wu|m)1%emkwb!$XO3q@H=h{Mym zecl<_$@9_OZpPQ5PH0TN8%X2gn-koPopBgD4pcfuw>}a31ydBecQa}H<6vMnW7LZ~ znO~hj>m{JYl)@ce^6Q(FF z2tC2tCzo#}2$~UL>t4|hz05vV-{^_MfWVv5`1$EIf zBsZ$Dmt34n=K}C@w~IWP(3VCYZ_K+*`( zllDsi*h&5bPR|+oOcaix&zFps%KY3mA)9a3B3*;lfwXgK;0?ixr}6%Dl=^es*ED_z(ZwDpV-8Vg42E@io z7O^sl2jdd(`5LhYl)=X-UR}fT4(~0;Qp{ipPm!#zLtVE{`paNw%IYrzhURv=Fx&=b zgLy2JZe1AW=9jiQk@+nK2R1@I1mJLwi%Z!U!hBCsUD8d&+_i3!$L4|sz0iIe+g!`S|W1^XvRDam5b~L1!|HS-ilRU zq6y4X_aRTyW_RN|`?bv6L}flMD0u&rSLXe1s}u09lbMJM*oQTAE$_Ab`ctUQ4ck=% zrCL2)XYJAIKH$|)uoTrP<{7R>7P5xxaX#wd^y^i)b&3k7oeu(bjg%cM9exQDSc6{| z=;mh>i8I>ViylCPoHa|%_9uE)Z@^C<2i(4zj~S!f$8EdI0^l< z*zy?9LuPV#TEac*N!9_~^HGGdNv#$U)3X!Q@=DM#*sD_if;5LGABW_xKSuI6*enIciSUtvXCi5(NkGbs|S zwW8)o$s>gSu%hM(=v>$sHUl<%yakh2M}&HVL_=m@>58yx^Y@UbhyC`teq)0L7NU!t zj=phz_thKHaMhDvgt`~w0p>G(@az8&HU*7fHs*=`ec1FGgOwfTQJ5QJ1MyoBjKOj{ zpBt^m`I3`?JHYuUrk}_mlhAswwPvG?96SzF3)H6LJoM*;v0QdfCt}zZcLRJPHXDXv zdh5RPH}oV8>*O3{4k@|2ISB=D6Bb$qRq`C}M+u8^VWHd&iD4FV)^L`$0%aN(XppS;x$?&0h5#uIyQypGjz12#>KwmDtF__R?W_0%}}dZ ztQ92TbP+`6bB8d0qCV=$2>Muz(B1e0Mh(b+s-5e4Etf@V&O^qCyw+!LnSYt&f8WY~ zjGh0=Zuysj#LUq1_M!n03o5sc>x46p2A2hTS04c@mBThGgS2HyeJmxa4vZ2?mWX8)n69Xx)CZ z#bcf4jGWj6W6gmiBZzn8g%NMF?863-cViD;w}KbAz~DtLG_CMjmvu&NKZrBc5=VI9 zonol#KeOZi$6&GRCYsGom&{tW|7UKWW5y~biIH~A!6dvE>wSkc#hb)ku-@}qw`ZOC zT@1dlblZL&94r2x0z5bN@Z6Y(?8^HPS__59|1R)}I9${re4oPI^e#Y7O0X=}<|Uf_ z+Ib)ESZj^9w+*H}WWofL`x#izAT()YJk9dI?OC%kiD!xR;4Bl31oH)K@N=@YoES8P z-C@;RPlLfKPRk)ZtR|B3JX4m*gk3&!5J`EMDR)SU)gXGd1xzeMqWZ&9n&~?FteR{+ar}VNqL1L4a|5wBJO_za%fiGM_yOv$)cH28fk>5T3#$wEdWrjS>kHiL z!rL1>L%2nJNJ9U?+c@1z-Si4XgFha;#yLMZn2=8|oX1nLE$;DeA$Z3<{sY-r+*Z&M z+EuU#leXFq8!^v063iMmxf}V#ywG?5vwsgvaFohvThwS7_I%X0%~2ls^muQ^_rB{OKDvx|Ha6ksRqSTZggmhu z;p)y@8w1at*oykI3q6r&{(GXs9bhsZk1e*FM?Y zwU&M$1J`TZO)Jn7d9NVeSQW0wdC&!~YPz3Y>tC0FanapW#P+e(?z;>ZToTobpRfzw zI@k!@WL;Y^0@h8J{`YG)U0eWgBgl6Qt{!x3aN4g?HkmY!@*^Aa_EvT)?OsOMAK-3C zsR&vQ{RGeVc-DN0YZrUGLqh5|OIQJ3If0HmT)p6(cI#ILdI1 z;lG?C%`I48tmpc|zB41fFAwazF+cGWbX~bIds?@zIWrWKi=FEPxcY_coJZg)O1%8P zU+6OZ-}_v;L({kP;pkH4*OoJn`zI32Pi)|C1U3VJkf-s5k-abudNd9Wyj^6D;iVDz z!1L#b;v(a)_hCNrUD9WoIm3S1n(}ZCzDHetAG8`w`(qnB9Nyn}kQ6W5I|+D8=-mmuFOZu%Uo_fGs-6i23)%jb(JJnu< z6j(6~rsdk4UfM!5U!qmtTw^g`4+?8m|1@batEWp0x4Eo%-g_I<_CY984F*j#<-Cyv zM*!YC)mp@$o9)PE>E_|((rV_lVfDMwb zn{M7iLon%U=#;wIA>khNsf0V#d!p+->J5g$v{akZV;?e`=w|a2*uhpm}@XWqelqq2?ZCe*(ou3TvuSw&TH0zzO2ZC(1xJrD@gPSts;%vaX zKntE2Xgh)BBd1gGWPuZ@xD!r6oTi_ z#$9qU52jvDPGNqV59|zX3)?PSaoA$1f70r$kF2)CCOsGd?Q^Lvbvn|Fz!FOc?NI8^ z*ipryR0?bpT`?2&unwipcQ-vM?+#)YSv~O&lpKtHJVgnXQGC##=UY2j2>Eb`glo0- zF-fo&NN2l~_;wOO2i#=fgEW#r7n;ffkH#jj{W!WG%O*H@+u2?!4-A)q7^fh)xTi*b z^#IXe_WHjeG+hXg#dO;grKn)sIWTZ**$!4hMqQF^LknjU_@tyH;Fzg}Sf@5@a)Ei`YaOWe zwe1#P`C%oI%7^ciE@a;mgsEt~uPmZY_d@f90)(=|LK z#dm4A(Bvg@_nmi9ow!KuZmL2Im#mM#0iDHDc;T~0;I%$B5ryCbWl|{eBedm81S_5d z(S6TmN5{rBC(ZE7>M_9d8!doWosT~lX?R&4j-wrrS|B|NGfMjmwYHMxvJpu*$1B8F zB%6R)39f$3=4(q~;JYUp#o*0E2ER7*{6kiA{G_ zQERtIE5-dy`h$69ONz@iFF71|5cJKlczJRmxhV!M~0fsJHo4pi&<{(-k|9m zOrMxY#~mIV+)WeWp$S;nGBk&11fjYSHH(aIRC_1X&Y>vS|4>@b1fSg}Ij*6RO1iB;lG3-dz7iQ%3kLm+$7K%1l9mTEy3*nHjmaue`x|G1l);O~QFZ~k7|E)Vrc&b&gN0~X$ z|1k-01%&B`%{_u~kM#o?Od>q@AQ^m&+QIS;?@>Q+K*a8jyt?EZI%(#K`_Yd3Yb-)X z>2Y0S&N?>Iel>?e%5{w?ls$O2^+~#}79+UC`sy`y)eK(K5XIs?2HW58_e&;@?iC-u z!Ih1TJnX@|()ymg(Qp9c!H?wFfJHh+gr^zD^4k}mGr`skG$HiCngObT zX5OvilZDms3q-A8;Pie!idMHT>NN+yOMZ=$K|I|zY6?jM(|KtI--p<$KJZYYt@u{g z(@+g7@g!CBA>6uVT&%BszSack%)IXpGq3?`ECU-r>BYbvVP#=pnUvl#uslX#IEA`_ zNxE3m;TC3ew=fL1Vqpd>td;C(MwW>QYpAoEi6MKVT%(|gb&S$#WZg%QqJwE$phOuY zaEPKBH=zRE8QG>uYW1Zk5VojpwL2w>c!zb7Y>N)mi zt8mGn70w>f@pv!p?iDef(RZ$c%7@>Mt%%1^v|4JH-)*)bCy}=!gDR`1CVEUpYIzbl zgUOd8SxqLNyk7YvtBt+l$>0n!IEoBTBm;L;!p_woY+neP4vPI1{@_L)H?P-Y@Ill( zk}eo0pqC;fyxR`atyW0X0z3EHcJ2=mn)|G*Oc%!vt|xFxW$l&^h(t$8 zbb~n~f_mFx=*+PllOeBhNV47sw(p~6O_+!mW3j`&7ZZ=g_g~gY$q#8O_neKXE$VXA z6}xS56JF<*d2YP_{zpM*_?woHK9Gam?IBIe5XYT!+{f(CbtLw`L7loUbrW882RLW| z!7kZm2CsMUGx0ls-*&D0TJOsk+#kp7;?7}TxW^wvuqE3)el5Z`-Q!t^ z{~lcYc-^8&{*T)1+dvk0fnEe+e^V(r;4TQh1z@3qBb%TL{C^cvj`iR6rXXi-U{<^=R97MgpM{>lNvsYf zL9N>nARk`l-02zep%>=~i-z|@+qR_cnyNM#eT@Fb;mfEmo<-yO| zvU-6P%FXzDt84N6l|o09tlY6!bwsvo}V;DHrO9j!)Wb@<;yIgN(zt{Fpcl(SBj z#%sW%o$3uMgx?8VGz9hJHIw-$oBYTClrAalek-u@`R^AIV%nGt8!`B<;+w*|lj}{q z#S3HRUO8qpxY!)1!lque+#=s*1hZ85umJaVg2H%6r?E!Kk%6(wYNW2yjWgPeV0I>7 z2%yA;md>aiK%EHGee*3X4a7zu)K0DPP4(a(`Tr(EZMF@qAnmL+yotvpv)BK}cp_ey z2kOA;EzA^nrcLth%;mP&YD0i$I-#T7A>YWc3_hCq?_2rxvK{!$X7~F?D2NPY-SU*{SF*Bag+R;&CLiVT)J7r~)ro8TYHjw?N=vS{CNoocxy65p2q1 zHSAA%H6@`8RS2O$w+X(RJ@584B#^z~7a<+WlAat0ca9Unode5^{{e~Yk6Jd?h<0vl zsU2Y6hmNPYtcK1w-zBy>!I27A2D0*n&}JBxW&U_|^aCgLXjIC={y+BKJv^%F>I2R| zq7j1=Ex~v}N8ex*6%9fv0iqd5;0#U>1r-%5w;(8&NM-;pNFWL3yyIBvrPZnxtG3o^ ztF2JHfJsQgMMZ)NC~6QC_F>QjL=q60@Aq5#%q^hp_q>06&-Xm$c{1mmecx-Zwf5R; zue~<%`Wph(uOUxmM;6W>p=cN$`d^78Z2@tH{seBe1u0+IW!8M~wJCMp6us0dt{&R$QPM`%|k{lL-14hXoSKvvzzVF*+cL11e5i<4RV zvZ-hquDpDzn*$8A!N{*B8u?~`9@10pT@I=J95jrhb`LR6`&(FoF`yAZau$ERS;-vz zCs=J@0wI<%i-!^zH77`AJE>8En>9%i@~#CTrYlx*ZiXB;6Xee7h6zZQ zxe&_FE%K?aPv3@?xC6z>xNQ!W5_NmeZU5M5tc8EpV(0QND-WIIT>QW2Tjili&c&}{ z6|wNpZu~kIHz07~A?Gjo{%5?KYggeHK~Li@GUwt8CFzwzoOnM0%X#+-{3NXc!Xn9n z-#v!llO;)b`*$hM#lz5OqaeKQ4}+YG_jF-$sJ%Jt>4(s|pfBA41a#s3jXn&g<#2U2 zI%5X=J`d8-2Q`CA2ix@!jaa0f?) z-Ib~f+w7O~p8EI<`0sV~BIc@2NE4Z-g9!y;n(QLHK{6IE=&dsf12k;ZJc2@UB+IVWKei{LBBTV^4rkzNaK)HJ~NeidH4>emK1C&vF zoK-~hBHZR`BfDes@i84ZPEI!A&_st zDCnuvTBk9J%uwBevBiwF`3P`0u(A*=*a(hY%L!|B!_Gs{(*w(@+lc!%4vk_GU|B;s zo?13h26_>h8(`5wWE2Sy%F3s7GR|d@61KB?l(0xgN$YwFMi#G))1AW>omLlIYTfL< zDQ00F9na1zF>yR!L+J_QWPOa5yH|keCat0*Z?3gWK+{dnqDiY5jF7nqq0o-zA^@66 zneg~(UH=`aA*|kByjK;d_(`|s==Mw9G*|G;|WUcg@6k2cYM z_Zdu*TuZ+rPciWwaIZuWc^-^~u86(X=~wGYozS|$e$I+z{BtbzUt+JD@H%CQ7uHqS zT>o;rJ3PB1w)yQ1&RFUmg9S5I%M~0+6V8cNz5;|aA0?`q!3zAsx7Iv7VB-soIe6zc zf9Li|^s;AJPJh1~=>q=)MnzgN0yh)PJ9U$bjHh;-2Fg*y(RZG zCsXlzB%}skT+C{i!5UT{Sjh*nPDP-5MNbTl?9&Ci&p}Ig9Xm(-V?dWGq+oFcjjKdZ zdja{>_*v|NxVCD%giXNy9Y%_IO6A$AZjq4_OQuHddIGnQlL#ePB8_lS4T{oVLC2Oz zdy1FFI@hmr=WYT;Naw1SLZ%P^)THAjU}wJN1>J}0jVztbqhz@PAL{7_hP0|R03|xF z6YMtvPi>W?h+FxXG~jb@&iCq>3Y1#+eOF^e#QI9~5iq^lx&lK=kS|4QxA|!tORC$^ z#cT@Ky7NC=aDbOT2Mhl6Dwn(FGP*2L-KPVVfs|kCl_wiTuuNG~&B1dxz!Jsx83Wf; zpN%lA`yfj{%FKjVp^RR24?cpD6n!g0BnAjLuD;$3HYZh~<_f7@HcMF|;`55q!*aj=s0MW9;J#@71MMc5Yuyb?1=O7RWD z087nS<*$dh%w|J?hyImgzl^y;Yccp` z_ho1&NpR0d>X;g^D`NcKPs!yN@w9D0G7R=lIH?;F_ z(-P8NR9pk6dCo;mvEs|l^4$6G* zU#ez+9vQbxp6%*oJm2W8p*0Qj3(~GfT2(A`yNsU=NB~_D#xoqJ>+f+jfh^q@Bjez1p zJt5yg+XGFHv#JPTXgYI@2=w1hM4#|0XjbY}s&CsH`Fg}!UX~FXz~OlqRmpZQz#{e7 z0vt(@;#XI}hLtXU+EKZ7lp@Ln^i*I+ZRaQ>*LxBbC!N3|=44d5uz|BYcV%OunkP81 zV>Kqu|JO7an}H>1!ezm2&gj_eG$~LYL8iO z6k#D9EVv%2vDIJiij^HG6Vu4`_;`boAX;}nfQR0$rQgw^C`4@M z-(VB$Srkhq6pJ%kAPy}JRCb);T%3#~SVZ=ALI8m`o*N71;6-Gn5))o_=HHk%0|AYP zW@5(~zsdvkG=j%&GtB0`2l@7OgS%i(ZKE}3Q{!DTzl{SRifw4TZ`OH@^Rf@)e^2B5 z4>#bBkjBqG+%4{WR?i={&eee5y1tD+l&#x}pW3aB-%YP={OD+H!^F~jICz;qWo_g9 z!`m85r)+F+m(E$&*k@aFW8SuPjb9yI+pya2eP>C-`6&;d-5X3T33c7IyJ2OZ`T4bSLT5d{Yq3h~xz^Ee-re{0fP!;={yK@PZV{|cou9T|!s{eF`ICn8Gak+=U`raFJ#>EZdIvk+FsaXg zW|WdQU@ex#+4T*7N_jXfLz>Ij^XET&ad*kGx_4%S16{bW7TI>7Z<+70fIW>z;5g_{ zy&g{M1(A+@oUol0oy}{B;c+N?4*`&s!7qmQ=q_)_{*I$zXs=8(vCcPcUE=}zvGYGx z+js>2<>obQybf-P)`lCqVFm5JaBOqqybQwY46LH(WwbT8FB`iaF44xWYrGr(NXg{2 zP=hk4+t_{hZ}a9iIjb{)iMUz4@vi&6H7d7vxDPg+2)`nbMa;TzowMeLWVEqkuDK!S zD7HpQHW-s|Rm;qs*qVl1nAV6kV`fY4Mx~R%lL2%~6!pDF9ae(>J-FxD-gxM~ot}IM zJf~v06mD|XJclaWW}7>wBmbz|S<>bW6m?5ACLKgQ-=m)WKU#K|#IozhcA)I3hfR_yCEz}yPrQ! z*{=Vl-6@G>+wJxe-p|-&k2+4-*^zcv)}HX=a7ipX+U_QwCtT~S31d9XCg4ejv!uy* z48s?~^12=d72R^7nGmOkI7PdEoH(>1p2T@(gzq)M3`}=>hY^=QjD>0&5_pJxX z2{YE=(O7?BH5U|(TYJ=karQyS;A8|+Q+vY~h@#wx9hky2_2l#5?!mk?B%pZu17;9g zJUwkZXHXGOZ`jX*A)aoSKuTy;Jty+nu1>-8jk5tX6ybQ9kAjPkR{a_21UG{PXW_fC z{-!l*(WKZsLVtJ(^GFZ~gL#DEdLEgK5^%M5igZa<(wzBiF&0wfm)}vGhct`ZM@5X? ziKZlqv2qD%Jqwn}o9+JQmV`ti#x6vPh!~r)REx1qOvk=cj13mtun&FO1bDEFGtsh& zl~kG}`Ob7Mf3yN`5Pr(|(91w|Lkr*Y{_&J9Z7pGpEiq@OQ17Y zxYrQ+g|ZUXW?tBP!s@?gjW_G`IJG1!tB?rdZ^cdF@Zc`aDka$Sl0K>iQ)B>$_C!k= z3+;_B57=lHLae zL@bnSTK$wMG_9U`p3tgWA8gx+5n`Tg@@!Wh$cVM7cle}r82S*WZhw}##Dxv)ei2Si z=Hy0XSy1^O@#7%bM1_F12RA6LrlS0zsoqJ9@mRiO$< zQZFH!b9r$#?GauU^CpP^v75M5&xF2 zVDZW*CA0gWfbAm)7ek68?7n}`(#F7a27Q^snvL= zGe1u6&gH;P=W?Jam8M=aq=J>vS`uvquyueMt-@h8_hjUuRl7^9RSv3~@5g+3Xx0Og z4Je9rajN>WU{#CyI~C~!tC}p0CG2Un^xLCsI_(?@{Fi^=7d$Vg7a7i%qmiy)!(Dk zwlExV!W+tRWQ?O|IsbXR&}H=~wh{y-Fb(FVz|A?M|N2KZ_YpbkB}Z~lZiHSrA^!C# zX3OY`x3V`x zL$wN!V4H@a2W-pb;v^-szt<-4tBf_x3 zcyXUE0T#^r6=qs~UJrVRjhL|JNdi*AfVDj|29ybO+tpN?R~UeX6Um{ zGV+^hRp41-sN>W7dfJSx@d2FWI-KwTz_FNBx zb{5PnH-dLNRsf(2`fl>b)-w^$Xoqi=>yog`)!~7Tb=v;FxH%qeaFXn4-)`hI8_gDO zTZMJbIZ#I#bzhvzu$&DBwOr<)LUV!OhN6s1vq8>fl(Lgg%iqLE48XTpq*!$KS{R*7MX2E`&ahvR5RSSg?dok4%7oa4Aa()IK*m%*WP?ftgA8jyRSDUHF+oP#}MQ+xpCjZ z4;X@m(Vm4zIRwu8??s|S_8+YJ7m!3&RQqrtoJQDp8E zJVc;28~lY%q3s6e@na<>#w4-nK_YE9$g5ZIp)CisbCU11>EQc}SxJj3sHD?jH<;(} zm?uPR2G!D05YvB{)qTL@5cy!^G)g~vP1Vod75drdG5ySYg-@9CPsQ@X6F3E%^DwQ$ z;```=F{^Ih=khEZ`%6x)ano|EsOCH_y0#*1+@k9ld}7f> z+=9M0-d)utk@-~EXA!nJJ;CeK9k`pmr*$!iEXprdPzGR}dnGm~!G!gWJ80%TF`n&9Lzp4K&8zY+GMhKq0Zq(1-cj{*!Q$O>b;S+dtBNhg32s1dt z&_62(2S%g|{QUPs5hvha{zGfKU~1#!YhnivA9oy{j1v{Idi?+fvyNJ@9d9zs0+W-A zYSMZJuL)OLpopHv!mwDwzJV8Q4jTl>fNqtmb1gc4CK9Xyc;p!PiRx*urijZS|FS2) zL66u8G+xug6^w||!>GuY(8I*Ym(YVxf5qsbG7_+qO^DKi;n?O}UUW9ve)icl!$=A> z=NyL;=CiR28@A&C2kde!Ay5wTgeN#AD?M12;xT(0Ma z`ijdaEklO&@{nz70@`=51A!r_tPZ{O1!coi4*kf5Ox(JLJRK z+2A)^8+98_X7f_kQnZFQV|clYMeCOE8{SN?mZ|z3>%%E(9fk!D-X*=6YOE==moaee zfhO|MbtiiJz^{mv@C-GPlv7Pv+_ zAX(5-GIhi3YpiigM{rRIlGw`}0YBEHOhYr5s=aJgz?+pz`-JrkJNKQh6;ck`kyULF zRD+`t!30oIkyf}=)iMGuR-}FaPwIw}iRJRI=|t%~qrLgY))R z7xt2sycNMO-KMrq<7y8WoPFe6vcbN^A$D>yxEAZI_Y2Rpz>pwS+zmHFp>2p${@Wv<>rS92K~Td zc|+urc)?r|s;9n2sv)B9^RPpx26PpzgBi6CGj(dL4y3UDg+h=YsYmI7jNlbj4cn0o zWm*FgIU3RfeqbWdP6YLUshco*kt~9tfl&ZU1Vw?K`g0D97M<@$=Mg=i$l!Yble*bPH>N6{D?lBMUjITR zxfiXE%tx?2zO1IlMG58$-B^*7d>*gki({4FRSb_!RNn8{bL_-{&rkZ2tHt+V3WYlQ1%{P$HJ zPA#9|h)|;(U=%1~0IV zLqThvj9DS92b%k?lm5RCle1X+)=B$LF&z7>xtLGLMmnL&Gk~dKTF@H4xDao_f-`Ek zG*mYo53``|3l@BEA5^q&79OWG{|$(K4bf39@CcG&zJmOuP68f-ckuP-5RKBf(POUK zXMf-%_+0g+d~|B0?+i7L;pXblI{q~C=QaL3$9;{YVk`_~M1E{AOoWmfcO5Va%%1 z?!G7}2&CVx$=LRXHP3G^H;X~^787aXH+ z3^WNdhG;(p#|8%%drcnnmE2Oi031VvuZiI><#9f3XsXzq5w_@>jx*K#poDf;rwSp2qL>! z-nOb|kxYgic{l(&tN8s|R)sXhLMr>L@<5!ru?=4z(SU{Y$W-jwe0Da1c<00;UN!Jq z*AZf{67?g(|(1U2cPshktz{irqcelB=@(`pI z9;`T62Wj9VyuiX0<}uxBPN7(^0|6SJF^;4WUie5k0#4bRl2Z|Ec zg@YO_=zABK)fqsC==_PJc|vcbufu>xc=Og_K;GE$wIQwn(z;w?rPk;tF;O&Ap z?+N&6!#c#1Q|IVFBqf?f*cb}qz3)161Lhkz3-0SN2j}M3&2F`T@Zmr=^Au!1g4{WL|>a$R3z#m#Rubp407*4ApB(|E#pbj8xcRIQ z^Vvyp+?Dg0=B{K6!dPWKD^ycCBr)zvj*0m!)w%dgu*^58{zaQ_0_u`a-f{UciDf?H z9=c|)GM^POSun4sovXBf9m0G@YMwU$AH;G4%9t{)UdKnKu@bv?oW?ksf^8NsGpy z#QQ?@=Q-dgp|I>e&KA>o?aQIaRMD!O-$bVhc&}%h(J{<_f|a&(k~m2KS!@>D4_j7b z+v7PpWu4~KKLcW%8;)`;0vZ26HlWHoLvm=ky23(3@NQ{4fFKSveq_I0kIb55t%qCu-y72f$K#4kFZJ zifJKymrM(P7k01f(|qQ77X2-Pm&D@)mVGFLCV)I*cXUCRoU=1?XT-V4quHKdxcUKn51jpE zn{$4HPdKx;S^9Q8f4UjJ=4uqbYJH2K@g%_%%_aZdZys za1H#Y)OsCF2}dB|yFYc%HOW5s6F1WNas^&8`BIE?OD_0i@_CIwYW_9J{tw9{Zl)p< zr*zDEb0hYop+Bij4eg4-5Z~#c%?aO`p{BTRGkRl3<>4-HrBivhtItIRi|@oYfE?k_ zU)%vtGW53cHE3kA|97Fq(8Dq`e?+pgY7P=ft;srJx`d98gkln|4Luu$k5+^KU{vnK z4D@Z>nh%o>Ms6i&S`>WGQD6$p&ou%i*#IQ%1#r2xb20TZfM-`&o8QyJW46(Fi3E&G zxWmR{)ZcBv5}%N{2l`px9Go<0#svuJlhW}sIt>blW*#;eD+d|G)7jj##!tqD8uyH= z!~bU3u5Z8{>|ZzRxaRR%WSND0IE?YhxUXc&sr>d~sMY-g!3y}=X%#kaj|OP3jN=w*!ik*VPVM6O6evn`(Ki(_Em_qzVS+!?L^ z@wrm}pCFL2(*NbBuK(?Wd~H>~XI*INZ=%J1jB!T{L@lrRm71&LDU40$EBK}n<+47f z+6{^$GuZ~yh|pS=_$YWxXm6->i971w-~1jzGw^JlH*h`B=)UX(WSfdh!f=o;=O}Q9 z^y%T5Wzy$RPIsWsz_rP|Tf=cQ;fOW(wa_QLlL>+fjXJBE^attGS+!1vm$VAu1!N4Av#^dLr>6;%HWAw^~rFu7(lvKHZ9`3I^QmQx=b;s}nwiTGM~PFsE(PR`U; zuXEO1fmCjDEyMO9Y_0K_F=-P{?HGY%Xp@t(@Dvx5FpZrhU+*^!&2%&kbzwYs)7XNp zgy_^LM4idTDit{+!qZE$C`e5gQ&Cm!#~23lUh-3*YE_f*DV~p8)#C>^IO#2S4uuzfX7I}Yb- zTi4=^2Hrvyf7*~~c7F_Wkv;^mTTLgp1t*9oE$RpsB=-4+zHKb$NBB&C zobUZH)X0=Lt|X7cgTB9z8RKc&S^YP(i|Fz&m>nkmc~Kr)NPd%QJq<1q!DsTH-z0oz zS_|+U0}4(j;9D|o=1U+~WHAoi^>#!E{HNCX1HS|ny=F+Ak5=3K=X7>JD?8GpFY(Rw z^-%Y-4^dVGwR>mSAC8jDz}a^G^Eq>cGYAbgc*V z?*Lq+fk%JmBXy~;Z61bH_{?=yiEM?%Rwjim7Z;OQg=ed32q8Rz(F+M-(+)VOYcb8p z{F}oW|1nQ+FjnX=hMt?+l;q$wVc61Z!(Jm8c@F&D9!_;WI36k09{@3lE&=XjM9t>s`CAvH4M-Q z^KeeRJAX})v*fU?$=M8QS_)s71Lg6Mmw+(^7|IlNkz>RT?|v#NnZiREK`9k@H$oj*U> z8Qj3$!ZxD&jXh`MKG8dY$Z$mNQHuU{$(B#YlX6PL2SN>Y@lI6IWUEt539e@ zmkBE2WQyS1WuB33{d5&%9I8u)OHNfAvOm=Ceo0yks|WFn;gUt$YPj$f-2#rkn5SD$ z$vg6MJ{hlb@%1{q8i7s*fS6t0LsM<}VRh&O674-;c(LUk=bgG2Mu=X6nYpdYvUR$?~w+d8ELTD zg7%L4pLp;>pA$^k2X;^Ro^)(`|9kkp1~~jQd>_&&{u6xfU^2i~{quYq&}Pf3G5`gQ zzd8}vdcP&5FWL_w1U(pzHzLSrZ}7Gb!~9-Q185>(*Y5ldFZfZ2?*nMig`a@<`#Qyc zg7^ze22^f4FC4xZj6s@@wX^k`1mMg1#68A<;Q*{kzr%L(hhjhgTY|u^(0Xn(y-; zTE_u;Y6oQ%#?612x1i%#$GV_!OrZh$)duaz*9=Vsx+OIYg{c=>W|&>o&U29p%y2;5 zGEL6%R5lbwmuc=_ch(xk(3mj)MevWqxELDtb?x(#o-eByq25({x2>m3?C21U$ z88O*QH-e+n4f7Y=L#i zqo-M6{%&U#KBRjX3G5j+;nO+=L68sOxDVU&eK)CQVlLF$m|dkJ@F)~$pY%CEAi@9( zV~c2ux=$H@In74uMn9~62#sSVTK<(58xCyvm0t$^um2t_ma3qH3}@I+$r22baC%x9T+vZ5Z~QlY}xFVqO=0B0cYi>~`Y-#W+Ak4|M)uaI=%^i0MLcqT_O*Mf|u%f{e{|RPfMC;D@ zOgUctg`MqOs{ij&42~pKh5_lFtODhuJFLPy49#Cp$YDjNc6ftBGr4=}#YXA-o}Bd< zC&>bpLm2NEoaV~<)RI72w-PfgHUBUM=O#pHe)75#1zRbRZy}w<-vhuA&{Thg56i-j z#xHbDw`n%cj{LuB4-5K{_N-yrRABx}IFDlW2gf*&PgiQ(m!8A2W0uiav4iO*T1IEGRgn0XuwEfI+cFwsPV*Lq zi}A%H_MJXagJ~Lair~z>Sa8}@mHq`#1ojS+=NLQR(||OLWlt&o*76AnPt1MggPeWu zSxklg((!eoC2%vNf_W=$W{Y;Ki4&O8pKDy?hXRk6QgdPd>3i%m1Yq-XxA_@m<`>r! zJlRrf_dZeZgw;afJy=C#)w@Y=JCh| zz(~rZ`kand1-O6hzSTbONPWPiKSb#fh@NhpoA8}!Iq}_hQ|Jj%JzlF-kKZ3bTaY<| zh#~vinux@1XtP6K;gDJhnq;o8Jepd5Q{Qmm!KP$?9)7#{dsgnkwc}e@&+;BH2<rYAZF9e4^iJ5&eyRR+;^XkLYIc!F?ZgZb)^J&{;=9id71={AbBv>RipP>rD zwFs#Q!dc&-Y;9+vd>A}n1;wvv97jT#ALHbs^TKC}`VgZ?MFkFaG={K!DdvoqGO^Zk zWXUV1Q0hW@;tK=F0#B9#Iff1ilqwGjPIRip{|BPcML>Jj@lSAy(3|{$u6DIm47$hD zCLmCch$M+2G&zZ!1iX%(j7h9<;$c-*DybJ*5#u84BH}6v=VCdJ$E}R-)H6H5-y6k_ zZVnMBsJRQ)#!zRfuDh{Q`Bv6a&;?Wk^pAn1tX{uzp(y+SRLxsY$7mY}gFwec2MVTi zNKS6GUCPZHK9-+2d52Hp`I=ie0@S#*M>TFkL55^Tg-D|v7o55Vse&2T-U^OI2h3_a zBqsXL7|&8g{l>E_>1rO-<{i%W1m3M?e9G6|syLHnw5kGmwx~Qj*@QmwY*)SI8CJa*zXIbRR|k8!B%B$DMfWuMg%ld+O0~rhuoR3c%DmUn2)TO60D6D>oXROz@Fk{bevGT8x z@?)dkeDksWDOrmW6Gr{4M(N?jb`QZ%Ph-HbqrOP6A#clddeldg#D03zMRnyUWyR0L?ik+2}*gG^Kw@CwLq*BC(t zS&FGP4*T&yY*SSmMoOC>v;I`I{o5#nGd||)ZuK<>EkN$L(|$`=AIq?`s%Ck%t99}W zt2#WvbL;~);5oGb0D8~DUF0>qpBHx4YTk`3G!Y61h(>{-;Cw@~Ve}5AX}AvBQ$2D7Gailt=1zD-<-xHiyMZAQ*1_r|LCCyckLGZ+s!zy$ zegZ0=0KV~1S&vO3o36rJG*q?_*aDUJ_=Y8`R8)%(wrqtw+tn-b467HIC?NZuNc@eO zH;;{%thJQ zmGN+M(~S#MK8|^{#Hz&$5V{im7aqQ;R$V-XeHxR6%ffKY5Jp?d!bdS|OJEEvoku}* zg*a|Vn$&)5DZ57NQgU@EL45$PQ&Ct?d(Dsjy8<6&fx(RRqlh~;LT0L4yEF6w@kB+G zCt|#(4iVhJ?tepCJEhAoHxOlV)k-1}a=0Q>_Iuo2T_XcDox3{UaH!F5$Q-TeAFW7D z(DGxE;2&58YEq9f2V$^35p&RLq_pwqjSuy>K16aABC6pVN~o|yveg{>&84Q>Z<%T$ z-bh_H$+KNuE6=bRAt^NHzz7VM4HxWx?||VdcfH9tnt>;S(eS|r`3HnXOg@Cic#_W{UhP83Y*WId}z!s={&9?}D-!AZM zRa@oRt~SautkyCSu!~HO{Qa?O`EB#}kg!ei_kC|7IGAx1yVM-%c2#>43m5)gDvgpx z`~j+EHe$A2%k6e86Q!1T{=OX?GM>M?SZ{>Cmq+WpOV|5ov|b}t@7I8--TCwFdJhAf zY~6l&hSeT|7rhhyK7&=FYr@}Oxki7CCx7o6t?wjVU%zO5TT|IC>F4}degE93`}x0i zeT(e+?w0!E`FqDlOsVTtgQQa7?-?z_6Zw0uDZh{B?=a^Ee~t2Y+OCWwTOI~x|2f(J zarnD;B>VJ#IAJU+L9>DxdqyPi_XQ_1v@?G{gTou_ z{tnXGsOyUI_s@t#$ME;vGC;@j_xCNN#%K$F|C8XK&EJPX#TNHG=DVD#&St}cd3Ul-YTB?Rp%gI+ovzT6T5S0xa#E^N0AoBy*s7wP>5k5j z7{4M+g(GaU-_lhx-pD7{$+KP6$rJbGNeY`r9uQ2>++Vc_*Cj9b>fdZq#(pEh3toeU z*`|>jr8&Y29(+$%KgF)%*LD@xOBI~CpvD&&=tE&$GA1r{x?QP3!n{3NX_>C{foP>y z#wz_1(6k5e47<{O0HyGMd4m5Fw17dTx($^@xxkAh`lFDQ{UFU?54-Bh`a~<+lpO8h z+*oBVy{mgjLqS${uU(l>DuYKLmf8;16s>Qd)Cai_!~FSBp?7Z}W%|R!b}>BJ7ojuT z9knfkjk}7pKNPeNPJ{{kSgCB(2v)=WAus?aJ77B!mFNz`_c@qJVVW-dKM8m#v7%5! zR0hRKwMaQscWj5u0n)b{CfbhGcKPvsvnhAJ=0V$n8P+h(09vR?$yE1s6_~QDBtdSh z>{hEx4r?%FJ<M+gr|pnz^{D;kQUUudQ!T_B>FF+c z!hfwi!)h8+MC3NlHwjyMOB}LFv|IUGC8Z|M<4q`>?d4Opq%l_kk@wAU7n%{ z>>^3E4lcImTJ;9TNX-#KvClSxYpf1s@CUoZt3#RK53H)5X(IJ5vp=NX7wnI0CVRsE zaPi|o`y-Pd3-N*e^Og018u)q#UM(z`@h#Qd9E%zyuek3PPwMz=RaUZX-7^fC2=%)- zOF%_=mwc}dEo7@r{`{6dzqfvAM?A&PXF~@xn#tBFB$6J^oIp8mWYm0B~7^Yb{9#3Cj!iTn@< z0tpK{1@PR>pWB%DHoi^d8#HNQEAu!%MU0I_oWdmX12hhc>5qj;B5Xkj4qK-&@o9YP z;2ZmG(d(T>Qzh#V-{|O_&`PoP;L{$OT2P}^9F1WbJLb=fd4w6cNhdyLtylRefPDyI zk^LsEAEuF=y$6>`Dh-Up(hHmyX6(6%3S-3LhIjh51&w3-S*(FU>1o`LdjeWaSVG|L zpQwE)cA!co9l>#m5rMN0VXqYC@1DBDV*XwNi{J-C@WSJ%+mR9&4fFT49>@AnQQQtX z?&rh)oLkJ?ha`jdVuMb9jnQA3`fCclxJBp1-f)!%du?7AN%PDKc8hVd_ifyL(@ll{ z1~I}LgCH=+dwLXeJN^PRoVT>nVE#;Y0>>Z%zP{LNZ&4Rwa)W*jXCdhP5f`6ta@TxR zWLhMv4~lB(AE&I313!%bkg1c9Wf%(~l z1I_m8aS%Wb>)=u#=Yxl#BlOg5*U;$jI66W@SUl+q!UKvH&}i9X^WVhg!`|h!@!I{VRHUZnCo55vN0Xx$|O?*>jA9iU<+rP$pejG z4O?9OrL%_quZ!|`EjYoQa{%~KY#w!oH#lo3Icgc*)&Bw;W3kC=qLnSc=T>UbJQqRgz z%OfgIEsyozwgA1Dc&A$2Yee9bDj$D^;{-=K((Ck*um1 z+Na}00w-kH#$>}b^k`Rt+ob<%w<8YH=I zo=0|gMZ3)%-frNEOr>kF{ZvI#ZIrA?_2myo^%i@1ZE6@~V9Ln@Kp6wjTS!8_ z-jwoyeNcOG*UqKwMV${+0mp!uAPrIj?kvEnq!?D_IIjczwJygv#tn$ZVYsBjT9X-a zt>@7@q18C6f%zB_j15LfY$-8HekVC>fM@-jRo|lhaRc?lU_DTy#QRCa@mAic@dMSL zagl+#O;k+(X`m(?IZB~Ioq?f97xzvZ)Mg_Ddc;IE048J2b*BbXC zC~w8-QcCw1Pznu>$iDgkN;IY$4~~LaT&;%XGN>g}`mJQI1OgFMpOLJ$i~ zIHzJdC5$kJ_9PoS24EE;2A~Ul6^Cq#57{8R4?vb9bPJt1X?l)FS;Db<#k z2h<{#sKwv8^4g+i@kzvBjT7YqQZ7b5Iz9Lw;@JEin9XYb;xX5R9-)ki)lxWwaa?VA z`L-8AEq0G_pDt3yHgn03Ve$`KOh{I9(}|EdO;$d}FDfr3xbrQ-SRb4Iq@PS*xff;Q zSV6|3=LpF{aI=m68!HO_WCB#a!oct}xsf6bhM2z7U4o7I0-Ja#oqAzO_{l$Zyio^LA8HaWj)35jvk)GrDB`jhyDaxj5$M3L} z>wXtApqtE&d@$OElf+2>!aH;iBJ)|qwzhIFY+EmYPqK6)Ff%nyCN6^QXsuxmvTr2ezKcSv4?VHSb8(_Z`rNwN=f4Tu40eA0+0XtSF{AtDj&w zl?~|>K%(a(;or~qMkp(aFXT7oE?BSrLU0(J(q)o9{rB>Ct88lVa=TDNats){`z45Hq8$f3-bh^nMx~ zzlI5l00-vLxKG9~fAE-Jk>_FdPxMAwgRTRr4(#P*WvQtHFknG6E-0FX7PSWT&`)Tt z&GXjm=l8wzjsZnC><_Sx0uLmB(+J?eYgrWpCQMwr8^O2aL+wB&qV0Gx{<7%F&N49& zeqP`~H5&4CGf?&@^{SmgrtiXNhC<2UvonYtExOjC7D;m4c#^+cy9I%C4Z-9pNm!NW z$-(cjJzhZX5GQYSu0aa$2c$=`e}}dReh6~Ma3=0PBcKQHg_uA+8(MRj zMioq^*bUg7K!WplICTh=!`Le{9Bnv5rTYDfRE`#S^S^OcErUSRNEa`#9)~{-(YUkN zQ94V+h+Hhl4Kq0l^B!E6Hts9m3ePQAHRVy*MS7ec+w7&15VDTW$+DW~Y z$7(^y-oRvFPmU62{2eF4q7(M_SmN!*bb?y|PV}N}V+}`R$lVFPqq99Y&0hsSTwwmA z4f*&LGX+LZm5)P=sRS+Ohn!UpAjX?tp6YLcgE=3ZbPp2E@-Fpl+flhM=OQGCtAQ=` z;CgGUZvh9uQ3h}MPoehXb|fI#sxeuQ_(BPXHEA5rauQAp8}z8zXS;1x=9j`s#%tw_L`GEaOAzw!F;`=06?z(fnQNWV@exAbMba z@|xd^-X+4nk-m`WcO!iv({F1fTzs%b*Wj#vRU|$X#%f+hFyYVgHSDW-a~(^u=Q}nV zeXt5K56XOwVi`-96Ea_q0j}o2DK^HN9xigU98S-FTrF|Bp||5fcceP2d@`)#V7yl< zjfh6*^YN=)Av6kgftiA_nqz$i6km~SURlkxz1XioQfJ!t&e5Vl_WK>!9qQuXL&fG)&PrulL3g3BLit&N1ACTNR4TuDG5o=r@NWF>*3JPd7ezak{Gkg%)Qp{%YL0u9alJ5q6*6gfvU-Lg;hN zx`h>CUdSbf{uPjr6W}FylCWYV;p?XU3XCHghPTQVH4a1*V|U=E`R%xBOt{NFt&1~q z4uJ_9D|rht|9E!UV}4}cgMw>M-or^F9QMK8s(WE#eM6?vzR$>C>#S@RRsh!V1qR8p z3Tg~0tm27Z=wqYt_EG>2)@ra_-%3Z{Jk5<_xuXTg(~Dk5jDeH)r1+Xke z_wf58-QzMQr``w-fdF(JozpwoaCZy%s(o>boZS(A;F(rpm)!|q$Gxe=V;18on6=hN zXoTh`m0y6cKI2%S<5keChhvyQ`P*x56f+Kh622Ma0&R>G?u;Ad@CL_=Uw-F58t@rb zzkQ5W+yebCJ?#eo?@x=J%ZF_A1ZIE8ap6c{0O+Y^!L=KyYArEGY%i(-80okMz&Fe? zcs)wK)=rrzWgWpt9*B-0GvD;nqsO&Ur_mFYmGq+|I67DD{yh&*+?_u3Vrf@kbQa1l z7gX^Ct~wiybg`aEnHo!mW_QLCYXblXnYqwDUt+u-p(c^%EB9u519Kr#T#9QeI7dU- z0;ts)uV1JCQbT5d^SCTD!TQ`29ELs~CntpH!mggW zU0oqGs8cb8(tW&RA1E->CbM5{iQ4ERI5P zQi)lL_BUk5kz;gy;(4n>Hxx9rn_?4sn3kpTSeHy~fi%o&YdnqyK;lgF{A_?@2u@WM zInzDCtFb~0IprF4>s*w>^<}MN_KU`<*g&-z&f(C9WEFbqzU&%$+*lEdYC=>SqUJEl zx(5Ydy>r!tSns4@>qzL+=DB9GAVvhLPViQs$O4Tb*yhkE!rg^wf)v=tz~beAk+a8} z|AVutXFO5}|0Gh#hG)PbN0VMp6@JvklfTzDz-xX%#54C0sT}*_Py+JxWmK&I6|jgX z>%g^={=JxBQ%mxX_)ag$0SIBl0nT(-O+*)DxDIi+HqaISj||sVq>LLbk9o^6!xde$ z8E;0$i;_DmrZ8STvQ#xIgX%I9Y7ZmOBg=5CHUbV$a3qfNCHF+9oYmabv##SHCCqR3 zcp;pBPD}?RCg(7)s-0a!f6!*)I!1=e2%h~NK$T?Oi$Dz5li3)q>vxHY1oD+VUJ;sj zQHBjpo-qIzFEkcXb==Ybj!_XqiDNi07<nc^>!~~n z-u)Hw(fv#CY~b?uIAR&R{s@j3Hhcw%As-4~oPuErl#I%^Qdd8~$bpNf4)AWaWfIy~ z-1lqllDim^Z3JVdD>9eBSsYgJm8)^C;(PyoIot2Kh^ffZ;G!ZMt5;_A zw?|_1NqsaOdS+v?^yXkOgNX@QE8%})@%S_d5`msZ;LZ-pF0Ovu3CrHjbxhUoPJ#oD z^5ni>7X!M%d131}=r{Z+VB+z>k;^>nb=)CN&u--2$LKWjb59yhq;BThytKwm4#ms~2yqz`;Rt2*HV4hobdf)VNJ`im&zzot#OgL$W4g0Y6; z^hyL{?D*<~-j=%#aI=C-593&lc5B!o%t!dG1#KgJ<7uB%stJI!3@X6rvUQo`2HmM%UM$gz zAAxItzE8?^GlqGp5xfQ$2ZFSS?L_kj!%RfJdeF$(qAmolVf$79(ztz0#(%eZZ9PC; zr(AIAQau!V)+MAHj#;*>_DdiS=d=wmFMh!jh6lnmdRI5xRd#h#Wslq5)ot@Q+Cl|U z`iq`Ft(0v?+rQgl{h{}BO@7GcHpp%qR$$nl;NEtFoI$;h0m3jM{@tb{#BFwfNNc(x zD>k!&o3X$U&uZqHqMS8u>=lk&L!VtABRm1XN#^^KV6AiH`*CjG0A`!%fPRfYe`u8S z4L6upBHRduc7PatyVu&!3Ope*Xip`05jESmta;AreFAZ8SzuWX3sco|1)vLE9Bf;# zsGx!dlEPGVYfJnYvwHzX?59n|mBG4lXVoQWKiS)OxcWMcgSG@!2FjB2;hoc2veg6T znd-@JbT0ZFTNwOG3-$o!Y%=o4ztK(4<~GmxVfkWhtzOnO?=&&jyKiKN<DQ$Qpuw3Vtuura0;XkdTO|53NT1Pq4MUra`WXMsF%{*6xzV4=E5-q0I% z@*I8y^ITGEi)!u7hUSgLCwc02ero6x>+-$9K4-z17F>Z8AdPB)I|CN81y310RxtqD zGt7$ZKR-K?~_&EU0pIvXPJJ)xXUMq`X#!Y668=bv~IQ zTgz}3RJ8--QgP1!m@*v29O+zDK9q%>^eJ1hMqL9-BQ{_xfHVeEc-;d85H*g$yenKN zZW5+%_`gK2ya+C2&*1<2LH0Rg781w;M-7zXu*cV~S~yO6+pg#-4dA^P1!TjFufE`b zpoEWQ=#p=ic^q=YYU@(SXtq8q=dkwKm`K=W9#j-Xjyh`qo^b>|WeJ^9eT6_Hp!ue? zH8Dl!^XKn4&@tIbeo4PYcami*@GflR#o_(HbM(lbki||%spax46hdk#0+R3fAJ&f9 zk6Zq|M2Y>MCd|_X^8ab_-3Mq2M~1d2OZ#I4Po|^IA_u(H+71~HgA)|tMmhlJEHvIQ z&ydN$>Va_T^B{a%&&qoR_yE7tt%no7Gp)+FZ!Tgy&;w<&JAeNcGVpqAWk&fs2GW`U zW5K9?f`mRIcyW$lz5}C2&N&$3VcWEN>JMm<2NwWhA?N>sHRRdg)WRqxBn(57 zxjU>Mm>qO?F7Y$a73kZ$2A9oY)+Np4(gR1;4kD4+65i-s)n zwZIu}kMBPg!EM&lP|{G&vDs<(Y~l?NA84W0oo6#S&EX=vP~%S_&mVGQy`RvP7Km_4 z2(5Jl(4t_*KY?so8rlfIB%Rpcj87Pp_b}=s+^- zPfN==tSI&Gcv{aKh#=mh@#T~GSk;I-M)>sKq#k7fkRP~Oj0&axAy|KYz=>!xAxoY` zWv@ptLyTpwU^WqP{j(8uObNbn^*6wkyQJNy0)~gQ)uDWJg5@}*9NEh|$YIj92qAgp zuB+GFsXpTuDlSwX*l*H=CVYh86+0qSv$*}hc5$3bKzs-Aver}ZV^{YO@&I3%^nRA5 zU+%O)fV?(?7Xe)!oAGAr|p?|Ru znj7J!waxB*#A+oD61Bu+S%TM`UGAM z8@M$co0$GzBzR-y{J_n=dtgQ|6lN9|aRt~N+o0H?!Md&t<*h0tlf(#2BFa>M?T6DQ z3Za3)Ss>D2k48i%sU|3RJz$m84JPp=oiCmCLhbz|7%D(jS-A#mx5JkX4>n!V2P+xH zb3JrS`(?i!E)4&Fr_Xu_F!}HFS*e@<&-$!otnB|2eb&1f82`l|Bt-aNfTVC}HEFZy>EssEfV9$iE}qcY0L5Fal?Bv;9m4`}f0y1E@A12)IY>-$a?h z|2Z_XnQ;!>;P@p@AcVeA@_%Af-jkl>-xq3*izI#-fjLs*8z)Y4u2EMsgNFnr!CM;i zfY?KTaNrFL-UwAo37i|2djgljfBt~bB{2=45x4~!a>&+x(tO~m0nFMe+eZgHuuQtr zFh9de%fAJCOsU48>(c%2@w5#3y2%H{lV2)V7oacjua%XG4!!INoGV8Ngg*Liv(7@v zQFz$?*nfcEG1(x4ksy?CxU&r~X`_d}IyKl?y$j!1>WQL}bNHVz9+1X3jjjPt(e(wd z!&WF1-)oA6I%x@V3zS{nU`cxDj2M48ojQd8ibtCd;?55`qoD)9fO~+^{w=mjJ~RRY z;QJBxCj{n$|KuAc4|0Q~^OJnZSD9%I03WjY8xaq9`=Pnmg569Ix;h8#GR#|G*iZ^d zG_v6pKY-W(gio{Kx#$q|@E=+u2#gr`ml$=S0$++s0RUAQI4U|wF8wH8JptMY6=y5s zLx!(rc!3aMiz0o*>BnvSBx8hPTrdoHAvh7IYz04qyTLQxKdNsC;^hd9o_27(jl;f0Ls9A0TCEby3Pl3gwEytT>vBOs7DH_vL~pPxoA!31rOAxW?9OU>#^jy_^ziZ97E9hP zM1$1tfalosK+AxXP!ejbt~WRjjK2^{3V>^9D*Zds9|IXYV8Sz;@J!CNfQ!ozoCi8} zX!h%<2dDk5tHMQAhbn*sLhR1Hhr@VhF&-VK)UU30j7sc$&KrvXaX@yV(O_ELEvlU;`mw&+whkI@Nv{O_u7$ttw{QYK!biLW{~ z@zWH=hYG5%*0)n){_KZufbLu8IfuE?P3&Kd@1OsEhQQAd_!$B}L*Qo!{0xDgA@DN< zeulu$5cnAa|1AU@ViTKm<>~)!=GIAJQqod4{_%9V-+TAng5Fb-CQc}yHtE)K-|T5K zZyPvpLRneq%*jcvZrx8xJ2`1adD119`pV00omJ+WHetNwZ5Q_)16nCQP~`39X)V zhs#cc@X1AyjwDTD^H?5(T~nq_FJ-ln_{4_J_RkzOt*jLNEFFzHrk5sN>z_FjZ>|Z` zZ<{rHns4e1*OXbaT}d~4W=@%P%RtvCK$Rtz`=|TLyG4U_cO$@bO)F=W!=}xgRz9_K za_6$*DlM8eJE?5;tU1#rBU#x5-&9vp6da}K_a#Z?cT6iQV}mA7n=O#L%M}Zg&Lx%E zJ#bB#fX<@JXs~Z;sa@XW(kTzL7_ZuL!=IKA`| z-#lN^Nd*6K;)rvJ=vwZd2+WPb)qWu&0H8M)&z?PNHbx=xhVU`7{iR96CQL6cjb;Lx z-sPHH>H{>&lRW=VdtU+{Wp(v^XSpF{nM@FsJ%a)!0b^#eTi=$DOdt>-CSj?s?PQyf zXfl&#CIM{Uz95LGfVdPlT2TaX4=%VA6^lhsMBEUqwsAvRH`EqU+dSX@+KsO&nQBZtlN24{F% z=G8a*J39hQKf|1Lc-#D4GInP>F`}f3TU(iEftNNI62_vtFs(4eXR>A z1O1ZHH5j%XsxInCCv}598>9I}LeX@6a*v)7CZCW&?*a#72{L0LzR*w(U8gvpa2%lw zt8z$H5u%Tvg{-P1RH^lHhsZ`hn*5!Yaa-%mr098i8F(01}}wL3kW=qToa~LFYF?@|z&|P0;xXy0L+C9Uf1+A3cA5a|_%K=!~(KbY?hy zjHYV|oc&|c?&%p(zcOg5UvxqzQXkhF%>fHYN|jVjJ9#xwR46l5NLDyK=~IVK*XpQR zD9WQn73B^~uc5BB0s127h1x?7juG9Vn+ee{!d4N(Fn&^Qj**3OpD3m*p-8tc8c4g;e=Vs?+ z=VupW7iJeZvz<<-%bDZMb>=zqodwQ9XOS!0<#f4RIj&q+o-5x~;3{+#igWEVIKTm?A=xdnLz`2__9g#|^0*@ezRS7Af}!5k-suX#)s0Au}CD=Md=E0bU6Fx_{sud02;U zC23!D?bp3pJD>x{F5E%zn_le`z`cMq$WQmTz1niXb>H=B9{_IaMLtpal_ne|f<~+b zw4$KxfI|S+0Zst4n>B4BU@c$`U=Lt3U^YJd{T1Luu4z5^3}qY6?zF=yt;2zlgHg`f z(>1LXaPJ6wMhMuA9jCua1s=OnZ$vq=bCDj(TUnxMwSe}ynsyLyT`jgKpdPycF9h5M z*bcZCa4BGAy{3Ht*wX;MD2JmFd{K^x^E9m+&~cHb?I##O{!y+&3$cBj%J<)z_8Opl z5iWG2{4dtDI{;TN(X_V#YnN%71Ldg1Cd;{ihp@5lUchc_aU6qk)n2V>K|nipe^&tR z1zZcb`Wj8!N%(6u?Fe8uJ_nhI?|S#HLAe04*J|3sfRztwT0B1G*@jJw7XlsvYzK5~ zMY#aG0XG4*KM8*H{*O)6S#45ie@ma=`3& zP#(Zqz(atC07szS9e>ueY{0#L(X_|t{axe-?a=-n>Kl*(#7YFyB~{F{z-}6zG$5Wn zm?1niOR`O0_G;sZqI3YI$j0C=7k`zwziu7smf7rOwjonf66eP+Vm}%7qs*K!X8pdzx6QuF zJjpg>rNwP?tgx2a(wFg4TlSJTb4!9Pz1ZfMVjD8aW}jq>FH1D90;<&J0J%g>N&Kat zaq9?1{O#b|_;XF84@(&cSDC@1KmV@&{I7}P@9xJx9W2|yw+40k5T04F&A!ZBY#Xw~ zGS%iV&q%Nh0jAg%U!2IY@$*{H9@J@(mlZ_2%z|<)u}-#Sn`b519KawBN?4I7+Ga1} z1i$Llj)eG^B*&Gkuq?5fKTbf~g0*N@`q^|zWrb+<0k;%QWNf(J_IMV&Cg9+Z`|xc2 z6FRe~3sKjTLUmm%>iQB{7om!!B$xw#&G_5@P_KqA&a9*eiF_GfVO?oiMf#h{xCjqH zr1J`%DUIkdUKn0RcOs+7!-o;a0bTgMinEerU#YN36F*ha9kEnGv1t>d&@?r2!CE-NOtBLn23(CCGI?0y4f}_mK;)-pB zO9qtMYAr|1wnAWvZRwy0)c~RrFVbbpp_{Lw!bb5zKErvH+bS(trUY9d#5aoB%tWfE zhtaNUA@`?)r}aW80U!|!z}OJ{G4NVC zU(@cSXCV*f>mdrvj@J?RZ7ysnRJ;g;BRgLM96eJYSPEPvaAydN#LWe+6}YA_Tq|%p zfh!KfEdtI8JN>IL-1We<16L7-+XURbz*$iT6e!)Tz%4-D=^9T8q?f79moCsW59q8D zWW7iBsdkGAg60S*j>^P|h&LF1!@ZYi+Fpv6CgX+oE7a{0KGn9)WEqdxq)5YimP~st zcohDZrqNM5)_=gDq0Ph7F159rKMYTLrj)M!fTQ^^11i;~@Z-P(tCY~vb!CxhCOP9jWAjA~n0Q<4TG6nj5 zv26$p78DK9Edbrt%QS6sf4VDeL&`&RWMe;w&F@m%kWxXH4jwx}Hv#^P;D_j{-Ydvf zn6DBXp#(ug>7h?<18o40*4xn&L_5I_F0-Irm*7Yn-KZ2NmV$+rji`sur} zzlHZx@+}sG_fu#~Dt95`ZQ879_fxzlWxS)b&r}=q?{KQi{zgss2*h&*c#e6zS4*aT zdS!o}QzGlKf_N?`onFVW+A z74XkH@f@wENQ9MFRhD?Z{wQViJk;%Lh)4RxI;wwuqkII|N|R+v>^cxOs1?aCg%Hr4 z4dgGd8Ie9mpP%qE@;Ro$v+0c~o#ly^dt%FNaiV#aEq?os-7oHWN%$pyM|!pR(1@-X zr?Q8)VMSzplaEsqo9$GgXK7rt6n1Gdx`F6lLeIj_2-mY42a?j9M6&L{-y*~*zPnf3 zMRN2guu!aMAM=X1m3)=;YD+d~?f}gv12FC+U2rF8V)6a8mH1B8`R+%Y2hr~Nh;RLM zf4(Gd{{)RSS=07GFIekA6IK4c`W8MOES|+OCwAYRqNhs=tR3mDr*tpI3nGQf+Z5oN zQ9nr-|J{u;A0y2fwpw#f%r=GwqB3lw^e}czwOtVXZ<)#G z-vnM024TF9XUa=I|A2h{8=_nRXqgI-A3`^^@6oi$ByZnB0HW$Es?8_cD$P}>t^QhT zdLlay{7B{7U(&Q`#P0#guU~#hiSCKY55{PepGAo8*sE!DTD0}5^5p)O7(X@vKgYFCPb|+!^+a71`VrBLebJqg9&D_;)Pd0ZoPf4+K&5g4snY(JI z*e&L+O3TLs5%!Bq$#al+979X{%sI zth4&}uYNjyk;SaVY@o_S2l%yv-wU__g06$MZUR5sq6qy^37YFca~|eOj*JJ*%KmBg zlhGchW!&(XeLAEM4}#}y_hIglY}FeO5?hZmTrVM6h8Y)r?!_BS^kB82rD+NVe?Pg* zgqO``{#h#f+`_*~We*MDe@$gK$MX+T*);YW>yEcJ?#RExW5be_>dS0C@lPQzQJd;4l>`0(wUPxdEEoTC=*2*7EU=LX{ zwAfcxY4rUC5taeVy%);&NnwT}WE&r4W7pThnV<5sX6 zbdBI~li>Hf`DJuuYPUD2-7d9IA#btpJqhe8D}OkFeM1?)nscbDCpf=5fxXH3h6J`a zjz2Sytw5a&Wb0Hld}5tjhXI9&UonAwY~rgXuxriyiL=;tGymIow#Ur1@$4-s{%01x zbOO^Xe8+h9TPuHIJbRu}dDF`Gj%OcO`G@1#-Bh-xIDck5dl!v8o-L2#kB(=L$MFZp zvuES@edF1m;_gJhxF(+eJ%c?H&%exIAII}gGuSNy`NtV-<3N7h1h#~-c0&SxE`z<5 zz&DL&ixc_!@oaM<|J``DHId&mo-IiN$vsK@`tj_UB!2aH_HojwjIB@RS0cG&e%W~T z=VZ)zUT5Qr#9g1qr}3vV*t@6kCof*p?CeiVU`U1YerL zdPi_Ao!vWyGVH?e>;O+OG3196yKl8c8%h%X0oqF@jaPreH!1D z$?i|%&t|gE(?D{AgFl_g?sM=bGT9prB)4KTeXY;OvGd=UFn3V#YQ2c07lu>YLjYGzIR4l~{&DaoU?sq z{t;()STNAqZsBip_OgY)%-Q=EzKgTX)-yz0t5fnwnF9EUe(raQ6B@eqb2;`#}E1Ft#{>e>04&PDook zoL!mx2NQ^HP5Jq)!`bC_{@^gyZRd9mV^8AW;jAY$8Nc2!h~GNQwEdK`@O;Bye#LP1 z;b0_v!)f%m<1~)6j-1B94KfHekDpHI{^fLj#W42W>AZI+yL$+~ei++5gnu=ZeLjSL zJd`~)lqlaAN_fe{C56M0@a^&0)7De>8s{X&95f0wWQ0? z#xEpe!H925X1fORN0Qn8f&9K?c6$Q9J(=B?z;A{npw51CBELGBy7tm!_F*FbCW-w$ zksnB6PbKlslGv^!{^ul-$PAgt?dEGq@4as2PmE-rSoz8{_O+GYoyK0{g!!8Dd(+r& zk;1Av4E}>W;AXyJf6t#6PGWe+Q#tHSICaTxDgCS^1|{ zcF+pV6l(j&Or{4+drf>z8Yb}hRXF~~oQLxN9;POZ9pL=PD0Xce|7sL_DxTjritUN# zACF?6#W%b^irtpGg z`$$UQy^&cUm6_LWNj1f-G2IS*qe>%$^b+c@i!A)vk?c;(PwpBCo3+OD_(=B6fJxVl zVjsm{VOlQ6uJ-?R1-x|sO za0-8EBzy4`zIi0OYj6!P&zzQuU!NOFG^4O7U+^m>P2_K^>WRIGufK+hM}be@i7EPYmKKGuW%Ayqg5nQx5)lI(x^#KT2npjh+n5k(AnsoNenf$7B_UAMCl5}?Ym}cN#9_s+*<>NTgynP%;YEO=H zAYVtuar}DSS(MDyvna_o&LWz_XAupRb($>e?@T|Mz}PSNb1Cdf6aSr^-D~34+1c|Z zewUq8Ep&y2Z??0mt^BPNb}Q$vq~Q3_k?*CjJJF5p?9~Bdwx+OaWvb@7A#IIRB)Et%>7rRzu(Hw1DWr1b*c#wk?5QI*T1lplB8p_3%8m8I!Gc{~?3jNxX!r!fChf??_)vU)(n19+w{=J$#pUSmr_Dw3k zvWDF^h~H4n{xpc+Ud`@0W!hbH*vi3t^BlH$Fkf8F?m3mO0RL0@>s4&mX}qV3eR>-I zO$|GAI={Dy{p)o8XcfD81aa;jG3)6nwsxfZ`6_nRDE@I3dwLW<4Ej<0)AQNy(=I%6 zKI?Yybv5kI4!)?0?H|prs$$E|;A^VbA~*w8?EW+Pebwy#G5oP=wsXwH%Vx9B(no>k zEg7>upT(ACPWpBh`!bX7n8h}Z=P%DkG#q=erB}E;K;VS$KZrT>f$m zd*xjIW(~XUN8^x(SAR4P^#7Pd_5X1hmGrwZzP*}VHJLv&i`_MuKQ)WJHHGm1n!<0K z%~qB3^|RSs<^2BH>`&!{?=9zBX0zL-@@HnVT~qn)+3e6%{>E&!ej0yoHhXXye`OAP zZyJAR4*OynKQxE^y@JxZXF5l^d#0zOMXsMgZSm*~YK6CEQ2qaFMmp+q`%J3I12d@( zuc)Nj+fd1o=be>fP$$dIr`p(XKGnms=Ti+FJYV)CehaDWAHokc@Iwv!Py;{Izz;R> zLk;}fYM}Bm$+{9#c_OHH_4Wh!p$2}afgft%f2{`eNew$)b&8b)WA zy)Ekfm+C!9CWA#$`G8d>5xN61<)P|*=T7-PT)or!A_bf+D#CvCJMCYgfTcGPuocr! z58E(dLqQ+uIA~KT0+#VbxDjhy6tHS2!Y{E%LIEpjBB)n}S*(bl*s_Ck=?nr^QAC)l zB4R001Z?>cK^2?b=#=j|zA#I^>-nx#jA<(l1wH-mG+7>?1Zl5&-;c=<3ixh8lvmH! zA@#l%>w*+;TCn(C6;~qvANsfXMP1?|GnGG4zLzODTfrs;yA)ie;2H%tD!4_#9SZJK z@PLAc6^tupBAlk+I0f?+EK_i{f=vo`DY#6*H41K2aEpRF6x^ra0R;~$7&l3!ui!WZ z^A#*paJGU?3U(>DOu;n@Zd7oKf;$x4r{Dnv4=Wf~qS9AzoPzlZmMJ(}!6pT}6kMj@ z8U;5hxJAJo3hqzQUduIQ1GyVab+rf1;;6vuV9&i zvlVPouuH*Z3a(Lbqk>x$+@at;1rI2ASi!i-Dt!gVDVVQdnS!$wY*MgG!DR}rQE;Pz zTNISs@lDCACjC*s$t5K?m0A;t4Irz#=>B$Jy3yBxsY2YydjEKJWGKm-8SKyKMToB%|EE2y};d>PRi2Ruq zn4@nF6k%Ek_g&AN#V!96aBU*`U@0(k;11-a!kNW zKJTk?`4oPG!k<4yB51E3h4?s0KWwUer@eL*Iu*WB;nzzvyG!A}Qh3^LL}A(h$wwbY zAvqELOW`L?m+!P^h{8Jx-#SCS)1Dp*jj*EBzAwy_@6_HD8ew<|KlFV0PJ3YV5KG>C z!cY%l+g2$Cig+>bCRp!iyLP3(4-5GXI`4JBV?n%Mc)Zmojs=Tt7{})>^%iNZEB2_pEU;fCj=h-Yokbx z(SA(|XTUKW%}!@M%CB<>ELPlsAB1u(xw1 z^izWY{lfDq{};t)k*a5?DG|mXQR3gD z8wB(>3JVo}k?KdIC7RK9t+Dd?hyi|=0X`W9h57}%UNRQnpy06%cp*Q(ko87;Mk)Mq zFyZ@$HNeNp&t1T$!Yyv(qnfh z`iBKQ?DbrUpnZ=N9#`~s^-h^9S@Uil_-T?ok0e%n$bg}s41258jO=d)w^C<@Ow3#o}JiMPj)hy^y-UG5cv=@~^ z0|wNw(!Ig}|2puLA8S;8{t7(RXLpo5pMn9oz_-f$kCw@@Vhr2`K3?MMm7ZS(e60Lz zFu;GN`1C0LcT0BcX9jjK06gi3ZlxaKp|ly=uw~hl^)aOd>rtx z@;Oo9;b-0>UGH@ofe8(9KMQcg&RdPQe}e6Zly9!M-9k z$ZTi&{D~rGTMX!5Rs2_{N&cHvgo6h31!*!r(Ryq)@Ir2tf2h~neBfi{bCtlOT-V41 zf2GoWMDf`frDt{;@cEMg-sXs%?hFI`Jm6CyC)v--dYG&7^K0O#{@ayecue89EBe)n zeu~1s0(`9UegM4SbEf1kzF|Y0?9mcmtL%t!!`U?8DL?xa|8&K_9{5=Ne`$bUr}(#z zGzkv6{_IxxLn#tZ-+NN9pAnmXt-wP*{~+mT|2~D^8_@sN06*|dDJK)7%YdhP>mDlWjlMgk@Pz^WshO%BqsHk)3cpU(kK~5))D*r)=~ai|jtz7QzfIB8 z`4to{2cGh?*Cr9CD?IkJ$1Lx+2Kbrq%VO2fZ-FQNJzvW7=v)E{*xVnJo<2N|#U~ed z!N(*sNaqDmxYU6DRRjE2ijVyQ$>(lWUjNyW|7xE^&^KTdu7)0f3`#-!4*o{sZ_}`MA|H8Q~pmF|R`*y%PI;IB2nziWUWnk(CV+keXZ(6^x!e87`jO^nhTmjgdYl0^Lb zN5$t*rsPB4%~P0=r{rAelRG7v{TTRIe12tsUvGdn<;Ui8s=&j4dr&6Wt24mK!0?bD_F+%Exp*MQH! z^J4Qk6Zlx^1`O~w8{nS@p5(1Z$*peRdkp9g8{l34A@$)lrLXj|Uj)3cUurzQSXIX5 zKbG`8ihhy8zXE)$a{bc)FOKidYG`j~o(pDF2VJ?Hz80Ln*@nZKgW?ePj+XjPItIDC z&E3#i4vKs_)V!|4gENxn;f!owum#7xdwn?L(p%nE(dNuA%r0EwnT=E3>)JfQh3#H9>5}^jnT2{Q{4tVZj1A_A&hU z@bZT0pwroa)0REKj=C0H=-1$`uERg>x@z~#>ReAm8BUak(}gp#Lnls`SAuOCEwXy6QZwIJ}cmcDGee@?4T7GK<5R+eNcg2iseXYsfewH6El> zde781AIXlt1DRCi_4QgLi&Qz}wdgJi+QWTbkEr+g}@5h`;*s0@0)P(^q3l}=P_ zsNaa+OWSAGgg0LvG+S$+qObzG3%#ww4dKXjdgzq?Ag;Q=3EiaJS}wsG&hE!SvYtkq z(X7se_hfgGEGZt&+&Rt2OQ4;~s904v3&gbsGu53Km2_VIiKU>6tkW5GQASk^X~;$u zk#arpULQ&#Ump5P@+Iyx2vF2(WA z#6=J-p~Rdrv1+;x;V9|2JXL*haw6{IIJwfI?wmQDKHN&-?eI3zdEw>I-w?LCj*hy8 z7m3;N|dI+ZFVlvZ^S6;qXJa>dL^#T5{r&U#O|CnOt1 z)9FTx@}Rd(c3#*qR1Aa~vQXIAQ8%CDBD@Y}glTmsDrA;!R0&CXrBnf)a;kmgM$~ku zvx8Bdr#@8A1vryF@+J~dZ_aGG;v=vyfL!Ui5V|JV>_!EhtckC$N92f#3}quXEE~9+ z)?kS$Ks^aNx z&y>4;!Jb*@yTRJT||hc$XU>t@2PHwhVS&@z6lT9D{py4I9Hda!ryQ)j?QmwX;|oX zx!tZ@ad$|o7o@mO10G1HFcGbdBF|8Df#%MpCYXqDHpU$$cILi^ybCvNl4mB|7!(ox zrl`*>iMvgN$>{Lb*R|3O3H4-sL)KkbUr`Nkh^wkSQB4L?r)LV3kf(kj%u407uC}&` zXwl+HRP>2XmHFe!_`F8#`NCL z#1zu_gYK+yx75p83N;0prSLM#pJR1lXJP36vXF<=-X0lSNLBevxb=-KJ~ARS2&}0I zufRgtnNGU?pkL6$!R8MCe8^IxM_hOnqX@bj6k(_?6O)}UqWb07FuX1!)mJ`^PdWqA z`s*B}_ZD7heVyq-+QhzD+v*B8KmE{2d?aCE~J zVX2xhPEg)A^%tk-D7LH61Eop##-U%=wM*wGT>Or6wuuHNazX&(`X~ogWM-1bJ);`a zYkgA!k>eLRJs`(6cqUp*4)_~A9d*8W7@Nc2fCeDEE89~lFZh$cHHshAFSx9*&5LW@ zh+cQth*yE|Sj6>w`b1epz0+M$kI6tlxBRzd0R|a`kO0xdXcHP@d!^)hT-ckQhg%ps zTD`sql;;9hwir#*C4qDs6NH2Ak(`t#ChS<7x2>VAJt|6g9iNzvjJBM8b~lC>(AXvV zVzx(iLQKu{S6I&c`QEyV;bSz^`TRceH;%9W)-?MHJwllZ2cG(dxN-658uj~l#6lS# ztuN)$s8Q+#QcQh~esZQcB-608k;6wJ)5RpGm=#k!$XK}Z#N3w@ZamMZE-{ks5@Yce zKgE`Busf!JyUB3Nj)D2^Y2;Wrb3$TE1ASdy#egAOw;2%WdBJAP(&2)#D34ERJ7-P} zI%z<-F1Y?uAGn?PgpY770)du!J_sOYI3i7k?hL3AXHnmXvj*3hUF^fmqFXrRAqAXM zk{-Ilk+by@tNj|;2#}qf^dFneGF7^fkQVB}usIZ-` z@O5{555GuQjg}60b}iveD$pnFXc=0tV+nz9l_KwKEuSi98M}^US7_b`lcsJl)6TjA zK2a%6k$OQ)C^+*%E;mN6Mg#h&YWO!!gR{~(SsmV{EG(!kSm0^L-K~CdOmLHHmt33l z=QXu<2AU(iMl=oPLQq-i{^;;&+|WvmoHD1WY>=aC_00jb_z<@ZYp4cOLs7*?Tucqi zQAVqO9+oJK42FSg9kXeXXUd`b*o_Onk|vvFOAdNY>L`iUQBl+2IqUd zzN%?55vND38wl>0N!J;|V-EToqxu=9B;hxOjY?^a!{hVL_eg&uVt|_EDnj}~^&6}W zIB7yQ(2h>wfvZj0FI+y=aFbfmS<-^pA+J8Y)I@F&CM=?VQby^7Cx&60$jK5D!$Jc~ z-eQJZcp?q$3qv*GB!T$;i^(%FV!>h$)ev0cyaw93fVq^yM!#o18qw!&2rJ`kTyyPR zP)xOrGKygi6a=na59NvmIbbDgq;D?HnIpUc*b&^H3u7WC=0GGT?+xebUHX-=GayR; z6I1oaG1Z#uZ%3)&t3oMZUeF)#%mkth83-2&6!PD-#6|T-X~QeV1)ng^T`dh>HOg;^ z5>00zQBR}lRvJc5N*6%ORAcZdq^O84@};Hepx&vXXNgX12pMCVt*|A4ThAdc$Fifc zw})oT(dlWffhI9A>wvMp_+Qk3pZs|_SzO+VInHW-O{70ay&AQITUfEgBd%)3!tTlF zYs}zBFRa1VM-ACR>tx5dbV_BQX33TfG6`!vMOXrAb$7ukx~nj&kS8A%p_o#1x?25p zjb*rbm-MPI5GU*&k@A5>5K}@eO~+h9I++UVGmkXqh4w2D?WeX3ge?opAF$_VGW{=? zlW5V!c|3FcQQhrm3S8MH-~6_yNR6$PT@lMmBs7sz%qL_rV~D=!tJ38o^J3)i(QI*4 z=1>oP9#fv($PkjilAD=f3#H> za61mY2yO<$y^D}e!~)wzG!cT8F=6<^Ru;$s!jfr2^TnPfOfJfL!xS1!9_?KT?=t$x z4kebZRNiE4G4hdls+nGb*^*KZ88@Vy@A07Qw4|h~l~@aYLK(>BRMh2SKNo2yZ0E}H zsNBdk=q%w{gd0xSjOo&HimXO9dX`fyav4-mj0~ZIu(A=kmCoH3Yv~L%(C2qKb728W zy@88^{&w=ieGdx?JCA6a_L+PEy9m#Rx3) zHMlDqup}S0(L%K}r2It1HkV53ZivOLk6GA~5sf3s4Gm3-VzxfUoTc#BeO~Og&}Ss0 zGA!L9n5hOVT>1Ptp4qtE9Fx1au-$`|^oEObeE#{-T~l;rIpt9#M)&2uCjUv=;Lt*l z?pYaZFUTczCU!6OwNq%;0A5jeGw526rpulA=x!z0w_DeMUL-s{8e~EBh9*J2&t5B| z;WTZ!#BiF{geu8ZE2L2_?LAcO_QT{_#N?V3|0*F2o##W(u|;<*F-8g5XQxxl z_hZ{9Il`*Qa&a#Sk9x+zH#KKpJ^W+wQjP_>q zvk1=6K$k>9>Tun#N(V=bwL84RxJ9iPBjd+YL$N9sX+(}2;o)Iq(&t7xG$pd zmB$G`3$}Yfu-Y38!l(qu*QyT$Lc)#NnOuE#2KLb7Z&J&!O>IH=kC%iiwJevIgggn` z;>;04oF+^wQxal3Nen|Hh8xE*><`Zr$(fVRO##DJt$i@KsWoTzD3 zb3J13xVw#ZL&eN|znK*3G0yP0v=i;o{YTuYn;l0b#gHL1wo~6|M4nSeUB^P<`9^qN zS;B2H9vK+=p9LM>fVZQ|>yA-7U>DwHovwz?4pJ%}+V88TI-+!u-1641|K(s8@Augt zOl{J)8cK`!eKRdlxh$-!5BOWL(L{DFU2F_@x%A7cv#7HjwnS_&n&EAk*Ie)K?D$>| zv=DbOF_R~kdV~)drW@p}buMk`mbor0#bX^-Yvrr1L*zhI>h$pGn?|GQ8}jw^8aQ4X z=gb%VUhJFo`Hj0i7H-@8U24)U)Ki@~Bpj~lGPy4^d|Bi8I+D@u^lDEz_0?z#gI(05 z9%;`H41CNTKmA)cr>}*JX~u{e2)yO^Hg{5Mr&nl!|J^O{C{_OjrAX5>xvJmPqwpQV zL`#ldq>a0PW-W^`-ikFp(SJHrxXvdx;}@>%LmOa@;i{`e8|WODm=(s%FwMJ!vr_FO zCbemULABU-7->U^rrO^caQ9mYJ&C>`9Za$v$5xM_eimb6AqN1(V>V(|CA|6N zLJ>3?ibU&Nv34%Yp?26L6N*k#Qu-tlJ^(Yek~AxwC%-I=y*WY%C+)(+3M!QWQ%5mO zc9ccZ1w)u1)f0{LU}&kupuEE?KZdL8TmYvg#x#{@UK_qRL(jqbCe^pog~}?yikFW( zUvjgxsdebYS0nvRQ@`_YY5ix@Uw>_rnl z+R}tiZxHY-I(+(z<}n`V-b?y&df=3x1V13*TR7 z(YMf8^IaH*s_$%RZ9KcBQK9hN&e`~YnhA2+qsX!v7y6KdguxE^OBd#PVMHQcJopW( z-E|Z}J+-$6S(cdM&%$HYJU?D(sL8V6^tFJN+IINuv*eGEF=Iy@xePmizP zzo5hAHc3f&q`K3~KSZKg3m|1#kFVe7phNxs21PD-=+6Xyfj_z{L65KBkD$YR)nI!5 zbvhmX8u97w1^r#We?f<}Dn8|(@~P(^k0PwZzf`AseEt3h9oDM$(9_rB>*c>e#h)a& zvCw@I`n?kR{Sy>_82+N;-v%6IQRmMl;)TLQ@h?uciVV^1zZO4-$9GJW^g3Ke1rH1A zI3b+bB*UEm;qkXkmUtcN`Bmhh{OkDcsQCK1>NHT?%gA6@^iM8&`H8kxQh zqYqip>rJs^Z%4;pui`7XE2;vb)Bgv*WtH_n-UgZzrSU_ zim%gwL~sezg9OxsrLNDD)mB;*!&| zlJdw<`HJIR8U5+y*7YA9GZ)IcBo+T2c}K<{`japu9`*EfY$_gN#ZMh6b5#@-A?lU= EA4wbHQvd(} diff --git a/algo.txt b/algo.txt new file mode 100644 index 0000000..7a42934 --- /dev/null +++ b/algo.txt @@ -0,0 +1,37 @@ +Paper: +--------- +1. Looking for an edge r_i: h()..... +2. Create a new node vec( y ) that matches the city vec(x), and add it between nodes vec(y_i), vec(y_(i+1)). +3. We check if criterion 1 is met. The traversed cities that do not satisfy this criterion are released (i.e., returned to the stack S of untraversed cities) and traversed again. + +When a node vec( y ) is added to the route, two new edges (vec(y_i), vec(y)) and (vec( y ), vec(y_(i+1)))) are added. The values of h(vec(y_i)) and h(vec(y_()i+1)) change, so to check if the criterion is fulfilled it is enough to check it for vec(y_i) and vec(y_(i+1)), and to compare h(vec(y_k)) with h(vec(y_k)); vec(y_i), vec(y)) and with h(vec(y_k); vec( y ), vec(y_(i+1)))) for the remaining nodes. +When a node vec(y_k) is removed from the route, we need to check if the criterion is fulfilled given the new edge (vec(y_(k-1)), vec(y_(k+1))) and changed values of h(vec(y_(k-1))) and h(vec(y_(k+1)))). +To ensure that there are no self-intersections in the route, it is sufficient, when adding a node vec( y ) between nodes vec(y_i), vec(y_(i+1)), to first remove all nodes from the route, lying inside the triangle (vec(y)), vec(y_i), vec(y_(i+1))), and when removing node vec(y_i), remove all nodes from the triangle (vec(y)), vec(y_(i-1)), vec(y_(i+1))). + +Implementation: +-------------- +Let the city indices be: +ci element of [0, num_cities) +Let the node indices be: +ni element of [0, num_nodes) + +1. Take a city on stack, x_ci +2. Find nodes y_ni and y_(ni+1) which satisfies step (1) in paper. +3. Remove city x_ci from stack +4. Add new node at (ni+1) which is equal to x_ci and increase by value 1, the indies of node from original (ni+1) and higher. So, (ni+1), (ni+2), (ni+3)...(ni+N) becomes (ni+2), (ni+3), (ni+4)...(ni+N+1) +5. Update cost values of y_ni, y_(ni+1) and y_(ni+2) + +6. Check whether y_ni and y_(ni+2) satisfy criterion 1 +7. Check whether all other nodes except y_(ni+1) satisfy criterion 1 by comparing with new edges {y_ni, y_(ni+1)} except node y_ni and {y_(ni+1), y_(ni+2)} except node y_(ni+2) +*order invariant impl* +8. Mark all nodes that don't satisfy the criteria for removal. +9. For each node marked for removal construct new edges that will be formed after their removal. +10. The neighbours have to be selected from the two adjacent nodes on the path (those ones not marked for removal) to the left and right of the current node marked for removal +11. Update the node cost of neighbours, check if they satisfy criterion. +12. Compare the node cost of other nodes with the newly formed edges +(this is bad because any of the newly formed edge might invalidate the newly added node. So, all the nodes removed because of the addition of the newly added node doesn't make sense) +*order non-invariant impl* +8. For each node not satisfying the criterion 1, we remove it +9. A new adge is created between its neighbours. +10. Update the node cost of neighbours, check if they satisfy criterion. +11. Compare the node cost of other nodes with the newly formed edges diff --git a/main.cpp b/main.cpp index 0b4662f..05a94cd 100644 --- a/main.cpp +++ b/main.cpp @@ -206,8 +206,8 @@ int runPipelineSingle(const stdfs::path&data_path, std::default_random_engine& r // ------------------------------------------- DiscreteENN_TSP enn_tsp; enn_tsp.initialSize() = Num_Nodes_Initial; - enn_tsp.intersection() = Validation_Intersection; - enn_tsp.recursive() = Intersection_Recursive; + enn_tsp.validIntersectCK() = Validation_Intersection; + enn_tsp.rmIntersectRecurse() = Intersection_Recursive; enn_tsp.iterRandomize() = Iter_Randomize; enn_tsp.repeatLength() = Repeat_Check_Length; diff --git a/tsp_discrete_enn.cpp b/tsp_discrete_enn.cpp index 6a3a5e2..35a58b3 100644 --- a/tsp_discrete_enn.cpp +++ b/tsp_discrete_enn.cpp @@ -73,8 +73,8 @@ int main(int argc, char** argv) // ------------------------------------------- DiscreteENN_TSP enn_tsp; enn_tsp.initialSize() = Num_Nodes_Initial; - enn_tsp.intersection() = Validation_Intersection; - enn_tsp.recursive() = Intersection_Recursive; + enn_tsp.validIntersectCK() = Validation_Intersection; + enn_tsp.rmIntersectRecurse() = Intersection_Recursive; enn_tsp.iterRandomize() = Iter_Randomize; enn_tsp.repeatLength() = Repeat_Check_Length; diff --git a/tsp_discrete_enn.hpp b/tsp_discrete_enn.hpp index e643d72..17244d6 100644 --- a/tsp_discrete_enn.hpp +++ b/tsp_discrete_enn.hpp @@ -382,13 +382,13 @@ class DiscreteENN_TSP { return m_initialSize; } - bool& recursive() + bool& rmIntersectRecurse() { - return m_recursive; + return m_rmIntersectRecurse; } - bool& intersection() + bool& validIntersectCK() { - return m_intersection; + return m_validIntersectCK; } int& iterRandomize() { @@ -399,14 +399,6 @@ class DiscreteENN_TSP return m_repeatLen; } - int properIndex(int index) - { - const int n = m_path.size(); - index = (index < 0) ? (n + index) : index; - index = (index > (n - 1)) ? (index - n) : index; - return index; - } - int findNode(Node_t node) { const Path_t::const_iterator& it_begin{ m_path.begin() }; @@ -416,26 +408,18 @@ class DiscreteENN_TSP return (it == it_end) ? -1 : std::distance(it_begin, it); } - bool removeNode(int index) + void removeNode(int index) { -#if (TSP_DEBUG_CHECK > 1) - if (index >= static_cast(m_path.size())) { - utils::printErr("Request to remove a node not present in path.", - "removeNode"); - return false; - } - if (index < 0) { - utils::printErr("given index is negative", "removeNode"); - return false; - } -#endif + // const std::string& node_idx_str{ + // "|" + std::to_string(m_path[static_cast(index)]->id) + + // "|" + // }; + // std::string::size_type idx_erase = m_pattern.find(node_idx_str); + // m_pattern.erase(idx_erase, node_idx_str.length()); + const Path_t::iterator node_iter{ m_path.begin() + index }; (*node_iter)->on_stack = true; -#if (TSP_DEBUG_PRINT > 0) - (*node_iter)->print(); -#endif m_path.erase(node_iter); - return true; } bool removeNode(Node_t node) @@ -446,38 +430,42 @@ class DiscreteENN_TSP "removeNode"); return false; } - return removeNode(index); + removeNode(index); + return true; } void addNode(int index, Node_t node) { + // const std::string& node_idx_str{ + // "|" + std::to_string(m_path[static_cast(index)]->id) + + // "|" + // }; + // const std::string& node_idx_added_str{ "|" + std::to_string(node->id) + + // "|" }; + // std::string::size_type idx_insert = m_pattern.find(node_idx_str); + // m_pattern.insert(idx_insert, node_idx_added_str); + node->on_stack = false; m_path.insert(m_path.begin() + index, node); -#if (TSP_DEBUG_PRINT > 1) - m_path[0]->print(); - std::cout << "FIRST CITY\n"; - node->print(); - std::cout << "Added City\n"; - const std::string& msg{ "path size (" + std::to_string(m_path.size()) + - ") position : " + std::to_string(index) }; - std::cout << ("[Debug] (addNode): " + msg + "\n"); -#endif } std::pair validateNode(Node_t node) { + const std::size_t num_nodes = m_path.size(); + if (num_nodes < 3) { + utils::printErr("given path size less than 3", "validateNode"); + return std::make_pair(false, true); + } const int index = findNode(node); if (index == -1) { utils::printErr("Request to validate a node not present in path.", "validateNode"); return std::make_pair(false, true); } - const std::size_t num_nodes = m_path.size(); - if (num_nodes < 3) { - utils::printErr("given path size less than 3", "validateNode"); - return std::make_pair(false, true); - } const Value_t cost_current{ node->cost }; + if (cost_current < utils::tolerance) { + return std::make_pair(true, false); + } if (index != 0 and index != static_cast(num_nodes - 1)) { if (insertionCost(*node, *(m_path[num_nodes - 1]), *(m_path[0])) < cost_current) { @@ -497,11 +485,17 @@ class DiscreteENN_TSP return std::make_pair(true, false); } + std::size_t properIndex(int index) + { + const int n = m_path.size(); + index = (index < 0) ? (n + index) : index; + index = (index > (n - 1)) ? (index - n) : index; + return static_cast(index); + } + auto getNeigbhours(int index) { - const int curr = properIndex(index); - return std::make_tuple(properIndex(curr - 1), curr, - properIndex(curr + 1)); + return std::make_pair(properIndex(index - 1), properIndex(index + 1)); } auto getNeigbhours(Node_t node) @@ -511,222 +505,89 @@ class DiscreteENN_TSP utils::printErr( "Request to find neighbours for a node not present in path.", "getNeigbhours"); - utils::Expected{ std::make_tuple(Node_t{}, Node_t{}, Node_t{}), - true }; + return utils::Expected{ std::make_pair(Node_t{}, Node_t{}), true }; } - const auto [prev, curr, next] = getNeigbhours(index); - return utils::Expected{ std::make_tuple( - m_path[static_cast(prev)], - m_path[static_cast(curr)], - m_path[static_cast(next)]), + const auto [prev, next] = getNeigbhours(index); + return utils::Expected{ std::make_pair(m_path[prev], m_path[next]), false }; } - Value_t nodeCost(int index, bool update) + void updateCost(std::size_t index) { - const int num_nodes = m_path.size(); - if (num_nodes < 3) { - utils::printErr("given path size less than 3", "nodeCost"); - return -1.0; - } - const auto [idx_prev, idx_curr, idx_next] = getNeigbhours(index); + const auto [idx_prev, idx_next] = getNeigbhours(index); const auto node_prev{ m_path[idx_prev] }, node_curr{ m_path[index] }, node_next{ m_path[idx_next] }; const Value_t cost = isCollinear(node_curr, node_prev, node_next) ? - Value_t{0.0} : + Value_t{ 0.0 } : insertionCost(*node_curr, *node_prev, *node_next); - if (update) { - node_curr->cost = cost; - } - return cost; + node_curr->cost = cost; } - Value_t nodeCost(Node_t node, bool update) + + bool updateCost(Node_t node) { + const int num_nodes = m_path.size(); + if (num_nodes < 3) { + utils::printErr("given path size less than 3", "nodeCost"); + return Value_t{ -1.0 }; + } const int index = findNode(node); if (index == -1) { utils::printErr( "Request to calculate cost for a node not present in path. Current path size " + std::to_string(m_path.size()), "nodeCost"); - return -1.0; + return Value_t{ -1.0 }; } - return nodeCost(index, update); - } - - NodeOpt_t removeIntersection(Node_t node_prev, Node_t node_curr, - Node_t node_next) - { - NodeOpt_t node_erased{ std::nullopt }; - int num_nodes = m_path.size(); - const int id_prev{ node_prev->id }; - const int id_curr{ node_curr->id }; - const int id_next{ node_next->id }; - for (int idx{ 0 }; idx != num_nodes;) { -#if (TSP_DEBUG_PRINT > 1) - const std::string& msg_first{ - "idx (" + std::to_string(idx) + ") num_nodes (" + - std::to_string(num_nodes) + ") path size (" + - std::to_string(m_path.size()) + ")." - }; - std::cout << ("[Debug] (removeIntersection): " + msg_first + "\n"); -#endif - const Node_t node{ m_path[static_cast(idx)] }; - const int id{ node->id }; - if ((id == id_prev) or (id == id_curr) or (id == id_next)) { - ++idx; - continue; - } - if (not isInside(node, node_prev, node_curr, node_next)) { - ++idx; - continue; - } -#if (TSP_DEBUG_PRINT > 1) - std::cout << ("[Debug] (removeIntersection): Done 1\n"); -#endif - removeNode(node); - --num_nodes; -#if (TSP_DEBUG_PRINT > 1) - std::cout << ("[Debug] (removeIntersection): Done 2\n"); -#endif - if (node_erased.has_value()) { - node_erased = (node->id < (*node_erased)->id) ? node : - node_erased; - } else { - node_erased = node; - } -#if (TSP_DEBUG_PRINT > 0) - path[0]->print(); - std::cout << "FIRST City\n"; - node->print(); - std::cout << "Removed City\n"; - node_prev->print(); - std::cout << "Triangle A City\n"; - node_curr->print(); - std::cout << "Triangle B City\n"; - node_next->print(); - std::cout << "Triangle C City\n"; - const std::string& msg{ "path size (" + - std::to_string(m_path.size()) + - ") num_nodes (" + - std::to_string(num_nodes) + ") idx (" + - std::to_string(idx) + ")." }; - std::cout << ("[Debug] (removeIntersection): " + msg + "\n"); -#endif - const auto idx_next = static_cast(properIndex(idx)); - const auto idx_prev = - static_cast(properIndex(idx_next - 1)); - nodeCost(idx_next, true); - nodeCost(idx_prev, true); - if (m_recursive) { - auto node_erased_tmp = removeIntersection( - m_path[idx_prev], node, m_path[idx_next]); - if (node_erased_tmp.has_value()) { - node_erased = - ((*node_erased_tmp)->id < (*node_erased)->id) ? - node_erased_tmp : - node_erased; - } - num_nodes = m_path.size(); - idx = 0; - } - } - return node_erased; - } - - int findBestInsertion(Node_t node) - { - const std::size_t num_nodes = m_path.size(); - if (num_nodes < 2) { - utils::printErr("given path size less than 2", "findBestInsertion"); - return -1; - } - - const City& new_city{ *node }; - - Value_t min_cost{ insertionCost(new_city, *(m_path[num_nodes - 1]), - *(m_path[0])) }; - int best_index{ 0 }; - - for (std::size_t idx{ 0 }; idx != num_nodes; ++idx) { - if (new_city.id == (m_path[idx])->id) { - utils::printErr( - "trying to add city that already exists in path", - "findBestInsertion"); - return -1; - } - if (idx == (num_nodes - 1)) { - continue; - } - const Value_t cost = - insertionCost(new_city, *(m_path[idx]), *(m_path[idx + 1])); - if (cost < min_cost) { - min_cost = cost; - best_index = idx + 1; - } - } - - return best_index; + updateCost(static_cast(index)); + return true; } - std::pair updateCostNeighbour(Node_t node) + std::pair updateCostNeighbour(Node_t node, bool self) { const std::size_t num_nodes = m_path.size(); if (num_nodes < 3) { utils::printErr("given path size less than 3", "updateCostNeighbour"); - return std::make_pair(-1, true); - } - const int index = findNode(node); - if (index == -1) { - utils::printErr( - "Request to update neighbour costs for a node not present in path. Current path size " + - std::to_string(m_path.size()), - "updateCostNeighbour"); - return std::make_pair(-1, true); + return std::make_pair(Node_t{}, true); } const utils::Expected nodes = getNeigbhours(node); if (nodes.err()) { - utils::printErr("Failed to get the neighbour nodes for index " + - std::to_string(index) + " current path size " + + utils::printErr("Failed to get the neighbour nodes for node " + + std::to_string(findNode(node)) + + " current path size " + std::to_string(m_path.size()), "updateCostNeighbour"); - return std::make_pair(-1, true); - } - const auto [node_prev, node_curr, node_next] = nodes.value(); - if (node != node_curr) { - utils::printErr( - "The node fetched from getNeigbhours doesn't match original node for index " + - std::to_string(index) + " current path size " + - std::to_string(m_path.size()), - "updateCostNeighbour"); - return std::make_pair(-1, true); + utils::printErr("Failed node details:", "updateCostNeighbour"); + node->print(); + return std::make_pair(Node_t{}, true); } - if (nodeCost(node_curr, true) < 0.0) { + const auto [node_prev, node_next] = nodes.value(); + if (self and updateCost(node) < 0.0) { utils::printErr("Invalid node cost calculate for node curr at " + - std::to_string(index) + " current path size " + + std::to_string(findNode(node)) + + " current path size " + std::to_string(m_path.size()), "updateCostNeighbour"); utils::printErr("Previous node " + std::to_string(findNode(node_prev)), "updateCostNeighbour"); node_prev->print(); - utils::printErr("Current node " + - std::to_string(findNode(node_curr)), + utils::printErr("Current node " + std::to_string(findNode(node)), "updateCostNeighbour"); - node_curr->print(); + node->print(); utils::printErr("Next node " + std::to_string(findNode(node_next)), "updateCostNeighbour"); node_next->print(); utils::printErr( "Distances : " + - std::to_string(getDistance(*node_curr, *node_next)) + ", " + - std::to_string(getDistance(*node_curr, *node_prev)) + ", " + + std::to_string(getDistance(*node, *node_next)) + ", " + + std::to_string(getDistance(*node, *node_prev)) + ", " + std::to_string(getDistance(*node_prev, *node_next)), "updateCostNeighbour"); - return std::make_pair(index, true); + return std::make_pair(node, true); } - if (nodeCost(node_prev, true) < 0.0) { + if (updateCost(node_prev) < 0.0) { const utils::Expected nodes = getNeigbhours(node_prev); if (nodes.err()) { utils::printErr("Failed to get the neighbour nodes for index " + @@ -735,32 +596,35 @@ class DiscreteENN_TSP std::to_string(m_path.size()), "updateCostNeighbour"); } - const auto [node_prev, node_curr, node_next] = nodes.value(); + const auto [node_prev_tmp, node_next_tmp] = nodes.value(); utils::printErr("Invalid node cost calculate for node prev at " + - std::to_string(properIndex(index - 1)) + + std::to_string(findNode(node_prev)) + " current path size " + std::to_string(m_path.size()), "updateCostNeighbour"); utils::printErr("Previous node " + - std::to_string(findNode(node_prev)), + std::to_string(findNode(node_prev_tmp)), "updateCostNeighbour"); - node_prev->print(); + node_prev_tmp->print(); utils::printErr("Current node " + - std::to_string(findNode(node_curr)), + std::to_string(findNode(node_prev)), "updateCostNeighbour"); - node_curr->print(); - utils::printErr("Next node " + std::to_string(findNode(node_next)), + node_prev->print(); + utils::printErr("Next node " + + std::to_string(findNode(node_next_tmp)), "updateCostNeighbour"); - node_next->print(); + node_next_tmp->print(); utils::printErr( "Distances : " + - std::to_string(getDistance(*node_curr, *node_next)) + ", " + - std::to_string(getDistance(*node_curr, *node_prev)) + ", " + - std::to_string(getDistance(*node_prev, *node_next)), + std::to_string(getDistance(*node_prev, *node_next_tmp)) + + ", " + + std::to_string(getDistance(*node_prev, *node_prev_tmp)) + + ", " + + std::to_string(getDistance(*node_prev_tmp, *node_next_tmp)), "updateCostNeighbour"); - return std::make_pair(properIndex(index - 1), true); + return std::make_pair(node_prev, true); } - if (nodeCost(node_next, true) < 0.0) { + if (updateCost(node_next) < 0.0) { const utils::Expected nodes = getNeigbhours(node_next); if (nodes.err()) { utils::printErr("Failed to get the neighbour nodes for index " + @@ -769,43 +633,46 @@ class DiscreteENN_TSP std::to_string(m_path.size()), "updateCostNeighbour"); } - const auto [node_prev, node_curr, node_next] = nodes.value(); + const auto [node_prev_tmp, node_next_tmp] = nodes.value(); utils::printErr("Invalid node cost calculate for node next at " + - std::to_string(properIndex(index + 1)) + + std::to_string(findNode(node_next)) + " current path size " + std::to_string(m_path.size()), "updateCostNeighbour"); utils::printErr("Previous node " + - std::to_string(findNode(node_prev)), + std::to_string(findNode(node_prev_tmp)), "updateCostNeighbour"); - node_prev->print(); + node_prev_tmp->print(); utils::printErr("Current node " + - std::to_string(findNode(node_curr)), - "updateCostNeighbour"); - node_curr->print(); - utils::printErr("Next node " + std::to_string(findNode(node_next)), + std::to_string(findNode(node_next)), "updateCostNeighbour"); node_next->print(); + utils::printErr("Next node " + + std::to_string(findNode(node_next_tmp)), + "updateCostNeighbour"); + node_next_tmp->print(); utils::printErr( "Distances : " + - std::to_string(getDistance(*node_curr, *node_next)) + ", " + - std::to_string(getDistance(*node_curr, *node_prev)) + ", " + - std::to_string(getDistance(*node_prev, *node_next)), + std::to_string(getDistance(*node_next, *node_next_tmp)) + + ", " + + std::to_string(getDistance(*node_next, *node_prev_tmp)) + + ", " + + std::to_string(getDistance(*node_prev_tmp, *node_next_tmp)), "updateCostNeighbour"); - return std::make_pair(properIndex(index + 1), true); + return std::make_pair(node_next, true); } - return std::make_pair(index, false); + return std::make_pair(node, false); } std::pair updateCostAll() { - const int num_nodes = m_path.size(); - for (int idx{ 0 }; idx != num_nodes; ++idx) { - if (nodeCost(m_path[static_cast(idx)], true) < 0.0) { + const std::size_t num_nodes = m_path.size(); + for (std::size_t idx{ 0 }; idx != num_nodes; ++idx) { + if (updateCost(m_path[idx]) < 0.0) { utils::printErr("Invalid node cost calculate for node at " + std::to_string(idx) + " current path size " + - std::to_string(m_path.size()), + std::to_string(num_nodes), "updateCostAll"); return std::make_pair(idx, true); } @@ -813,20 +680,101 @@ class DiscreteENN_TSP return std::make_pair(num_nodes, false); } + int findBestInsertion(Node_t node) + { + const std::size_t num_nodes = m_path.size(); + if (num_nodes < 2) { + utils::printErr("given path size less than 2", "findBestInsertion"); + return -1; + } + + const City& new_city{ *node }; + + Value_t min_cost{ insertionCost(new_city, *(m_path[num_nodes - 1]), + *(m_path[0])) }; + int best_index{ 0 }; + + for (std::size_t idx{ 0 }; idx != (num_nodes - 1); ++idx) { + if (new_city.id == (m_path[idx])->id) { + utils::printErr( + "trying to add city that already exists in path", + "findBestInsertion"); + return -1; + } + const Value_t cost = + insertionCost(new_city, *(m_path[idx]), *(m_path[idx + 1])); + if (cost < min_cost) { + min_cost = cost; + best_index = idx + 1; + } + } + + return best_index; + } + + NodeOpt_t removeIntersection(Node_t node_prev, Node_t node_curr, + Node_t node_next) + { + NodeOpt_t node_erased{ std::nullopt }; + int num_nodes = m_path.size(); + const int id_prev{ node_prev->id }; + const int id_curr{ node_curr->id }; + const int id_next{ node_next->id }; + for (int idx{ 0 }; idx != num_nodes;) { + if (num_nodes == 3) { + break; + } + if (node_prev->on_stack or node_next->on_stack) { + break; + } + const Node_t node{ m_path[static_cast(idx)] }; + const int id{ node->id }; + if ((id == id_prev) or (id == id_curr) or (id == id_next)) { + ++idx; + continue; + } + if (not isInside(node, node_prev, node_curr, node_next)) { + ++idx; + continue; + } + removeNode(node); + --num_nodes; + if (node_erased.has_value()) { + node_erased = (node->id < (*node_erased)->id) ? node : + node_erased; + } else { + node_erased = node; + } + const auto idx_next = properIndex(idx); + const auto idx_prev = properIndex(idx_next - 1); + updateCost(idx_next); + updateCost(idx_prev); + if (m_rmIntersectRecurse) { + auto node_erased_tmp = removeIntersection( + m_path[idx_prev], node, m_path[idx_next]); + if (node_erased_tmp.has_value()) { + node_erased = + ((*node_erased_tmp)->id < (*node_erased)->id) ? + node_erased_tmp : + node_erased; + } + num_nodes = m_path.size(); + idx = 0; + } + } + return node_erased; + } + NodeExp_t validatePath() { NodeOpt_t node_erased{ std::nullopt }; int num_nodes = m_path.size(); - int num_nodes_prev{ 0 }; + [[maybe_unused]] int num_nodes_prev{ 0 }; for (int idx{ 0 }; idx != num_nodes;) { -#if (TSP_DEBUG_PRINT > 1) - const std::string& msg{ "idx (" + std::to_string(idx) + - ") num_nodes (" + - std::to_string(num_nodes) + - ") path size (" + - std::to_string(m_path.size()) + ")." }; - std::cout << ("[Debug] (validatePath): " + msg + "\n"); -#endif + if (num_nodes == 2) { + m_fromScratch = true; + break; + } const Node_t node{ m_path[static_cast(idx)] }; const auto [valid, err1] = validateNode(node); if (err1) { @@ -840,9 +788,6 @@ class DiscreteENN_TSP ++idx; continue; } -#if (TSP_DEBUG_PRINT > 1) - std::cout << ("[Debug] (validatePath): Done 1\n"); -#endif removeNode(node); num_nodes_prev = num_nodes; --num_nodes; @@ -852,15 +797,11 @@ class DiscreteENN_TSP } else { node_erased = node; } -#if (TSP_DEBUG_PRINT > 1) - std::cout << ("[Debug] (validatePath): Done 2\n"); -#endif - const auto idx_next = static_cast(properIndex(idx)); - const auto idx_prev = - static_cast(properIndex(idx_next - 1)); - nodeCost(idx_next, true); - nodeCost(idx_prev, true); - if (m_intersection) { + const auto idx_next = properIndex(idx); + const auto idx_prev = properIndex(idx_next - 1); + updateCost(idx_next); + updateCost(idx_prev); + if (m_validIntersectCK) { NodeOpt_t node_erased_tmp = removeIntersection( m_path[idx_prev], node, m_path[idx_next]); if (node_erased_tmp.has_value()) { @@ -871,13 +812,7 @@ class DiscreteENN_TSP } num_nodes = m_path.size(); } -#if (TSP_DEBUG_PRINT > 1) - std::cout << ("[Debug] (validatePath): Done 3\n"); -#endif idx = 0; -#if (TSP_DEBUG_PRINT > 1) - std::cout << ("[Debug] (validatePath): Done 4\n"); -#endif } return NodeExp_t{ node_erased, false }; } @@ -928,9 +863,19 @@ class DiscreteENN_TSP if (not it->on_stack) { ++it; } else { -#if (TSP_DEBUG_PRINT > 0) - std::cout << ("\n[Debug] (run): addNode\n"); -#endif + if (m_fromScratch) { + m_fromScratch = false; + addNode(0, it); + const auto [discard1, err1] = updateCostNeighbour(it, true); + if (err1) { + utils::printErr( + "updateCostNeighbour failed at index 0 for for path size " + + std::to_string(m_path.size()), + "run"); + return false; + } + continue; + } const int idx_added = findBestInsertion(it); if (idx_added == -1) { utils::printErr("findBestInsertion failed at index " + @@ -941,7 +886,7 @@ class DiscreteENN_TSP return false; } addNode(idx_added, it); - const auto [discard1, err1] = updateCostNeighbour(it); + const auto [discard1, err1] = updateCostNeighbour(it, true); if (err1) { utils::printErr("updateCostNeighbour failed at index " + std::to_string(idx_added) + @@ -952,9 +897,6 @@ class DiscreteENN_TSP } indices_added[repeat_check] = idx_added; ++repeat_check; -#if (TSP_DEBUG_PRINT > 0) - std::cout << ("\n[Debug] (run): addNode removeIntersection\n"); -#endif const utils::Expected nodes = getNeigbhours(it); if (nodes.err()) { @@ -965,39 +907,20 @@ class DiscreteENN_TSP "run"); return false; } - const auto [node_prev, node_curr, node_next] = nodes.value(); - if (it != node_curr) { - utils::printErr( - "The node fetched from getNeigbhours doesn't match original node for index " + - std::to_string(idx_added) + " current path size " + - std::to_string(m_path.size()), - "run"); - return false; - } + const auto [node_prev, node_next] = nodes.value(); const auto it_erased1 = - removeIntersection(node_prev, node_curr, node_next); - if (it_erased1.has_value()) { -#if (TSP_DEBUG_PRINT > 0) - std::cout << ("\n[Debug] (run): addNode updateCostAll\n"); -#endif - // const auto [idx_fail, err] = updateCostAll(); - // if (err) { - // utils::printErr("updateCostAll failed at index " + - // std::to_string(idx_fail) + - // " path size " + - // std::to_string(m_path.size()), - // "run"); - // return false; - // } - } -#if (TSP_DEBUG_PRINT > 0) - std::cout << ("\n[Debug] (run): validatePath\n"); -#endif + removeIntersection(node_prev, it, node_next); + const auto it_erased2 = validatePath(); if (it_erased2.err()) { utils::printErr("validatePath failed", "run"); return false; } + if (m_fromScratch) { + const int idx_rand{ distrib(gen) }; + it = it_begin + idx_rand; + continue; + } // if (it_erased1.has_value() or it_erased2.has_value()) { // it = it_begin; @@ -1030,12 +953,11 @@ class DiscreteENN_TSP std::to_string(m_path.size()) + "/" + std::to_string(num_cities), "run"); - utils::printInfo("Repeating pattern:", - "run"); + utils::printInfo("Repeating pattern:", "run"); const auto idx_it_end{ indices_added.end() }; - for (auto idx_it{idx_it_end - m_repeatLen}; idx_it != idx_it_end; ++idx_it) { + for (auto idx_it{ idx_it_end - m_repeatLen }; + idx_it != idx_it_end; ++idx_it) { std::cout << *idx_it << ","; - } std::cout << std::endl; const int idx_rand{ distrib(gen) }; @@ -1078,11 +1000,14 @@ class DiscreteENN_TSP } private: - bool m_recursive; - bool m_intersection; + bool m_rmIntersectRecurse; + bool m_validIntersectCK; + bool m_fromScratch{ false }; int m_initialSize; int m_iterRandomize; int m_repeatLen; + std::string m_pattern; + std::vector m_patternSizes; Cities_t m_stack; Path_t m_path; };