From fdb9583bdbd6c3a59e5afaf7de0c7e573f86f0ec Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 15 Nov 2025 23:04:38 +0000 Subject: [PATCH] i --- assets/pasted-20251115-222453-fbd77111.jpg | 148 ++++++++++++++ assets/vm-shot-2025-11-15T22-23-11-632Z.jpg | Bin 0 -> 55607 bytes browser_extension/icons/icon128.png | Bin 0 -> 290 bytes browser_extension/icons/icon16.png | Bin 0 -> 277 bytes browser_extension/icons/icon48.png | Bin 0 -> 278 bytes browser_extension/manifest.json | 24 +++ browser_extension/popup.html | 23 +++ browser_extension/popup.js | 29 +++ core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 748 bytes core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 1783 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 1524 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 940 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 3977 bytes core/admin.py | 7 +- core/forms.py | 25 +++ core/migrations/0001_initial.py | 27 +++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1539 bytes core/models.py | 18 +- core/templates/base.html | 55 +++++- core/templates/core/analysis_result.html | 41 ++++ core/templates/core/index.html | 182 +++--------------- core/templates/registration/login.html | 18 ++ core/templates/registration/signup.html | 18 ++ core/urls.py | 10 +- core/views.py | 82 ++++++-- static/css/custom.css | 152 +++++++++++++++ 26 files changed, 679 insertions(+), 180 deletions(-) create mode 100644 assets/pasted-20251115-222453-fbd77111.jpg create mode 100644 assets/vm-shot-2025-11-15T22-23-11-632Z.jpg create mode 100644 browser_extension/icons/icon128.png create mode 100644 browser_extension/icons/icon16.png create mode 100644 browser_extension/icons/icon48.png create mode 100644 browser_extension/manifest.json create mode 100644 browser_extension/popup.html create mode 100644 browser_extension/popup.js create mode 100644 core/__pycache__/forms.cpython-311.pyc create mode 100644 core/forms.py create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/templates/core/analysis_result.html create mode 100644 core/templates/registration/login.html create mode 100644 core/templates/registration/signup.html create mode 100644 static/css/custom.css diff --git a/assets/pasted-20251115-222453-fbd77111.jpg b/assets/pasted-20251115-222453-fbd77111.jpg new file mode 100644 index 0000000..2219511 --- /dev/null +++ b/assets/pasted-20251115-222453-fbd77111.jpg @@ -0,0 +1,148 @@ + + + + + Page not found at /assets/vm-shot-2025-11-15T22-23-11-632Z.jpg + + + + +
+

Page not found (404)

+ + + + + + + + + + + +
Request Method:GET
Request URL:http://muhammad-ishraq.dev.flatlogic.app/assets/vm-shot-2025-11-15T22-23-11-632Z.jpg
+
+ +
+ +

+ Using the URLconf defined in config.urls, + Django tried these URL patterns, in this order: +

+
    + +
  1. + + + admin/ + + + +
  2. + +
  3. + + + + + + + + + [name='index'] + + +
  4. + +
  5. + + + + + + + + analyze/ + [name='analyze'] + + +
  6. + +
  7. + + + + + + + + signup/ + [name='signup'] + + +
  8. + +
  9. + + + + + + + + login/ + [name='login'] + + +
  10. + +
  11. + + + + + + + + logout/ + [name='logout'] + + +
  12. + +
+

+ + The current path, assets/vm-shot-2025-11-15T22-23-11-632Z.jpg, + + didn’t match any of these. +

+ +
+ + + + diff --git a/assets/vm-shot-2025-11-15T22-23-11-632Z.jpg b/assets/vm-shot-2025-11-15T22-23-11-632Z.jpg new file mode 100644 index 0000000000000000000000000000000000000000..311ef1cde7234648264aa12e95bdaf4d87a028f7 GIT binary patch literal 55607 zcmeFY2UJttw=WtSexj&|bQA>y2~9+LQz2A=4@d|drAjD~&_mNtMF`D+fb>r~2_aGf z1_)T_Rch!+CzOO1dU^5u?-~F5A9tL4-o0;}H|`kkt&F|*+-t3@z4lyl{pOl;&vi0% z@(XZPPfJ$|aOxBQaEkE*oJ^k@($&zg`_sfoOZN%r9|bJ{Mml>B0PyhiL6~SizGZG< zdF%YIfBfTj*)s?47r(FnL1MJKJ@~tI0H9CeKdAFR%f8^~7VBSXHE$KPP3jm!+PqZ0dRxC?$f8w z{FcOjPiL6Uoj?1>h10)_Ev^DiojrZ(^qI3~na^D~f9muV!0(%LtW4K#pJ$VPWSr1* zUBL9&AMBih_aR=da(f>=Vcs>Y!lT_syEToi&T zj`Z^Wb zLTV`g;NAaua8XI+?Sj@w2ei~m-m2OXhm_LG#(U7T3^I8($n9rcBlr6h9bmW!H0xqv z#$||K>ItBDT-Il9($Um;Zdpya?xL!f*9;QARaapcG=;~2BwnRu>QQk;)nizT@O}VL7`^U6E@E%a5 z#QHS7T#V^Zjd1$Far1n+Sp5O?uus<|E`FSJ_q6y@K^PAk{Zjw%6+<@(pv<#k!?p z$RbWuR6e3U{IDc2H|ApnOuCflnA9QNL~_?Auu_q-5X-`95X4|dLhasQa4_%7e;bOY zmE^(5?x3fTM80T9Q2MNm9$8eOZ98OT$+!Km5lR1;R?wS z>RU>>c(VrUTj0T7S3@^VX>v1qzXnZ!G=hY71lu5~9WMyh^w)WdQMuH@INA=|=7@h` zfbv)D?68ojTu_%z9!OiO(VM-nkkt3QhD`jE#rFS2C^?gC@}?4FQ_A}>y0EEb3sEw_ z-qKHoBR@68%C`$zu<`8>eFh0~n0f?gc?ytKV6T=z?ca6iy7D~rD?S_+G9c+)#jTf!qxA? z%p6>_Q~Gz)Bl{{0am#(MjN>hFoLixNsqE(S#W_#iJ38}6!W#K>VD^qCXLxWmH!IUKeG=&!Vmk2>JRX&*qBoH#W-M*pA8BJVVI5I3Lf;QkRn3Kz zl09Tgu!bEit6Rlhilc*7IFWMKqeTnpUF-7QBrWyE9X^V4$!^-5^0MqT15C(x-$55k ztMj{e_A_o1-3N|TFo-+|)5cRrUfFp=O3aAtd{KEIy2e_Uw~yAw7)HQtlWNMuq`@5( ze`wmd@W{6IhMHp^(YUZ=BB2b3DM{{8eYe^HO5M4Qlq{9DJ=50VxfB7%v^ zNQ?(7r~bGc6Tg_Q*LM8*+?Fi|>-kRRhIvf>fD*JG9#(Of#*5@SY%Q{g$++oaI*kx9 z>`|)18({noepa{?T3|DNjJ7~hm7bu|?!;>WW!bqVav^qbrxk<;x#gQ(Qr!kgAf<5I zx5iauA+11uBGnGO^Y?XHWAb5g=a!hQK2NOoVSx{UT@HoCgFqmKw;SA!VN&0k7Kjc{ z+@EOCDwFDcjt=fV^}hW{{7buh>b%fBot7~awjZ;)Y*RmAN)3j5oXOv=>a_Z^+D}dh zs>p+ywaF)C0P8=uJ$)K~0^n;mE}XnSn)jEPW)wYhke*FZtzOblj&WN?Tso&#d4Js9 zXBDlKun9M7n+4g~X9L}tRjbX4wn8K;)_n6v=bLa#Mo4)7Op<%L8OBTa(Fa{_XZ;Cx z@x;(7?Z-LkSqMy3eHG~U!tsAdmz`xq!q^?U8z%^QA#NQwu^d0rC@ecV-}H7;=~gsu z8R{}v+b*M|?KWNoEcyX(Vtemw%JHS4eKw2(QPV<@B-HC|Tl~&~a z;D{zk`MQo@BdWIHz$1KDne@cBZMnEFSy-)qZ|&`K@OYPFbzibq(_lOFfR02T%eVUY zgx(|eZN=p+clp(x00{IWbvh|@^Dn^skEE7w388uyw`W>Zsp!EJnRuvTI{`uB41z#L zRu0>o?sL1{3^k);%a?7PQZfVy)X_xn)JvI5vwQQ8%s8AkV#2ZLfuW>Xt?xyP#Rf+Z zqc1ZvG8Rw3y`9mmHhB+eFRDXtXs@ zLxxT+Y51*TyCcc&-OqZoh8!$%p;)f|KFhQ%m`FDAb~C_RI`B!jKzFY+6lYvok|kHs z6*;owfr-l5rb2Ir3O6HJqjWr~Zc_`LE4TH!VxCvLK2S zJzxbFScp(IGtR;W(5!wDMI-?aR-b+&jcfm{14o8!P9Dy)nYlkfCK--d1zkR@STjw~ zh(P{UWCf_tSoM+)qb6cKIj`AD|Eg?kn8r+B59Gl-7TQOJD7^fa*H9HY+fW%;c|{k{ zU@(Ur_p)U@s*?R0r{#VR5#p1EAYdY}qewF8PxBi0zb-Lf0x+M4fT~K%Z-GGaM>W%eLwNd(3?VE>GoOH?3q`vRIT_kaib_7 z$F7aTP(-}_^vt-S&$4>jLg~%o5&66a7)+-~2wi|(RQ(U$B-YKT-J2$>EO^k{l+KZm zBWWVrL4T#>XeXtvBBFyZ&kZn@57)VV}z{- zf%(U)fAd9`c(c8u9D01n(Z*JX2>%e6JOQ}=dD!UU#T|=pRJ7!*Hg(&wx|D2Jl?Ps? zy*j=zMcn3D5S>Suci5G>u4DO?Q)4Ka)Hzr-rsPOI*T7Ha=B-_!kMx}6wQ9vhXR)pU zbCcd2WYCe1H~D#C^(qMn+?HTy-=Y0Gyc|l%!;j-4hIEoJy)12tQ~mJMFOS)Jj$_Gv z)kOT<-m$+~Dj6OkL8c(xhFo%e$!o+LNwEqWVvj=OTgV=|D)qR$9k`2a@Yw}fg?E6e z(E9cter}?UQ~a zc2cWBenSI{HB#U6@Y!1ph{Lw^3F(CP%CZq(g&X%D#w~8ju1qA`jpd8|xM_Rr)tL4% zfp5h-LuPv8hE&SF60I(2pEhO^cqK|D=Zc$9>>62Ag4rn9pToaWUaQfrD{KrS2w@AY z%j~60!DUVWlDk+LyNCPd!QD}Z@!gfUdknxz9{ltpS6>do1Zj zmu9#x>+NH3sW952y{iuf730?zQdte!cK@q;nx=M``4s4Q0^m57-dxFpOLcD`{hF17 zD1IjZZA)?mu_ucH#tu;yHyzwFlqV|F2D?fF4!W=#C09&hqJ3A?VEJ0|-Eq}j$vGUN z54Q21`LxQdtaXjDA@$?PxD$X&+%Xua`1k3%UWh;*a}2!d1JN?k3@DgiD(2weS8YIS zi(Ep)+}M3+9ws=aqVWoXI01|nR}M75cHDI^5%pv7H75YrDPn0LP!SeGh^nz%g#xn; zEX`UP!F0oX%%}DTE-w?5qrDBEeJv&$6Wk@*p3l)^e4>t4&6DjaCZ3)u*qD&JZ>ZtI z`XgXaBfirDQm$_^E^Z*1Xlz_E0_Ys#QkfZdXlptOKIzwjT}%VRvhn4W z$&(~rolDwM9rznF+$uG05(TEO`h@;Cj+3$Nr1&1S+1E_A=&5C_$Qn!2e zvT{leDDaY_Mv?csqVJDDe6*W6!hP7x^_lIk(B+o<;Wh&}=M0Ht^v^m^goIMOnIQ zvej#%uziq;87?yS1dyu_lrBb)pm|DGboydlM%Cn>o)2BqU1ANQ-VZi!`cLbG1^}W{8poemRMiH=rJ|@&XjoBA&UGLdNLbvFOO9In6DloX)_V+pW7rjZ)TAI~40? z`I0(eUA{7NsG{FIJ_(gZAur+=3*Ve~e^m4$R0Pox4tuK{$~{Mcma2H^!gMonZ%YsY zq_F!LXwJ|g%901e*?lF74P<#iq*PEKTo^kWuPtcVl39aH*D5%D-X~W11NJ--rTO9GcYT&KsOcfo39k84PAaXI10H)H&l&R+rqQ>ylZ`G0X6^YmTBPou z|EZK8Y-^M;e;ixGfa6K(-6}r)K&9(A2oAAox$Qx;vK4i5zAJ1TDBvo;ls^ufVCbJTHOTQw z=?TE#Yw)f^J7f4W?=Zm^)gNs-28S~Evz#|F3Dpn#N=PkOb2tG!s0bSoIRRuC6bk?V zOzL9k4O9DJyiRv}mZ({}pIfR<03%?9!*&r#&WQQ4#F4nnMA2fc0fTH}F~s0#RO4{~ z|I`F;*0T~srpuk^#siKlp3+TX;lu|+su>1|q4gm($@a0|?90DIH$$h>aTmu$3HuV^ z`uNdajHAJY=_`Nf##t(cUChZ0x367=yp;gT7u1urRsB#=C8NFBcnAL}8{b`&VY@b8 zAp6@aT}QXd+*CuHR87#W`7>aI9giru+u-f=(35wQIXNT&hJ$6pNArx3pWNkk8Jc-_ly48KFu~b`2u{^& z?-M5^TJiV~_86Dgc&I{HIfu(wzOq>TIDCptnk`+YYP_j$_LlJr=M5PZz-N0HV^DQn zBX*%%R<&BQCxBTOmKK+~cUzO$fngsvgX`*wc)ELgmu;-Jwof@SCAI~uvnwS^4NmXz zeoS;!e?sD=vj^HX5$)ZoeRkxr`UJRlV!H|)7YQ~0zJ9QmuA*jX(W*5U`$zf~NGqor z!ajoVU^lH^tdtxBG_Q{}S|4AIwYs^WglkEA5Tcu>3Er|JsdCaZtQQXLQIe0~7aP7% z^%HCg=RDp)Mjc{Ws=-TI#2_FLu9LO}xi#{&{|lTu=gFKkRC*>*QpSF?`d0klI9oE3 zI_DPTVJsI>m^se-{Qrr;b}G02k2+=9yM^9|Y@>Ek;qmH<6Pb>%SuM=L)`FYuATgxH zv(Gm4YS?@bI?P^bzbEM|1pbX2+vz8Ecmhz`9%`S@4f{Z|lYD^4Ay7xEEVpHgXr>Ok zDe-BnQ#-dw7H#cUdlDTGNJ86yrrj6@^|byxZBxBj{cxsr6|1754(cWn0Kx8bxJlvz>q;Z4?N5S0Y0?Bb2OVOGB2}YD zS64v>@Gpk~#J87@1>&wwZ`-#!!AI>$i8tc~jpg$(1)h0`0=T^Z&E_3=aX4N3wj}hs zxbLVWv|H{rhqe?p9qkI;!MOh&`p4w%d9mY7|D(H|1+TuAi2c?3mC&+4{(A&<0&qx= zra+FC2@l@=`q3t>aLEjQDwAZz9g=M3=tR6GiN{2H8{6cLh$$D~Uoe)@Z=3gOn!-qo zS)U_X^@V)Q*BDj?IspjW@IMp@j8%U>MVYzBR({(oF~1Wrc3HcT4@It&6YML)6nrF+ zn(Y<-`HxeB&0d9yQd8<5n?^@VTSa<3G)O|7?(PWL)>TlL;m_6U#${Y7d{5j2?FB6d z^U;Nw5fRUC@-tS%6UN6aw7uKP0D*@9*2l{CK(GqJiq`P$L{xKWYlS!DL1DdLBr`3- zto%bjsNN(yO0?{!Ob1Go3$L9G^c4^QdW!#^1g6?Tg8*w`n>de~P(tCgB>aGqi|W%Y{?*Z<=Oda|q7F=$J&?ctUEBbqQ3s zN4BJuv}#HN%JuK@q=fRTY2T1>DR54hLus7=EHI7WqpZ)pCxE|h0?PxA;Zk!1PhD5w z9x7v`skEdws1i>*U>mcmm2I&879gU{pWu*F*(Rg2t-h5qh)2qr4i&~~lFLCFYmCOe zD%$O&)l;<2H&6Lnio6I`Es*92*bwElD_JCK(!obdO(y^^;@UMOcMc^BcI%zNm@ddR zh9Kuk`#y6xKBGRtPy{_6MirE=4orWftm^aK(>9c^(`EP-Sh>=E`xVY#Y`|}Nx7ClE z)h~X@KE4<>kCEDLt#7<^0*J6Kk2U|LlEl1ss9CNXUDl-4UP|mnG|XyhYI{JSL#FCX zU7$Bj0WR#pNe;Xw->p(6AW=_ZMr?lDG)gQP(}sHP+JIU4C8C8r^Zjah5v)ybVbnpQ zv0-h%jcGf+Ut=b)!F6sdH?K^!MKPqfnb4AvI+2Hza-8%)Vlra72a4LiI2&g0zA&;A zG&2`0W$RfP$*y`{H0(oLdqDoR*-_|K>p|shTLDG3_EgYgBuIj8Xx~b@lt)fw9jT`k z7r{)9sS|ptxWf^iseUm%O2pEy{p=vH6bD19*0>G$6yaSkw};?Yq`E)+N)KJ_$}5-U zvH{i%*!_%{vm2=a9+I1GDmOb8S=|ux9_GDP`2ZW6Sf`9`(Z|$HOOc!G7d- z!AZ=+hfn%iV>6;-mC+2omik0Q)Iflfud{@{%>+vpSP7;y^?x3ohoFL<#4Mudy%ea! z-@|G`wh6pbCjddBP22FN=B~xDOq~B?N*H31%n-ObC7wENT&1+iLFH_49NAZkQkYfx zpnf91VV3asoVB2YDX;xS)>%=5OEMq#`rrKKxX+X1P_ZoL=A9MYvi9~Eanzfa8qk*ID>~Bh zKbSRj*1280V<+IlLMoHbb-*@X96=N?-$JQ_m_LX6#zKT{zF^IzWs)Jo> zE~)<s?$gWr;a80GLPBy}lsP`Eck(uP2 z@Vs%!8);1kjT*O7mUE=1Nq$>Irvl%VtZ=YBh=y6kw)H`?{k{2`RawLAOMQ>>)asc+ zpG7sUW5?jiewRG8GOCEBqiBI8*z$AKYKS93*>!pG=?UP%@iU|Mf9Aw~d(z(jd{}$5 z>LR*F&PBSF@A>Qswl^NQOqDXtDdo~?qKZ8##|Vk(JwRe8N=UYlql_5Ezt;KRdb#QRHH3me8q2WW@yy#tyFfXr$zNg3TxD=7J+-R z2Z~fy>&UopS8Y>rz*kt-dijEwnOwH;0A#dR_>C6-e-+9#XEH=Skbm1%ea=)X^p5~c z=geMhebNB&PA+yH={;Lk< zv-z+P#Cy_GUJ*Ki>3?tnnDRRIT+gC0yibd59>r{v{Orwj3WLzf51#JNtD!*Y2WfTz z+O`384l=(&UF414uOIloAiD<^w+tGrvLS8oP9su_nCxuYgnK$%d2OMA3~siz+#J@u zrsF#MY0=*{QLSW~Eakg`Dv){|Kx`&za?G@JGF?7oQxfT|S2m|>ZWoxLLkf$QQmL>L zz<1Gf-~eCPp44u&t*Jz%Y$VEzNQKctLhU?g1y=i`TdSXyB_nftZ-lKgRwgpF{73Qp z`{ilm%cJ5A#!frF*6x>dGiYIYzEV3YKh&TOg4H%eM{mp87+TWY>F4Lt#}g*@1JPjC+L@KX#>oTef@m*E%FKc z%q;XNqVl=)W}Uo9X)A9<{bY{yF>}BoY!@!kBwZKM9xpaovJ|7~X1Xond$i;pt8p$A z@*OeYmGrcn<8eBDI+dGs1*%vAcM|%$i|I^PYxeg{{erBm8wwjOgii=SP>{0kt(b_MQ$2S^J0A-9r z;D-01$lhDEM~`Eb&&fy`=Q#0uj!9~34yQK@dF3#ahn@}=|7Assqd_*HL@mgq`4Vei z4DGkOr$LJ`=Ys@JefuxsUO>jbO6+`08CC zSy7PU-!*d)!g9zdt;=o#CDZ!EN%{xqRmf5HS(`|~vY~NXv#!GTSoWKkYQqeF+RBQV z%Q|QH4_;fUaX3OMTiYYfe@7OgjViUw`Vp$neikw8d%?J{8)BHaq>Feb=U)&q1nrWw1QI?of=U zgJFkdC~HpY(M|vr;a?BAWmH15-d%o6em+pweqU``U(5lqvtMF^FEC69&G?YLd(gJL zanrPk=1?VdvuVUfG=yyv(b?au6Kw~RE$li*)$}BT{R*)G*kkuS=s{WYkv#X{oHVt$ z?f?$46gMm|*G-!vs4lHin6)F*@v$RowD@mU>XE5|(tV}qW`w*V)l3r2$_dK{Hicda zn@@^6&^!Tb77=1Zb`>|C+?4;m119|(J~Q%w~IOMPvoTb@Uzla|T3 z0ndh}jC+3at_gD<;3Eg2A%*pUgy6@7^qe0XX1m4421&0n9gTGwk*chwMXao*o|K8Y z<3`T!liV)?$Ih~D1mm9g`AL-haK}7u+tbR?KylCLg({%d0YxA9@#*F zQ0;+1>?DJckgxXj=h7j_P@W^zXm~Gt7`@SoFD`6cbn~YgFkD4clY_2ZL(cR+@usR5 zXJc#Y+&v?YuD~e9rlE6_J_iY7F!gT>sSaP}1!!02{OlVX7cJ4|qj5T^^LQ*Wxw2<; zdxv4=5*^p&n}A>7f6web`5-eqYFhaq{Eo%P!IHj#sC~U^O@o7NrI@^PN?Yr!y--Ei zkJFD!5|^+)V+O})p$XNg`sb$AnWqP7_Q49%d+r6`Oh;;S1BGix!0mYn#IGg@tvZq4 zxX!GC%evt0?#-3rGCjF)ziuD7udXoY4G z)YT=Lbl2n|+rj(U*|3fL?wu!gn-A>kH}X#aJ5MGz6)vj(TAK@do$hO0W1G@xxA0wqs>Z5C1G#oEATqz^RYTKe{pDZ--zUC} zc-0SRq3}$-o9}!nrb{#r#ExwX#zV+J`2Di>)b%cQSgiVC@}Z5CXwoQ8L!+4Wj;w!O zy;S8+AMVIw-*0%RL)pEY6_h+a;PqKr*q?MH+Fw6e%GwTKefYoaN;-3+<;9m{jd$g! z4(LAU;vbRXHl8kK>9K~ZU@$duF<HHUAgyrwzdgUnabN9PPd=%yCk;%8t8BV^lHYD>ppME0F z(ohD@xE0wQg%AJ=CU$}mCCOG0lWvn*2=Iq(4f6KeNM2rojVzl^n(gtMznPEJZoDdJ zTSZv*BW3)|i<7!D1nBYx20qwo(=DsT%)5e{>C&8{Jri_40;T~hbt=$ZzrRLB;L`zsS$vey$Ssb-J{+GO9!JWqG1 zTXvnYi0Zc~H4fpcpYWEPS{(n@{*G|oR>@o~dKWpC7H6ZXs#CMIO>g{!}Pd^3zf zn{f}@xY82#E^9w%ca;Ayy!G@9Z}YtXs(d&e^_{#g%Y0-Dw($%zGEHnBZ^Mwru;Wi$ zM1Q3_B(@BD@4^P>VLrLz!@{I-53pa|YSN$QOrrz*8+J(_%3pss!#gPpbwTw7!yGa( zMF-KxF5E`4C_+r@j|G#m##rdR1GtH4kKv{psb@q5PR2pUSWBWmim>%?9H( zXVL7&52EN})%5MK9S#7~yDX6@_=EXjJr(@f4l`TqKy1=sJ!o?bRaoPFGXgs-+fV8V zV(;b?nMwAt4tlj4a)WyzY2UE)PjCVb`KWc>q+li31X~npS1Y-&yvKu z|QK)vp3ft zFH$anETsR$h(m@3VoEXa8l(@-c9}vmUEuw`dn_L{JX7IC;oxagEhFnX+U6o%CoOCS z#?>|&0E3h7PXJfcw|3Sm)%VWNs{iOdQa$vDJJxV~<%Rn0wPJfEuK7*lz=pIJVZ~j| zAtM)wP0uid`1>LbLUQ@EBc}qw)hw<3l7B9>13R_@@d)$sH zeZY$BQuz=RI3s$~?q+5L4m8Tn+0%YBZ(G4Sh`WAOKL75=Xa_%Rezq$c@z&{_R)(nX zC5_^oUqD*Y3}#-SCo>b`_tx=j%2MU+kFk!NXU)2O#QR?tn|$ z!ZYTc#vp>s?xNJgfhCwu24i*;l?h??DKE~Q=l`{H`jfH~zF7=AQe&iKamR=nlz4HC zA!3i-7cf13n+oNgH!ElRl$ZuyazGoKx{fOY_j&eIuB@$dhRyyPe^}lFzOBdJc{#nV z`tcIPQq{GfPHvTIgdqCO9W6N`hL(uIPQ`wYrIa!X$1nBJ#gHFodw+*J?TEGm+~EJ5 z;;%ROrxuPgkL8+A0JqB?era0oxTzd7g`NIPIF5N-4^3oDt-k&_#0~<3_XqBnKIu+a zt4j5D&$|iz%UMhcvec{}YL~r71%Yjdahi~o)FsTyp&{I2AslADV#wjX-l7UHcqHgUqnGWO#@*a@wKFW1xVMH`%AWC>Mlit% z48whbBMi$h^Fx;sv>i@(yUZHFM8K~(H<#~P}P!dI1&5w{wcvBNiYU2)} zbsT$ez5V4~g%iN}FYFgaB|;T#YzIaHds~5F-eZM!FHc8?eOJ2>bZfa%VHK|0wd9{H zgf4|1ups1*nc&ht6sQiTF0{sk4KRKi#^;+`$rudRjLeCq>7Nmi-n zu|uFWiI5=7e$jh|Y%z!3Uh59u;Dr;CzJin5$?zmuA4%lFSTT6yXvrGDepz`6e`Tg} z*p2m75qpy4uy}?EDT)ST07B@N#IIA9b1H1nh$1V=Fc!803zh8%HM05kX2MRyy_8$2)j=f<1q=I(cC%Z@HBEz#XV>c0O3eAjJ!(d(r- zV^mNp@c4ZQZ)ez|z$zOy#J1aJ1=RTB=Q?P{xNng4nGe6#rrka>29sg6w2cp0>3k_& z>wi9W<|AykST-!@PyE0fXmDYRu4qjf`>jq${ogk1Sa#ptsa&>5XSY~Y-kP_s7O6il zw9m%VB)&3dajz{$dPV8FTzHMOZ4c9O5z7nuhklEC%Ha6_R+2u9lCnDWx+ak{NWf^8 zsg~xCts-TMMm-_D0zm_SmNQr0%?7L#@M6>5Tg_s^v+0)J4(4Meltup#LG&clioSv< zB}O|NZ+1v&9G+xxBT5x1Ff_+xykmDA}lFo)oS!a8?{d zbKlg(zL5ZiiP+MY3N!04p)=lG9XSimGJ=LPzxnpibG~0sKdZ!NdW*it z#}HzOW>^PsX5PHvoOg9)tV5WFjcOvaKFq7LD!rkv1@w5rB$_jioNQ}#$vti|KNU+j zbL$f4o!Jj-B{-YG()ws|ou)>!fq65Z81Ej;Jl)@~l7v>qJa3zo0yl$0ir*Fj2VE$g zDvYJ*fi>y<<%bHa^QDLxb#736?xA0g+K1txQV*yueFqQGq|;5~E0^yK_E}xctI{gV zz2Q1o4AO-9>{Hl{OB=%M}Ao4gm&6Y%ZxbQm4 z=#JLvS(4$Z+x0~DR(ny)-K|V)e-!REhlos6$9--4`(S*fECo5h7*o#QV|pg@lJ66$ z!2Dy&>l+_LNF0oiM01B+XOdsP&EHwdk@$o-UNw_97TmHukZrDEn|cFjsN2z3$4B2< z=GMQox;4hP^cCHC=kvXF!QD;ZAQe?apsif#aIlEBj@o!I8fU}+rGFjk#)9}9zrSn? z{0JyL)NJW>TrkoIvIH7@AH|l^IL|Fu$_<2$@@$b{UBkvvRNF+GQ{4c-`7>fEjZ>q% zWy3(Ql>jBm*{>ni4&e)QKWv#_Hy@e_)fUmpxdW?{H+qK78A0_!KoDx0cMxN@Ugp-B zTbHkM2YZBDg#^D?!R^BFsP8LSoV8i=*S!z5Wmy!RT2NsReE_|E1%>Zj0J$ z^k#5WOeN;1ncu29d$HGlCCet{cgWDw7x#zLZEuv;NX6$pDwF(JS>Uci-w`p%?{bGb zq6zCnyaSq#EXxSrSS7q><~rh) z6~oc)em8($hq7EF=xEtW0U!-q?MJ7+bUO8|WnTJY>(i(^=mJCii+vZx4TlCnJF@Ji zZj(bVc0Iihb7#P1liK_8y~gcxzVt0h+oX-~k?L3HS1eJ!%SuecnRjheGQqlnJy^jl zZ14Df2^y-q0%9A%pZy6^SqDkH6T9s&5#tl92?fe>4)~y|jqLBTo#D5Wk1UT*xM3xt z<^INM8FwRG$;^%H4jKvbde`Xv#0g8}NxAr7eNb%HvH1tzc4}-H&W*FEu-f(r*$eOM zzxYsr+r3Nb^3Zs4tI6NPoKLJwD}|5;2}PzZO)m0r4fccd(SEnDv;8I(Wi1ZqHWUt~ z+Fr7MM(ENL#kSJ*2$?`#jA`-GN~XoNcE`6FI#DCGEwdvOcGV!a{&%R2S}D;SmT0-h zgm-lu26z0PG`F8tm5V{+AQS`=7}WEy>wnh&J-Bj2!F$x(+Ppuc^zo7vm0ZL8^#-zx z_;1ZKEbWSNQmE)IA^dNWQP#If4WwM5J#G& zdy|~<<;17%MimXnmef&J`MTVZe+>3_Qc|dHXpdT2tH!b}r%Fat0tLQqi0oYmD)9D8blwrZexytcTZw(RO} z+td#X-hOrWc9kbVu4&ot_Ny|Tp^s%G-oYKo)c#2fW?PePEK&V)iOy9BV0eKrk`>KOl zM$;Q=uBMpH-IbK^EAkSTX|<88HwsZJELvV-(&W>#P~t2+l1m(^6m^ACuC|ezbLqCZ zHhyZ-7SYbn;?>#E1%YV1{VA`mfx?Tc{4i4-aQu z3&Dy05i#E0`ZNeR%+B;&n~Gtx{od(krF~QGBeC*o4axV{`%&!LK6|iLMKgo!)#{bV zF_t%fU|Px{;ZQ-=ZhJ-JxMdiypmd`DphHA{?qe7K>nyI#{q$Gn*#j`dPP%0fkmpJAYp^NU zxvJZCk5#-?*!z0pTXv_VDjpvJ^-su}?fn)UZFO~t=_!8Ltt+4y*FD|sg5}ae#I~G+-om80V57&{C#e;Wj*;%Io}t7IlgHPG9nzNN;G&1&s; zbokjkq-}@UeWJk=J?(j`OJ2nYJ&!r|dxat%B#roLAw%3(FSlV7-h zLiaeOzj<{eDaE=7n&s|T&$^_^aG?oY3%>P5rUnofJt;z4grifZ{Zyljh@@VEG+xu& zquNi%5VQpj-72iFxE!D$(Q==9XXjo#q{Ua-=5*QjKog=WTL(;8w{BF^CMeqfVz*I? z^x%Azo{|}CJoN)wTRnZEFrya}OY!W1QqQQJvPjEV#~j8sT^qE28}wN^)<45pPS$!s zQKe$EYA{3DY`ILaZcY3vZZ^<^&+cvldqO+`*pWSo^=k}o>Z}IY%PhO9rcE$HWl}@6 zqHf`osb=nS)`Q;!+WOrwvm=7gFbfDPtyZFL*Fes{>1w+Nq21)H#K3?7etcM{Pz0_VB>z;@)PGi z^6^zVaKDR*ciMQcs4cKnI>^wgb2|b=Q$zo@!uU+ABnfKas0tIpy`b+=~V)`l=}A;y5D08@2s0M6zx)& zK;+5_#dikh1qfs~yCkS4`R3U4j%VwT@!4+0HFG<0>+*Ph<9O9{`?j(g-dwcBgOE$T zp#z#n`QOid`B@uESJ+g$Ve4tnZLiCJ<0E!3oVkKu!X@YFsAa5M;t2r4vjAMJ0Z&93 z-J9n_@Uwm?NXuv{U%WORONJzgyr+p37}4m^BH76ikE={y76LCQPz?)!-V20RyAe~N{MGtPsc`QeHSOF z2`1oDQ_3~e^ct8Gs=pT(`*a1F*Vqtl&{<8F3iP-oFD;g(FRW*{&+}|F##(Nav&O~W zO~h!o z%2w~=VUkD6Y41CoxD8J53wuGNX4LvDpvC1IKx=H8@@<+4T}jY#d18Sb)PXV1?{yADol{j zd=bN(c|qCmpS1{UiBOI3ENFI_y!EtaC2=b`-=U+Tx{vv=VN zVFa#ks!xY-{v7?v;xcnH?7V55_Tvey58T2dIY4Ntb8cshc+;E>kfswc2RZnVkmBS8 z-B6KN+^Qxkkb=r3qNIs;{!-)+krN@AK97hU@s)Cf7-=}3X1SB%AoWW{t7S^i;$D(? zZ|eE4jf*Kgj7arpO{3y0h}`T7W`HifK-Y|l73g3K#ZsbMBxXs3}ck9a2A#G_!n40aB zo9B}Dp`wH{?o*qk+8SZ8(uBhTS=PnKvl+m7Z1V4L+fdXISWf3wpS9ZflTc{P^yeL~ z;r%Bm9jFVyK#NNbX7Z~Wz@U22xB(0g#T30>fT|^;=26QY1@Z3$<~)IUI<>8WksaW2 zvBW6h#Q%%C_l#;XecOJWadbvO9Ymyy1_VhE1Pn+Yg-``1Ktc!Ul29b{(8h)knv~GX zNGBnQ0Rki;Fe)WfrG#Dt5~Mfj2($Cw``usmdOtkxUVA<3U7L@r#R^>9*L|JWc^=2_ zAgruF5YnmqEgq}C0l}|(3NK&b+ZI$Ffak^~1%A zx9i}eYis%p9DRL+(mQj+jN52hm<_-_Ys}4_j6{kXlS>1*2FakpU1zTF@p&~l}yr{W|t|7Bh#Bp$)Qmn>L zZwN0tZmUQ6xpqo@j>KRNZ|vhIzX1WhFo$xzO9nmCd4hAn6ImOx0lRYZw_>Xg(f)-p z0Bv&>6*VbW@B|!32_ZsE(Lz<^0ISw5^%~Qi(YcSFj@MGE54212B#fo}VS!Mg^^6(v zrMZjuL7ooLXH|F5l(P6yIUXsa+3#*i$w7o5qStOJ;b?|iygd5w$={MRSJ0uVLcLi3 ze$|k`WV$AQDoO2PC%GZ*cHA6SrYsS8YZJad1>m+cTM}B@s$WrRv&&-pfP}F8Zr-Id zXLVolea6&o-oyw^BJxvq05ej5uFx-3Zi}~ zr|yqqO!9`}81kmTsP6qDL8&xgdM7VZuG%f1Ie4@jKc*9Y=Pc;p2|}!>ZiUV8De-T&D0DGm@dAS85_ZOMOOcB?V<8-CMYJVtZ`HGj->it|{oTbt zu;^gfbk$+Up2hlaIP-+sTJd(EXBot1OBk5tJh<{Dtwe%!LJBbbhprQvJFjS)!%mkq zew|O3N^f}dnHNflKgp4BsoDo$`f}z=K2V`_V0N?$b$}id3$84S5>gC|(pD2~QLCZ% zI%S}OO9~14#Qk;c?T}6AY}215=m!NkjObRY`Jjl*Ps7qurU~_vgw)W|o#~OGnKKP0 z;7~amMQWl)x5JA<8I>OUCo%KJ)4nFA%M-cD6G5k?jyrTTSGbZ`;HMj3Ffn4T{d*p$iM3=PW2d$}gxH9lSLpE_X!W3qW%$n%Z79m_wH-AX ztN{nKetWSs%DW4b_cu1r!=t?kus4cu5E02eb5p)$Z?@_K``F10e!MQu7H+a4jI8opQ!jeIrHUEBka!R^qoH$ zVrIQgEuO#tns$|smaD7YDBZU!O@5~^Z~Q3lYrD%m%I3Cvk?nUa|H-Ja$TrAQMD8$7 z)v%y$Xm|W*|L3fv&*bBm9%dMF(C=(Co27kvh4rYvTwapR`LC;hQ!BdmC6e*^Th z(!)W}Xdwo(p0RA!MR2yvn$2_*PW@`r<0rD_|x(T zY)|PxeaSoPQ92JT^3|L1HPy1JvLjr=qVHGxq=?VH(6;S$f%I+=aK6|cYND0$CCTw( z5O{q(o&wo*w%AQ>u-g^7`zJPyg{@qi{@foJg((VP{vs6Z{M!H4eCQVD-!nj?l1ZhC zY6}XqpP^I3Mx4&&eUfwH)Ymv9KXrspA)GOY_MMR|7k=EQ^!4v(+m?UNNHu?d;(^dU z)kgF?)EaFA05;VGBjG8*gL4@$yk$TF2Apk3M5>9Z&C0YfhBdVq> zY4Qo#HwVVN*S~41aC|E4#no$eE@$p3(SIZ+K3yyT4QQ>6yMnl-?u>DvVd*(dh(|38WYJ!@P%V#$U@qAzP zO|^QPDyew63Ac#<)OG$0-ocx%rfp0 zN`UDr8&@qIwhR7w&a3sQtJfRNDq&HP1PrB4zc}VNOTqyuaOpC?8Si7o4=zsuN?fCX zT(YZzWx+CzxQ=VaPu85dAN^lj_W;l!@tZ}&yCkP?+g?DtCG8M5v$^X3-oE6*2M6M; zW_X_?ZXS=r{d?xH9{c%fImzVhv&mTJvPR<*&1k-0sdw%|{D=sS?!@hjy}(Cw)^aM$*lUESx3~)RUc- zGQ$4wz+g|fmk4Q2^_s1+P2-GlL}DY}CGI`x?Lx6mi{ABJEkMZ!yC=HqX%ZIWS;uHaHfPnS+cY0zLh0l7$wK zg$J21D>Oi!g)7+ed3$DfAJv%nE9TI)b{I5(S&+wBM=q6Od(-^5WtBsL>DtN^cO?Dp zvoVDvLRdV6s3768c5mu=uq@^6MJ1Q^BPHsyg2U0_k11m+f?0$%#|D zaK~fw&BP-u`taz*-t>vsaSty}DY7`s;tWPw@Y*AK;D3@4ZOH+2nj%Vmi8~JrvZ< zB2gf39)CT2d7Hxyr)+65M1^x1o*ReIx7FP($@VU% zkroW~^onMh<el;LsS#Szf&hYfrQcBfgACu@9 zVy*|92{M&8NJ8-v6*Rg7#4tx5fKS7i9hHIeZIUGsH;BmGDOE0krm}Dl8wN5e4TVgOa0k zJ3XsVU*IdGP}8H&WAiIepO~`zgd(XBeJ?$^|_y%u(?PR0` zH_lG?H(OL>67|+7j>u8ZaA%RuQT78Oq(hG7>6EB|J0O-c;qSE=6HpWt7FW|%tgw2v zs11)&hi||?Pm|Kir?adYQ%fy1ym#{?MGCaC?5u`Q+ABBdsS}KLvZijrB&ONEm*Tlg z(Pwyn*s0QiB#)~b`10{Vp?o3DpO66v%~*{r5(>Fnn$}_BQesl|qm*8qT~Bu*vr1LEBEN^=KrbS5OKss;!r&w(a?6`11*YPQxdTT(d#3^cT|Rgu~}7NEVVRI7d6^Ny@!T z7P#Y{*;NA>z^O6rBJBtWZxtK{S5^_f)q{;T$Y4h%qtiV6+QdC|&8u8UJSvq#TsA-# z5e9?l9ltI5E8y56B-2T>=Ak5k?AIRlJ1C&30Lf3S_jjvBMmeuMfd%ZYV~N5h^o@S=$+k1phttB z0#-w=-ccLYP~<@pP1c5HYtcco)opt#D|y@S4w=1^t3i z#=GO?b>&@cv&#F(g{%zr-^+wkh!W&SM z&vt{-QES#to22*u0~Y3cWe!^QFc1l z`ZQ5rT7f6hd7gFC%1=fo$>W0fB8zerAlZVzsqQn&TenicZ|A2)J!=|~68bHU*=2+|Vi} z*8hW(cPgjRAyMt1I7Jy#x10%=8g!~!T#FEV%61G{Yw?SBA^(K`Zms!{EjD}#N>R%X zykJySjm`B|uBJwz`DS325htCDeZ2?y$c*j$U*lO}&dLqez{%I4Hf3*LTzfsiZ6l~v zO&lfvd*)5_S06Lj+s?Vo0lSYbQ#rH|uqd=%^k=F-1j#ZLdcUB{|J;^@BvY+-T_Jb= z@<*pCQ{NWccQ40a{kSPfK8?~i`po+=>74nZ!wQbhIy~lxtiNzxFxMb63&S2vwzZ?i zek9=miln2p^`ya6%N1nB;P{g!Q4VP#@^bQ{iT*JmEYe{R+EU<;Thfs3w_B4r(i41! zILeea;F#jtCqwIe*)Y0b+r6{cepKL(AUPkJ53UddwDr1rK`U*5|| zlXAloRY2nA|cQ;*}fr5n4oL={Lj zPwH-iir&tTAg?AdfZWRgS1=je;zy5pCR!@gtdO1XHlWAT>AYOP6tS}(Lx%?gfDJLI zJ*B@c`pa&q#%(#^$<)<`e!mh?K*x@E=@EXBjug{d z^9Z#1r-F@+z=1w$HCS=-MQybqL(aV??MB%iKrRUZJZYO8ig~5apKLHoG@j}T`kNv6 z$TBCDk`|6(9}%q9xkRZ7I&yUkTh{F{SNNNo+WDw7Q$Mjt5QiFc=#By?3Pi2c!JNm- z^gGTMe;nL0e>?l6SK&_koD@aG{IX)>0<#sF?rXr9K*>{D9EE3o3vX+-H{7i*uDA-4oXHg+vuQ^{2ulu1Rpf3l5JM?jUZX5ruvjbZxT@EepR~Z@} zq`xJ(lTSgeidQ)kom=6cd-}CT2|t{M+u3^Klp5)L{0hnRn5i-f)YQ%D=#JF%zgav} z(sQ&8DjC=4!p2or?UxUFZ$NbI!`zrnx?8`-cih&bJofKrM+S0aDm$eLP1i)2{d{r5 z6nidj3l`0}E;{+utM=MGp#-(Zj8_ExTIfI*!8)iI2M9p`Nx|lN;Eq^_hE$S9?V3V?4SXnu;L-H6{3Tmd^B%umT(?6l) zE~~#0qh{b!v%1MB0hCg1Fj&2)9Edc7trJeJ4m~Y=nELI9M&2`=nwe`4L9=)7gPd>s zhs)V1Nn&~WxP60TFhO+m3^*F`El%@g?o3<2H|1m(Sui-Q)>Jw;OM&!AV;SckLse~F ze8ZoFDzyA-OP$2C5VFj%e@k4sR`dI#xAdpUFaxkg40L95WAai;=LS2V(d7E(Xobgy zaz%G}dMQYHGOooD3cZiPA7czIZOO>wd`sK%`F1_z>S{2208gq99-b&2w27a=&#bE0 zmOuUX%tFzvQw~>F_{V$E>@$Ddn=HzheZYX*u!Yrk+|W4Xp3vcF2HGwUcEa>D{b}yn z&@*jqXzzDSUtY425uifzZT0(4z=%PUDZ#4XGUsZ{O%?qsZGL?DE#jJ?H;F4s8fA%@ zYPXi1T>*?rOiMs0xaH!Y>5=ED@Xc7Ga8s3&0d$(LT)a6N@ z7p7@+seRE$=k;0G&IOwo&xR@}nBwRQ)mr&m?(2|HE*Fz1rzf1jZmd=&=%;^5_C3!W zrgYYqOtY;4EB3?xfkv}tLnS|Z1&lo5WP5K>?fAnL(mMlh)f5a8!J(w$4dbfC=Bb~8 z&y#u`wtjsZXn#P|TnOm7EnQv%_b%}5ozSD0wcPK;mL?jUR!u~tg& z#(qCf+tkH!!VScjs&8p(N{!tE7P&U#Nk-~W0rAoSz`oUL{GyM=e@CtI(@5V_>S^Ho zOVF0ge9KA3>l-Od(2rLIT?Nj?7=}H(Sf&}QaURyF^IQAolG5Oxg&e$^iG)$DRs-d8 zAf4EZx67T#Z!Tor8RQxOH~9UwV%ozeG!cgHYi{pph<}q>g&*P3c?3X|$Hs|sV|`dr zK|*@;<Nf}?@1rTe9|{Bc#g`Yw%DXSR2COYbT$B68W&BL-N<@9 ziY~n2I7?t;qzibOD>_S&tH~#x^fFxHfQ)76lpqVzpSwBH@W#R3`9D3^es3bz`0)9M z?wro?64&9&^sSaw5!1dNtAsC&yoT?vQ#Gt4!pW6GFe^RNB`u~)V<=BYfJP4e!4jcc z+HPQ?KqkT=360M(9kevs%^GpBYe_IE+A_~T*~)E4mh)dpsHZ%sNJzbvYUyWIp<}<} z-w?$LCJ1@74S$Tj8fhtUK2#wm?T(afY3Ia|?kuVeSi%>SyH+-GG!tH1<8;lX8pV^7 z=x3twsv&p^o-Po|bYEfMsP~(3I0jaO__?RyRixjJP+j$pWTif}jWp2=AH1AepOv-R z21?C=+kIeg#j^Sz?|&Bi_e`&jEO($-`|lZ60txsv044p!NbQQ$yPXG3rFMdmWm$tO zM)f31I{IW8Rain}FdE}@F{TuK8*Y9!f^8;^n zp$Pw;*{YDNTk(hO8Bi9@$0(?Z$x5$Ct8YAQiklW~x;xV*X`$&Uw_MnANYB(rHOcw>rBlu~p7_o?RZ=8r zIG1s;s`+?h?N6fD>wNJCnJN)#vdwwSZTastf(~?RM#K&{rr-2*cVk`eLo~lt1$7oO zGJ>FjY%t+`I$sQeaHs2~&XeYcH@OfR`|qTG&(LMIMK1$?FTb6=A`V|El|6f!UQtb0 zT5@XH!CH>Yyic-hYXZN^o6nxa$_MrqIQ51Y&M3$g+#L_~qiJ}D2}+?#`XC030GSD1r;oM8yl9G6eca<`nd)|@hZDFs$OPRCIf=#< zlYW@A@XtRel!^0HJqx8EC}=Dn%weC)_TsGLM|qiNFf47A?Z{yr*|xA5@y5yE#ND#j z``F5FdP9MtyP<1G$NPJxNDpKikzYc5b3-=fcJHA_XH#9$TU+M3FdJ1Y3D+)MTBgku z1CK8e`Wnq7^8S2L@2Qr$JF{R-c09TIaRWh_p=xlYrsgOi+zlZYSNEmNhU~s>xhvJ_ z9z^v}i0H%s+p8E16J+tnghQE|-l4NzLR^s0U+<{`erG@8p5-cAbhxAHm$jg7nB7;Y z?*YESB9c%M4AJrU_`Cuh#PVBn{Tm}E4r z_&CBlX8%?}=!?elQt$ul+SZI#fx)7+i4c3oiCyjpfY=fqG5>(qOSn}x@uQW8U4Sn% zX&i?;qINM@*3<7qNF831nh!UtHms1Aa&*{^dEXy?FB%efIf3TvXnr^@pw7mhNQB`tUJVBU=C-%K*j^kd}soo#Fl33kM2ZiW_ET%`&FP zr)xA9c8}0z@f`cKM&NmBYpy=n(lOEN?3~pD^BXBwFquOvTgg%b+dzjCY6xR|$o$|O zGGFHupad%r=eUQ$Q^`pJ&65KsDR-5Z%6Y)TT=7Ww zENpO7_pEJoys|^Cv5zwzHg-ubetpocfcyXCWS>Vp)+KMdqih!NuFYiGP3d)IMyu&LvCG{=$LL*5gRw$!1T(zf(QaW&D?}yzah+ON0y{ z>$99!q89o(!=SNbro5*jRc`(2)JU-1W7y2CbmAV4J;3dJ?^&(Wb(E(0w&-762Wqz; zbU*mkZ0HBAseb=W4eIcX!Q`ND6}bJAe|#h#_j3;?ZQYZuqSNPLoJbLQgY)WY%0Ch$ zcJ2({kK$>zEFV{0;i}k|o$)LCRhH&w6)!RAH@T~DdtbTRUiPh5F863Kz;{p6(Z5}) z1|bf>XUslr+Rop`nOG6^qsVk!t~*5fqS`L#`5*_wNi-U>7CvTcF{|?f^0A`xYZY_ z0^>K{TeBY_wNw#LIQ66#4jy;gwCxuBRZ|a+)kBj$Dj-pv>?#Y^YLxrv7#Acou6L4 zKbA-++m?yRWP8C`+W4&67Dz*0SFm$$3@HERI*BJ(L>M9uVTCo49t%~NggGU<(dx`CLUg}bT zWr}?Rg7WvNVnmqLuG7C~8Y}+^)SH>T^-t)(XTFBSEcHZhN&M*gPTG(1KYErGp(!Kb zmHC8vZJ5-2%FUGe#FB*7Nail!OD95zgV+#EL1)0Ej)ZQ$2lcVCU5M^&o}0OtIp~^L@7;L=o>B}pP?)vYzCj2jdhR890)`IW~wXJ<(ei!j)r>VY*P1*evl(HQP_jqU~Cg8m( z_{udKWzATJjyD$yqMAzgo;222I#uRZ4HV_4iWOpLTn9^ZOSi4TgH_Q0DsQr#x({v7 zGAXV@u`dt?b=uJzAV&Zl4S4#3(knx=* z)m=*Sgk?@r$4n>}{iz~LyO?=z7hhqOh^mKogYw(-xLI6#`#a9ARgPZQd!iw8AIjk6 zPQt=U)LyS?ag*@xxBXO=l!+K$fk! z@Kwg~m3)aiFJ&{*MYVWim2Zw(bR(zSM3w+E=Jv2;6cB&|l<(!4Rs>$@=E{7%K9B~Z zbB_PcGnd z+k+XEGq{8yTtb~$tF^|jeMm2#Qk!Zsr%%EfD>gZRB=T@7369f(Ewz}D@T{@U7K=%^ zrbg?;r>|=dqkoAFS5lReMCY!NzcYG5`mI^GnU-nWfByMKm6*%(w$s#hmIOSiWq5yN z`S?uJxokDyo->YR9X0(%WFOoPFL~a;8?p|`L#br-mq4t6?KNNl0ZV(mkxBfF5#{j} z+4(G#W;-V#+wgmaOxd;jk%yAovc_CFmEz~5Zp!p1!xWjdyf`1wtd{eVe|8EP_Dxs% za%jy0CyAM4yxpGS$5p%p=9TVlO#NO-CaJxbcFD-jn^en>rGZAM)~mJ?d;(B= z@?{0xMNUZu9Sqz!Z6edUM!mk7FFA{xGZP!_R zeb#DR*JV%~4qrBKZb7J}Ei5umbAMh5r6O&o4^R@+sI_p!fkHN_7HOzrc}xdzUNAk+ zt`}aB*!nqRBTKpm(xR${;<%ePKl*MgbN-<16pWCr zXTY@yJaL4fO*Q-%A|lkFAxa*mH(ov%;TRQ$qN4L-gx~bINdMiq429cYCSOa;=|S4o zmxvJuR$^>_e=&J+pTEzp&!)H8xc}3mvL#tqssL;-JO;Mm>`6Py<>pO7Onws>r*po;IZ`0OfALbx$(7uTGA zLbXLp*lQ)@Lw>6fB)QK9<{p%AGjp=1G#u>$M+;IT%1c^ zfV_w!CpSDIU`!T*UPa_KKuHKuX&F$7TNVp?jTQLp2jR-)!x+AHH@7G+@CpW-l9Zq! zwZUmYBn-DrpbH2U=25G(uS$mznfA`N+7;$+8Sd}ISC6F9O+$uIYFxJC6WA+(b(wrh zJ~=NETN3-)WWWLs0OHHHPw~^uy}`R+@F^zq>c!K*jE4zbki-|Ux-zMeAP?k#n?QeC zb72E$a<~|{#-~adSh{?>FXA=6{m!@PddK7j4dkwh0*RmHz%rmj6qn=@tW1d~n1GtP z?a{(Ol?dU4^t*PP-3TTZ|{x)oSrs+v`(;Cq^9KRyKV_)o}h!vkkBnLx7m}S__LOgYZ6^=IWW62p0Zjn zgsFyYDG0jSj5n^;`ze8=xHdhr6O$>8ch^RJswb}q7^J$U zza3A8MP+9W+G>b4RQtIX!LI8UleuQTjTQNmE%=>qDYK7LO!K6!;b2wJ?W)@zLCb4^ zVz3a=V590j0cOs)Py6vhqKtU@OKYr3RTC7>zx?RsM*<+$IWg9y~aOxY{S6o}?0!2w_#JJi|| z9fW7(SN~Uv4pdggoNyr|fit`c`{5WW>srb}Xnza_Q)mKw+xobqKo)VG|M9 zzyQhbdhfNzHU&~?#T0==1kO8Ycf2TEJ1XU!w(jYt^jZT^87%rFjJv(m_ym}1RI&98 zE9)T2_+ECt!;j~h59wKXaqQU&Q~}~CkphK--P1sYY@@8@Wxbv8J*SSVd;D*QTDPaQ zbgyR4_SsV8gs+t9kG}KGI66hb(0grxlmTv>>EgM$EWkUYWO{juO+iYeTx1&Fu2XYZ zaQWFopG~6vD9|^G9b>tQ}83l+{yq9jcI-93|(-*s0)eh*%c~gi?wdHj=HQI zLEwF~_zg74qQw@Zn{qjSod+x}w?#IrXK$&T25--b!}& zorC+2+*U$P&62<(y9xV(bQ zEkuHSZ^z|aFO5%vtBJ8uI=)us_yM{pPP!{0HYNx9(W%{{kg&Ao{w|UNAYIiOzzgKL zN)N7hFEWk+l33V%Pcod{@(84CQ486aUKv~bE?j1{@#ULpbHkW*%{#}IH&j*SIn@bA zacc>S$-vH`nO?@)YmwaPktq3{nRmW`zgzr7uK7&X?Ibh8rsPtbmnl^g=k-VLX5Yv$ zx9u8i3#!g(Ch}Zci@jzAA>Ds^kWYs>kp>VaYnEAao-&d}^WLx9!M!QBTp!4rjexIT zoZwEoQTs5xr2)WcR%6>2Zj7_4R)O3K#@UNAHRv0B+b zGk@skh|G6?KgMGt21%fS0SkNewLt@wjl}A&z$9+A(p7oSH zi~rg9IJkg)=;S%c_QBv1hI0pic|yFVP7jSE%i%Bc7jJhMT|?14kT$!iaojM>sFUCs z$NtB@>sBN4wMuRQhZ^P`<59BLYj0VDmqfJO5r%uk6oz5J@tT%^1~%E_qmtUGZ(vzm zk9ZevWbJM-&_2Gl=Kj)*_5b~(cFw;?@#>t%HiVtv!>h{@LVQ2iwFMc9OHL9diX@?y zWp+g{>o3J4?Q1&9AGhj@>0Ui_eKk?vE&a}rgMJH$D}XFMgC1yz-cc+Rb7D^5^WT7? zO}6{HK3k}dikF^P=0tmx2?CCxz#<&iQZBC3 ze+3kQ_KgtpJF~i=J?xuvL-8#^eD!t0R@aI^{xGH2-$XzZNV32OFAjXC{BEC^ft>*-Ru#a0W*VIq z0p+JcQ6=3#yAF@)=E6r!2MyIBRn6BTS3`}p_(Vmh;`LNq0kD#;{obKatlZ4O=io=I z>Mb!@kDIi1K=W;lGChgT+)8Q)<}-;MAD+O@Ww++)<{EK6{X*{ zPYWq~CC;|Vbh3JXsl%AjXn!B7=o*w}j2VI};;PD3M-c9|-2vS%dp)FmHg)6D!U!E8 z=#3G*JVyYqcvr@_p(O|<(DYw)q=tklF5UAU{z){Y7U{4s6*-Y^u04eu`VoU=pa% zEt52-xgW-yRmTgfV}>kY5MP4WWtg6UmKZl*d!z=S5VSGcAW(F5D^%G*0+iCO`^}*s z(QtlQf7g2rwvLNmOjrYun<5lKFFo&aKMc+v|0x zbl+rh@)B#4J6$)7ejbYj^^==}o>nHq@eb^9P+mQbYeX15+2Y}Gd%MMRuq>ZcKf~$1 zl1)Q2tBFe5;a4GWfWn$$(6Xm;{)j+!=bU>htc_KuQsX_3{cfWANWQ57C@GS-%jFWcP7NWMRpM-ET_DkBBs6NQP8P>f!# z29SRQxvq_}-B(R0w@B8I)yZvh2HvshoL!{{=74gGV3vc()m>fw&x-QQnF`5+wZuF? zQl|h-FpWUlfSEBl5!%J&S+!X-^hG>#D^jFPV{|2_sXEm}j2IiH&h5qo1=9=^#VT1y zt^m&pw)gyP2g(@Rq*cbOQK?9)_yV9vZMP101JvT^aOLF^EKD08;T!ZSjOgXG7s9J~ z&_vX^1@^vM3ZHWe7KK$&;EYa+b%@@2uH#DmGBUaQ^VgXaj~?}Sz)oKDT(vKDYfTqh3J=Siz#QwBw?gWKnkb`{ zU8BBZcphi5D{#sbu)uI12wsCNA}KYLFtu{!TheYRo?Ec! z0u`V)+&Es+Er{GLLhkBNgE9rb8a9 z<&@2)f z!a}1Ajg5lB1V={8u0Q$zMyUHUA#(v60AE!ZR+h^^8Z*6^;g<|018Gn#hm^qR8sA<- zam4XY-e=lSa%+(S=+C*L*F7ofaFP=p>YfRKgc|!o`D-2MFum3DRstMO#@BzQxp%Lb z_70+T>4EVmpXAiQotwXJ^^{#xcZ=pBDA5kWkp7v?-1KSfUuPX#@r+$qSXpAv_x1Y zzOlViQaGW?po4EguWa>eilp~8Klxl-_-hmR($7e^Xwr~b4_s%c+C z`l5UVk27Y!)hxx4cm|SIwtE2(v1@Y%3~OTs3nnr&z$HW96l;1dk^@9pF)gPTl+KTdt3{&oNMR9Sj?fgO$UnZ~vL!K~rZI%Wow2h?Z zAf;f%`<2N9r+JQbuvJFGVxXc!G0#|hK<1t44hN5zGIEwk`{DcDApAHXkWx0>&kb=? z`OE7A0p)bF`TN1(CaVS}%SOHbr#l2x+tqM!H#jI1=C^|>Fl1S+7Y=%yITxzj4RQ;V zO-PP4xaIpk3g|f)Pud2+tPFJg%wY!Jgo!MZ(g$mtes-9Z?GG?7wo;CAYX8Jt+vjP4 z(E?CwaSG6Y9zUw^|MTu2Rl}U%%4c#a=;L)eyr&5M_8Yx+t*cHM+;BbXvZ@9Ey#l=l z$U)jJQx0!G2Gn>>6xL<3di54#r9qZe|LND#jY^#%J7;g(HGy3W@w#G)09=VAHvoXU z^JwO19BD%eDAX5~+~WGiR5Rng($(r~HT;i;Ke(LiBsmdFmj}4^i@4^G(`SU3fiN~Z z^I3ve|70xvE`Y&bY%|I68?B@}Vg0h6=8mIRKhX=^tVPc?f}G#i6HWBz^CCp9@F4bPtI{Kv4iVs>oO4!MGFSvm)Q|{yXk&N82`*DkKuX2Oq8*v zy~Mf6V$&UO8IRz|$IFY>{>D{|m3q2wNYyCsmwSyr*!zl^1mdp>j$g{h>_S?{yw+MO z3tfw2*5UbPzh*}xCEgZVJFX<$(&Q0f7AI{6(N9;tBM4Uh#Tp3w+Rt4V+a+?~U895@ z2T$w8>!m@#+dMq*3ozB0TI?ER$x*FW@A&v#0-;A-7t|%35jmXJYzDMBdaKXMgan5b zamX6M@?1y-HG-Rz!FPu7atnv!f(8*dv;t0Oa?epwU=|H!MBA1cmb}O}+{Z0h({Lqr zxsY{^-dX93Q_&uYF*iCrR+U(WWKtyjYoSixCrPN_J1DLaSGllaT*)w+083uYDYa{JUF}dV)vCoLd|j{K%7q zKdN00u|5RM45Zy7`Z>bD!1?BT$`h<*)Ule=kP~(=f5^Or_PaZEPyKb`i@S1I%!8$? zq9b2l6JONUVJbP+l38T}0#kQG7=PP8f8L9F8ZdTo2LxrLGc@JjzqLRL*k1(#7_bdw za039n7S++a4znnikcdLeq#j?d~7g<#srQI9$8V+REa&zXXsD0~AeT zM`~iXb^20jzg^8ALs`A(VpV7RGA6@lifFa5FMH!`!F;WnkZeu)Bm9C@=q$hU$zfC$9!czOG3MOr?dh{)F~iW zYJ>ab>;GhQ`0MpT^(5KVUb6zkciWg8%~ZW%b?cZ?j^0uCe%1eTo*Au0h!E?bh>b{d z-<+7j`InfFbDK***MPdpQatr)9d805YGok4w(x)QLI3Z+C1Q`=%x{Mm-FbfSn?GmG zAqo?2uiU;+PXnqyaGRiIv-K8-bElWr%XSlwPGIfj~fMN)xwvO!Kea2t8Xn;LX4kzPVMFkffe8J9|Rf424d z_)IR3<^c_=amkg-J;d?HF6%&^+6-I4gqBhCdH~ajf25ujyA%==Ohxq;`a?7kjS-O} z?ex#K)e>4b#5(;taeq-GR1E5;J$zUZ9$2GCKT+o<9ci8Q64Yc>-6z)*e5XZPC3;|{ zoX5(Yfyvnw5dCqD-zT}uJnmVlJrr{$bji=BJX&1_6$90;BlrN0TpV>WXXe{$Z2Q~F zXLx4>BCbB9?S>f%4^0td48PaIpR{&oUYp7Dn&{^VO=tLZe3BhsJCf2s@=_ZyKIf>e zMuq8j3FY{$hUd`bHi<1&M~dC=)fs=;mp*m>n-S-C6D8HM2M{U62cOYEHg*vOVQmdv z&;fFi_f$S`p_fR}k41S(nZ*vIp^mA0sMf{uTibm69h>9yI{r>aC2|_DX*;x?eA0(4 z{&;v6@)&JvSVB)yMi@Bj0cBojsyc^b?E^u(z3cq+DCk+F;>ajGL1Nq;^-b4@M)rbk zf3Gv5RXGNw9BT@;xE7K1@p6VfuP^vhLx^3%Jx}KZ85ckCkcuX-tE2qe-uua05O=F^ zJBQ+}1<^CLEAF%kdeGCeGNk%7XS+eL%Mg$L;BZt_{URnWtdY$q`x$^Oct{>%JZWWJ zWf)TVjCnJ?OxSUSJH(}g>%p|ZDpW2g7Kop*JwI^KCuAhjR+^B%^_>fOKBysT8|SdD z7{Df11P+1(<;ff9RjKYr=>o4m^F3bHE>Mc!Y+`FGlsDRB^C#ozfPMO)-eDnqb-Y$X zM0ZEh#nG&?f;+y`Gbs`;ZA)@^9abGlav0-e{Hh#g9__Ya6XqIVFN` z7(IXtVE~RW-z1SaTx8XX+apq?>b~JqRbL)Cjq}|)Bp#_Wsg9YFerml!uPH>?uLvmr z816q+%jNC`fA1@Z2+2A5@e(zK^oVnX<-Q29Rc&ivWyPX~sZ1cGIW}=K>a6mq)uDB>S>HJop z^#qo`2ABNsB(F3o*v};^|GRZwRYd8rDKry^a5>D>)Rg*j&aM7nrEJuSXtauB=8BBR zrgxW1M6Ej8fvbmciuxLOj%4HdHWzKX?Jj-q&;|4c&L z{lWwxTN$%sbCmCH9n6gG13*L&bxqBK(|Vg?g_hp#jBAcJg{YvPyWrCTJ8O?M>_g|# z-R<=lk5DoPEW2i-44ZSh&AxxNYDn^=IYKFpYNcmZo#%_Pa7c zqX7#v%A>?SL=}LHMU%4J4Ah6H7I#MGjqZxtWJx5MWT|-$+u*Aw+y^zqo$!KAP@Bv= zhdtd%=5l}K-@LS3z1B*qGL)K)xQod_XjpzhpF(yf`jaz)JdsX96%NziR&dqkua5^< z)LhT95{?hJWnwa*9$enpJ~7jHvaK3V6K2?FCfzC5n$X=3Mn7^!UNF6g`J5|LGTI(N zk%8y1w~&DoiEai*TAGc$LZDZCpkpxht8&gobbrUWs3EvANJB2gom$KKkN?H~tBxEt zV>Og^OxK|{zi=L1Hy*wisuO3hWO&XXYF5RJms}IfWt;- zGE@wLoA-M*xN+Y3;q`8U9)rwhrq^U9v}CSg3xs9WeR2R(Zg~@e&Nm9PdOq6fBWd^6 zT>e!XRoEd#PXkhwANyq!44uqy(!|lFNdG+>qqDDdfO?|kGd-p)_}dxV!e3KQgp}2F zZs9+tF3{k)%mt#iD^k8OSG}PkL*NfBvfCb+*XT+UzO$g?!)E6OL)#DYeJwzMQCz>t z*nB$O&r+0stEDOxQ#%s&YJ}K4yn|gungSLv2WpywgLrBHdGqUb+JP@-uBdtF6bGDo zj7ybvcQP2`%?(cxFCs3@DzsqOj@2Z{xl&uA$k&Z>WjEi2e$5>@DSZIK6Ayn zI;xQXJ2>1p*}>`?nRzTtyIx=v{3f+z(_lNicj8FAC&%T?PVUWQNdwQfnvN5+^X7pBm` zHk1dm$`%1QrsQFD%^1pQ$wkq>0bYkn=0lf;i{fW!9&3s=Au*g2(s=VWt6cc zf3{2idTduav`sq+oaB>74<0 zUUskx3|Q=5=C_~x=4;mN?4xo&VL@G(bIC8zDN2<-A9yf1GY*`=3Sl%jve!f~BzKK> zEG2d#Zty~^t7snFuR_YRPGrVUOp;C;TY_Cz_GohIovPRmKGfpQ91BQy7UCo$iy5}%y-^FghGUKO+cVYp7jke?{yNJIr@8qrRX+Qif#OI&etTXCGhDyo zq^heV4UxW4owK>AiC}Ij*N<*lB?iX2=6%W%yW?s))`cL+sszRCFFKwQqD`=wc&Ju2 z<@@ODi#<)x2$n%;yNWRtC)^NTNE1rPj{q+(4KfTawu%I%vTwNhi(~4Dhc@jL{47Em)?FJyY#Z^mh&8&GX;YOWb zzir@P^0vKp&V0S_RUZEjtHYTWMr~xnDo5Y6;zKD0sB~^!V{`~EwS4Q&-(x8rhlb}g z9RM8QM=c@L{(Fb-!+#cVz=RDeMLO2Rr`{zADdp&(Gzz^@@~%LFj-&PUhvV&^)IjQj z_VH8S2j(QL^@z*H8DtBAllb5AfPkQb8|Q_7n$wb7ZO?e9l+GA0IG7J=?bW{==&u9i zVB$`P$Qet#0l~p+KR=||!NQ*i*Ob^zA zc;6crHc6FrywHf#sIFpdnkFKqlfy+E+NK`$kA+@{S0h$ojSdTPsVXhH3rmeSg6T51 zw&*9bR?}NjQ`h%$3phB3b*P6y>;Y(gUI%@kvXZ|#sjr&!XmO`lrj_(?Lt!3AmsoU- z%B0v0&=#zbxKOvfpF5^E0-U>Q1f$yWyCRR;rgUd_xOf0>!YuUcETWK>Hi4?U`%^$k z1}VceS$ZZ;5Uu7f9%?=ZHTA|*{k96?(;vrVnhYvFj)aUPZ3_yBx4Mzc^egzT563Flh2V%468SN(wB>tRW?40XoVBh zRUhiI8yiUj91J!a-k4YeU%h@qYl$w+O76D2?IgV30v2)iPzLZ^!*Y`dgBXq%S&-aY zHJTv%?Wg2U^xH&(@^Z}97?xJY9T&1H=Vlb!__i z$ySYnL)`kOr?);&Wq9tWTXtB^rr6C7*e)iy2K0lvtq(vx=uo?r%$SxHD<@T!#M>x4 zKLsxsBE3&f4NB101iPi+^Ff+W%HE~ernQhEn~ZOyz;c@I&TdgnGtXCT#ck-tC3<)Z z9-h(NF@P8HCF}4Ut8;p`H1;>7>wE}1Z68%}lcl3CiNy~yfy(?zC`2AK6W8;&@Hx}M zXb2;+3IH*^kqb?vMojT}Ii>OzI*~vF+J$dH7V21aC@7#P4H>-3$nPDFEQ3e!DaX2a z>Va)0l5@n+23gH}G2SvQ9cfea2S0(qX>NtLv!V$4U~C5kqw)+UnljPZ^lpQXpwk^% z%cvdBFEl7h_x1}k2I}vWODBBYeNLTvv-=HPgbhllB)tEfOH+JIs3=ZfOw6xN9qX5F z-Vm)6*FAfkXe{dgW|uRIQjwRuPsu7G``~#(vzo0^uuUDl34;x@`fP*wK7<~w6j2h@ zVj3`9MdR%K+}6)Z>>c+c3l#no)!sRRx3TT-8{1;xr|2~OfZ>eB;)>xrwE&}0fFg=V zTd<8OqDr#dO29kmc+ZuZ8-X3?Yy9QIcIAJ)>l-wGnYG}2W%w6#fS6y;u5R|FOj&DF zF?OB(%3;LImD`%K>epHJe)vR+R3b>qV8}WwsdpjRlcy*aI_k|B*_qxR3*uLZ$&G9u zoU``F%n{~+K#n0%kIWcDn2$O$TD@WKKaL@W6kXP=)E^AH`m|2_XyPyI)d|IhVKJpN zvv;l+yC#eTzw`Pm@q(r^s?&j(F-aSh7I%0}FAs>!6?r)$LqRRuiWO9&X?E^xV?tS* zGQSbcM_JuInmFocwJ7_dduE$sS)kW*eWs$s=3XSIUoY0$htzAW4`6-hF3(Y3Jze8- zu%D_pTO)GLXKFfUVa;IqR#eeU9sWZm#-WQ*Z;B3HIsYJt`BJB&plRokj547vEQ#cy zM1G4WX07N>(zc|Cd;B>s4nAn1D8KE zmz2Y7A^vT%#vnR8DIHsssqVB4f>ZsLt2i0GhG~gswn=4!c0S0eB*ai+ZvG!d3dEEe z+Ul0v-lFmQnUVcrM^QO#!5=i{)`PrkJ!~=O*Mw6R7V%O6mf6uaUE`5hPfjm1Q<-~{Wyx@hZfXo4V9A`sC=G=Cg&8qJ{^voW^l*e z5b0#+7su7TCbr*q%`O#3OE!{uc=L%m4r756Zt_0qJk%?)+?Hc+qkSrdCV~|@2`IIB z;cFD+<>CdxDuWvtCZ8EE@}fm61c1;Sf8k~n7oK|U5%ocww^>?I77GbH)L!^=HJ>`Q z#i@sI+h9jcNvcrED>VzAjy%+6jeC`84b3R#<)vO%v93oWUy>GW@S%MHtW4((3o#6q z`s>PTcEDgg4vk>E?sD~Xez=B6%Mdm2O=Acwdb(J6(~w}S77o)-UdfD;3q12^{hrLH zfi&|NZ0Cp@T%R{>E>kE++M<)`UE`{y^d=+O?1pTi{!d$%M{K8YJ0jDD)oRrI0esbh zuI~KiEr^3gdx}OpRl)#W&obnba0y5-a9DZm8|2B40wPoe~5; zQ^hS6hLf8R(`dMf52@ZetcUI#`?6)GJfJebLSfjI0+s>L8P-U^hKy?&1kM1el@$1B z#B~xkM}6WaZ+OcNzpSBW?~9>0Ur>*ZUXILzsB~1|Xz(sqo8E5L#fg$GxOl0gW-{zb ziIyH|C20;fqq!2V*FRE;jbUzugHq)FDs$oLa%XO*&MoF zyo45Fo~#S7s3!@n_UKO5*BB8U<}x8n$flp$Uz_INb)Bcg8&&$6jgk*lBb%>@bLkFh zkLrJ+$uGdL95@3_h1*T=!`EAPam9u8=~peo)uj#N6x3qKv^To7Ir|EaVaa3Gif zO!A^lj&J6(m%-cU4T-O_e3i@pXZn)5c0;j;8>Qha|8w#a6 z9HGP!;I{p1FB*Mf2Ku1B}O z*D_CbLI3vo)UQ#6ju#@u@xyHp?ZZw+lISLR3u-pH|D|N1KUfp?V)glKLk4>5D$B#KR$eWfgijngd ziJ2s!EJ~6e+&Ap9F)U<%vvjQ;{b|YYMAH3$&>Dohw>vATQSO1+OIM& zLAK?!dpA((iR$ie{isHxV(`E~ykGGqY0mBDUzOtj)rNB!**rarmr{B)kmMVBKMe$7 zZHf|mc*Q5}z)22i-u}a*fDO);Yes{|@hpY&kz-x~iThl|Jxxmk?fSmaEW4PLIg2}~ ziL_l~@i^HXFS-@x))`OcNpboG7>0r?8I&-=|I|y zCI;dTFZWu=UYgpDUKg=C$Oz{NyJ>w1NK4XwbK6&TmNESZFPnvZP zsF*lIi%Dce+EOe~6^08lZ1RRv69V{EMTBfmokBgx)=e}%A4f;DfB_Z~bg(ZnAKLHz zzfY|Ta9OIa+#(p1*Xd7XpMF!2pr;eR;fz}D$9Z0hGaKVzVv6|z%-#E<&5p1B$Iy$f zdHl^ekM?zUekeZd)sCQElsJz3r+2=M3$Kj-EZ_d!Pyc+-(L1^{ZARM~|FnAH-t|MV z{hzUes6ltC66#H6tSOpLZj7c>0gi*&+dhgI51%7$%gV+|Gzy%vFM%^|hp$Lb5si}Dj!0qGqXUnHwJ&Nl;>K0))(*D;mszezn785X>f_uZhz@>X-U)OguEBlW{Y!_aq{ZObWdvIxV~zp z)KD$GI|=z=vL_c^KEJfOnFMcqSNlt9dWWmCo1~-4zQ8XU_LbvRERu~L(;$uI;7u}dj?(l?S9YhjecX6 zrgP%kxs{iNc(_AUI$OF{ZC%l&a>Op^J4wL#7s7v|Kt(T)5QqZ@gAfGA`y`c@Z9mpH z38`(8H3;>YJ8u$XOq{cZ%kfNsAzg>X$(x9X{L14>x6f7Tbhtr1Onm!A#Bw|>ikAn( zN}WnuQ#4<_jqEmj9l17+mP$+f6{Xic!OT%;&qNwlt>B6%2WJ{Sj{zt_d+9-|cvLf% zaKGs+DeVc6J6lKqL8IRbx>gb z&}#DLZ4vWV)A!%DWr~-0M*0jmFW1GGrCMG~Rf!-E(_$Sa%TB$6RJg47wfl^+)upmt zE684Uh=_>yGpdI!Q-~D!UVN6+>*QV|qhX(9R_dii{~OQ6OO^N^WSYWAMKghPFXHaX ziL#^F$9Ec7CEc}4=?^Mm3$06!zN1&@D-fW5QN^@;D4k|KfO%JYl;G2A4(?z^;zJ+x z59f6$8FG7IfVjl8ULgVkwt5?yj@;uGy1$`{b8?DXfR@cV{L)>n)3WF%tXEewZEcFj z6i!eBo;v-K`Cf5Hc#9`h_=>tsE3}<-R)r)6;NBHTCf0{q|G^q1yRHe2?L*>}LGYWQ z#~fkZGqz8f*VWd)6Ib=Pm2k(v23v8(0jQ|Js_!Ni^P_Ol`AaU@D)+(Nirb?M<$S%8 zJ4W$w0+V9W{T&0Drq;s%&KZyl7Wu2}$DLT*$S7USVOmGmryvPFInuPgCS?aQMB5^JA z1eJY`0-vv+?B5^WN!vUSSz@IntdB*cx&*_kV)rU2p3sa)ap$y3!gtXVcsG85%;0H zo#ronHP1U&%2@P#C(YMBswkS+8K=uO+g-|IU{blgP6;}AWF)u}Ok&`}B^{!WdHb1W z+MopwFFUhJ$7~OJbmX+(#O>65(}c)DW6(mX5lv7wB4-1Xpe~y`+EW=ETrjpo&&kO6 z#!;qj!GFck?y6zHvIIKEIbfu^Bp7d@RpY8VoH$q!{3PT$I;pKjeB5WUDD|Y|Kt=bY zvX$Mz>D7MK`8f-PpqP!vGs2qQmlLZo7QZPwUW%YAtnY*x6lEeq`vH21G*0pl2E&DN zpXKxlEg9t`didPHk^3j46M)jn&Tx?8ay{sC(bx~k1b$oWs&7U_nx3Z6kX~tJ;{isn z_tLAH#CPy=Y-IoFLWuW5WWPVV4iP^e=%+6Ru4??Ebg{{oJ8#5G&1V@_J}mg5eHQ>N zIlo1U09fM4;kEm1w5|_Tv&_zdTPd$`(+PZS;0xJvY%wvCRcH#e@S)O8I;~PI`R=0| zaUs7Lo*w%#@AX+eagQi?u7%LFS!3RU?kFy29`j?EYHweH4I|0V!qoQ?vSgMS*<9>xoY5_C|9Lq}!uzuz$lVG}F6OEsYJUhMk4l#xbehKYmV1I7lc zW12`2WRYY#qlRl9P;-V!AdHm%=)sKjk#~fcIPRA2==){!vI;SN=3!I!_1FZ{0O({G z>yPLur^F3EfueX+L1HDyV$^gm_7|=e$MlX`nfL85 zRqZ_B@Jc{2s zM_n5Ps#c0A9GwBtyGMS08gu*nCQ{`#*o|U))<)V~+P+myH6Or)A~iD2tfr)z7be3@ z`B-xoJ0uA|of?V3GQXW5F2lvoeYTr(l2O z9^b&N9I-bsv-}JBZAH#@itxf$yE+xs)`kL^XK@{*O^2GCz0lBWcJBm?LV}W{Ck%X4 z57Yg7{Ax1FOD5q45!qI6d3cnG*{D4X_U?Ay=X9&??na|7DeRyr_n}dRejN`8UU1FP zDHtN<^p1lVyO#Zn#i???n9o_Fha_aQZb2>dE(X=nhq zc*{&de@#~=G;pM3)F(eeGIp*)#cVHZJSqx5w7d-BFE;sj>;yap3KW*q(-^KD;Iqx8 zNj!Tf2wnH`8}63$@gV-0PrLVAZLxGyRI?=oW0kKs+Y#GDe|}OgX1h~C=`iXoha}-64CS#^7(!gV%=<3S5N4>88y(2+WLBUh1BqF z7xn)53wtivWWD{jPGs#>bo;p|WN+0H^~*`*o2y(n-AIuBfR?gcJ(aInQ=Q zQ4*-=n%9ZPBbKR)a(jDm54j#zjBuv!#%3E|vTmso6KviUysEDn^Dg3SqJNZ116g0&=KVKHbGCRg^zpvAts$pEZ!Q<%8G29Tw`Q$!G8TzyNwDJskDRnS;eDfR-u_doEX2%`JJmtXX8<@ zB`iTadB{h7YPC%RaGNNSF)$*D04Ye~uh;^HJKcS+@Me$ZfuwkPDR(E^PV4%J)f6t| zh$&MjJqKhp3+G?mMBcRM8`_phxa!LXDiszsHcq|a%AeZK`!GW6g3cMAKMNin?SXVa z#Fhj3-AMNJ@K9G2xxU5?F)8>0om^NN4mPZ&iMT;3as{QUB56z<0ji?|MUgOqAHPxb zkhK$3K~~O~mA@lRMM3rTTFLAr9xK$WBo+$ANK){PXV*|2@olgu*4$(q)}{E~1zLi* zHHf)3B=wLJp{0@ZHVP!F~O31;ajO?C%};px8O}qsmWz@QtwEhkc&eBIO<0|TmU&G z&rrCC7hh+WTh6UlYJ=L|!D7MqL`S=^Dh}4^3r~MTiX?4kRL(L;tJLxjL@N8Dtj{*vl*>zsF3EjX zQkD03?3w=Nja6*6DWEEG-CvGHN9OX$^P4>n)cinu{z}0C!1yK=MN-gI=huJ!U*qCI z97d~h`1ijvAcX5<8|h*sZB)X~f5X5(?V=^hdtn&|k*5#=&&si-BmA%WLb7=#6{eLY zrJ4i(@auoQ@KqlFHPzuu`GUe9euJRiB$8C&axNT)#GOwrle&&;tHsO#PZJTXh%6{j% zxL>p(N*8_KwEvR+3DG^U6&HJY&pg>%hr$SJu~k=Rb8< zE*;lzY3LSwVB0R~+Nr1}v=wCPoU40S;g{p>z|uGx5`TxytSRjKE?{_eSpcItFRkM5 z)9RUR{)X$C@ZG=ZANFr`Ix;X=uWxMD^(B5by!1eA(s7?Uxy1EDPw&4q=%3n-v#<2M zBA+mNR8lP!tS`)Cp`L-yGdqYl_3|YtRfwgy!T2TDoo@3sD~$M}4MZ&3 zspann-zixLG?JfVZ*4BE-o85n@^B6cP!BI;cqyJk8LHmC=MjUAtj$4NfjI_8Qo_|GO48AlE#D#rjn8C$5)RF&w0dt?)|UC{!k5OVTDcoO>2+E> zZ~TK5drn=s<{h|+ZZBel`@-`lDb26f1-aYg$>=k|t#VHV3;TG-C&luD(H8y-^?Er{ zq|V@0Vt<-lcsx~$sou0**(-eNJr9-2(WGt~ebe0H`a4&rH_rp@iwq><+q}4R8L6~Q zm>$cCjNTjvu#H3MHE-XuRGsTuwU_w-a8-+Ooj6t}P#T{pw-Ajdj2+@~L({ATV5V`% zi~)qgGx=T)0cosOFpLYSGeK{5pj;v29_RHML zTPa>7c-KX#9P(I6B!1p*!v$^Ld;1Dc-GrWXJLHII{LVF>T#Z9LzU6+eD{~LM%Dz&4 zb~#r-fBxWb6LrOAE-%E}R1-(A-hzlqtQ*72Gn|BPgbuVgg=9u7cO4B4E!0nLv0fc0 zA|iw3eN}x$Ee~&Fr>32q@Q4A9rbop{ZA0ta=Zn{o{UdDpWvVhYW}_3GR_o*|7%>ly6>*Pxtv^+e86zOdik z1JCL0S1;wlz;2E7`(Fy0e&oV5{QRfO;@BU{Y5x5E&#N83b9wLhg+1BHt{LY#kIwni zp?})phvduw^~A1P+KN(2TIPrYHaDd+-4O=c1M&aPwWsg6ZSF2px$F`X)H-}n8qVt5 zWhd&{NJTkHtS*Wx^39xf)fiwl?}m!Gvsm6ml$Gtb2j=tdUgyJ8Mity1xD6x;AKIVQzVe6|Wt?C_9P*-Dg8g@m znV?QQ171`0ajGI^Egn-|L$LB4G(&8tEBl1*S~HrD3Ja>OZ*7@Js>+4+dM;J#Uy`w$ zY_}uHIBt2T-Pg2TUcyo0GhUb->e|$uswUuhO>J3znOC*|0Lh!Kr!!uW-u_@HI1{@n z`jDlMC4=6`==*fZ+#GVTtcHVgQIc38@~9-G?Hr%td#x`9dRIBVS6mg(iAv8+)Yz{7 z&NZPfn9&lxJg_Ae#d;I+I~Sz6e`gtHIA>DzDaJiFBSoxtQc7wFHwC7_Cyk6#K=Ix4;l=ARl?_6e#) zFEmf0fZD+=jM>q_-RgdWM0))78&qol`;+071%2H~;_u literal 0 HcmV?d00001 diff --git a/browser_extension/icons/icon16.png b/browser_extension/icons/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..83b09030a28aa975ac441c18f387661d97179bac GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>~IqW5#zOL*qx%tI3%^a&mWPw6Fo-U3d9M_W*6nKF=0|v(9t6KYj zEY%X%h?11Vl2ohYqEsNoU}Ruqs%vPdYiJr`WMpMxXk}`mZD3$!V375)J_JQWZhlH; YS|x4`(p!!L-Os?_>FVdQ&MBb@02#kTEC2ui literal 0 HcmV?d00001 diff --git a/browser_extension/icons/icon48.png b/browser_extension/icons/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..b59bc4c27b2dc47845b609e9a7e782821873e6e6 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDH3?y^UWFG-iEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)pT}UnMXwSj}Ky5HFasE6@fg!4}{X;>y7A9|)@N%+vvj zFeZ7syDg6bF3DT1q$(cx;TbNTux4qV75xct#A zF`$HMiEBhjN@7W>RdP`(kYX@0Ff!FOG}JXT4KXsZGBLC=HPJROure^ndRZTWq9Hdw aB{QuOw+87g$AKPTVDNPHb6Mw<&;$Ti)<(_% literal 0 HcmV?d00001 diff --git a/browser_extension/manifest.json b/browser_extension/manifest.json new file mode 100644 index 0000000..fb9f285 --- /dev/null +++ b/browser_extension/manifest.json @@ -0,0 +1,24 @@ +{ + "manifest_version": 3, + "name": "Scam Protector", + "version": "1.0", + "description": "Proactively protects you from scams.", + "permissions": [ + "activeTab", + "storage", + "http://127.0.0.1:8000/*" + ], + "action": { + "default_popup": "popup.html", + "default_icon": { + "16": "icons/icon16.png", + "48": "icons/icon48.png", + "128": "icons/icon128.png" + } + }, + "icons": { + "16": "icons/icon16.png", + "48": "icons/icon48.png", + "128": "icons/icon128.png" + } +} diff --git a/browser_extension/popup.html b/browser_extension/popup.html new file mode 100644 index 0000000..d859e10 --- /dev/null +++ b/browser_extension/popup.html @@ -0,0 +1,23 @@ + + + + Scam Protector + + + +

Scam Protector

+

Enter a URL to analyze:

+ + +
+ + + diff --git a/browser_extension/popup.js b/browser_extension/popup.js new file mode 100644 index 0000000..45c1787 --- /dev/null +++ b/browser_extension/popup.js @@ -0,0 +1,29 @@ +document.getElementById('analyzeBtn').addEventListener('click', () => { + const url = document.getElementById('urlInput').value; + const resultDiv = document.getElementById('result'); + + if (url) { + resultDiv.textContent = 'Analyzing...'; + fetch('http://127.0.0.1:8000/api/analyze/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ content: url }), + }) + .then(response => response.json()) + .then(data => { + if (data.status === 'ok') { + resultDiv.textContent = `Analysis: ${data.message}`; + } else { + resultDiv.textContent = `Error: ${data.message}`; + } + }) + .catch(error => { + console.error('Error:', error); + resultDiv.textContent = 'An error occurred during analysis.'; + }); + } else { + resultDiv.textContent = 'Please enter a URL.'; + } +}); diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index cd6f855b12f4883b1ba9de01c54245c53aacd714..4cfc41fa531e6e6ca3a388ca64a9f94d9277b7c9 100644 GIT binary patch literal 748 zcmZWm%}(4f5FY1mx4UeSfL3j3Q7^3&Rcv0MLh7OFp@l=aDy~_@W-fY8?2WPHt_6hD4SqAY*ZX)PzNt)N8`)is3??~9y z)S-jN3<1)?LnjwOivBGciJJ;^@pofNIfUHv^FvF5lQiw{vBh>tj z&=ONl%9Eg%aLOBai{VsquQGU5m^Np#sC7V^)hl#uD$;ls@lb%UdMFtGnlm@{qwcq$ z1f7n$E2Z$X4m>yfk@X@Td&M~g>f^=m5eTmcBaT9eqvk0nkb-)tLUQmH!_lY)3FvZp z8V`?~iD{0Vhg}e+F`4G*RH14|bqtj-^Q1KPBUD3@sCl9NRl05-<067I4760*1FMctT3L4W(3+~tTh z;$zkjKv%=>HYn`&1KYN*kg2974KHwokkww`dh9p~DC1J+(J9`7;l?o+{at2v>`xma z5k24YqeR$V6gDEB2Mrnjik-P(FJP!{s(b|k^Hq$l@+FjO0Q*f#mfP*F8?ts=TJ3fi z(Ih~5sonlLaf8Cbkwa;Kkpb8<0xdU)R(? zy?bt?@9q3iAFO?HZvJzx`TOS=PtwhY>CTsFeKRZRpDkykfUT8lqHnF-AY>NVc<_R~ zjB?i>GDF(~zXCSEPul=LfUIV%TNwd3FX6+t;CQ|bu>V@;>$tds@cu;2@1c}?eTY(J z0$88oF~BtWOsyFZd=aiucXNxO2#hgjY9Ffv$N%jo>%i}H4|@x}H0gxl2M~0=mmGtt zQ1jYoWx6}B_ogb#33NXei8NRUCA{A>=Sjk!8OOMM17VIXWR`yffJRXVn9`N5-hsPb zdvI>z^Uh819o#h+=|1WZ@T>*mRpVhs7U3FoH@6sy(=gnAvnow`;&wYxQS+O{0{RMC z+CQ@0BtEwD>g9MZ^6qW+ymtggGNd_Pv} z6@LR{nxZHvsSjpnO1>D(&Xnv9W@k#a2eUKNmldeZMR;-evVD#Eo2jv(DM05U4A$;L MD=EO}qAh3iKmT{2c>n+a literal 0 HcmV?d00001 diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 9aa598b9d5171b2bb0d207f045e07f9fbbb95a64..817be3639e10b0d929ad1d1e87e59bfdf1e00cca 100644 GIT binary patch literal 1524 zcmZuxJ#5=X6h2bauSGjx0yjnNKyeDC0&EIsmKrDuw3eL;sg>ALVnjm;ns=7yP^5ZC z){4+ULkeWfP{2c5!06z%um_KwI%kvt4FabEoxCYfmU?O5k&^$?JKp1a@7{a&-gl4u zRhCl-#$W&3G=CBi`kM>m5gjqZPk`A)7-7Le4WTLsNJRG$7GEG7A;LEJg=0U0&;hJ) zR3lg_qg?cai#frMH5^PVW{kFjS8OB8p4TRglg(a#3V`K)ZxUHk|u(}(@?m) z4`m;mm0nHb$rq?9<0&Zlnx85gdSjh59qP7k7YH+`xk)l^on)BDnxy_z2c?w*+M-G|ko!t z7U$EN_Kl}oqn(69F(hx-en&$%3!SR@y3-(eZ_~3~FHc&;04!*J$Dz+yQ#VN7a45-# zjj1-D`w~B!PJ`t4U}GQlUEfh~Fqh%qh?c*L8ZuVEI*F8U5_!#f=O z^Z8zUe=MRO;RE_PD86*^F=*QnRpp&9frEBwx~5};C^2GfF@8pd&I0x0n#NqJX>H{K zWFwsd28>&EP+ytuDRX=G_P*G=*Hi9xr{+gbVm`>dl$)gQfhE1k2~Ugi#QkIidT_-g z7N)lYd8w|`K=xx{JNj}#cS*%;kWf8w;iCM>a^>^NnUrU2Yq?=<&&N~``h)S!XIw; z;Z9d>9m}nr-0H0Kl`Qwj9u>OE;<2*WQx-c929h)#8=x`ilm;m@c`J;e9DV)zX;)xJk#DwSqx4TNh(s)(8X_I(cw`-1yH$!xztNb4r7JV6r w)5ND?Q-4Mmz?ok-TLm(R2!hZ@Gu_M2K)NQt(eIL1(?86-;rh4#vl%4!AEY6CyZ`_I delta 143 zcmeyueUUL?IWI340}!mp_?2M^q#uJgFu(+5d=>&SrZc24q%h_%1Vmmt9H1*W6 zV>bE=N>Ca4Q*6mY!-kcMFbJ9k4#SEI7Bjp?`KS2<4vq#Q_uuc)I?L#BvaO84rLJK2&Oy{eu(Eh zLKpDQTFOWi6L~3EfR8s_vbf;$RUrkTc za^&6~s;plnyQy$79_a4D6jR@RUm`|Km>XHTNqu>atFbiC{1qry7cfhn(U+XmP>sb| z;*0&nPmP6i^d%U;4ft8|u9A=QimW<*DxE|s94103+X#66;%@8*u+?-*XfwDb%6DixFvJ)vg<6(dsA#OytG2=Ia z((dSGRN4(o)u>dxd=}tVh+7eE-Ri4>vK1-SP^m>q?eb%Q+aYd8xIHaM#mq@Q`Ph9p F^&b-!`tJY$ delta 255 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 literal 1364 zcmZ`(&1)M+6ra_{dS%J>I!@|TuH%hUh$T{~CE!96oTjQ1oHkCdQ%ZHHPf-Q6#oP5Eq{V!1Q7#*Ku^61OfEk4%~~s}guETzy!YnKoA>c! z|CpMZL_mL+PRlpL2>m0JfI>sz+l$SscSs^=|k4VB6wxYJ2mwh>6 zP1s6a0Xh0B%Et_88>QrbMYzqB#N#E*3Oks3CUHQODRvA@K~k7$;|6iCE(zZu#bJlk z(8(RJK1WUTVt6pV9fEo^GQIeJgpqaJXHRNMhV;}glZK3tBN^en5Q~o7QAND#(>piA zMx+^HvEUS;@pC3}9#TaPq;a2SxGAxj;0&RP639l>kPjiNqhJ8&1AY_l`WecBvKL`< zK_mp-GGfihA=Gg+ss)BI*;w21yRNY^)~upqm`+Labc(T~)l62_EK-D_XmFxoXUC+( zv9ZH61GA!Od6`C{=(;tt(Wqy1VsquT>;5P-9=l@|nMF#b-iU4DnzqgA7Upvgw;tSE z&pj%9yS|;<+IaYA=m{Nfc9(G8LP76tKq2MQk+Efgahls~zxB^Y15iq2p ze1hU%s@P+67IZo#*hj*3LMINxyUY_2H9@DJWy{3I+3Mq}!>U=li}flaG+QI|spl4T zob~hDF>%eyxOE;8-gFVJ3n+TO18bo->ila}J65%hy4+QlU#ly}>PkmVchz)jqo<`_ z{(P+6Xlpn2)BEXH3$5?^ljojY`z`Y<)5;BG^zo;?`Q?6crISo|lj(kPxtsi=lf2$d zUhiF8=v}zfU%GryZ>QE?g*r>Q?ozJ5xODJS`|4MJebZUI)m^+bn2pWI0|cyf_w9L< zIJbYby>RVisS{uA##h^s)e}e(07x&wM(2TX`E06G0Q9V<>X{|ul?i3g0?%(HPYlgf z1`zb;;Me{qqL;+gPk@~&H*I26ExbmrfGYk1-V&^FSh7$@YDyisDN9I3b%f>b5sndQ3(gMK5pZv=rDhDr z*H9^ODmF`Ukm*p9=`M9_9w;3L6N?+egVASXD4gdc;gX=Hgi%w*QZr_vW?V)jv87xc zz%q`3Cb^Zm)<{^wah&KWM{x)P-oa|gI2l={uQWK-OCN!cH}GEDWFng=AwmaOS)9XC zZ{!ZzXk?ik9tF$Zy*p_6+h``jg`XunhR1sox0BS8%>R)bZV(O#*A=YDxdxX8G|?zo0e{GvwI*x zOXz!=MQqb;2XWi8tRTyxixI5pF1Q<9%64`&zyXi0?s~iwgKkQGy|_|qtki)aHm0@- zy41$vYGbLfSOX4j+@b`7HeGA1EjQNIK%K5p-l3cm%%;HqsVH|T79@?fLk+@%BqlB0 zvs^YVqDwgp1B`7Rw z2JA=;ioQ-eWFTgoE*VbRujm{=(B&7Ew$mXMZ_~3~uR`{S0g$Y+>#%L!)eTZH97Zbt zO=zWBtv=O;ftI`bOiW%x1jFBj(K)<+-j0qP*2B0op&Y&lQz-rZ51D@I;Ys1Ww}nZ+ z`1sXMzxep~_@6U=Q}b=+7x{6K_lw-myC;Q*zFPfB>8n-$vzNZA9jjVj)%^UoCx!d| z^pn@0_NSlxHsjB4`MU=pLi6&H44(&e`7ELr5d}@*xg25539Pw4W_-1Ntk(N#-OoS2 z0R@(yEC_^~bXndIDnlj_b}Pbe$pX72GzC)*v&zJ1m`8=_*Dw7Cvtdl091X{F>C71d zav?|<8y!;)zY-67dX=mdX!tbV(rwcz - + - {% block title %}Knowledge Base{% endblock %} - {% block head %}{% endblock %} - - - {% block content %}{% endblock %} - + + ScamGuard - Community-Powered Scam Prevention + + + + + + + {% load static %} + + + +
+ +
+ {% block content %} + {% endblock %} +
+ + + diff --git a/core/templates/core/analysis_result.html b/core/templates/core/analysis_result.html new file mode 100644 index 0000000..8e1546e --- /dev/null +++ b/core/templates/core/analysis_result.html @@ -0,0 +1,41 @@ +{% extends "base.html" %} +{% load static %} + +{% block content %} +
+
+
+
+

Analysis Result

+ +
+
+ Your Submission +
+
+

{{ report.description }}

+ {% if report.source %} +
Source: {{ report.source }}
+ {% endif %} +
+
+ +
+
+ AI Risk Assessment +
+
+

Analysis In Progress...

+

Our AI is currently analyzing your submission. This feature is under development and will be available soon.

+

For now, we have recorded this item for future analysis. Thank you for helping us build a safer digital environment.

+
+
+ + +
+
+
+
+{% endblock %} diff --git a/core/templates/core/index.html b/core/templates/core/index.html index 0a3f404..695005e 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,154 +1,36 @@ {% extends "base.html" %} - -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} -{% if project_description %} - - - -{% endif %} -{% if project_image_url %} - - -{% endif %} - - - - -{% endblock %} +{% load static %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+
+

Your Shield Against Digital Scams

+

Analyze suspicious messages, emails, and websites to protect yourself from digital threats.

+ Check for Scams
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
-{% endblock %} \ No newline at end of file + + +
+
+ +
+
+

Analyze a Potential Scam

+

Enter any text, URL, or message below. Our AI will analyze it for signs of a scam and give you a risk assessment.

+
+ {% csrf_token %} +
+ {{ form.description.label_tag }} + {{ form.description }} +
+
+ {{ form.source.label_tag }} + {{ form.source }} +
+ +
+
+
+
+
+{% endblock %} diff --git a/core/templates/registration/login.html b/core/templates/registration/login.html new file mode 100644 index 0000000..3c201a0 --- /dev/null +++ b/core/templates/registration/login.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} + +{% block title %}Login{% endblock title %} + +{% block content %} +
+
+
+

Login

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+
+
+{% endblock content %} diff --git a/core/templates/registration/signup.html b/core/templates/registration/signup.html new file mode 100644 index 0000000..e55db0c --- /dev/null +++ b/core/templates/registration/signup.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} + +{% block title %}Sign Up{% endblock title %} + +{% block content %} +
+
+
+

Create an Account

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+
+
+{% endblock content %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..bfc1a4d 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,11 @@ from django.urls import path - -from .views import home +from .views import index, analyze_report, SignupView, CustomLoginView, CustomLogoutView, api_analyze urlpatterns = [ - path("", home, name="home"), + path('', index, name='index'), + path('analyze/', analyze_report, name='analyze'), + path('api/analyze/', api_analyze, name='api_analyze'), + path('signup/', SignupView.as_view(), name='signup'), + path('login/', CustomLoginView.as_view(), name='login'), + path('logout/', CustomLogoutView.as_view(), name='logout'), ] diff --git a/core/views.py b/core/views.py index c9aed12..2148ef2 100644 --- a/core/views.py +++ b/core/views.py @@ -2,24 +2,70 @@ import os import platform from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.views import LoginView, LogoutView +from django.shortcuts import render, redirect +from django.urls import reverse_lazy +from django.views.generic import CreateView +from .forms import ScamReportForm, SignUpForm +from .models import ScamReport -def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() +def index(request): + """Render the homepage with a scam submission form.""" + form = ScamReportForm() + return render(request, 'core/index.html', {'form': form}) - context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), - } - return render(request, "core/index.html", context) + +def analyze_report(request): + """Process the scam report submission and display an analysis page.""" + if request.method == 'POST': + form = ScamReportForm(request.POST) + if form.is_valid(): + report = form.save() + return render(request, 'core/analysis_result.html', {'report': report}) + # Redirect to home if not a POST request or form is invalid + return redirect('index') + + + +class SignupView(CreateView): + form_class = SignUpForm + success_url = reverse_lazy('login') + template_name = 'registration/signup.html' + + +class CustomLoginView(LoginView): + template_name = 'registration/login.html' + redirect_authenticated_user = True + + def get_success_url(self): + return reverse_lazy('index') + + +class CustomLogoutView(LogoutView): + next_page = reverse_lazy('index') + + +from django.http import JsonResponse +from django.views.decorators.csrf import csrf_exempt +import json + +@csrf_exempt +def api_analyze(request): + """API endpoint to analyze content for scams.""" + if request.method == 'POST': + try: + data = json.loads(request.body) + content_to_analyze = data.get('content') + + if content_to_analyze: + # In the future, we will add real analysis logic here. + # For now, we'll return a placeholder response. + return JsonResponse({'status': 'ok', 'message': 'Analysis complete.'}) + else: + return JsonResponse({'status': 'error', 'message': 'No content provided.'}, status=400) + except json.JSONDecodeError: + return JsonResponse({'status': 'error', 'message': 'Invalid JSON.'}, status=400) + + return JsonResponse({'status': 'error', 'message': 'Invalid request method.'}, status=405) diff --git a/static/css/custom.css b/static/css/custom.css new file mode 100644 index 0000000..265ec02 --- /dev/null +++ b/static/css/custom.css @@ -0,0 +1,152 @@ +/* + ScamGuard Custom Stylesheet +*/ + +:root { + --primary-dark-blue: #0A192F; + --secondary-slate: #8892B0; + --accent-green: #64FFDA; + --background-light-navy: #0E1F3A; + --text-light-slate: #CCD6F6; + --text-dark-slate: #495670; + --card-background: #112240; + --font-family-headings: 'Poppins', sans-serif; + --font-family-body: 'Inter', sans-serif; +} + +body { + background-color: var(--primary-dark-blue); + color: var(--text-light-slate); + font-family: var(--font-family-body); +} + +h1, h2, h3, h4, h5, h6 { + font-family: var(--font-family-headings); + color: var(--text-light-slate); + font-weight: 600; +} + +/* Hero Section */ +.hero-section { + display: flex; + align-items: center; + justify-content: center; + min-height: 60vh; + padding: 4rem 0; + background: linear-gradient(180deg, var(--background-light-navy) 0%, var(--primary-dark-blue) 100%); +} + +.hero-title { + font-size: 3.5rem; + font-weight: 700; + color: #fff; +} + +.hero-subtitle { + font-size: 1.25rem; + color: var(--secondary-slate); + max-width: 600px; + margin: 1rem auto 2rem; +} + +.btn-accent { + background-color: var(--accent-green); + color: var(--primary-dark-blue); + border: none; + padding: 12px 30px; + font-weight: 700; + font-family: var(--font-family-headings); + transition: all 0.3s ease; +} + +.btn-accent:hover { + background-color: #fff; + color: var(--primary-dark-blue); + transform: translateY(-3px); + box-shadow: 0 10px 20px rgba(0,0,0,0.1); +} + +/* Content Section */ +.content-section { + padding: 4rem 0; +} + +.form-container, .reports-container { + background-color: var(--card-background); + padding: 2.5rem; + border-radius: 8px; + height: 100%; +} + +.form-container h2, .reports-container h2 { + margin-bottom: 0.5rem; + color: #fff; +} + +.form-container p { + color: var(--secondary-slate); + margin-bottom: 1.5rem; +} + +.form-control { + background-color: var(--primary-dark-blue); + border: 1px solid var(--text-dark-slate); + color: var(--text-light-slate); + padding: 0.75rem 1rem; +} + +.form-control:focus { + background-color: var(--primary-dark-blue); + border-color: var(--accent-green); + color: #fff; + box-shadow: 0 0 0 0.25rem rgba(100, 255, 218, 0.25); +} + +.form-control::placeholder { + color: var(--secondary-slate); +} + +.btn-primary { + background-color: var(--accent-green); + border-color: var(--accent-green); + color: var(--primary-dark-blue); + padding: 10px 20px; + font-weight: 700; + transition: background-color 0.3s; +} + +.btn-primary:hover { + background-color: #52d9b8; + border-color: #52d9b8; +} + +/* Reports List */ +.reports-container .list-group { + max-height: 400px; + overflow-y: auto; +} +.report-item { + background-color: var(--primary-dark-blue); + border: 1px solid var(--text-dark-slate); + margin-bottom: 1rem; + border-radius: 5px; +} + +.report-description { + color: var(--text-light-slate); + margin-bottom: 0.5rem; +} + +.report-source { + color: var(--accent-green); + font-family: monospace; + font-size: 0.9rem; +} + +.report-meta { + display: block; + font-size: 0.8rem; + color: var(--secondary-slate); + margin-top: 0.5rem; + text-align: right; +}