From db80c4920b445730f77231655a132717caedb5ac Mon Sep 17 00:00:00 2001 From: germanFid Date: Tue, 21 Jun 2022 16:44:06 +0300 Subject: [PATCH] To fix #1 --- config.h | 1 - handler.h | 151 ++++++++++++++++++++++++++++++++++++++++++++++++--- include/ui.h | 2 +- main.c | 45 ++++++++++----- old_main.c | 1 + work1 | Bin 17456 -> 13524 bytes 6 files changed, 176 insertions(+), 24 deletions(-) diff --git a/config.h b/config.h index b1eda2f..1ee06ea 100644 --- a/config.h +++ b/config.h @@ -55,7 +55,6 @@ typedef enum #define max(a, b) (a > b) ? a : b #endif -#define MAX_COMMAND_LEN 200 #define COMMAND_COUNT 6 const char allowedCommands[][200] = {"cd", "ls", "rm", "mkdir", "touch", "find"}; diff --git a/handler.h b/handler.h index 0643848..7284a0c 100644 --- a/handler.h +++ b/handler.h @@ -3,6 +3,10 @@ #define MAX_ARG_LEN 200 +#define OBJECT_WRONG 0 +#define OBJECT_FOLDER 1 +#define OBJECT_FILE 2 + int checkCommandValid(char* command) { for (size_t i = 0; i < COMMAND_COUNT; i++) @@ -52,13 +56,129 @@ int checkMinorArgumentValid(char* command, char* argument) return FAILURE; } -int checkMajorArgumenntValid(char* command, char* argument) +int checkMajorArgumenntValid(char* argument, Folder* RootFolder, Folder* CurrentFolder, Folder* ResultFolder, File* ResultFile) { - return SUCCESS; + Folder* ptr; + char* path = (char*) malloc(MAX_COMMAND_LEN); + + strcpy(path, argument); + + for (size_t i = 0; i < strlen(path); i++) + { + if(path[i] == '\n') + { + path[i] = '\0'; + } + } + + if (argument[0] == '/') + { + // Абсолютный путь + ptr = RootFolder; + } + + else + { + // Относительный путь + ptr = CurrentFolder; + } + + char *sep = "/", *istr; + istr = strtok(path, sep); + + int foundFlag; + while (istr != NULL) + { + foundFlag = 1; + for (size_t i = 0; i < CurrentFolder->folders_count_cur; i++) + { + if (!strcmp(CurrentFolder->folders[i].filename, istr)) + { + foundFlag = 0; + ptr = &CurrentFolder->folders[i]; + break; + } + } + + if(foundFlag) + { + int isFileFlag = 0; + for (size_t i = 0; i < strlen(istr); i++) + { + if(istr[i] == '.') + { + isFileFlag = 1; + break; + } + } + + if (isFileFlag) + { + char* filename = (char*) malloc(filename_lenth + 1); + char* extension = (char*) malloc(extinsion_lenth + 1); + int extFlag = 0; + + int writeCount = 0; + + for (size_t i = 0; i < strlen(istr); i++) // Отделяем имя файла от расширения + { + if (istr[i] == '.') + { + extFlag = 1; + filename[writeCount + 1] = '\0'; + writeCount = 0; + continue; + } + + if(extFlag) + { + filename[writeCount] = istr[i]; + } + + else + { + extension[writeCount] = istr[i]; + } + + writeCount++; + } + + for (size_t i = 0; i < ptr->files_count_cur; i++) + { + if (!strcmp(ptr->files[i].filename, filename) && !strcmp(ptr->files[i].extension, extension)) + { + free(path); + free(filename); + free(extension); + + ResultFile = &ptr->files[i]; + return OBJECT_FILE; + } + } + + free(filename); + free(extension); + } + + printf("Cannot resolve %s\n", istr); + return WRONG_ARGUMENT_FAILURE; + } + + istr = strtok(NULL, sep); + } + + free(path); + ResultFolder = ptr; + return OBJECT_FOLDER; } -int checkArgumentValid(char* command, char* argument) +int checkArgumentValid(char* command, char* argument, Folder* RootFolder, Folder* CurrentFolder, Folder* resultFolder, File* resultFile) { + Folder* _ResultFolder; + File* _ResultFile; + + int iResult; + if(argument == NULL) { return WRONG_ARGUMENT_FAILURE; @@ -75,18 +195,28 @@ int checkArgumentValid(char* command, char* argument) else { // Обрабатываем объект - if (checkMajorArgumenntValid(command, argument)) + iResult = checkMajorArgumenntValid(argument, RootFolder, CurrentFolder, _ResultFolder, _ResultFile); + if (iResult == WRONG_ARGUMENT_FAILURE) { return WRONG_ARGUMENT_FAILURE; } - } + if (iResult == OBJECT_FILE) + { + resultFile = _ResultFile; + } + + if (iResult == OBJECT_FOLDER) + { + resultFolder = _ResultFolder; + } + } return SUCCESS; } -int commandParserHandler(char* input) +int commandParserHandler(char* input, Folder* RootFolder, Folder* CurrentFolder) { int result = SUCCESS; // Если что-то пойдет не так, то он изменится @@ -104,6 +234,9 @@ int commandParserHandler(char* input) int optionFlag = 0; + File* ResultFile = NULL; + Folder* ResultFolder = NULL; + while(istr != NULL) { // Обрабатываем команду/аргумент @@ -121,7 +254,7 @@ int commandParserHandler(char* input) case 1: // аргумент 1 - if (checkArgumentValid(command, istr)) + if (checkArgumentValid(command, istr, RootFolder, CurrentFolder, ResultFolder, ResultFile)) { result = WRONG_OPTION; goto cleanup; @@ -141,7 +274,7 @@ int commandParserHandler(char* input) goto cleanup; } - if (checkArgumentValid(command, istr)) + if (checkArgumentValid(command, istr, RootFolder, CurrentFolder, ResultFolder, ResultFile)) { result = WRONG_OPTION; goto cleanup; @@ -166,4 +299,4 @@ int commandParserHandler(char* input) free(arg2); return result; -} +} \ No newline at end of file diff --git a/include/ui.h b/include/ui.h index 521207a..831c5e1 100644 --- a/include/ui.h +++ b/include/ui.h @@ -4,7 +4,7 @@ #include #include -// #include "config.h" +#define MAX_COMMAND_LEN 200 #define GETSTRING_ERR_RE -1 #define GETSTRING_ERR_OVERFLOW -2 diff --git a/main.c b/main.c index dc5b844..e776849 100644 --- a/main.c +++ b/main.c @@ -1,27 +1,46 @@ #include -#include "structs.h" +// #include "structs.h" #include "include/ui.h" #include "handler.h" int main(int argc, char** argv) { + Folder* CurrentFolder; + Folder RootFolder; + + createFolder("root", &RootFolder); + CurrentFolder = &RootFolder; + int iResult; - char* buf; + + addFolder("test1", &RootFolder); + addFolder("test2", &RootFolder); + addFolder("test3", &RootFolder); + + addFolder("test11", &RootFolder.folders[0]); + + Folder* ResultFolder; + File* ResultFile; + + iResult = checkArgumentValid("ls", "/test1/", &RootFolder, CurrentFolder, ResultFolder, ResultFile); + printf("%d\n", iResult); + + // char* buf; - while (1) - { - printf("> "); - buf = commandCallHandler(); + // while (1) + // { + // printf("> "); + // buf = commandCallHandler(); - if (buf == NULL) - { - printf("Input too long!\n"); - } + // if (buf == NULL) + // { + // printf("Input too long!\n"); + // } - iResult = commandParserHandler(buf); - printf("result: %d\n", iResult); - } + // iResult = commandParserHandler(buf, &RootFolder, CurrentFolder); + // printf("result: %d\n", iResult); + // } return 0; } \ No newline at end of file diff --git a/old_main.c b/old_main.c index a729563..dc17fad 100644 --- a/old_main.c +++ b/old_main.c @@ -1,4 +1,5 @@ #include "structs.h" +#include "config.h" #include int main() diff --git a/work1 b/work1 index bcd4b184b466a2676b5d9304829c1e071f6f2fd1..8e011d8fd6de5d60a1879c64470ea8dd39df8768 100755 GIT binary patch literal 13524 zcmeHOZ)_CD6`wVMP#{@T(u9UmE;KGAEnrAf(LYo;@g_?PDJ>AuRA_UY&-R7;%?ZGjMjZ9)hg`Pqd+42uXTAwG_5 zB3st(t|yIWjBkFO+~%Y;!&@TiS&soMYp=0?Z?lN(A8F>P;RS3HFh?v>&6bsmAIUXj zTlJM!U@~ZaUUeY8qajW(7=)IU&E*ef>#SCNYw!2;eO^iU*zd4d>1)_WeO7-wIS{uY z)T(d4()XNFKuo{a(;WL^nRK=>;Z}W@mAxwu6lRKJeA?Mz-ko`ozdHZzdj;Fq6bno!@SZ9mhfSInS zAfXg1Q|Yxt1%D-OWPWi~2MIhwI0=?nVwK^86g+ z2Wb=iKNe&t`fk(_WX^e0K5K7ECJt`uIhyPNW?F?zJN|s{&Oe7f8n(cmJx8;- zcxvNg8(~-CAcT-UjZFQQ;UD&WNMZUbOrZxt4}=~FJrH^z^g!r=&;y|dLJx!<2t5#b z;C3F^XFBhh#mRQ}Fm5O|zjORIj&Y+nv*h@`>-rGB-HKx2#;pEQ<+ySEMdSK8O&{jv zSxpx2%+Ai5#kblITdbaje&}OMH;r@fovBISJg_*jUc7k5xRVYsx$JaLyzwb~mT!gMaVf5de`&|~aaTg`$LhH=eeMWgAp z*I_Z7z-tQ636TRA`~_3<_r`bfoPn#4J)sq6lKRkcrAZ$%wc>}iKKygZD7bDEqhrC^ z^x^M&tSR%vql38Ma=U!HaPuS0@H#`AT3VV>8(^`s(bZ(vMYry1H+OxMU4yzFBm>!B z=-LX8mILuVs&(#-aP5`xy14@HW2y2}2QJL<2iBqymb~Su#Zl0|`q<*)ha2?abrQ?y zbKTbwms}QqwiK@64ocLT#D=jXK{2VAlL}6xzE}-|z5R7;as;AY$i6|_tHv}Kh>~q> z2sUsKe3#tUaIxeEC$?PGxFUtPH%j>#H_K)ZK-@Uzo&=*yYVCHaj9j%t;x`k75 zyQ#)8MytkoslHek$Mg+&zhqn)t~kb7eP{z(kF;XjgT|MsR=B1dHOYvJNVT}8W=f%f) zs%~hlNUeK3t;cK6ps`puUk`(6xmv~GSik;vv#D~dXp_=Wsq`j!jxp#Rp#WlY#i_zm z*sP9m1v0L?#2a|LR>lm#!F2Y)q+O#}-v@DwmWBI!baaMa@Xoynm!5~qF1kPUh>H7) zM~u2JgD4r(=CQXJGtH-8cm4e7REMP62N>w>g>s-IIyuI>?v-mWh39s$Fabx%li|d+ zv!2kCQfQpPj{8)OeVAQ*!Y0yb}9hoF_}8lli>5b`JQr_d`#}ec|MU|Jae4q zQ;_CkpJR(eL`U|s5ig6cM8uBtKt31AWipXuCf)bI5@E-)`DE^kk&YhxlaG%Z@d-8g zV2uxU!ROtdL(R-*)l8)M5x5LJ+r1}YWK+#;Q$PArz*hAOs{XF3M^ya-Ri9P$&s06C z>e~(wHiRAsJrH^z^g!r=&;y|dLJx!<2t5#bAoM`!fzSj0HxDddyYgEcZ25MJufq2v z(gWffcKgV7zFRBbjkgZsss-<|54yN)l}W?Rw7pXGuww&9tyupdF(T{;c)fk`T$W%x zfgO*N?gR~ftUqcKZUsz5lgUhsXgkmVUP;gO5}81FLp_!nAlmJrWIRo@-$S_!M^j0& z@cV#;R;u5MABo5Exj5dvkJ8@9V&VymxyO6kJ(-Fo(qdNQsE6Y{k7rV;Xu2mWhT3>* zA{Hd$QQJ6@v!n9rMf7>?;`#n~?2tHxpGTC};SObRJ>LF(96C&NPGXSnX}hC#Hg5a) z8YLfsJ~hD8(PW}W{8HN`Dq5G_mruphIgj^GN)<)iiI=g7pHjH2+Ifda`Lb$1=40GHQU0Wl@A2@D6@KEr0U0pIxxJWqJBvD$Af<`_(uY39tNy=49q#D;9Bt?E?$CE literal 17456 zcmeHP4|H4AdB2h!+cAk{vW%J}C9frB4r>%AaZ*F*cy=u3Idy^>YzS+EtXOg+kR>6> z!43-;oKS=?$ti(mobH^QmTrvFj+TFhLhLvUn|9ktdJ3hdba-xHG6`!6DR^x_`+fJ1 z^d!qTJ*=!dCpUTe?)UfJ``zz;@9*_(j^;+I#llpvvcF=4X~jAxiC@MZyMm*VR?B8H zon6E}&5A&og+u2Yf}*D2q%^HyiIghJ>LEdDFH>|`74RFC z0#y(r;RMp7zLwiL3fRUg3dUqVx+PS4gpyvB)T@$u3LcdmQ&5eM#zserwAW(Qff23~ zU=92?14)*O^NpB?>RT@6D4@5K*_LuCxLLM0onKDL@hK=#wmjh9 zwx(uzz_Tpi4|a7g>#kk1Y)y?l8nUnC<0ktgyM9wEZ%O%414ezGkAq@>_{U}~{QfL! z!SG4_+7}*3y>!bnKOP+?U3H*(*2M+Md3mH)PeVU%8amm?XXh`bp8jjqu5QKdFq;Sng|I{>ehWTu#>0861u}FKkhlRUhQL1;u{GDDFj`)MI4#ET8 zAnSAo0-<(>!yVvk((y&OYG;_aTx87^jkzN+SEt(_WE~N&7v$}op`awY*!t$C`gN|A z_LX*;9A=&JPtk~L;s3CH2|?*v;Ga$Ws6g4|@-|+hHBc&P1S+cAI97~biYHYx6Ft4; z!K^aTDLz%HHqq6ZBVMhEZq7@(iEdt(hKWvnQpIVas~keSEhah!oGxu9x_P`l6P;pP zm9U9EM-c(LP4u}Yy3u#C#7N9~d8x*XJwvfs$;ZJo`d%nGViH0%wR#vLsmd4dYg??N zM!1iJCdN`ImCq7RuAex{@gERQE}t0U_#=dqt0x}g_%{hB7f&4I_=AL#YbW+`{A+}h zODB3cemCLd%84+??;yN{@HUR`B%E9~;pBLPaB|s%&hZ-vCs$2Wb9@`&li z;>WHx;^Ri&@l(#0rja4GKxf9t;e8hp7@1q5v*gVXJl$bi+`!ntUO2SXSauhH(KlIU z#NW8ty7kBa>~Tk)-a1IE)R=8?FVO}FQ}Tx=3m|XAhmFH;U1?a38pkHPp!_Te8hd^c zJH6G2zbN#_rGD=hp0Cod9L{frX7W~aWb2Ew9s$Yn?h%>~qwfo~mp~wPQMwEBTL(3q z#UP(Lx^?0fsMr>>i6|i1Fm6A2ikj=+Qw|EX_c{igoP`-N(T)@Co0t{wlc;m!N!N$a z$SA%|Lc4N>E+?Ucqu1z5;utD5;v>oTJ}@Z`A9@FhgYT2}c1&E_qM5NNoAE(fV|6xz zo3bo~sYTh0V$cT9BSt|s<04{I5#y~AQ{yiVwi4}o*?!=159XoWnV}t`;HObGV1W&w z&R#mgJ>7RwGvd3Fa7L2Y7C0g9nC#m%x$@TH0gCVw{t?F+QaG_X;W%ToALXK!qqe7* z?a&Zh-%DNk`5Brg$0?(4*D2OjJV0yV#PUAJ84HxwIwt?-NWw8`95DKw|OF@_xT`E1>E{#!_8vhr&bo@g1XI_;fCHMAmQmJ@?b3k!YPnOpzvppIy92XNS(`$|K1SNQT_ie?RB< z@0@4E4?kO}WRkCOfjy!xBgq;BbKG&dZ`WxSD@iy`PyB)mCH9C;jwJsfm;Xb-=lZgZ zzTqWUW=8yH$=82JtqbKe^IFLq7EC_wgy>zo+(_Kt&Bx(Hwr=e;;!coS?*gm<+y|%u z9ssNYJP23~_%L8C;A4O~-~gZjI0Wbf90lA0coeV=@Kr#cIZV=X!g~{c(kUi`MlB|T zPSZwQPDaPb9uGJchDryoV30y{B>4^xu`_+U&TtQ&nb?5kqWJyyb4T_K+ocnp|8ICm z&gTkph^*gFbXo%m98#-)CvwZ-%={)b?m@G_qU^~{!OCD5T~EFt?2Qig681BJ9fkE# zIvdVLG-X+#~g2-D-P! zXszSSZQnIyOlN67n$CKB{wF6QFpzGXM#K9d?HGs0cqf!Y%QOCjm;bm60QSeEf0N|j zOwUUCooc)tahmRQm$MkwG{c#x>O~!w4cqo?z!g!NtrzvrR~QTyWfZSOr)GSPfVWSPO_~-Jk>NfCiue=mc~EZUIEJZfFB+1M~s<0KG8^2p^K{xhMk4?E$#|$>El|=k2v}A^sxc`Mfzw0 z^{mvFKv49KtDh&-O9y!Nc|DVT$e8VECX$bB@Ac%Oeq@M5KW|(a`8V>}eOOB3I!7j< zuZtw4Iwboh%waX<85d7JSS>u4WA*S{PWS;tH&zeN zJeOnj@LcW$d=-4G9-e!!dRmjfv3j_(Xfi~Kp`OazBL{A#qaRW}Q_~B1;t7hxBb4+) zk$9xF!n7K>QH*=OoX=q+ew1AI!*^)SA@s~yXp1QeJ&x%&#Y0A)PSrdcQEQYI(&rht zx8`LLHkjjgKEYMD8M(>nletJbQbo|`c{gQ{>JS`Bmi>mWHRZf%o%8_7#cA2`v1TUF zNWf6$LP9eoCi0t7NPN_iGP`Y#blWim$|sqvX7-y%PQUzh+F?jenJ~`8S9ZS0xU61W zfTlB5-^psad5U)(@7r~p+4dyiuEC|aPEYJsj$}IN+;+#{<Hi|HVhCn4)t^?K8wGoC3((}fRP$Yg+HR^HrP@x^ zR2qMV$J~s*=r{6ttVU)A+{)0xZtmBSs;Ah>k;3KVJRueKndayUX=}uYPZ}1S*XAs# zt-*2~EYUE+0}vRj_zaDoYGJDFMok5YUvwaMPWr>R z(53!QVK^718Kw)UQF@v|F`~NI`dQV*#;h);C-SRKvhJGtO&f2z*&B)VbooQ!FK@kNmpkg| z*zUXG#=zR0-R(QJ1v@`yzw$Hst!)>N?|xuO<@J|TE&a=7)hkx6s#(3}^R<_yn>-uy zY17iO$xI{^im_-Y%1SFerBqqTd|scIb@&6`70lP=W3h-k>O-xE)$MS5-1UJTw@3S; z*W=z1akFh*o>*v`e-&fbxwRcybVsNs)TxC-JA>|^->(JT(O4*OV@L}}y#8o76bSkQ z(H=Kz^=Z+r8{Jwoq(wXZ(SW-%J)YdkpSb@jTeQjsR@tDjMtCfGIjg)hYOh>&X|$9z zh5{aMM373^`2Ksw_xFCh|Brq=^^e*5jOzPn?#B1up`onnibTA@nAX9a00PnB8-jF- zfZR7`8qJKueQqWTz5k~IXW2dOHu!`5)`C|_(pj3;;ErVwP;&|eT+rR=jpooL$_+ZY zW8PrY9}1G+$?a$3_Zj;=qrm?Qzdt1Xfw+v4v*fRc(X3cK=Qs0&9!UG`4~$oy3Z{)% z8K7s87iJ8<83oM4`Q+;lF;lpS(90yo@%{T}N?K2RY=KXH%;pw(09h6mtPLQN=tW|3 zTs#&Z{Z%S;7w{*Kr&42pi{DJ8=%w@z0O`)p@t>)b4*2tAD%A#f_gkq{FY$4Oeh~00 z@1{~ifVFtcH3s-FV3oW)qwguGSaxn^mhN)P!a2ny`z*!fM5k|PYSH$kBp^$EdB&E2 zPx4jh^BBpNl{c1EY_Oeob4f3|a>3e5S1tK0kx8Zj$G^hv4d@H2D=WX#x^8Y!f!Bhj zIo|{Fr`|}V?gLEot@jd}^LK-M_eby_0{;W>_h;GPo3{S~_&334-_PPdn&uw|-#P&w z6{3>v-^GQhe}&L1#g+LZS^RIO`Afjxk308Q$j52@V^-2{0I30dCmug}QD^mK<$JA; zvWj~P9A#R6p`)zoo>@j&^_@jVS#4kO#xgxnR$EtAT~}6BU#8WURY1PJtb~6Da}Vrv z!;YLvvUaYV^T0U|ob$jr51jMBIS-ukz$fN`v0|OKH6)>G7?&u#C`i|}R4R&e4)JLd zFNF(q4lfjF`aA1|633+{)fK}l9 zp$p`0!$C!T`&c1R_U95RfcJZ%RJU=cuDxpI0M+%e`bLw!o24=)+gJ2aiK~9A_V7&^ zFAB$ZKzuw8OL;t;=D70bDT&`D`BMFl4%Bz-xeZ+-=e0w^9TMIt;R6!>y@XFm_@acb zNcg6N?@3rBTR zbNiVOFJKnzE6}H~3h*quB`>{z#q!b%)A46ER)A<6$SYsORD5R37qfixT7YO*@sKS) zn~mm)g93cntl}?Q{=D=$%%;y_y7YTCeQtVxM>f5Tsr8#pw=r#jZYJ@10lvmo`x4B| z0(L$dy*QuzymUUumj5%R@<29yKBF&Hb4vkMbH2DOU>Bsn12^jwFsxp=&a>$itT!+H zLbf|EU1hC|6^G?lMbs!iT5xxl+keW7RyLP8P4Q0}lpl%Sn?tAX_=%pIj~hU@ zuuMNy9=V#+r}}fJv@@1t|4uGHbzZ&=dcJWz%H?fLm+`O#IF;vcSeT6+l=Le(m9ZZK zev}>hf|W|H9r}!vin24EpXq(K1@U&EQYZ0r`4wvU{7(Y;`txh9Id5tlqG3y(c$>`~ zKGkoFIDP86SkCQCjY9|M^Dw_m`c0jOS~;C}D(h$aG<13nq_L^-eCsswUz>*h5a{Kw zlN9>-hciK1+^bdBmeKy(BF}EN=t>E`?xj6&Pe*-NjiT< z1YR-xkZ<41C7{!|a@YH+Y2?>)f6B&8;2O}+x7t{hoG-;{CpzL^lk`H#7@o#{gwyA; z6?1eh$)91NcAKQr_5vzi{>#|jY3%$S{Bq<0+D2e5pObd9ob~=K&`Cabe*a0z(|!gj z{Fxr$6OukYS0^&#&(Z)7aXKeu{rptQm(J5Uoj+Sc?KRNPw^mH)XPnDVJ%1&oottM1 zJ8Irpdn6W(b#-*u+p(W$!@A9`=BBG#TrP%pk>2h8Xv`aN#X4Q>fl$yJg@h;M+8zjP za|c{_lN*V;++E$QJ=7Tvcw=6Vea))XtMd!FI{ZPu%N>chdt7+Y7wN$kCcKPtdAd3~ zd!S;%T#$@qiPDxQ^e^Jy?u)siJ)PTJ^jg4-d%N*kIu_|_k45=F8aLN%bhsRw8ZZ(u zELG1k?qRNm>o(PGY+45?6Nm4#0twepE{EX~){KVD%(cGxs`|QS*Hw*;S36o8toIyrnvC-Jm!{r#j;s^8yQ-U^5J94 zSRQsqHm%*~ZNJe)4r`Bi@yd|i3#t)hc9>=BVBXOKvC~X$O3M|<+KLAGXvpPr2R&rF z=_+V?{6SY&)ay~L^0zyxUGf~cUv7lUwY@DGm2LCQZ*GrAyey}#@a=Tj3d9$KYT39> z27wqg4;yAj2*upn0AmpWeX52{dEQ8v*@K~&*IrlOv@GV{F0t*wF8j7FKXz#PJtDc=*P}m5f~MA;@(=-ycA4_I|z4EHk}Fef<&r3eRAbMI@f0gdjR zmA<;)DUlsj_umlVMVeD6yB;;V_f`7pzUVHgpWA;Wr{Imyr+aCItNW*irM@Ox%I&`- zGrA5YQKhf$vqq(Ug%r&7pQ7)U`t?#y-H(k)ef9i+^y!&FuK(@@jeJ7=qoSUlR7gVZ z9fmY3gz+24Vb<4+bk5VI{uswHKjpHj;C|p{eRX}H$p;$aITue#Pg#60M_=797RrvR z=N?KvxBmyFzVg4iUecsKZQnB&&5WS_Fb?X!(pUGNYQKCSM?Saxr*ibwed;JJY?Pmp zaZ^$Ar$|Gnl;NN?Kt=ui0JVQUS6<-?{tI+$IF!D+@2#+twM@JSEQ2fkSHYkzDt&c- zsm-9T?EMlI3KgZV?xWS;H&B1aK*gtOSH;1b&^5QO_FYdd7cD4xflclIi5&g(eR;Le z=v9gmDtii^2Ho7gx}NWq`nmI+Go9>r&?j4J{OUS*_gU)GjXv3w;;4zD^p`1ugsOcr zRIzIo9gqem