From e3a3e7aa194c7421314599bceda2152e2591748b Mon Sep 17 00:00:00 2001 From: lza_menace Date: Mon, 28 Nov 2022 11:30:54 -0800 Subject: [PATCH] tips table/total, pending txes, verification --- README.md | 11 +++++ env-example | 1 - example_feather.png | Bin 0 -> 57973 bytes nerochan/cli.py | 31 ++++++++++++- nerochan/config.py | 2 + nerochan/filters.py | 23 +++++++--- nerochan/forms.py | 22 +++------ nerochan/helpers.py | 33 ++++++++++---- nerochan/models.py | 14 +++--- nerochan/routes/artwork.py | 38 ++++++++++++++-- nerochan/static/css/main.css | 8 +++- nerochan/templates/artwork/show.html | 64 +++++++++++++++------------ nerochan/templates/index.html | 12 ++++- 13 files changed, 185 insertions(+), 74 deletions(-) create mode 100644 example_feather.png diff --git a/README.md b/README.md index 4a2fa0a..da8666a 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,14 @@ Post your best neroChans. Get tipped. No middle-men. p2p tips. No passwords. Wallet signing authentication. + + +## Dev Stuff + +Stagenet txes for testing/validation: + +| recipient | tx_id | tx_key | +| --- | --- | --- | +| 78TanhCTvw4V8HkY3vD49A5EiyeGCzCHQUm59sByukTcffZPf3QHoK8PDg8WpMUc6VGwqxTu65HvwCUfB2jZutb6NKpjArk | 077b8654dd95fdfbd6d97808e2a9ad37cf767fb2f9da4cb0e1e6427c8587f6ee | be64bd151bd01cb4f8572a3c9731d0dff726079213e9f7017957799edc46630b | +| 78TanhCTvw4V8HkY3vD49A5EiyeGCzCHQUm59sByukTcffZPf3QHoK8PDg8WpMUc6VGwqxTu65HvwCUfB2jZutb6NKpjArk | 46fd71389ed54f195d359b84897bb89b37bb8da0bbe72ef22b552c8786346805 | b683e96770c76a1a23253873ad8a2ebb1832e14d90a05fb49a9e6e22e73d630a | +| | | | \ No newline at end of file diff --git a/env-example b/env-example index 5f44586..b58d175 100644 --- a/env-example +++ b/env-example @@ -8,5 +8,4 @@ XMR_WALLET_NETWORK=stagenet SITE_NAME=nerochan SECRET_KEY=xxxxxxxxxxxxxxxxxxx -STATS_TOKEN=xxxxxxxxxxxxxxxxxxxx SERVER_NAME=127.0.0.1:5000 diff --git a/example_feather.png b/example_feather.png new file mode 100644 index 0000000000000000000000000000000000000000..7516cfd8a839f47a567e36dd169bff0c820f3bd4 GIT binary patch literal 57973 zcmdqJRa9L|*DV?d?h;_(5Zo8;?(V_e-Q9viSh#x#?(QBO0t9z=cehLS_hp~^a3B8G zPP-51JgwHos#&wtY(aj zc{C$b0Nc>l^HqQHXwv31lW(gv-A!k;x@Eh+K8WXcgasoef(ZJGf&wnI&W?J1b=4yP z(Qo&IY6#}vKlEV2x=@VX8wkMsWAx<)Lj`o=7n4%{_d=0=J|@$ zvrSGKg&GvGhu<(ix^=#EJ$?MhfLV+Pnf5+>)URJVJNcoYpmLH#*35ENh`>p}S&BXp zm!RA4T_5|?wjbk@!{qvD0%vOg4#H=5sA%6ipRjikG>1*roTmvEv!$qVeW(i8YFFl? z76WSaoMp74@}*-ro(Waygf5eWVEy&TzQe+Bb92Leq7=B;>N&g-i~CANk1gBwm7AVar;9vB`s3l zvnC&V_@!vw-ELevP`v5SUq8rMrA-k~zO1Pxcg`xr#iE4OK?K0Tk&xutK@8k|(T3>1 zi;Fvh_3soSLh#=}=OFefk>oPv*#vlO#FkM9J|%6fa9QnYpOZy7u(YkVcgwbS0yRs9 zuW^;)uV3}fB5d)Z=O=jF&rTyd1r4QK>VHU%rQCON578cBXx}iA%1tJahHng6MQhj9 zS_mPL=-F0I#CPOi-8IS@9MYTdp+@dkZ=&=J#FHjMGks5Bu4VP#z|CxuL_-(1fa$qb z-Cu11!V1BGKE`XkqY@)zAPDg6@{7b*eaDaK_Jp{uHshM$52)ml8P{O+I38XIZiO=U?f=GZJW%s!oTU(*Au{n!M7s~lp-7kT- zS!WD2hMQ2fk0u5FE_TD@O=!!?F&lK^1=0GWvUX?*r`?173*ozM!Lbdk9<~V){j*64 zQlAk0^z@z)5fhDnH(39aTl={W!5mV#{aDzvZ95&|ny-X9wT3RAozi>FhkuJXWLAx$ zp6wYPWyJ1{$nJx#^xZ{I6ALs@O5&7SwTp9F4gcG~nETg{&~wiqC9KRwar*bY#5eUT z3`kFm5*EfkOl;i?Qf$2#zLQ;hr3N$;YImXOLI2FJHUOk!g+|Vkx-2Db_>5q`%7nJG zG7e<18t9FJ47)g>#~qL}dSliLiw%=8?W5GHrZp`#GC+}g#L!M=*1xsj*~A=hlyQ26 zW$HPK?1mu*TDF#df6JJ1@23%*n;0F;&);$gS@>8-G-0f=&z;d?(V0t+TF#lzBeeb& z^VK@`nUF2*lLkzX{Q3Yy$XYD1IrM@q`vt}%#w9|d zltwyqE-aOF6zaC_6F#%slb!XU(x#^3@8N)hqS;o$omJYobl+e#=>zsXT3x|lL4C59 zl|*P^*r4~wE@E~5kQkWpnK-ZOz6c@&jhdetC{!wa58Auvs2eu8ZiP+lpSO@<5Z0pG?m&{y9K$y2J3q%Pj22u8Cui|Q zv`DEh5WBaB^Q=;H3*e~}t2BYH`aI8VeH26)5WTNaa}OUa2O2-$O^Kdbv4qM3Y?JW zM{BxY(=bzUBJMA8uc%B7S`dq+`^UQrvyG&fN~Wlf`kAlJopfRf9camvd3a{t28eWK zRslNYF1Y7o{o5eM)HrzYgCER8PDh&w3BFJE7?lDclzZBy$8dSW=mbP;7-qnBLe zt}-;YnZbLFt!`dexjh?_61j9NI$J7+LD=Cfv^c^Sp0=&$>LH-zH-1-*#xZ7vIY~Lh ztvFlhz1>ptxSkD731^Nel#xADHzv+#k(KUiN64Evl(QJe=|MQKi& z#WDgW2)VfED+*8i{NCPOgOr*<#U|$9Tk;sETK?4l_)s79g4?c}YV>5+(Jsqlf;f#6 zGpj;t5j-isZ((^f|IGzIbT~z9v%J*I^;jjryYAEld-^b0Gxo7PU?=Ii%aq)-5|1)?7g&pqb@nGS>9>-(d-~&CJ=uj2o{=T1hQx11*B|)q;OL8XMO& z4iC~rKB%(5+L9&%^Yhb=D%%k&flC<1$&QYywNN$#dzj_cR~BgIWbrrP%Yx`ZuBkAS zGvw0~-4cSQ^tt|!bP)ZUWa|T3*-D^GH^hB=>p(um1!W8~=kjXA%T?JlWgOVn90m4D z9`S$`{)Rv_EwwzwF?Eu0;(>KiWRX--%2|`c2JBG8F8LQqEmA=v;HtG{;DUl*zg?PS zd)@fLWG;RCDsq>B3wqok-O)HKf-dcMsoUaDi+&imP8_QY-1T}(mzD!iC3)Jc}vSG&1QpCq1g8)@V=j->i&M)go%%F55=Geq~V*tphT}fH5;Pe!P z$bm_=v~umBUOnrz6)Egi;^E8~Wy$oR@gBv%`?2w^!kdqFz0F;Eve;KF;|DPkKR z)vCq_7i6UlDgGNA>uQF;TbAv7A7Su<{Ro7SsT7JpSEh0U)6Ei{*g#(9N%jdbypZ%@ z8ej)Y&>Z~OsJZ-!izuga3;$iKv0>4Lb_1wFTy~56aXjw>mVJ>nyn-_4G04?0d z3enD!5K40MNZl*~9;O!i3)qO5(C$5u#en`feTvs) zL%YiAJFGvSE^rprop(L20yp46IE@RsEw-F33q8hWbzKe~3J9@gS;$i9iEie20APg@JRUFGe95lky`I11 z(2#k*%f%YcWPXk%8Xufb%#-`i5h=*Db{jc6n}YTSe8 zK5AgJamHXoMcCmxWgUrL>7L;S)1cO>_WmL~>Fa20dW9szeFt9I6shiE!jmN^AA8@qdwuPTplcu0 zYTIv2yO73+?xoC=n)d3ap%1|aO`?fl=;whXW=C7<>w^>m;UPuw>7U)*e^73n8&b@8 zfanJO9|PE*beZB0n2s;VBm3_f5rEnM1E+=m_uzC84RCp7#pC7>BP1lGg|PWQ2>%_x z`xi-e&COw*P*_an^+w@qF$CE|hSb(FzXMv5FJTf+a4({dtss?x6?k?&Y<0c=#1<~_KuD}M@MDv^h^02ERZKbg#3KiOvd-8+oJm3?9>lG{xBwg{23-L zfQ~isL$v4Duj6RUvF>icWZ!-eb|(!XDqt;GvV-(Lei0%vL~HVXV9J+Hex(WKcHD;X zxZHlIXnTk8SmY0J|Mn)i{yRr_x>$Ly@{{dUfvmc^y0@C{XJ7|>ytm}v2kIsL4hveW zw|YzbX|vj<0nx8VOqcpMQ@oFc^~MA&(oDW>o9OEcOk)D>3Kd(HeZ)9qcg~I_UaXz? z3{3OEm-nxNurY)sd#vzfWo8wpJm_RMpREb}?;ci7H3pDC+>d}tG^6I4CgSQqa%`qb zlr?@uSKb0I+;eM>j~#oeuE}DbzDJJZ(U+|8d*km*wlHFI`hJH#@Vz%}CI#Q%)vehF2tK@Ob3=?<;n>n~p_|QkK&8KmWNq9;*vCDSalegio*rkUr9O<+ z3cn=L{6ITjf4*i@ALALP2~7Ld$(UN>*Ibm=Ris*qX#fi{=m}vo8UD1gBpZnMqN~ed zy9}^dBH3OOE)5_DHdrrQ`mJ~0yQg}zdotO~$@2A%3(l-6r%uu%SF4oU&L@4(I~iTS zVW#ZwP1mx>>`jDZtz|wp4m;f2A1~f|8N$ixy5ArC@fw)g{02Avo&2H{l7q7p4U51~NH>3tJ5q2JeJ*7v_L4IN&|znuaIqlFF)Q#ab0;Ltg`0BFme;ot|VVJ8qS^TEO*Y5Nv}gv&2*?ik{4I->{Dxfi8oklCwGuphV!Qq_AuC4 zRtY;m%tc}A5#YBEOFDf!scAuta~3dCR}>xE8&HuM#2V1#;JX1Nr{xFrw5#1y42d1= zegPdQr+tE2V?1oqF9>xXL$*e6M}YV8jx*6PsWax{Wc`a z5}GNeX45WoBI5SB)kAbH2V^Q0LacZh7z;JEZ|ckIBo~uxh;1ciZQOhovwQ#ZBJ{>}H2TNEFIL2rfr+G0E||RfzM}xo zk;2B#PGEYecsw~;ul9$e zFD3?GS2$QR5uX2szKz^XkE%wkC1tSDnpwVyOe1-AJtgK1HyDJiQV_jH z>PL*@YC`oC^C;Ik%eGXer6@*VBb$~bc+a=G*4s%|Vg2qO*r?2&T{4F)dGyV4b-NGG zX*ua;|E%Rsav%Y))=}fQb{^R5CR)?)J8-g;J*Y995R{WhzMr>W)~j*hVVv0>!ia(9 z;I`1ol9Kf;c&|WVQe76s^Q2cp);m}|&4>@TUyb}Ag7>;|E}TM#p{iJx`n-?U1uue&SSt;Ai%sFCSqj`>Ha)DrL0ihRAJYLQy5@k7%b zsS+Yd5BnxJgT+;=krvU+p@$2Op7e$tu@NKdvm)$uWZiCv5L`Doy?$<0OeHel_Dj2s zdOeO{KrwqY4I#-gAC~J_A$CkH!%!nZq5PK+Z*L$XiGxo!5(JA+6+0V)HAjG!E5TS}Nz=h^ zZvmcbI+|wS2?Rw(zVn!5Y2RT^(zslxKSCqr$)qyj@p%K}<;N8|3t>U!T8(1%$RTIG zEyfL`W0yxVl*O_EzIX@m5wp6k%gRrX69KBS%)cD94}246WIw7U3-bGwkmq=p7J1$h z>C`i-QvfRz-M%6p72t2C8h8%7X7+E(d4xwWq%WociI>3g%idst!Ll}ztW?kxtY^?^ zu}SOdBk*N57k&8`tn8VwzQ$vT6F~>hehuHm>Z2wM45c1t{Cf8pzqAED zwhR_~a3@M+7EtZc3% z+u%bU9@G6@gnNx|!cb zQSh=^eVAd0nRd4wNK)&0qrXdRCSfCZ<|#IB{UqKfil&BmyznJqW3t0GZ(_$e#J~CQ z!ZZNgsWe!7G^j2<{(5v3EfCTzF%ptxW1?f>z_^K0pX@|mb`|HYx;ght0#^Y$KsgUV z&2!mQHNI(MKD=gLtuVEsjcFumbw{`iA>kC51)BsZj3GPlXfkJmy^{GuRM&64$VNP* z(sBLON^jGQQYu0*{y>dML;nS5-S$pE_7SXoy}n;xQE?3KK-#qZ&QdaTlxf>FKKjT3 zO09hK##JrRT@u?62%A6d<2gvb)D2p5kAkjzk&J5x+xnuqr5@=@+kSm@h40h1wI zOZk;U=c-5d!xO3g#N7pJ<}SGIDs!6CddxolWS9j!8QD#>lg1Sk#m+V%l-k0_Js|F3 zzldnueX!Ja9UdI+!COX-ROr|u;Fel4_vE8P)mcSZD@C7s=}+Db(Vrd>0pPPHfVSo7 zo8q7g_8K!VfmUWg?gwq>4({f1fu{Q zYil5y!e+6K#b)snGIF#698y}>e1nY^1QuY7nbN8wd)AF@ipk#MdpUVc>CpC%w3tb# z;Lm;}iB z)D&UVjs+?@aK09U&Y9&REt(q;PS?UR^oDPe=uT*=DmIb67^eqn%qq)my&@lo#vDhScK&8PYk|Ur(@la zV(C~U&F%U4;V$60kWc6o-Cg_y2csqWoO$f3Oi+V6Sn!r{Pclyo1PJXO#i~MsXGc5$ zA3H^}L(gNJf~~$;g6YGfJ{X&N!ZVy)X_YONcEtI+!N9q2R2FNlXtxvBeTe>ghrS}u za%x`hM#iUYt4&jS$AgQ#G8H)tjmqRlRTodoR>89WK z;zuxd6qKRK;Oc#@8#7j≧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 z

(S^y*~VUFlRkXaixs&axk@E)H5}~i_q+{U z^mNeO16=#K1p&x!rex#-`uz}%AZ$dZvZlb}yKJe<^-|9sDm$p-MTY=HFdP{B90A?) zHskv^TeofcGE;VBgL&+J%l?im+aHQf76N2-4ZT$9zSx#BN%->I*k}{D&9%L33-uQDlMxwp-F0 zzu^7ZLp8~7GzRI==v)g26}gtb5P#5v5ECNS(CT%GdpJRN&M z55cy?Rx0E`K8@FD$YGgDCu zVR#(VkqD8Y^0yJtR@viDp5=b<5M`t&At1BsfR{8d#9)2^!rEHqV3E3?HxS0q>I zrFqTLt;-3h&HlS=opMutv1|K~%Drhej_ZqM#CF*(-_52zgA)|asNq_W66txfm<)|BH-~0lm2G?7CiWugFo7R>s+O_QIKt+qo)#;BoKWr@TjHXTPjf$08rhnCt{J znEG$KZ%(ntd2AAI;`oLp!jae4Y~f8b;G`!=1P2?zJ% zQr43T=({iTM&t^LIg;P*PFy@(AGAmQD3vqN5m;zi_3AM=@J+)QS&J`p^qm}d>+Okm z+J8A?ij(Jv@W~yw4X=9C7C;btVLpWDZR1OjC>J@xzzB@xJO+S1AoqSOvnz5%!r{)J zBLIJrQ}^Kp0YDh!E9yr4F##cJDa&O@T2i)q^8(5Ux`YP$<*pf2tzj;K@TD(yCrn*H zF$7Qo-;0=jTYFBF@Bq2iuDf?zYxEE=ltcRj!L6$@ZlLeu$@9VT;U})efYRH@1d02u zW>nT<$@N`UqU*4R!o6T3gXYO~%6aeR_KxDQ z-`2(X%Uc_YLQ&Q5b!3-<)@*G_g1$=!Sy=7bP2p#456(dC~dlK~ZlL?lGhR4^ySgAA*7C!l(e%5*65~ zKvV`@o+Jjn*SY)nFii`W8&9Q~ ze8Fi)uvXi#%1N%AXVIR%x5tO+DM*!(#sI1APsejye)H2I8EoWhp6neNpD#>TriFQC z9P6ZoNkX- zDKaEst(kRgCU%+Qw;tG#;B|Z6RDrOzA@%$zd{BuDdF&&@6p?~{MnkzovWJ?-A!?{| z@ZoQ>GDJith@^)}Ynn z?4CR;-ynp%{9;pipQ;c28L80H6&k9Lx7_w%y?@Wj?y_1A<)KI4qmW=cl(?8)7e%E& z>g*m=$KPRLF}u&p-0Jy+nEm>+O_@9P5`89=({)vyeQG}54d^2mS2HxF6)p^Sy?%Yh z1KA(S{Y^3vCf#hmvA&c1cnF5E~6&Nv06rcqI^z^c%FTcI8onUv2MCKh# ze@!o?9YTuSjaU8J<=$xr!}?gZJtl33R`hkAT)3aHN$OFcGWpeOVqo%!C0+~B^dXp= z$1PfL)43qQjy236GXesF*fP0;uQ2Ec$)!S%TXgezEGCZ=2k1LPIZOd(6VWS9N8~s) z>%%mc=*DQgAFk`A(DzPvhf)Klsp9D0ce>5s46ocx>yi>>(gs<8$MSdW{>1w)(xV&Y>e(L_#AN ziRruotE~Qc^s2*jd~5nZNj!;`gS~H{UmHtG(*9tP2Hk`B3{~CUVBQH@6Hr0R`|(s2 zITqF_13`BwMvGK)Ii}+^XQe!IpE|+_=1fhX<#buyW>miwU)%M9NR0aA(~zepR(Q@Y z{^M7I(|-ufRnI@iaz#Lcv{!Rwy-ayvC z+q9eagdq5d!{I%itrz0%&I0*V4y=?Gakbv~A;iLL8Q%UQ>jC?t;>q|*4y0DAz$@sI zNMoVOpyb{Hw*t)%kdQjMo<79kVvfx zr>qYGFoK^*Hu3G5D6- zM1u3bau|E?cXI8Wj!z)~t*Ls;>L0JPs__6i;fwM}{_0RZqrc;WU^tA|Z(Z|^cG)nX zFlz)Qw!iwF&WNseiOOI$f9I(Vu|X#3!%Q2?S@12FJ2W)(<&N?|Rmaxl#l^;GI(wc> z@gC`L7!06UDo{=Ns-<6}|sjy0VGh*?W0~#DDt|armPWY66qE`L}o2KPn*z z)&Ko&I#u;aWl~U1Tq^%xwN#4fUvHf!8tv9zA9H`|XlqNvk%q&7ifrVSy#6|x>wTu| zU0nKldqo&x?bk#%kB`f|KtARlZ3vi}IDC_^1w#qkHph=6gGp=d*uVhyMMnv|He@t7Y%m4L{;vfG|>Pl+= zb@MdoyPGW=TBkMtx|xvd-ObUPiM@X>`k!{Q#nAY4L_%V|;6tUhN}jv5i`~R(6;b_S z5|aM16JWl8zaKSJB$L549q*iD@@9Z_GEz}E)*Y-8QRu_Vo6Cg1sW2|{CTKvSnWR=V zv<8#yF^8?ug*kg`J6Fk*s*~#HI=yvz zi$wbH(CfD`HZY&aFf@~;mZHX6A+-ldk#yEqFs7qnSvmUfaCO2_2X+4Z9{=-sA^`A)LmlWvix_1t< zZC*Stx^gUVp_PE+S3AvE8=2v7u~1_1hXE0W_@??wR@#dOw4JkMZ(m za}>bmF-D-9TbvD_X!iN=V-Mcv9zrYwPhHxep!^wt;1m%dg zCvIzvLtXqMsAeIsb9@4Xa$C&gqScYFAJgqFb~C{^7svH0^08YAOTBoF_wM~cOZG`m z??=FCxx`y@pnOBan~4{j`D^S^^3cM2igD?3u=uLtWQ=ksZmt4j%by0@?X~_>@@t!^ zRkS3Sa^FjaBttMPMmD+afKpj;_Y*Fu=ev?Ji)ZljpC7#Kvb0J$Pw@gN0+-7RYT8=Crnr%en|rk4Fwe%?MB9OLc%KhF&ze%YKPCqhMrJfKVY}Npd2rmxZ4uU{{Kf;d=YoAPUYoog<6QW7-#$ z7!rynP0{}+R_jJv6?w~UqV%5`M+t@v+Ui!IIeB*B(5zzcNlVUG@Kt6a|8@bXX0AmL zja<3$k6yi`K>^Qfs$dNKvfQn!;Hv>8L3A|j6bUdzIe1eX*U4IuX0rEudtnFHeV2tq zScX;OdPMGIuAxm+{b&y|mo( zit-MgbY!ualr?8HL-3Nz=X>m${VK8Rjw+#8m}C9eWSggvqez-kl?GeSwCOvRL_Rt; zb=XU;nRmUdz`)GKdoa+@S1$2p3Eh5JXJqqCtc^eh)#KxWE|a8XZze7t7eWT~e~&RTsr9Pd=Tx@0XtS~j}2vGg0WN135K+&J0O&l?a`au~PtlCqhQ(ys11*)+cf zhcE+^hm)4pV+Iw^3x`at78tL zcn9lgawt)zItNfzZ@hi;)FBAhaKW-Z8_fx@O+6ghSmiuGbHbh*z?^_ZNWXsK=bv@S&)zK3c@^@8ad_f|dZIl>Gp@p`G0m1pOHBvv& zt6y5{vg*L+aEO{bnmK`c7HKL zF&k>LDWA?k820k{|FbkfaMW_mljqtCsN}U`cGRo*YtjB|DdCi2!GS@h_Il!uF_+U`2{Z2D{SLG|T2{6xq8l{o)kRt8m1FE} zC7PRrMe3Vl6i0~H1&b0$NCua!nYfl?6>y`L)Q_!iviRo*4+h(Z=Dj$f8{4l){szfs z;9e~$5CwQu_$X$PAF0Qb+$_M!%^zFJzwsh^SgfIl_ccu_5i*gzJ;Lc^N83rR8gRFA zXB7IT&8WC7N*#3k#0)WC8!pVtzAy1ZRlVUKf+hQm`hkGGs=I+dOxZ}uNvLsI}2 zC)&s4U&a%N5NKn_duz_@hHFKC|1!o-v@4!s%3jj2s_Z9B^>brlEWezbAB}2_mxf-& z)+aflUNh8s+IwI7e;7Z;9jEst{{zLJ5DkEX<>vxUB0BDFt@P2}cSlUVy+bNSnG_2< zsgO|~>cm*H=U1<)(7OIO=vuZ;v2pYEe)p-v+B`Kt6(eJMm`8u~q@#q9JmQ;^Y()3{ zBua;OQ)?y|BKL;H%~#R-9{4FYQ>j#MJgbx5eumoO>`RvI?}_8q87IRzS_|)?kCXMz zAZ9HcIITRR}=cd25y6vbB)U zH<4%}sYyxiCq(}AP+PpUb_+@zz*svTfS-i^e&s+k<9jS!@z%k8{yc^_Dx4cV1eS=BKQ2<;{mJXDR@4l$%#ii;atHnrV41T#p`3sEhhma*MsxPq=(!7s=6d? zgq1mwqGlEB{DAezx7{au=}eMx*IeX1%o*a?0Yvhd2K|IJl+3Pk&W6~hVp_^HPSg-P zIi@Bl-c@x@nmcEZeE`o(vz1yb8chw8RV-^F^T77QfyVQaBX)C=j($zB=Ee~QAfyEV zYAGzKwKm|FD)_<(NLEDv(Lis4poi?K-IU!q!ZA*X>c%cW2 zkc)+DuIbGq*-vL+JgVJ$=QZ*%)QCq~IndC8m-BZI2u#e016a%g%ah<xz``CUs8yh zvYmC+IWe4nTMA25>o=^aX29>y{Hk&wk2wEo7{Q7?{L6D zB9R9lW3(OMR9AKSX-ND@?wR}GL!;g!3a>5oB|AY>rmBfj@rmP$U{;AWAHC&g{GaImo?qsOeT%A}CE8jL0q7?TkFb3B|txy;WRL#g72pCoTD z)#a-4efUO~FopD+O4PFq4|@}H7r()dcVoH?;1)N(*Hb8lbs^iuiV(9Y&7jC%K6gS~ zM#em&*Pm})4k}$sw`K4qVZVt$#TEQ1y;y&Xdaqi4YbB2de?#%_{0#Ih61g<_^L7Z$GFD7g&Pu50uW-PHtNMme=Touf4Yq8*rxl7 zyyMVN{81%wzm)u~^;z$H2UT00c?=%#e^`Wf5D=F4r_OgWB+>HkhdJ&UVBfz6z;GbF z`WFs?<=ONx0>5Glhw-)MQieU?K0!WDh0r`ax@m<7gxZg zsOg%X%6R>#M16x&3_F6~TYKkKy64fIF&oCEUfx-)hsxuDOs5aUuW_=S@spvQgKhQ* zVV~MJZ8S$UBLA~St?@u!s^%(y*D-FK`g;iRi~JFp_x8r^W<1^fDO7!+6TN@`8p2Sf z>{eA)O_ouk-X=N&K4eK<&u|MfWJhVTd1bsER73@HP1jk`7(*V#J9)t(aL)4iYu9;u zYqY4_)I^J;tMi%klmE!cJSkW7Qdr;?T^9LSzasQa(k9WJUrTM0ua0=l#06PD_DC@n zm|US-^>4(tH!=Mtn_OA{nQ0Cyd7Tq{N5>a%|1&JWp-r?5ttwVyF_QXT^ew!{aJdkX zHTau2cu#id2(F^(zBG<}noKgBM)<=f?X7SN+qNndCo8sX+qP}nHtVd~d%ye7@9t~uoQrd@Zsr=TO^h*n|2-XZ zOavcEIciFjgKr+Z{3fK=rY--zom<}2QB`nZ)n^|d(uIJJPtQ0*2I(!V+tquFM($$r zZSj2My$X=vj10CZv~>tEFo;c!JriWs3a0I#RaDKQ0I5P;FUQ|tgM-d!d8GNECGg42flgWgNM*qC4r?0akLT}YzHrt0~CV;wq@e{QJ%kFWNq@`v0 z&1qrA;E|a!Mqx+d@(OLdJ4`DCx{Q#Wa=NICm!|kTvxe!DBV0)NNA@}4eds-Lu{Z$b z=5cc}MxTnp%npPmb5vW8JbS%RLiY8^V{;SFj+IWox9?6`=o>Zg&)~VX4@`t}V8fH@ zteE#5FM|>6kHG^UuHE&4JsOBRD&8ee1RHfYZ<7bE2?CaSdYZsiU>nS9WX;N)R5bHQMTo$HU zS5=+YJ^f_sn)1r^ds~w4#fwLoEIYE=eub8YGrNy~{1NFvGwfrHyRUxs zPQ(*fP=SD5HE}_?o2h5kBUjG zKHh+4POR#KFn-S=#jqT9IH&H4w2m6^!&_^$|Ju)uU0mIW=z+!C-=UXad;GQ_qe)ax#-oBIZ}nWOC++()D$OlP#_h2Y*3f`=-cW` zD)OuoUjq7i2-7JcibUTW6}_P3Vs2hK6sC5gZrnODF z=cz#%U5!sw(KgV}h=1C?a^jmw{gs|E<1$XIo`hxZrHy@3PBAbcpHseCWhn0>DKS&3`Ca%SNU$Ru@o>JR3OKp#=M57z15*dV4vz=R$Ei+ z>GZ^|wHgZdcBW#qpcvtg(Bu3$F`<&X)&57BpzeB6k!9sfit z7DXjgYRJ`Jr$ruzUzD43)#)dGg9WjJi?%&4>YhXh>2hN@Y3sWfv>`lxxAGJCQr2^~ zpg#JU>sB>?UbUmDNFXC+W$Z_V^Z01a4TirhOYk+U(am{pkT$w&*?mE8K{+f#DE%x2 z)y@EhS*JPcdI>t2M;orDRKttkaK~XFV%^DJy!`-=GjWd9;OGk>5!}m-anD!M#xmh- zY9wRj=?#{K&K?QO)hnZAqBHZ7TNe{&BlS)l@(-+m%>$ONK$z=2k_W_WWB|5*{D>2| zdr2ib5N3M{KD)P0aoN`?aK_U& zmfuthX#lsZ_^5#{TiBkIOqn;1yHC?0apGmWET3RRVf4CPUtDMa#xB+Hs8p+8Qs|V~ zvY)Oaz^zZOPSK<3B5gDHJ_l)4ti7oIbsMpp#8XW0j5g{qCztMtjstocAHscAV);vSkU zlSuck;f!6ZD>RxqtEO*L$rt+5Wi9acB#Bny+=^hkFfJ}KdLuWxt`Ock9wWBA+&;3k zG#}K+8%+6WFcQsn`l{K%sqq5Nf2pORenJ+}jZ;>33pqqw6+xE$Ad+6QyWjE|{)J@o z?3nWfHr&b>Tt)cZ72dNuFo8ixIlf^wO)Fc^(6lYQRv+@?7~*ZHyu3EK-5B5GB0wQW z8^O{zJWqX3^*VQ~ng)P(9gf?%){rYZP)S> z@B&{>tKho9EgbCg&V=OI7nS%f_O(C^jTMnTvA17cVp6T~=s+J%pOIITZtkoqig z{HpX1!M;nX@BWiLzq0Xre_e~I((AhiDWRxxn7nA#>d&+iu-jaO2BUt98w#pqC6WaT0o1;H?;Sv=_lrj(lz4Z27 zCFuvJGn{C}jsEStCLJY=XdSeMU)RxZegnK6E0yg`H+y&V^cDA+_XPoWNQ)hfa4r3S zwt^GsY`C1hd0|pKs!lnmC77OH48Fex=@?s*UIN)pHRN4|;OZfIZ5ZlHT4xTXILk&1 ziO?F8jpZW~9nkn(anOO0IbNu$lIg1Gz}n8fZ5L?RH~?^;Z`*hZtC~H+KEvY+ zEeHYmax`MRR#vhd^-9gSRFFhS=gJ}7reyl`ZAP%7ZM(^DJNQUqab32T?|%(CBTWbF z*s1HYxZ0ILx8ot`Pp0sqzB(pQSaI6ruVY5Qp*OI`<2#`zA6n{rpE4T0-61}HUr}Uv z!}POjnq+IZw;sEz%(dN^3MU)^6IX~L+kUFB32z>^;9OZ|_;E%keye##n9Q8y7P-3R zY5$c}e+$k9`+JD@rs`qCU$u9aP4wL{q@y>rQY7?Xs+x^p7hY}4bF6|d!hM3C=WP*M zx75Qgx-{!ptJ!q=1n6^9ANzNBnd{?3>*|UWG2wBbisSAYG@G(_e{sIRPN?DJTerndt}_ z(PlBEw>WGv&!M$GoX~;)LCnEK)VzO?~BF^(96*8u~c)pURU}?X=(p z4=&nx_`V{k>2r=R6!b0WMI(1Sf(uEs+jMpjz+;Geq9-*` z12%=8Z&>24di|zSQxb`+QOMH?Sjr`y&Jc56q>sk&*#TSHP7ino4QTyaMAo!-L>iU`zG zti)+K?zk4~`#!I!5*^!7vG!bS$I$(=N(>=UR)ZWbsrpD_*U*J}K?1`5F-Z$E|)vKlsuf9#x!9;w$ zuetd5v?7tshYoQRxi7=5vLmzEswLr6#kbReNaJgyd)k=L^Rj1)91?e=ggG`9Wk$W7 zubS-{w=7cnpw9Ykib& zgCgP^fa~+1FL)@Fj~LPoI>bqzOBD~=jG>XW4rQb6?hSc7E@ImVUSbNHQGn8AY4S4l_}<@2oINV@LEoqsG$H>FlF=KXDx zQdi&GCF`*zk028Q3h_#X6jFopr1h1bbI|b$Av>E)VIj^Q*H>ObuB1F8%9o>M`|A|t z;BMwAS(_d;u0!MvPX#2h&OGKS@J11m&%s*60yvp7Vd6o*hLyf?ElVyEEQTC=rr#*& zlDCS%RxZ`PJJT=2tun6bafaW;)$5;W5r^zvAwUc?PotXEq%6v{re=>vCLzyz&_l`? zJcg^}%~y)}w2}bluJC}aqZketAqA|xWNi)VOxD|vo%-If@+@jJFXR;Z6s?+q7vkouD6b+>mImjz}=2`5N_VhzZ+H_Rn(XOQ?n4inV(gWrM>u=bj6V$AXYYgLbhHw`Q@i&mg zq%xamg-}U0C*1VA?qq-djbZdLxw-eOgL;yfL9qG#TC&Oec`)XZj_7r>g#gFqnsoAG zM>?Yd^to012Ij*EI`px( z66=--PW+zXB7>EVM(BGNhO7ZCDZ*WbkCa{uKc`G?=Du!og8?<&%_NDn+{p zy&%f*!P8wBbUW7{=!=5e4EXDLtcBj=Sn;Hv6OM*3J91Ht!I9htw`DYFjKq}L94X8_ zku3ejX-Li3C8_U01N2!+84-BD62}zo$ZMzD;t9vA<(W+1Fqz%=r+RjP3_|aVUlLCv zmyr_GE@ZWjrtASu+jwpk;>wGTC$f3o=GQ9Dggvy(sz21^BqvT?R>YUUqS7wJK{Ao3FwE=Sx>E3&1;qpK*@ZMZWU*J1`*vfS$q^~3&bY9h zI`MlB&B~?qaz+LFvcB;ObWC{l=-OKu#`@Ks_5Fmr@For^9Cc+09QB8s4fzbKOL7@# zuc5b-fg%JrDe)E@HwvX(vRSJjIT1YYXx+$YzCR0sFP47?d|-Bej)pA~N{v@x`~eSJ zLj=bo$$#W+@C&RD!4xHJ_R!4wSk2VV(i1wYH+K{j)XTRCx^O!$q`^v+tS}b@XRD*I z55IUvv-ZFm4W8<9QpF86z6wp(?-4uhhLR{fu?h}H3|pAFebtZWwY{TUCT?*xh%cO& z+xJ$iz$5?MY?Q^ql;A^fhu=F+9miN%sU#$qUTMk1G8W_dKA9v={nIzld$;2k7jgK% zYk)(IdLj#LvRhKuFMbl)uklI-%fW-uc>#Yv1Vnm z#-Q`c89?^jS?W!|<4E2JnM0-dR;3)+W`7~Fe|@ZKCx`Q?((#jsF0ex)dum3iqamY! za{D3Nz;A@Un}>%t;QMzJK;p|wb-tH6FO;USTxLTV-NlfW2Ta_p#y$z?ZHeKxCjz;P zZ3C59i6HgriWANx7i;JtAaQ|rqxU4I1w2(!)i`n zs21S|RmbcQMYqH?L{)8eayBt)5{gE*o*jmHVMM05Ge1=)=WKH-|MeM6O z2Kfnb^zSY@x!1Ndnvd?c2kGb}?sR(n{6rlWbvZNiWE=StLKkEDO%*(;r7+kb_4;wA zvr5Xacp>k_LEt{JBCPMu)JuFQFwvEl0@h2Bsbhgmk8YJ(UmU13&_VSV%66?MLwjCE zNr|tF8hz$(=WIMH)T;gdCmig&1q=G)%5m?v3Yq0oJUDYdDAj`ml5EhQl8};RcdKZg%U&e+G z{(ju=z|&h-A+?8^l{3Jj&yV-wLNuBJ!nTlcj%ic=yHma0$ZYXu+Kg{PZ zenRj-`rj%gff|(>ILKhVeQ(_FHn=$|cmbJ&^wi5BS;4gcpMOS1=AIdu;SAbPLxOT<9j?X!(b>6r&-*SNJ#C$jq zqPM5wMR>E>M(eZw)RoG%IW*rDA*9igh3|GzUrN7-uq1TV%H}Di6r;DQSylWn3%1Wt zN{YMqe0?#_MZOeWPb+Cg9v6Aw>CRYe$pdBrQQacm=XWt#D3Koqd+m}lywR}dLce|U z%zzqBKGUJisd~uOcW*|TGD}<0JhsegA;A?e;OXR=49H*@3^=s3*1)ttppl<%81zyy zh`)NHp#QqX`3hl`sJ!*7>LkzZ z80ASx17|Rmt%wjT4U@o8&`7am)!B!-p{Pl z@~T$>pZV7mLa9E3^>3nr&ez2vUEDMt74Q7HSc#NvB^u>wy;-s5N-rg|idcB5M5o+J zG&xKeJea#v1$#|baAQ_Y(Nk|<3}tCp#836oZu5_>w%|7WQx zTIRKYr732ws<#O%TIq(q=aeyF=SxE=6{ka(-S!NzM2Y;D-Pu!>HZP2>`Og~c=`C=v zFG|D?hC=T*85lO3*9(U@8ZPU-u1DZl7;k2sPv~#*s(u^WhaIWqcy84xYaz%h(EGFD z+W}m;^$Q4Gx4}?6I^yrht!C$5NubZI$^A2wrNV@=IJ_NjTwb35)q_g>u%?QJKQM z5SlzpMNF4cY~a1M)H47~2-h#WgAw!IU_C)ibuYv+m?4wuH{Bn*-IXc*?UOGOss3LQ z(*rhOE-p?&P4{wZBxo+`_QO^JpAcz%zg6F~ z8Ea)cbU&0Z&n*pX7zRYWp&;jNE`wZB1Rl^KFo;QR~B?|+R;$-)XY z*1|Ny9PsCB#GP8uS4u|g&MZ{q0b_jb@9^hmZc4$32uAsV19@>Q0x+U;9v4iDWek;; z?MW&uEuTe{sF8$z7%HJvoLx#^sGhT?-5N+Ra1L720%<5{07#xaUMkZ?2cn^k;{z47 z1MHdA-SjotApInX0-a&l=b92_tU|wQ^C8l0gaXx^6*n+u({1h&h`8i@PU!Fk;(<|zUjcwPOlh9;2S94FX;D3D3QHhX36$pH8~ zR5z~y?nIgVN(-(d-r~PBh~$?|T;M$E3hzD^AyfU?uJhtlbeSKF4v3KEiq)?+jS6gQ*MmV=o76xF zDI}B(B3sv4H48)MeOWWRfWw=O9)+$aNH)zGzj z#dzS%=47Bk+ui@gDzEnWhi6MBDD2Y2Sr2xuvuv*=ygyhU_Hezt&OK8u5>L1+_Iv<_ zLalK z65CJ9$)8NowA6z=*uI|;Hed7+>Ud$P&`Q9UAG%uNM9#mt0NKfQ2UoW=#@m5YU% zJu$y@_yC*zARX2WQ5F;Ch}H|k*sVRu)^yOOCU4+6Z{cAtTR){k;8|MH;b4Q5VfdF5 zYCeKAjtNP#=zB_smAb>EeYuH9s@xS3#@;g8iUf^i-U2Y2G{|X3#<5mX@F3)_EQWLN zku?4ltlN0RNr2Xxj~7)5XPoilvKb)k;rIK8{>l7?NUlKzEFHlw>)fxf+PhvCq?=)j zd3iq~B2f?l{!NTomOk=yo!x|C#7&o6YVa;KKR~m2rGq?0PTx>B+FK^*(ZpLQQHP6( z9}v>McXelZcQO)v6XFt`hkOn8sluU;Hio8&52;lwbWtzsoZB6{ga}g5x;+1PSH5fh zh@XtMLP@@hzQ#sTtJqGXuK%lLu1h3En&(Y&RSS$;Q;A3&_vYrBN?TZWyoW$`-b9gP zzys@&1{=TId*9ns_i|kjDS3W!7hL0T@1!)LIPg`eJS{eg4?C_C(keaeFM0K z8TibQZj{PjeD-+&C^&XLq#J&6B5nu+%qROwuRBU8u?`B>_}FC|4KLSNRDrPl6aA@M zQvGJkD;WVhpbnLB%wH;t+md#zyOTk2YQriyShxc+M*aaAOL{kVlA^+>j~FB1@E%=1DBzZ1;_|H{LzeC;ft<`r4xm)4%ESbA-w+y^ z+Zzj1V0pP3C*8n*C;zu=Jm4QtGLB}N=VINF)^O-xz5%Y>W>^(C#Y3QOI{PNa6G89; zv|&!BV2Ltes1_IpYGTG19G1bz7PZU zp7Hktcm@CP^1r|r^A8@Y1&r)~JjOrqSlss~DnL9N-4O3zV~BkXMftx14VANN*#9*q zhF|{MHwaPrB8X(De*iRS=(l7LmJ=l_6;Vh0Lnr<*0H|NYe4|m#1r7xMKBbs3cwU#7 zF&bqU(H|%E=aj?{VDh@e0qRk1|2Hlx3e?Q?hYZKs&{#@aU^x?>c87n<5GVzy!KF-G zoC=s?)F1}M(HQqd`qk(cJf%1^_+d8Bpmj!R0veLXW||q`*F)LLZ8IpLBBdSo^nbFu zj!AL2T2kJ}p-c&0)>!qxD&smFT5qY;pjJq&UOObsHATG?S?_V>}^>NLpF_E|=@U%W-w%7j8Zk%%te{LZlDoW7(;Ry#KFpOeysFZxXm zthfE~GtO%9#3gDXdhtvFiPE0owGDCtNqe zcjS|vwXIzHgFZ$p7x{H#2g7Hq=^V3r?1uyK%DC7S3^c#zRh2abqw`ynjk5czuW0~p zuHRJprjOnF?N*#)FBD1)aDg|4yCGpLJl|iZPS?x=vB)vM?2jlit)w;RcE5Qmj%LPW zt$ODbYodL&dnzELr*ysRbrJVlT0@r5Q0Ndg?<^nl+^%EC>-g_vP81OoskXT7U1lnu z4p;EX&a)h>D7!FSw!$d&kk+p*hjWSQTOCy>B2-j=MS5EjN;J`bZ><4ENqZ$gl|=|I z2R@MB;caP_nK1b&QEje}<}{4UesN=`FzdB(HAPDHpNn^^@lVLVX>Bv}9JjxQd*q&H z2=3J`cG>oT_p%;F&)R78S2x;l$&2)t$Mgbv;|`|9jDYCbB8XTFncQM;tm}128EUn@ z-4T={YvjR}rQSfs@V@FZ1YEQ18Row^E||Md5rDrmS3n;YF0;*>U3W5!@8Xg>6bII{ zmJ}feX7)@|({&`Kae;Rd7GdwOMTr%+BA9DIhN=0D)WOC$S$V+1@moZB|K77Zw$%uA z{>gGJEERIAHz*l*q6?R@tQ`>f75P_T8Be^7rm-i*^?GtND%O?nNBQUFwhye#n#8P)uI900 zBVp3(dP4e<352X4E4K1`6f*Uo{OjDP|Cybdw|-tZ2)V1r`p+5IxMd!LCLAXVXn&VF zjZ>VMPK2ZM4&j@uzE60)Le6R5{X|t;t=fIVkqUtL?j-UBD4OVQ-!?7RvWbYE%SKhC za>%Q|W|(7BduaCs){2*}wWkM<#&+nmi)TA9WRxeit|fXb{GYEfzZ6&qGT;`^h%DAz zoU)?FkG<`QDxKOh>3~f64e1kfyf2#2XAp<0GuzwfI_QYB3zzL&a`nB4B)dI@vRp>C$B< z@!)8<%Iq++sV3TpPDS1@9ouQ1f7n|u)Z{%Ti@DC+*0J4JHw~W$aKSs&ewiLcq&mL> zzuA9y9ntJb2vxFS;5B86?*ILt@NGcBNvA@pzPEm*qP;M%}0_B=2RAv&j;DJA-@+GvE1?&h6HCj$@pFJIOf%bx?%&+v(Mrg%tx z(Ud5hi-WP9|0EYX_o9l*?lxME2uTf#T~oP)=TDGFl#*`q_kU-?i_4nX#V39ty#&+n zq|k?j;Ak%T{z7UYa;t}0_mguh=0SL~W<5k@!$$V(aqk@+&bHJu0X_U|e=Xns!pYRmH9<`UnsOGM z0tJSUZjmN2t~`pP6Wn`?WxwMs!vH{(a&>bV&T!>lxAmLVR~QkNMup6u`ja8(3z}6W}9A0OpX-(Q8+T^otPY7Vkac@H#}5U@`Yqg_9)!^ z26j(HB~%7?)AKH5v=SCECEDM@==IPwCkLt!>C^Y%)#kbwSn`7U>=h7Ty^AQWS6^Z1 zOC7OFp?cDhmK!QDdB@tMX>cFddO&kZQA2Fwtp$$Hx?1Z{)A%rqXV)NDDMiE1b*HB)YY zz~Ba@CwaFm4qdI1u~6D0LJe>Kt%Ot}DOrIDjm1J38~2xsQr z2Rj$Fd5mR((`gj0PU|7!?*&(FlV&ooRI~@@Anh1exv6H1l;$CEMtJ;@Mdz`oA$K)R z*;0q-$vW5`Mm#qf!FjJ~>b3L557z(Nvwgtuyv8=m6`0KWjR*#SbJNZHlp0|+p)l09 zXb2osaG5CW>;FiprSnG>#@PIitQXJ~VPLo4iQ;lCZgmhcRz+!OF)f`f zIGRf4=E(vcRzsuKQ5*QE+ZUTqBlxJY;m6R8^k@PS>q>Etx>C8?+MrDa666~1z$^Ox zGGjdF93*T=^7L^Bq;|(H?L7eFnn!gx<`R~9Mxvv?rG0nNZ>hzQ-S8%J*oaZQWY0Jz zq8=)>oDie8f_r{RH&UMYa1BQj3e-Q`k+v<^VaBqW6a-20A?Xo5TmSXL%9r}(%`5Uj z|9GMHPfC3SnrZy=@VvnGCO_wu6D{I!VQ#6+p`R&3;K;~;9T#nfQa$e)BD^4|ti&Nm z8XwYsYTqd4FGFl@q~Y#S&Ho{N(f%lMC8v>||4`(9e-wExo+0gjC~}cMid-qZhW=l# zdkp`~A4NV>1eFZ)Z$+;5N0F;36;cELt;m`GD01c#frEcTfSB?hMXo$g0rMY<9PW=I z|Nk!wG(Z0rpB8@%GJt@KGrKjH_d`Z&_=@iKIo)h9a~`A2W*%@keVC-hAq__2-ZKMv z?#lEC8#_|?k|;?R8~Zn_eQ1C|e*p%KRa%dYX%H%?Q;4TBKs|?I%9Selh&~jDT<|4B z;nNi;=cfW;Kvm(vj6u&h2IaD!TG+^CPJDW{T?*b|p1(R_hfOPbMc`dTR@iSkV2~nc z4IxcpKY_>V9h@87O};X9PePT`ul+z_BdDwS-Q%z)OY%=tB=*hwgATj$I(!Xvvb}>C zvQ0j22o0>xnpCYxvk_K9w=R;XL0_I)#rs<>T?*2VqylZTWGNPsnrjQc)81>*P3*c} zakz_IG8G=%r3@khJROYqLpb7iNc_Kl2=j@3{P;H`+JhsL(9=FXns^Lm%7jg=Iuy$} ze6H8BX3EV$-}GCn!e>i{Gr73cZbdv$ZlDHeMwjI@ZC==z^ldFSt$7KVh648*(?%xp zMO0OCNnmWeNhCjTOcnkrO@})2;t37g+ZHTYY!ThvR&Tlh`4%o3i979{P+!qJjAKZg zq^_UK9?jd2pUThrs{rhg&tBofV@k$kajbga8Ffbf_oTEhUIZ2)EwCAUiFo^rA#s)T z9dT&g%HwW!TkMgW-rv%P$(5-u{C)M6pB>}T{J!h^oDg(xDnv_n;=(*k_7NHYTj2Qm zqk48JZ0Ew|AQ?J58bLr8F&9Ze|J1ke0I@9hy8@AfBSzC88Z+ka$w!vl0(C$&jgCnu zu}>dURtPCnmFYP(U{`ccx1e)Y%FuW0f8$-zG#2S)K0DJ4b|Njb#Zpgm+|;&vJg~UI z#E#;CrxL1ThZfNVOp=6+Lp#G$iLV@LnCY0YuuL{FR(*TQT!~1u)-nee9_-#5-I-Qn z36aSbq~!Vg&phY|5zV5Z>g@JWhgq&|PNkwZaH!ciQJ^2A`N}1x2R@{&O$EGh>*^6X zta)f-#QHdcC1}XsOLQ+O7hX_XOD#}m+H+M8$;Syfsr^D%KYQs>?IZ45FnGud+>12Jk3t9bH3&R&{R`R*#Xt)WSjBZ)Bq!9Ti_iYNW&!GW6!6H^+QF2ljWPxbe~U%SHYw|O z91;qv3Q5#dtQa}FOkz$~bllSHQR!Va&NMt3pSa^?MOsV9TNH{K{q^h&O0=2C-}nbJ zQCxK{pc=XT%K*oqfD}C}NHq1KCb1eg-(Uql>egLMl2hH{Uv@v??M3t&VzZ{Tjn+mn z9|4l4%-;k_zefK0XSLIJ&y1Km&U`b*g^1;HP;nM5udTE3_rS8&;Zz$4%rpBG-$wll z!jMUk7|6}_+#{w#?j!VXr7|KV1@?vp8R6!>(LYx7F~onK;#7wj!d%FLBD_0J08_5W zjlkso_7sSL_i?Y|&aVF!uVsr+1=<`A>N4lj4{E)LSRSr_Z?s&ui&*$Yt$K3lUn724 z`;#x%crP-T(Zzwgde;NnpD-gaq1m*5O3*K=I#~PxR*| zzbnR$<^6q=S0*5Zw>w!vm#p!(vDu0Q>A(SeIcdh&zl~{E<{!1lSK47{{r4sK^8M=i z?ce3v+VW``-tk~{VT$F5j#S_X{Fj=j0GPe6P2h(#(I`}pF? zD-n3ua-5zX^A=b>d>3h>qlV0_`*5FTER>5oou*C~(%1v*?)w)MUXvlo>QK1q6n0Dn z3AijKi!Fy4XbXl z3FN@VV*q(@q=~X!5Fr+96Z_d`s1}pA5aH{lk7M;AutF2e?$J0fBe5zcY-@gDeo zG2H#;%}F>SpL>zL3^$BP=>A+!hqMi~)0zXVxJaz>-CN%aQ!0FlUv>S)Jvs3N_(bcd za@WX>(oj#@ja*6&zk4AO(SMe%8yZ)*Y>)UYMoCBJ1UenDdQ!iipb?f+K0mFRZkD)- zWmCZD$#SszATuq7+<9%riWbs~I<+uN7=Lks;T0Et{eg_IeF2X>FupM&UU}$myf9ez z{LOe06KLjq-}^4&H{RLEBTxt#ef!-Tb>Mt@;}uzH@pnFzVqNE)<1)s60qnXhw6^T$ z`R{t%9NYn)3>NGL4snwu*-Umy_U|N%u0_gK%9#zPX#~PE9MpK*Ke_o(_*DDgJgVm2 z?d#w#_8{C7*E%6pG|T3RNnDr3ejeudMl@J4*-tJV_klu%?WFqt0BG+~Q6SU6*NneZ zFpZ_Lu`6*&?v6`g{>T*1+>8or zFJ!W@#C0UX+G^HwXLfDneqn#N=QwCyn0*UjoFM*7wK!GJtqH(U;eBsxgbhR5b{sj{ z9iliEccog0r64B$lJ-ntFrD};IUuLSEJk88kHLesX%@|?Wo(Z|9iD8&CMtd8XD0KB zm_elq3jT8t|q41_X^xbS|Z%V35A)W4J_|E>i{;>cMkd>oGc9i zhNH846SHzfPZV4-l~yRAgOk3iTN7s|oD+KD!BlO&;yZdzl zY_SX}uqim@2a5@;-CpjL!smU;=$=8VA&mzoX-V5Gd>1-vlYyjVS3t#pflHyO-@Bg( zi&+O1PzB@8HW(G4x0s~50PGD66_J*ZEZ?B;W{b04yF_@Q&MLpes811DR6eI zFJ;1JV2Q3i+hQ+gZ_&Q@kjz89iZ^m)Wk4Quz}lj3R7sBFKGyIQ)2>A|b=}4=i!Pfl zz29SqaJ^p^i>o2{y~a#8zZ0q;4j0)7;8ql$gS*SZXQISlg?54)2c)_{KC zix!xHfggWb>vy27Ah19@Rh^~?kEX!f%tL}5PhYMV$F=fA>fO!#tf@0*<(Txe|vQx=M1I z`u8tewmlu*&kV{XsV`b*C-b^WAvBt5t4TOEXuj2H?z}mZ2fxQ^M>c6HDI z1dVEIIqw2i zTONn77UhFAPj&_mI%?wWme49qgd-*R77?SqYKo&*KkL`cnM6IHCmR|GY^_B?)2nvw zqj|~8Sqx3MzN&71v+_k+3%yZWsD^01vek}bAh|fCq{ePF{N}Ympoz94-yU&oC^Zd# zCTSOGsr);l>kIE1wx2b^QKvltPs!f)DhdKvEn8n%6b5Vl=q~RYMUcngOY(3l6S=|z zu~25q4B01?70|Az)4uJSE1}%G_Z;u0pV0cd-aO4{ZY*uOZ<&PVNO|LDR>cdm6ol)X zl)xmQ0EIqCnH)W$wl1Hw$`5SM3ivW-_6Dk+4HM{2M8%DYi_3bXxlI|g!-%-rTX*@gyZa> z=Wk$1`w4v}V3BV6WL0@b*7XN0s<9LfYA+v?3>IP*VN7mvWOQoqA`k&>dR9VO2dSDn z6Lt1TlUIWiQuu`nyqbXQ%)cgeFaY=!OEY!(L`Et&M$txi8CI4O%VsZUtqhsWv%sQD zhNRQM7bMA6Z?BPs3$$Y##>}X7TsKNjsQgJd!XL0lg5JSYIE~Q(rq6CPAMg-KxIsoF zcLRz*%Cek|Wisj_WQH)PvcZ}KXh^!z(Vy-e)Id}~s4BT##&mbkQAtgbe|4!4WZ)6b zZn0{7amA#d*QqnvdW{?RDQ~!Zp;y2?fqWh%m;tItr7(sKpSsQ1ykea(Zof#3Goi>S zL=CkroD-208Nq8yl!rbN?M8~AIIn}tC_CijTEO7!5Buagg9QlVhNc_} z8U{!Q>aDHhkTv1iDpHDL@g5Q{3!OWRuE!sIIU$wMJv%QOfAb70_B3NHUGp2VX8k%? zj_byp4TI9KPAc30dQg)m!QD3%x_tM-`IA9CaLi6r)KD1>|Qvst>(tvPf#|`py zVZXi?o3&A_ch@WTm}3BG@=#|=A~VrE*15)p->lw<@`N(E($X?T`L23(t!kmSI=Ldr zwVj=hyC#57w?NL#S_TzN*ygKyx`G|Q(X#@r&OuUKw}~jdev(`yOZ3GOy^pinyun`W z2hI{p5+hO$*-8_sysOu;uN=`ihvzLt<}6y?%F{UYY=&UG9qm()VSz3!LoKC{@RdV` z=Lr9&bYL952iD;SMDAbDUB`Oyrk)ivg_F|xzZhvnzW^a4E54z(?7Z{@lCCVF^7X#4 zX&rTrN9vxx?M)~qbqC2X)F{U7>EG?o;q6jr9wWBfXc-6&XP&&gI$4Y;E(sN`vL&k$ zMuQPOp_hJ#)vdUN)6O3OC7U^@GZ((_^qXUBd7ge@3j}?<8svl zCy^5(nK-fRrXMh%vNyWd0(hg51sHBuG?@zd^lHAQC{YePhDv!%8C4!cFKXE`-UnT6 z5{cl4H`THE7Nku|<*kxNQskpGC6YX5t>3;~uKgu1Zfd6P$*a*Qd$n4QWv##(i$+HI zJ9*hvR%ScvK90v}VHVx*r@`7#Y8a}&66U|gUhHF%vRL&Mvu5;+kzobM%R$Z#aULQE z4I~J>E<>ioX@>UCO9BzCMU)Ehw}cj1URBpR=zU8y6owm^$xzXXg99itR699+mHdm@ zcy+5GAlo))Vz|RfY*qHOSa2v}wfj@0d^+I5(xrzfuw0@f>1NJMC9|*b{IMsxTvVVs zLd3Ze5!D2sJc_VlGi?Rt+8L22S=3=imUu$Dej?-`9b&3P%_0Pl%e_2&)+40Z7ThEg zjH0j-B$@gB!KoTh1N=VHGU2ZaKRVGl>*fV-mXz%4Su}a_a_9m zMQo~E3zUCTF%4|dNd6btYOLX8l=7=FR7SIbqGS{^WoCV5$+E5@&q%X<%4=QYEc3sD zBK5zG5RsOZ3TmS7=UVVdI6~|0e5#hG&5TJ6Tb19ehBT>^BHq_TffdGXCZm>vyk=?B zG0hDPzSUYpomG2YvUlTvNDRAcWbS_rWI+mC1<3xv1)kqn3LE5YIh)@0y4EL9w8W}) z#~2~D(V)(w@nXm&81!~nu&P>Sz2Z&^CzDFVQYG99=@N0TN~EXDOVNcdz6?vf{CCl| z_E<^N-aAsFsz=58#lI5NvT7^5VSVMo72d7wW=W%XmxH42x7-ethesY8ADeeFlShpD zIO)yXy?^(Nu3{f4nJ~KHysOH|rbY_loK8@WvKYxLg?e~U=9fI{Vw01Gl>QRY2Ooe} zz~N%iEl6MqVsptgMa|Tzvpa7Vt9>G7Tsb#VGZA9+YMF${bev-zuCymRh4#fW>;4gL z&;xPb8-S5dnPF`u9nhVbbeOFgM&xe}>wDdAgOV=gapS#$LV)T3V-cR9iUaXprCSse zR!Bz`#_eY{{{OJ|7EW+*OjTD`cio!4efsJ1oO@1dpaYHuTKN`&MXHe^5EJX{^P03iP;x-B zM!?}56Fat-D&@^9WIB!Q@*p4^l}2VvaqR}RD7=@KeeY-J@!dL}R-@(4EsOb@90vgp zw?)h!ACqX8CrzlVyXbgXjL`jc?@B^HM9j%nb(3kySs3z@{?qH?R3W>+N6Ob{JvIeMf2y)S^Oo2b7Z%1` z{QbV~dVRZ8f=RaP^|HQ47OIBna?i!6BFazSU0z`~Rh26V0941He!73q&BR3FS2ERb zg3q*b%V9@EMaKTAAAA|7WInEOugv|k$-tcI#XLACr-Q{rhjq$xifc{zn;L(=`60ns z_@UXVEf+>pHe(Ia)(6M~M@zireVDwCq+4J3)O7R4QpkS6EA0W|{yi$Vv=3bVb;>Bi zV?ffx9oZt#S<}krkI3&>=S}hnhu$x87+ggi%PXYbgW69T-OsedlJuMsh_S(p*_s-3 zt3>ZMn5WutoKb_k*T}P~QTiW?p#)#*uRsjxe@(O0r_98i1h9LL zG$MW)A;mvm!0ebIBBw(r#65rJ-zXE3+7s2^ zd-!_6$=m-NkED6McxKV2k+BF|HYp=Fy|1npIGz6ui=O_qLu97@J&`PR%XJM&0y04@ zUA^Ib@6`Q1m~KWveLiokJE~#a)g#^-RUtZd?bZTG-nT4xluLc2wNWM5VJ) z)pu&T0RsdSJKZlz&wN#_z2g->Q=IxjC&u&Zt-=TeY%Zc`etQyB?r@~xzHG%*O zJ;7YT!7?rzXNu2JWBd$n%3?m%G4FH*{*0VV)lx1og$b+p8ohK0ciILt-SnCu@QhGt zlVS`@PZz>t*oP-meC;sx{(JkIFY*>$t}7PYlWxofxl|cK&!ybfGc-Q!vGBq9-vOe5 zriLCwyUoZ-M*a4yUzUhsB@jo1_mZYIa*6V0!}VrKGw0XA)CPrcw*xWN3R3wVmCkFc zsgf~QFU+ib-g4>>Rn#8%G|3;)zi`ljEJQS!%vh*`A%&z(Oic}Z|GtoZp2z6~M3k3p zFEJ?-UH%>9=g8Vu^r4#GuX__wJlR`^;89LyTE0Yz*j9vJ}St#GG;Dkm0 zm}3f-z!o0h^2TCtfucJ5&05aMz=VP1&T>Jg(nn{t=L!=lZI{sqkG1M%53OcC6Ca59 zda4p%*k!g`Wm4pa$DViMiq={kMOf@8D3C15gZkUUWC-F7)^VpEY9mT;8~Jf2MDZ_x zy4{B2g#T5Bo3niAunT+g{)b79W@OveIUm+S$)SM()ak#uLJ6Xr(mB!s&5eH3WX);w z9DK^F{oeik*NpTXMV18bpcw5?)~@@v`ra#S$4)i%?j3ykXk@|JBAlB^59wC}4`17V z?J;I^x~OQIwq6X&Sw{ga?8L^Wgm;X8TcJGYw-I+s=%-UsfP$zvTXx_e^*xM8H6X*I zi|x2Xcjr=-q3{&C4!f=m^kEJGA=QVzcb?o^99nw$C%1zlP^s8-O2X}Yq4}Z@jP5ZI zBJb{Jg;-x$Z3t(*SDquT>V9q6nQ;(c9Ep$=Xfg_Y5VIR~hbKaI18SmEP0_rm9EFDS zgwc@>0igf2ZgFk5t z9y6@66_|%3c`BU6`+dPpc*4L9%~drrbQj1N#N1QwN3qU>1KAV27;v5_pyC{XH z32P2^LPo|Z==cfn!fVb~qh2|a5$NbsX)c+^^ zM?BRmIzR>=Fa}e&`JBoao1UQu)vX!nJ?Yr@-kMl_5~&f^AbhqZ9L1?H5uEto?@+%t zqPWa>t@IOWgGgU+x0?W6ZBa%6#B~xXhLtgP;+rm6HCbkYp~=F!C(@f0P>(tp*{}|` zNlviGz`3-nXqz@2?jQsoc*j}#szS=nCKaeS&DU&9U)}6;Gtrj5eP{Zurex;_BW2O+ zC7ghXXa`v=LRuJ(tpBAm;C~*r!d>b7uM%#^&NQF3N5A@0OVuHbv5DFzu6(-BPB%kZ zaD2zHTg=qsQ|3Gz)vD^!`U^QxpeG))%kM@5<04qOhXxjVBeOEv8lI|X_v3iL z;>9Qw0;}0r5a%vZs8ddBN1b!~LT`5yrw~Qc&SnjP0Ph50af2l zYVSIlSh33+Zg9Rn+EvrWDA>18n}A3TJFyzh95~ngOie6xb{Xz$be|a!_phE$yy{M8 zTQLI*b15^&lQOe8&?4U1#Tr@c-vJ)Ay4|!neHT8~iV*NiZHft>{?^t>u~>aXY5#;yLxT;? z#X-IfkDjX=Kznhu)HcGB3`O?Am)%=MKqGitu}L-KJENpJxfw*+`QfYr$a}zyjqj95 zTQ!((mmG+Bm_4TK;$6gQeh0qryt<-pHXo9)97lhopJvCQJLRX2>Bx(Ubt&w9is>8N z=2))UGJB#Ibo5D^zrhtUa%i$ryP&Ho%jGiyS;|Bgc|Ht2D+({dl*6*{-ZZurR9+Cb_qKMQeYZMiD(L)%s{kC$z&5=8H$To-V$+ z=UH@?c4SO&7N6uYcPxbcknZmBh}6r*+M7PCS?0jF@;7X%!&4ALILcXVy)nPV%+#B@ zilGA07ucq*vd$Vy96Ft5cl)#MXD?FO?EBEA=huX<#hQFe zNg`52=rq18LPnN2)L$)}>KpE%v;w}2!dK|02x)ri{L?)_+)C#y{@TjT_d?i?f|B(Ew}@_6gb z;#78N$wIe#iaKH+>{4Ei?J>BR=4a)CiYuK1%vPj!bwueISfd+8LT}(7kQW!ky}v?O zxyxSRu$S_ZNO5uuB^h@5evt%cNfGb)-UtLOmEkal#IHad^2fbFSj}@0CKz3&xtWXO z>4u=Ft;I30L}p>-<&ZrL&*!9JNO4Z6*4uk63OIM?Gourhq+R;XliHmksbX#9ysowB z!V>R+EDM|(MuOC^L;~=T%AL<(b>^G|LICf8Klqe(v&U^fqBzZyNzB_fcksz<;Ru?w zQXh@|lx)&xzoe+2ITxv$Kk2nWbwbS)zJvXQlP(XJ1Gy%HCt}v%fmlw$Mp?I!n%xMv}-bI zFdm|h4SddYG<2_eUx&l&GwhYi$dfTwU#q>2y6COPFh84!^$tqt z!d*1*OLfF)f;@x}yB0n7z#}v*b^M+97CFGfdXWy`8isUm(ctV;4iEd;0k4D($1@Te z;HQp=80y(C9c7Z#5*x+ixOHZ)7t73IYz8N3Z+0x>d5;l?OgX9`QVu=Vvre?_ zBLVu{cNS*6=Fb$8gA*U-zjgL+2HbK!=;AJZTJ8aRB&KLSMQt=R9q?X!D)GmnM>H^R zM0^?Mk^DEDyy5PM$6Vr-6J7X@=*8Rj!s|NK;39+f{Dud0Y;h!17}<-5%9rA)NchaS zPN_%JTVe%Lw`;MKk znjhV9Nqh+X1k9E3rk}gp7_V+QYeYs9{`%CL0RwtGO;8)xt0QR^^a|VyVm}K{;d%=C z)EyHaBUeq9?sxA}QwHbQ3jXPqn3BN0z(=QOmANDw*w=ybp#h7*?*rylD6 z6FFSQd~iL1;`lsV@U#${;W&rC4(qf%gcpOOxck|sr4!Lm%`e<^e~q&{6Xk8zINcaT zdrJLC8nNFP`*rx|q5k6pQmLN}Au`ch{~3E3NDszWgs(?Bs<$o=0EUGklm;GVN%$pa z>}H!kz;-VXUGJFv;M-p$Q9NIUhq;SvGh*$bO+$zzz=s{qjEofynZN&N;atP+%t&J* z(hG$)Si^zOj1^<+W%-Y~f6GUa8^ZjVdY|& zU;lY-0l;^9?VC{z=*ua^0PqT4s79(8FlJyo&7G~WbCraBxLV_jJ~iiAm}{dnj(9u& zV4-dYuG4oT3F+Nq%yT@UOU?N5x%cN-7@GKy$gzU`1r;wTStY+Ef-mp;u0I>eBbR(_ z*zU|>Vsxy*>#l!63X{xCIHq*n*nz8SU zIVwyUDmbP)h%JSr&!bw0sL3pCfUqt ziji0;<`-0Na&5$|`BlWmq9oxW-cg>UH2Hzt=)dh&fjtA2;%F{l3k zG$56{@_%Vftd&Pjsh0HyKB){;xggkFgOF6d*GYeKH!(*u-c8V(4j;jtLgcGVHv|0+ zk~Q#KZ{Ss8wi`MV=8*kZsD@~vH?RPE$3B(_<4+6T4Y39US>47g{1uTPzwqw- z_D;>S$-Hg;+s`}y7`4YajnILkK78&ec20=G9^4T8q8lk9!#kE=6cgO7t>pK8&52_P z7&#vLb5r+H#|$;0P|^K)=}^byx)~Q?Vic6%5JW4_oS@TyMlH$m4~jbjBwPQZ1vqFN zZsbj&kxB@$(_BowqDz^Qj{7SG>h@t@W^jd#N=vsKGBd5CJWD>C%=PMUfA4fDW!WaE`Atxl~wy&}j+!S22-S(4f6L`bHeWl!pX>dKfCbQ|ur z1~LS>LWFIMD^VWVX;m(Efv@zZj^#gzf)j&%Kiz#&T~Uk7{*Fk)gCiEOCv$2l%z>W+wZFX1^41g{0mPeR=BsG8pwM0XC?)IOq%Ju zHPPM2&H;HfhLrw^to$?S9(QH#n_|TB$SmF?g>j*z{Oi%f^sqeherJ1JO{TBzxWz*x z7Po`-`+kAbp@|}7Ta{eFCsbGo_Y4vFXK*^CnE4|o6Z@g#IhODHm2W+3uq@77kyP{; zw%?ge_Qi6w0|Mm7>rl~&w~wZV8)1(UaK4SJ<<_^+U8=c^xe%K0)(@2Fj^c1y+`7N* zK5oHm?j;eb2TkF=O-2d$jqP$s5dp^# zfEM9daHJEG=&pvGNa3Y^*EbkqhBnME#;Y(KsU`G4YvMw7^_UvG-l9r!^^UV6+ z4sWiVPk~bM88_n}^8Dx!egOO%5LLrYrL2g8oilL&Uta2b2Ao+%T`+TXYzvNAV?-&m z#Fm=2cH+>7iyx&-TZiDO{wWnoi1`Xs69q9-FT4wpW>1m0CLnH%uADRGnUI{arGrlA zbg}4S?mxrhj=Q(qQl^|0o0ZKq658u=NYz$sxx*UZ3z&!8gTRBVq!<2?FR4PHttW>% zM><*;!g#o_oSz8SqbtsFF~(^QpYT|+(|QDK7$U)~UXI@gi=csQQ<$Ypu7%D5DfpTQ3jn>iG30dx{#&y0QPI*DmkK~4 zoEV}>#wFa{sJ7-c6vXR{0;^+U#@pYR@dP4}Usom_d5s67-@;6e;lGH=NRn;^Xnw5jWoj@k35=s?Oz+}?-lto_7QNLs&gc_@4&t532~51cG3c8G zT7E?@r1+B5j~R(D2oNj!4nTd68bUTaOkQ#DM?{xN%m7zb}T znLBHS2^O)IPWG^)T_vrjJ^l+rQGkfBFZFkvFl2YZBHfJ_qM)T;SsU8Jg#z5A*rF%A zk@@cARe_2ydW(urA=KCIX@xP#ETlq=nJXxI*EJ0KS}(j_4ro-f2}Y`PE= z{XT;`ys=k>U>)cHfXYJOvz-}bntr9&49NV(wq;|@i;0p{jdNaZuj+)UE_N7CvJVq1iA=f9g25D*<6n$J)8^ zOEg2)cu&R2hnEa4EUM#$K9&wF+sxmgv&+3@%u%vL9=N-=?_3C>9BlnrbW|z7;*A*( zk-!NJqIqgYEFB~s#8&$}_@@e`q|+%bzr?5`JO|sabC6=6A|zExO?_u>=~xqymgwD8 zZw7n+l1z(%=-1W9Hj1uXLYmDWN0M`x%i&6D*9G_36my?*ltJnt)#YS}n-QY{KQmW^ zE#~{Yn9oWC0pSUe8j|E1OeSrCbJMTSeA3@fH61~Z%98nT#rtocKVG3)sIu}F3fBl1 zo}`pd5X&uOPj#@J#e36HT_5lZ8?KPGH5m##CZ5gCNm0AQtLBf{*ePzl2Pefx|C9}` zn=X$O;%0<4AI-cJ%Sl-@iiZ}oWyMo^A9yWZS=(VhOEH=kq(Ol}#FPEdKdtw?wb3JW zl63MtwiL-T3AspW;~WW1<1}O?<61)=A(`Bl8ABI>it{tvhg71j+9srP+8ekL_Fd8N zp^790LtRI(^TR~NJkA0_+vWq$=a&|HbQ*KHu!L4cm{9V|X_LANCom<87-@Mc!L7;} zC?=OBB2{TGX9V2S0*c;}5;Zsbx8S^d5?f1W+n15FQB`kG88C$eQ#h*oQZyhTcAYNM z8K0&P^u)4_#!(t20NfVo0y>j9=`ZVTwW7w2#|^0!vY7=QaU>*97!0?5gkcbD)&(jm zSSEEWcTW&0?N(LhzoIg8sJSzS?aTSVNSPJO5%H4I`T`9>c1uhGN;0)ScJKOOaA8Sp z0?9tQ+DR!ytR>$N83vKr`YX3f&%EiHHzHq3-$*m(@l^+xec6)20;oU= z_XJl(9imZMB{%0(Fj_}k8^tP=$ z!g(9UtSrS+mdyciNY6zPb1%(G!eFc^gR^~-| ze&XT_<5Ea+@k{xw5ule6&phiJAGNwFoL~DM?qhua%f1c1++o0gmIi?=)4D&7Vx8)G z^$D;221nW*(fehSa|O&zNUtljM%_{M4)~FKgG?Ce~b2Kw*@!4jCDtz#nB=)!knuL3j+Ff%#PX>UK98 zKMl=-Bt7*CO%bS8c7k``}B5N|_6!b0gag3vB*Tg1gUxA@c)=N3_UbHx`jM zhTwcP_Yc%eu_azalxdoh=|76%SyI}XlAxStg>p*{RAgft{>+!)l5!+d6yH1b?~TYi zHOu_hITKptcVTsTEWl~m-T;H5Kl__63_drDjR9$T*j#Hl+>qMQmq&tT&}&Ru`W!h( zwVGH!?158D38WXYz{VdM}-%&tY!I?q!Nj zCoVS%_GYXWO236_1DP1|5pp^v}Rlx3+xK}53*K}R@1%HTt?Eo*BW zYjBq$;)wTLylvx7!Sj0)qg3?+rG{=bM#%o)mh2cA-FvT$fIs+cfcol6@k9sw!0b3zL|qad zA5vNu@S`orlpao&i1{$Pc0s6$a6Sl2L{=UN9~usBh0UB2s_d^m*g6&$0(uX(#oHN| z-_^9im*pOj-k~bkE&l3M$CP!O93#0K>@aVH)U@#Wnt0){assbAtm*CbRLO&huvK_@ zw*C>!n}f2e(@T4l^z&K!@Axb+g2S!{Xt0TA&a0BzEt1>LOjf zvre*=KGANN2iM7+5@-Ygr!%Jkui;WWR_e`C$0ZPnoYnv$x}kerdI+B zplx$orcTCtdMi|f1-Qf$QzyulJh_NC`i;~tug_jCi;sDZx|@qTIH1`nR{;6xhE!l) zmW9$~3l6%Edo0W1`ziS{-@VcMAR>=bhQovmPGWBnVkp+e_TPuazp6Zlhty)``;OUq z6(l6*nn5bLg?6#9okj{= z(if<=K)Eo0R$NJASEe^q!w3rasA#mpLD`N{s|R-B2Sj>wC)74!+%!go3*keHo|$PV zJYmJ~5}?MR%3W;j3whERVySs4B~_+ayK)gg!KD+}pOa3#-nk%_YL9zerp!Fz+?+Y6 zD5c~e-B}dcz*$2DYzqa!B$f7UKUg2gj|s5HPys>;82TB@w6Mg*6sD|uSbgl;H~}og zYj3{_4_M&+(|($$nxREdmT|<*2f55yPWvbBVGUN>2fIY6%kZ2IbB?k&qqyKaQR!o= zN@P?#F_j^WjPRk3_L4nqD7=YpZLuJ2sCS=;~V$N zhV3}!K(0T@6ui)aG5tRUBaebe{!uJ?Nko2RKZ-I>O~TdS7B;~FSmE<<;nWkH&j{+2 zKhVHvu}L4k;WZrj7#|;{GT!?>2GkOJ;beMNBq_yf)ax6C7_U+uNug)iJ7WDwR6oWX z7$9l_`x;?1HS|iqSLP_Sf&jDA7L!}+2zp%%)=&NS z@&3@XG!fdNnbudT?XyP6#QImdqHLY6`h*XPeNvXI<|9Aw17TV=&CB+2^G_VEAf~I- zZvBA~N&Jv}&?~e`>lojXdA%1?tq;g6Y(B-1(g@ zho}Ew1hO8jxdE_sG8a>_tB6$%YT@v05qfWa{0FnrShBgQAjG57h3-4+A+UIda<)8A z=h^AjUW^5BYbr|)RquU4!x25|lbGR~4_gqhohF9uT;90YRXNaJHgbEdCQf$VyOHG4 z>w*`ekutPwrSA&h!i*60mLEe)7?yqi1$^K|qk$w;SP1_07{1nFbJ4`Y#dD%+WI25J zrQ&YS>Tx?iTm>L877!M85wf{bI1++)*Oi@=+ujVYW@Q#OK;-V%DRUQgAsiiV&~M>F zBO^4*6D4}0K^{j*#;qIcNAA>iGObBu`r}SurdPK1rPho@XJUreAuMLl?Bb@LMiyf= zgzK1MYbTG(%gc?%kXFf_bdUH8^Js&kYm-W5e_}|tM*1wHaXv~tgVhig`W_I zC}%6w#%!1>bgEve0ZWn6yg$U1>aGbSx&Y>0i-L~`qB%i`v;vKkg$Z1L*nUmcLw`PV zdA+@hDz)q@Q=$h$-6X?~{f7I^q4}Vh+``ao(49%isj_t(k>QDf#$FW-!y7X~xl5di z10NeeN7!e&8^X=r8D|wK(ga%m05d!Tw(eKyU_;kP&sR5RpiPIpVD-(4msj~)*S`pce`Mb;&Kgy6R71_T z*{fWJ3jUUP$cYO)(T!OQ|3<%=?cUAE9(dU5Yn<#;rJ=NGVwq&YQ zw^XbMyA$UXDs)laz$29(|udA9*tk} z!iGQQt+Vnf(*heSjdyRMBbKC5IQbfbD7wo;J(&CG*)Ilhb4>Wt^E#f}P$r(>(!Zqf;39HQGNn}Hu%Xpqt{ZR4ww%1=;@a8#WmEC66p9cI*_rQr<3&O504P7|UndchpG(bBhVO!xhV z!+Q{8$b+t3eP6X)_5UAM?;CUs5vy5IBqRT2`NS`g>Uz|Lvs_{`{}1bjJRjYa$V2J^xp0t&i}&22ssok>LZ1|r2ZFC z#N+9EU})sB(uIcqi(Sxe1N0#BGe4dGL6lEFKA?h09Zb$h|BGGF#trl!-mQ zr0@$@bkmowh7%}gn3+*FH#brKN;x{pBBwBFz%Vm2m+3>O6T-og<3s0=&U$RoFNV^T zh34uS&IEZD)+WvF7CLK9yAf{_tcIIiS1>>Xidty)(=L3aW7MoZyGjQmv3!`+JtiISZCP3pF zon2q3E_1+fwacHR+VGd=4g0reZuy?sS?y}i(ge>8Vg1+j(7Kz3shVh#iXHz40Fq~Fh? z7fk}wIdVVq{pTciwY&QyT<{Uy{o=H=v?FS<_<3|8N*!lzhcJb93pFTHxQ=GJSONhr zE!x4o=2R?&UCU5>B$&-Y>pMsaJSu$a^|7?9^1#;PtNPyHJm9XcC*- z_nft7-Bueym4Z(Lr#&>0L+@`}pAKUF-QNa{iPD7SHi>Vt9;8=sX27RESe1Tf0{Wdk zZzv;Vf41CxI5&@#)GFl^Ovr#b)g9+AiX9AnZuhZUj$=u+$VbY7TdTj#h8CVr>E zA5D1K{Xf~WNZ_*eXJFtuF=@L8#d(y4K{ow?pe=m~+En z%4D;q@FPne+3O)(HC#r|Ucm1Sx&Bi(HF__{hD{%v%%G--4@eq<+4|Do?}9;a{w?_5 zHRBGO&PVqZj2`VQPV3TFD+k53e2(_^{GHxE56)x4$+$a4RW@1}T2At^+SWZ9VNSeb z0^P}bjC12emwjaEdhoWX#69*yC;~S%5yC`bN(fy$AM~XDM+-m{v&%+I<$NS1;Len^ z^_;vne$z2~4} zM-bbx=3pbk7HZFrX!!W@Cn5NNsH6z&_n4wU{`G<~c>33gZezPA{&wTX+C!Zwk#BT4 zwRQ=MlTH^~y}Ty|pwQp>*&BWqY|ABud2qqgQ43jMgl{``qXq$PM=^@eXwH)ktUPb1<3g_L4cR2ho5vts|2Ht7^VUfWM8H}DaOg2-UR1y0DS)vEp! zyrs~5-N}pNP3_Ho0xWGN-bQ4Ee^cS7F-t%@|B@5u=g}Sm(J=7wBQ>}FuDEMeM=oBWv@mW=8*SQVXg`83_=KM>q90y#} z{xs%)9y}quv{gG}_i>@I?T{ZW_3;Oq7Ex#)PlLWd_&>07pV)nHnH2UiMyv>iV0 zqgPl8T#a^goAv1OCEv46`WWuSEs@$8fz$z%cu_CfevPKG=4_zk^Qo50D(Klq-JUjk zKwMl~jI1fv%8rDS<*#mL&JIvqF|H&(Dhs9L`< zIS05#Ah z!r(<{jcch-lz32hbHFO`uNAIwDXle<&1T-mYYvc(c z4Acsk9b%$L=q30AO<5$S;t20Mq6Fw{>*mwdum?FY7DZZCWllEXhzq6SI{EI60V!$D`D1KRxM;Z&nhq~4OKCAH0BJ4v^RXi6n4<`w$)Rf?C z3Z|JU3?4GLVQS3`ye`LVzV_&FV4^CV`0mH?xH@RYJ*4yZE7b|3A`Q@SMZ9#-8|~^Y z!o51BULtBuK3#HGa_jU|5VQRc@_z($e}NZuYo2rS)*J zr>~A_KiU`d=>198atMtm9WH`cIFwMz4}l-dIFE}gL<6~Diz_Ys1(E!Xs>&~w&v^wC zkNE^wdWc*1;zrq*I$mJ&{-|%hg8YMew%D`Vco6&qTgN5<(>gzwuPM3uuSi)evpHQK z^Z@oxD4Yx2^nz6IR-E$pzLIEZOdFcnBkujH_vY7_>OSGt4Jj zSg)>PW|zY3XTx4rr16F<{2j`Hv4JVNYmegywg zPrZjF=38eug5PL%;OvJc`xA|76Z3R2EgN+EyYzH+N@o=v?6yAB*r6%5!tb8ZK#P;{ zn)I*GbV~BVx#!LOwEIQ-AAj0s$Ju}mjo9-|6ruh?I>O7Q@n_?TX8ose)jmg)f_O~DNgBclni$Z#=&3x4>dVrjqkEgxz0*J9mJ50-O*g|dcmP9UJ zKiE#l_graZO({LI#mDmwKB)agD(X(hgOj!JKdFJ>n8?ZI2}4%r+lh3KbNW>btvW4r z(EG1XB&N28sMDPI+@-4<{4X*F^n8>!HjU!)f3098u)h-kV8$EzNz9C2P*x2S5w(cH zvLV}S_WY?mSL@UVyq+O{i!uRA5F+Ba>Ils~GJ3%+7b_EUz-Rvc#Lrq&Wh1C36gFYu zM?x;X3R*k<&6sOP6H=y;q55mh7$|aL5evyM)&||Iss?2R&819t#_Jf|zgGt?;Q#)D zHUZk&>jF)L%EH^t755V#ED3`g=w)0SrI}dEj>7E@y@B%D#FZR!>oxE$+a@CRpV~i` z{7`TjnuPoXcDfP{&7(Qv)5p%1swv%qiU6nu`--k}q9C;QtiNT{E@N0LzG`v1E#Itp znD^-<-Y7LNlMl;)$TWx8$b4o^H~OZ=Xv zjp_q&Sp5r7is&5CxoT3oiJOScD}8Ft9~XOd>EkLA;MZ$bmD>n2<#uMQ7TeroI7MB$-}Nz75Pz()x|b}t|G7#?U>!)**A}$ zU9}AE@IIDdC^Z{S1#^@fJh7yN1^A@^>YxeM`0&r<88j%aRW-c`E*S!fG!4UGi^8mxPix$@TKAVeDWeQr$D4ua zagu4s4d#PBf8^4z4ARo#$MXfEyv^dbi**N#>W*oz?Ldluc5`y!elus$`m6OeaLJYQ zi|uyw%iq<#efKd$b!==FKK3K5~HI!V6EMd^_^V^}Wx^mNy5&YV^rosmY&dn>@17(fD%dDoU zR&GM{XK7Q1sc$^_h5ex=S!_y(_4u)Ru0BM^=y>@+G0x@^6n2znjPRC@ZHSuFj zNRNQ)9vE65o3VbkaWY&8dh4|DQi4&xN(u)#Y5AEvBajG14NeK+#HIeZDQQ-@mi8Uk zJjk0_T)JaYMN`=PQsjgP@;DV$U&eelbsGI&C{$0ejAof{8tPEwsaV*HUtt&Kz^65=~WsX`J`Tcc#W8)|3pxayr|>M&8OQF#do!Jj;C56 z!(v*ua3Iv`81m$M^Gm{b|M-$_E2&%QiZtQTU4ys*Tk%E;I6z!Wf zo#bra1MMu4!L1Y#<{-vS_g%p6Mb3OfAU8AMZhIs^FfYF|Y@EH1)VaU_;LHDKYTJJA zX;Fcp*$vHI&)Daa9G>?E{vJn7)>2{a{v!`lXcc~H?YdvD57O6@`==Iv$#yNhB>6MoRm?66#YUVVkwqFFvd*H$<>42||$W#ezm(hbX-^(7oci zVH;*}olDIO%4psBsSq?0*&xhcY3A(hdRcAJTYsz+eOfEer>je%XHS4w4Cc0iWy`y) z@^otk&OcNx);{R>6E|aG1mDZ^vR3)PhWw@_rv)nWH0RGxQ?+o;AmqyZ92m_+r}{Bz z@w43vp#>#*aH+wn7zK=H9?VWs-$8do%F{=7p8354iDA)~5rwQR_EWS{RI|Npezq1V zbK0AK=zxE0*z(A=Geg44D{O;l`#Qda>GVUU(8t{JF7@V6CrH{=p#Rz|tZk&q#ofbq zv^yiNvF%Wukx&|Kv5!5&2vJD4b_NN+zS~&r|VR16)yPc%c3T>_#>H-_c9W3s= z=?n+Nh7aKzHoUGdOah{%&W!(Eus3r4O(ZP74^L#|Y!>cFj$^7loChWP@`n&q^h4a; zSBVKFu3eW~3d@X)IL+TYjJ@&VGs0G*;{3uTY1pa$S8-?k*5vobahOVpjNVYXLpqfl zjpT&U!Uz>aLO^PC%4iToX=y}cbPY!cs7Q;G2I=k*1HSVIKmWq_`Td;hInQ;S=e*B- zzuxx^&lUN?X^TPne@9*6g#-D2UPqV6!GqaY7Wu-4Yl4X?yBfb95~Pl7`T5=3N)OL8 zzSDPRS0k&Ilz8`G+F(+(^cN>pEbDmoFtnq{IJ0-}wENPKPpCBWbN&3BbFDL+dTo%D zva41M-*)~Q*H6fSYl0Gn>YZ_#0{Hwqe=#_~lpHsB3gvhH7%LQ9n^MQgJvDgbX4uU~ zyI)#dFTMAmW|^`XMn`*_*BEYHzr|qzPj1Dl*s}Bs*U`*awUz|N>BrykQ*(cROBATS zdr2JYZjVDXIlDv-P<7qsvc-|H0ArbeLJ}+DqvK#!kgujx|?Xh6wGdG zuv6v1*;lb#!%Da$JLV&BG;wggTut?(@mi26T z&5j3!ydG^e;;2d-)^hlyVSnv*T?X~Rii9Q0F|4Y?%QFDr!1wW|TVak`E|{sFSTTN+ zMmct>ZxJcN|7S|I>+uVMEcRL%AjFpidI33OgBd=YP4>yZUg~|ytubBzQwAJV@sh<8 zVR=bNDf*uUSk5iA+te-Rtml7ihZ*}Gdj5`r*24sLlc$!BCgv|j8qJ@Q1s2Yhu}ElQ zQ62UKhfc8WZOPskdM;qkjq63UU?x_{(wG9Qx3qQsMrj6r-fBC)5ELV^Ho#WSMZV&5zvqx#g(1Q4nIh$y&DZObkbohCqyS%v~MBu--$(l#v1Q+1-Uy#WNpV)ak_mn6Z}R z%sX%3q?$p%c5oyyoBj{4ex7rRzU5~!t9SS2m+zX~d3PrUpbf{jSS!3|&FeI&wR@Ed zLgpOF>NfK!h}$6KC|HYDU}gQp=`h0>5h6czKTi+deI3(LE$K$p z7OED}Zf}7w_QT;Y9rNkItp}-GKE?3c9nqKmU^1 zJ2OI9bi$#u_d%V(mcM~Q61$k?4`ohcIJa#8lH6OJv73|vUzV9t`&dA5>-Es12tx3&o{$Zzjv6`!(BuNbL2ZU~E(qnaoiO(4n z^Q&^gKEqCG?hdVPdZSazHiv0l#(+ei)l(C!OX#_j&ZQ-1>|RVxJ9!(4Z4c9ds5!O= z{ENhG(M~spRp& z+|QQ9qA%Fh38DK3JMRVe$|;D-?Kdd*s8}C+g%yUoQWT_l@D7Ao*hD zM8lUKhJK9EoIc6z>3~L|VBeZGN>e&u<|5x;VYHhmby~Hf8@sEs0y5FhNm^veLhWbs z=Fj%(<-oF3R=vR-2%y@0#ARlVR787WjCPs^Kgtob**c~^oR{Layb&vFnKP{5Nxc3N zk-*@)rr(4y4D`q%yVxcz2$9lT>>#?aQ8CC*{N~Pqk(OUrdWRJHD@{6ZL4^lOWS`b|R7n&~!I?d}$|J#6py)_OYymCkugYN6jQjd+B@7 z^$SmeZO1Sy`h)N7uoQnp3dYF>C@VZWq;_9i_1*+a;j={bT;VWt<8!?;pJCeB##Vlk zKdWIDPDRY2#b`Z`%KEsI_Tm`V15*z3T~F8dnB>r>@jj2!A@9 z!_iRwg7gGbmWjvkG`Ufa2_=ei@c2N}B)co|+v288uX}-$SI}y5{wZSx87*Oi{8;`!&fPddmsT=(1Aicb%KwRsSZOk zSCyS6sib;8`Im7|-J&Tv)NZ{iQbd-2{JZmQ%i+YZM&ip8>t^x_hTy25uFkPF_GVy#X@3{biw2kNlS4u3!4e>wj@!Cgo*^XqtXqBv$0|bYmzL88LsHg=GKlU zPOl&Vqp-vg8x%XMjZQl_?QZkqPOs9ByXTo~u!JY@X0;HL%laS6fC2Oe2g~YviRaLv z{P;)CY|gY58&gzDE6$ztN5`arD-At!m=w8?KI_H$SBSY+A|)$BOPlxN%Tk}+TNrga z{J3yEX!a&p2k?j2^^e3PK6;?=`chyN)LNJH7Uh}!VmGABR^g(D44@X$0WAjU;r^jw@yt$R{7sFkv1uwOL#ea4uZbVQyaYsBpIUXqEC!EzW15#$C)N1c1yaN0um- zcFs(^no1ih!J2tkDbXFDSN++GF{d9Hf{a4EP{D!5!!^d;AN4bx(KOo-cN*g|=68m_ zDOTpCUj+C$R}Q1EfxZ_7sdgFwMJsFHMzDZ({^)z#ysjFdR;)DZ>`}Qzo|Gf*y=!ev zb`gDY{2|t`@pY^A^{@go3yH62-1TTDy>k(bUsYK~fip~-5($_L?*ZY<2Jfm)#}}7) z|8iDJ9R~mNz#KW-c(fAwC{xmf zWq`Cz-DKOI|I;Lm>GwBHmTj%u0{R;s#2{KIv=XS5mvh8g_GJvFcP^{%75z0IopW zR17sG16e7ParJs2yV8hAswUbMH4^Qk9IKvMcfKUZYnlnr2Z`$GFLm^_p;fEvnnlRt zf5~NXi>>ZM;<5^kzFanKNswra*6S_=$!Ba&x_Zx!FcZ3@{0_RKDsKEy4bJvpCX{=1 zJ*+8SAMFI`z{!stC+A3e zcuv5vET6S-j|jyg9?_LZGNYQF!uF-K<|&Hhz^xY|oc7=C@TWqVoJ|jTm<4(gx|MWy z%m@mic6Fd@Qsnd2Hf1w0-WvT04^;IZzz&}Sn&yuPK`&XVl`?!1Q}WOduk1v zp~wZ13|7m?V|s?G$U5;5Gh9 z>@S2^%?}x=`-ZxVu~~fd#8vEK6Cw&CFgU^e3)$b!z8Zr-;PLElPF=Cwh(i6~icGUs z@#^1!_)^`gyen-+GrJm(7cWxQJNhP2yCH7L%9~1)8$jay!K=)_AV)9g zB!-W`6HGnzIduUz1YZpEH=XlVa+Ag9FP*J6&tH2+Xg#uJn!vL?eiD-{@lpT+2j9KV z0fX1M&nn#{lyB;<6bD36o#@bmeOWBucdg@wSUz8iDUpTpXS@YmC4J7OA#A+)^>slQ z+;PkNq?g(gyM(p5*Pl;;W%;}M7H(sBlfe$2kZ$6%`(|x*BW!qPzKD>0c5=#$BHU27 z{b=GE@~c-bAySrKp{>Q^pTI{zY?k;vMFoo=}~%nd#iIs zBxUQUP=jzgv!&sPQ={gZ#n%=JjElX;&qYsBU#?tqB_v1~ViQclIJ_OxUD(5IwB`m5 zfXJ~=&s|*5o;*;q4}L8RoaJ^&tcsm0gLyPGG%2pGOE<3`0V*mgjG#~*Gi$YK2#O~p0->GQ!!cA>)?m31fm=i0|^1(kE6ArldhJZa~yI5^A{bQw`6F5(<$)SU& z|5z#OzpPZ1YxC3pSg8cUpyz6XpnoW6ve#d5tGQt*_djq;<}bK)OVRcp3aT=|Lzs7E uA_LL$58Rsk3vS6A2HO1xZv9_h1`iZ8uw++k>MtfDJUSW%>Q$=n@c#iyytcOh literal 0 HcmV?d00001 diff --git a/nerochan/cli.py b/nerochan/cli.py index bdd8e60..537241d 100644 --- a/nerochan/cli.py +++ b/nerochan/cli.py @@ -1,10 +1,13 @@ import click import lorem +from datetime import datetime, timedelta, timezone + from os import path, makedirs from urllib.request import urlopen -from nerochan.models import User, Artwork +from nerochan.helpers import make_wallet_rpc, daemon +from nerochan.models import User, Artwork, Transaction def cli(app): @@ -14,6 +17,30 @@ def cli(app): from nerochan.models import db model = peewee.Model.__subclasses__() db.create_tables(model) + + @app.cli.command('verify_tips') + def verify_tips(): + txes = Transaction.select().where(Transaction.verified == False) + for tx in txes: + data = { + 'txid': tx.tx_id, + 'tx_key': tx.tx_key, + 'address': tx.to_address + } + try: + res = make_wallet_rpc('check_tx_key', data) + if res['in_pool'] is False: + txdata = daemon.transactions([tx.tx_id])[0] + d = txdata.timestamp.astimezone(timezone.utc) + tx.atomic_xmr = res['received'] + tx.tx_date = d + tx.verified = True + tx.save() + click.echo(f'[+] Found valid tip {tx.tx_id}') + except Exception as e: + # delete if it fails for over 8 hours + if tx.create_date <= datetime.utcnow() - timedelta(hours=8): + pass @app.cli.command('generate_data') def generate_data(): @@ -74,7 +101,7 @@ def cli(app): click.echo(f'[+] Downloaded {art}') if not Artwork.select().where(Artwork.image == bn).first(): artwork = Artwork( - creator=_user, + user=_user, image=bn, approved=True, title=lorem.sentence(), diff --git a/nerochan/config.py b/nerochan/config.py index 58bc451..6a498d1 100644 --- a/nerochan/config.py +++ b/nerochan/config.py @@ -17,6 +17,8 @@ XMR_WALLET_RPC_USER = getenv('XMR_WALLET_RPC_USER') XMR_WALLET_RPC_PASS = getenv('XMR_WALLET_RPC_PASS') XMR_WALLET_RPC_PORT = getenv('XMR_WALLET_RPC_PORT', 8000) XMR_WALLET_NETWORK = getenv('XMR_WALLET_NETWORK') +XMR_DAEMON_URI = getenv('XMR_DAEMON_URI') +XMR_DAEMON_HOST, XMR_DAEMON_PORT = XMR_DAEMON_URI.split('://')[1].split(':') REDIS_HOST = getenv('REDIS_HOST', 'localhost') REDIS_PORT = getenv('REDIS_PORT', 6379) DATA_PATH = getenv('DATA_PATH', f'{getcwd()}/data') diff --git a/nerochan/filters.py b/nerochan/filters.py index ec03734..d675af3 100644 --- a/nerochan/filters.py +++ b/nerochan/filters.py @@ -1,8 +1,10 @@ from datetime import datetime import arrow -from monero import numbers -from flask import Blueprint, current_app +from monero.numbers import from_atomic +from flask import Blueprint + +from nerochan import config bp = Blueprint('filters', 'filters') @@ -18,8 +20,15 @@ def from_ts(v): @bp.app_template_filter('xmr_block_explorer') def xmr_block_explorer(v): - return f'https://www.exploremonero.com/transaction/{v}' - -@bp.app_template_filter('from_atomic') -def from_atomic(amt): - return numbers.from_atomic(amt) + if config.XMR_WALLET_NETWORK == 'stagenet': + return f'https://stagenet.xmrchain.net/tx/{v}' + else: + return f'https://www.exploremonero.com/transaction/{v}' + +@bp.app_template_filter('atomic') +def atomic(amt): + return float(from_atomic(amt)) + +@bp.app_template_filter('shorten') +def shorten(s): + return s[:4] + '...' + s[-5:] \ No newline at end of file diff --git a/nerochan/forms.py b/nerochan/forms.py index e8f3984..eef07bd 100644 --- a/nerochan/forms.py +++ b/nerochan/forms.py @@ -21,27 +21,19 @@ def is_valid_xmr_address(form, field): class UserRegistration(FlaskForm): - handle = StringField('Handle:', validators=[DataRequired()], render_kw={'placeholder': 'online handle', 'class': 'form-control', 'type': 'text'}) - wallet_address = StringField('Wallet Address:', validators=[DataRequired(), is_valid_xmr_address], render_kw={'placeholder': 'monero wallet address', 'class': 'form-control', 'type': 'text'}) + handle = StringField('Handle:', validators=[DataRequired()], render_kw={'placeholder': 'online handle', 'class': 'u-full-width', 'type': 'text'}) + wallet_address = StringField('Wallet Address:', validators=[DataRequired(), is_valid_xmr_address], render_kw={'placeholder': 'monero wallet address', 'class': 'u-full-width', 'type': 'text'}) class UserLogin(FlaskForm): - handle = StringField('Handle:', validators=[DataRequired()], render_kw={'placeholder': 'online handle', 'class': 'form-control', 'type': 'text'}) + handle = StringField('Handle:', validators=[DataRequired()], render_kw={'placeholder': 'online handle', 'class': 'u-full-width', 'type': 'text'}) class UserChallenge(FlaskForm): - signature = StringField('Signature:', validators=[DataRequired()], render_kw={'placeholder': 'signed data', 'class': 'form-control', 'type': 'text'}) + signature = StringField('Signature:', validators=[DataRequired()], render_kw={'placeholder': 'signed data', 'class': 'u-full-width', 'type': 'text'}) -class ConfirmPlatformSubscription(FlaskForm): - tx_id = StringField('TX ID:', validators=[DataRequired()], render_kw={'placeholder': 'TX ID', 'class': 'form-control', 'type': 'text'}) - tx_key = StringField('TX Key:', validators=[DataRequired()], render_kw={'placeholder': 'TX Key', 'class': 'form-control', 'type': 'text'}) +class ConfirmTip(FlaskForm): + tx_id = StringField('TX ID:', validators=[DataRequired()], render_kw={'placeholder': 'TX ID', 'class': 'u-full-width', 'type': 'text'}) + tx_key = StringField('TX Key:', validators=[DataRequired()], render_kw={'placeholder': 'TX Key', 'class': 'u-full-width', 'type': 'text'}) - -class ConfirmCreatorSubscription(ConfirmPlatformSubscription): - wallet_address = StringField('Wallet Address:', validators=[DataRequired(), is_valid_xmr_address], render_kw={'placeholder': 'monero wallet address', 'class': 'form-control', 'type': 'text'}) - - -class CreateSubscription(FlaskForm): - price_xmr = FloatField('Price (XMR):', validators=[DataRequired()], render_kw={'placeholder': '.5', 'class': 'form-control', 'type': 'text'}) - number_days = FloatField('Length (Days)', validators=[DataRequired()], render_kw={'placeholder': '30', 'class': 'form-control', 'type': 'text'}) diff --git a/nerochan/helpers.py b/nerochan/helpers.py index f90b4bf..8ebfc1b 100644 --- a/nerochan/helpers.py +++ b/nerochan/helpers.py @@ -1,19 +1,34 @@ -import peewee as pw -import playhouse.postgres_ext as pwpg from monero.wallet import Wallet +from monero.daemon import Daemon from nerochan import config +daemon = Daemon( + host=config.XMR_DAEMON_HOST, + port=config.XMR_DAEMON_PORT, + timeout=3 +) + +wallet = Wallet( + port=config.XMR_WALLET_RPC_PORT, + user=config.XMR_WALLET_RPC_USER, + password=config.XMR_WALLET_RPC_PASS, + timeout=3 +) + def make_wallet_rpc(method, data={}): try: - w = Wallet( - port=config.XMR_WALLET_RPC_PORT, - user=config.XMR_WALLET_RPC_USER, - password=config.XMR_WALLET_RPC_PASS, - timeout=3 - ) + w = wallet res = w._backend.raw_request(method, data) return res except Exception as e: - raise e \ No newline at end of file + raise e + +def make_daemon_rpc(method, data={}): + try: + d = daemon + res = d._backend.raw_request(method, data) + return res + except Exception as e: + raise e diff --git a/nerochan/models.py b/nerochan/models.py index e5f2926..89c2eaa 100644 --- a/nerochan/models.py +++ b/nerochan/models.py @@ -58,7 +58,7 @@ class User(pw.Model): class Profile(pw.Model): """ Profile model is for users to provide metadata about - themselves; Creators for their fans or even just the general public. + themselves; artists for their fans or even just the general public. Links to social media, contact info, portfolio sites, etc should go in here. """ @@ -77,10 +77,10 @@ class Profile(pw.Model): class Artwork(pw.Model): """ - Artwork model is any uploaded content from a creator. + Artwork model is any uploaded content from a user. """ id = pw.AutoField() - creator = pw.ForeignKeyField(User) + user = pw.ForeignKeyField(User) image = pw.CharField() upload_date = pw.DateTimeField(default=datetime.utcnow) last_edit_date = pw.DateTimeField(default=datetime.utcnow) @@ -135,9 +135,13 @@ class Transaction(pw.Model): """ id = pw.AutoField() tx_id = pw.CharField(unique=True) - atomic_xmr = pw.BigIntegerField() + tx_key = pw.CharField(unique=True) + atomic_xmr = pw.BigIntegerField(null=True) to_address = pw.CharField() - content = pw.ForeignKeyField(Artwork) + artwork = pw.ForeignKeyField(Artwork) + verified = pw.BooleanField(default=False) + create_date = pw.DateTimeField(default=datetime.utcnow) + tx_date = pw.DateTimeField(null=True) class Meta: database = db diff --git a/nerochan/routes/artwork.py b/nerochan/routes/artwork.py index a29f8de..25f2012 100644 --- a/nerochan/routes/artwork.py +++ b/nerochan/routes/artwork.py @@ -1,7 +1,9 @@ from flask import Blueprint, render_template, flash, redirect, url_for from flask_login import login_required -from nerochan.models import Artwork, User +from nerochan.helpers import make_wallet_rpc +from nerochan.forms import ConfirmTip +from nerochan.models import Artwork, Transaction bp = Blueprint('artwork', 'artwork', url_prefix='/artwork') @@ -10,13 +12,43 @@ bp = Blueprint('artwork', 'artwork', url_prefix='/artwork') def list(): return 'show all artwork' -@bp.route('/') +@bp.route('/', methods=['GET', 'POST']) def show(id): + form = ConfirmTip() artwork = Artwork.get_or_none(id) if not artwork: flash('That artwork does not exist.', 'warning') return redirect(url_for('main.index')) - return render_template('artwork/show.html', artwork=artwork) + if form.validate_on_submit(): + # Create a tx object to verify later + try: + tx = Transaction( + tx_id=form.tx_id.data, + tx_key=form.tx_key.data, + to_address=artwork.user.wallet_address, + artwork=artwork.id + ) + tx.save() + except Exception as e: + pass + return redirect(url_for('artwork.show', id=artwork.id)) + txes_pending = Transaction.select().where( + Transaction.artwork == artwork, + Transaction.verified == False + ).count() + txes = Transaction.select().where( + Transaction.artwork == artwork, + Transaction.verified == True + ).order_by(Transaction.tx_date.desc()) + total = sum([i.atomic_xmr for i in txes]) + return render_template( + 'artwork/show.html', + artwork=artwork, + txes_pending=txes_pending, + txes=txes, + total=total, + form=form + ) @bp.route('/new', methods=['GET', 'POST']) @login_required diff --git a/nerochan/static/css/main.css b/nerochan/static/css/main.css index b544830..785b3b6 100644 --- a/nerochan/static/css/main.css +++ b/nerochan/static/css/main.css @@ -8,6 +8,12 @@ a, a:visited { color: white; } +.container-wide { + max-width: 90%; + margin-left: 3em; + margin-right: 3em; +} + .artworkLink img { border-radius: 2px; margin: 1em; @@ -93,7 +99,7 @@ input[type="text"] { margin-right: 35px; text-decoration: none; line-height: 6.5rem; - color: #222; + color: #fff; transition: all .2s ease; } diff --git a/nerochan/templates/artwork/show.html b/nerochan/templates/artwork/show.html index eee1564..d3b272e 100644 --- a/nerochan/templates/artwork/show.html +++ b/nerochan/templates/artwork/show.html @@ -7,7 +7,7 @@

{{ artwork.title }}

- Posted by {{ artwork.creator.handle }} - {{ artwork.upload_date | humanize }} + posted by {{ artwork.user.handle }} - {{ artwork.upload_date | humanize }}

{{ artwork.description }}

@@ -15,46 +15,52 @@
Send a Tip
-

{{ artwork.creator.wallet_address }}

-
+

{{ artwork.user.wallet_address }}

+ + {{ form.csrf_token }}
- - + {{ form.tx_id.label }} + {{ form.tx_id }}
- - + {{ form.tx_key.label }} + {{ form.tx_key }}
- - - - - - - - - - - - - - - - - - - - -
TXIDXMRDate
e599...5429.053 days ago
681a...e264.2528 days ago
+ {% if txes_pending %} +
{{ txes_pending }} tips pending
+ {% endif %} + {% if txes %} + + + + + + + + + + {% for tx in txes %} + + + + + + {% endfor %} + +
TXIDXMRDate
{{ tx.tx_id | shorten }}{{ tx.atomic_xmr | atomic }}{{ tx.tx_date | humanize }}
+

Total Received: {{ total | atomic }} XMR

+ {% else %} +

No tips confirmed yet...

+ {% endif %}
diff --git a/nerochan/templates/index.html b/nerochan/templates/index.html index 051ba3e..7d500a4 100644 --- a/nerochan/templates/index.html +++ b/nerochan/templates/index.html @@ -4,7 +4,8 @@
-

Latest Artworks

+

artworks

+ {% if feed['artwork'] %} {%- for _artwork in feed['artwork'] | batch(4) %} {%- for artwork in _artwork %} @@ -13,12 +14,19 @@ {%- endfor %} {%- endfor %}

...view all

+ {% else %} +

There's nothing here yet...

+ {% endif %}
-

Latest Artists

+

artists

+ {% if feed['users'] %} {% for user in feed['users'] %}

{{ user.handle }}

{% endfor %} + {% else %} +

There's nothing here yet...

+ {% endif %}