From 508a628c90b599335f2de4f28399c48c454ccc53 Mon Sep 17 00:00:00 2001 From: Tom Hill Date: Tue, 12 Nov 2024 19:46:02 +1100 Subject: [PATCH] basic file operations --- .vscode/extensions.json | 2 +- biome.json | 36 ++++++++++ bun.lockb | Bin 50093 -> 125002 bytes package.json | 10 ++- postcss.config.js | 6 ++ src-tauri/capabilities/default.json | 15 ++-- src/api/fs.ts | 0 src/assets/icons.tsx | 29 ++++++++ src/assets/icons/directory.svg | 5 ++ src/assets/icons/file.svg | 6 ++ src/components/FilePicker.tsx | 40 +++++++++++ src/index.css | 10 +++ src/{api/greet.ts => ipc.ts} | 0 src/main.tsx | 6 +- src/views/FileSystemView.tsx | 103 +++++++++++++++++++++------- tailwind.config.js | 8 +++ 16 files changed, 239 insertions(+), 37 deletions(-) create mode 100644 biome.json create mode 100644 postcss.config.js delete mode 100644 src/api/fs.ts create mode 100644 src/assets/icons.tsx create mode 100644 src/assets/icons/directory.svg create mode 100644 src/assets/icons/file.svg create mode 100644 src/components/FilePicker.tsx create mode 100644 src/index.css rename src/{api/greet.ts => ipc.ts} (100%) create mode 100644 tailwind.config.js diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 24d7cc6..2993336 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,3 +1,3 @@ { - "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] + "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"], } diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..6f00bdc --- /dev/null +++ b/biome.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "ignore": [] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2 + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "a11y": { + "useAltText": "off", + "noSvgWithoutTitle": "off", + "useKeyWithClickEvents": "off" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + } +} diff --git a/bun.lockb b/bun.lockb index 137b3d7fbb2996035baa471a059e8756f40a2b64..b4af33bf29e6956ede85f475a4b41339fe25d9b8 100755 GIT binary patch literal 125002 zcmeFa2{=_<|37@_m@}u08AD~rn0XG7c^)G}ndd~NP*DlVmXaAn}`PGsCb-nNZx}J62+vlvc*XQ&7uJ0Q5+IydK$IC4m6yPs6a0q+)IC;3bdAbO@`uKY}1_~eEMM;doU}Q1m_XN7rzJ6x1V&)OCv##Cz zmMZn(U;ruIk4HNLl(_GX5rJA5%q|>Y$X9cie=rK4pB2JaSj|&lFj0Nr6CJ=O0Ab$W z#nCAcd`<)vH-h|DU>=sA0C|XV0O;KL0V3?;zhpgt?W8Zr!q8K4I~e;71jGsqi*JPW`Tz=u44 z-~_bq0+1S@Q$Rpqh_4F<{PlDTz+mJ-{Vkxp9Ed}`8o-0~-2;5Q#l8G6IaD}5_(44; zP(BULGXP8i{=oL_294eXkO7>B_zHi%4UcXBX+illfKb;SGz!Kq4WFL}d8m65U+)MW zK|I{NeS-pD0Wxf_4Je240Of)HE-sj_Km_XM;{AvR;=t7?6;KbhQv#3Xz*!hy0g#9N z!wwMEqsJpD9)Yfxi+2#_JJ5sYXYu$Rj{|so1`zhcJ%F(Nm3S=1V?Y#^T@=pMS z{e0LBR0hd4z~!)ucVK|8Pe35(V~jEg8jOP!Kma69B&vP9FI@&Sc}I(Jf;DJ z<0=-9{&;l2qdrpZCa0AYNL0d55-0+0_N4L~k{ zvmgV@I{@+mEC$E}@C-msfL?es00`?z0EBin;mel*3FZd@0@tFR0fh1P0(}AFeE=XF zNAHAjaW)XajbG3=E&)y$OeZLZ@vsC4$5Du*mnWcL8bBV-k8*%;yd(XYhtK=F1o(I! zcEQkz;rt{82<(xhd1`Mj!rIMpmu^htj8pc^Wz{u*e*w;K0uf^ zz@wLo|3MevBVyNmH?G~Tjsbywz)yddpaAIdP8nRBrU1hEDxC~ zJmlgH?FQrX(EzD|-etgpx~stf^^KKq^F|FI>@Qkn93P9v;6rXshd@2I0GA^!0MkG@ zoWE`=I6Ys-z(c|wE+M-CAI5*LDlR@=Zr*ObjsXE8pd7|)1(ZXcsT!_*+wkSnAP?;h z0fhd&RL9jX0SNmcRs)A2AP?ilvtW`2+NJ}_;?>K{$MgWdOAA0)Pp>1$8~^ke1ov8;yry_c`-n^z7!hZ{BQyY^_&cG z^IjVu8_1sn<(mP9;n4>m)QtgrL4d{pp+6}m7z{VS9j3VTff*pwNBS|u(Gy%>12F+E zUWZ-$F_=J5AFeAu&2Z}m2guWcyaGTtu7m)>{&dGJ4;UK!c{tu2Jp(Y#E(d~OguDV) z!-Uxn&citB0fcrj0BHaobny-d@pi(%>o=H^m>gr=x@ZUd<_G7+K^e3IKCiaF-5O^f z^v$Y2?zXt~Q5PWeR~X<{fRq4v0Z!Q9&OZhS&))>d4)7d6c%3~0kQJacK*$4QV%4u{ z2i*B?fNY@r4nVj*=KzG)w|G4I1BBzm79i{gO*~Fd&z~p|6cUrKJ}x{m>q~!>S$^5= zq^WDt*o!wTNiFAzpZi6ntBUXZSa^!Izn|3Cc%;DN{DGV1%M4R&4Al%OwkhUO6Z`F6 zn7pwWu^Eh_df7}gO%blbd&5>B)ZCIxh~JDk{j7y$M}j~!b9UqP zXV2uY*@rR=$|$4HS4jsB$?zqfQm?b6i@f&c&7{M_U!II-v(u>_=(v!brO{!xWt;eZ zB=kL{_Iv^7?EV|?{YB=)omR}t>~xK(U9T}5kzEYjNEMQj{55L%J8yuQX5zcj6I{I) z{kWg--MTG8|gl$y`{hS zt%^-1C(cTN-nuj?bjv}qu?>r_vabEC`RvH{Gh}d-ImRR`oHWa%w0Z7f^)?Hs$Ijol zllP2ddMcEZ22O37vv1i!<3!SZiwDNNmSL$ zTX-??)7;CuZbU+LO6ap%@Sfo6szeGYPF7oe55G*@ZS?C{(Ok!D&L{o$ zyONWqQa64yoYAxPCl3fo^V6VeBu?A>yg%rULMnILm8L9FQm2oCST{N?isd6UNzq%5 z&&0j4b$r@BwU7MR&b~bVE{|Kb0rA?uD)afm_8V~W@ig_HrsGvq4<`F^yDNu|qeXDs zz|$djr9b(OYO$u9oxid`HuV;b@k^zL9~mn>+sV#Bf9(?6uDdVG{y{;@xoL3+gP;V_>5-gQF|L|oX#@A0Ff&^G6LcY5S@P#hb=j@pI+`rZc&8$4EeV1U20kTZ)6Yu)ZB6iSkMeR%Vx;bO7)Jy}D~SK74ss>yNw7X$|5_EOWn>k$&6h6LNdF3<#giD?AyHb6Ed?$4QS|2c2#V{+U@#yoRKuJ+u8H!7vg^L+LeSk z3nHVenHiNUUB9YUrsgPF+qczj+RR{=m>I2PPh8jgiTv&5ZBarykGmYuS!(kn`IKkc zQW~trK%{XrSE674a{jm7CfYCOun|(32H%>i>aYj0j1fxkJ|APM-VW zppaiS9NNmKDdKg8o?XanXZ7={p;D!)!jwE|IwPU`VX-=9J6V4G72X~Cxk_QAb{7=S ziCXo-pEL!*v92FP41%O6FAfjHl8s2P6-B-+9jn6VH&vMS*B!Vp z>D6+3vDKBkry|G&}@vojF!wAp1*X0!@PrS~4%`=$OEEKXBFkzT@uEO*- zL#}~5oO0ZPL;1>?pZ^EyLkMP?8prH zT=n9Wa$SVOUMDJ^c(Z}wUmc}_lGGXT+5Hw+^No!S(asgcS-KV*AMiXkN;l$J6fTQ0 z{4f|CE-u2^#JGV+tIf%Cg#1y}#&dg2>0@7L(W+~{qE(!h;pf`C zn={O8u=3m1fuyKQHIiWo8FOK`-b@y|X%p@z=$1T4tml=hDmiS;M&JnD)Lm zr#{CwVikJz-U8E`Qu~*)BKlWY<5`!yri*lWPU%#w485@(GMjWidV)eu`tqc)j?(0) z@uZr8nSowHO1(&Zjfk4KVE5S=jN~wD`@^f1Eqztb6SXm}^)1s$ey=A#W@VX(Ht*AV z=ecLc{o8jOSPgb(n^Sej`5&-XWG)U4uQQ2~zkhP@aRsN2vishcxY~kl=HMr;ef7yM zH`}w&ubIEpEKw!8ROcP<-7FVot@G~9_e!*t*)3!)cS%>MH9VcOR~9ZJcOTgLiS|o+ z8mCg{m6CzYQui12yWW43@EGOYKum;LUn0iS-vb1<0#T#@!9I}Sgz$BNBl3U`_Pm%4 z;2_j5gnt1LB-X)y3iv935A9;XL1;qk3xE%DfWH{&xXBxTTGP zL~y^j=J;~~!wP^8^|!bwm<+TV+}5A7lcAp!`W2i#Dr1N)E*?*G^9e+=NO0zR|}#}Mp8LK0%X z1@Phcg&fcnf)m333HZ{0kMuu8LK4E401vk$0UrxUkPDHJgzygnz7F6cu}8}Pq=D3H z1AI9CApdX1KR0-I1nnbnM|26b?*aHQey~2FTy))=fUkk#!*&po5L;jHe3*v^(vClA zAbef$&<#AITa6!~eFwD>emda8>nF^Ep|m;%;Q2o#gx>}DYIysw?MOMHd`9pv5aIuc zgFcVgF#~*MynXQeZ_V@fJm9MUKAgLR_8s&CvEPg5!?^?3EYes1CV+Kcs{fZeMia(<)`BL zYZ<#x8?mzh_~2E@YW$#m*aw6pgf9#p{=(}Yj6c!`YvCUS{5^mV+Yg@GuEuaJ{6@e> z_D^6bCD;eVe^T(UTnpHT?FOMBI3avJz=!)6FpS`H@HNNpJmACe2V)0)Ky<;!-zKD9 zH{h!QJ{)_5_8k;P_?y6u59Gr<>;pm*!Vds^xc^1Cgs#B|{}JG;tiwJTNlc`@M8cUuD>u3x`N<@@S6Z1j$b%`;rJmmA^dMB|B*66G?2O~;HC|Z zKR9-v4}>O!AA#ck&G@SWd>B8--Abr&P!F;H9q{4&L)K10*C2$y8*F-!`)4?Q*2?!o z@d@R^W+L{B0UzFfgKf~NZFn6fBq96{DEp9$l>bQssmBFwdSUz5!iCxh-x|+{V+ZyD zp$Xxi2Yk5yhxT`YgU}cv{C9w_0r-%&mN|^@`N2aEc>P0sU#oq4z(@RteMo3R?56`h zod59J^EduK#q*&a*oqOH5c?$HqALmP!*)ae3DrROvVafw-$;I~@jDLq$o?BTPv{zg z*lPfM&2`u(VOih(yFK8G0sHX!2m251K?q5R{|^CQ2Jb&?`&!%o3-ICifom7EFG`4U zPzSNUkM&>oAFyn#{dX4d;ra`C$U%q;i2WCU562(U_O-5mTfjqK*nVgeEQJK`VG#Sw z;7bN@|N6IlSHOqk|8M!X*2(|1PQDJf=&r~AG{A@VZ-3kVA;5?CZ-2`d>+@fGo&2PA@?Wfz&&7>fzcC>F&HQy;C%8-Q=N4nDEK`uw*8e3Nz9 zF9UqLb?~VL!FO8M!9NW6j_cq*2mJN;FS#9qIk*n{7XaU79em6V3}*j2`1{w%uLu0~ z#E)&~`sPm{;IF6sJ?peDB!t0OtRwz0fDiBgiQokgB;-C6m;2xUBKy~Nz=!*9c>e*p za34)bLilvT|9buc*HHKzlaPe)zX85Eun%p+HX!AH(m?9jiTvyS9deLzLixpjkK8}} ziGx0m*m(>1`uP5X=aF)B-T(9%sV59>xZwROjQiiT{~+Ll=N?f|kI=q{{vh_#0bdpH zVgDm#@cf?=QuhVmYXCm9jgZAe=0A)f5?7?& z|At7t4|w}9PpI!u6XA1#iw|=Bg|SDc1c0gDzO*Lx+)h1V8^SA^u+jeB}BC zZ6o9GcU*W5;V%Kc3ab5o;vwe|zLqTR`4JNPwa&i;z=!ci^w#SC6Tk;eSe^gK8jkq* zJ4Ea;fWZsrFU%9#cTgAM9|U~({1xU2Z9AG@4*2Wwe;mb!{uAm0;=eYy`2ka4HGaI% zF#;39ZvlKGz=t$wf35GYn84x%$3HUe3GG9~zAoT{Td>vmuVoEI_*sAt*AM7Bp|)XL z5&kINe;9Xo5ITksKC9xt>=W8|X#19cuZE8ww7pjQS%446FXTa=kbZzRewPsc=K&vV zp`$24WyoFY{5=GMZ;H1M?XA`SI>6Tkd?fx*gOG&y&k7bF*#FRXLTy8Rgl~!GBV%u^ z?QZ~lumxWozi3_f`F9Di|M}nezvH0KA$(qy|M~tFUFUb75&mJoSHs8uclH1M9Kx>w zd}RHD@h7wo5dJLSgAlBaU-%5B*2>k4QOi<+ll`_Whl|TZmsb@i{~T#zE*xa z;Hv=pSYR9awAT0w?ZG`iB$NkCtR|%W(SQ%vPbB`x`9C4TZ^ZMV|7-C9;Ztd@@BY;S z@L~VKxWfbbK}bUErvN@2Kd}9T_8rtm_#Jrr$ofHuZ8V=k>tEyVZ|v^@d==n79Dk6H z_yukJE+O?&03Qs&C|DOM`yCHChtz!z_;CDC;Q2^7Qty95q#hHv_(MJ^o=<2D5WWfE z!~TQ)4!LXPCjdU&KLP6M_=RyKBq8>>_JaTS4B$h%gmR%i!uJP!1C)IhLX4yMF909< z59c2A0nz=F3{sB=kiigM^&gh4HGTnr5BHCd#{>@8kAx(|{#C#SuMk%GP=nAl1mSn% z`AF=M@;~{2)T7hItv{520LRd#KN0cg5q>h@!}!7Czlr~Iz(@A4uXkK`HPNdgj5{|?~8`(Nlc97A9)Pf$Yml;GtTSVC6g2m5cW<97h?q5se*4LA^8 znEzcu>T!U@1CBp9Zs6EO=E3i{@EpQ#0DQRqKt7zij)tU;ZFj-bQssV539KK^+A-^8yL@R9qUzv;h96Y&2GTZesZuz1+7gI@sn$oT)8_)P)6 z9Iy}P&EKqF{ARf4UvS?44c`s$C4qf7?huVX^*ua~^#4V`cfiN*Z~BkL9D}i5NBjc- zUu7Nq3c%Mu`H!>+K`w!P0*oL+4AGU(UQwZ3HdT{(AaR48Gn-KdtfDh*%%oECm!U#VJ z@WB>hmH%6V|8^4LzXp7`e?r#Jf2;PtW)VKC6$S$yfv#Tv(UlLl1Uia<%|QG`?#~|= z_Nt)I!OsZa0`Nh#RsUfbp)o-C@qiD8@T&iRvwpt?eD8Je^}ys;1AGR&?{Ewdk`VtB z0Uv(<3gHtvh7tZNz~2M-w7@9rLux{dgE|PG%Lcc8Bl)#ne^1%s{{I($%l`oQaQ*yS zzKR`g|MIu|48T9I4*Sc151R1T{+ok~_j=l22Ke9-{MYue`*HKnRY z{#&k-e+}^A{{3(5&jUWVh5u{5veV!3L3hLdU-jw%$IKRRz-tdHIAB}Y@W>7jCWx?{ z17<*iNDK~6m;nhQ_#Om&mbH2h3APm&s0)_Y)dUgp!CJAJ&L$4p`oZ$43BR{SI)zcJ|}*uK_~d zFdjbug#0mZ!1~kRfI9Qwfc3tC1M-PMCD=YnfUq7N9ybGo_1FMH9uGb*fJgWbB*61x zc$5YRugPivVg0>$Gz19sEdj!Qwgm`zj`(snfUEt5FAoL?6GZs&2tE%Hehk55C_rcr z{(B2BL4@Nn9-seD2*>Uf{Q3VIaTD;r67T>2pK&wrvmN*e=lv7Bzi5Qx;2FOBKOy9G zgY&RI`vAiFFY)=;cpe&I(IEH(@eTewMELP7KL0y}Rfh2Ohw=3xLO(|Ed5AFo9-oH@ zKYqaD7#=^uLXiFw!f`*1KMxUpoB@BJ?kqn485V*B5te_!m(SzN(Fo_&5B&L``126q z$6w$Nsax5ZV<42zlG_=OMy!A$%ThX~81@cG{%tS5u72N8ah!{-S>*iWkX`u_>xJlF%yLp$2|djAPwT=enh zA;NKI0uZ*_6d*ih4*&cc!t)mR^Hu<1-Ws2`1qkn*JODyHUw|;75!Uy^m!lE-9R$kZ zsbKI2wle}CY{xNxQ11jhiAPu-kIzGdx~K4Yi16bXd>$hFcov`kPY6#Xfj>|u86eE3 zz(06|?_@6G^ZzFi&d+?j?%yKx@xS}8|L(v3yZ?eS;s4wH+kf|8;NM?@izrBFghl_| zf31cE^WXg!E)M_Qf8pZr-~AVEzx99b{_7VlyqEevnt&b=2B(Xb#(t}vW^y8aCWG00 zyWKYD9#iKrzo2BpX=}c?9M7#kA6&cM{mZoD`EgGYt8QaIcnhdpkGOH(rl-4u^RlKyl%GE5;j#U5skh?1(`)sU%fl|;JNN6D zh}wPIxRG0FL*D*G(nZ>@jv8H*O6hLvc!~xzT zAPJkkvs}S_#cIhTb-bFqq1Qi%{rT=4g2en-g_-2DFGlyzsqxyKJ6j*l@TT5YYU>7Z zU7EL(cBb5CC1-X0_Uxdh4&Un!tUudjj+HDK9JbKyF-nNxK{tT(kIivX#K9+ z8J@&zwjOlNm#?toU$Jh zQv*+o3ymfQxvje2Hh?HluYT)PftGhKWpM6u7Kr{D-vnkOkm&(EKk zkyX~sMUOK&P`dEm2uaw?y`ys#ZP-MYD~2z>o#|wGel0$_o=G;D*7OOL(whe71fDZ< zg4YkSQi;h&h>Ty7_%%qbKUrHJ*FfC5zs!RRKEp%e3-3jcgms`j$&&izope;PH8a*A z%#0%9qHXK92ih+_uJq)DICoao1`dVvggd?D7h{#q3Srpk)^xR3;F;7RpJPqsiT$D| zUHI${N!XD1N>v9h<1%v>$I9SHIT?pt&kMr8ro5B2mL{tnvEqLe(v|;yn#Jn+-4E&~ zj%g%>-Y2I~3FqeTiJ8+`c%kNu(uMbANWvaZRw(7ETdFFt+uNCc$GeW*=`u;z$q1q6 zJk+!`vQ~Q{iOju}GGBMGY}_q0sv z+1+MemXx<6%gL(6T+^x=iTderJYlCkUjK1Qp0a%MnB`sLu^Y`dHe>EreR}KjEl(ju zK&iLkAxU|6I!YHli$oH3!>(Gvy!6diIJj6ZvK%ZD?HikJyIt?gf7WQiIF!y!g5?0C zjJerEk-cP`%qt|9dV&qk$;=%arcd;aGTW}~cpIgQeou-0aqEc%e@VCH2=M@O+;T=- z1Cv!)uTk%Csf+A#cqR3PUmipGnkR3XD98#hDRF-c`PnJoKEOz_U$fWpR9LrN7D^X> z2MkHrO_FD$w_M|pNy&X4{S)ib;C`Ei@#U|W^nI*6Hx?2e8I})9F!{P9RW|dhw%qiY zbGrKcL?uex+2gxqap58=AW#YFl#bY{UISNO8}Aar2lC5e0}X&v_v) zqpkL|?6C*a0|_}Vl_`}OlCeGEd#I}mSv3N;)$@Mp&(f-99}i6xxu~D+XTJHzmpQqm zqe>%@>~Ac3^HBcMqjg6HsPmcoHNW-FzCK~@!s_77TO~`K>u1IL^h}1cdLgSL-Hli~ zWrx5$f+~xSHH->vj-M%9KYH7^JIw4G4(+{%(uMD-k%TQ(-Zq!CvM)Zh!JTCJ;YMS1mf}3?Q5#oplrDT0 zfF!KdL(4|&u*Kpcb8OP={@TflJKv}6?MY}Et4_sQ(JgCa42hH-KKVR~gPV-=go3-a ziDp>eFr#!-FJJrjJkd`0j1gHM;Jpo!u#df}W+-H&bH9EdKbd~7a6EhBtf>CX=i!C; z93v~*$_+(1yH37)U!J$@F>Iu8+aNkteX9Gq%#rhI@2TzW+;`WZbeRxQfY=wlJgtr= zvOBg`BrrU9B@u$z^kG}kh%FIU{KV3T33=gr?Y!a+va#l9^-4~1Quo-2URJsi{tk&n zp@Uwdl4bCn0pc%w#*8HF?QPf2-%RH$^UfS(Yg=rJPth6iYq?V)Nb&fd1-sA&@{@sq zLsmC$>>5;V|6%>@6ZYw_LEk}B$)4A#tY(#pU(-;!@Erk?u(D3c(&;1OE$0lGJT#az z>9%uQJ)n{y4p>O7tGVeOL-*@Th5VU7+j`E%uldiVnR-MHWaq>tRnl*nF?u3jP2Ysl zWky5+Vv`uWA}bz^=a(J4HtG@ftozbAk~5!&zXge$uwZodxEPzV5aM*9>at)~?>pM( zH+}76?wt|28${$}n)QKVUwspL{IZ~RC2W$C+QM!SH&pDJ7kc4U%s?xWQNZdWB*VUG z#(0eK`~?I4-EHrs%$~jft@-QG&C1h?j?5^3*%48ISW!}s+~-TFVT*Yl1J_}cE_{E9 zBrMsz$aiP*CM^><)hs_(AIXxpvRJ9{ERwb;*c$>bN~(APs!2_UIxf!?DdOC|%?|E0o99{`3m`cBGA> zlT@~^^q_9u3*nmD7NKHH&gP=fJy(vsNRs~k>8?+ngWcl7TNz2xyOU~3&39D?!k2g4 zqBK7~0PpdU`NjnW@d>-dh+?Sl!Bqz`V);{bQ<-GH;+$of9%(*GSCE-zYld`0TDFnM_~qpOGHoL1wUdL!HBSIMy-JsPRpxmuYW ziB00}olvGtBmLanyqD(ot=GC*^5NW>{pD4PQg5GF`J;6C(7K`%FNcCU2bzMS0!X*Y zb1lkRl0T|#L4{Gsp-HXmd>GGp>ceQU|aa(xYJ*aY?VJlbkt9`+DE;ik#__VM= zVj`)4Z(`!`21O?}K{Ip7rh!4bJC}7R`kv)EPs&uzKjRkT$g4-`3ZQkhW4kR1;_M%% zO4+@AJn zwNbw6i_#TD>%Pbjlco#dzj8Z8c<1~VVxn^w3262slJXlb3G3^&Di=E&d1l@kd+pXvu19)( zazbDC*SljZY>bgCrGsDJX$FU786_H--->DXi4gI=@ona_lsvV`RbiCw4zzBU&XXP| z%m7zw^xQy|`^b1~ljAhW&nH{%8A&oaUuV7bT`{9LWFr^d)ppXIoAa}?($mwOYiA_h z@|~T@sEU7sdxwbIN9{!G)*bHoF0NrA>(aOqEisutb3288)~I_)jA`aqDm|tQBk$nB zoPU?6*n>`LbgSl4;QYa7(VY)ljYM6~h5J^G+oJpxLhEwBA$Mr!IUV+;#A_Rw_J;AE zA%U&rwQnqHRSZk%TfHy6%qF!Fx#q5ZZ-CozK6np_?_R(Axp|i*4&9UaIJ4&qd?$*m zJHlw)ZPd$eg?4BO`5v=%i}74MCw-gZqe=crcdgq60>5tYOWJuaD`|dh`4as4DqY+* z*4t0+hV3olrw_f`UDDrnsTaLZ6+!DZo~3>|aZLB|ryULKY4V~MrFQW2aI%@Q@t-+V zCrGsiq=gK!A>jdo^~vC zB9>DYOttqkiF`0bc1Q?2AxZ1)U>bEO*@*3w zb=s!v&O!S+Mt#FmUvKXFxWt+7*>Kb&l|g|gFY)u(h@+dXOa{Zw*7>58Lu1MM=@ z<=t=Sy*opeCRfa^->Sw?|EXYmh0YbGGt(-q6j??0XHxUWvz-GAy6-3kf7aVq^Vy0* zPH@|>K}65{ug%LNWJm zA6BX6uvuZ;<-j*-kYvMl@XnwwvD%ZE_Lpi4yN7OYGMESY;J*N)Pst^JzAuZ=gxMb zbfwU`#vfWNsTod$epI(n_wWhYq9Aupkw82kXG{2*-p*lT$x)(4DI&}iqp6@h6LYSyMYF`! zP+2KS?08RNp-Tx%W#07ngQ4RTmr?%8qIC@ow?3iFzs(oeb(1Pmjdlay;Hz$@g|WJ( zw;PJWV#JD$-kiPi%XfNkT3_yG&&lI=GYT?K$qY4(JdY*oladHSuMcu)-Q1IXyB=Pa z*}=!HMs)F9hwq0yWf*G{T3V&s3oF7bq;r|lDY>;7M=+m!8tjalb&hb{YwqDrtI@ns z)k0d?9qEDcS01ff{&{XW_fx<`SRyB>@#8!fmu8uG?NjcdjvK%4PDxNNcvODlYOBvN z;Zo;UROQD$-1m$;daC1VGxM$DRKEB?H+Gb+0$R6@c)mSvG&AVx+YgkQd*ifPUL*#Z z1?mPDbXA|>v9Nq5s#-a3dd^OZ`{j&kL%Ol2t6_v`R)g6?n!KB4TBkOk_dAMc-JBi; zxv%xd1Oq$tYN@rq`Fc4>7RqN-9dp_h!WiEna%+~<6?-gZ>CNZ%jZUd9O~$5s4Y3JI z36flALo21`MlPZJRYL1lU+*2CJVYi)%&o&ObGeg>G+z1b zuj05AhC}DfYFcx0^6Y8S#(gihQqM3RyEm8X=^mQ5kqs|czh1UL>8hZ0 zOY6G5^;8cR%q%C(#+9AkIbok`yeg#b|4YY21KbypX(AhnM{0YW2Q=i{h@=6 zvlPA6v6d=HaWiUzkykmTB(yNkbo!XOCcb|BpycS=Kd1V_UXM)7LMYp88Kn!pL;X*} zx@9ubr%r@k>vVnD9oQ$Z9V5B>=M!)2(TjUue*d*GoZDQ%=%xG2_7C;O$8#kGKX1%_ z@#&p*o;J7p%4=c%Z1EJ7?!JFi!Tur5xU`*%>AK5@S4vMy4_Ul#wiy`9Jk-F_N}V{& zd3WVrg5yaxh7IZQb!73F<4(>8b|2kkZy&53MReMsG*hE;0Hv#k*3D!4+(+X)hWXmv z+VNo^s?GV+wz&?;%?|4G=KJfcwhD`(?%zT7B1G*4r;OTIYp<%!XoH7yuo3d4=>GvuEs_MU2# zRnutAcPY%&V$_}ZaLIH(`=H_%vX!mn@Vmdre$wC{RS*aFJyJgPQ_Z0#Pj8>xsjK*Q zU)__U?8B8YliFTqA`6(ZZoYTTN={PVPv7Y{YP zZzujq*e?k?Qi^`usJd_4DEspYm)>cv(IgSiyvmDVviEQ@TXN^jdfgt?pRnOY?;ni+Q3Y{`2-+!K z9~&`0ao9%r&i4|Nnoy&PJx^}k+-mSee_Yi#g4XS48&GQXR@C(iq2?|(`YJva=u-4ll*HuXkQ4)Hqr|ykx8xnI z3n%u_+^@H&e9k80&`c$jhR)2Z&?`qFoa6 z%e|U7yFOJF>}tQx?tFJt_){GR^VS-YB@WBXi%TOm`w}yk-{?s{cj>s2Es?h6tvY!5 zh>QpDn~#4IcI^6R%F>5FgYOUR-BR4ebvZfu`p3<6Voq+ePxTo%cCnE^&$zC1HRPtf zN%)QhhsCXQ3E_?((s%K{nE0gNRDS|}e{BAbDu}O9(3u?!PwyLF_~b)w+)KNE%L|jq zl3@O6<68}L!?Ck`8|!QIuTg#3$j;kEZY)|s7f{<;7JH2Cf#H{T8`N3%tDxcwe~*A9 z?1M)q2ik_K>h~>LUZ-h`ZN8L$G-5eZ+L=CbgubDxrOQ8bgLnGvgjekanW}_xIXx?=Nt=$nQL$IQB)b#l}bB%&m;975&-S zoiB*Hb5)g}&1fB$616KU_f zHNH4q+kdX;1reX)@6m)UdeGy?>VY&QNDn7rXkq1^7D?Bw=^t%UH$3-zHg$Z3jEG8j zobF{))TVIHH}U0XX|lHTRvvpZm|B@xg84M6PSi|Q(!}ESbGNi9&;Dl*TRFLL@8`j6 z1N!!eC_rq0Zu)}ZCK8&#eY^6Cr#M;hkc`)j0-6qJ-GkaR zdT+j&FHE$Tj@{ZH+)0|_C#fG@JVW$wgK@)6xfPMEjK*(E9EC!O(fx?=3> z*;jMK1|7rwt$mK0A6~lAAuuSYbW*m0eFB^G zH6+ZpULvTCf<82fI)+{`ZA02X?pRg>Pg2YH3GE^KX)P^1ogrg~ISyw!mBzx|ENcCe zn!ZPRSK|=1`tLqEp>_M|`+i=cq5rb$YDHb?rKWmIRhlDHRK7PVQ(I%1>qp7I-5eom z5ZM|{GfQ#1;n$`TgHfN2M70$iUc}3~FMY8i`1nG9ozc4Sw{BkGm)Oy0zyDDfZw1*; z2~JC?`&)u--sQx~f z{6`Mo`MaQX1>QJIGA}&Ud}80#$LV83T9eeiVaxU7hO(rXrPz|5pZSBzk>`}8^Qa37 zt`%#rtMi9kHQbe@syrCh*S~+!iUO|-#a+?5wAG1w_E2-s`Es&<)?5x7yFOwVxW~ry zq6)U%Haw@0nvW=LA+{*D$EnD1b9TDMXD-hbSC{_OYKKIUj6?ia_pR#U7N3J?-8$Y+ z9fIQuemwoHnTKr})0#iq+xL6EH^tHk-uJlj?v|F%O`1ndrS66i{U@pKDeXV|tE^zp za^6yGe%WN?O$prdb#hD;&^(0J-RtsTi{a^)OnPGZo=bFU=~Vk&b~ZscfN7rsY%2gGV?iG#lK`rV)`B?Y{JIUhHoz?^G(}6b}*V|$|_yA?zTk! zw6MskF8S&>b4TkQSb9#A+f_LG{^hGK8EO73_N9`qsoPJF=YP)F&Z`;B@4P`TaOAqK z4WEu+!oZ_PulS?ysMgt}YB)FEd}5UlrjPd*t`8n)-SSUuXZBO49Y|%1r{qY@h zPqc0oS!CZ>TdhRXMA`91-N#j}4J}=^dYJ;5M-^wyH-tILG_I(fHw&K&J9SfB$Mg$# zpzO$#8aor-EkobwFiW$%cwH5s>4nyv{K%VOz5lU_mdW|?f|nvEJ4>5Gu9Yqced|qB z4WwxZzUqByuqmv^RCDRNzo_cNEyaZrDSTr&m+hQ=V&0J!@4)NA`38Q={!ha8S99oR z-|RVZ%hxV~lzp;;SS@feO0NGphg7`twwtHKV_tw~*BaBNqRQVb2CT2qE^?_^j^|~u zl6^g?^~J$YaaEUiwcmXHQ3dO|=i)caVK1){%`-fy2m441Jq2g?hzvJPOx{-)%l>2zGM)14l1Kj(IsMX&q_@Z_DxP~|jj1^@a zVuby9Z^n3QSA1a~XHRA#Hj2b_c(Kn-MV?Q|_3>zW(ejQVYKs?1cu>ba>sZIIc&S4{ zto-&ttN!BN2l%0N*_rCTmKcrt73Au&o%UCyd70XAD3Rz?(I@hvF>NRH(l$?p<^Hh3 zU0>a64L_OrSeKtzlqj`&rKwfHqb8mwPJ@cCKU%k><%nM%nsk)INUD`&`w_$_z$#+;a^Kc@)qLLhG`-I%pVKmb7;c zin|nF7SOWw|034TJ$R>{rQp4&6TKKG^{?`_iqGZ65B8;%hEG>S4QKGN@v&Mi%?k-L z3_Duk;{fOJVYIH`^!DA^!OI_9`%>R<&raNbJf_}=7CW!cA%Dr$z5YEo!NX#(={ zDuzWo%vN=A>%&pB?#ZhPV#=3#vO7oFHFheBo>m#IW*98#61bJF`&5Ud&{H5|Y9L9q zJ2kkkm4-|pyjrcxf4b&8k&!`NR0}of-J2-gFtqOWO~*O8mG`_h?B%;86J^G=(YVsE z;e@Y)*~45)4OUapSOar%PlUKrA3~-e@2tEUAj&@M#;}}gX@B3`sER+`kzOw242Rhe|oEh>?h&+8-dn6U}5L7jc?X#`=htNEPDD*nWSWG_>up!41@3d|R+O?HmBYy64` zPn!~YpZ|8AX*CYG`+z94E@flAOE-@*zYR7qOVg~#A%($u!L#gp+V!%z6`6aE-v%mk z&j}e`8ebaou-v(ILiwWkNw#sGXltXBT!xOD+K2GEQ1cjCcfeALTyK7i(I-2+yPc;@ z(T35q?8>lg0=Zql)cnc)9+^%qHpc1BQ4}ub(G0Y=^gqehJ8d7g>^()?Q@r1orv|SJ z`z;!+8%H!A@%D|Hflu-QrVoSF7WIQ)Rg!a-=wIo{8FS@v+;3wtmSWT)0>6#(Q7#gB z<+z1<*m7?wSzLaL=ds8{9{Af^BJe9*xbDQDbyXIs54dd>v6;yDP%TgSw(ypFQb=u5 zQk?irXL%(_*F^0C5y|8geMxWQ&iaZ9xewfFM^0e1lc$y!;(N9dNjzWG#a)MD(Yi$O zulfVUof5r{zBeMW(l@NQc-&Iywqup@VX}ZoU(!NTAO2wA3&o!!v^9$XI_}F%* zW0#4>vwx(Y2`Udj=^jVxp4iRMe`tTLV2zazx%G?A>ATG(UfDI$-YGj?+~6zCcllU#t517Lg?GD{s5f-ES!W`#aK8=oVJX-gs^vbr@_UCp7r36TG z>i0>%5~%EvI>c*AvqSZ#>@H_Zf10~3Bb8?#{S0fgyWlOuKA7F4onK{;IX$ZR;L64o zb5tBop>@5sIkqOB?%B7|Jf`;viOR)tL7N@P54Ar{o;FQSsMRj&EK&C=F5G)xhqp9F z;-z7Py2ZsT5%P#K+Wey2_ht@aDBaU&-Oy7Jjk`pzo;GdoAhA|$-9B`$t$OD^*WM8` z*_{m+s{5@%<9sfjeX`IWlEhKP+?UIwc)fRmR{z^;1wjT`lRLQUCT{$mLF;-HTw0m) z5ft0$;l^>=x`Jv)o6SNdCDDN|0_qlH>5MGlAKu>4`j~eqr_D#%E2A}xN&EAgor__7 zGC^%BY9`f2D1Q^sy2iILSk4+Rod+0pwzSb!tj_bM#VM18qk5^AGixZq@9c_WtB4nM zc+eALvNJd2(I5-0>{*I^Hia{~krnUdDbe5CK8x1nAf0~IRC-=SML?|H?}F2!Zadjv z(V?lVage`{QK_S~XI@x=Z)$p_t*3XHX}`tMI}nEaj?tlW~Bdp&h&OfS6m zj;qT8WpbFaeqC)gDh^3#-4j{A1oTy3m{}TGP8-?KDp$_&s#D))k*+X+C?sXeH5W){yEbN;es;dnNypf{=Uuo8#weA6l51 z_H2EX^sRt=VA~^^Cy_C>Pou_En>LpaMfiTVx}0(M^5}lrgW;!j1FjZ59FLcpd=mE< zrF#yon>)DqV&J_9GUuq1TNP)L*dxE-l#2prrKZGGRWaJb#%Vd z+@GjZXx!%0thl(G(pZ*xf6XVeV{CxiLS`&#TX)bvt#Z?Sw@9)Vwgg zn^RxdRMj3O^`CEGK7Qt;x)AA&Cb}25g)g|hDOs+`qrG}y_;d#UhsRH%b&UnoP8!(v zy=cMhcX0C}6|LLNV7kDSSnnjkwZ&?4o`Id~-NS`Pt-9uYqZJ9gEfEv@Uu%9iu{kE4Vi8)=#4X!gg9aCk-Ida^y+{M4n}OE7^FoLy@v{EWPcv%rZY4IwBndt$WN{oju%8qa&n2FV{lNT@ z!@Im$P`Q%KW$DiDwjZVoS_U4A*r^2V4*t{LxhUOCv~F*YT19c`jc-g|?;j3}QZOld zJ%3p<8g(sxMZ)rS$d&obF%5ynN9{}DBMk`(!Ev)IWnR_4tRIMI$Awb4nP`QebhFU9 z;~zXnYj;~e%Pk8kS`a>ABFb@HNAq-)nXckP_rlomsTm*rpcfhyRYAK9w?==AzM!Tl zt#o)LLuvDYxF#*KUFh!{T|n#Z+5U6OP1-Y&TGwBCm2aPL5Vo*CercY0W^B4@kTcA; z>qb?fV)5%JS%pFG_M6noQ!{S5rj_nB-+=Nr8?C#aoqSe3$BcaQwZa(D z=~vwia*_WJdv5|y<@Wv!Z|o#87MT+%nKI9kNM`mSqTYprVy_pqZwD8ln~ z41;+-2h}!4miV>$pWJT$F7JDAb@har*oy!U>4qM($_nM4sX-KHLQgP~R;wFtACR@gR_M`IeCnh*==5M$V81KUDbRc0g z@=oRryhnGx32|SUsGE${)wz8U_nLmdpgAt)q028-v0fdia49Z2u7*oOIl59TBDps^ zJ_<(LD2L~VGau=vpt|}&n{DGza-Pl>jvEOmEHhDHy6z%N#?p^>;=-Ozu3PhY<`+xQg~V5P%mpyI zDOlZ&?{9=mdY%*Na>VcM=bC=mYxg_-j0gqti4M)TizQZL~beYu@43jQi0js5F(JX&VsdB_h6_((weJ#r5UO zvDa~~V0CM$TO&rE>YUYh6~`}b-8X&fZ9jb|Q(~RA9#6`Xx}dQHzmBeZYC>XFCjyRE zmnKfJsYTL{@F`F2_BZwqt=oMMWA9b0uEYK7`vRjyZ*Vw>i&-kjtrhF^;-1J2kznNL z-Fx``Mjn~n&%U}cZnXBj6W2bp^n7mYv~gLQ>bkTs;i3(Ztas`#y6ITmfz#7*8xlUQ z5@~+IeQ;dT>$b#@j(o&mNkFuhYiw0n&!@vhI%+*VKSD!_`0vPQ{d%?Yc2d{THLJ36 za1XR!tK7oqW?*&S8K;G7EA4wYc2?N7K*>(bRJe>!bDPZ2oqZ2AH%zvEa&@hwuP~75 zdZ_m>V>UCgL0s%?+%#@-i{iPb&Cs)#1F5OHZZ+b1`T4_-w0&t2)5KRj!`OQbt6SO} zUo;y1v{&-d?OTg8oxYg4DSo043gXHQ%HuSYsg+AWfG8qkA2zn;Mo~OksR~=4qbVnvw8Vy_vh|sqTp4_Wcyszs!`R-`LTU zd?25n_4bU;rpjerGFhKfpI^O4!&BgF+>-m~ZGkdIHw&vfme@@!fu9vf&fvGK{8_2B`_}YXSHq#`MbZAAj+4DTpIg3vd%`o~RCGJI!;|int5?;f zZ{yk00*adBA}2g2-Pc=T=f62v-ISf-rW`x1YM4$f75eOo=USYRD(Tg3!tgbt&66XM zYf()K%Y{j&v8K~szntsjWT-zUv|n~r(>CYId@I+dA>7zFnTyrE#j4S1es)!0N*{OW z=;?jsoT?ty#=dV`@D>r2l~pSgb>hEMKi2s1tRS$cEG5Te#~QApofGP%LnZrfCsw&N zVAq>@SY6ZCkH1tGg+1#$u_`dZ=%t#8&~1^J!SLkE<;>m#dqv=-kVt64|c4zXF~f5 z_n%R*GT^;(tpc~);8f!QJ&B*C6vcyL##9gY+Asbl!=bl$TI}c6&uJa)Uq1I67f)rn zoj#f(*@%skx3Ic$ACBqdT|RSlO7QA=4Jo(NhD#cxzS1xxa&k@OjP zdMUq7)j;G~pn3D!#HnMpu{d#`8z+u)m9w`cNh#(f334`tuW#v}NrZ z@~p0MW~ku#=vxZaFuHfJx=#0*?FW>uswCBQr|o%sSLyy}!EI%$ZD&}Hc5Rtd&h3yi zS$AH}=C!6#-K!c7L)qIS-r8aPdcoW9(w!d?Uux~Z=oVmgm-K}X9}T`fT)(F0aq6*^ zAw2!Oy;R(bnYRwcy|& zg;?Fl_jkUutsPzAeZ8f-jKS*dO&MmP!R!rLNh?-{S1o^gJeci$$MtpPL&Z98ntb>M zD3+?P-4(8}VZ^ILN!6S~{|Uz4BCM{^LpxU8@x^iBjPDMdlG(d1_C{*m9^0$=%E@NF zycq|mc-k}Cm-U}B5^3IcbLQz|P0!cO{h1sl15PmkE6S9J9e6?BYi?DTtzwFn&H_Lyo$DvK7rMk{I?~L~Q zr;I{7GS=)?Y?F@vrtwjAt-MLu8-t}X5g6T4tnRI}!IcHc_J?{Hz4aJ+o^L+hGo9L| z8vC8g^vs!#pK0yybyRedKRo}sd{l3L-RUIJ7WyNG6uwrt#<~leK8{DbV07pODk`L2wu9v&`c<~;{>a<7@Y6&b~yJ&&=s46D1@!eo`5Hka+<(|a@1 z+PW)LmwoLo^R(DA6!@BDhS{=RzrM_z2x|ParF{8<`JUS)4`-YQ`Q~c%ixm+c^0gru_e9E@J zZs+4IRwN$HQN*AAQ-OD>Gmp(HjJ*|D-JJ8wHU%%g6y~{tQOYRY#5A<3^HIj#Y>vn{ zUdKnVa{b+WJj>~w_iksBxXsbqcf?-&{S(NyOVNPP)!T3fkwpGvmMNEX|>$UI{g zhNDHJ@3Hs2-pA?=a{bV>T|L0wH`Iyy@xxNAfHJK7(v-FBo2dhDR%@IcR2D3^XAU~Z z`08Tl@aGI8{+`D-L{c7IUT;6B#U;IekQZa`1FWvGmbTvhH}!`Oj*Wd&b2YVPUY7o$ zUck{o;9^al+@YDXVtMM@e!Z}HAk(Btad2k%0p+plt17Lv7G?M{ZSkubf{SY5G> zl(Evvn(9T{*)^{{`Qb!yKki^qiI~F=Q7s9@cQxio0gvj5$>#faC5 z@1r?y1-5GTuo=HU<#6s`n10{d8YCv$37hJzBV@^zz~GRF9>s z?RQ^c_I5jvr7LrvR;H%M6QlbWtE(BRFMiqiQff61N7q*hdrbkZor_sB!pm+u9rnw8 z`!>h%fVqVs`(#$y8~u`9Lm~p7S6*I4uUWi`TEJa5e>E?*-fFPACqg~m$hkYTy5w~1 zVo(~`F%g){XR6c-GBlTV^Yq`zwtW>@FL8s* z@b$YW_JBL7R{9A=r`77Xe}rt|dWq4k!|J9fCd=z4O^XTSONyn&tK87&%ueu?(4jda zkk`+!9ff_&I|WX6bIxpir9ZGrKQigWZ&5Cq@1-A-&%FxksWoG zmAshE^jGZj7f-Ods~e@A9}UoU%9%L~JE}^DF0BfstF`iu2s@&&Xz8JCCmx(Rmhqu- zjmWzg<-3Ys_YP`3iq15+f=hhv{^B`@a>(p`nZLm92CVM2clmnTC=6T{bus@4+je~E zviJ#MFR9&Um@m=$e_LuD(A*ZN=UU(;Vhs)vC=sYjvvw3pX`h z5?|eNw&HW>nv0Z;i>%qzvFm_mSY10`nleUS>3+)obh^hm;+sTSZ-)-XweGdyZf>`> z(BCOLZdcf%&*NRmy*#~Zo%(C*C*>F7)7IN8He!ujE}DyNXN_3h&d6lrp=FYGcOyGC zUMLt8IhuIga43FNug`J~r%ziN)5|8;CUoD~=pKf<%oR|?b2RUayA7UGjZ$#cswGiT zir9JIbF8j{yVa&k6SWhmRO7bI$0_%|jA5y}VYjI{RaDJy>8fOAefqmhtRE~>PVMtN ztghF%eU~%aw~U}|p7 zX7w1`nKcL z_9-#jC2YdzzQ*cG3cYH0bWDMsx00g&nTBNg0iOp9w~vb%aD{q>#O4pgv(g@azG2Bg z>*(R4zDu3_rVWhvy8#{2b}SxCnoaB@iP!y!erUt$Hrx!$;ooRv{U%;e!^drx(AI{X z_jVQ<(QoCpYCr7DxI09y-NyC|WpY5;%M!`Sh`y*7y=+N^Zx(G7jj?k&!@`2G_YGEe zGc)Cen(5e)QJ+Lw`}##Z!tTpo4<7%uN73y0x^ii?#I-vXZGJ23azTmS_hU6(*GYzi zx}S!j-Cy|LR&QC7DoDJ4hiGp*RySadDTdYEtZf@UsR@BswcyEk2y@=v)UrOw?Gl|UN?^K$F?M!r?u=|r;SY2Mfr%QN7 zj#aC8eWDj{6>z=$u{ta<+!6oD(u1MsVw&#JU6&KQdhcC+*?RT!)9cS;KV;H$Mvk*z zZ5hDbWvV%Q4P$RNR#)KJGW)Zaz6PD=S*|d%S20iF?LqDC^@4@xx?`fcBRA(8_kB>V zRk^q;;5z*t>o4NX#xs`Z<=H(x-p-EZ9OnOIiP7!B>aO2G<#us}j*i^)vFjDJarx(K zjofyzscZJA7F719cQGY7>RtuG6kvM%0hl-rezf57YHe=_L@3FcvJsDrvou1HqS+SC$?Ux}g;Md*6t?CVDmgJtze)Veo z&#zZJ`6oQpsczS>H4JV$YeIM2|I^7;Vfo9&$5Vw>OR;|F#p()3{ct%z#kbsInc}A1 z?1pY4*Bu3d4>ZwEFK^?0dUG0!>E3rLH1xNN4``*H+gP4eygi`%5TnhHs!@NsTLu$}Ob5Ltp7v#I z7FT|Cbxr6qzJ~|1`S!p2ta?QmyPx_It9$RYlAFGir-$`@_uD^ye7>~v>Cts`R(ul= zvfr`qDj*e($R*Tmg*-o%DCy6D!}xNOiHD`p%Wci1bem*!KnXVRgM&SR(iZ z)V$OR3Qnmy;^UH;%*L&jafma%)>+?6^Jr7rI zWt*mAt=iU!VA@$fR(DGc-DWwvx+M8J&u24fJqbVW-ElpQ#@dfRFuI?xx^Gr@1v|Aod32R`_(@(Jm9&+ai`kJkA zO8u%~Vyg9J=P|QQ+O3rs-9fCbYRuU3o;r>8lEI6O{gi#9jeK(1646z%nhz`k7keA! z*jNeCzP&QzI{hp2nab6tWk;)4>OJcCY!}m_sV4CJB_~FA2&-#*tfc;uNyQI*T257M z;FDz$i^8?E8-Er(OZDuCkvgwfw`SvErC_?I)uT&pC~j3s)Lq=3z4n_iL%ILG-A`A+P%xS;^l7s zLL7C8kAkuD%JI|1Te}`xHK7b;DiX-R##f zIn8#rKZ3Hw$|-c(SYOnXg{FMSRPajyZ>sUVmG{33-Knlne;;DweEb7l)ay}^cif4& z6!F)Wj^nY{k4Le(PSG1QaHDRWx(RvN#C&OgQgq7dpz^kd=MPyq&MaxyRX=pO z@`ox;c&AUWc1Q*-Z*ASulcuY$JQXX6EXUT{7*==7Bk3g>WmIZKqs)vkNnUm)YxK|d znollvsS&JXnmK*_-AJa`%`nZ*Jf4(Y!>9Ng_wJ)sk1P399)2#~x5t;V$vm&sb_~&G#lDvyW~8X2ney-LF{Ppht$@f^hf5&Y+>qGpkSA z)qkpB`|cE$ui|pl;ZeS(ykTH7=g3{#^Tz}W8RJ^h*Lk_xZ}5nEOUdN8T6o~>Wmk;u z1XformTKSg>)gAJB{w*X`aaa6XT8l}q7!Mqh1*Ym7vI*`JaV1N$F7Hm-8~=oVP$rf zzb1b|-Jy1Ck(Cb(Px3WX3t@D>VRes+e7IdvuuAi&sp!*_E7m7jw04}M{KRO=aPtjY zw~MCIU6l<|ZZ7pgFX=uRT)9NsJjVX2nz!46iDPlLD!1fyCyeeSRyQkhUGBv%AMuOU zQc+zW;N2W}qqFpAIr}=V-8;4kruwYh_AdV^A4A&A$8Eu*Yn-xh5g$$mrt!%N2unmM zwXXJig3+DA>QaaZd~efaxX;g4W}UmMS3Z63h1PeP)n0vfb$?p#KUEYZ9x}BtJe+~6 z>VqG>{n;;-7h8jNmA^QD#9uXVcx-9L7|u{qPiOg+B#7Iv=Xdl( zy-r|C!ZjLNVRV0Bb-NgwXe%a!ih|?s8cJ+$6PER&=qsAuH6tVBhHv9&*FQefoqqUm zBxh8-vrbgv!DVXqo~~V0Bjt0*ensdN{}JrI#!sy74T~?~C3gys#0%8O>M1{Pr|9b| zT0fwChl%lAoBBY}W51jLNiGTX^+$M4OR;>H(BIb0?pukcO#ft`R-2vp6uS@p3#%Lb z#mrsw@O%AR_}EZ;Zny4byl=jrIQZk*eQs811f*BHPPEGqvyQqSw_M2R&Qd%r+Dr z9H76`sD4dBHSTVFB>u9&7`41?x$>v!?-GL2k9{*%EWxfXU?KOP1OHw4iqR7nJ9f*8 zD$dhxN{W34Q;T{ELxK4deg{Ilf_t>46jME#n) z^IAK@G4)1))r~WY3%YUW$?L}U+cUIJ7?<35_+eNu+DeI!VqN6B&=nt76zPS9ydR8I z8g9y);lIN9@(bg$Gp@YdgT6b|oG!8yVst67y2l&ejEdYI5ZrIJr#M^b-M2M6T-o)k z7Mmw=Y^!#NbFj47Y8-fz=kSLo-d0iXXK1!CzB)H@<%7J6RrkhB1AH?xMwbe!yYI(H zbDc^?a&SParmtvbxZ1Yi&@<~c_ZjQ2w9B|qq`Stf|IofR27{(kcfzU9FI9TBY*Bs^ zhlj|~P~W;U!!Pz@bkQ}**#qyoIi+D0=TtiP9)53{*pyOmv2kv!ctIW$b2fMmnGnW7O?PWm_g-E>!cAmNjt1EnZ<7S+^0Nt-+5;CRD ztmdWNlNUU0Z1s6Q9K!BdxxBYw=(QT#WFox}9j`;lE5+?AqmH+QrwG(HG-u}EErq^e z>_vO{vj^TIidsGW_{z&Jih=BxC<^y2X;&BL@3NCO{8^hqwISbGgVL!??!i6I6Hml% zMsLttWK_IYiY-Y1Gp%1+VE$URum18bgsZc|9O;SA|q!^*25dE&Xhb^rm7MbGd4aQzl1i+HgzcPgp^9*3sUua#4M0aTtbE5E_Hs<6ph zvHB);C+(%w$E$w1X?(urvGR_pz1F0pMuh*yJ?l?z-x#s<_(_LVW>TJ^BOSMHR=+tA zG)cGQ8Md9FXSHSz{J3Op;f3S(j;j0o%zJRwt)uP8TH}b@V!C(Vv3F|atlVL`V%@T5o)+gHXZ4rJ z$r`lUeXE^fD7dKaRNyH#y|u~yXRXV_5BYmeuEFRo$Lbao8x$Wk*ljVmASaW+YJN!-VJEqm~3d@_?Ii)auKzk>%2mZR3e)x=-+mX|ST*bmsUG!ta zrw@+>8lL#6h-2_=u?*$!YMxxQGR|tezwMEW;Z={D`^J{abe>zB{_ygtTYYud`3_pk z%^rA0PX^r^9ep%nZ|d&m^2^7wDsyF|-Bom4>ar(FZVSKe3$aZbaJDUyJy)48yUM%1 z$1mA_>gD&cYR9FPF_G1H4UD~9Sl!4qrn*148tiWz&T;?Ac{Y2I>bExa{T}_p+%@rQ z7;f*7xYmEBT2m>oU3Rx^@0W(a?_12+2Gp{n108qE>#gDs#pt3r>+FH&-C@TX`b#;y zbUIsn{9Buzav@W~=6%+oA~mZ{x~IL{;y-G2YT4aENx694#&LnN?I#7UMmtc_hd)x6 z*cor_XhYD&<03#1y@PS~z$@4$PaJi?n}t$6VU_4Jd;F4GeoWRyH_uYM%N*xQm7Mwb zMVsdZ4I?9_#o}g+k65msG=CcWR<11hu%(^)HJeU?F7f$7UaYQB-zFiRf#tulnyRCD zUk0>sls+i4Qb}5RN~kDx`RLKnQao$lHpzx1M@RNhP_G`ZY`gDGL8r5_yjYgY;EXgs zaUO-EVFE)}Vs*z~zVG`s?j^e78lNqW@i={)=lI^};6i`?<7>RQpVw+V+;Vkog!dNb z3SE!z3(bpi*T`?J&%UKoF6}d8P$C~q^e^$bMLw)J-&CpHP2$wk6QnjbMujEW^IBWh|lY- z!s;I0x4C%-Z-=e@xmzq3JD%O9(TMulOOhSd1<|R`>1`uA+-ZRBhVuDBiGScIe>Gt;T7Fmt!2Ij>W{L z=P2XiQM2dX7g77&Z%&bn)O{0j%!rRns}$eO_fD zITP)zR!TidE)QcJG}p0RRF=zfm|7K9z_n8M!;zW}MWw+{*Y|rID?Rt>Nt}n$8*BOv z^xVdGiSr#|y{*RT^5<%?pZk@nYWn>#JLmf*d2`WM=a4+fnJ68V z6BQ%%SL#0XZn#+7vqT}h9ru2i**Pm_jaLZ4UK|aw7ronY_P{@h<_^1g&FS$6lMCz-7c5-K@l zAC$@&*~aHsrgD(}^@)APmp12m%5<&Sq8f8lOHR~Hxp`Z$QF9Bu<~mC|Ep@X#%-y)2-uDzy^Ddt^& zt0M9$emP5#Y0xi%F0uWhcRtM?_+)B|=$VVmA9tNxdqdSyPc3q#+2`v%!xW2#t`F^# zf8Dqt3knmJ^A2^yMva|AE+k#j(1h@xD^5+N$Zv zpH$>l_N23TOQ?ODX7>8gs-<^c(Su39MEJ9(&vQ!V>53DN4!wKIe{5XkyB~iO&C!D+ zJDWF(7nAHo@pnB|_bk(qimwhGR=yXCLPS0>HD1%>u9Uj@R?sdYW@vA80$XCdfzsVu z+Occmpt8wJK$5J$}{?i9^3EXkeU5dj+IC{E^@ACiCIV|Wc zcwoT;3m#bT!2jtUKx4%o_W);94pR>Jjc^z<(BFUZKzVrEd;7RM!EeTM;&2R*2Ri5M z?-1zj>4aO#^*H{2 zkjMY6`%-ATuX8I7$NK-#ScB@w-`Q)AvmXw(-5iIb|8KGr<-3bGox~|_!{L_vH{}c2 z{_BHivyZndC{T<2vpMj;&J+@&d;{zQ{ZL0IeE$DvhZmL2!QICTZAeh={6C`|fT{oJ z_%GP<|3~>Re0jkG3m#bTz=8)BJh0$_1rIEEV8H_m9$4_ef(I5nu;76O4=i|K!2=5( zSn$At2NpcA;DH4XEO=nS0}CEl@W6rx7Cf-vfdvmNcwoT;3m#bTz=8)BJh0$_1rIEE zV8H_m9$4_ef(I5nu;76O4=i|K!2=5(Sn$At2NpcA;DH4XEO_95^ne2Cg_lC47gW-! z`1?7EyLdi<|j5J8$5VlHl`q4{`Q!5#^KNv-fm&_4aXrm+j0R zzh;OB`Zs$2DSEaPo}DHfv;RiV)ZQgMbV_{xGY&@u=kAft5#N1Fd_PDH=^XL*uW-0U z@I6K(00(;iC!(nVe57-zDCp0{0DjUr^nOhAJ@n3z)ueM0a02CtY+DECkcKqrd#E^T z;2iqC4Cx%ahYYutbWWCZ&XVLW36u~HT9rU)sSV(kzi|-yCNcr#joyEP%7gMo_M-fd zJt%*aAH1soJ@1a*PljUzpm%*T16Tk_Ad(EY3`hZ_0?@l>uK=zBP6N&W&H~N>5&-7` z7XXQXi-1djlYmnIZGa9y7oZ2w2PgrQ0V)7hzy^RC0R7g`OTZmK0Ra652zsw@37`~! z>K4^y8K4|c0k{u9?-s2BJOn%fR0AFZP#xC-&^v_p0m1+)p^SWhRRDf~0AMvh5U>WY z79a#z2M`8`07L=s*gFnh|Abo)fY&VHBmq(YX@Cp>JsU3vkOwFL6ah*AWq=9*UhRV0 z0D#x8;5Gu(0h<6C08PMVfEHj2KpUU~&;`J&C2;U637i4I5MTs=SIgm60G0uk1GaJL5#R)H2DkuR0d4?yz%D>Mz!e0ZRe&00sbxQA_}4z+wOmUX1)0)ik<1>k%E9q?}+_~Zp}0ayUb0JMM)z>NVu16IPn`2ec``~U&KY5+H2 zIe-E=0tf<7TtsmY z{d@NOPE!0ESA|4y{J+IP^uBFwqz~W#px+f60vrb%21Ef&0mc9m0KA@r(4SCTMDY>D zPRJeyNeM9%#m?DtD3;<$|3;sSNdKPw4(gkzpQCumzJ5U@!@dU*c6kkxRK{1B`fa1|wfEWP9DipU+ z4C4W;0SE$C0pNW!gjmN1pQt^u0#FP=u^){Kvt>n^$PQ#b_8dLt-;D4#8ZS`%neY23 zKg3~mQ0#)&ZxYU-JlFx~J1Cyb=EVztBMzNMW#9%N4#jSCP5^*-?0tUlsrZJ$j? z3FolqXY=_d=TM$}80}dN>~~Opvt`2iVwV4FI;1s~WAh|emj9V^C|~qFR1V}v*n(%ifO3s5I>t2*8acx#TdRfi{0?I z6~G)|2KbKy=J^AS+uHyZ0ABzao4o;E08fAiU>5+5-EII^fD6DG-~@04H~{PcI{`ZY zb^u$zb^w|OSOX#f$eu%hgMb5o2*7?oI3NrV3fKn-0R#ik7`+#;2M`Dd0Qdv^0E2)5 zz$ZWw0F7fO0mXoPz;(biKqep+fXa9oa0ze`kO(*dhzA@4!~&uLM*uN^qkuTTtlJQW z^1%A*0{lAxfbvD$8Ng}4DZp94Ily@UvM(8s0zlup0!RZ~1*8Kq0Ji}-fNVe(0NISv z-2mhQ@&M>NHvzW*NCWXjfIE4BfvvI9iRqK4R{Qw1)wxf0M7u8fER!!Ko_7D&8fOmi{080Co^w|TS-GF|;N5BU_AL(-xK0gCS0K}NrUV_zmYb}q3Us; z0W1ZElU0!UfPm=}U?dg9rNkv=(HEG2iMgB6#J=~r=qw{om~SozhW4CnOsJTX0WdNs z$=n+fC&X?>7=P&4i_%Dl11aI_;~xO;L&j~le_A)FPjdhm1t4S;2@#SG)O06nJr|8! zF#|>#7)cpIoTUZkvS5U$NR+b!FtU&j7&iMxb|Jhw)0QRQg9wZ?vS2S*jY=APZnq{~ zCFMEF|CIDFFdV?traVYoPwm)8NfA!+!DV1rfnjTH2`o`LyK0WP0}MMbea6EE)_yep zb87b90Zu^TURO~JEeYEw01VhBB`$$;^z;uxjA^IMJDZLOI<)E~9)8aDjsfuJiI1;3 zIZix018E4pmLNn1sJ)1N?8@KWqs?6A7}Wn!Ehra8iM{*m%M6U1xRgBPgIW)&x$UPd zB0lY~eMLz@B5+E;Faz_QWsr-dkYyt!v;!##NP_#T1xyqhR3+ua6^OA3Yr!0I7}OAB z@-D;UjKd8Jus}jwN*byGt&x!hl&!lX64a$ckk#UnsD0u`P2NHk~-N36W*t7SXU}D5PNnh(P}VU($7)M%h@{+0{%sMf!7slp&clS zgL@=!!1&q2j{y8SaDA-dbLt3cA>xwKL?*!A!5?SE>$~Umarv#lNXkO+G^5<#x8D)c$b(@- zHFs~{z<^QNQRYowav!36#O1`Lp-vse`~#eQ{Ug`mYkY@AegFd|qrLzP*yiaxX0t*h z$Z@|PK}|*hsBkKxuSFARoHpItnF@>|s6h*fCNWQUyCu)4tk5E)LCqR>g2W_E6>uq} z##n*XQV?Fif(s-jjlPK5qv5GNq>&MqNBuO7#Q3o=%RirZGzp9(bZxLZo5b{PxgqX) z$gCAHsPV|-?vR+mEKzaM9Y>E7)CjGrjKqj~mAj8L$)WPdh@;}*s)0d~;=IvK+Jk2b zhHjymGDqhBE*LjTmgd_%~PFco7eNgL;#NTCgE8 z>q9r{>#SJ^@eNw9lnhk2J1{81=2eYV7Yc5Zg*4L8cEF=SB<8z=`bMFaji|PveV}}z zNz5Tjw;voo^$rl!pdMfz2n;i***z3ya9q@M8`NaQ2{o5VV(OiyR-N4Z?gAkns3Dlg zl9&lmNp8**u`Pr&5R+i01q=(Qu^%!G4Wmvp1qS*LvfvGgDIT@w`Wf8u9xQ<7hB6u= zF}{A4Orz)Cq6jNV=)kxcV3vWJ_ISq1&pUE^35*mZ!?D1$0gZr*KT=J+NzD97P$Sgb z8eq^^V)@B8zWKT@3#5S&OI#LqVt|2hIO2Fu-eJC%NxO*_AgfJ)K_k<4u20iJA-%MO zd{8zx4`4Wfss81;EdEjg9i)Lag_tN36VRow`gp9yJxBxL6_xZdFg%bZcl+893(Li# zBsE~>iT==jpTH zp8lJXmQxdJdudioS&Q6w*3Oq>O5XWF0H**UP2;A=vA+e1TqTk|7b=f&|1 zy4=8^`jMNjXF*3H?>8xwhU~Z?jRM@iDG%A2gIbWEw_Quj6Aw_O&Sx8pbAOrDkY)~l z+p7Enf<4{+VI>jqeOkcZ97Y+KK@$2l%n<{EeVuWN69G%dnH^QQp_z!I(&LICq zZzSuT|NSwZ5Ua@gVE$1CqUFDfNb~!EY>S81E2cmuW-h5We{8_92Mcjc%F|XhLMV+D^Ot!WO>yqF7He1{Ct~I5=qyKy* z{#zRrCT`;VwpYVMG0Tv(n$QmBw|btj5n2e@HVR8;N!&N+*k}bt@%h&0y)wR%(5j^8 z8|!Cn`@Lt)GGwhLY#04*HKC0{-yR}2ZWCe%S*xW9dnmtol(6^oxAR1@wh=r^Huj>% zOQvVdwvhRKeFP?aXfMFInoTxTx}ccQPv@V9{9P@e_0Ml5o%QuUtOde+be>v(lK#_L zKzk0q+xEXw3uJBkZylX2V7ZT0yL&h9Ei8B}fW|CX63o9|K-Gr8&OGDKKWuM=UFtvP>v`hnY(yd(cL@FTk68e_`?5H) zafcB3$o7TVb^SaZ1*_-Tah_)faK2f9H0-MWxpqB&gq^3Pe;Z-ZrXlVhM%X{xcHr8> zzpc67_Z$d&x4*Y4c~};sJ+$9r{47I0QjqVBf9p}WJ~mIJ_``l9ZyWTv`C~lH(*9(G zMSIa?dlq4I{;!_%{oAn-uDAWu_C}m-{5Es=w-%rlPu6dQ9VW8TlCUfFd%OOZ7QjCF zJUerLv%7-A%OA7g??w!?n@4U9_^)TGWYq{eGV{~|jI{H_M3_O6jTD6a5VB)1VU0fj z$n@7Mp3C8?FP|h@Bzp!1`FO*+hNEV(*vS53ErF3nj2HaGn0EkNYw4TJ+?9D*hrkem zk`r7A6?5_SS3MQ4`BT08=N$9LY7TZ96>((uUFMnL&&~qK&Z`L5rpVUMpWRz0v^TO= zL$elBn5P}UYKpAYgzIKxttRxWKjv$K)eUUKou60S5zJ@1SU(chKZI5_kJZqB$hJhn zPB2-kWe`Pngf6$y1fhJoc$dF-94RfOaiJJdl!Ex0tVV4 zx^(x~d%u7o-1{YsbMbfH1H+7e@ri>gqK0ES@#y+C;X0tFGu$i&N1{qoUmZQw=jH#| zW%IWuGA184#WJ6C3&JpPRWT4!sU_P>Gi->eoMQr<{ru4{wvHaOp2-xTP+v~C;|BS_ zKhV|Q4+KjZ9A8!}s>z#6lLnXM(Vo!B_14GM6sRgLr#KF0mcf}^_*@E~;l+XeH44pA zpaxAB#kUe*(DlX@=R|`$a({lBQ}ed>_HlQDdw`8ruI7Kx5(hqjazY5f$-)LPEu`^3 zqW$Ym`sz?%V3b3)sR4u3M4GSoJ@>f1oxl)gPljB?`y4tuE0VIM$`tVw1Xn{;-brHI zOH{7OPemJXi1)HyFbTh zk{DqYA!&-Zcd2uXC5drh`>}*^KH4_mlL$8{jo@34c zgRZe8b4irG=y$Z9W3B@O!*GPjhDH%?9_GwBrh>%Kuh8sI&fD{Nj%g+_*;?+lerjtk z%`pQc#&c)dOv}j<^*M$Dw#(3cD9=-wcpeJ%8_h9|0>t*V!H)9Y%MqHl=)OV1C8PQJ zDa=$mAPrPe#NFj=EVjol9K=&VI3TR}CxHPYA_`^($7nh01m~FLs|nBKL~KnQ9^RPp z{MQ^K4Gc=tB6WA>*w{9TImQSWUSOyLnw&hJeu4Hjn~xVsEng6CE72FVY>qifViZ2_ zGh$$hem=)!1H%t$amRmNDiUD+G{-am1BORT+Fb~jxl}hZ$9x6`S@1z!kmjp~=EFIL zL6GoVMTGp?Tm`A=My)wU92iIzaq0lKRrsE-LUW7>Fi6d;vm!Nm`~c@1;|mOgkqEWL zTV4EOYMthoBfy}&PM#1Wir&!Xh&d($7<8TKpx$MVf$OyTb4(>L$fJxs&m~2F)c=@c z+DU3Leizqv#OTn^G4_70glip3AMv+tP1wp0aR=?GLTx*F?jbN02c7b>6ZN){VwLpV z@2VfU)Upk4v9yvHt56to_ZM^Z^l`xLjdb}SZWM^_7lWB4nj_6KE=Zv}d;EPo_c-H( zB-5X9^#y(-s-eAG|3F7Sdw*wK;UizViw3NIz(5>DOIJrX9}jmYu)Q+YmP>7YDS?qi z`51{2cV;Bjt_p@8V&){KK@rxH!~}7>H+IL^p{t}2UlC&u42sIP=y~5CId)wP7>M!6 z2OcD5!0X{f%a2>@fkEYg*h@B&6GqxVQW~!7``_k$EPy-N329(N-wzBLWs(oy)wuSP zAp;n6_a@{MOJZXEc9q%c_E!S~YXW53Szyq88==&;7gdj@d(SafNQ{KfvkNCzgdty} zd)y$=EfQmuE%1pxYR^4VK43uwFifDvEzP1J*tj|g7<894%s+0Q2d|>hEd5A|fUsfO29ihN zYz_dmH+8xKT+WjRM@im+vt;`Mx>5GG{zI^u;Oj|9hg!&$U3&t9f7$R5JW9ABKBTb<@CaI^RK*$dkQ+G=r2j_7tZ64VGarwi?r z9@1RAP{+C3s~GN2B+OmltgpLEFsf5&y$=(Ght{F{o=}~FUGv8SJ*aVH8*Nf|Tjb(* z(u6dG`e^_Ll`H!$pz>U@_U6gP}nZ=iq1W=&g#al|5HBe_g0tUrI zU|fMgYQpQae@xmC?zDi*HK?T4$g9A_Ii0z6udNowQ}6-7Z@WlLh3LgLWpj32U{G`c z+sMQN)PcdHUe125&hR;&!E%Z6l*nJHu z;Dh4hTdb63@SyAGA6y26arlhE#NNo`E zL38Ek#p{v{uH4QfsKH|?@H8?2UBy;jscjc>N>`8M11RC|H5ZO*4w&D|6Hbaq_TIr> z_5qG=lYvu_<^!h+;7(cCQAKHBr^Lz0-OrbQWda8ezX{B|fgzOVcVCB-e2rHk*0v_& z&CGyfjj@FLZVBVU@3EI)8`SnZYZ0@RqHq)tZ*E!^9ahoPj%J&=ZMOC-$j$ub0A z|89XD@(!r&S0+Z~i>yVTIHT@)Kt9mkkq^!RgW6~dgQ7PJtDX)p$ZwE_Ff^lD-*#-6 z)5>r&ss)rtQsOeCK~{&nS;_RoQ7jlS;8AGpULlYGjwX|rQKOcD8o)@w{r;fl>y93i z@W<^R9tc*^WxGtu2in_BP+JaapSC*gGmaAq2L^f%Y6p8&h$CS7M39pyLp41iAA)TM zfkD0AD>{DxikT8&fchvj(y4LzqaH4F-nS8@Lkjb z=g-H>-P_$4R+awLC&C=hE1|nYQLhKT32q?zt&&ra`tFXMUBHl9l{kr6N!eq!b$Hkp z7&OR0Uyug|jp$KK+dVxaDJ~IgBV5Vf1Pl`}94suJW&(^aNowFX6JXeY$y(a-Yeu74 zhLDEf1H2kh%{biiUi+>59AHS%g^|RRo48j|{(6Dp0m(bQ_5p5U9?ro{{uRHPO;nc5 z<#P_wpgy;e_3e433YsurNG)-%o4cbM)aeti_-|K?#?T$Ph=H1O_je9*2IiXRwl-6i zPpxxl+&2>Ihqiwkk6Oyn?}U5^R{!qN_3FeKst$ajmiYN$nD3?5Codokv^U5KHvY{zQ5Q5s_F?E(h1kmRgW18l5KQNW-{0My(NFv!=} zf`9o)r*Ogg2emiUg@ZMS?ct{<#Z6y+%{E9w>h+g^L1`wx?{j-#c_y8bA_~r|fHOJp ziN*yU{%(QFCH!dAM703ksRss)3r<#550V*E7Ew|Z!WmXL^BO)0qs)uJ)geAiRs`D! zF=PT5WVIyi=zy@+ay%tP51c{0LsgSl+lK2Oq;b?$Er&FueoDq_xa5oa92wit3=)_~ zP(xN*Q(StZ_3bihqogrwo-|M%+Ra1@2A!Ki z3m8-$huy1HH_|aG07Gg!23kZ5o?B)$>Wp9Rg*b|02=o#%C53%@WHp(R&TloT7RZzo z`2fm8rlh1aWJ;=+6U##%;)F z5Eu^dLGWn7t2b)*i17_#uMBRH4snG%#q8|yOQzuhAq~`>1nxdC$fG-T9O?Lvn4^}6 zq6_$7zBDp86Fp+<^*R5HF+4^;0n)&12W^>okQnJxjv@DxQc&N9GpJtn!Y3VkZmG0O z*vBe@)=cPbdzgb91P1lFFe&ks50+7(l^%Ev`Cy*443w1Y92Rw8@^djld49JoNuOw2 z7JQ`=j>8#$WG&A+#z5Ts<%-S{jd}W?I*T66Ya= zSsE-o>^<$BoPT&${WP!%+5u^x4v=kR%R{j3uO4NhkToFoToXg0-|kHDww;JbE(SHi z(@|15TVUYH*@*i5mAY!XbPf?2^lZf;V1$5K!^bASGSs|dj>!gw1(?G+8}zP>$NVHR zXqHq4463J$lT7yy;zC1#fm(oS{p~qdCW<=vE)#s$(TLa%*p_|J7mCroKdUB>^8p5_ zF=}YNVN@MLy%DTN_qvAygZ#Gi)Mhj0$X8n^DTE=eqvI5bQLUyCGNpM8v!_|+8ZfAh z@|@K5c1$_Fca9-z0U=Uo8xvc+;G+!FwOqR(z7hSVh;sx6?Yn$14xutIzfgo>AfKhc z{9c~<^C4SOLY(EM^6noLr9cY%Ti@!TwYzlb<85f}zw7=hVj zWNu_|>~#5@uX#ue=cL!rbv=HV-OkpJC@`pX4eZ)?c!`o6n!iEYL4H#Kh8Y;$f|;() z?Oo<`i~%sHT@UmnCYr9V(gz0hQwiAX1_q6UIG6H=Lnn5(6Bt5o3;+hLHLXIfmVIUI z%$rj?4a_QFWI~Uf9}B(RNn}v{%a6 zTt33U@S^f$JEtc%T`rtsg5mXp?*0L|v4oo~oT01GZV_o+GQUTEniKcm>|TEsH%#F? zGN(3wUzo2Y!W%`%_7dcs`7I#ZdWkI&w&mfGvcyQ)rgovOawV_u?x z;FCT?gTAP!4`Pr+pNyCo#Wzumh!9~Og5r}A6eJ=*ZS|Z z*IxVM?7jB78We_-U8(=`Vlld%yT!KhE99kh3O7R`hrN=cj({ zyI=j=-wHXuM9#a&d9C{WZ@T>Qcl~?F`E8f;clZAI17G-?|M=OE^C#rUzW2{Q{h`;M z|Hw1duWg`dC{O`~I=egfofAUwJJ8ze#lJ?HG zf9L&Q{mzG<+i+IBW|jV#zrXddpSXDaYoC9Q>F38^dhcJq#{%9-?L4p>#!m2N*-x2sKzU$4Lq)j6DLThF`Mj*N?bM`C}!na{OqVaWpPZcC?2 z{QhRM>R&m9{~2rX`pL<1wYcn0y7kPORE46a)wQIGIbU{lo7r12@Y%Xqw2!Oxc6n;# z#aiIR!xOG}1SQ{Y;P#XI&2&3&*7L6Go2pqp;ykK^=dl7#h9pLYGLBa2yFmD`uk%|U z{pc-QA20iA(>-AGnF01?K=t8Dmsf$zQ2JIw>BALMxO{)*Nv{cCgkk;7rzq=pfj;g? zAr%|iK?_26XLuKnJrK%ICCjLGW2U_L{-M15ROa+YIK*zq^jre#`l?xrT~fDcyCs2D zJ9(ffeKT(+8&djtJGGRnmV;|jwySwpPbYJZBA4}|!Ra+U*3CEViqNFy+tvtBu*rk- z?y;m|j#ICg#-z?}HRYa$pqOq_tpKdn-HaO~#cCdJYNSJI-^`>;GbMb{HuGt9(XAI! zyk^|jLVR{!pEvVUhQy}j>cO7SK`7jx(SZ5srd>Xv{!ZGd?;EP+c5$vvTGH%`c49!t zshT!Dp1Duk30zIO)e{<4F&C}QyLvs{++TN_&Ag%1dAD6onzM*RYv|9YW6~{F-4eD> zH{Dh$rCoUbuDWxZ#uKW(ZzLLQi0+v@h?AM~1X5l1jDVF# z*Tu|<^a%o?g^$|is%kH)Wz$TXX1TlmtLG2>?$E*3(O z#ag*Uremw^h0X<|nJ?FdM4N=%^s2JYOC3KAU&amh2i;mGV$r$`Ak+W2v@&%ql{rXU z4iy>}1|29N!gL^ClKJ`T<{k&@=FCdZ`UG1Po8_$ejhBqR|})zz-2czgLiZTyZiuh1Gbl>WC=y;tsS3hlR+k z3uleZ>8IR^-}jO2vSkA6b8G9hvcL~yC@CIBO6`qnhFBPYP%b?33hH)i)*RXWsVdwl zP??Vwh%CS^K-}`>Yl?*!O{0KBG3^fB6pSYDYSqo3@TVQ-8RfZ&M5{=a1CK_1OGHsocR#}K4 zCX<^C;H2QHW0#-pfolsdpx0Mpq%Ql$ysRK|qe&qw3}@mtEKj+MY4|YigN9{foFdrX z00awwP~Lc^2(l>=@$w_}msKtvEVj#m+yX3%PLGs zkmNs*Hr;H-9?f=uY!EY|9T!!xq|_?lLuPp0Is&A>3`8g2ScsO@KbmD&+gaYjLd!hI z5ph9u=xw~kg?^L*gM50FQR02Gp~NYby3Z4oRMq5qoz3zDUy+58s%SB=I*lywb#rAP z#dYgA+hdH2_YJ2w#!Hldq~sZWfhEK%G!ZrZ?=~RhJ!;pRZ9T8#cs|qlqmqUe)5^jq zb9{c_0Ar)T04!X|E>o^}prt^^41Y22uJYUrr3`3@A=dI&Gj)WIHKPx4U99(LM)>wK zgb-&Ec7jN?p_aR=>JfiviFbhcZ5|wkPqq;q)s0egZQVl+{HLpN?4yCIF~2o<;o%0deSYE1NycH*>Esmq(cmz-L6C* z_=;&vUT~~TdemSrLyQq4c27mY4QCdP+MQtN>aq{DJN$6eE+*9FRT{awQxv0i5jhDg zE|JjMp^TAQ7|G%BsNCdU&vlH_!cdl%b?UUEAxEjlM3r95y{}xUoiiD!g{hQ}>@uaD zSsA5;<>P#xzO`d7N2y1>=;mIksqTr5P=nMc{)vUzblPFdEJHP;p*zb1?I;=Gdu>P6 zm9lZ9LDa-8Gnu;SGIiT*bQ+W$++KYx-lM$)`ikXeFFwW2(#RwvQ%L#rM&E%$q`$Iu z^Z(*L`}%3Vp3ej04)-+*17$JAXZ>6h0KvaXc?1_1A~natMSpPpj?$}c5)Wu{Wh8eZ zCzrWTdno}o^20L5AlE5PoY68p$qD?cKcwf_x7~ek5xc#-IGJR5u|l9&K-Uv(mLRwnsTskz641Mld|AtJflNR{X3fpe zYBjlc*Qd zu$ZPAL)>*OXA!KWuG@a{=vwNcUG?|wHn~qE-weYUC{TzrA<~PCI*rgAS02p8kHT{8 z_E;`{AXXw-u#)(JSV`Z3mBbIkij@PXIC>ybq)};wFW1O9f)IUq(cUrD0UQ% z4o8opv7>NwWO*Eo9f&h%4pR#_QS3mRL2C>riXDkVTi|EFA$A~6m|1}dkpoe}lnqLV z9Ef7tBC|XwA#xx}SY$v6kpodo6xK^Vd?1Ej5@E!L55zDr7#}`-6ozSvVH~a}ep5hO zd^qA`%1IRFH)2mB4l^=~h7|zD0`grhS1qywF-x6>!~ceBYXurg#Z%-cD^h-z#FWgs zj^^IGTP^xWlTr3Cjao7U2OaLC_Cb*YU=ZLlyD;b6~hvIQv+5Vb{n$S$PHs_#CsSoJNOzzj!KWnjAPPw)D`kX92xDp z5mV@b(xrHj4ju!I;C3OCd=zjbp#U2t9tE2ANx)6hkAe<*5MV>vQIOU>Uhx9%DB~%> zN18vbVwC+96-7gETuGF5R0X3MAi$3@jsiDP%SsVupislE+^4LD@nZAbu3CKNQI(9R z<50sm=O}nD3|VD%%rkENA?K;#cg!`0{C3m}tB>5=dc&8C~j#Kx9jdwEu*|vr=A6yK{ZbvptgGF{ms*0j^$6$nrUbyP6 zY2KcTnREWcE;3{m7-#6sQ5+{ooZsm^l$s;S`}lb~=M?#(olV>6lWx0c>gA%v%ugK- z3@2)ry%gn6ZjFUvcYcYPWF;0lOAITyEyGSxo@EcETTB_(n<2JD7T5>!yr`R;KHOq> zSk2elAy z=rlpQSP`X*kuk3{GaYONK(PQFQoiFE+7gK>YGIU$s+KKye1C)C!|>tclHpxE*+3*e z9L$!lK*n7Tt?z!h7>8LpB2(eeaMPfu&6c2-Tzg_f#P*k2_pI7fIij`%xyf)BAOn-! z8gFG7h{|FQhEmsD3+hLb`FqMV6uU3+2t_q6BnQneauJ7o@Cq{N)|^~-Vt23J544hg zyOL4XV+7r(iE!0FS+F)e=&Or)owE`tP{Ku_gz9`z@ZzUIITh*oh|-p>`qDN-pC+Jv zdsrZuV;_hupw}KcP%p5;79;SA&dFX##O1(A=x9fI!~{KnJVf@B9}g>_5?4cd4N{c1 zyZngtQ0R9g%aT?ceCgBL{kymZeKy=S>Gn7t+~L7f}+p zZWX}Hm<)vs!cmCs@!x(E7mtlX4`5v{^Rv=UcmXlz(L+BDq|v%@;G8{2cPT~B)6ZN%}bdj23I33J;8tOaO?7=h&55e;MrqZpk~o>Irm zNt5~$VN->uDjk>MUC|N;S(!G7L>@ZHJOl)DrBV}|uP}&Q2r^#h78<^TE#uztsC}uo zv%C6c26Wk0 zMYaOswGDtF7#f-3VDJM6-4KLM3@RCNu)@Yo9f-Ogbrl&UYdiz*$Uq+em?H*5$;)*+ zoi$gyUOnX*k{D8~#J;0jEEr(C2W{DuR|MIu&bNzY&(4%*V%Uk|sIXE4x$LLhuHrDV zE18Q3Mrlb8owqhHTu7I^l2P{JEeIBG(TmP#5jo2}tItwP^Q-FpA6yJe&ZMdt6)L=|xlWfY_SvYI9hhCYcS&hkd+npS{v zElsBtojmnksp%IotWJ3NoRNpD8-VHZfko0?Gi$l5ClC5nQ$G+xZacw{FOPo0lgcN& z0&Qlzy%in3k2Cibh3i>^JrLgl7xXbtT(cI|y9wZ8cLwb$n~jZ`0&Se6E49w$9LsQs z)353)CaW1<0@%m4IlIBA6u?nTd#|)_h^m7+is@cQXL9W0&e?j2Ews!7vXiLP+un)Z z4~BTAE44fo=&vpkrLB;9?Sn#pm7>&?5uYNAl=FZxWa!2+!*)_G0<;b3UI#m(o47KB zSU->n>U3Tj)mqqedLXqJ8mFeTtOn`~PtEhp<+47N*DWfCZ+143X`3$tz7JPA&PwyH zj6Cr-3FQ#f{d%cS{fKphI(jj+#fO-#ZsPD3bzjxGPG@-6FO5(VxKWCBwaOR=K{YS3 zr>tf?QqN%~1qCum(2-thpr4x{_hI^bxDRjpx}K;Li*0+hdN31D6>^${)9>6wI4%mh zCzF-Z9aCi*cNW(SIp@pU79&b`mgrvRU9~)A#~sBhar{g?PMzG2lPYW)CB9-az?*VM zV6ijR#TP=h6uw&5p{$RbnSU}Lmy($__;T>?!{L)mSgGWxXOja7e1Q@o!Ae?TO7lV} z1WJg6Ps~g+q*7*6m9^txh%#f#){>#kOWDiTzI)l$UTo+1aiMRRgPD9+9lNef4L49w z*$p{pX!*M~VhN-urfO80oTJ_uL}q1}CJ4zMI12EHYWABv2qLLm<% z6f(&czxBKhLh8c^qdXde-a#57I*0BhNYzhhBh^#qqlK^2oa*@x^M-Hbx^L^HYFtKk zX+gM26U3GXwaOn9L~0}eLF-u+%Eu))E7d-4WBhjwHT&>hTi&zXA4=dvpG~x1{-`zW zkBj%s1`FqP{UlD@=)&hdx8e-5Oc#T88Th$NrwkQrjc`!!@*}|*F<}tAB(4qRuV#)~ zI$U$$x+$YXaV-%Abwn}UF_qTd7|Ban+CE5}Ry)gn`Ch(kH-#%!DFMCw2&sI{<&~K~ zE<$?VMn-5IK4y20ge0S;+yMq38A!oUqd##DKFPMQR961SyRPh)dctGB3B zQo_cLWZJ~D_|lTG%f%aj?)?*IZP+cyoJ{kCHwE8t@H5B6b>H^P`avc$ZLV(;IvSG1We_?2%gFdTGvGw5v9Vw} zuo>F?7^&UK&{nxG0t{`9 zG}4{7xrX6}Z-vi2x9ia_rgfU-pMh7nGQ(pN&&PAu2xVfJakcJ(78db~T9^~lS`zL9 ze3HB;u8L{U3kHDpW$1z-MbMl{Q?3hAG^Z~Sno9xAc}KA0BJDY6Ly zUD-3mKx=LwcMf(P#sXU^6G=Di8b>L{Lb*>)Mo5i6>fGMm~h!_ zlUFVCf>>7Iif`6z_GtLcw20&8%jw-VlRYMV4S3{oQu42^Rl zZp!EpquS%1?fsP3pTkqVAE4JKA_ol9t$L>8*oH)aZk_w1Lcp z^wVcpQVM$w{reA)>MzW?kJF1FLY*%5M1 z3K0Ta8Irj^)=}m5&8)VoN{g1ULRo31CloVOtW`><39)Mm4)=lJU)4Unbsc4M`s|+a z+atQjM~0Av$39~^E_QJoFg)qnO{Omdb`#p;0bVxbvgN_Wjrr00x>4MZgQ{d9ip`#M;BVibEj)aTEwnLBya~Jd}ZLA3JU@)(;Nkfl<@_LvwGJ(=RJM#bVpZ^1ly)>=> delta 9259 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 Db8A;- diff --git a/package.json b/package.json index b6bdd54..605c5d3 100644 --- a/package.json +++ b/package.json @@ -14,16 +14,22 @@ "@tauri-apps/plugin-dialog": "~2", "@tauri-apps/plugin-fs": "~2", "@tauri-apps/plugin-shell": "^2", + "antd": "^5.22.0", + "clsx": "^2.1.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.27.0" }, "devDependencies": { + "@biomejs/biome": "1.9.4", + "@tauri-apps/cli": "^2", "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.14", "typescript": "^5.2.2", - "vite": "^5.3.1", - "@tauri-apps/cli": "^2" + "vite": "^5.3.1" } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 1ee3cf8..6799274 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -2,15 +2,20 @@ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default", "description": "Capability for the main window", - "windows": [ - "main" - ], + "windows": ["main"], "permissions": [ "core:default", "shell:allow-open", "dialog:default", "fs:allow-read-file", - "fs:allow-read-text-file", + { + "identifier": "fs:allow-read-dir", + "allow": [{ "path": "**" }] + }, + { + "identifier": "fs:allow-read-text-file", + "allow": [{ "path": "**" }] + }, "fs:allow-open" ] -} \ No newline at end of file +} diff --git a/src/api/fs.ts b/src/api/fs.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/assets/icons.tsx b/src/assets/icons.tsx new file mode 100644 index 0000000..1cdc092 --- /dev/null +++ b/src/assets/icons.tsx @@ -0,0 +1,29 @@ +import type { SVGProps } from "react"; + +function createIcon(svgPath: string) { + return function Icon(props: SVGProps) { + return ( + + ); + }; +} +export const DirectoryIcon = createIcon( + "M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z", +); +export const DirectoryOpenIcon = createIcon( + "M.513 1.513A1.75 1.75 0 0 1 1.75 1h3.5c.55 0 1.07.26 1.4.7l.9 1.2a.25.25 0 0 0 .2.1H13a1 1 0 0 1 1 1v.5H2.75a.75.75 0 0 0 0 1.5h11.978a1 1 0 0 1 .994 1.117L15 13.25A1.75 1.75 0 0 1 13.25 15H1.75A1.75 1.75 0 0 1 0 13.25V2.75c0-.464.184-.91.513-1.237Z", +); +export const FileIcon = createIcon( + "M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z", +); diff --git a/src/assets/icons/directory.svg b/src/assets/icons/directory.svg new file mode 100644 index 0000000..38c304e --- /dev/null +++ b/src/assets/icons/directory.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/src/assets/icons/file.svg b/src/assets/icons/file.svg new file mode 100644 index 0000000..319568f --- /dev/null +++ b/src/assets/icons/file.svg @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/src/components/FilePicker.tsx b/src/components/FilePicker.tsx new file mode 100644 index 0000000..8a12476 --- /dev/null +++ b/src/components/FilePicker.tsx @@ -0,0 +1,40 @@ +import type { DirEntry } from "@tauri-apps/plugin-fs"; +import clsx from "clsx"; +import { DirectoryIcon, FileIcon } from "../assets/icons"; + +export function FilePicker({ + entries, + onSelectFile, + className, +}: { + entries: DirEntry[]; + onSelectFile: (entry: DirEntry) => void; + className?: string; +}) { + return ( +
    + {entries.map((entry) => ( + + ))} +
+ ); +} + +function FileRow({ + entry, + onClick, +}: { entry: DirEntry; onClick?: (entry: DirEntry) => void }) { + return ( +
  • onClick?.(entry)} + > + {!entry.isDirectory ? ( + + ) : ( + + )} + {entry.name} +
  • + ); +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..d7ee959 --- /dev/null +++ b/src/index.css @@ -0,0 +1,10 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +html, +body { + overscroll-behavior-y: none; /* Stop rubber banding */ + overscroll-behavior-x: none; /* Stop rubber banding */ + user-select: none; /* Disable text selection */ +} diff --git a/src/api/greet.ts b/src/ipc.ts similarity index 100% rename from src/api/greet.ts rename to src/ipc.ts diff --git a/src/main.tsx b/src/main.tsx index e247bab..91a43ca 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,8 @@ import React from "react"; import ReactDOM from "react-dom/client"; +import "./index.css"; -import { - createMemoryRouter, - RouterProvider, -} from "react-router-dom"; +import { RouterProvider, createMemoryRouter } from "react-router-dom"; import FileSystemView from "./views/FileSystemView"; const router = createMemoryRouter([ diff --git a/src/views/FileSystemView.tsx b/src/views/FileSystemView.tsx index e4b2563..d0b1b4d 100644 --- a/src/views/FileSystemView.tsx +++ b/src/views/FileSystemView.tsx @@ -1,45 +1,98 @@ -import { open } from '@tauri-apps/plugin-dialog'; -import { readTextFile } from '@tauri-apps/plugin-fs'; -import { useState } from 'react'; +import { open } from "@tauri-apps/plugin-dialog"; +import { type DirEntry, readDir, readTextFile } from "@tauri-apps/plugin-fs"; +import { Button } from "antd"; +import { useEffect, useState } from "react"; +import { FilePicker } from "../components/FilePicker"; export default function FileSystemView() { - + const [currentPath, setCurrentPath] = useState( + "/Users/tomhill/Developer/projects/DNAvigate/examples", + ); const [fileContents, setFileContents] = useState(null); + const [entries, setEntries] = useState([]); + + const handlePick = (entry: DirEntry) => { + if (entry.name === "..") { + setCurrentPath(currentPath.replace(/\/[^/]+$/, "")); + return; + } + + if (entry.isDirectory) { + setCurrentPath(`${currentPath}/${entry.name}`); + } else { + handleSelectFile(`${currentPath}/${entry.name}`); + } + }; const handleFileOpen = async () => { const path = await open({ multiple: false, directory: false, - title: 'Open File', - filters: [{ - name: 'Text Files', - extensions: ['txt'] - }, { - name: "FASTA Files", - extensions: ["fasta", "fa", "fasta.gz", "fa.gz"] - }, { - name: "FASTQ Files", - extensions: ["fastq", "fq", "fastq.gz", "fq.gz"] - }] + title: "Open File", + filters: [ + { + name: "Text Files", + extensions: ["txt"], + }, + { + name: "FASTA Files", + extensions: ["fasta", "fa", "fasta.gz", "fa.gz"], + }, + { + name: "FASTQ Files", + extensions: ["fastq", "fq", "fastq.gz", "fq.gz"], + }, + ], }); + handleSelectFile(path); + }; + + const handleSelectFile = async (path: string | null) => { if (!path) { - console.log('No file selected'); return; } - - console.log('Selected file:', path); // TODO: consider how to handle very large files const contents = await readTextFile(path); setFileContents(contents); + }; + + async function getFiles(path: string) { + const contents = await readDir(path); + setEntries(contents); } + // biome-ignore lint/correctness/useExhaustiveDependencies: not getFiles + useEffect(() => { + getFiles(currentPath); + }, [currentPath]); + + const sortedEntries = [ + { name: "..", isDirectory: true, isSymlink: false, isFile: false }, + ...entries + .sort((a, b) => { + // Sort directories before files + if (a.isDirectory !== b.isDirectory) { + return a.isDirectory ? -1 : 1; + } + // If both are directories or both are files, sort by name + return a.name.localeCompare(b.name); + }) + .filter((entry) => !entry.name.startsWith(".")), // Hide hidden files + ]; + return ( -
    -

    File System

    -

    File System view

    - - {fileContents &&
    {fileContents}
    } +
    +
    +

    Files

    + + +
    +
    + {fileContents &&
    {fileContents}
    } +
    - ) -} \ No newline at end of file + ); +} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..614c86b --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + extend: {}, + }, + plugins: [], +};