From 6fc0172ec3e4d8500a88ffeec603a698a291c2ad Mon Sep 17 00:00:00 2001 From: Tomas Horsky Date: Wed, 17 Jun 2026 01:45:32 +0900 Subject: [PATCH] updated README --- README.md | 13 +++++++++++++ public/DB-diagram.PNG | Bin 0 -> 23475 bytes 2 files changed, 13 insertions(+) create mode 100644 public/DB-diagram.PNG diff --git a/README.md b/README.md index 5b45fba..f04c205 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,19 @@ Journi is a web application for journaling and visualizing travel experiences. U --- +## Backend — Firebase + +![Database diagram](/DB-diagram.PNG) + +| Service | Purpose | +|---------|---------| +| **Authentication** | Google account sign-in via `GoogleAuthProvider` | +| **Firestore** | Stores user profiles (`users/{uid}`) and journal entries (`users/{uid}/entries/{id}`) | +| **Storage** | Stores uploaded trip photos, accessed per user | +| **Security rules** | Simple per-user access — only authenticated users can read/write their own data | + +--- + ## Code Organization ``` diff --git a/public/DB-diagram.PNG b/public/DB-diagram.PNG new file mode 100644 index 0000000000000000000000000000000000000000..9e21662b5568b5c36878b0fdc60cb088c73565d7 GIT binary patch literal 23475 zcmdSB2UJtpyElxZBN#zIf~YjHKm;iwz0Oco1Pmxaz+gmCYADi6EQDTE1eB^lU=Se` z=}m(W6#m+D^mlml1{NH;2*ng{b~Lu7gt%* zUOM7;;NN?^&R+55;@a23{@Z~^{&jW1l1@z`2Hco?cLu%_4~Xzd z;JFg`_V*p~zYQDn+>km_t9SRV_FJw4@~AHsH#E!N#vOOQ5hQJ}zb)~CtT*PkGGtl9 zsXOMzl}}|yGpbJbc!w(ZxQH7mL+n33GDfG~xKa-DtJfQydlfu3ot;!&R8*JKy0e^8 z|Ej(qyx`TX%@@s^Ma{BYTpI2e0WK~m57%ADF0N~Tf`8*W0@}eP04(%Wv;h~FkrWpf z(BSUxoECoo4N8BtU^h6xX~FK|?R}sRb_;d`TXrA6y4d?K9|Wh+u=369ZDQVNhSvup zsrZ?8N2bpreYr~n`0s7vllgZ&G@*UZAQ6wykkI80^?TxiXaOO#k}{O1UIrv34MN<& z2>4rq4K9Fj!0%_WArVi3#xVv1x=^0eP@ZE#=+Y33z;%p(3D9=UNa{T>2+(#e#vnSz z;2_ZPh|s^HLyLFD-adCOiHVDgOa|1G=d#2VBNf}S;CCV`9DfaJaSx(%=hs{c{s2p8 z{hFe+7qB|&vDS|SiNYv(oux2Ka97iC`lMMv?D9OyZPDutli0jyw3wYV;+W7J0vCgk zN8t^VGd7Dq*Lu1esRfR3^Om1~kMr(k?m`M_su^xN{Hd69%+V#kndZKzp7DVaLNYWz zsE}Ja8$+t?x1rn!{d+p!%b|e30(;*?xO3~z(VPhqt-f${nOt==rbv;3#IW= zNg|W1`Rk)LVECK97SCTBmw7*=b;HT8L3fGKC5*k4BN%$IfjPKLikbHJrkuIwkrR@? zuVK1xfkCQmzHC7|>rH9Fg0cEP%|)Ye=l1^^pAXBT*%2(oxr4B&RzqQM@nVO+f9jwuJg*M0-+(s1ma_DKvdp+1|H}S; zJ?Rc*ON)Af(5iPMF^m@xGCGvntE?`T@!t1Mos~MBj^4<1ddgEbr-E5h>8=D3*?+;J3#-HQtV-Wo0 zu-FBU_J>p4A1_|4>?g!M?g=eK)MAwCvWCk2CDp_-TxnXAIV|!jxFqS#ia#~2-~HD4 zkSvVAzEmK{besWYuq;ag{ty-^QZkD)JNn1w;*)em)fr`|tzx~T<-3V62T@12B=e&h z8RUw^^T>G(=@W@gs31oF9|E)1K39Ipt4ajj^0k})z6O_dOYoy_5jHY*pAd}bJ)5VK zV>7}V~hp?5OozP zn8g!iuZ4^{+g8$5i9`A}g-+E`+p%G$4O(Nfb^xJKb}I&F6`hm1RGmTzs-q}STQG?k zCKV;Ygmgql-4MYi7ZUoqa%O4qrh&{5pmX(C=gHT=seKX|%ys8Omm~5?C4Hl#on>RgT-76QqeeMpB~DobW4l z4{~GYzt$n*_^RmYyZgg0i*p-p4>=)-UR)z4O2^_F2;~WoQ)$oWa0JRIqKZA zD@j+~VTC^@ck$H`cYb}l(P`d$cbekUeTHQygvxR9c(6ijaw|ER&`~_>Je1oV$49t0 z1isdIQ_p`GRM=P3rw4=WYgyULU}#Ro&$oFggQ60zx;cRTi@(ghu4W7$pAa8f?Olnx zIqHeD97x^N{41*UUNflMgjM^3v&1SPw7Cu+`t92k+|9GR@>mgc)=ian74hkiyXip| zBJDqm1M;5bH!`KK!`i1j+TS)k!7<+)d#!(J*RU+8eY`rYe{5}~te8}CsLIZ{QU3w{ zQEQYMmmSka>J%5p7uVQJ*BIw zm&rn1#J9c{91STEL3gC&L@+NG-r(Wgh4VUcRSJ~hV%2UZiEcas!thKZ%_s-lk)tmd zh53#ZS?zw8@QSx3v7WnDkCiol9w)zhPAR7BhT39_svAx~H8_#1YV{fJh>>YXx{cAB z0`b_tC`Je|Me`4)I?33zvE3`7O0f*7o@lTb zaG4WosE|{tQf0hpr!ihqMqS^o3G@xUs1ysIg1qisygY9hjH>fKY<>oOmqEVl0n>c# z01p@*qAINAiQLU|c0}$+Q(0?m6_2*fWA-?RmLwXKtCX0Rkp6rs!V0VjOTf*k8Qtr5 z4A-waKu)q0(IQ-YRZU(mYt;%SC;=>jN6ZPQ2IQ_PyCmXc@1a`7I3xO$>N|6rj*s#7V;O%Lk_d>oHI=e z%);S!zTS0{&;b_Q85($z;|&y`fnH*{4~}k6Nj(v#47Y+Uq{}%L&5L_B?W~E-T3zT3 zSdW|s=^>j4)e>tTH~YLd0&BD5NH-SOfB5^_*FIbQxpKWl?TK2Lhm@5+c$QHiZW zpEaZUS$;jEV_~%FO#!mY+C^Ll2I5cVcuE;ihAqX^PDwzg{jbAza7B=I`|aPn4%ssZ zWr*zVR^>>8qULyXsX0PZYHqV#S5w>Z_JrF}WNqe>H_cXs3~N8jE2?2KBeU(U2(Dn0 z7SWyWthsGvBfdcgYKQvve)Z}t3%gvpuZ}2(20}zYU_foJN+TmS%5O5}L|Yv0f%Nv8 zfmq9w?@M8()ZG|(oq)UaX3GFeB+xCiOSLXwwXbP*&LIsDoeLaIsO$pomWmwe=G|r4 z2@z`w)44|P)8!<3Ft3ogBw)wKJ7(I8nL2K8t zDZ)0~45@uoir4|{8%P1Sj+h~$XkwpRl;iNVbWR|B?kU+~^y?_{Uphm=BAcE0t2p5V zh*XSu)zQR3Bg7=XFYUoF?T>A10P@kxJr45D3Kqr)twhDxnbLuRcn};yPs%E)`&2UE?=H*MgRe-$cY`G zrjKaWjyPz#z^2V2AAjy{LB zwxvVZ8m^<&ejDR*=pfWcbvaWZ^=nc?n-8OS79M#WnSQ$#K`@A}T9q>D+iP)!wvpyl8G|W`UnrWR>E+I_I#xvv-Tr2D4Ewg2h)N#UcOJ4BT>+ zg!QH%GrP~J8(9nPk23G~s)_J$yc5Gq zZCX)@I`_A7G4KfuP+JS3s7bA~m>0q6t3DKuE0F_!7_Y^e*z(a;c;;$V^I+=SV#ylq z8zC)vlIf!;f{q!#)Mt#Sn87EC;B%{y+!lW)Md!?wp1crTDS`JA1>5>}JdS^KUUpqU z2#wf~XB6F*Pm6oOtXfMA>VTZ;MGPzrT(`$~ouBEyp3{ZIRv~6r^HR$WqNsA{y&d7` z@g8!YDbXiewW~#nvjww8M58=X{G;BlKQ(`Ho-q<|A+13h>U#(+Rn{|zxhX9S_`>n(wk9Mkx7L@zStS1I7XR8J~dZ}~)fwE=p+2UW=_L3JDh(Z<{w z#4BQOostuyE&3m_!dOO9p8;cd1cd#fWM;3$sz^ax^5#2JgluB_{QgnngMDL&&`^KH z({puIl_-qB#95%KHL)M<^fVZpDA<;krVpyF{`Gu2^|bgwtoKYyADA9K{2E=#1NDb9 z)Z=M4!VDB875lBZKYpB@xG{D?G;1Z-1HxxIrVLUaX_}cg3~B7u5?LPh#A?5;7@d1D z-bdjli(tl6X~S7EE+eaa?;W&1yqbluPzxGw)^fjwcqVpr+IQ1ONFQ%JsjNCdVD{GG zmufUDUN;X-_W3NqsSSrY24?~GtWmbk>ghN7`eiAY`1Oj3kZ`+D2>4KkPC?wwm1Ed4 z2b5bq1yS^nx7(uI!Zl&*Zlq{mOy`kS1f)C-A^RPQrE z$npZwkMFT_`ozoZ*oPYKb&)M6+^zK$_IJN53CxQ$UOv8Bui7z=nc7cC)A28aI0T5D z2dvc7@JvG(?<+t5Y%DJ=O{=f5-$XZzu61^9?JOq*1VaZhGlfzg36wOvv{->&>xs1d z1dGP0B77MT_oK%Si8T@nU94K{@Xz7MF#7dbm;LziS!MPhX$iR1^6vIS5~B%km9E;t zOBiOJA&MYM|GS68e!Ln-JNxvk52~F0`Yd1AXx61$X5|~(FGL4t|CF_EZ#!6b;Z7dl zW!%IcnEeh7(Y7L+r42USyDfSQq}>&=!TRb(nxF-2K!(lfe4MPX*c4Hy>7r=(LY%vJ zs@#NV(Ac2Nb=d8G=^M?+-MI2b{X#FGzpm~p_=nCTZb{S=RmdYlCNa1PO<8;jg<_HH z!qTE0zLQ%z+RRj`=Y$;X7#x#qG733WP&*XEQa%mlHdee;B7}~^Q+tc%{)5{P5idZG z`Y8H}J#H_2nVpg1I+!G`m}rU|JAY*r8#Fw~yyx`gS-x0m@N5F-SOe(zIpRw~xsFu- zbaKc+$DDY;+fH$xmDTyyeW&V04@Z#HvS*oBk6&{Y%i1(!oJ;Rd zb)sI^pK1RtDUj2jMHCiYjh77)-Vf#315}i&s-Xwk5~ z!gz%^BKqH{Ps0?AK45vLFKBpDM+I9lzGDV2oiULJTa zRUV)BVw{R8t%#TAGQ1XvFA8*>(7bxe>BwE&CgEMLWYusRWNGt7ifw>f^X77o!H=p) zb-|ipY=#jc`p0d;KV917DjgoR6-5{Ran6*e{A8$GVzNXH}lic}J$jK$|T6uZKMr4wv(?5~D#!7_ZSZKBzKLoj8Oc2JDK9jC| z4McqPPik!rchKcuMYHWXzieu^U=O1kpUy~Bl)6J}-2P1-Y#x6nzc3Ogdqg26*Gj%u z@)n~MFp2l^+w8PHo$rsq`J@-MTF5@!g!L;3`7ZkGfAN&} ztZw$3hs^8W#AatgV`1EP@H+|13h=Y9dDE79ty%puAHs{2o4b^}?sD`_> zKtTkK($hrIYq85q$o*AOCy;|B(FXp;+quE28YqKn#*Q_p3H<;(W`i(;|GGH*pRRWQ z0~GCr^32#wGxkKWktBzc|D~M%zY%EqFRbwY4GKGDBvoo(xF#b80BT;w^P!X4abvW` zF|)*-PvzK8FaiUn7=iDxK(izxskg#02G=BG4DQP9N59qEkLH3M2i*%h4%$(27W^9x z_;Yv!*|iG%)c_#J%&~vl!6)olA@tiO!T~XMeyrh z(gB7@HInkW2AB0rIUVS22LA0$w83{JU?%&ZJYv#No-b0Mdo4gKEuhs?BdI^4AiMS@ zLw5ZH&`Zu7?>$(VL@_7(S8Kb%O4dmt%}>SDk5}?>Ssw)fuWq4MZ?$G1n>1sQVHEq1 z9$ZfWA1`(s==cQi8tAwV==dSfaT?I^W1wR|0DsyU6Sq;noDoWdg9S$5DNxG%U;W5R z3@x$^TaZ|C1tM9cAZJKz7#|I`*Pe|t8Yo9x*WX`nB&EcS5zsiB7K`hYCrQ(_>|p$9 z)ky>x7;sNp6MHFVOdMGz)$lg;rM#U>!KDNT2G~J)J_EAe_w6!9Y2RDt(4!!^j>|2{ z1gg`o7bzuRn@81~#!r;@0}w?EAYdg!_Bb%c1!Aj9(9KdCOTq=~5$QyIF*@z zfBFnR>`~*o5Cf-dTSqB9s2!s4fTs*tKnYc z##^)2!L>dX>x(x0RYAz?>p-(JO?N05)p>2t;|-nXaay17)v;;m)Ey4M z-q&CPnwGO*vA8IMH1Gy>&neV1!b_1mX1*qjNr{U`=Xj%H9Oe)4@<;# z3cvHZJRk1Ys^lOXIwf8thn703y=>F1E;tCn`!tpE-pydE=@V^`Hf)!DH?Ikiv}iUD zVT~0#9g$@BL5RkAY1gDP_d{(*)fDuRfpWtpyKAJ_uQrg9X)yYR#5__>tUtOKcU=FOm{y^WB zVUEM17?h7LT)^?`HwWkj;e$5IMCk5k;PCc#QlGU!+L+AY-u+}uFFAOgD@_K3*!>A| zils0LxQ{(6bOMToG?uz?1bA#D#Vdq<2xOLr1kg$szy=Z+0p~x!I3*}gP_)5QKs{QF zq<%>K4>t5{+4ff+KEaQkR{OJBEH8D7HIMmLm|+B#fI05Oc!?Sjn*@GM`dAHsRi+89 z4+MEDs%C%O|M&BQ(YUzo%~;}MefG)hP&#pQn%Ghuo5RB6+lylGx7O;~16N{5vxuSG zsJLoo@fujMp~_Ag(5nxIU>t8WPS8CXS7jPLW8ppTZVt}ZS-Ro9n9}R>5daXkg_L;B z8m#A26gW5cpi@VRmn?^#KdCpm>-&R#IK)DtFm3UD)Lg)X4F4}tYTW082GW_Zx^6{Y z69n>5dr_>u65UMBAqNtn18m$~h}gS)2rseUXB^_NobmbJJpZ#3LT@UFOOx#B)(NE6 zl2QqHdmxJex;}FRWcu(7$eND%*cbix)PKa|q9o-IAa}A?eX`#P1 zlX!tQ;siSp+V0|(0eB85FK*8wa}Tse=$EhsB7X_Q;2@CLZ8t{%{FUvt5s3e`hBv{? z2_)0mo5c)!J}H7)6ya#>CkXwgslJ_qg9DeYBy%B(^LSV<65%On_cSNOpIHupIV%GQ3(x%X6pFEhvOpWfwBx+tZ!E_3vh4d z0Mz?VuwYVsSot#Kb<4`jnzQk_ZzeYC6IG$M`XZFJ*|{K&whx>GTik^V-*^o<)$i+& znW>PS^d3kCX1D?U@FGJ_VKz%QB6h|{I3a$yt)=sG|8NyA(1n%_H!dH=^P4`_UBM`{$LuD znc5ZBC{ENUsVcmLgt3ASCvhZw15;WZA7~p8)Vu!TT4AI*;;}7i>RTDK^|PzJ^>SWh zWwm}|36bnuySV7ht0tMTy6{}`>&|W%{+OQUY}kc4q)=iO9yqeDlfdy<*Rr7lbk@a-c`7hI!zag` zasjk2TqkeBjL!{;(sEa8B}~+qDXuBw^Cj=@1uEoVG*zn}|Cb^)bT!xOHX!Bm^W;E| z0|Dp&Qh$+zg7tZ<1O@pi#^;3&W!*j*#b-ytxOzvG;+iH^ zC*kb2v;EE?1*kiF9z^E}=*y2I<@%TJ^k1ER-)kVQn_%%)wI$uJvigMZ^+Lp=4!{Nw zwtlyH!~t}#@=p0vq~YJRfL?$&kP^;1gs~ET@t(Wu8e6Z0EJgyXy&D5)#{WCmm~{CHFrZ7>(|uOjR9{(PzYI@+&Ay& z6N<`s2L8ufg)DZyJ9FoR$Ds>`?G$6;*RS5*;Q&~;=PkJ+Bnw}3#Eo4VIrdq|CEo?x zJlx#p^U1@ZBp0ZeC61Q{vR>JL&mzW9PoLxn%{~ElZ{Ug~dgSe^yxdapTMPm7;$w;B zB|rQ<8p6bo?F&BpX*R~UTyviN#+d>e)IiIreo+!~>{gI;R(zBGhHmfV5Mw z-l6YPKIB42#ZgcJfLpL5!8Ny>lf3B!?5s;933+=RfC|=E7r)$ER}ew_*;XB!^MQdV z2olos*Os#@9f0`w3v)I}5)? zI4~jZ#m5G`DwTH4_-rzBUQWd$t14sPhR;-{304)VHyp0Ejoe~)a9k$Q$j|fl7H5tK z|4jjdZ@3RF#d*v|0+;WJ>owzhIT?Xi&#V*sxck4G(yhvYXpV;5>Hwa@*2+@AWusmat4TgvhaDE2US{5TVNQ`Ov!2`E{y%U}Sf zUjP%e5`qEq2xTp>&x;~AR%sfWA%=WM3BMuvTN&4ry;WmwP z&e_1JPFk8qas92bF|;`*)b^K}i=ch2qOPmk0z^WEt$bf$#q*3IP-88Wc z*BsrcvHDjX0VYy6we%-`S*8T^DKqiM=@D)1rXSTnxC`S%xzaeu>zx$Wv7CY%)ur`L@CZWpvD`V3i|>Sh}kJuoQ9U&t7E16aH|Ws zq#ypemeH-teJc1{Ij;?iLmM0{#o;p58PRU}3D*^dBEMaXUrp^z_pj_Ao<}q?JKr>V zh{m?|>ZH{QcK`+9t;2x345;7HTeQxqCLRmagK)Ul?b3aRJvnuM5oJw=wAV;luc>qMb0Xa3RF7| zLN!8Zfmb6uPJ>#OaOBS1q*f0f99@|n);K2GXIeC2E!aaG(|HxrGC%1@=dtW0Z zQs88S5Xvb4*tfKw7!6G=*~G576KznA*JmrAA^007LbKEBW+x55-{TCH$OHyJI$LieuVlFx>SV!Kv+<$> zU8TdWIiF_dLPdPnw4W9gJuki)adt1B{PK+6BBO)h@l!`q>Q0wE4W^JgTF~nwQWbu} zKm3f*&T*YMjk^A%S9vdH;lKB|2Icu| z`U4fZib~7kn|*=m@oD`%T@h{_}s4h`c+~FBgYr{k_g?qr2Ma*6#HeFY`C(Y zt&k5l+s#@poG}-2EcCl`{ZwIne2T!6sSmS1jp06ygl-jRe?o`drbcD8_jiqe`+?We zVU{dDdE>|BJ2>jSiKvhU*mG5a=qUhSaanEle+F?te_vYlMm8Ga zbJLrKx?aq>@=FdCFz+zDpZr=go0G8T`KpSO5piLb><6Qj97cC26KG>ipqjwYXOP#$ zBxPO^H2V(5R@7qidi3Vi&$H2tBEzC`H6Ak{V8OXkr;EY?jKYrQ>bx1)L$E?RHFTu_ z5fd6H&r#s|Xxt0Pr(Z@g1g$!(Ct%4adKAadVzXZBg8=SrXW$hExl{o}>;A?W5KxT^ zuGgIe<;)r(h2;FNM(4J|{n<9CeLz#N_)dTbf%FX+>}@J06!?EoWi@|m{uJmS7La)J z=p9=7PovQ~h{J81+UE>VuOTN1EoBqhm?@1hqKP+t9ScgEp@CQpMV2%oWFVbTWqlkJ z0Ngd%%6^c!N_Fz~b(^<%1I~fxeiWT@U zed}!7u89>VmHQAdg!heI;K;DsmT89%tYE>?N#>P_&bB-wt7@xJ)TCBioyRqfpL)v% z{@`YjT|R-+u{K&j>VdEOGtJIa_*x9L1Sl}wUN=w%(I^M)Jf{I(eTjd=LjXs z!#z;dEgP}t-K!S)tqS9%(etg$7HL}B;Wh_KIg3<)PTLiu$`a#N z)go_JHJfRcHTR}`RthJs&y4yEQ_~29X2GWVX8_8t%5x*YTvYNxmnFL7(i-FYX^J8C{dRnj*!@;2}+dFHIW;w+& zpo|hJ=T`=hJTLvoyMKFRLCzQ<^J@Rs6o+tm)voV8>C~QfF{`eC*>Qz6bzSoi4T2QM z*RyjY;u+s!7pp(tcyi8t3zw_h@b*3#u#(2%zSCyr-4dPt9ND`AnUeW)bhKz}^9y2s zEDjwU6o+^hNhs-$sSc)ZI&yui9(I--(UVBv=z{`A$w7C9g)@?U;<|-zQ_K1SvI6Z( zs?V5fx>MJK+Y_+veaj9WIW>nkvSl-#dGb<6dy8f7;%cNLtX^EI_hhF~H=4p6_|0bL zuZIdD`yD+|lDmilzhayaT1YsoQ=sox^>7T*0Lx5+QHEM}d)l`MaJp_xz%AH!iF-Et z{7SjlEM)-j+_H@S@p3*ScOh4jaogM5d&f%XdW+-%^uv1qzyLf}M=h(z(bnd7>Nc;( zHA6sB02q1Z`|4?4;MUf5asU5Zy&3c0IP??fI&fcf=T0N3Vc^oqGl*rdCY?FY3Sazu zrt1<+!kUaAc#bt))uGK)eDv<8jw_-xH=1@RSb}l)HokM~+lDSB=Uhm9aGE~u$h^5& zp--!5MKb!3C-6J#r9i~Hp%Z6v3N6~k&uOYkv@Lyq_kc9dXl#Zt)Kw)80^q_)Hged$ zmMy$yO)mKfKwas{O36!8mZ-W-)AO!kN`ND`zPy`g$S=%)GZwd0wOF7>E&QP|kfID~ z*SL_dvkh=Vk2$cmoEbPZXG9BtwGtm(mBl)+){|H@asx^`Far6f48h?HilZWvImV({ z)LpO%%3H``cB9h8xZ_R1xF2SB2&m$5kZ;*wgiY0HL?3H$my|E$I>Z z)9vo`X)M!~I(xj(`|WBByB{OOMp&t0)B1HEu?x^3W7cMIV^)@@UFkwXR3VLx zJkY->GOT>Ww%;nUmJ~%;b7PG99~w^|EXg8*Di`7$>DPf@ivz#@Ajw*kgf%-@F(03E z)%k3^QHxtrpA559XA4B)WV7RzEhIW^wH}(Cb@AdaL85oOheK`kT2w0-qKUs*$ujp@T7y2;GHmW{Q_l zX-ca5CT6-=^e%>=Kl}MJHsbgS%S{8e1|@@UIo{xJ(=eWnie?0aPXbqXmzRHNu#wy| zYs0=>!a2YmJtkk<|LI8R&ljR$NdX%fAI2x0t;u)U(QrVLNt8S=4`7_3zI%jLt-Ook z--(9abedu^XuXrp?Ok2@Z9CNg(6NoVsL#Z=vH?jzI!{D_8yXF=Owr~=(U0D5J7NsZ zLa-(mt_F?&aFV3i`V9N!CI0?nL8O|6CB0ygceb+90!OaeY{yCkI^U8lgaoe zL#9u)0d5tk`Mlt!S&@hoe^i0DtU`uk@>@i=)wv^#LaVhV8brCK|9Td$l6^~M#RC>b7M z6XMBcGOexO>1-H@=#3a<$N8G-CT5+4w&EPxyCY`thd;8mF>F8Dy;~NPaZy`$s>xX! zix=<}adWJoj73qEZO8|P=Hn{opQ*>ib@$bv{cU3nR#O0pEVSs0qdPw4`|aOTR>fOC zeE_*;WM$rcs({YA?JyaUYB&G(&DT0yjIz;f4b7?v7mMgw4*@j5Oa)o9ysq$>H8^J= ziu&CfGJl30?C2g?$sSw~!w|&<1Bs%IFz$l@e09+20cK*124rvMKXqb>aQxnkQbD zb3Ifo8%F0sDHhobVw(2pSc57TCop_fQn|y;pG+$a&a~@%yBX2~FiV8y|NMJ84*H;| z66Gh;LKZYxQBmws;s9)EJ1*Na+)*NT!esy3dNu- zd|3OCJPsS4so|~bU;gE)bHk|J9p!jER*(MF)w%Z&_WDK4hgjcT?$5ZMuHFdKICxid z?95fnLqi~sc@biD+u~qWvbnE;-Lzww?QIJkIhi<@^kfH(J!&o8&5Hw9O*Q_M#y(u> z@71imIRpll&UU(i2} zdFU~;{tS0W5X~-5?kN;{*Ch0}7XAk#;JgIXYm%exFD-V_EC68uP9HdH;@B=SD}>q$ zi|ax$mp^(F9%~(VXgE!+;$uzeGYUxW9&ms3*34TKoUj1njKYAFKp}iB0Hv6w|=fwPtUkI8r6IBw=S%IYzuEM@RJD1bfwm9trx^UCu*Ga5J{a7{)<6Pp-$S`V=qdYq@NN=e`shBDa^7WinxeSi+q1!fWT=}|vwUMllQ1_P{kToMo*MaI_K)PdCiIJxvs>zvI? zi@3dt$MME+ZMo6%=yx>9z&J<*I*0x-=e1s1#^HWg6LNIvUIoc!Bk2_y-~#25WVP5^|X}J4N}@;AlDTB>p)X60v8q(ven4>PIp9lgW|M27fVHQ0x40il~kD zkKSQfYv#ge;;T`{bS$DqcKw^S4Gd&x|=4TE9By7dTTso>c@tFveN9a=cWnf?|OI6bo zn99)QrlU*c(1V`bux`hrpmsvr_#__^P51ziKmchTliWDFIM@}gw%u5tc8m48CSV@! zvo!*<;aV6)gMReW5{PsWye~{zP#R!O?qX!1mXWbzjFB<(#GQRx+DGbzIhrSmnp1qy zK(g^Cz=i$^1hQ5XJ&AStFq17i1$g+zcxNe_lhmq6$0@GU+`d4Nf~XlM$+$>X5sHd^ zrO!1cVbg^CwANMKL@n-I@c0XPy8iqJdbGj7izQ?sV~fGm#oEwUY+}qJ6{FU27XYj1 z9fOBVJi8TYy;J4WS}Q-}3;$)sArk=8CCN(Hmt9tP$%)6A%5 z*)#xcUNftP`kR?lS6gim3+TTTgqH*eYNwi(Qm}U>(1vU53@@0a!&vEN(+01w`A#U- zJgaeYs9sruwPMM7b4C&14kCW*?CL5KBCyF#p;Km#b|%Cu?SNOwgUOb9S3*fbIcGcf zMwQToRK`PI(u3>!9Z_M2(5&%hdfGUxARgb-@HQ4uoAsgoCL8+CB<5}5$nkTp>6txI zdMhu+_smK%a#5E;f$YVc-AzLR{h0pJv0hq1!z*TcGrheP=!fOA!91CJT2+!go1@!2 zDP#~jdH7~?){cFbgH9+>nJ1kVQOqvZvrKM)*Qg{lE;%BvuWg(C8MkLPFO5F?XHEQ) zNZBX32SkRo3F&h4As+S@S@xXN=aKY$kRnsP)Uxa;+A{tIc`PdF>bi$hjSir0)}tm0 zmhR*7r9c{`f8Ju}%dlzdoL722&`q*Fll(*F4**ZyBa1x7`h=yQ2QohRM%)Qt3t5vt zG=Kun@glajYhCWr=TG(qh-*LG{472>V$RNr{vcJf17*r9Xn=DSeQL&T!)`bVLf^70 zcDD7H#-n}$v%et3QQ0DE!DJ(%5>$g93a-*w+9`7R z;6yx*R-IE)qQ&gsA2mzVSK)|k_%T6-x@WOW19V6lG${pY!VW9KnYH$5{%(R?o-xvXJ$@%+0Hkyx3r z)ekk#e zigK(N519o%mD3m19+cr?ks}8Wx|oD)zLjdn8VF`sPZo_U>MT_ylWMzE=Ua8Rbw}I* z+_ZS!n_1QOF>m})>z+BPQpeZ@^JTBa9+~O!VcK`{;<{5!tykcD}q zYPSwlhc?(x;qOFESuCz-XP<<-$jb$Ku`q$t*tBIu%%XM2f@*bA%ej(79Ie$CRTNJD zFtxXpu{8Zbls`6YY|QA^8P@cx_K?^l7=iJ;W=%0YEGSSgx6$u&3M4bi@7>z^pxlUy z9d;0gqtxxetLsxQEqYPc7fH|3GS%gu%NXfC2*{&rDdQ4_o9QU~X z2MIt^cpg0?R#7i)D|6HVH1WsM`>49+AA+9TX)-V3B>!TeMkdqXte%S2a~qRtuc*bR zu*|DkpcXZKs7^q$>WFBZkdrF?Wk_#c7>4%AG`6}r|H{6c(}3!FgY_JAHi54s%@3{+ z@H?@Ts1R7aV-QMLr-3^e8o1V=p^()2;ZY@e4y8M4x$>w^VxrtL(`!<|P! zAE&P&B^8k_DKJL%+^`;ew z>t6%LuE1j)M)bmK0%=ijm(jSj*vY1`S*LwbfNn72ac`z~Ew_=3%IOKDl5xfK&~Z$l z&$V=)Ls+^#(mYX4cQd&|ILS*mHxG4xZ&JIE)8;29l8Ctx@l-Ufy~!EIg2bvc-~M)` z&q|lIBe-lK;Q850!qzmn^~m6?zxKT@EB4YU}b|DgW8t&OX~tF0k(weu*-^qB^J{mY>ZhXPnm^Cz=^($A&$ z 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 literal 0 HcmV?d00001