From 05a6b9eb093a7a84a6e711d597384851f55da959 Mon Sep 17 00:00:00 2001 From: fredjt <61065187+fredjt@users.noreply.github.com> Date: Fri, 19 Jun 2020 12:59:45 -0400 Subject: [PATCH] Update file reading algorithm. --- .classpath | 1 + Notepad.jar | Bin 0 -> 36543 bytes filereader/.gitignore | 3 +++ filereader/GUI.java | 16 ++++++++------ filereader/MainPane.java | 20 ++++++----------- filereader/MainToolbar.java | 10 ++++----- filereader/TextFilePane.java | 12 +++++------ filereader/TextFileUtils.java | 39 ++++++++++++++++++++++++++++++++++ filereader/Utils.java | 36 ------------------------------- 9 files changed, 70 insertions(+), 67 deletions(-) create mode 100644 Notepad.jar create mode 100644 filereader/TextFileUtils.java delete mode 100644 filereader/Utils.java diff --git a/.classpath b/.classpath index 1de72ab..4f697fa 100644 --- a/.classpath +++ b/.classpath @@ -2,5 +2,6 @@ + diff --git a/Notepad.jar b/Notepad.jar new file mode 100644 index 0000000000000000000000000000000000000000..beeb2173944a12ca116a5004fefb4d8dcd7bf96f GIT binary patch literal 36543 zcmb5WV|1k5+BF)pV%uiLw$-tnRBR_5+qP}1W7~Fz9d&n{4mvvhY@F|T_xRpD&Z$v9 z*ZOha>$>KgYtE}mSsoG!6ATUx4vbJe<`dZ8KJZ{rV2YCJqD-<%QY`ONU|^77%JQ&q zf31M{*D~e*bu;Fl760#MMNuVLDM>YTW<{y6_-=$D5lo4fu(t?38#Gyo$kJtFG%|d3 zyW`}YfuX()1IYK@sIUgOcJ>H%wPI|hXVkn&Zxc6|Nyd{}WzA%ABG!8oqwixKfCpq- z*+c@%xXv@ni}9F8&6X|7%iy~h>p>F=Z!5PbnJMJej@+%z%86p z^$mX>M-3e8&kOkX+k*X%w}ty>g`^$G9^~Mr?g9cSn>c{%D1ppob|$W_Wf}%*1RA*h zO2N5`E>F>tGWJwhwLuFo-#x9GID&)0Z7`~kB)?L^YIkiawh$oby1x>-Z{e}@EFxaz z?rK_widypd6ye18i+n_~yVqXnETvP^;#|(;-}wt&ea?4%_}LH;5CA!F)IlhMk`Ew{ zuHeZ>KE$IGzc!-`J>nSzRv&DV@+i^!F@~ziR2_7JjRA`eypKPNBBkJ$tIx#XFUftf z$@H&O^6r+9T;mBgn9a+6fMY z;oLp^^0TJg1+|T_x`v3fVIkO5E>0pXo7<|VZ?#RPq>hR49fFIBG5qvOd0-G$5F#tD z90ax-Qo6MA=?y@vc7klp2d_ATvx2{%5Ii5+p9Es4*8gV&J&$&bIjPp*?yyB zl6_>B2SnJId~|V5Su<@M|H_liYm&0k=rf~viZxViO4{~YNf95gpYCF}*D{Yoi+&jY z?Ft}^>8iy0p{4qw85tMe&VJcNr`CSl(FMEaFU8m1Nq^N^D)eHInElH|N7pSe;b(h2 zjM{};!pi9S{yT%=&u#Bakrqm<(FR+1$!9i|9W602@q7`OtdmZp zT%B43N1D$35e~=1KHzJ+^_O7DzV{EsD1Zd71@<#+ zV=v663#bQzurCWcL?7_)EJdT-3vPn%6tA+x2YMX|CWy1K4p)&6h_xgG^I>g@P|1Ul z?O~+6Vo3|wVgMs!b=hDAa`HaO>2=&lsNp&SD}DlasS%hhYh=$AHzx9S)CbY5hOb?s z`7d7t2{tkS`j9A|)R5I7u$cF<8eSL%Qwy`SRZN6MqE#sQ;IIEBw9~flpBCVq-u41-* zu1nWZX0*f!Yy=}vB5Wjx0yZC>%z}xzG+lr{|Lx?_+auuZ`5kgV-0eqY@v;a~hCzqw zxQ70n^Vf03plqU=;?G8fX?7qEGW&>dD=nKT;+spevNS*Ph4?wghAVilHvy_3i(-!6 zOr?iOz_I^W+I8a3`XWfS@TDN1=`y9(e8Nd?wsdv^NBVFq`t_g99E~n+Jrtj&3`xE~ z;fMIzNZqURYJT4Roj=_8Bb^xJU37ndyy=|(yMw4Oeicjz+rWcn06iTK*BHsud(2z; zF-WAbjx)=jIwlw)Xrk%Uk?GjRMlRy z=IB&B{>|4V*%mv)QYT8kc23=99Kw{K#@CUvPYf;GfqV}8sjdV(2r;+r=1UC+myabX z!CvF_Xcd}M?F~ZD(FD!)rw>4y>Yj-;)%n|q%hjrum&x5Pyq?|DaAkw3DN8#M zqD;c5E|;d{s{4xsgrNN1Pk9J~R3F2t)$s%W^TYkA?`_p5Gt zxBu;NStyV|TNSN|;ycuECWa&F$bBGjU!H|k!6eR|R4y6o z7H&EtsK!G7ngWJOWePsL-mQ-oyE3YIn98oK%J1TtrjJ!PSX`?~{~BUS(=HY_PMu5J!xp zva{|4?T7ygXVnqyj|Ax@FOG0!`vhi;P__yh{Cc*e zI$BIigWyv}Ze;+Qt>JNkV^kx=rGvD!UsD&}LQm17*dXH9M4a2L^S&4ZDH!nOw{G(a z!gDlPo)R!q6e%;^TQC`U-Sv!-;oJK$5Z3oMcu__#8eL)eI)6Y_r-+;p=ca2#xacX{b772mqn#iO z-VaW`(Xig?ROFZs3Q%W=@mUN4vSU;AcRrAON-szfP&)!nt1g~4Z;W!2C2X8}r_c-A zLr_%GP2BEOpuAAue4&N~f>nepEZjxC;kkeCCFfbOP+JtHc;`+CKic~*; z`-go#z@sj3v1pqGbwap5BySY)8o0~Bdt>bpGc!q)y!7dN@&2~4bSMs)0nz$~{eC1< zJU2V+jwbGd5&pmwe`S|=KE*xdyO}kON8CBeq22@A%Bwy#>Vg`1&I~O!O;so-hig>} zPt2l;FwE(HWf<)L3(EWxRN{0HebtZCJ_;uDI@wd? z;ou<0&$o^6+1-F4VM)|gi`QrBAB zbt~C`#;Zaj#cjG@9@^Tve|*=~GU%SC*I0JF>`gJJP9g38#=m!zdzbh4?BMmD!u|%?e(7V3i^%}-Ly z%!9*XABuQ=Wrt`i2+k|hZVA;-?KsO$OL1z=@A1*&J6`&u)+`o(`g0(TrYAE*RHwlC zs5Y9Wmv+<>`i1V`wUyORD*S5Fe(&)R_NgdWh@r*RLEv;W!O0MNzQ#**KjHXEGUD!=ubV+Vtdsc6`p)>?6DfK?R;W-=f$bHVPSjG z!fHT#$v&L3Ix zP9e!zwfqfVq0W{6S0-?#g_2<2XHW*nVQ`@;t1(%Z93h@Sp+?mp*Xg?sF1TZkX84 z(?Q&yR4xJr;y7Iz*+oeO7B(C)(Hz-|lACZgp~mr2u2tG4=-Cx2bZOQc1=x)n<(&5+ zQQzGcwHG2ee?*k{!N*~%@|yVQ>bJU&6(2MLNawuUh(_}jmvqag!F%GuJ0ag1hEbh|S&tAw|8Qkx`h1cNVSIxa0&d3dQl0U@l0 ztTdv;z(u!g(X^VHN3Wzw;tNxJ)E27ggR>HtXtzWOm3qmdDsY$$IP9WZsKR7Wy@U|Q zT*8M`Fnr3XE1Q9_LwBJ5XSYq4SP7@P^mRg1rh24JtERRucm&5i>Ck!2B471-WzcsG zn-wcT`-L;Pt%0_U)J7IG1g(a+(fi@qA}_IFqK=dngA!^BaRTcUso52=OrT+`%@g|N zVrAO*4y8y2?Xg*x1MKQ~OgFbz8#gTb)obo2y|}GPgA)5zgAyV!Z%%hq?D&i>CO`P9 z+M$ZH5RD_bIgaj)=GtFqN+NOfMYg<%oL%uAwyn}Ie!eE5QF5O-zn2zD!CWj?#%T8> zHumN}*kY#ZBmmH&ZC2#DBWZXq4^w5X{49Db!;5=)J#$SNEVw%~&`;uwyrmN5#_WkH zco11sqoi45sK0~l^hk+GSh1;^Z-jab&d%4`%>=B6V%0i@7WeXF3tF|!G=Ex_X~yTM zQ+Dmzs+Vost&UMn1?|soar#?R^LTKgxlEN^%@Kv9@8)*=a$&H-t>^}9KeIWh&WX%{Zy3;qth8TnxF?N9o+F*aF5otUPqW~XA!eCqCk z^YQ62Xbge%rOa>aDY2n*zis4)fpo{uR=)(1d0+Uf3D*o`h!?x|5^#)#9FrzLDT%8zIdr74!M$nvv(QpaAg@r5p7P9{nzY1t8*wrphrniUKpacy9C zEz02dc97_rYJXa5x@2fZ9=nq-a?dq!<~Fj|D(O6un3oZo$$BDk5EQNB#x|+WYqs`i zE%4&9ui0gXS!_4bb#8t5)^ZvyBuL1uW?CELp(|QB5f~?OeFn#{^GCOP|BilbUMh6LuyEd zebre@wRGadx9vvDlfNY>b^ zeK|qj^Cjn6#;eA(?(Al7Lj~cP%E?z&Y^6~QS9CTl+FiS|ml?)Q>rHNu+oZmph8|hj z&P<{TYi zS?xR|&)`OJcn>oa%(IOcB`ELm2^zwI#C{aT2_s+XZ!ECk-lP(X(?>{PSOcRp1D+6& zg(9QYJoL#E*6_JuODeozr`8=_^&U_V3B#OVkJesZC-9U9Se2AX46HQpiu*bW-;I^L zWfkfH0P?*c1gSi7aqv63pSS}nl)eIaYh+K5nTD(s@EAv$lyVRn(08~YvU2?83uy0nB0A`IpPE)eaTDrjzuoYynQ;r)MG3SIE8xQI!`V3D ze0SnrJHV|U67RrAInosvTH~91;0epQ;R&b%?9=8CIOiVZwajqlH>3DZ>$~C-8(R}$ zp@{NQrMPC&h%i#wFguB)*M1WtNY^X(MGgZ;$7rrj9VzzLS4|?HYMqVjCE>RJY3jSU zX!5-S4O+mT#Njp2T_D0&AOepkq0@^P@dl#$hCKa%Mms2@5rO4Mt|u7#6>#B&MfAk0 zcZx%Z)GtBe9|z@X+VJ^gzS5lO#c5#e*PX>Z7!#veV40~qftRk1a@xpYiT2>#cT1-z zLKc$^n;Jt9omsUqXAr`jw%5M9!Z-orLk{D^RU@vW8Sn0>Zcl_ok7M)+)LRlxXb6wF zJXeAakHmMdJp=Yb?}pA7vK0OOyx{`m0!*GLmch6J^Z@iD`L$O(Av4R_2)lk+-}ld& zF6Y3WVfE=J&u5HE15UPnw_iH7`;q;%N+z~ztGsV>qE2s>uFrY?>!i${g_^Tf?k_t+ zzeM%b)PLM~TNH@M51iiQ&YyZSEyc|$uj!<8*}?ez|ib8C}5AR=y*p@WyT{5Cat_A(ZZPdSw)Gx zDbwOWmEJTedQpLDL!oR#3bY}9w>aAvfxSOXw-iHfF*+GfN-r74>ure`=ap~D+2~+7?}aE zMfEeqN;SS@GTXtf$~>b@(+?#l-o!iYNl7-VTWn`(rhqQ`yn*sX5ad|#=WBgMr9F?O zRK0_Zq5DvOL=SsdEt12UlD)ZGr!A7BBCBNr-)6$u)-u1{nBQ)OaUsGmY!7HC&nwS6 z832y_%q=$zu-E;D%@tjB4O`nt9x&Xrnme0F36!i#8J;{yR$RjS<*Ls&R?Nqy((T;? z>1iSA4l0()`hgR^e8)l4vEi*Y<>AhhWM{PED${?p4J5 zPU6GR4a(DJT4&wn+#y;6=y?ELbOJ+i?;;M$2!LTiA?RIroNgGJ3ryOQUrdpPkpSFF zmWsAYVYl$nKL?({TDTgq1j`Ym8LB$0Tr2MwK7EY<2?(9nwNyjRlSmX99s3NHnao?TckiLOstbj1^?yHg*tzt~A4cd; zv9|RhEOJ*;$Qj|njy0khclrz(CG|jsapuIK4g12cOorx)W5U0e01U!6+E_}w!V*_emSX`?>f zB;ItB$sHD@Av;m3TnBkh%V<_^IOR(?DiWS0v6rHpet2zen6~G*u&*jyXTAF7@n*t; zfw*}CiuW2jbJxf|aN}nLJfbK^n0^=`_e=tc3Hv%em@KTmS?di;vOS^|*RVbSoHLG2 zT3I!#z!O%+686@_{8D_MDYrMnZ^#F1-TOPEbft$e^p__jN@e{=+I@lNIEjzI@~LDT z@rA#y;%8u zygnXM1zK-VKbQ>-s9?Y=Wa0*=NzIJ_zj3JzJ+#=lmlu zWHxj6i7#QsAw6L+cYWF!gsz#EXL=rDTKF9UH=Ni!%!kQA2+~+Fgc;6ZNA&5q9zUR< zo6xZ3^7j(`B?WG`ih}UR+3JC~dis?`&FV$>yqb+u&P3ci4u{y{77V7Z`ZXHV`Ae3# zXS#RLWu-m;0pS20KTnm1<8lm}-DwAeol3aK;amQX&V=&7kxxId?bt zI>d<3ZL_b{Js#^~1)-UX!8t?iAkwcekd`ROz6*^k4BeO?my>bv)H%rz_hZw|UnLgF?D}_;JuRJ$j6^{f(yTJsS1ZV{zYhuZ9fGU(# zIU+~w5>C3N>%Is`s$019ihQ4ZD1!rORC^dGKQA&hZ{O7lQWc#eqqk`3g#&9mb1l-z zENbFyya=#pNXgucBD#H&P^!ERW+R`Bt0ixj2Gq*3?})6|EtwccQY0p#F?jNtS{zO^ zl}CiSbgk;o@?{q?-eX!{SPg+bfqiE41MkJq!_ww2X4k+?@$I4ja#<8(M{?&QyyUc3 z*V1M`wBHoC&;3d9tceN64yK7a0z>hNfJGZijgrlSBQ&-e@8(Uo?%Nz(vb{^V&lBC; z1tuRB=<5`*Cu(S8h8Vo?N)PZ$UUC^5k1L}n69>`?2Q)K>mbv3BZv3y&`2NHA{?bGN zsFTCa1tey<{%UR*#Djpk=Fqr>OV=e6l6#sr;lH|&>&3=J77`517yAEe7yc`Xuva#a zhY-aSJgToJvCXzHl7f0}v`s?m#gmi`ZhkI?60GMt8{@<1Hv3f*OiX@OM6!?&eL01V zhBVXbIoEqS)BAXIcR@4&Y-d|gnIn(FdW%Jc#DcU1&~g46+9DGlJC_~3+Hp=9!1(0# zJ=J9Uw`iW;1z$3A* ztXAn?EhZk01#oZLandrI?nO%#@H0%mO(%Y9=*XUG3UbFF*x*PCHX)Cr=fqR9k(RiE z8w^Rm3MWIso9ci0VK|eP96T5apGpF~qv1@$ zZENzweMO_RoO}!k0&VhoQ!KhB-IS`~_@OWOUq^!8zkaRxCn~uAA7S->0wcxWfKk-U z&DzmH+{(nk5@fDm?dk?{0J;1-CXiLb5XF4wi&9|Ypp?Ky+f+$ugu>E7MMA4?47b9< zgmp+MWdKmK1DC;jUT9vSiS?_M;mTmATly!PeFYWFReBU2xBDJ@%TC7|8uq|ujOl`D z!`(($YaJ-~q=4lIHn{6<5>5t_@JO;mbg>b@A`?~E@zmsHdYPqH)hV77MnLN+Ddjqzm`(*P zZgDs$M!z>1r;U@{h+6S;+ljiQV&9ZQwuh{j7Xo!2PWeT7K|wRK1EQXfmwn9=V~;kl zh8UnRRoKAyOIMUp2O<3>w;U5&nx>1V%Q=D~J_i5NWoOtg{7H5wE4Y;~r}AVbdfzKh zC!SZpJkr~DN`kbP-u7FyN&XQUF}u}}=5q{yXj};~UXA*e5RcKx{6=D!T)cnY>L=~I zim2qUOIf32T+t6gL8JEbnRLZXX(G&$Ja+=iq{z4DTNxN&gX0^yGl~Iv-Zl-X&HaW#A37J6}(K z@LWRu@}y3Dyh3N!#G9yWD$Z-;zYUbQqJ+W6gt!m2LJHJYV1kjATaF`cHZ0y|N)B<8 zQage*t`dh*#ejvoOo}dAM?_xyMa10r7}nEn(jr^0yv9X+-bSme=yyn#fE3xMCThXr}6=%G9Sbm>et zJc>0=|31RAB6h#?64BNY z@(1%HSs7LAQYTTO6+6=03KrN@U!d0-R+v%>IDW-!xSa2s)YUFnmV{{B`~M?eRw75~ zqWpsyS^pI`{u*-mx1f^rvUd9?cKj186ji2`{!I1=su72&7Lh*$$H9|j zCZd`Kn;03d;9Dv33%pWrE{=pPc3eZg(jMjMrj06G2|nh!ekw08x*`EXR#8tr?VIa(d<9^TQ>{I&!x-n{Ao-QNTw4Mn^i&!mKVe@mi!&L;8WGLYR|w|#i~ zNG0L(siq?>S`CZcI`7eL*pIlUz#?r213irC*7Bim7?*G@*vk0L$TO|+{13lhSJGj8 zIxLK$aaS5wlSGmqZnK!&tTvRJswg6u!tG?}IISLz6!Y)mcHIasS0mD|Tnmaw>nzKK z+w$aF*6zZjivl{ISuYogO{Bd>;KlG=&+1s7B8O6Q(wN)NB{h7EEO6NpLuv|$q82?yQ#p>J zr_k<*6k{zCma;^8g88c*5}d}NjsKj`um5^V_>iQU;ZdRGZn@ zXj5ozJUhS_;yl!=&u_)Hv1;Z&Bu|_%yJT|K-Ta(QM%=zb`o&=%KBV)=r?}cn{0XpD zpE}gwB>*QekXUtDqwMBI!L7M;0@CU_z!o3ODrd!OavDLcsSG!k(J-KU=)TCl7QV@r zmRY%yD~{J>L(y1oK)i@e#(OqgeV=gATNA`e>=#69S05fC+G%qly2G|G(bHZSuh?L{ zo*8oOG0yxDPWfW6PJqd$rDD*Kltw>O9iO<#g6Yg|dq8EVvjK%=?fBAn3;V^KM;Vv* zRTserDs7j2bYJ%_p>BKMk)7|&mne~YVD*Ecme}R$#z3*_X?*n`Gfl} zh=0}MM354z#2;v0`6B@TcWC}!YVlt>Fids(uaOi%y@(DEB%n3fv7s)c5&~yoUyxT+ zFcbo`=!z!|aanz?JIJxHKMXT^1d?Pxnk-(vT80Td-NWO-YA!40bp47%82l%>i}6u- z3~0x#F<1}T;V53-b$wLOZllA|Y?>g@=z2z~aKBH9{ruFKJS_N8%9gH6M?YPa zzV_Fn3x%{ZI%BY5;yc@Fm3P?!!UxvEu2!Y{odhQSoBH&w8(XR=DhfNfCUCXY1nZms zRK=(aJ-ym|ng{aHJTOa8aO#$A^~lo{`F3QOeodgGek?AQrFrTH^+DbrnXZke%xzRDQC94< z5<(-oY*Y82Pg&V=n=%cPvvZU6OuCJZh2y7K?AX~{?25lYZaE0?PH|S5Kb>mOsxnIi zU-#o*_}MuD(?zLMue8{|^)cRX>|^xGIi_48IP-7s74q#h-KVj5i0Yjp)rd|Tu_o++ zI8;hFOa`;5EO>Q^PEb;H7JE3z6&M!UzT48}n|ilz+u>Ir>u%UAzM zj1deysJs6_(c1r*OZiWB{yS;>A2|9~W~^!Jgz;w(<*^`(g+I3L0Bc?yw`$$l#ZiMh0Pdxkk-IsZzeKRTP z@pXWYgX&hQ)cDNL%ih!6&vTu7&vU)c_fxPq;5*@-F-?R7oL9(Yrh6xBYv9O<7j3JTsc6r z=D12H-1|Zhd}c3=JA0!bpbRf2 z&>FUs9UZ&N%%a(uO5C|}-9vIHQtrTKne8hQz_zDl=^62ZBGEB%a2X^GEv_@sD&a^k zM4k(7Mk$59Dywt2UL3kfM23|`){;iB2efs1Kiu;^R8k~QDh)3J2s@Ces#7?IC; zf}zBZH6jM>zha;zIVo;0Ib)9Frq9^bIoJ2Z)s$wO^5n1IKp2`^>4JGypdoFdiT}=W zpK#V6m-os#!Xl!%u8v>7?uzHWE|330sqJ`V{_a%+>hZMNLv+7u=V3iT#g!(R+d5I80~3gcJBU2 zO{-|mpY`2F%#D;cSkbuhqcK!m7^D^A;cZulrj_e0$5t{Yva6+1n{Pk2%y2z)2X!v= z`HJaYMLJVhNFinTvOLUPMFDPFo}8|nv{=s&*;d|cOBSf5!U(dbS$MkR3D3*ZFynKM zQ|(5K&veU=t%r~^I4J0}?qlpIuvH>ODbkDGVv<|L<4R5F!+>%rREB$E>wvyZh~vZ} zzoN2O)q)(Ee%~vn+066oTPu2Co%81cI5Z21RD8$ymlatrc4_g6bFN9|)hy*>sfr6FlHXVP8PSY)m=Bj_by| z_nR5eNb|qp=``4vx?Rq!_(8tj*U>mIR(xOy;d7I{)Xe+8|HB8+yH}Ld_+!fu!v8mR z#`_PYsAl5vccEzSh%SoipI$?lYgv@K^*cWLxR9k)chBYmwn@>3R%4OcU*EWFov{1c zCD=#0tb82xJ6J%fGj=8JITbhi%gm3tnfKpsZ#02OcH_Xf&)GX)5=FS;If%8jCFVlS z$fE54-m{3=jH8WqrlY}e8W@row$y8QGt7_8b%m3O^dxu8EI#^NF{=xnpgU-B4gr^t zpIuQAfE$B#42@kZp^#phvTJ!_6bLldnREtvO#9u5_qN43y?VD{dzkS~5#cQ6fC*L& zRiwd0+HO^KzPdj;@j6>N^1zc)MVdfIWA)~T*m$w3RFRgu!0k?w`zL5jN25^bYLg>s zht15iPjfgDxt2?^7#mKoAg|sY+B(gQkgZg>BZ+R}a!+m##+JweFNU#e<{TutUVvlh|L+o65$Vm z;NNk`Crk5bMRLdF9m&N$AnKDI_+)wc2u3i%%G4T%Zt2Lw*l~^EO*=$6 zszT}F$hCOD`3KcWGWw7p@IRqDYlPiEv@Bg@5(t*E>Oa0LZbN^K;{{0sJmrnRcG5*Vl(%g2%&>(zo zr#WxmF5`wPV}%e4;;@(P#ImAO7E4NPHCEG=1J_Bm?`oV3pDkzd>Sx#;MWind)WuX0 z&Bo3$8G|Kpx*ioC!1GQXkO9V~I(pHkj%U?~Ch?IKxkyM9auH z4JRj#6h;<_0gggL@iWnt4pq<+;AwY?&TW+O)D^*-g|XEX3+gG+ZN$J33CO?^A*9np zK^r-^OQvWIWypHF7gDr%8fKa)U`0kEO-u)?0G2P3BfhpG^6IN8HzE-xRnAm1Q8}%d z7WUYUb9rS-8m}bMt6w1qg(zwfXyL7ZZ4`Kd#n}c^XnC|V3S(Aou0=Yc^6*5qT8CT- z^pf^yH$1C5%sbB2!C-V&l(UIbd8$iU#+oiyZ1|0aV=x@kUJ#$AR$koMG|l27E6fGr zEF}aOj(9l`Gr4)U+6BwefU6RwIi^!y#Gj(QM8{&hWXGm=X6Smzk2LBvg?NvN)mqe3 zUOrz4!(7~l*o0cL9J%+99V+5E9@yhm+{DLv-sHzVI!leg@`%GvJ)x3J@=WLX#kxXZ zZ~420**%+m8&Mcz;@sgQR6R#^VR}^lOAIH8NTm{L}X(=WJfEQeuAK2V?L0_ zGrB3(KjEF}%LobZTq}%iaL(6WuGOqNd^SM4iHmi-$qNK6-|m!$LQ2UTSTsLK=%+a& z?ZtF3n_<#{mvzQ=!6<0JW87XsCo`7@7Khqg069b2Y2bhk!sDTtQBn8}p<*kg)$YHb z=E`^pH9rLz=FCTq#cAX3yIP*0wkvYl0IHd~lsqQw`3L#4V-YHQSYl=Aigm#`v72D* z27a?wPdVwP(V0Xq9Vrzcf+lWH#H#Y6WPX?PRi5c;H^EJVE~{vwEsdt+i!;;9&+@9% zILvyOUwA8cv=%%@<7unW*3Tbayv@l+w!&3t4)>2K zYF&gA(d_1w-Y0WpyX4K^FYlf&+A$Lqz7*3$ohh7Eehyag8^-;qs4eG zuLm#ImH&>$lWk(W7c;}c`gM+F$uwjP$XU2CUS;ai$(Pck&6Oz|0rVm_sUqxgn}l-$ zp~;-GS|k~1L~$v0u~R2iH8}Sz!@JjK@h$%u6r1olzcIUCW>e$x*6 z1jy~oUBqjz^b`^s#etar19dE^AlM57y4UQ!d9@L<6u+3?u~0??!9}W^I!s4U=lL*) z_Pi|53{ZB#ts>QROynMqXTI<6FcE(&{msVT@@fNP0hSkt}MCN zjK+wh9Lhk8?b%S_0a!h{j$I(|M{1L3kT(G_uj^xLRYBsM5p~3dsdsI6h<~s=`DVN; ze%m}22%}P0VxiPbaA`-tvg54Yz+Y);voinD6k;y|yB$etJ3_Vw6=p9cY&#~~j#sgP zook`zoZhw%ad&{e9W`yoU*D*?Q~WET7D>3tpkvm@IRg3`(RRF{7P5cwo%zS$l^w~u zx!+R^5h)?@h(&Y-@iT^UB8zEEWF5J#gdGOdzT=bRlRicwDQW`BcDF>UTlW~83@PHwU`Q8Oi zlhuldl;?`PnSMGl9H3hk)T$B~tu$C*`R!M9(aJpHx$Yn_4Co?nYxNCrKL z-!->RdIb%+@NDuyLp5p?AvmBJLnaF1`iJkb}ZF!0!|e z0vQuj9Yk@iWFGUG_$C0siU~U*aCi|aev>C2gG=d9+Kd-;K!a$B$8~PhQ|XyWmQ?`X zs+)Xi&6a=T`{`qbl+AYS{Rd#Sb3g-N?>(=@e!LWnaC$73#3*Rw^lWt8>=wOb_Pg%?F;W$3EcbF#(y(1ES$-eS2*DB17 zPxtHcoSll#dsv||a}r><05fxlDoB7Ds(jW3CIi~SIjjh@yDYV-5yU&A*Fo*{m9i&D zHk^r5u$SGY?6r8UJd z7CKHoU_jOAj)(x>6fO#?Gz^!X7vjjTv-ex5?E#-!?Vk zoy0T@lW)cSRjUu>=H(!q)vrT*d_H&eU!K2PXaxvAzoCE$K8cQvB7{0mMr2^M?qflt z8>TJR48#bL{SNa|90cj39l9SlX$*qFFvt*8kFZLGK7k5h45iEc-W`=`0_s>q^wT|#jq$9;Bj?*1g`@B2J&U#}8@P;&1+Xu|>SWWQD z2Y5`2(qsN#7xJdjS0?h?+zrK^3$ymol}6n{KAA7e?_{s0s}2>95`E<;?`X5rwa!m; z5<=HoU2CgsKahCl9~JmW-~CwZ+DenMLVRP%wuSr{S^Njy^{+53Gv8 z<3JTcbzWB zoQ+1MH;N&vo^T6f;4l%8V{}c+)AzCS8t+AkH~|hwI5URbcY`@X3B3^>Rg-5!nJ>yrRMk)DoS;)c|PH~Wdp zt2Ap=NVVj#3Wwjk`u#GHGpNP+j7%Ir6%?J>?|4(pzR-m3pzHFElg6g3k<} znM^ur1d3-^P2locqE9FQ?Td0#2Yy%H9>tR+xtTtDd8brrUE$e5=w&8H>WSD+P)Xcu z^3J@B);A~|__WZ@y`-@t<(TbItt?LT6V6$gQYauftnZzcQ#|1a2*Z8MZTnz^55ca{ zYfJxh{6fwuz=m|uLHO6FRCZfu=E~IKgOPBQP1>@L#yEVdD{fXo-lhO@y)uKXf^xIq zhb@X7kj-hReCF1nvAnEgDtV92SG1$L7{Ylz$(Zp@`-txDv%F1}TOZ%(AR_^VbMiW+ z%I$umNxLPN&66gg*<$w3Z2;#SK;HQ3=Mi-;`+K6>0)1VowU37WdEgy&*RMmlI5mt` zEW;j+xAEQT61sS7-YvcaR6lCHvl6=Jx5F|e{1PLmx_c8_iaHEXeOYzgn^t4{gUBZG z6iFmlYf5doeWR?`2Bx}4UM&&kVYr<5^?mdm$;s1qKBal{W$<;5YXVGj$vex`=GC8D@yo zV>jeBB8WQX2ulx@eo~JRVlt8gz`-Ty1_SIdA-=z8hw=gQoa$Mph#9gX`GYTV(Lf6* zVc~VaK9=VON-2d8mLw;l;H!wB-T-fVq?8BZ>`$()O(K00Pv8iLLJN;WGnD2A8`ma6 zyEeKo8q=H{B2f0ld3TYRR>1RS zC_S(8KVNlPKA!v|;!rpO5ds0@PHQ77x$M?S@n%rzQ7XCIPJ;uPQSb`cnL}=bIL>t8 z(>~6UW)0b)y%wfYdL@~hPJ-dQ_H#cj2w)u8+@Kolg*oR?=UF;~swZy&yq5Ok$S1fG zKI8n&bEvajpiw7UM}C{CzRsc^jZT$SVjTp#bsf!JhV^ZAP!~y9>iarRNkp z8@ITO(zZ$SoGGciBVsf5NufifL$78!_;E}r=MZC;dqXLxL@$q&ucrDY z7Ein$gw76EB8K(=5u_(HHgF_yY5x%~VA_K|t4qy;UFV#~q43D%O1`?B4oI2PskYTW zn^OISWu*9smPIe^kGlf-2z5!}SV-C!3Ja4CO>7!gWIMY!3xK&S#8G81)!63@sfky_HMJ0$oN){?iJoM@F(g!dqHeFfF+*X5qso-u9w?lgdsK&(@`{n?o5Qv z6XSSOe~GmS__jdKdVl%|*CN#r>}D?M?FOmz?pUyNc6qkpi5I%0To#SsMgWjrqWBEY zMu_P5YoOku+M%p?`SiRdWsI&JlyI?b@NU$U`o*(Au**}UOMP_5$KlV|sBgblT+uZg zFK+XBfY`&5^<8b>!wwVE^8@^Zs_e7BjcM-K)Jj*|oL!-PuCAsH4(qZ9#`bV*vYV#Z zpf&T^!+o-{Pw!85clwr{et3c&Q@T_!u1j$K`AhLE+>(5df z_~{>gq^3s6uUO=M)Zk^FCR~FZy@mTQevZiHr(fdz!zm%%hK_ucW!!{mJoo*oO@Vhe zX)w6BeJB2#CP^NZH6`r}75j_gy^Zg5?d6*=>0Myl5x|`Yb=uk$$)b}>Oi*(=Qti`l z-Y4*^Is%1nDP5fVTynhAB80yzNAe7qlr}Gwtpva^SjlWtMLjb6-@T#ogot*hFTn=G zL;b>qB$z{oOVK5=f~eo0mU+s42Jv%hj^I3ZD*!Zcx-<#u~$_aO6cr8~>DQ$DTNN4Cjqujz^zN zwqs;4excs7z#~Z){stGb>>N%-z6HtcMr$p0OBG}c@OOzyvt1;>C)eyw$vbJlt^n!!=$`i5U#|37bXUo#SVe91W(_Wsvu&`_8`<^V(sKO-3+s8?+EVEzWmflMEAg>qIhf$XvTK#e ze@UiMNh9S9C+3_v57on<40crz^4Ej4gNbC1gyuX}zMj^;VnSv6wk{HHsKf)4I$}Oh zJNUud*dmlTWSnhZ_A5_IoWy&xufn>lcJ!f^737)H@2!UB{*sX7s#zR zP+pkh_Q8YbNJX>o1K*Xf-(_?^O%-GLk{dj+Z4E_G_t3qDi+dIY4Payk&z^mh2VYdRb-tQ zxES^?VQ`O*@z~!fEf{Q16<^}$w9b6Bz^++>NKN{}s4j!bV%Vx{9ovs5a$D6#;ATrZ^tjTBQoe zip(wEP%n75mTgK96!)7C%8{U4zZ` zrG#NFLZ?@FR%m?m=(QUA5mL$+$QaX>rG6huiNicE}>ypb47OHBwdczE(LC zvZgZUeH0K%B*8+je1S-*ggG^ZYjSJMj6O@X8~BM*SL(tfsxi-fIt4!{Z`2He)qW^D9@T-h&@=QWjtaEJe)x9^ZR0d#wS*@ zHS9e57GwN{o0RY8QL5_W=T+Xo>hd8bOzM;8!QQMi=nbJt4lQ|WjNtzCSh*^aiCRkS zEtos@Et#9pUDo?~&5`B7N!I%FNV<6h7Thy+&KqVbZqK9B2Q_P_JJA94<{RAx}oDJF(6;N^YwUAd}zZXM=tSeWY(SPe< zbmuqhrr!8!g4AE^^7V*Uiar#q8*8%6 zFu3kC+DqgIaOI<+z_bEdk!ny93>&elX)0^BwgJ+q_Ix+=3b8DXgrUaRJ56t|1LmA? z1*Gq1xcnuQ0|ZW=X1X7K@a8sJZt%P7`{<2)0wYF370$_i8Thw)^=r_@0ilH zj;p}NCN@bZUcm@nF8}3}G_Pu2n~*~&iQ9(y2Z7Un3 zfkrazaygXNggRYwx2Bh6rwb|ffDN7im|Uy zIK{!MCL%$z*oMPN7P(bBV9>OmeP#QG3RSK?%@EV0k52Mb)5p+6l`yosF!7BD4ws_5nfsH#b<%HmdplI@u!X_f)7-gVh0+fG+U=X4$-Ur^?yu*gM#L)cM!OaEY&CfL*o7eq(b&;-RWq79M5}GKA=8 zCloZ8(i9V61Pv*5zF~VrL~?jMLw=~pkHF9PcyD_+EG8`dIaaxDtxr52Ts*-le3_8I z^Qd6-7TQDokS|apeMkgA?7&ems)|sE4i{nays#+{&kg<7Eb&2V`?TX<_Ife+7v3iO z=q$nKuv%(;7jPduRQkk#2%n?dAO9rg*`?uGyyTl8RGJZKPg)vXfy2`6nK9$IYA0r9 zkx*eCsvV>w=*z*<2)pH{27Bu6iB}hENwcWjQ50sg1rvi#a*ujQ8eHrsyG?IFC%wo- zE^wrAPJ{@xjroE5s`HR6<|Bk;tV7cVuQ_c@a2%pdZl0PUfjljE*W>4szVL=EG@=>N zY`h>JOnaTr+qSMOMgHx^5Xmbt_X=O%zd=qJ5uyXoi0pzD+L6xi-9sfpa0S!5l1AoT z;9%SUM|%*AwH5G_?qS9D3t}0hj=)vD*u~`?CGU6^B<+DGbbqV|yuLzQ*8UnmUeb@P z?tpci^#6I|m4fA;rs<+A5+4E=V~}|j96CY9o2UZ5XaT4Vjh4POYCfXR!S{4Tdg`#v zh09?-C_TN$R57XX9)WlUtBjx!-d5C^=I8I)-|kmWJv@w!X#tIHDqz!x_E}GMBS%C!=gE^l}!79ir8Topd1aM2kf=4c2?8ISYfz{`s!^M~jjnvL6#@3T5VJ#3A zdmpo34!Rw?nicha9gJHUyk(&M?%U#8o`Ubi@dddShvcvnwCcW$Dp?2a!2h5wi3vlx zO<0j|IC$}*$aHp=_)|cCjwGcuWI)hZl$;${_*ytGuoEmYz?VJN?$L^C)Ngzi(DKca z{m#c8n`PXl2VP-jItD!|bqV8mbxmZZnPtO!ldOFF>rcxR9u#*Y(mRS5!wwwx z?eHcP|7uirvIvA_6N;=FufQ65_**L7`F1&PBWFplW*3Xuz|jFF;tC(3H?(I_IzRBH zi}0L@E=gP~2(9@ib%@U(kp@lgDaib(_9#D9Q!W_U-xCJp_0TCUybnF8qry>9!d?D6 z@sc`qyF!Cw`jPm6V*C*Uys9yE7#%L4O;MZW0=8cByNg)Ofw@iaat*1IS#gaL)izhn z5Qatr_;Q}8O=E+!K5La)ORu!^7i<{6qqMK7_D!52R-8^6X07jAOB7>Ijq>u1(}uxn zJv?MJ>}pI5>VO$Flqxue3q*~`AGJRqP)<`q<=$SVU6_RC2wDWt|214XlLNtyRQI0*g;Phxnm? z8Kv;LczEre+<~BYS<%_(hdF2aoF5N!u2GICZ)ztlp?tUXOTvD@CumjhkW1E2nAJ|? zzvr>e20x@L4c1zV1vx2zEY_}L0PC$&Y3#r9ReCB zPpyFQNTm(#30Q4G%hH;imC5UErf!O0@vVzuri^en_-roi`mC8s*+{!F`zXI zwj56#n$Hi7TIHUyi2m)R|S?y^CuhaD%+ zlMBwJWc~uZP&Gu?NV@?a6SX{27pRB9i0r^uPixRp_C|3+wsTi`J}xG&PgLE7q3(tHa+H2z6K##k@@t&b+_NgBlq@$;pC%W zl9j@3`_0$F>&WBHxwkl;pUU9%_Ha%Kc?cxli=D6_&p8cO;T2S*e`4dB8^NH8PUQ!` z|ENji6?DWt4?VBeZuL{PcG9GuQ2S-e>(JD*`kvEd~-#&p{I5L$1tR5)e5FA)a#BJ0oL zfJqFX1k28aKlq?{ufZNxA9Os+*1gOPcZj`?o0_)9#Sje5nrEZF3wk=^-5|C3#2#zM zO9GM8D7b5O*YvS1&1(FIV5;E)_A=3`<;^*@pL}OM>V<`Sb1wj2D{gd`!=cIN^x}Nk z=Y}SAb>vp~5;yELmiE@f{aXqv{s=JMH>Gj7!7UGNPhOI}RoW+COt1DncoTQwe3G?G zh&%qyi4k_M1iaZFgzTkAXSI(qVR+}~efFwj0S3iMNryNb^_ z5$Ru_MfhAr^Qj+eBGMxV@;`7BTxMh9O%;Zu#}3$WbJKXp(n^+ zf}stzm)wtu(ep~un*71Y?iI(Af4S>-gJ$34Umv6^74lIF)uOHB9L=F=0`(~V%UQg~ zBTA~)dO7qD8gF-rJgxW%mJiQ)l1`WP_6r@Wvp+c4m%CPD2X1o!8D69#Z@Hh_u6V|O z1h8{yA6^MfwopvrnLQ>+2K+Gbe*7fJ6FV`ce`QA>srBPWJoj^Kgcr5@lVH-S=p~1V zC+!H{2TzUszPkv_mw`U7n{zGqM~~ zE#%QJcRxZ$tc-mK)z<;Rp=#0bf0=J}v>e4T$cXC{~!dT%`!I_v+YG67>s zo;#XG3yaWO@=kqn5@lWqjiGtOx`oL!i3#Uin+PVS>8ZonRCe6_M9d4JX@4LImoX)+ zgpq@Af8hSCJtu=0H;`0!=*?V(G+G~=AU&|Y7|P!s*lvi22T2LeFyU%5mVny$cfsKC1kI6lndkE*+$(pAetcFC4o2?-hiQj z7}~pG2GU`j0+ksUn%A^*J!Cp-VO3ye2E4JOz7;ylWQGax6pDuB`lMWTJ{QB%~l4?y?toMZdA!tAdFc-b_x0>?KyKv z`}*Vw#mEn2?Ux*mUEL`z&so~6=vtjIO3WT0lQDVFUqzYxyH>q90}=|zaju#wE05y4 zBJ_Da<-=9?t!u8Dz+rD^Rqgv?_wEHIc{k*Goad7pOs#qgp?r2U^@G>zQ+yiL6?<2g zYg&X5ReNj9&=qvwFh3$M6SoPJ=%4mclWboR1HkrRAty@Jj30D`__lI5C=enc54MSp zk_NV`NVr{yUB*jdFkPNnV%qqZ*L$rZ777-YsWTauJN1N*AK#`-< z_zKgW1BgAHXf%_X(|5Y+6DLhpil>gnT)}uxdkxb3S+}n|EAfHfmq)Nv@E6tHRS=)^p!3U=y?#k}P1K1|9 zo;t(RRXKK3N^K1bfv@Jp8hF=e!(n66Q z40})c1e?SKpe`gpL%(vmhtS<_EV2h)X3Bn9%J5%{>9n88*q=GMV1%_tD=^7uPQi)q z9ga1EHOwJo8kY8C!p10On_Euf-RA6+CN|B;^rQJ~14FooIrux7QNlT%pfkD1?# zW$KdzSuY+?U=T@Gbkf`IElglpAYxk8fp$(NAwfSa?@*bShjH*u!Ji-g$8ZsE$=kcB z46TWBSeo_7{_v3sbbbk??W7_)`P`z9D?@ZqapA^9$WfF1(v0%8nTACwWDv}tBOY9l z#_kxl3}>oeXT^Q<860O}nbb5)3)oD{x~!9wO=B~63bUxFOC3cStQZlRV9GY2=gqmd z6yFw#vYvM`Y|F7JWw_gag13&1;k2!{j-eNmi^n*yt>u+_3tKBpJ-WlMUIT73BrVp> z8vsMJ78tYc>O_PcbPdWrELk~42~#USgKnBwBmgulKC4(pGk~#$Ez$(CR|R^2H&>%t zcF^vWjqK^K3jB7>#J%zejPYz%%)!_iL(0jVfHD`|G*_5bPsvQeBVaB?s+2*#RTZ{_ z&9DG-8r_$a(L7s*3Bw(XmPsCv>{d`~T9#QR&ktKGS&M#UaUY(i3R{~-E12Yna?_y< z)12c|HpI??ZkpXBDrZ4+E2=dCQw!Br%xnitMWPgBHGaBx3r?$J99aCJwntiRhS|5+ zB`>qC3&tU=_+a8@C{DmL1U z9`Lc_53mC%L%2$#@^C z%)J(wg`;7V)eJ!}Nb!OrqOawgd3fbfzo1jI4b<;AhTcGpMUm44i=v3nLlwr|#rGXq zzg38Dn;u2VuSz?o$x~uM875ZREfI5Uez10+TiAZXPbCpOyqokS5MROAG(GbsBzS6e z*R|rTS*Oq__(RsAjJB~JQB^a^Qe)=_{_AxdRvi_?{cmk6B0_T2bZB`5CAqZ*73?t| zB=zk?2duGK5DuTZH8u=Q7unxWD=Jzodk->;7&S25`crvHF@8~%HRX0uhxF5y0XgC; z-JVxUxJ=#LaQXtd+UYrR!_`c+ON_s|6b<>Mgy3T7`{(_OZeZwH#wdwA$d$tdVzbo4 zGR1?Pammk=)*9iT)*(E1B~efJ7&wlt&YDUXnwNbz#I_~2 zl$A46IW(gUL!psDAG3S7gJ<|?xhswQSA;1O0H=~;BV9p zWqYSOpuSC2DPhwssNYBgmv64RXhtSMSghPCeUDH(%yt-c+ARr1;f=e+Yc6*kzCw^9 zDrU)iE=-Xa=M$k2X?%v6iS_QhB&^$KbUTCU5{#gyep-G%Fs7`I{S#d~S$M9dlIiiS zEP{{0LI$u>$`O0raX=!vqkUKBlF~YGJm;z3e3SuQoMIr{&SW$vB->E!*ltiZc(du^ zfv89gt6L$CaLHOY1wJ8WOxF7!}>KVCvA7meV0n725~T=m5RBb7{L#Zg<&8SDT~YNsnu*h%HcQ3 zrJ)No#F#7PprV{36$+~Pa_QRa*XIv^PgbX8zd&D_pML|F4SYCny>pi?H|ocarO|LT zFI5Dod5tj!?28C8)ujRN$V4wZ2VHvEcEZO;7U3gNMQ}Xcj+F<(F$Sgu(x?(S0P0;~AL`0))t~21;q;PKcEQH8U z#(kF}1hbbBOU_Rh9H^+t9a)shHek)mrT&)QJ7}#gmOLx9X~3G9JEHWA?V`32d^zE! z8a~y{oiwd%V`{S!Wupf_RTFGejpqCqEyg916qQpLP$2A&b~{m{Nzp(Z;WpN`AePp9 z!A&7HXkVs=i-2h3eqH^gQ zok$3(vnW@-iFjdt1S;*BVytU)4JiA$58qi!O}c4?{rnrNLY5Ij>N*uTzG-5U9>Gv0 z#leiFZ?dT6of){|WpV2=bA6>(*r^#}*vGgzg~l8MLt0;7Ca0ABDhiQDWbWFJvLMKX zBPMC)RxMq@FL%j&W^@j+xvortC*#TaRsD=d9e9H~`?P4D`$uVw6#uHjO=Uh50gb7zLbX{e9=vqRj-zw^nab>LQ zJ%UZ3;Bb!?Nlf}Z2WrYVOJs8%OlhichNc6?2pkK;5V#?uVB$7yV+{)di^1LtYOiI0?okC7-!! z6tAZ4nP2={bT>gQ#3vO{Kt7rG-uDZUnm}?zjL*aSPHCb!y&oop}A*c zsSx_7*icvXN}NS=d}V?oFyi!SIYV#N2{J@>S;-O%BQ@qchmrV_nwB|_DRsds9_lC{2^%KEctZ%q3=nfU%ft5n@f1ne^ z0r6w??ck=+U6!da9sd!kFIR2#D}03TPN-#@1}$Vw7@)A*ifnbno_hM4BWgMWV{$&7*R#!VQ~{rAT0#$TkY) z-vp7n@Hp*p`pJoW1EX4k%x>OiT@LkKX80PiquN+7z4>h>n8MTCrn)@BQf%@V%dLYw zFOGQSJrE^RD?tT!lN=BOHo}-bq))>;+wv@^z^bXnB$`c?nm3n%Y5Z6&WyEEXTQ13> zAJRGy7WD&d#Z6*aA50Enj&B~0wkX7>l>_; z)QHv3KwFC&p`R~KiaeY0M|{(fuF{B>-T1!QyXAZnCAn4EKl5bGKybGL_w(I{ti=EJ z;pGF0eC!VCzK4Q}(Fvm+0=X*nd-(@n) zor$X(*fn8sUxu05CLGbm(l@}=y>L5IubY2t9C;Cc_e@)N?V7A3y6Dl6;jT5 zT!UQPh60Rj2Ex4V8d~S!eY3Q4sqW{8^N+#J>&7}{93SJY;S~rxG=uN9v7I`FR#Y%g zi27XOIuWZa6ad;QcAcaSTvsM94-O{hpl5{$)jI!(LjH~mVAT|BAx`U(*HG9Pu zocDE?N`ZXqk?+&ahHmg)%(Cdn4}hT*!@bR$`i8$R2^q_Vl3~# zOC!Lu=(gXNdM{q_9YuLWOhAx;1*S30~hSUFF1iQ7;u9ROoe0hFiurJWw+k4p105+pb7$>}R7Aaq_sf9!V^i@3z{iTdB69;fL~LTQfqYZC+WlWrroR}^#a(Xy$s3E#DT~)7r_#J zc7!Z8c5qGZa1xw;K%NlqR$~$pVZP`5SLUQ@wzN}yc)Ju?!TxTgFfbbPJeec z)zJ3Cs;8&t1*VMZS!%$q#|yNfwXH)YV&fsZXB2e|vNIoaT^MscVcZo}8Si#McnoUN z1_<{spUC~8yBb+&_Lk+xLzF#($k@Zf!=4|v>$%F{Y3_!<-j&IVn89$mEP&A&OD7Duq5k-__IA*3aYA}^Y8t_Xp3GIn-_}8tmJ$Nj-n^4seRQC-Q zc(pQ%so=@*ukqOZFmYpn%WG41MDIE8)z+}n{iZzOHfb|>EWld8sZg`cGiX)IW_Yy- z8tYlsX5V*|0e^uyFZ0%ntciFo-Ye&OVY>3$`xgFebG6!D*%tJymf={xIVz!exCt2$ z69N7F7xRO$z&f=OpcKFu&Fcs<_#ga>fNUKgSpmLJ5&|^#&h`osBch=62wzTJf}2Wx zPC%TIkRSOFQ_%KOujo`5_P^SL-y9!<^(29Ls#W`?AnA&Px&q{>rMGvp9OB5tFniH;3m-!Tx@eW^%2g1Z3b(>!N}M?uYyOzwWRl8)NTx7V>Vh5 zQ*T+1Gldse$sH-YB_m4%XUgrMNN=7>B<~k{o{C%1>p51a4h`=cdTtrhoOj7wv{!v` zQy>0HyG}|BWn2T?wf=7eJ%2uzcYq^o4eYEOZ1oK6X!WeDU1*F<4DD|1t1HA~w7+UQ z-=wdh*8KLoJ{VgcPy4OWe*d~Bq?|_G+2!Wwvf3y;mF@CnIMFDX zC4IhSe>iW%h#7c5BA>;QvsI_75cW{2Y}ML!`5x(T7I@;k)-0k_#m@fvfUsB*N2T#% z{9+p-o|*%oW<3*&-BPPmS)E63ekhc>zTgU7MPR^euNm=OWhJo>LL-K&Z zh%t?^y~AJ{tnA=ue@&al>7Z)1``BjL#&&5~Vwu+H0m0uFo~ZVn3Te68$$@m$(0@D2 zKQvmATBA?9KcC$zZ6~TU^|CBTS-he0bUnLo3L}kc^}@L|w%~bQiL{9$oyU!>^fF3) z_X`w6KDLhX`J{6(xUb3evxSvZ!0o8|_o@st!(RAYtbo+EPumPy*9I#xBibxZ-n^F{ zPN%edmoYuppyvE=Labzl+h_V>&S8^UI6ZTD$kr(IyIt61T^_{pHTc{#3q`gF|g?t%9Or zQ9;4k#RWtA=M5=TL2z&qa2x~(eQ=PW&d*3`#kUtV%8aICDzmN?{55uR1xnHq!>4)0 zV<9AoV11`ls`G1v$QRNhjtp9f{ZO={&1Ocnv}Bb-?6{r;VhXmN5B1p^4oc8oR3nbj zM<99?5)m^;Nf;VSWk?GFVl3j+1|JuLQ89PzcCsO#R=ItR;$17UQp;$Drapnc}lD; z4lmWT(SHCKnsr)BjmMoG9xOM8HysFVDv> z@nc>`i+0!Dm2O6oT$~;k9fe4@v|8?->r2rAx8F3HFD^P8`)Jdi8r>eAQq@i^SKS|u z4`0O4G`U{isS$3W}bhjvmvpV+;vSQCoe0wVZgq9%xoQ?U5KCCgt8Utd8N1MVcz@Xcl#_ z+Uc@AcUP!NBf*>!&qLfyZ~we$%)mXtF*BLlvALN$CWYh5Woc6~sIPUBzjN3x@7CDr z)h2NlO&%4YqUctB{D@jzIWXf@rn`{k(=Vbm6>Bc4s807mc0V}-k7Zw!(g>LFnQibh=aBqQuF9W+IcACP`#+b&fSW~ z$-z+8g<)M+POUtKGugkRr@Jd`sf2A9oFF{le(st9j?UfO{AlByj9RD8UQKn!{Kxh1 z^U&_D@R3K`k6>t+m}=~wPHlp@o16=3r9Ntj^JY(EHbx4O67aDbb!o;gh9w)sa~kXF z>*z>7?w+P-Nvi;&)iPPy`r6tVU*!uC)RXepk`vWqwA5A9qmtB0vey#hOY+weqO%b| zWtB@1VpLO9<>QjF`i8c*H}lqTa}eTGbF>SL+5xV4*uTgO>{ZVj)d7Ln!ryk+{`aYA zY2fs8Y63%pTt5nl2(q&2paY=;?YscyFA!j%Z*OlO9XcBxIQc$(xA6UOpzpA+XMc3~ zY-H$kc<^L#{%K+Eac=g$rD?shedk;2W>44t*vRGR@I`+w;K+mC?)?!!_rcSlfs?`h z1$I2-6c?e9D8 z?%E$6x$NoQpBTRx9s>OFsK4)UX8LY&;%0p8YGn9qaNu}$=5AsBY3}>O_u2b}`N!|G zcWG(;1qG8`T^Hr$^Ho(#rKK|s4eRywYgJVXm6dbl<+C+4i`CT&ZEZUZ4XgF_%kAyE z-@fg%wQaYwY<6`Wbaw8ywr;kxtoQaFb$0G`b?uFhUyqGlO-&*bHgR{~B^Hdk6UTU0z%STtEvyHWu-OU3u5=FP^Yjl|^coV@Xjtf7LU>GI0O z!s6-L`qhhzi|XoXSlFMT@qcXZ??3@>>Nh}CKmYr4On@L>KELtt{o>~z5EvBb1QZ$` z_BGfC2-qPuJ}%55%E`gX(uT)C%Ou9ZDJn+8PWz*d{U;|r;F#c4T}@j(K|>j_s+!;! zYkgh;5phv6f~wS@RDNR%GwJtAq)6{Zf?|x!O{FBM5Y=cuybT2oagY@zk)R}3Mdg0W z4mBDOBP35mfk08=xA%9*d3$A{GF`flMb2^oEa{Kc+;wztg}s02GE{3q6NM z2M6sPtFbZNXW;ihop03p`7(rjz*#}tk=M+PG9~dDmKgD~dx=szm{GEb&U?e5RW(VN z*e1NeuoUd`vXMPNgATSm#GUslxMcR zc>@ge{#lA2pr_cH7#Z8+Gtkk|;p@8K%Q;x$OPJ`{TG_b(Xk#txsPIKB^=R<<%+2v- ze;#OuFKYl`;&e37r-6kQ6&J)8lEqgvu*IjRp@W46;`q6>A%BH>8y+y5pnu!i@aJs8 z28_-xh3Q`mlr+}1R@Mf#_9g~)wQ@t@i*zt8hm?> z&=Izce)JF-ydg1hJqk;~Fd++emxe#{VUsN6?B_7p2rvowmdH7ckZO~?pOg=Glx0w4op1(59EqjAE|_C`dVst-hYDo z;jxo329kO*k~|wYbz8W&dc^|H1niyVa_qk1zk?@ymZSx~;_xi4=PnrGwbWt5vkYT>Q+oVzRW z|DeEhpm7!=`Y}mPqel})AV9*jC>gcH9fa?Kh&A#tnCMANG{Ly1JlM-x*;}pgb5^=f zkiv5`L9Dfi7Fp2<er=~d!q)B$d^tWBbpZ-$AA6)S)VF0Srhu=11{V7!h|0Gp%e~I!d z*-{v!hwG$+@mpWc51eKb+5>{n2I@E=p$Qh&9kLN<e1`O`Bb|6t%7wRuZ zLOS@-G$<)q#f{}%Xt*L(6x3SO9!*JIpS9SvD}y4Y(Qs*f#TGghWAhRre&)0>c(p2#UiG7VcN#Z(M`&wCwDxQb9RWmKZ9H~#G7o^A&QWQlGxv_ z>TzsMSVrCe#TPssjXj%3JmKSRIqli6;_^D?Q6I>WMl{8))_4nUze`h?iNWtKqa)_z zzOIWcyK8niSe~vEQ2hv2J6{W=QcQu4<4eaY#51q_CK@~B-Ih{;TVhvb!CSdKRnCm} z3IWyALMEftKz54Y3Ng8DUlT+r?vONdCT!t__c{7=4-%@BG$s(W275TeQFg~+ zr!Ss_*c59CwB67@^kdRo3Nz+aGbeSMoi;TztmjX zg%b+8kFN2NB@oh)!JkLr05sw_ecm1qQY|$&o7aJ`$Br-rD;3doh&K=_$623MC2DPn zfJOU9+(&e~g7C;qQn=9t5fCYBmiK*Gr(qZ4SOck#ExtxbheZ=iZJ{U|a(!@3E{%u2 zKena|M%!^nd;4ypLREAzwIN#PkP^&4Er)GyewXAtFsmS5wCI7f>4@>dRn))icNSL} z?p6BKoiLCkXo?_2e@y`ucu)p$NFC2da_dk=+GrLq<@y7rC2S<316JT|^;^Ytm|E=- z&E9VsUg%ifsGdil2*tKMW`=2M7PIvR**ixf(5BT(Gc1I{_B!~g zGF964M(?W{z~!X!_}hn(Bip;4e`L1iPHETB+!j4)1$aM82X8BUwRIN2iIRW2<=8%N zpRiw|T1&g0D(^rOg1L{rlQI4&T;CsCCB8F-?aJPvDK>+8Nryu2gV*w1X7bQ-ZmGRq z(%k~4;V2<)S(jQDbr}Tpxtj5Zt{$#-i3F9*ZHOE)@jlT0k%Z<{JV^%5TxVsZ-Y)to zJVV4%?Tw53$D#4^o9J5;m5aqqo6|C68Gj|SN35U1FZxIeQURFQWWUuY{8RYxISg)BoqEl&Gg1@} zz&es$E)9Dxopq%iNsXD{P^>M$=W&>L3cO#W!ChtSoDnTnf%Mc&Fr8Pz23(JiduK>g zPJ7AVZ0k%i{6@_oKHDNtiw9+XQ$6WzfaLTifS3n*fm`l3W9^s3EM&j=;vH5XsgBdY zHUgUvO*bbnRlvwJW!vG^MadF;3QV5upY+y(+$}Sgq-~8_As&2zGRSX6n#=xi(}-K5 z79YQuhU*M&^pPa^^IOw%2umN(2C^1mJ0#*Y>OtczD_wY48bavkggQmR&>9@3==i5nOdR9%OkrIR7EJ&BRm-WP-PhFIj4kli*gyw z53V7fIA+IMTdVp(#UCm}P*~djayW*Z?Z)qZ7k&pKt?FksTVVgrcaG)EJEUxS~oV{{^rTKTH&A!Am_mTW>73Zl+t|Jy{=~Jzxc_X!88H zKk!CVy5VW8*qvxxh95m?adPb|MOrMwTeQ9I-x&&E*5GV7@AQT>x+&wRHkeHu;r(zq zoR^r-GQwGF(;Eak6;Yn-Xn#E2RSd|eq_-KXf@+StI#r&o*ONKD5oldRy)jQ(to3x< zZBjWlGps93T4^%Y?ec-TzPvx!xtSe3Dw1SmHq_Q;wO#`P0hfLp=@UM`24ul z&b-;4@&+EK&~u1QfKr8Ohq0e(PZ=A%ch4yAYpsyc+tUTf)Oj)5n4<+InG@5FU{Rh2 zw^Pq0xENJbOaz=<>ZF8S^GG5Ks+^Vnf?*@F*@+$94iu(n%Cqp6*RLZ(zfA5)J(ADqK{dLk&M;iKItDd^PGfsB#d>Hge!y3^3zo#Yj) zxRq;b{r_Lq>_F15_jA7>^b%BO&OQn&Tyu0030r-Gr&DmddX2gdbq?;Zns=g=TNQseZ*XirP_hd z>)5AlK}AD>(P&g0{0%=pI5>EQE;#z%gN5JqbFhx=wKXy_R^p@BPT`V+e;gq=Apxpd zmMJkGp@Fbi#@-|kC*aR+AJnOw$s}|P>)VXFy?28v#IGGYnz#XBi<1ywGb&Bj9N}D3Yx?vFWeWwU3&K}Pu5eF-qnxE)NVH( zf>vHb9lfQ*1+j~Qa&enNmG8YwO7axCqSDFu^7fdKUcQrdsp@QDX!r_XcUh0u^XMH| ztU%&E1~D|i*#!jK@DI3RG>6Wc>v*x17ko#ry&3LVbI2F-`>*8|O0*i$HA zP)P3DqOQqp34Ou`ty3rf?e7ZSq7F0rmq(yH$Wh4-FkX)TbGB4FKyT+gCw)r@0z&Bv7YHJI*shLLc{s|2irS&Xfm%<_p0BPx znf$1sM9(Bc;a(O$oA_?=35LeXbOle7-mB9tq7+fL!(9o3dPi$dEIy^BlV4%yQ+!e0 zqc1Fq7dyK0qnja@qRm|8!o#&mWOi>_qn8s-a|L@HJ*z5fMQNHsHCIK^`|QPU^^E47 z-G(cL7Ub29Y#9H)+@7qiw1?1ur}*H-8~_&iw{Bd3Z~xO(f=^OJP(V(eMndrQ$sqtI_c3NZ z<^`N{AE0;qWc>KmXaJb6Qm3VLEDg;6ojLs{%IiArzoXOu43+;t`4>t0pD3^EH2pLuLxuTI(7*EwUSs?u{eE2z=x6DzU#$~B1OM;3 z5%mAu`E}u%-#ZHfYJB~>^FKV2pJ#quCWP?UX#u}20t}&lcm6xA{U0mc{CO*{%VGS? zgZ$Ns0Ltb60RCQU-)f#>uZX}{#Ab-};_!H$d&;Cy~{a>vSki!4(OZi2t{!ha9 z^BKJ+YyTZbfb1V}{+DO{npybwyAr1OC!BvC?$?yCKa-+G<>uBE9yk{d6Jx zYU|Gbfb<`p!awm|J1c(r<9@YPmw&+f-8=Uu*lRQK_ls+C|0l3Ny&Zqzy*4y{AM`M< z*LeRnHUI4YTIv01j{IuL-mm-rk8$!Rz-wLa_Y08neGTw$O<7tD3}7Jx0TBa!e)7O3 Je);+B{{W8i96$g7 literal 0 HcmV?d00001 diff --git a/filereader/.gitignore b/filereader/.gitignore index f207eba..ae5e646 100644 --- a/filereader/.gitignore +++ b/filereader/.gitignore @@ -6,3 +6,6 @@ /Utils.class /package-info.class /GUI$1.class +/TextFilePane$1.class +/TextFileUtils.class +/TextFileContentsLoader.class diff --git a/filereader/GUI.java b/filereader/GUI.java index 92344c3..28a42b7 100644 --- a/filereader/GUI.java +++ b/filereader/GUI.java @@ -5,19 +5,21 @@ import javafx.stage.Stage; public class GUI extends Application { - public static Stage newPrimaryStage; + private static Stage newPrimaryStage; + private static Scene scene; + private static MainPane pane; + + public static void main(String[] args) { + launch(); + } @Override public void start(Stage primaryStage) { newPrimaryStage = new Stage(); - MainPane pane = new MainPane(); - Scene scene = new Scene(pane); + pane = new MainPane(); + scene = new Scene(pane); newPrimaryStage.setScene(scene); newPrimaryStage.setMaximized(true); newPrimaryStage.show(); } - - public static void main(String[] args) { - launch(); - } } \ No newline at end of file diff --git a/filereader/MainPane.java b/filereader/MainPane.java index 9d5b385..540e041 100644 --- a/filereader/MainPane.java +++ b/filereader/MainPane.java @@ -1,21 +1,15 @@ package filereader; -import javafx.scene.layout.GridPane; +import javafx.scene.layout.BorderPane; -public class MainPane extends GridPane { - TextFilePane textPane; +public class MainPane extends BorderPane { + private static TextFilePane textPane; + private static MainToolbar mainToolbar; MainPane() { - MainToolbar mainToolbar = new MainToolbar(); + mainToolbar = new MainToolbar(); textPane = new TextFilePane(); - add(mainToolbar, 0, 0); - add(textPane, 0, 1); - } - - /** - * @param textPane the textPane to set - */ - public void setTextPane(TextFilePane textPane) { - this.textPane = textPane; + setTop(mainToolbar); + setCenter(textPane); } } \ No newline at end of file diff --git a/filereader/MainToolbar.java b/filereader/MainToolbar.java index e41a891..a01b71f 100644 --- a/filereader/MainToolbar.java +++ b/filereader/MainToolbar.java @@ -12,9 +12,10 @@ public class MainToolbar extends HBox { private TextField pathField; + private static Button openButton; MainToolbar() { - Button openButton = new Button("Open"); + openButton = new Button("Open"); openButton.setOnAction(new OpenFileHandler()); pathField = new TextField(); @@ -26,12 +27,11 @@ class OpenFileHandler implements EventHandler { @Override public void handle(ActionEvent event) { FileChooser fileChooser = new FileChooser(); - Utils.currentFile = fileChooser.showOpenDialog(new Stage()); - pathField.setText(Utils.currentFile.toString()); + TextFileUtils.setCurrentFile(fileChooser.showOpenDialog(new Stage())); + pathField.setText(TextFileUtils.getCurrentFile().toString()); try { - TextFilePane.getOutputArea().setText(Utils.readFileLines(Utils.currentFile, (int) (GUI.newPrimaryStage.getHeight() / 17))); + TextFileUtils.readFileLines(TextFileUtils.getCurrentFile()); } catch (IOException e) { - // TODO Auto-generated catch block e.printStackTrace(); } } diff --git a/filereader/TextFilePane.java b/filereader/TextFilePane.java index 4a8e3e1..9b8d62e 100644 --- a/filereader/TextFilePane.java +++ b/filereader/TextFilePane.java @@ -1,21 +1,21 @@ package filereader; +import javafx.scene.control.TextArea; import javafx.scene.layout.BorderPane; -import javafx.scene.text.Text; public class TextFilePane extends BorderPane { - private static Text outputArea; + private static TextArea outputArea; TextFilePane() { - outputArea = new Text(); - outputArea.setFont(Utils.font); + outputArea = new TextArea(); + setCenter(outputArea); } - + /** * @return the output TextArea */ - public static Text getOutputArea() { + public static TextArea getOutputArea() { return outputArea; } } \ No newline at end of file diff --git a/filereader/TextFileUtils.java b/filereader/TextFileUtils.java new file mode 100644 index 0000000..83fed67 --- /dev/null +++ b/filereader/TextFileUtils.java @@ -0,0 +1,39 @@ +package filereader; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Scanner; + +import javafx.scene.text.Font; + +public class TextFileUtils { + private static File currentFile; + + private TextFileUtils() {} + + public static String readFile(File file, int length) throws IOException { + char[] contents = new char[length]; + FileReader reader = new FileReader(file); + reader.read(contents); + reader.close(); + return new String(contents); + } + + public static void readFileLines(File file) throws IOException { + TextFilePane.getOutputArea().setText(""); + Scanner reader = new Scanner(file); + while (reader.hasNext()) { + TextFilePane.getOutputArea().setText(TextFilePane.getOutputArea().getText() + reader.nextLine() + "\n"); + } + reader.close(); + } + + public static File getCurrentFile() { + return currentFile; + } + + public static void setCurrentFile(File file) { + currentFile = file; + } +} \ No newline at end of file diff --git a/filereader/Utils.java b/filereader/Utils.java deleted file mode 100644 index 12222ba..0000000 --- a/filereader/Utils.java +++ /dev/null @@ -1,36 +0,0 @@ -package filereader; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; - -import javafx.scene.text.Font; - -public class Utils { - public static File currentFile; - public static Font font = new Font(12); - - private Utils() {} - - public static String readFile(File file, int length) throws IOException { - char[] contents = new char[length]; - FileReader reader = new FileReader(file); - reader.read(contents); - reader.close(); - return new String(contents); - } - - public static String readFileLines(File file, int numberOfLines) throws IOException { - String contents = ""; - FileReader reader = new FileReader(file); - int newlines = 0; - char temp; - while (newlines < numberOfLines && (temp = (char) reader.read()) != (char) -1) { - if (temp == Character.LINE_SEPARATOR) - newlines++; - contents += temp; - } - reader.close(); - return contents; - } -} \ No newline at end of file