From 6e79527bb5743481148f492274b7a19da057366c Mon Sep 17 00:00:00 2001 From: Andrew Godwin Date: Sat, 19 Nov 2022 13:38:25 -0700 Subject: [PATCH] A few more fixes from going live --- README.md | 22 +----- static/css/style.css | 11 ++- static/img/icon-admin-512.png | Bin 0 -> 48813 bytes static/img/icon-admin.svg | 66 ++++++++++++++++++ users/models/identity.py | 2 + .../{settings.py => settings/__init__.py} | 55 +-------------- users/views/settings/profile.py | 63 +++++++++++++++++ 7 files changed, 144 insertions(+), 75 deletions(-) create mode 100644 static/img/icon-admin-512.png create mode 100644 static/img/icon-admin.svg rename users/views/{settings.py => settings/__init__.py} (70%) create mode 100644 users/views/settings/profile.py diff --git a/README.md b/README.md index 1b3bcb2..17a9cad 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,14 @@ ![takahē](static/img/logo-128.png) -A *very experimental* Fediverse server for microblogging/"toots". Not fully functional yet - +An *experimental* Fediverse server for microblogging/"toots". Not fully functional yet - I'm still working on making all the basic bits work! For more background and information, -see [my blog posts about it](https://aeracode.org/category/takahe/). +see [jointakahe.org]](https://jointakahe.org/). -Indended features: - -* Can run on serverless hosting (no need for worker daemons) -* Multiple account domains possible per server -* Async evented core for fan-out/delivery -* Mastodon client API compatible (eventually) ## Deployment -### Requirements: - -- **Python** 3.11 -- **PostgreSQL** 14+ -- **Lots of patience** This is *very experimental* - -### Setup - -More deployment docs will come soon! Just know that you need to run the Takahē -Django app, and then either hit `/.stator/runner/` or run `./manage.py runstator` -at least every 30 seconds. +See [the documentation](https://takahe-server.readthedocs.io) ## Roadmap diff --git a/static/css/style.css b/static/css/style.css index 426308d..1584e68 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -617,6 +617,7 @@ form .button:hover { height: auto; object-fit: cover; margin: -65px -15px 0 -15px; + border-radius: 5px 0 0 0; display: block; } @@ -633,6 +634,7 @@ h1.identity .banner { display: block; width: calc(100% + 30px); margin: -65px -15px 20px -15px; + border-radius: 5px 0 0 0; } h1.identity .icon { @@ -644,10 +646,10 @@ h1.identity .icon { h1.identity small { display: block; - font-size: 80%; + font-size: 60%; font-weight: normal; color: var(--color-text-dull); - margin: -10px 0 0 0; + margin: -5px 0 0 0; } .bio { @@ -834,6 +836,11 @@ h1.identity small { header menu a.identity { width: 50px; padding: 10px 10px 0 0; + font-size: 0; + } + + header menu a.identity i { + font-size: 22px; } .right-column { diff --git a/static/img/icon-admin-512.png b/static/img/icon-admin-512.png new file mode 100644 index 0000000000000000000000000000000000000000..1a0ada92d20a8fbea83278471a7d08eca614059f GIT binary patch literal 48813 zcmXuKcRXAF`~M#lRYgln?N*JpgrY%eb*NFRtyYt$(b_^4tx+S^%cxZ=Hbt%4A<@=I zP%|R-2ud5H_Ff^$FYnLq_Wk2|JGq@({y67(&h@zN*W;EmL)b{Tf#!12Vk09^O+#TNgy!NyQ`1tt9 zJHLf{*}i^fFYoT@n6;rH1OQwG80g%8?wh^V>^I{0;)C?*^kHT6t#6;+6yLky5FJ&V zdShipvh&6*-RSiTd;k|l<-;33P9#jn+y9C) zex6f1ha(aIdMdbEfJjvw4OnB%vNq1lxxF>}m+c-fa7iB^Fg|ONb|RGdTu}1JB!v#<2m5UY&@N1#HAVO_I@-54QibGe1Md13RxLhgh-$w*bMiLUWDE zIMtF6cac$y>bjHF!y3F4paDeqJBm{VWZz}UCIR%A$!qCNqFJNWqs1!SzWw^7D78YZ z5c$k|T$6-H%#R5gu#kSvfy85BzOm_4@9VAhrDGtiip^`3>IHsdO!Isdj|&Ud$J9<< z`P#(7yFivxGXEUjpM@TvKUFn5817PIC<#ziAr$Q6oRx7gfb57$y+ctR1Mft z2i73$y3``V;saa`^>w_ZNzI90tdWYswrX0{aUfkGYjd$bpa^n&ee{_|MemGQy-CF3 z3|TE=X1$0GGfCVrSkdlPR&t1S_tTWF{>9xP1Xv;f5I(L`K?uF%!J1(y0D^SK49l(2 z%w&}i>2m^D5vhHlJtlAF)xV}ic$+6$yb#>%9V<|$`93yX)IIkn{4=HY$hWCt>BgV! zGK0r1)z`gLybJy==S?QL6&^&cXlIu0jbe*abByWHIqY0pae{Mew!y>#w}v$*Eh+EJ zGjnFf%7M&VN&vbjZreWRJjQbJ3U|rsOAMMhYOJ5+0eJ=DMh~pj(9que1p#pHw@IpX zQh15}k-wM!I1=*f9phfRDP1s7LH}ION60>n?kiL=2ZhYS`3A9Fj%Qu=HY-i9*k@c> z^Zfpi&G$qm*p!A)??D*Xm`MWCR0%Ocb3}l~Pq~D#+}s) z6gBal>!{r|ye#j?#D_TQ4QpA&VG_#!WFj7i66E@6yM9Yke#(qK7U0*DvKG00CCSJy zyU@Tg?~GDq;WK&`FJ_Njw!qK|AMCI2rp{DZaGwxl&qd3FGE%m+#z;URiH5`(Nx zKzX7fT>Um&M&QwUe8UO%M0^KXQ@3WcS0etxql^ywsKR>hMDyFDt|QXV)SuBWLRziH z;221wfz8VSgt+$ea{4cm|BL~&w}M-tA%GOi_vCr*w3_dXOdWsd`7M(^rIw>&uTuH@$d;>CKqNU7a4 zIByznpwHt(%jBl`HMv5vz~m#C3fc?+moFU1wT4ek?t6c>l{QYi_l)nTOP^OR@KJI< zjC#0m$@r*36#Ot{^$KNt(eQWP#PT~(uz>gs=A{v7VB{;;X^nHgYp@}HZdL;GUThL7{Ef#I4v4((DSSbCJO!I8|5E}Mh_gP-0q>m6`*#Yr_YCUY@$9ev zVTWn9%pZ%_jHw5TV&*0C34v!^o4Y}d=tNud-@|(J9kJCQV|pgdP8?0PXQiVM{O=Y5 z?JeRGRIETSxm6(5|J21z8Y651*vf%tEv6=`+^OXYR!}9hwFe)v_#VrJMS&TYC!Miv z@j*xdUNX|v;_&i-phQ>v{^&{L?!TU=PD zCV&Z-{GzbN=TmOsO+{U4yhz48@3EHofX(S0lc6BD8u9A@3lr9Y>AyXs(RXoYxcP0G z=bzQVx1%MEFH-f^M?(qF=XBT8h<~#}vgTOXRqHz8K?E0e=cn|aib2Gi#=k@C!ArR# z7@zpbA-ER< z(tubx*U9Z>o6hEBcC-(fR+2Z$KUALIS~4S54W_H=3b}-BN$$BjHzQeYP3ayxeJCQJ zT>IvPx1UON4j|r~d|`ddy47b(I_OoT2um>?y&e{s1k3{7bw7DMqSo{8t*z6OM3Z=r zoud>L{6U~Vpk2eC?IDq2NnYs~0r=AP27b`+iKGmNdp!Kkf>g^ODxbqFoNtbpSHH?i z{THCy`D>VqtY$#9_=s5nVs9Hz;a+lomNogpdJ0+J=CEsgcro=`t-iXI1BW*D!hM{Z zWfG|duGKQXVu$}Z@EAa!*2h|V-QKa{u?608cYJnGyTUXpBQJX-eHaADZtmN}rKRb+xM@=1yLWC*Cozm#52al0N96f39RW-u1_BiIEM&>5EM z^8p6f#K(Y*fn`ZQA!+~o zD2FYFkK9mIsrN^uq~i@$0oYS77MeJ7GyU3^@=S+T-MQflt=0vX^KjFwB=!a7n~^B2o3+) zxVZCL1ZaY)iZDA2l%tNn+x`xkZ=4@Vx*MlgNi!5yI!ascq$*S4l)WVRgtR78VHP(t z=A9W-VaQC$vbD5yZqOZi;uTTTS7%=Nx(&&Z)5&_$JQ4I!12m4 z`A{LMMRq}ESy^4@*f93;8E76z-E-B-d{&Q+?zzXM4Rw^V$faq@bBJl({k0c4t{@QVBXgWktD1m z>d)X5vR^3}PTm*rurQSX@4ZxB@dr!3B}k_O_=-N;zqF*~q4Fe^kjm+R8a z#b?BYuN%^14;gA9C3TVNuOVmBXQD%wgR=aHZ#&oDXHw=4j@Zf7r$=8AvgvV{JDtjO z@E`=f;J{IF{uXl{=R({DL|825DstA$*z_u!BmOpJjI-6f2AA4$DyOPd146|@T>}NB{Vc&^=^TF- zSiW%<#0#&7N0)I6#=D{XN3TWj?SJ;g~c!RwVwhKwpKS@XUmi!@bQ;5pzmtcl={(Ip+7*racYf5LL$Q#=A`^=#V0KgYlUT+W~Wr0p*mWPx32K*KH1& zsJ{w;Hwexy1+i+^67mjD%^Oh&;0baaXk~>{n9}jp<4e&ZJ9xzGB--0v&%EPe8*bBR zuwqS$Ff+GR_jE(=`i`=tIHBf`&$?@L>08|iOrtvQ4=rAyh}%*V2+ln1#{MkYK2N5! z=0NA0nIV8vY~@*65b3tCYs0{&yO-P^UrZUtx!!kbi`s$r_&Ar>_wc72@kw zex6RKiW4be^AgDFH1ulfdmFAw?%Eh6jX&UY@jU;POGPVoc7nk}H78<&*iOwhLr=S( zj^jxQqt*5nq_pvcUETWjJ?kJ?Q}12=(@MvE3XqY)bppfJN*dEV-Wce!_)iy54v+L} z6u%8>*OgWLRX5|^{WeDOTB-1f) z-!kUmezkLXQ{?2xie!c3Mjfp(Tvkc<;o>{h_D%xMpsQg$p;C8)1IISESwF`!VWOH@ z_6X%BiyzbBeCDuU=wVBo4n#T1|93ObI0!aqA4WrRG3NggK4u0pj@ar|nN zFyyNOtr!nkx9-ivmI>w2cW)>Sp+R745XCXDXOo|uAOkgcV9o7+o4=2p)(N+h2Fx;$ zoyqs-Vt6xd&`~Kp>Z?uGUm|bwBE)}9IiO82*M>56!d;fWTTwYvsTY)!}{rv&a-=?rHG=$du`JzvBwA-Pr?XRRSQHp4E-4G8SAoV-QI4ff~PGs>FsI%(pziu?fZa>K|c;+9=Kzs4X9#% zcUtl0U&c4&HvZ&}4hmFhJ;t3b+ud#Qm8Tk(n``zBt;(inF3@v&vV{tj!p}`YLh55k zhZi{5a%q*D=aa{@>p(hQ{Fnxs<_Smyq^%O33=%`q)Quj{6ZeU|8C-Gr&p$?z^qq&Z z+IO^~4VDoyzh3CE$b_Ep|H!3U(X8t=g!5C_V>^ZhIDP!BAp~R2ZkXm<2x-WR# z%cKbsQPwKCLzo6k^IbO)$_iGtVJu*T2P#sOa0?{03bGQDA-aF?wxd6rT|gJnQN$ZE zW50(GahuV7&~WP!x*sJiY6T(CNwnnA$a*nw<_i-|c8(|FedmG?=DWScXQkyY5{(jZ zS;!s~>&=dS(x^l9P|N%G6&0`MTxA+tM|6EGU0!kNGS1$3cft?H)65O+Sr8+Z=4 z90HT4I|sDC5SKR!=+`uwby()eFtX`&hG$bfN{86;{ki*`&fie`LDjh)7u{9Ao@zgt z%@^#4D-X>fQ0n=sMW&SuQ^MW?)#Ad!F>3W3sTpse)v1amFgD8|$7!LhZP~6c&9KYo z;V9Q*jfG~{J`MIV=T=V`{~ayY(|X*>vNCh$Y?gwGNhS@7c-Wf#T%7u_p8aOSkqafw z`#QzZttilx?n*-g*!o11g{aC|V(I-Ew4xR?SnwMHd9RzMLB)T#lGA?e$~VM4@jT0$ zM=ZEYTT>|4F%DcqrbBfH4hS&6y*=)rVKr9D>L;zD5GL}8WHbnSGU$QIZc<@5pK`-$ zu{pK6U3%qN;enN+Jh>y%X);7*TotEF7P8hVxPqwvyJprK$cw z=xQ4Lhhi2$W1*Mk{c8H^_6KsusSEFV3qBLOswStQoDqRz zo^{!5!U_%#f7?o3LdRq;=UBoIBtohqBEv-(IJKi?NFO}5yZ^XRkCb=-q=uzH$tA3a zF;i%DT~)+(}#olC55ik;{eVIE(Q$o-9UDumz@FY18xJcL8Te+I};`z7W z-P$j4(H+qq>=cjKGrebdq7^#{!-=ZiQUd0x&eS@UOsc^$cJ-lbUN{Y&R9#AA>VI9j zhz1WG>1Rznq$A@cyo#2w3gXAjjT^4}gW9pEmVf2+TEE!;_`f4Az8iS$c5?Oh$(gyA zLN?LJ51>aGsz=-*;8}ZJ=_yc0USEyyVEm+z5(kQ>Gj-C2EYq?u@}EOBTiFUp?BNWtTg$&_XkC8+zs`weG8pkyx@0 zi`)$0^qEgHkSU$XWL^5+r(jlxjO9ygiz&{t_JS7oESoRsm7k^__89E>LI!yG#u{7| z)=_i7W0=Sttyn$5k@-`X5G%3(tHpd@SxUD3?fvY+Q~6f@y2bjUh|V!AI}%sB{aIt) zN4Cb9GSWM-`#39bpLnF`bU#h1%=P@&_=Qs?lgz*|U2;jBtvJ;p5RQ>lRWUW9OPNBu zIxWcGQk@6(6sCMBn=Ed9z`&m4m2$dhlpB^M{mp;8FmGF+{(2C6(BI?}SP$;_jJw5^ zuZIGxIX~tid*X2Dg1Me8=QtAgGUI&rCh0)~a}9eXkDJdmyj;oi1KD-w+2*hJ9>&os z{WbKPd%s*;I$zMV7P&95Aj9XhdR*jIuH9o%;6TND_N0R0DnXev&9^W?a@n#q<+cj( zs@wH{g>-$Tr%0|r?Nvl6tx{5|?cq+XmP|fzPkIX2$$b~ z7q`nswLhsO8}Y;Do-%})SPZaH-ns;TiVs=uwc{TPL>W~zy~I?r^1-3StaK$W+1J~3 z(&`MFwmD1-fZqPB0ko>%@_HLvo~;V@L1DGLx_r~TuKxi_R1%{sp_^bVN<5*ugpO+N zNL|*A4;jG}BPR1oJlJG!>+V}?g<<5IJhqQM%ubRRPYZUNu7;sq=g81`l6v)##e( z%7B{~-_=*xeUpujj(X?FX&x_7o<_WOg7WoyRm4}Ht)g$y;}sP)l3guw9cuo7O)Jif z;0tBKlvfX88zz7?euEVI_?r1@R(HJLBVT8eyh=sjoYUPQ20Iyw^nw(yb+incW>BB} zN!94#pmqu-(>Nw!OxJ>8e=_xt4r5hycfimeBidxMazuG7VN`NYTg4%`ggN1qZ7w=7 zYoefm&0GRC7jd@-W$i$;NP$^Czam;;^xc<y8|c1|P_dPleWbBu`iVIP`@bq9p$# z6rCSHSz~Z_tYGhKcX6tFRLJe1zS_Fz&l*x+OXb8oE7IE?V(uo%)qW%> zI(dDQdeLV>C_t&fOfm^st_pbccFfM_L!)Q(r`;bUay}djjAAR21N9W2(_vFWk)={B zu+UP?O-40LQnKv!OFYe>fy82C=D()mml~MozcK>({Gj%5M)BkgZ7^Gf0>P01H{2#V z!*>XD)_4oR>335e*q0r#mf}EmaO=}n-vc}KD1XS-kjOo2nJVLguDs~`J5_(?2&qka zq?AKrW>VYU8k{272Kwe`voWo+SGPQEH`{ErAbERd+xWdLPyy=bcigE9rHZw$TpgV<}yE0Mc{iKxQzyWCHN+=04ASHyUwIj zK3)aX*|V-v@4;SNZw`X{)wZ}WZXUuQgxXxaDulVrs$hc<74I>0YUccqv%q!*ON1q^ zS|3~<#X3G*Z9E;>Q#ctqb&RvBI4KIk-#wTa!j9>k*$v6datSHCv#rkzviaH@GE8yg z)XlmOm-h1Q_U9Nqug|U(c6q^CH#48iQxoU%!6I%Rey`Gjz>A5PiCx2`?rd+a`VQVf zfiJ`~PzkywHv#O{1LC#2P8shknSV->Un)tU6*g4>zE&EH`ciB7NCARrK{ zNUKg8>O#4fp@^Jvf`c=Rp5*?Xx85}w$n2Z|#_j|yex~f~c0T5-UAiKdb$-q2rUsG# zzu(IEi*VUEzrPRReNkL8<26?3ygzK_`0}nO;kEM8%_j!MP<-bu%Lu;K# z-m)mF25Vp9|KBWt zAh~Eekw~O4SOTQ!BvMofqw0NE42q5HG+ens>L+(D%JQCR!r_j_s`SRJ4=u@qFX>OY zQCP*j&5n#r$)eK~?*d9>>1Oi4qoYTA3QLcNwVi!_T?%G-a%Uj)l|dg2LJF*~j8?jy zGQQxmI6rAO78;#^u9ePVfb0VxapxEhKR8{;o5!DNtt#|#+=n7R%mVfBN4^-SuqNEbcc|lEq$l6NRtxE8(@=dw*m>3oN*YFJF8C(kB(?vM z!$sr`C`Mw+S1=0+x!q+x<{a|eD?ad%#OA)vby1AK1(5nvElb40gkdep!zM&`r`+RS zg*AVLV zWJR?!DSlq>dUwxNB88 zYU%8`?={XoXIblrb($>8zEGL7bO+6jA}QvhA|2k`m`V$DiFw#)O729hvUxp{6wqGP zMmcF{NeLL&Cz&3L^tFD(T;ET$dpcYoqAYu@{^+($Ywql@_OKM^`NaR;f-x`#>cqYD zF-_qsPbN!^YY$@s`0+jd)AdWQO`c-v_K1|2oftJ&s5`5u8!fV5bTw<)x_>#Hp&sKy z*hSUKyT%Iq3@_flUvaP6W8KF2iGPsc$)l;}Vu0KYS-Y;-(gn%NzU!zO!FqNDfwPSI zJ$Qhvn%~O0vNX-@>+N*DC{H_yT9K$uJ-#3OzJ*@5rYtzi<^?$3X2zY>CV(I3^eEch zP00*D5)+hFnA6!KW}8kT)~B6CfH|ly^2gBCe57q04dmubQ8@WL3k*WGAMo-l;y~Cp z*I)|Aw}A#&>oNT1Q>tF5B~*r`qQaK={9tOFm==&h!($j5-@-x>K`o63VCoyuGi_iF z!0IcDQXvDvWZnHTR`LQ@)%@~yDVIx<^$15#P`XWFfJ5l%d|Tpz>zbS+nN^Mp$)(}| z8*q%Df*Gv^l}~$(h(hLSLKVu#d#@u+^&7R1?GdrhD}4uwV;DdGJy zXwAnXuFml}+x9BGSD)>a3%V0qD#n?mIDbB5$lGhG)AYo2?Jud7_6k3=FDzR3rF`D? z0!Dy!2aX9{+O2K)=CLnWG{GC@z_}>YwAnR}OC2X)T&-4i@`kW(5x& zWn|E+d@n`>6(e!X6(ZW0&%G2>LTMOg4ccD=uV&D_7QRJ844G_4?&z#_Rai3Se1~+4 zasSnGo0_(6j}6?fVuc&hNt9G7ytV6R!er?nR<3U4r0RZWt(>qKU8o}XMp$-Jg2zoP z-ml#FizK8bZY9qnJ)DN$Ve?w5)zP7&0?#~if4C=Z5FYstTc^m%YQD77dgrg_whmh; zM`Oaf3>zq$1t!7aNY1%NdTg~Wp#K@p^Az&#HSx_PT1|=lE60ylc00K{&~#BA^Q!}) zyu(=m((tFFI4`ZC7Jdy#9-6UXMkE{9w^6K4TzmWqR&IQ+deT9~A^YR{aR$x)N%TMK zy2ASwj;MI4bXTk9{q_5B>q11-W}=p)gsn9C_e*-8!~3Qt@c5f3kg2Oy22bq2MxF7^ z6m;0u9N3rt-Q$NH zD$T`ug0Ao0n(9#jk(a=*PMHG4XMc$;W;M<#*esHEa!(7<6FIr{f0-RS=3W!D;H6wr zA;lBR=;(n=V4fGY(~z`EB_L#cW%jSlu{j&^Y!5|<>c6Y1Lm!fki5y~!xpV~yNo9Y| z$Bm|#!8x!Y(8Dgqq!D{+7XZI@+^ua)=QqWBz%`06m1wo+bRoz)$HO!)`(^99`}qUB zisn_U8MXV>%OO%X`l=T6&~VO+fwc!0srZxT{r;*+&AtY`eWDhK>dz3}F5HfVP!~6P zSM9}bJB~&+v75)Ai-35r3+Hg1_=nghS_=h^wh|q}3pktTM_wwP*$`{A#^Wr}uU^Qe zi8_3c+!7y$Q*4Zi$qc%a(S>NDtjs>{E1rlWp@mWaGrM6o3;J@JhLu{$&l_d;V7h(?Ln-D3h-u zXH_6;Bo;<$Xxb6$F(zMoRE1_pT!4K>wt%!;k6*VMjI>SJ4HsW{f*I|dNH=J#$SL+y zfZBM^pZdl>8Z%(GR(HrOHY6BQ;ep+?15Z{3CMNXu75ofZaMR!cH5X#F$3SRIry>01 zYNMUCE0CA5-;_l$`QU&xc7HUBN{mv7r_i4?9G4r3RlfmULsZhb%R zLftC~`VtP?Nkl%bcZ~Sas{FtRx1^VoNGWcVX?b?*5LP6iyV(kBuFdOOQQ_~hC;sOT zp*kBIMZ+Il*pG!@%B0yhmmuQWQ*^(FJ^Fqb5&K0K61MOTE%^vuuIc++&0e^(w!T%` z8fg)qx{XrnzKhRCKCo#Uu;H+%llr00ZI2*Lq#UCB((+&`t{!q-ZDGYsDs*&z#J)w4 z61DD22kBtYKfHVd3qraQTms>T{={3G_8$WGHa(IxpcV=>5L^C11_e^CSkNonp3^f` zChHDIwNv2cj>l4l^s!xkisL{42|~#mI-90iS5a^cA$8F~gBgxn0P)q#&!pC3Kt1se z*Gai?de?hxUg?3Mp*F-#j_jGGI5WGDx+PnK2W6V>+~`f-u{W>d|6?G38WAu-gx|M7 z2>Ga}dK!*K@kXW&mryxUDVgl4ZcR7^ zfxw9@iYd&I;i-VYXS<_*#qN z!nX*5%dOdrPy3jhdxGnsR^#&WorVWJBm?=r40tP{S4B{On3%#D$*KS)X4?@$4}HBq zfK1YyyN9l_2*0c}>d$F9VD!^N>rM%X7}{Q?v<2TDxS+` zJq#)4l>Of8pJ7soe!Xqe^MMiXN(rX#X=tTl`o_;}WjFZ@H^bF2Whlkb_7+%aq(XZY z++=6lFAJzFBt_fZH{$##XIK_;fHU`$kZFfov;4SG0g&&~#Uw*3*G!Rq1r9MVHZCxK zpR}+nF_#s7(ZFg=%h_}|+!1@av7E=Mv~DH)IZn`s(PQ%r8*Yh+6cH|VpNwCwhTF!u zrI5_~D8Pc&q%uA)06j+MoBXqn()HT|yFV2LtdG3drP`m~o=yFV)+cP-)W`Nbx? zsm!_6ck5Y=FmgtlGd9hk5( zW9LhvOb7qQbQ(xMLDE23VuwjS$AO!}k zdVeh8;FX*j!{VN8uC4R+ThE|n5EMbu>&khKte^j=ohW4 zws-c3r}2vlU+U3EHJ%5qavnn)uf3)N$B#x_a`u;weWE^A%D0unRZY*CdAG4i^L|;- zOo}~^vY#b=#XN4zl*5G0|8lK!eL+egxAOn2hi}^pmW@WrXuz{I3}?C31>?t^$* z92CZJee$;VtE5TQZ=-lWb?+MLksN`@?4JiPi7!%26+BTYf$uku4ZML}Mx1>hnq}KL zwd4UrN*MCS=)b(Ugd#*tTCta#6|l;+*>87ZMm@neR#Hjl%2+$(zV^=T3S%7+*JnTz zq`qeUWA)!he%!iVcSvd|?_Ki>Tod)6eXr$2>$G7uD1AI|*5BO-Xc57<2Sv0UM`lNi zqI<`uNUQ=RcscNZDU*%R_Fp=zX~IuPT={S|!F$&MfJ36;AwUZ;T8jf0iA%V~ejVlt ztz%Oze`$*+q0^y_2Z^YSla@x@Nu5{Tj7z^@)&8c>r5~sh`5j? z{Az-r3@2NVC&5v2jyu}GHSQz%o5u||XIR3D^&6AZ#!F6`wJ3JR*D3s@FYu5QR)?PU zZ`FS;U5wzjk?g!u2PUIznD{kTo~HYBUxU<&Uxo1wjKyAN~P+(3Ul(airk|aQWO1e3vo4q>_p0I6~Z8rls_!-n3o|KBei`R=Q zLKt_+UFcOw;%ooxQE5rHg?EuvB4}BLF+uf@-WtcQJ!!*t*DEpH+`4Z!(r(;&4J(MX z3%O`QX!3*9xLoEJ@ss2i@%Ys~+emy-ejBmSJ9D?jl-XkA2fMKQPmZj&ErP=CO&9-n z%)(f?f8V(4`eWC`EKDjw`W?!M!AnOGcdyEJD+gr~6jje9e&zVeMgG;xaPYgjr=5bH zlkEr|d4Btg&xY&Mt{SYlFlG)JcK3OZ#^i*)7%6bb3fi)M26yi0p%#!V#%KXpMo0NJ zMek&rhWq@wh)nmvF+qG!w;}Ht%Xix2|JM694#>Nar%sE+%~t6_0cH63n|Ad08!~8I zMdJuQ(;<;n-yqtN{hQu3-+N)*-&G9V6WnRL z_CxMu?@escVJ$dbkls0O+kpj(H1h#g9X_vColl<*gJCqe?Q<#|*URf_mz~!>{EdbL z^xlN*%*)tr|L@AW#Ch%{zZZjZWZ*ghMH~4s^0PxEaoYd z_-A#5=TA{3Lg62`@slg!HV3{sJ}DP}3-LguH*H^4wn*#>O@8;i`{{@tbi z<*)gNW8$RDlwf-r9!+SNiC~xiapn-Q4u>2TDZC~VgBDk?n{U!S;J#B5c7{pLOuA%6 zhbPgLGA%8aimx4+g_*%qaAg*)l8ZAs-w(O!t>zBj;GdY7KX7!@FWh!dqNI@va{;lJ zWAQXd&cT4K19j}G9{)?I7W(~7ByC5*cDb5%3#mmGgzWv(JG9BrcYQSVHy^Li^)p7H zlcW&9w5ssq%sLWyjq2YT#7n7$ruE%~HO*_;IdXgcq08{@YIILOE)%80KxC zU!&&Hl`~m6rGH7+me}H(58upaQ~5UNZ2~n1ZJgpX_QczA!woB%)P(=Ks|dT-LEKF| z)mjG0^M#grM~_ZR$NKA_?K3C>$*HM%+YZyULpN{Z|D$#W*}Nn4D_2GLZ2fA-3u%Cq zi+aNuk;{*CL~QLIps=W*!9hLSW#zo%EqQtx;`k4ODxWyf@1*+n*U#!eE_lB>4_y8` zz+$W_C!L0#;bvGP@r4_g9Wq$09dVh^e z6EPT(zIAc!JS7h#y&wyauDKTF5H;xPU!n7#$MmXVLMv+6qelgD3szf9BLP*OU~ zyPd7#WaVY;qFG*BCNYqkk-q5qq7kdJo-0GT^CwqC3bI%e9*zjQ?BiaE!Lmq8;zHrq zIqus{OQtD;K;ifSy9R~vDwCb)poASe5lCac;MWG8XeL#mCKuk+8<;fOiRaKt#gS@+l>_x9 z;9?^3Usf~B{;3CJ;OVd2)ScZW+vVZB_&^hFQG6afpilc~?%YB2ul~rmaqEOp@slg& zh&9`Zz2Q9OD~^^Zicr_2fce%pOM0&Os=7%onave(ho8rLoe+n{i}scyEyAnk-w^1Z z?aU53)L{4hW0B?JHQi|Fl;>c;fvoVX7CszYM+#Uz+midb7R#-T8hWXI1i+ zS>lqThM+>FRnXyg$f?A1L3EE~=TkBee@8x0&9CQK9Id%_a&k|5RTY379D+nEvOcSe zn%LhG{iz+60 z*k_w{z-*dMXy-ui8%wxwIn3YItA5evyj5bb#cyKgxv!QZEs^@CL|#a#;)e$6HoVRW8f4yQ##XmKCS%ytYpY82`zME}Z-G-inB zsQ3|JL+iwqVd8$gGNXqi9{CDSWA=qAMi?kqgrJJaic7OCE@6KXJxyj_jjR+B}X?& zcDIer>F6{}#eu!BTVI5vEPC5?$0mT{nKWI$S=Zad2dHKlGr_R_Eg0B34;^RebtrmX30|NsJNVg9xWLU<}b^iM)wD?^QvQ4GC0D|?`CmYOU(MP4)hYb;pQzDe-}tD}w1cZvm7*h0 z_P|Vl2#-%^F3HY84^E^NL05+93HH`On^l4WpZz1GLt?EZJ>F;(%_t@pyM5R>^To9D zA6JX&oR_OSB$#SNc_wmNtonM8Lq^S&H~JUEN!6__(=>?J=X5#mP5X!OI80cKG)r#X z8XOyu?Aq=+w)Qr1qs>t4_ePr385s2asSEE9#Z!d!+utTrF62P*PdSh1JI6CG0fEx( zd}sAFx3=gmKJ;0do5-FXBAhi+l)pYxU$RrT(V5R2F@OC#nMga&*vF22rl;EZtWY9Y zNj)$Jefj9R`sRSNgN}}Oz5S2*($~*qm;gOf)mOor-M{(|b^j#~7TE6_if7hmWTMqy9Yty}4e^YE*uQf`#H$V=` z*28^tp1fY@E4~~oohk{rU*z3Hc{kG8{kPp$KUVQA=&sI0~ z%nkP|}! zl7dUvu_W_b$uHas;Sx#}{qv zo)zQ}6~|^8Y?uxZ4Ds5jbniHQ$X&K3m8idV!?k5qetJLNXKur*fAWCmoL}_4k$iZg zXmw77?Umi<_sCD{R>hJdJ1XmCS0U=riaxVr8x687zH{Zq+!_qqA0?-R6-sE?u5DCp z3)^N)vtk(RmY(0#s$TVa!h3e_&H;UWw)2|1pJ5BxRMPvk>(OAsyQ!?-;U@}B7lN^k z!Yo#EpVkI6b^I(EJ!GFaO#`R$b3`0Y-kCFcq$0|A??Ba{F;Lx8cpZ`B)2O^s-ugz; z;s2WjNLDMe5&5ZfPdrVFtV>tEr%)Kh{W#hlyCbW%HnZ9Jw@b4>KSf{C`*Ov}5~8!R z8lkE3%7Zodh`XWJ;93x`4cO6LRg0e@$^0-ZuO5i?cY`P~Ka-z2Z@}i_O|lvgJ_lA6 z6EG(p8A-ez`u@RwsA@m(+uHZbT)puYeIN;KDJB5q{j`S~<#g9$db|bMs+~ANs5xY$ zLt8poyJlytPO&-QSS7DD^uiQmkAv0+O|yq>xu?*sX!FE2@axp$uB}4@gfh!4TctA2JQ?SRth43pksZ#NcR0uIjqmSo zZ?E_J^?W{_dmL(_-C&`6qO-|NW(X>U8$4EDV4+;F?2C^|*KvW~-RKUMI!Gr4hNzPC z>SU%nZzoOQ-_4r!KRPi1eHbh=@OO65-Nn!Hh|L~7<9vxRb6)PP%25C~OEnhK!Sw^% z>(vegtgy7Kc7S&Cb8GTJA$HShuB2Lvcm90B8PNR0$GyC6;Lh6t_3qrJ9BxiZd!Gtk z7q#mTV;&g}9u(E^=+AN&9MvA&0b0;zm_Iv(Sadv$B=sp$BnFQ*NaMmNZt;i$Z(9r8 zszkqBU$=^;ZaRE8a?L{Tvv&3;ghe&y7nZp@P25Ie_e{yEUyqKp=uB*P7vhorR^@tm zYTfz%$F2+3I{H0$(+{{N{jbWztD$NmVTi9Fo2~`!=+;@H)dnf0=y!#Y08<0&1PdV> zBI!w5P;XD0^a`N(I1&HETFVzx*+`^j*dXkNv$Fj6zEN7PfBiR2KOx7X)DTvCT)ffB&NCiO>6T@m zS>1meI^O=^MnMtf1XL!&e^fj}{!_wu5^!~%x5=2YnFloDRvXGg?L()C{#DvA%%EC7 zg!>s12hBkFI8=Ys;j4)LlP^}*ECCO`&V7Kd{VVz+0E@lDzv}BQhO1JH_m;82vPc-3 zzxcF$BRJUj=fY3-Dq@Gq5#oqo7}7rQq2t%QF!tdPqFR0Z(#;QKDHO^z{c5KBCxnGD zz`jO?@+C`GthOBYNrTDJ? z`gGekX1ZQ0dvQ0Vy(PBH4&HvAy4lG?H(`Tke9HGp{mNupl?i{B(B8j0)D!Ha>P60O zv-;nmn8|z$;9W=OLL`^PPCq~L0AUPit6}41IhN@_({J7TDn;FZGyDn&}$<JLsZ4=kdH>lfIcwOI$ufNYJ-g2!@yhi&M| zisGMl`e#6lHNK5}L3tH&N~~BzTelxSEe7Vo?b;4CQ>rW-d7K+G#D2IXSmN`?ZAZ<6 zf-XNw$VQ+YLT;cwXcT2X?>tOubU3cq{M#BmZby^+IE%z46sZ9iQ&CW9~tzgSlCFQo-JLYLtcmGac zt;kXo5TG=5(qF|j=G^Av$gAI1C6n(7ytXANpkhDvsW5ZE8?J`ovW$O|O|b=&mBJ|! zcWl9W65BU^-v02l6Xtf1kXdd@);DjOmUumo&8RrXd+S}ATBGYe!>X@Pok3T^HG z(4!*7lVa=Mx!ijK2r!HKlBgoS5?wyuBTKeb*fW%zs#hr8eY5*$^8+8W%kFv5Cypyo z#tF}MS|h^Rqp`O*dJv`CRW~PPIfne{`ZRq;-F1Mjrg6QF*m&C@2^4z!&C9_F%okUWeN2>rx@MVXl11_Y7Fv)OOjXb|9$e-hkOF%`<=e2mHM!2Fq#+ zi~p-FO!44r_(j80{196<$pLosT1`mb-e*!w)7h)}Jf0AjEiXUwJRwM?c_IoJ$h*=U zq0R8Cg4HTU&?rz#@H2q63{Lr3Z)zC+yNNAUm(@e;?IrVPo|MP;4hI&S*V4TuZ{I0T zgUVXW{BYqEy51?yeRC-}Pl3uhK0S5SZ}bB+@qKEHwA!_tW=trx4X#LqGO=!>lKv!C z=S5L#W8~GJ-|3{<@>jAVzx{ekcA!@~aZSXnpA$E*@Epq>A24d@Z;rKTe* zfcp!60-c|9Pk;%`!U0EdE93?VaUZlR{3HZ6RPlC9KQl{V6_X+YfwzkSPIgmdE-nuwO- zkWF8wR5zUd_@FbvWtx9Ib2!z|Y`tGQ2)?05MdtY4+ab57?3vYsXh$5SKYpW-fO3Q35bU3G_$swdATs`dcgb`xrdPd53Bj{MkDcDg*+Unf_}JMzkH#Wwl)z zcPcb12Zdn+^`$#Hv()J#hK%){xUTqcca$06O(x!OL)=Ju6n2N%g2ErJj2r4RE+Ugn zXeN+Azk~Um$(dLXv9C-5W+3$ro+@otU(HtW~7*LFD| zfXdV4Z;jO0I)K#S*b3^H6|`*^=q3CaJ5Y~zH$kttCBzbU9E30Jv}vXJtul{^OK#L? zysfkQX(gC4T6x;kFuh~$Gic=-D16IUZDP|B>~afU^F#=1A1(-Cmmvd?)^O!Zx>U!t zmE6Qsr`-5&rSMB7meLK9Ei+PRdkrDV9T?i*46`DFnfO};OzU=s6`zIc;pTKD)57{W z_F%Y*@)z-BI~!q9D-=5emDsnz_8b?3k4A~3C2Bj@HTaUpxGGMD^u34mts;P22ZK%H zf&+#M`L9yTDZ!IYs6w#2|wn-K0Fb)@MQvh=_UZ& zva!lwInUrjbOpZP?Qv2{?E1^1wy zzvrM`P`f5~FM7J!Li74dS~@Xaf)+58RPgMxRIKHqB86ZhbHQ*GX-06}gVS zeDLgr4drdI&VAbI39-0NLcU7DaW^azYUa3o!`G7^E>nG&dLuG@u?U*3vU|<}yYj6u zJMW%aRQwX^WF6$l(?Q{zjZk@zu#r~Hm5!-h(b=}R{|9nZ4{Po=^l${#2o9$f0 z?H_LbGOZDf42xT46ga}H1D_rXP zvhu^Y+Lp5>tY;$d`6mgSVx3eid%4M_xb$BQ8~Q$+-5np)&4lXGZ`hTnz%dkvbQHRnTWh6c_C)>F$EBw9n1o*-)-El_&h+f36>=@I!)YC>KrB?&p|%evbuh+GpOer;oBKj2>Rlt zElSR6jUY66DLuE0M(3q3+5+QAjrGK8W=1w0v+~r1&YXu; z*zKyo?jTp4x?i7hx9idv17r2Nj3Ezi67BHM)ebKM@*}|Aq6%b)JcD}O20UjB65mS{ zNuqDGD;^;d=EprP@o+9Bg6a_>up5Rv`e4FR5`X=X<{ICUT_fLC!ZLDHY^f&w#;dIZ z2l6x9L{11@55cu9950EgVuFVRDBp?6G62MaY;-j7gC<-b(KG z)^>NPPA6TxozTmr0Q|S{_0$ym^K*Q+2bR(oUIWQsj?kmw@5F-GpNxTI|4zz1klavP zx3{4gRm;6LX(vn}w{Uw|Q8&oNPq4AAsu(?crWP-?6m+PubcC#1n1<|hfgDj)5`!_y zY>m}GEkAqB zxkz!khSRAXzJby_0|{ULixb}Hxr|Vv!p81U`gbzKt0s}|?l#a}3o41Zy8-ptr8`gP znx1Vrr^<8Z-eYu>e{fY?)Hd8=CnnDL4s9~Qx#47}%wJ;C4Ub$IT7Cc~d*RV=bSBX{ zKQ*eHuO%EDba>D4oNkx+^aep1Lf6|gs9Yqr%x&OQ-8-GhatmcxMY#qRdmjNKKJ(Rn zYaa^5baq4ckm_mwaVfg*8!1lrDqjfFVN}YQvnsKO?Y?t*=+F~j2dxL=W={Fjjdi1> z8HlsQ+^Zxq$4;VCyDlA!rPkT(iZHgyjbiCT&HIp&+a*h1_d9;*;40i*{ea;rFOwWv zKwIDY*QS?}b?!?#l3tcU%@kYBugN;6$;%{i6h?W=Y^8=Qa4uUw-M`I~a-u>}N6Gd6 zpny_PS4Y;9?DGp2TwOoexAtDx%}tbW!$eJ3Xg+}ixN&h=(30P4pn*FN#0Uu52}sVk z+z%=pA8fB_GcCH#;^lQLE~#xO+IT^v0&4F1od?fD*S?MIRps`68_q(kWHiWI^6X4p zM!X+8d|>rK0uG~LmAY?>U~`I{X#2GM&&{9x`emIWkVvH?HtK%fpaI)C{MD zYw3&gZTUBf-$-p4)3-8>7)<8@v)Rz>NxfJJ$ZVeIkB&hcfgmLj%_QZd?hFrT3IuhKs9v_ z97JxsQ!!)hhAWl33Jt0p{>QA{f68iLG%%EBR{EW=ap;hvgfMPV)2*;q zY{6@y|4j7)HK>MuCFr*ZP>afuxgDbF3x71{gNGvx}yubC8PXO2HxrmR*Y`;WJ>5VN`cE`{CDn0rPN zGx;YW`Nr70d)GYGOT%+awMA7N0Wsf0sZgcz{ZPJ7TrL))Oy+sp8K~o3wtP~vb zU%|@FGn(YEIj%RWv>@{RYhdH64wlqXTbk9`ZHlS0HEk}dq8h)OFbUpdJ1BBMr^jL= zmQZ*%#hu|?Di+DCg_ul=#7k<$jVv->-Gnd8Y^C%+0=70;)wOF*xV%+wPZWGq64x?s zZ&~H^JEAE>-fKp#(VNgJbEH6q! zonMVB%Ar5#YQjOA@IX(lmojuNx%rV0^%9S?LSPCsWvQk?e>~c+q$iJ%Ug$e3vzM=Pr+j@QE^(Aj9zFmf?igKj-v-WNde@5K1$x8b~5LP+VaF#xBH&M@y4aTM@tCYL_^9u-LUgkCVE4IO z7@G|u=6F+GJspS+TTXst!zB?g;7@RXU{@{HiCm{ao z+)AGBq=+Tcsc!w><1J{@HoDa0)GlPiFam15eVKD7A;7(%ENFBJnvP-+L61W=X%;K| z_F%;i7jIY+Jt8+I0b{JT8{ZB)-(wt7C~0=-7_DZ$=ygu`qSn&T z9pN9lp(p(> zauasB{@im(-H39ob#F1U#>^clxWF4UViEl=MIzmgdtHGj+_S{LebK z4(UC){~V-_-n@u=!VH)6`Oc?w;jDp`5K|DTvY@pm+XIQP#gn;Sy2hEZ$5w8%(T%w+ zN8VX}oPCdcmGh@r53jV`*lO>l>#^IZ$WcF)Z3fKISl4YNu1RrC-}>jCCUvjRyvKG& zL=67KQj6*q%MbI_ma0ZQgxF+dzzT~L21Q?1I@Hb{U8yz%->}x=cw1Rk^>;r%o&nNF zBM!NMgJc+`9(QaZYK!uYep(OhC-G)P21m~kC&9HPF8i`O(L3`oPt6kxOpMXt#)d#a zqY310uVG4&JdaPDDIawYm&qZLO8l_%Tvz#D6Nk++doKp9av5kNyfO33(&6aJoOsQk#Ex%9Kik?hbMBUZimIuw`dH3P_Erk~_kZW{ zp5-sRSCv*k0|BX}U)P(-1;o;~$ayDgD)ZWz$i`8Q#mh8PU`iM1kGcDXRta{$z)he;k zA6?CGq*W4lYl4{^8x>VgBk7rXRRA zK6$glcAjmBwfyG^1p8kh&|ZSJKKN<2By;cgap%KLe}0lq^Gt_DmIF9b#F_R@&F)CV z_r;coZ`G|c=qj!TY7hEx=@q&asEQ>Pu@<1UF0DWefi%*ETGd_qip3VOZHo&Jiq zg_$|+*LY5(@x<)e%qPN;iS(}S(at21e!382=LT;!X|r+%um!ql-@JL=30sZ!7ypsg z@_};mL&ck{Mja+zrP>QO;d;syd-2yoorscS2GX$^ExF^s7=YxG(9<&Uu77VZ9o%z~OY=P16!n zW#rM}wlCM-1%lu_u|8}j7$*rHEH!LmyWSB+#?U_D3GG}bKLk_7n_OH9obU2-wP7}% z;&d_;@+sy{6?t3$U-OI-MHPjmOCfHscCiraW0slvwLD;-y*jT13Rj{`@~F1wCtn|l z!&sky&+Qzzz{7i&=a_6W7zb%>X@gMSgpXIK0GY3vO7?`fXn*mm2jLS79KbHJCB;;E z0Ti&<%6aO7-P6}S-hQ+uxlWNz2#HJv)tAC+Z11(5D8;*4kY2yEI4;h?u!lHJj|(2;Y$>2eZWY*A{y zbe1*{#k-Y*a_6^(JNHZAM%pLXpN!`k1pn^?*q%I5Jm%+Vc{6+b5TwHBIzWEkM0l2j z_IGEsz_^ftIqkXV5`0EWEFm_r1_Cs)z#zyB!^s$q(v!%H?k=J z#{LIRHaFAqDy;fB#J~%gnC?-J>q#@QZWZkACt@{XdErvkqkNb^GT%dI&hH(f7ZyWy zz;hyMJ?AuJ>U2qpaQPTxXdOwgvOwHEY-NaGp^krI((Z1`S+l~v(?GtCRIjoVG?@VQx^ufhi}S3R}mJAvW+L zOo!Y68hRt$V1LugPl&U#&*U+N7`g-TW;f0UfemvL8XUCs6RJQXsp5l%G^iQNA7j4I zOBrYRoEv8e!9nX|J{Inv#S$M04cA<&>?pjp9EHjtydVS1*V6alEGo^e z(7Q|whn&f?av)!&Zbi%A#p;te`T0gkT-ASZE{&uHTRSi zE?I>N7QKs{iiczs;2LYftR{XNQrI_Cs=Q;=Q8FvKym3h*=lg}xf=J_oH-O9+kc|Vv zA?KTRdQ;*9`9G+ZsRX=6(c}#qiIk91RHXqi{CP?uf`~Ds7!xB~*U?_E8L2Iwbc6eT zn3uX>Uu(r;%9EFi!s@g=A8SiX=uO4TUBZoKtbZ0eVNEUXbd@Ux6M{+RA>!QT1-#6! zSMO6U*lhy^5Wx1`>-o6@G`(HpIbs~R<2z%k=f6^ENTssw7ZJrmQ=@@Sm_Yl8X?}yA zmZ_rBwmOI3$yB_+EhA0%xYZM#y7({70D1m>pUO(s;v$M7i4k;4`~STFXMP@&0`h3&2N8<< z_|y>_;xISlKQ-fBhe@OoQ#9WfUv&cq#^*Zq&$q8td+)W6MeP4C^nG!4;^D`a(=J7} z*k7y+Yr;%D?GYQfsrr&HClXsm*ZPT)V6=N zfd<@#gw}bW3AfVvNKjmHqnzsi6x&u78?P`O#iM@MH5NGOF{0NukzmnKdjuv?Qb zJx&;U?JkSCIyG;urJqw>xg{0>AQ{Z>$Q{B+unOeeR6PwTIXoJzaM)i{@+iQavV-Un zm8ghW!ME^`adi1!$`c`N<>av|6(^PGt@qZ)x;-je8egG{_mEM3^nFKP|Esk_xI=_l zq0D57+KX!Iwf`8O1%UpyR02ny{@4dPF_5_@cMv6(;36yLS9{b7SGZ3``>%#9iFpqc zTgL-6-HyEMdm9*2-$C6UCws%Us~pgI(`CfMJ7b!~%hQ28lIB~90@5Y!&O-%)f{)6~ zz+K*$;`p;mP+%;BMLmOvlNCn=Z-H9nAj_jeOPHaQ#p_7eDWPH~@q}gDc*ZlU%zuj_lRhuYu3LByxLHLy1_x_+#kOt6=aT;L%qI{Ug{$fCjH-CT zgx;}El+!DMS52~iBf?Jj(X$}|92uawH#DY5+ldRWfkv>8I3#NrO3^g}_9{Ppj2LUw zHh8+lFt$FJn4qe`S5ai^NHvPu`p*>FLb=TTZ(`P;(+8?PZP>&A?vtdAs+L9)lciJT zt8u`|gM5HD+IF?MCz4^lU7?X|^cVwdlt2=Oei^?p^Sx1eAdZ6cebXNIoc^3XzjL~m z`;usVT0;Vmlk?`AXvtBVa5>?9u8Na~>-qyKH=twEg3#&nSE^e>1P34Amf2h?LhPnN zJ0auS&`TScXk6N<+b^CZ0KnL|c!k-x;#`t@32Ns70r^2_ts>!6@PP$&wjay0Y+u7B zrh5W3^3yOd?3fM}20ZM(`5KLbV%+!Inw8fG5erGvit9XExwFcmHx_Dyz&lQ7!NiM( zKP|=Z_K~8TH&+y_Sc$U zo+Os$pU~V>71&jDYcb*k6w@QH~d=)D;zku3NrR#^K z$@mXd#l!Lv;z5H<Y9`2x21u7NdHA8K{B}GvujapSQwJ;_G zktbzvIy%1WWpnDed}5AZQ<@)2ShM#>vwW-}Iu+3~1;AFde=Lx2Ca%n}sy6_~V`s{@ zVznZXG7s0T-znE&MbVAh_|S5>sU!}I$TW&=5*jFz;1TI4Jbv#`GOJef@vKTgJD-L+ zpqnC$!0T}hu79%sc?H#zbw$jvp>j|D@Vp=`rJG1U6u{FPV37(5O>^Wuvqw^{uIol+ zCUvre3Bov6m5fI=+6O;jjCkww!hg(H-@;t00C|#xxO4R^BVs_aE{XgnJ=f=Qd629s z?0v@XYk7VftfKFy@WDO6LPkPUwByNf@|X})0|Uk?vq&`2uZ$n0@jE&z&rVmg-D*ZeH5_)wD%vsY;c&=025T!6RXqgR;U#9?X&*&0U!@R zR{*v}25tn~g6O3zR@3G{}u>@t*ox+YcJiO?nfjW@Johu0k z1JUKHQOw+;?;c7AkRU~&!0#UH({X>weRCkWuA_l56Q;y`i>M){+nMCJb|M5%0aaW$ z-7yr#3&fh08jpAoB(UH_H#=c@58_~XSj1H`y+4@vVxhE_sTfEP1^<1_3Fx&9 zt0vAco;~{^%e1PSMS}F&@5%7W8bTa#ZZ1#o`PnS@KAPulz}$TKt#eH|0qq(08o=b# zQCWbhkA&I?F%RVh?BB(6Ssq|EwJ`S~;=7&-?#)Mul^swCdJI3jj$I5Nclo6%=*o0`8D28iXUKmC3|Owatx#6$xacy} zjJqABmymm%nA9X12Q2$DN5xTqrndhu6i)xBD5}wULFiDE3M9J<+x_U0o%&T@{bs;y zkFbs*3fM7{4D#%La}JZ4pILvXv*CF$79B?cA? z3)!5Vy4@RIbt~LcgjD#AXUwr}`Cbr?G}0QJ{41T$#$u^hI@n$8Ci+QaC+>amr#br{^MIv8;yZoTcwQylP*z4R zb?koZp6wZFT0VpxvH}i3SZ4lR-q}+Zwh~O=(e@*O-BFpNAx9I$k(hPnZekALjg4o7 zZnY?`z0cK=^_t1@>#?Dnx{4`o-F%O1b!q|DEGH1yq;Q$_u*Uay4_&h9e;nkQa4Tzoz})DqgiEa6Wl&NgsV zldxODgAT;alvJ`bPXIUj4`?S5@$URM8@JRCL#&DMfuFktcyiUIho@0Gv}+T|cp`sg ztMbsTiianAs7}h+WdPzUJ<4*3hez)ZEsl2px1Z*P z>*eA;RaQEa(gF^0Yz_At8Cr=07Zlxh)nxHWywYIGfYnoT4}I>T^e%rnR27g2xP60R z`Xz(NhGP0fc*b8t(}e%A%ydBQd8b{u0#Jc!A-|NY{GabVo=bxt(~V^{ zAq_sgW~TU(>CoTfDtqs9L5HZ{_XK{L?tBuqT>{T&MrI%|rOaS6$v<2j0Z_A|jARXq zDk5Sd1zIsHn=&fyl63#gvIUSHrEh<2;W>`C1XdEg#3VGAOgB;EtpMZ-GyA0T9-7i> z5$cvsh!sJ-A1=R+)tR4DXu77Kd)T8CZUU1U{a!+SL~V^FHDDCzs^erEtQ#B&Zg7cl zT!y{OP2vkY`mBx?SpghCwi^B%l6YO|N{r*ac^#g+9N4+$$R@9EwI~)1bWPKL0aVP@ zFJE5%RzIcyCM&lPd{Q<8}(LoEj$ncK;sGNMWSKyK=V zbp4!g5Am@1C@ z)aC6x?r--KCL(6>wYJ(xngH@DHq82eYI=q6gQiVh&DMZQxOy!<#xf0ASMUcRcx}Q_ zjs3xtjH=jbdE+Hv{Wm4{-*o|zzb1_g+|H`(+-5IMZ)tkIF){!5ql?8`s|bmM9WP*d z<1#u{r=ZOi5SKHK_TIA7!^-4UXcUohns2?Oa$OIcU4u7vD5u6XPmH7O@6S*epE+UD zU+^>F-w6`jh#%}*&61&<{KR*&$Tkg&J@d-^{aHRBfO|pn;c)l7A@i@pX(+^r+uiKx zEOEAu;+1y)D{ZvEJvy$6U4a{Mn)wz~r6Tu{-}63Im$cC{EoC|j>PoZ!`d8QPu;hW@ zS6+<%d{u$*Y3IMO+qOAsg6z%Vnwq+q*P~v)Zc?4GMXA>l{HA9~C$DSz>j*iMB+|dr z$`CjbZ$4XvS6)}xfc9BZ;93i7Ky2WYZ04;Av!XTXQag;Y1KY_?;9WTD^S=g;b@7z~ zuR!-^<4UcqNiA>G=pE`D;*8g3WH4s9`V9(I_sFc*R&e1$H_X3#8Z?8P5R946QSNEo zdWKt4%jme0CCYvH?Xm2NE*ly2ZL<&i#BL2Q&d2RZE-s#o3pAu4mb07nuX#5=Gq&&! z@&v@kFgEnGm=+oc;gf;wbjeiuIOw9I7~5#!p~w={+IJ-fjH;*QGv&V`H$~P9<238w znY6D8S0`kef+YrVt>%UGC6>>gh1Y^Qn@xl8<9sp!j|*49vf+jGA|sfbXd%U;W4mr7qZgbRS=_$;@#2G_p)k7#>qKe z{u0_TIlQ;f$rUw~kY}MR&+08}ZKoZ@BUy2r{bqpYy9!DQFUPNha(~%2zIFBCiMf+T zXpG;#Wpa58>cKDXu2)v4mNaes%%kG{^ja?6Qb^d!w>PV@>~5bq!vh)3NI%HU;Q)x5 zxo=WygeS8z64O*u@wwLPkxJ4_40T zz*y>6ppwAnopO8NE?dp)l0RAf_54v;T#FVmex~a6RS+9ZF>Kk%9%#PPPJC*ALfyXO znLN6wJBNu36BGg4Kr&3#(Fe=qZh0Xw3H6HaE#Z~DIV><^x7N0JFYF} zYvVvA6I>!*7|`%9nBps}UDK8D7ocv%UlW)^Uz7ZoBZi>bqv!FGx!wsifueUx1?ySA zs=wkGfe1y>r#T@>SfAs5QdZ0u)eoxvW=AhNQxE^3mjmCOrjuP@LK+jkMGLlA!h6) zfcttboBus2Da>0pyLMV4R1T-0)3;`sPH^~*t`~X#=E#XEj6UnS1)}q{SQ!mZ%Am30 zgDwbR{857(VX6eb7mW^1DwhBsZmCQ2Mv04y_^}#_`~5>gW5Fq1c};C>{@PcOiylBj;${7**^(e3A`oI&MF>a{VGrT zh?@bQ737}{GV^|tm6i4B$75x-KTByAjz)NnjFj-uxOohb^o)Z)@fV^k;3amLU^G35 zO{7@rhX#;;>}vE83m$a|tWMmVhPXg*w!D{)K>Qw9eJ`UJw+T6Fp(2+VKs4`umwb@Xeb8 z0))*G7d?$yW@v^CVWH$V`%Xb37^kANeZ>n@%BaQi?z&U1L{a04>asT}Z6$zBh221av|I z_@ewX4zw|z>f2nZ*L?(=t0eq>^}QGo`jE&QjPW`}lmz|Ne_wh{i>j|PCd+#vp09%& zY_V9%F=+lmcaDw1a=z3r=Qbk8&N(rtPm4;bN`pE~oCZ*)ofu#|@-LTfT+Hv!3&2*P zKil-7K{-z)=SB*zB`+X600pxZuH&KAsa3fX)c^j;%)X@afM1(6_pn(Q6E5vV`~9uW zj`aG0;HaV9@e|kVNFUNC3JsRHr&1yLS=&v7UeULklW&zhQ}c=L*rq1J>&Fq~R!B8H z6L?x_?n!lA$#WMGp(t^okD;f8r60Tf0sKKyN#$#K7I7GJ<6Y@|KkyUq?TMfYj4bXj zvV;YY3r(e^Qm@or6YDF(RwPE%S5II`rNXZ#O>nJK%*itcKio+@P6uA0v}}CAc6QMx zCe44u3u8$13^Hk$Cr3-S-LltS92B1T5m%pm@f`K}mygTC5;(PG+^6+Q<=<|xd?(BI zP2DPu(TyQe@vk>4ddD~S?a|hx)RKndoy(u2l787NAv`J%2{12z^?ENaU5teCPXwk| zP4`LrJ&Jqt9ldzl19-pHPw^>okIF6 z9zNp4&&OX_=!1z?7Z)ZidnqHCw9?*XLWzrI9+QjB1XQjX_2;3%DzZ-AEzDQRKxi;= z#*M`h)L9_yvr$pGFPod}gxrqbRns||3Ax|vLD7G(9(<%-s=7O9mzY|mzD)~A#_O!) zRI#OTo};9g-?J26wZ_$P+!JE`n%{y_`t+a$K2p+yA3ljxMF_f~roI5oi=SEj>VDX% zw-`rgGO>4e?~4{A4m|vx`vUx+E}vv)r24dvlz5sHe{6z^5~ssh!Rp+9tbHF~LNEAgEEh|7KTShqMT>9gZbMaN=U?vZF_@Y*-SzlS3Ah|TeJ(yC@7%um-` zmhC?Tw=Bs1{#pLbXU3zpYuWnL?{9ou#$O29_xjV<+-;hsR)=G+ubk7i|8#1_`Iy%1 zHE{g9ET02)D)YM-3!W0X^x+o|vjx7T4L@l5Bb zwW_YF_Z0nI;+_0uV|(1G1Tg2eb_5gDtwiXC z-A-GPn&5kIz?*xUwBt-@HpR`u{&XObTAHX10oU0PJ9hD@wlJ5pj)tfzqjh5qg z#f@2t`#+pi`l;F_$`r=~R#)3VR!Ou0XyzH;KkP>jTOULi00qDy1EXjL`ZS)5b=yszn>zd5Y6T{xMRzS; zxkX$BnLRTwGU#l=!2@Zle;wyCh2kB6` zyrxuL4dP#SkSr*QQ7hr!FF7HPHx*YnGlS=2gE|^l$Vy_S(2TzsRTXbI&~=mUrSDs1 zoPR-^48k@tE10xjMV!cRDZe6834NLGBTv zpB}^;l~fpE2UvK+`sEM*POtt!_8b8%)Z5wFh}$WQnG7}ru^ky;G(v?@;$rK-?_3Ua z4Ac$cu2ipFK<{6lRj5H)#Fx+sIyM6Jf<4%Wq8W`c8{B62Hw=HoK+1Vh(oK$K-9BB~&8*j?~@2TT9 z=A}=yjSl`iss}5&GtYjPCI%5ma?k7&D=EyagVcgeldLHO0Hj})CG8FG^j7t~`LZ??)bEU)j^&U7WAHI;k%46$5-xy7A%pqt+RiL`5 ziW;Cf$3jd@OwY!wRBf(r0%yop%eV|K_ir9?XH^CFk(}=EO2j>}|2-C0V#-_8v~KC! z-RR7z`XBD|vGH;YXl z3>25i>RD(}uMJ0>i_4<)nYaLTud?75)@`8^vp)2%vUi%0e(No3!^3tY1L^Y@-@8BD znZ1%N4DmvdgmoXMQ)&?9_6t|&kGif_pIv-EXPJZcDZ6!##ew5T3)IIyRSoqbMLScMg14MRil1-*M^S_mkZsnFm zZgGq3@g3j;4~w#|FD6yPFP@8j0t|tveT{}Wz*WBF&ed)%Kmv^p`6Fl3*6Aq$eGVKo zU%ov5)?puy-BJtrdns@7(u9b<_wzTbPGH3>Mn&>syfn zNBj|sDBS5BfOPOjHxvKpaR;k9olsYDnZ2pVeb zL|)>>Xv)ChSRHf0*nfRTDOo$)N^ASX;PF4*@Uo{Q1`mr5=axY0meS#bo31_V-`qp) z(3H(ll)|H&qAId_%ilSN>NNj*CNnd6vex50boK=AZY*@vKkq;`Aa#xJN}64Z7a4F> zUQ0GM!282`Y>pBut;eTsO{#+v{iWL|D6o`z%|9F6w! z>~*P>vyzgGUWt*ZDt3la=>X^zzu6x=IXM-*BV)8~v0oZZJ!$faNTz)ALRmz9&df@I z=lZ2_2CnknNG>EETf(NO9cUYKc^uEVVWtthuuysU(CdRqS?HEipAy$mg$!u*fwV`;^C1CG%B64bLQ3s8^ooBPd9OIVn|hutG24^=_ds|G?f|Y9&_4ZfY$2# zIb>kiJ({!2sdTW_>d3X;qOmR(o>@N=N^gHbBb##?trbrz54J+FO|aJ*>I%|D)`bsY zSCRl6nF*YEg`Qy2tIYALqFr^0?hp?~D3p=Q?&9AswadFFJ%mHDV-|BJYGEz#>Ds1; zd7)c+gi*|e7?}y+r+pJc7J#7pi^~-8$V{gH%4#Ko=iDeH>AqOPlvZx;pq&VXaLV93 zi%Wbb6k*4_HvtIS$BrE@D>T%CDqVtb3ZMaXa;B&47H7)1^M#BozctV#>Tt>c1L3f> zMA9*<2E1|le~dS{d)Iz<#H9Ze7czhP=#h|l?Md;?9+nHq5tn>oq$*gO9sJz@H@yyY z$NBM~^!@Wb317hKZQt0@e&x0ajPj(A2bX@Tvs`poD8fy8E`6b_^xLY+>Kqe{Yh^%3 zJeO*2MmHZVX+RTb&Q-hpeZ><>sU$g8D-pf}ZuO(|<|PJV;37bLp$^j#F7~6x=y?IyZLS`9< z0pIUEY(W85DYeUU*}ZnKH9{HuNSSP=H3GoS8D*G!x1!ZkCi@h%KXi2|Ee%Q?raJJ| zxoeu8yO@lXQJlUzU6p^H!ataJlKN1cQxMXT`l;D?M5S8jx#3|Wmq%^KKiw~#yrjD2 z1pP0m_RQoaeg5JCXv|y*A`YqW)RN=XdMIes?t)^iI&fiOlQ=)18JZwDagHMZ> zN4PAJ=0K8!51A8JY7y{tx?pp)J9P;BJOBvGlK-!zZ;xmCegE&Q_a~Hy=2+8#7;iI* zoNXwFqQbUNF{d?hOp`+?=hKRLljBCnoQ=$>6P7t`*mADqoP>=W_j~F4`(uws{o{VU zUiWoh*YkQ_&+ED?)kH)^`ek zYyaL6VutO{T!HKbVtz9DiL2+;a}R%|02m)L_xXHSRg>Q|#V{vy3Y3lqeq+_s$#=sx zJkp1n(5|aL3BWuy7a%KKDV_^NyObHqiaEAm#y2t#FUm1oa*Q~WsQH;Ux1a#s0i^|& za)mD+p1^WseUI6eX81jJY5gC_p?$#0KUKIHS7V~@7*WL33jCsW(xG}P*{=dmjW0u=cgAu$ zzGP@XZ7vA`|CD{x;+g;yGxRq(QgYW;YcKtz&7NClW71*{@A$|qnuddej)WhB_FMcK zQ4|Q{%4_|m%SQ=5-rV^85xV}xxr+ZS3bPD6+tgRXpil|pG@pI`DdjzDH9_O;Wla0k zBod$gewGv6uPskpfhp*MLI~;_G|$xdawk>t^Bey*du7GTs7R@HOmE>v6q=aKtIz)t z))#!cI2JtWv=4UeXkyx~n^e|H+UXjnZ*!bf1!P0~S9j_#K}|WAW&BgntJA5bZKe56 z33pL-RjQ2NwxHvmrPj)r_a$^4wKDWka(Fq+b|r5f^LWApbotu>kUsEJs%^jMrQ?5p zqRqJ7>XKpGMch>_p`=FswlAN`QTek~2mmmoO~$N8J!V*QFnDbg{35BXbaO$&+7;rc z%|^$o6TsNs!(Vu?U^mM zD+x_FeScmPp}Rfg*P$zrM|p`zdj5;kk)4tfAb=UE(JVdR@xrBAfUU_YDVL!Ui4!R? z71(x<<)wBE@VhG|spM=eD{(7vs%7%bu6sm6vw`icpNLf&DQ`l=-9cVEpc+Xql)CBq zjz!KA3>hhLA_EC%e%E~1b&n|-suF)`l<3)X@ksmLS)9wfniV^v162j<8e=!KB^=J*XcMS#gVU@ z?){(&e_e)=XD~5=pg69cx!M(sXX?c^>lPlu2sQTCox9o;42nCB6((|^FG10n2Yx($ z6e6GH*A}(w6(dOL*+kukqi1`zIANbZ$vmWw1uv$Ctc@vc$^{v?c+OpyiMdfv5Q!1Q zz0UrngzuVJj%IzzZVTOH<4h+t7RUQAfY=C_%M)6LwiD=KVP{z@N3)!Havqd)4l)b8 zi=sk$Ev^A1)_SbYx;OvawQ+!YTcMVJ=6-qx0>yG$PP+ZJ>2!aRDCnSXa^`9)syiIh z*t=cM|1otOU6;NY%X-C`qSx&90KC6zcikNXUu^k($tzp)0p>_6>c zDOvojo~o5`z5@{Np%@)c^2<=6%z>l=B`Kat%4tOgLsPvi@HF%gQG}^|-3i&=F;{m^ zKH10WP-^Q^js3Rj)Ye+2<)!J}AP4=qGsO8pkn&Dx*IW80eXQv+Wf4*T{io`udkeF` z*-HqOr`?~k%^_>RwVM{=t*!;*G+RkdA6w##f3#z4F+?@MD)6+?G!-7_+;uOVIYG^e=@$R+z=ib|TxGU{XI9^tUF3wk#iN;eR0^!YkG=FBM%~UxDsKfU+VApIN=Z;gZD3R z&_8J|LQrNM`^D$$F5vF6AQKJkv4OiWL!5wQTWn@y)qTy@`OALU)45!~QE(JQo!@Zj zl*UR9kWIP}(<1~XqvY13x4t?oYI9rW&er`ad@t{QUFoV$)SX^}*SY=I*~S^l4%xPh z|6=|e`k)lIaeJn+Z<5xX3xhkmIo!B;lvzGzaqd(GpRi&xyqhmZoAuG10VCe}N}G3C z3|Z?E4?famRG3BN{eglRNVu6~_-aiSZWNEhEQewS=a^j+2e9X_&xZaI5de@#myCgEy~<2%OkeMzWj7DjN)2=p>O z;;V;J(pt$`vNcxZJ?AqmFoN|x;TE#4|7F)(|Cqq)NsSe!c;`4RK0^;Nm59uLqJPkW z&b-=3m%lis;51r`WB-Z!V?wbm*Zqu0+jv}}+aFp&X6L$)?$neI8!xu#veoB2glxw# z$TYLg;H1)Xx}h6G2+k?85D1J5=i0mLI=;eF%p27P7V;j&btgc@-OJpjS_-NeTc(_` zSA5zvksYyrPn(_cM@g>UU*~2am%o&v;KhNO&?i&dsao*00CB5)6NPEh?b2^_=rD(hSVpm9Wai#E+f|KsvwfsT4%` zH^$YP$w6PEjO`%VDlT6FLh{>L$xPzsGqXF?wxN1hk(%+uld=N#(+&g>I+MwfO{-ls_MpLwy^_oTSFF>I+O@j-;VzlI#3` zC!Pc|t2JC_HhAi;?8h-s3H-0wK!}5eh-yY(`ud`lHWkGUHtBvA&_%*t5dfBY@|v(& z*5cS4+@%2|2C>mO;DL4sIRShWyH|A{ZC$o0{!TL%rR!#}hWv$YJG*b7lGL|4puS44 z$PH}L^Os@#J{5I9>xg6IyEw1XrIo3SNi)|T2&0Or$4Y9G)bgbJRBj|z>By$9m&-hJ z-&qmgbK3Nhx_~gf4(M2(WCAl9U*B%XKZm_hPjmby_JTmF3RN)mL;=#;$4&?tLX14F z>f7U)u#q%3n^JuuCh(wE3OJBY>+DlI+*HK3DUp@xK~}<)r*^|HU8J+KIb^v@sVuor zkH60S;848>AwsPCceVNfXYNf*o6deTcFR++?AOtO&$kOhGaKmdT(gpkycdJGJMxx; z9K+s$L5IV@76DOe_c;}IpHs%pQLFt=T&Kf>Mt4Jwp^G3Yuj)t=xClM4=W!SOl+wo$%xz;JqWS!>)f*GI%DOmm;< zbY3k0BREU(ZRO@|`#d^kj6;xC)+Xp5*D;2EZ5e%InygEQb(vdhwdN#2!&SV=N)C{@ zCc-jIegR+zmJn9{=arx2ms-+``}y|Gb9w>XQhDDaKn%yu8e0bq)+UZz#gP(&BMT0x z0=MtNL3;`H8~(4dD=TYU%5*yp%{W8wlm>V`DrzlTx&32?6LsaXHh>iL%E}AM=C!ok zFPD_-Mge}$^yK(vgnqJI$kv3b3%f`^t5&&^MH`I1BK26T>9o+$o;-vNNAa`di{)EV zp$lT}P1Z0;Pr;>+}O zzDV`L^6nl9Cv8nSb&T3MLBRFg!ZRJ@6koeWv0_fziCI?`135}mGuX~WjG7C$(eqyh zG+E?~eZefTz7UDaBSnjbUDVL&u)(!cQw;?kYSVljT_C_}L4&4<=pVId%{N_zWnuF{ z)`@nB@!8a`g7@Cnc2vc^K9k6CuM&KKHvM$*42p9q;a?VNZYln1ZKG254Hp?x>xP4G zoVDcGm4-cGN3Nw6mdZ@E(;eZ|)u%KBawl@&o9 zR7|oueX!pk0l78BdXDDlUITF|&`hEzY1pHV$tz+$ZyWNI@TjOdNwkh{t0=5Bhqx!g zUbLtPeW{I?WjSZrb$iUy*qvc;#)AW7h0os>3@w=C!fTUE*+ z3?#9YBG=1?YrFd}gl}9yJysOhx!)-Uqceo-kHRP%qu(t$=wQm&YrJ@#7E03*C7`F> zou6}w)2Qy4vDJ9*Hnmb86UusOzyV-Kewp?t!T1L=r#%1yf)1U|1BR47`d*!rHCiX0 zcfY@c49KE!)r8-v9V1Ft=Xq1bP%Bi3Eu z1>j!7Lm{EX#R79ELcWCcY?Z>sVzIthSL(EzysLRys5fCrMgA(xMEms34Fv2?lYh zP+R)j|{JM7wRv(|A zl4|OgUi)p6NYuO8V$P?#&qBFxHsiUj{wR?QyB?`D!=%)K7LA-nZSczYN25Clsd{6J zTWcF#Ge!$&&e2Nyzn+G8dc0v3r4{t$kDK`aWCFkwx4qnkxGXZQr>MySmcAEp!!{p- z@W9kO^G8|d6tuo6WKez{hy`22W7`xZFEc9KG9`aJ3le#Fj+J1*YzQdjK2lIm9*CH; zPv2A0W6=e3!s{{RYxwl0TXCmTXR1sXx4V5t`5w4E; zXG|X1Mg-`*JW-LEr?5Xc=JDoxMkc&n0&M&ZQEyiLn(??}u5%`CYT#by-@oZPvKbYo zV0m{7@%uZ8iQHoyAa$!e(7HcT2w_$<>h8nN?e{c!85%~j^dCWo2V73?G!VN24q^_&3=)f*FdH7mWAa=-7?^e%uSiZnEDVFr

o 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 SxGjFqo+}6|c$v|ir~eO+R>d&@ literal 0 HcmV?d00001 diff --git a/static/img/icon-admin.svg b/static/img/icon-admin.svg new file mode 100644 index 0000000..d495b6f --- /dev/null +++ b/static/img/icon-admin.svg @@ -0,0 +1,66 @@ + + + + diff --git a/users/models/identity.py b/users/models/identity.py index 21912ac..53b6f80 100644 --- a/users/models/identity.py +++ b/users/models/identity.py @@ -162,6 +162,8 @@ class Identity(StatorModel): actor_uri, handle = async_to_sync(cls.fetch_webfinger)( f"{username}@{domain}" ) + if handle is None: + return None username, domain = handle.split("@") domain = Domain.get_remote_domain(domain) return cls.objects.create( diff --git a/users/views/settings.py b/users/views/settings/__init__.py similarity index 70% rename from users/views/settings.py rename to users/views/settings/__init__.py index 1403821..65be1c5 100644 --- a/users/views/settings.py +++ b/users/views/settings/__init__.py @@ -6,10 +6,10 @@ from django.core.files import File from django.shortcuts import redirect from django.utils.decorators import method_decorator from django.views.generic import FormView, RedirectView -from PIL import Image, ImageOps from core.models.config import Config, UploadedImage from users.decorators import identity_required +from users.views.settings.profile import ProfilePage # noqa @method_decorator(identity_required, name="dispatch") @@ -119,59 +119,6 @@ class InterfacePage(SettingsPage): layout = {"Posting": ["toot_mode"]} -@method_decorator(identity_required, name="dispatch") -class ProfilePage(FormView): - """ - Lets the identity's profile be edited - """ - - template_name = "settings/profile.html" - extra_context = {"section": "profile"} - - class form_class(forms.Form): - name = forms.CharField(max_length=500) - summary = forms.CharField( - widget=forms.Textarea, - required=False, - help_text="Describe you and your interests", - label="Bio", - ) - icon = forms.ImageField( - required=False, help_text="Shown next to all your posts and activities" - ) - image = forms.ImageField( - required=False, help_text="Shown at the top of your profile" - ) - - def get_initial(self): - return { - "name": self.request.identity.name, - "summary": self.request.identity.summary, - "icon": self.request.identity.icon and self.request.identity.icon.url, - "image": self.request.identity.image and self.request.identity.image.url, - } - - def form_valid(self, form): - # Update identity name and summary - self.request.identity.name = form.cleaned_data["name"] - self.request.identity.summary = form.cleaned_data["summary"] - # Resize images - icon = form.cleaned_data.get("icon") - image = form.cleaned_data.get("image") - if isinstance(icon, File): - resized_image = ImageOps.fit(Image.open(icon), (400, 400)) - icon.open() - resized_image.save(icon) - self.request.identity.icon = icon - if isinstance(image, File): - resized_image = ImageOps.fit(Image.open(image), (1500, 500)) - image.open() - resized_image.save(image) - self.request.identity.image = image - self.request.identity.save() - return redirect(".") - - @method_decorator(identity_required, name="dispatch") class SecurityPage(FormView): """ diff --git a/users/views/settings/profile.py b/users/views/settings/profile.py new file mode 100644 index 0000000..3b16d69 --- /dev/null +++ b/users/views/settings/profile.py @@ -0,0 +1,63 @@ +import io + +from django import forms +from django.core.files import File +from django.shortcuts import redirect +from django.utils.decorators import method_decorator +from django.views.generic import FormView +from PIL import Image, ImageOps + +from users.decorators import identity_required + + +@method_decorator(identity_required, name="dispatch") +class ProfilePage(FormView): + """ + Lets the identity's profile be edited + """ + + template_name = "settings/profile.html" + extra_context = {"section": "profile"} + + class form_class(forms.Form): + name = forms.CharField(max_length=500) + summary = forms.CharField( + widget=forms.Textarea, + required=False, + help_text="Describe you and your interests", + label="Bio", + ) + icon = forms.ImageField( + required=False, help_text="Shown next to all your posts and activities" + ) + image = forms.ImageField( + required=False, help_text="Shown at the top of your profile" + ) + + def get_initial(self): + return { + "name": self.request.identity.name, + "summary": self.request.identity.summary, + "icon": self.request.identity.icon and self.request.identity.icon.url, + "image": self.request.identity.image and self.request.identity.image.url, + } + + def form_valid(self, form): + # Update identity name and summary + self.request.identity.name = form.cleaned_data["name"] + self.request.identity.summary = form.cleaned_data["summary"] + # Resize images + icon = form.cleaned_data.get("icon") + image = form.cleaned_data.get("image") + if isinstance(icon, File): + resized_image = ImageOps.fit(Image.open(icon), (400, 400)) + new_icon_bytes = io.BytesIO() + resized_image.save(new_icon_bytes, format=icon.format) + self.request.identity.icon.save(icon.name, File(new_icon_bytes)) + if isinstance(image, File): + resized_image = ImageOps.fit(Image.open(image), (400, 400)) + new_image_bytes = io.BytesIO() + resized_image.save(new_image_bytes, format=image.format) + self.request.identity.image.save(image.name, File(new_image_bytes)) + self.request.identity.save() + return redirect(".")