From aea5f6bf74fde5e31c53fe02f08bb4b7941ef72e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E6=9D=B0?= Date: Thu, 25 Sep 2025 14:20:11 +0100 Subject: [PATCH] =?UTF-8?q?Initial=20commit:=20=E4=B8=AA=E6=80=A7=E5=8C=96?= =?UTF-8?q?=E9=A5=AE=E9=A3=9F=E6=8E=A8=E8=8D=90=E5=8A=A9=E6=89=8B=20-=20?= =?UTF-8?q?=E5=8C=85=E5=90=ABOCR=E8=AF=86=E5=88=AB=E3=80=81AI=E5=88=86?= =?UTF-8?q?=E6=9E=90=E3=80=81=E7=8E=B0=E4=BB=A3=E5=8C=96=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E7=AD=89=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 153 +++ CN107633875A.pdf | Bin 0 -> 1325913 bytes OCR_USAGE_GUIDE.md | 237 ++++ PROJECT_SUMMARY.md | 193 ++++ README.md | 324 ++++++ UI_BEAUTIFICATION_SUMMARY.md | 213 ++++ config/settings.py | 425 ++++++++ core/base.py | 620 +++++++++++ core/base_engine.py | 928 ++++++++++++++++ gui/main_window.py | 1504 ++++++++++++++++++++++++++ gui/mobile_main_window.py | 1359 +++++++++++++++++++++++ gui/new_main_window.py | 625 +++++++++++ gui/ocr_calorie_gui.py | 637 +++++++++++ gui/quick_user_input.py | 526 +++++++++ gui/smart_meal_record.py | 579 ++++++++++ gui/styles.py | 326 ++++++ llm_integration/qwen_client.py | 599 ++++++++++ main.py | 249 +++++ modules/ai_analysis.py | 778 +++++++++++++ modules/data_collection.py | 367 +++++++ modules/efficient_data_processing.py | 634 +++++++++++ modules/ocr_calorie_recognition.py | 786 ++++++++++++++ modules/recommendation_engine.py | 1016 +++++++++++++++++ package.json | 34 + requirements.txt | 30 + smart_food/smart_database.py | 728 +++++++++++++ start.py | 145 +++ 27 files changed, 14015 insertions(+) create mode 100644 .gitignore create mode 100644 CN107633875A.pdf create mode 100644 OCR_USAGE_GUIDE.md create mode 100644 PROJECT_SUMMARY.md create mode 100644 README.md create mode 100644 UI_BEAUTIFICATION_SUMMARY.md create mode 100644 config/settings.py create mode 100644 core/base.py create mode 100644 core/base_engine.py create mode 100644 gui/main_window.py create mode 100644 gui/mobile_main_window.py create mode 100644 gui/new_main_window.py create mode 100644 gui/ocr_calorie_gui.py create mode 100644 gui/quick_user_input.py create mode 100644 gui/smart_meal_record.py create mode 100644 gui/styles.py create mode 100644 llm_integration/qwen_client.py create mode 100644 main.py create mode 100644 modules/ai_analysis.py create mode 100644 modules/data_collection.py create mode 100644 modules/efficient_data_processing.py create mode 100644 modules/ocr_calorie_recognition.py create mode 100644 modules/recommendation_engine.py create mode 100644 package.json create mode 100644 requirements.txt create mode 100644 smart_food/smart_database.py create mode 100644 start.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..78b3bed --- /dev/null +++ b/.gitignore @@ -0,0 +1,153 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Project specific +data/app.db +data/app.db-journal +data/app.db-wal +data/app.db-shm +logs/*.log +models/*.pkl +models/*.joblib +data/users/ +data/training/ +*.pkl +*.joblib + +# OCR cache +data/ocr_cache/ +data/user_corrections/ +data/food_images/ + +# Test files +test_image.jpg +test_*.py +*_test.py + +# Temporary files +*.tmp +*.temp +temp/ +tmp/ + +# Configuration files with sensitive data +.env.local +.env.production +config/app_config.json + +# Documentation build +docs/build/ diff --git a/CN107633875A.pdf b/CN107633875A.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dc1a9de8cc906a5ca9cf7e8a17d4feff8346c31b GIT binary patch literal 1325913 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

K*|$a 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 mQo_HAaS<|oa{$zCX%v9q#ubf@8b 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

$}ECNmB9nm3xKEZrR64zX~X=K>Pz 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∓lxY9G)EqG!CSKNe{iQ14hl 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�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 >9j< z{&=aid?13rghvbBy@x2Aaf-y7Nf6>^U4BoniNl$sT#C(w1;}s-KnOodrN;$MZzIg+ z9>GeW_9jpS3p8em5n5eo5(vqmKK$G>s6>_I%KMRxxG)RVa9IjBMpAGO`Tc-hadbPX z6E0P%JU4=5l~h_3M$#IGrzoLvPN}VAe9IjCo@!mSEUq)k6W7!p?)na;q^C3Bf|WZY zxxFwuk{<@S_j?Arb=Q~(gOAAb2BiixRlZ&3aVrCAbUX(2I9vu2B)3wyrFkzcmP4#$ zgN^n|Vso9x;!0}Dy6@2XBg-<7|7EP zMNX2X>stN@t#W0p@$Hx8lO5NcfW=o&vQBJT?QYobu~KA~r2iSWLeH6R;@t!piRjg< zZfInCTZZ743$^ZjPsWnh{=6?4l?4f%&RsIAy;D>hZ_QCdZ`!K{4Xv>vueRTeC`&F^ za}9AsB{`SdlMv}JAlu*Nin2#t&eBl}At|g%vX@2tcRuzzbJ8P6*Epk3?G<7gv(xO# zK_jR8-?A&r366nl9Rt#Jw-nuNOnXr`LCQtreAjEac&=xo&eq;PtvGF>&C6R-tO;Jb zrY&{U`sRtCXW4tNJ?uWEb<6;-#@Ku^fCh#2s|uUQu2|>T>o9mK=e*SX=#I`BsI_5U zAf|ED{i0rj{g=S+qC6!Q!u8S~TkQU@sr#8x<~x&vM_VLM0~qsdL)P_K`q8 z{qX1JnS&L{_@_ES&JzxGH{Y0VAHB;vb*-vZwUj*+;TVnkX-_bZw+LIarr=h>_9zNR zRIYXTO*4nUwG!DF$*#KAuN7YjSfyV}oT{%aaA?>vV!QD>Pr}YkfYY}cD)#nOQd$Zn z`_c({LqMSARDs8FCiy+8QH&N|_Cqs8tMeQ0?+E*HCf-LNRQM9;<1&=+!~(o)t;i%> z%@8ER%$J_FK0k!OV}!f~;{4-kike(UEG%a#Q<)>9kJfpLN3Unt+p ze&;H#P`+7j+lE|v65T&wb9M21fiHhCBaLhDsr>ZksaoQPix|wMEkwYTig5qP)+Qzx zOqooNzEN5e1Nu$_=8>FuJ)J#!<#NJP3l)Dmcw3*Ja~{JKe8FMObW^&&PX-yKa2&^0v9 zhLb)UIW`!nH*cE{HQH&>XDN*oJapCGq-tmtG`McgL&91lbnGy2*zWLH7*nl&(Ziyrmq+nC<0B_YWiv zav-SCue&Tep7zq2L=l_lfCe>fVma_Pwun>%fRaI2i5lg#807z~JSL7KrXsS>0B zmdD((hoYJ{aCC+!dPsqtK;MMrBM>5EP(l4d066H{`9`RYLh`ROl{6nY=M?Uk3qXoAJE_U~HR6S~lc|1KOZysiOP zDCEV?rv4OHJW1#Q>1h))yB*0SM!@GZB?P;d9qZRZa z&K!`~QYJHQBOwYe&OhjWCe%SuK_km`RAQ4<$+30#6dyS~r8e&%lgUgNrn~YJZ~{xb z(B65*TVzEA(1mgmFPBMd&k`05Y~X{LDm=PhiO&>le1ETS~u?0Ntl!t;ClrXffk5?%mr`@#M1EQ5r> zT{!qVef}4ue7Qt20p66=SAXMKMa+pQs|{8ndzr0YiO>-&c)1h@^^`yU+%hlz+qw

?JJ``m6DxIhSl#j2>>Pa;>FvHWkL(TWwfajd{FEh z(#Pxfg>IMoJZ;J(P!BP$xpZ%UoFYoZ&8#29F8VmJZ4a==VYE9dcOlx@yASqlg6PDzWR>gq{7uY>yjOe%>05xzS zf9waWA52OmY0mC005~k9eV-824Fac2%Tv^Xg9l5NqooX=wz&6Qk8OO+&al6vG}M^SisOBf?w_?HCDS zdC=5OZDREkPPO7wv`8NGb8Hrn=3?2be!QGO>QNW+!~rlNkv^kD?+2e_3tBx`9t&@& ze+%&UNR$?~q>yh(0YvD5E_c_$*OWo{(@K42}}WS=C29czcP<%y{~;^38~m=hk;eQZJ*fqjq0I zIA2qJ_c7#cc}lLXp&<=*)uIwUqkmc4hL_6Wwr&0tUr7>vugUgqicyl)YDVsEo@@{2(bu zYqFA9I9j4Zg4Vc&j=^gAPdktF&2d zjBs$r0#B0t-s2Qm7^jitf%dx}^g@RO-Da)@?0gN~CUdyeY4=dMyz1dDL|jtmUSAVb zxx%U%RT`wh;7BV%mRp|2WxLX77J9G}R;qm=n;FVq`&FuGmvz=8!SxF#BbZ2l{jpS8 z#F2m8XI(vbKfV9MUNnoeC)oWh} z4%D8gR#vhYY zlshcb15cBE`fNzAjqm%m_#`aieY};jqoSiHHXbxyUaw_UJ@L@<&`rKJUkatMm3-O! zhYDA2<5Z5PscA-u!=?0L)AZ;!Xfn;a-8gw~SugZM!1Q+MPB%Ip=gfFwuQy85T0d?{jZiX&;otpQ&Wj!v+)J9QiD(Yp2am-)M2 zziNJ=tQ)woGO%zFN_riH9Vql{opR4CT{W=#`vl@LRZEmU(arjrs!tBltYRNhxC#W68 zo)+RCG*!o}UB0DAR(!-i%pOLsP;g&Hj3M|kKcQbK(0b=W2L@#>cQPk(BJY;=eb~?V@_S`e)=m~r z>_^UjEbEI;6(0ZPMaO1Cg1hTOP?CFTcP*< zC_~}_{+%1RXUc`t%>YO&vc1xkN;PTNkB&yqv^+~`hc={WE^_7e$@Dq=RDuL>yEQB? zdcwxNf)w+yed~RTJL+AOL3y)ByGH==Q?GyRV0CYH9`1)K%+( zZIU>2I!MTaZZe5KB=G;C#z_#Z6AR!=J)GjMMnqiXuU?g?K%%f z%CdXeY=5}bU=+OZ2;AMCjF^gy4cu94oU#JAc8{_$XQ_&tMiii=^nPUh@O958bh{<* z6&O}W*f>^QQaNOU&H;16kcQC_AgHX;@iI9JWII{5wTpLy13LO zySo#%80o(J@Dq$+4@0DrO^gbUh~Ao2Rr*Qw089j82@L zh7O6wH8L)*>@^N=PuMZuz)8rC>Pa{I+pI^ng){wd`%Q8JS3yG^TjHL)CVd>m~FDSSlZVe!RRgaKD&@*vuzH!^r9g zZhIDqIktPkS@k~E5;-Zc%LfjULcnOomU>JAVqU8FowBt42)&vN$VY*IU%<)ejPr(@ zw{1}zufG6S8pIT@d0yA{8)vKCHkz0;G3{J z(aen*2`VHulwF81u#C zfmL%iGo>RmesQH2fyrVGN}2(`S=#{V5$7*0CE5?Vx+-=XCm?zJc7TV={VWmeO8_3U zZe9fc&Y`tfLd2IGely%v&K0n$!FUY=Ak@w{U6=di@_9=hSHE7gM^Z#gsfE=?^^kE0 z2q$nEN8qqoVvm&%vvIezPgq}1soY5bffzB08b+CK%c`CGG>c`aNC}8yinORGmuw~& zhcHBL7}gbX49AMO8Z&wty+thHz8oUI7EG-pQ@Z$oU{65abm|rxtb@HH{&)(FKUVN& z&L0lB8YxAv-6N4UmIHNi3LkP_=z#7gigVYRo8;2#f7P{Pxg({Wrh6FpltM{9oHccd zL*c@BCR(0Lf^D8+gH1Qq#YO+dPn0X%NG4O@=Ed472UXmbL!Z7yo`eqZOXGRC;wwUT zW`vx~-zY|P(tEW$)k&XB>f=q~x0*>yQV;kfX>_u-D+*zuPtl61S2x$Lu`DY_=*He0 z?6bk^zk@3n9zR34&Q0hIcb?VtaW&T{*K$wvY_`bz&*%9&lS&Ds<3}v%4@t83#?zDS z@-({2b+&QgciwPpbJ=_+dL4sb)1KL#W$2k<#MW@x^9HH?2i|oV!|mjHR*fnZ76s`Ccqb>JsB>@`Lp@;kg`XE; zC+YWkp*1P)y1ixnZ>i%dhy#I2E^D&jc7+;ZwY+rkSZ76&h3;niq<)t@uv*B`UZzW} zM~0dN51ZNRnpON;`7XbMg{L5oKXv7>#Nwj8{r?-(KJs1o4wSB&hPy0#0Z#nL>}6WBF3=$rgf32rkz1 zY$@XfR8jgL1)WOBfX`MYXQ zc6$eE8y&)aF~bgSdv>Iw6(Va>uL8(yzCE<3^icXQAH`%-HEjwPia5|CtMUbt(HYX6 zO1V41huuf=8$BdrrO+_=3<9^$MgWM)E0kF4mM+1{OgL``lMwXx2}2BfstLWLWiB*Y z7c1n(0B75+=P|74{M2vt3AwG{6ILAE4C^0b_iZYL1QTX>evkkaXbH#H-w}8$kt%U! zRBW!rz|Vl^G18`ueAa7<)Iwz59zsWL&dnj%nYiDrW&Y&lUv`K7n21Ymd}lk;>6rq_b|hFj`>yaK`_m7I-QtIz z>NJx->vMXx{Fr?o-vA-Oi@K4wKpjN_OjoJDG1ylN&nZ%B-Pc=%d%XV4jX%0cps~{- zcNwTkO&J@F*R81mX(k@g#urLu-%Ays+a?h&a9Ctg2)R0rsC%Br8 zhu#KUb5*U!EPSYska#F9^PuT!BEH|Fmm9VT4%t<4iL<#XifN`zjnW?S8XVv!q7Hc$ z1x3|JPvI2z*j2apmKit`X*vcQdy7;9W$*PLxwS&(k=s`_oEb|ovV)_&$FH9WzWiMO{Pw2E$Y-qMQcT-; zE~5XLdF{2zwtY@#U_bcr6YKq+zAz_gt^d>SH;a>w_IK$^&CxqOAM@a%W8Rc@bV`=$SeTSq>54#B@3YNo79W!?1TLF+z~Lwe_|H{ejW znza;`aH#UpFbmCjD$Y<`mgN(J|FSLX>STesOsF zhN)VX>nAP0pq#z?3NHT68kZ}VJC9(!Jnd+22uOmZb1JT^!I$B8rn{rd)doANiORyD znOp4cj@*+mvomx-OV`QL_t=&?2XQNLCITn7DawBIHjBk{O}VwpI-1E(JDJ;^O3?CB z*2b_mUEJv_M$eB`SBQn8iHP&4t8wITCjZsXz9)lj96~Gr!#=kwgu%ZqYyyQVYyodJ z@#IDR<%Ci|%z|7sNvRNF_BhhJ0FZ0XR1LgKrjg_JU3*o-pYy1Etl-Mx*IQh{xDCQw z9re`R_Mby-s+ySm*HRBiQrZ#YxVE_`Vs@Oq-04k7RYq1ztHkO}H)0L_4_PM^cz3{p zu!h(pgCmufMAdSIY3;j4^iqxky~sCD`8qDs%vs)2_^AzgT*IDEkA5`X!P_^QhW zIjOY#7Q6$?Z8UR`OO9b@TUHtN*HEVU+tjWuwr`&k{hEOcOXRX1{%I?0p?PlDe2zun zdEv-fa!-QzIf5BHrl_4P=4nS?o;TG6y$#t}=|5!-rhP1B4Whe`w(f&%-JvAt?n!HZtyTCh9?W#PY(2WaN^_b7tOjtRfz8b_v$*tRykyvl!k@?AJmyoLWX^hE3_IsZd z$hZu&pM7QKD?QZlOYc*x?oWFeJUaakZ_SU@0IaSsQZ9X$V_~25ZQt78T4~K2zPD%x z1&30YR78SSp#C)Xsaz}JLqp;Gvy#3iSXP~ym*kN)5DJ5i*B1?`0oE}M{X3Rt9~K3y ztP6y5TkLXy_9Q%Q1!MyJnR*i-g`Xv@IlwZT2d=`Vs!gEE>E|$1V`tXjp;xm`896M` z^wn@sl>6f&0GIm-OG_Z|c+mm?H-d5#)Qe7(&LgLa711XNV~4e_Z99?{AoHUWJ6FRf zb99?R1FBUh>3~c4$8ORCC4$ef$nfY|0x!a@PzZXFtk+TceJ~}UgV6Ud=?LG) z0rYqD^|8xu^jqlfZpFoiSu`)Ltx)vJlt!-E;soZ0YadzSZ3whl1!9eV0Oh?WEclWr znVVqV_kxuHl-XcaD>!649T3j|1dmkMDh2?ZnIwHYrr_&9i>j3fp%HuK_1;bXbMF#(|8;gY}Ko3l0m z_{@&WsQMOkj$`^^kRRz9`{NC3#x-`(NN8hUcvijPqj<#<2ML^%w+-L#zMw?NC3V=_30wR5yNUtl<1S&n#5l=}df6A~G(Z zDwiy0$8T{hv*tp-m1U%CsolSCH6AGXyujyn@tw-n_% zZK9rZI&IoR{dK*r)#W^0T1L;n%hsLI&I2!5daf_h_ZX|~b@r<`(D*p%{Il)1zh2vR zt@6INRL5w)Hg`Ue)39;7`z3>4E7dpFX9sOGC#kuARJ`i_c>N8x`zH=v)YUo2LY>#X zUcUVT%qeH(nfsJHs&YGHeJ=I1Qi{5QV&#_j?gzLx-6^5oqp5O437p~alDmjDz*2Nq~gG$#K0T@f%v6wBkQ|XF} zzJeim4jP0GLXGo1l)(oZmz_z#tBHsgd2as%dJ(N=fa=^=~$PKSw-f3llyPA)A)V=_?yGM`I9y|Nw>FX+}a&lweeAJ-Q%DL#~{0{>gw`=v*agq?_abzpQgHk1Am6Hl} z(ASWR^;eFn#YG7dY&Q|BizmKbvg#-vHJ;ot3AK)1OGgu5eSrq~Q{2+b$-M9Z`@u95 zJ&Qx;Ij1&dmxa-1bbnn~zU4O<>xdg;5@<-V(6F~9*={ReY#3Osq4 zoGw|9>rgAvat#${gRbfA>v!9G)A^Pjhb=z-doLHpI;JAEG_9L*`H$C|%J`|FULLlJ zr?5V1PPMr#t0BKLSE2^(kWcz@4iEWWYk;|g*6;PI%$oW0*!*I2XKf8*dABU%Mj`#| z3igSw?iC7OGTCB`*C(w~VwyyK_X{Ea#$4~KoBkIx7hFvYw45*gC|Kn~-Lx^jD7ls= zJksXG)n_UA_ilvMoUWB=%;D1OMHN~Ax2B^>EbEKScy?P5Xuy@Lv&NJC$lsJyhdpct z;lj2ADNQ@a_%rB>T;;tLTKwG7Oy9~UYmJyGH%`RosFR%*GhBg>z^!SuVj-)!xYsqK zsY0T4wxr01A`}v74B?T2{Dkn6_pdIJKg8xpuGN#@rU`d2F3s>PWL>4rs(hik$|IJs zX5^5Gfs#eJ%0C*b19Rv1Wo5-IM*-Gk$@y;nT~hH40fE&awv*llqtCZB3AB!*4bPra z?pB*=aWVRb*%t>^r+R9g(JkAvwiJhQ`Tax}E%&?ZB5q@cEz7Mr8{J4Q=nKTmjJj<~ zKEaAnsj#c|9(Wq_YD4=UmjL)&mJ5*JN#C{F)V@ZI!Uqv7Qg9cmoK!=Kw zRCVp6ICT-HWJT3zc5M2t(U?LWZ#Hjm7tG}vz%RzWH}Pk20CJQVA;}4nw1$G4nY@M~ z$;nwUz9R*Es%?c1)dZ6@x+FF^w-I&suMg-Tz>SOm zjzu`txh{oW9Z;wNsZwj3AmEvg%8X?+LF1(SYA(%YALo-MoyGwRC3y0VMI2>G*-DD$ zkl2#6sV3!u}Okm zSuNCfp->5rh;=6~U1GU?*MGtW{=Io7zj+C;UZWf-1pcKA(~jX*Ug&)xL;+JIdZOOj z_77ClB$>1KGYON7F4euCs@He9!Hz_rCOP_&{_@Q7EfVH0yqEgd8kh*2S4E%!{~l`$ zRb`uwxV;Du+7)KUbUo{{Xy!BBDTK3^dgm2{EIbns7X1U_g0OUECRfln9`-5oz5U^i zrnZ!J%tJNwqQ3$>^ppq^%gHvQK=e725ECZFidQ1uz+uo&I}Y9UjDq@78b-o~#l^z5!TZM>vhm4@28f79Hi#^y(_s;@-UnIb{i9hvgx zXDVhCkrB>Vg~2#*(2OkTXoTc*5a*H21}$J!Gn){YoUP}D1hk#O*K~X10=dc@N#$(a z7m@_e5xSz);=dQk>d0&CgbI@)K=Pm1Wn|4rUTr%wu~Yj0{OjTDqs)azj-igc;a8q& z2C(@p0?6|^IPW%q^fkq0oovXHLgdB;2tX1TJUj=)cho?Ozkd)R3EmygYdZ?w|F5(y zEDnJw)_R5d1qSNI#b`J@XDrBQE@jxB?N^hf2+WnMrcZvfi2L~u`a%B82?wqi;1BMVj_wSQJmIOXOiTLtPfUoU z%@hQTaU59==UiRqt^T^jF=+1Gks;EMo^$%GaDvx@Z(sU&p z|M1!_i}i{lkv%f2DKJDG8G3S!Ft&&@j^2=|10!xQreQBX3Zoa@>!8&2^-f$;5aDEh zh+Hbf0bfQwG;6bw2P+>QAf|4_rr~xC%|Vj}2#JLhm;Vu#)P5MXA?E<1}oxQFul*A4Q=QYMBp<3=zTeo~8 z{3jF2HVm*X?g8imA4NiA0w+Z1(&Zz$J!g8wQxD2=I0a@9qXZ;tZVXDRJ(QL ziELRHCq-VazA~iwK)WyfgmrLNN@9wAp83{{^o`r^g1$i6 zj{JEYcFBfWjlZ@IGp~NV^T7#+rs*5^BZJ8fi3Vz`_bb+gzt+yORI)`EI}%1O(LJT+ z-Xd9SA97_rFHlZ9=-GC}*fTlq-uvFSN{-p!vr**!bIQT!n>Xd2c(vA4Z|-)ho!<~+ zuF*ZUcA)j@PP_GF9|J8EX@({pRGT6#xWWidJEy6OnT$rX-QrZ zIO`@&TfK@Une4#7S9n%@PASjq&nLszIu+^kQ#xWJIz1s~2+Jyw}$6FmY{xnit@sl(W!QwlgNyW0=O!-VU+cq}GdL;iw)J^S5lanGror}>LJX;7PqaK6By6Tcl)_bQ3ge3 zBW|1C=&R_|o8!r!eR?D(!W1^%;oJ_ z$o}Qr_(Hb+zpcGgPRW7yn+&%7eRN{9BH1w>W7KOjRiI94oHy~q!t&T0MT^ZDvnnHIx;-}+U#(=W_g zK%jwkm_>$xR^vFEC0EUsDpaA=*PAI+tS?GV(vmIJAOYyclz7_WlbEnhhtBa2P81v0evSl@Di{q%!N z2LP)}o*n*Qj^2ONCZE|P!Gan7qvwGuiS)b`G1>m+< zdw3S!Bt?SIStLgnK8+c*`R%8M9N4h%I!WQ{AXuVkcxq#fS1=^cO1dsowSKF$P`(~! zes7Nmm8uoR*LQ+rO>CDeYvTOw~d^e-qrBZ^e2L~bS3~x z=YCm)zTk&VpqhX5+aYfb+|dpSjtd;Ypb!SvPJjwaOOIx!D5 zi9~UX01T5E6!7i6cmXuB+x}%4=K+Qb9;Y06PnIHjb2T>Ke^~lw>*%#7gJ5FJn%TZ~zCGFRK9I6f>fSImcV`7!lpf8dYO+$rLu=41d}hAVH-G*-&zc z*PfQzep6xQEC8PTw08jz!cE!|z9@r08JGR^mH=gJ!vnH;8gZ_LdkkT(@ZIwR%cdU? z9P{pq@4(K-E1F@rOmRy4T+3LL%kVk3L2*g}N671dqi%TDb7l$48Zxk?6uR+<%*?>A zon-?6DS@M}`fr(nSFCkRZHp#8{1GJu1!LUvlmu5oHGq>b2={HrEW%4)xG{iD8wP}? z2QULA>R*E%k)@9WoPj^=7UDG|#j|N)+3}-H6>z+WX2)63Q7mgq2u?WMR|R-6Qfsgs zZsHts?={lx4?I;c7Rk@;>3>up=npD914omep7Hq2yoi*<86LA&HJ1$A za+xn~_Sl-Ft66QwyZ}?WR32XGj5ENohiBlu~0d%HK zl6BR3R_EHE=rKHrb=e)d)C#m83I}g5{Noxnv0x{z2@}+}ZXb^uD@M)q}YQ3tbd{EnDl&kf{3qmwt<2ohZ-n zUBM!*74Vt;{sAfkP~YdaA?*DkpDXvEQM=>Tn%e-LP0_9N)d)&A%hDl5E9urs<u9e>rw-y%5&D;in{t{uBsbK9_f~DhkiV@^pixOQ z&p$FPP_2il|5KKAuPu~opa#-B+oE%f^#}1e`+RoxN>!Tf?-K>B+;N#lhum}ST>P@_ zY9}9p7}r+M_Gtg)jXLmuh_NW2H?ky)QkKT{o5pg9Iz_p}6e9;hB*$6_lB;o0$}?~F`**Q+ZD-LsiwH~ID5SNh4(~Oh=W3+!pQfg ztZ@s}#c7it24u8qY$J802vvl$oY0bEEP7a&gz3mN*mXTrMUf546%aGZY3o}ZF5zU9 zhfVxQGMg<2U5<1KU{OJlc4eD}M!Ava@KCECwU=B>cBXUR|0`1+Te!j!JTq9}@e*fm*ishC z`Xp$I7kvNfQXKvk%9P``Mufs6iQ+gHc6#_GSAXZis%$zN@^6tuP%6g_Ei%!onHQ&W zujA~4&Tr@u3!~52I0a=3CPb)<6lf)aC&^im6=QwdQ*{0Kg_d_bh8X)B1LCl`$5u7( zFDc@A4K7W6EepTxcc<Zj*} z{&5xQ!V{B=?>F}L^aVBXSnX2Jv1#BQm)k=7X4F&*BE)AiFV(C6yi1d1uE~`gR)opb z&Ht!32?5%Sa2M;vTMN@DvLQFe{1Bo>7uWc&Ft|MO470@A&f>v}tXt{}0>5{=!^C-B zL;KFbFjcCbc>jQBd#TF%$H*{9>2|D5*Sw zU(J$0oSW!fF2OeZn70a{kjuG_MrPRc*$)ZC+k$lYIb7NLqZyWiM4Hb-B79vZbXzjm z{Xnod2?Vvu>i&NI2@Z~yxt>iDT`(tMroI-%(Y5#0auaME@*r9a{c&>0=u7ev_cZOC zmvF+lkO7B;-0&S4+1g|$k;T_vEGi@sJBm(X*(|X>WpGVX?blGhhrQii+nWmceW9Mg z7zTR+5UO8e39z4XD+P!9_(BcoESQVWTS1e)17189%deCaZk+spq!%l`UZ@GmU*Jk_ zt~l7(m&Tl9ebf%M)r73zbtey}Um$+nH+Eb1_Lw}vnvz+hpVoK|mj0bwBTeh8(+zS1g2_$2=L4{qZ;%Z^g?U-Z$!ey`kNWKqn z;k1>4Vg(()X2cyp;xQ4ZS1wB-=(fZ_%G-2G5L^QP>(^3wm4Qq(yK=ReNy+82p8rF~ zNmPA~!Yy^UDOR{}$gb&aj-Apx(!bjo*$DWxkoLQl&ZUUgfh0}ZSWzP=NfvrcKQz5h zD&QVqxVdm}Xs!CFZHhr2{R#CuY#QzX>0HWhwMz#D| zP_T$<8t4_`t;5TUkBxkV|@T8<8 z;gg>uz(dN_`OVT{uqYCmga1zp&;l!OOce1!;EA;$(?1j-CtCoQqCkisJc$A3XZIZy z1}sWS1C${WQQ~W$z#}{gWr=X=Udd%08qY5GeAR>U9V`j~xWxGO2xM=jm|}$*wGkp! zEbxL`1O#BD)DAI;jSoN~RnXs|WFkw?`V$UFQSHeb*izaHaVHe;RS5$i9_714bWVlO zl>fW=H|OmH;ChFMQVk!Mg2j+7-irZ!PLPz<^8a!DG;-YG^*anKe_bh2L$W2Q;+1T6 z-PWrXLe7C84uFh&2_$|qK!jv%ctgPh1zqPGSjjH^2zXKO1OSNVUIb-MBNDr;cRI@^ zpbEr1iCx6znU%DipxHghI%C9Nfw1u^`oN6%i<;JeO)_ggfI=5G836F#79U7qc2T&E zXMp4t0*uz1VD!7t9Pn}IlznYEhB zk`UEdRQL{kSK6)mKde2){qJIg6`_h3E`CrMPj}t+Rqdr{8%}0J+2E$^`Z{#t5iOSGy-l~^c{<9#OG(bb zss!H3d1rQQqt-~W-Sw)LMZDbPBhuO#WmV5g?)zUDDaKicFMw{EB4#$U`@g)sOli{e z*3XM6nyEPK+r>)?vy-WF2*aWd<$~djs>G|XQDrgC@%~{;kwK1eCw64q0%2ILxD|Dw zA2-s4*rXcb)X>?m8YctpWscWbenNqJ!=G2k*jXp6_El52swr2HmvLL`YjV@ROHYZl z(I0_|y&Xc5I)IJINz}M{Mtyxv7Xn#dl|)YR)sBY2)IC46rK)rO3biCNm@f6U*F%sH zUCAE4I%-k}(Ck*ye*`FiQ}Hmy&NYr0)E@^O!`Ev%ZC<}#?;aYz?@85f5AJO4hWq^b zCF8lP*1I_d8I){qaI+4^Z_itQ+duLpd3jearQ0~Z`+ltaYpadsLS=1UO4F#4tjI!= z#y+V)i0*FnkN$*S`Yr_T$2h9!{VcyXx;xn~$t8dmDIqDu+gGz^Lfhz~d`54Ype;|={|;=-HM;*G=qGs%6TQ5xsL zR*O4+xVD8$dlP`l!Z+o&>zTbGj5)ubNgW%@rEHrE%a%jzTccj&9CH5{`puSpZ=Kj)@rGmrAFrex4ESu^vEdnJBZF{H{foB2<|3zm(@!D zH9ZCVtHIFz0C23TZ4{oJmeM58`nOe;r>ph28lFpp9(O(+zQOckoyxP?Xz>*?Hgi(C z$!*bTJU7gE^|i-vzf4ee^{9|Y|KIGr3p`Zo|2F*FC5;e+B8SGgqeg|KGL4)jq=Q3| zrctU%LZMR34lyO?qNq@VQW}-hR?K!NYIhtlq7vFNCLuEpV`lE>JJkN||KWY#=ks}g z@AJI>|NG9TX4WjTX03IvHTQkp-|PBbUoW}1jjF*Bbkctsc@l+OT1giA9E7=~NeiP) zyTK;;UoD+&x^~+!-h{K_;~J-$r&s zDcvs$6If!sq<+RC<24ewIEa`=yI(0GRsB!}gB2+K8eRAB8? z9wRrOh`*6?&*znN&PbCZhy_x{E=7)jBO0oc7C=Bi6yX`}g@ilFVkER{P*?9+caF3) z?Qf)-phacJ6Pl1cAtltV>>n(K{HVWzD2W*y3E^7}&CZJtl^=J=XMFEQxd+Q2?<^Y$ z$rl#l2iJoyG-NK7=5<5RMdXI1!N3>jFV@6uvsGR~jEK}UtrVC6v&A*6gTIJquU#AU z3Sv}aN~Bt+`_4_Eb~uB-3`h)_36sa!R1+x;_|oDZ6~$fFz_SU1m-cdpA16-Cv{ZnOB{`UBxx+t1>K+ zubF{3Fjy!@u@%fRwAerkZ587W=(6N241^?Q-{SAM4n|#)lX*xd%PZY-3^xp*;YG>WZx7W>QlQV*(SE1G6eX#FzUZ$19r zZ{uVzr{ZHHRf)zimZ(?v^s`xX?9X7p7FDxc1*t&*QMhrgGTk5mLIBRv5CC+=6rD;e zc9L>I2#p`Uqt~ju4RZPO6B{ALzewNk{ORizwmY`&ouhLa|KN;{V@{oZV{fi>O8-35 zZ~y%z&>I`<3hlhO^y~T5n|>Sh->pcjxo&dN(01=OeR?63z?MCs>=v^5qpD@YP; z3lLbtOdq(F$$5U9g3x^M)t}ax$7Vk(4f<3|Sz!|!UGnX6yymglpE`Tq1w1tH$y0Yy ze{ddV`4OL+Zc>N#v zg$Lg*xp6GiUCyx2D)Y9Lf^1)E{LN6z*-xkEuRrahl{;tF!ItROqk2XpvzjtTUW{hU zJYAQkm}c%I^MZT=zOIVc#Cqc~>q;9w_no8J%dM4H%u;m7t@;P{9torrMufVgV6r8* zDIY|}w_ z%nX?HcV#)G&P{<|f3My6G`EA5{Hy`Qk8^@bS&l;S#|P%@W|=mZ;aPLGvHhJyaWJr; z0Vz+zd|8b|!Yt38gPH}m{uG>~NyMBl?gNqyeD*?i2VVlRYZM1(O8gX|v($?&5hO{3Tco~I>cWFR^g_-1H@}*vi%AH{ z?{=0{<3e{8jiLhbSFb{v*g)_2t1pKai6amfc$h-w)6M2nB5HD$)72xm`xS3f)S3^p zUJfQ8IvD*1(q61RH+^f{E<4A>_}^uTX&@7NI9n$|_h3Zi)!^g9 z)M4wGU>v%%vbUtl7$>>*!sd6DO?a%)pzs<_XhaS|e(%xF5v*p{y30j!rkwm6?XG>XvHF%M%IP(!SVFOz01ifgCVbYSm6WUwK4ul1og^)s_SM2y zeJ3##K(wT&A?Lcu+83UZ>ZrMJ>T%v&<^eKdbfDz!W8%fMG9DzJRS}#HPYQV?1j+jr z_vPEJ^e#T`xEw0{MByNtm@T&YLC<7}Y5df{cIe|CC2Q?UZ>QB`abBR?8AVYBql58` zN8UKZBtj0Dw||@M?f@f1Mj*b0Y^%yKn3el2u=pa5{h`&7JRHkc`EFw9#1!MTQxN)U z)#0~bxkG^Q7I}#UpT!yF3Co$UWTPDiYVN8I)l#+*-Nds|0pUJ6rgZS778$$xmwae-|rX;mnylk|S8}KcoVU&kHgs{FL zsp@)S5EXUkNeFzw_!iV+9p&^rcgv>4UvCNRX~}2T>Q-qWUL-p%uk0f8c@hheE7?4u z(~}Csx|3XGQaLHK9*jcF;wVaJ9m(QoI`QIowDpDaYQf>q!2}GnIFgQ4IRGB$@o(c= zR7;4l*}$rJc|~TV#e&Nex}1|9S16QY;=feHYm!BJGb~R$2}&Jf=83j?Q4g6FE#g9^ zprnoKg}#2;DJ1iTc+PZ!Qy7><)Y!;ho?lfGw>>@!yuLQxkjM)c%>^)14T}1c{(>># zu8ff-wi=y20ftid;Kv2r6IxP8Q7fZ@$n;$=acH9-u9f`hbf=*N>a@i>$+*d0L) zmRt}EXukC{5rZX3t@7L=%}`hFVt;`9FOT}!`1eX7lPO*mTbxadX0q<8%Hu$p^&Kj` z*x*n}T7-uxKP!K-R2Hw6x?H^U1+Xk+m_Ud4TZTvlGCrOYN=UQi%CH|HX zKt}&0X{xb7;5or!LoH9Cv-SPuGFelIr`3gaZNLfD8h=8=H(C9+i8DU?y4Si0A>+P* zBva>vAVqz-rkl`-my~Z-!lu+t0U_VT)ygiQ0#~M>&KW&~;$+6hs~#ZsR-rV_Pj)or zC9(Ngw|;HuHEOfvNl{Sp?iVBzv&%+)7#D`d1iP`&@m$PcnnE1aL883A4t0hH$1c>p z?dk+{jK>94MVNS}15uP>)wA|>6qm}-SZ8rS^JP?VrmJ)k&Da)|b6~~18`Gw+RCC>s zvz89+rfzg_{UL+()GK>!+U}An7lGE!pwZWD!xTV2e?)R1rSN zoi3-RTstKO*Ho%iFlBFx6aAiZdgf*O-3!YmJ8;t{f-S_w2OAdV9qLZtWW*6!le|;6PDhHt(Z8=F*hr#ug^wcG$u=O1Wa30t>c*%(&Ewpif_y zu8D&=IS9wKS9pGSklVK3c7L{`g%sZTS%a-<*nz~WWty|Nu^&J_-WFhU(|%&D?6ONC z<(QjKe}A+%Ca|Ita_eHQe&{c;TUSwWpQ0vS;=j3bBA**qyU^X~%`!!TTMgq`?!}^# zTP0b>@`bzmg5xRWJ2Vw5+6%3ON|fhkmM53os@Un?5f~tac4M1vu|{-eP4EQ@`n3^p zlDbOL1=BhQaZ^FFg{?kq_^utg?Q|)Lt;dY8z$rC7!#eGl!)mV_&0{ZU*K34YM1eaC z9!Hd#$98Odzd_P;ZNI>Y^ZmX4jjjB)@A7P5d7)55S!e;MV<7_UMe2-=60?T$+u0-z z|K-*#=K#zx+@o=Pu8O*7+kx*k!=AtC*m_4CU!Obp)Nwx=Z4K>bMEL3YKb$$iZx;SrH`0fm<5o>w<-z%Nj8S?a*2N=ZI<9Oui`>y!o=AJs`E$2=Kt0%5A&{IP>T^5H{ zU07XQujZRQZ_6l_I*&J`JXpWb84#hUZW^TJV>UL6Mipn|DJ@awVs9g(Os^9l;n8-` zG5f7V-n6-amvJoh4$mwUC*q75j@oMQvxhF@! z$>Y4qTr`%n_Cedn_s=+QuA6_v6mSDjrwsb&PZo7s(S&44V4wGGm!tb@=32$OwpZfh zW{rG&d2&H+jGAI#Oi9mtE`dBiwqF}zIG%qnDE&&^$LdVB>sV138q$Fhs-j+b#NPu- zg4_qnm0j|eR^PN(B^)E#9{Xs?Jg%D%9omlvmzylnHdG^XNQ+6kurwr1^1uZ=MPot0 zgYFkYNwW^5X6V~7w!ZrESpCVv6*$m4i%DPTp&~Wc2BToE@^^4Kt=?hJ7Pkj2W zv6$vX4L}dH8UBa&FL6cPKtMmk}e+{_$o}( z&c)v<{-Y>vsC0HJ;GD6ffuvgdU-AJSLNO(k1x-(~1nn}{GD?tyo$!cOvmozV)zYxd zAI(9g;}kfwWwNd+f;%I)Tr%gOL@qMpc6g`ngyf-&J;Ce!O<8j^o`eQ%_Xvt6#DUio zWzRt}pVQ&hpGJ;nHtV<_>p;0^8*X^pr?X0nkZ3?SBIaR|$D@6cu_Pp*Eqlul?-UW~cfUgooD_Th^NBLzM-%@=TtnN7i zfn*IM!yl1_yP}ZTWJ=hB1So08bs*$EW6-8c9O}Le@ ztEk`VKldrp<8&Zy)6>guWa$1QZE@EfMV!K}cr2+Ms=N#y!#@3${*_ z`5KfYXl0aXx-_dlDdT4#oahC`cq%op@Ju*3%3}fcUbpJShOrVM_!U=(MC-^oadXR3 zTP<|9M4pv7zXml8PwO`-KG=HGFTtd0@mB&O=Z0f~sfVjfVnc99QZCi@203GXeUZvwWgRhF7q;dk#VKtQq!7gz*JX**vG_V zn!sr#85O!5Cx%lG)lGLa-2>8Sr&tPHVCApifK14MtI7?uAm=&QjNgAn6-YY%(RU7;gP0@yYrK-DC=f z6u83*(uL!sBA_-q#m&a^Q!gn7CPWyXJ4^btI!z&reQ4_mplGU-_xd5ZAml@mrLKdfatr(&WLL@YpvBJ z9@R07wsDH~jBCv~V3tfF%JB7KR1R!NpfI(Ro4f%@db}oDlEz$|S8S|_jl!7TF?_AN zDXKW?z{&h5=cVQh@EawX+q@pktSixUG&lJpi?PsHIpkL1O&8O$)6*1vm5q~$o$~UJ zbJjKD~$?K`d02KX~K*Uo4fMvsUAC(*5&_3S_+ zkFhgU)5|%Hk>XeQz+|{_>Iq^fDE;)_4R#f_2W?w-Xr{>6x#*nJS5JK#Mww%~*Cvf( z7Pjx4Go4--r|>n5%B_oiY39)|TYKJTBKFOONsp!b zOVS1#KbW*MEp#kmD6afa_b}FNVNh*KwPsiyrEX#8#aY^>jKJ8du;~Gvrsdw7IzQ{j zg8tjbl6rCJjq1L(!iO~$?ToC$I?W&D%03u2g>6pQ!OW+3l&d>AnDz0l1iF+o#krIJ z-0z{Y*|_e3r~9#47vtRIioZ5Dd%X7!%^A^dByD}%&vzA=)XO$!DKve$MQc8B?Xu%7 z*5dkdQ-za(pMADPx}QC~TSNSG)(EcI!d{;yyw&F;Jkj*E`1wWiuMcKwBtZZj@0_f8 zYxFneMe`ThCXDQ4lV}AWKd)yT&sACV?kLI7HY0!dK$g&>3&$1*atFr-_Vh~_`tSJI zL&A9mB$nMa#kFk*Xy*9ur>?AIbX>m`do93>ka=Nk0zZ3{H~fZ1qNSWJ=kO)MKAd7^ z9Fe}r=z=DiZ}O?(hB>L^js1pQSqsf2YrSid><^|rioL$9s&rB!E_H3vS21Jt+l&Y% zdZBjFqpluHH(~y*t}6uR2&Uz4iF2%P6^7>Ys4b-UpdV^+2XdVndO0As;QpnQBTP@s>#J`UEFUIAH1gEy*uFg~y z(x_Cir$prov0jqh=0$TKBc7N>7EhQf0912D`%REBY32ks34$z=ZBa>q&!=mWj4s+j z`6I%!pe_C5zwRL!R$=gZx1GLg1cZSooQ4!$=n#ab8p%HXNThG|H1w;)YfU7T*1PhL z2}3Yo+FLn7Gtpt0u|&!~TAoVcODlMeb?^Oq9N6rnkLm1b^XWX~YCb3&IYma2$}Mx(D4{scgDwbzvgs935@3?5hrK|PI|LU8y(?~;P;#Om zj)3=0caB-N_miqqp2EVcS3Jc$r1{aD*Trgf`$$_KC4QJE4k;gy7IR8EGiEP1{l2fY66c*1}#>K|AS!4N9oOJFASM zrU}?8FYkppB$?^26ti}+(F7y}(oziw?SdBoj|1JxBqKPVQS_XaxLdR4xC^sqI({Ip zLr79;dULyx>f+zdWOo26k+Er+`vLN!;8A5%p2G!y#8Id2A9ho>hZ)oe@YDeDQRmmr zIg+YS77z_}u}|j;ctx5MC`EPZ>pLzOhgP%rIE}b&uXc*Z&Il(rkupysOm zvTPKSCLz3uL!oywdVI$pqXI@-L`x<4a{L!{G+5c@Nb_V&0Y5knp||kUX@t&2;ejEX zz02YHn0I=1(MW8e)o&Bnn{`z$XY`t&<^%3a*vo zr~j7p{gXo;XzPW4g$=pKUhioWi>q~};Rh=>B62PHQN8i*%Fq*JgT=q40y{0sYP#*BBKUhcx(- z!Hl>k0ye+o9?2ZE|Dy;ejJXubUG?Pr0H0MOb1?=}olXGnwuPj7+RCKu>*Kk5kZ>0# z@ABR13%ZqdiJIg*CWy<0{5#9rF!;<6RxRu*H2~bO2#-CQWmFZu@-T*3q*y}Ikb5bU z#0}rhg;GK^Zh&C4rH!Ae5PwU}YtgEaG^HVlo=g^aV+CdOx@`?pw2V;+(5*XDOU~UQ zbmNy2J*L8kt?MF(z8bM}>ai*qW%t3hDW>E6}v9Y$pipW}0Y?>}R`-?{@LyvA?+D9j@gziDhyRG;xwpBy3@F1uFe8n6DDS@Zmc?p%VXkiZYZVyc+GRv!x+!iJw2Ud zj@iDwe_Ig+!^YTBWWcO)>Pb;Xx%j58jq>IgJDEiai~oXFlfbI4R_FALC3*UJ$!=k? z=VQK?&{LP(F)$pT;jsHap8m#!17DlxjBCDWI~9e$ntt6RwR93hZ2=JV`LNm31$#Z? z6fW7CXntRqu(EX4yw|8VTCpjs^%2$0*s2kd}GI&v$_nO<)PsuJ=!r^5Z zH%`bkfqz7~K+!Vf)wgeR%xuLKm0m`<2Y-9=d5&GOY3bZIDkI|>jcfbtZ*;z0XlHY{ zWPaUcxy7V>#rqCE&D%oVb%KLwlfcVkqfLaWc!O1w$GP=a>NU)BMsOH&jA`^hvjqSx z2=oby;*Noz#Dr6i7Kd;v8bfDIrr-%umSaY_UtE2Ky7gdQ;MO5mNLdH-&tFYD*yYNS zi(&0fQnmL-h@h~fT&~mgB(XKlBHIp!*yV2)9L$XD_}YEZLmU~7?<*U4I;HPUPPQ5D2=Hk(gGiSh(P=Yjy|2%7y7IrF9>+?7KJRpVh~TL*jkRNvKtO zYHf4^9*xn&fk5kiSk;e0$D2>0tLx0pnU#wtHQk3ZF3`}f-@f4>-ZvTRGoMZ-j~Bo^ z8dkL1CGoQd*rP>L`FE~7Cl_fL&@eSFK`k9bHwv*AhM)Ajx+tL9h|~>*BeWHOo#MCx&YyZ%HkKxK_c%Fx9V8Btlc*63Ya;K#cq0*K z#?D2&k5>=Y#gQGs7>gh|P$?LX=1h^e9M^X>G*kfY!wT=!2X2c++#JzcEuT^m&1-Ma z0iW$bsqDfgAl{klOZgA%#ISysZS<1P%Qp(pxW+s(c7y`~3jP<|*P0Bke?!-rNCSIC z3t5Oi`f90eC31Z;m5ukg(og%r1#tybB>c`B+49F~SEy$z{TrArMws0yiDi{SMpp3m zG^d3dgtL^abEIYv=#SX_TrMp!8}e(p;d_!Q^skT$MxR(B8|(t8x5acmLeMJ)B!UrH&+b5o}YC;#+x zjTCc9>gs`ucZ!^lAOXv3=ZMRYk?9f`t3>)flrS{ zyV%=-qeP>Sr!FF51yWmv7s_LUXhNvJ4s69)5`IdY%&rkB$Qm%JqiO`%4FD(f9UI*^dmf*;Pj1v9*!M0X}LKfVbR?%L&0~F(; z#~cB7_qku$mHiRHAbRHVOIlA#-OVqU;H6q=j{fwuyE0H`(HZd%R7S#c6t#ElCZkK# z$Z9FIyNq)eG|we*a_Z9+%q|r&#UYgg%sP8@@`UAyr)=6Qa%sn4u{26YI#-Ao6+70Z zb2^z$P3%ruO#JCsO=nLmwsT43Y3!d<$#jKtkOYv3K){oSR6kbDjE^lH-BV#Yw|nHcZD(X6L8sZJ$&|a;R3xVqquyQqXG7jO5_4=f+o?ko#3s9N z!-d-!+3<_H6p}lGy)=joy^4M(5U_?dNS@6>>mMoOhqEGam}Mz@Vl%k1njn0;-B;HD zmFOAUJH10~o#2ge6>P0n0qL5@~OFHA@ zH5E$EZAU|m&<1We#Ia7y_X#OUMNg+u$B3ppe+Xph1b4C~8c0hj_kiJsoUArbxZq1_ zUR(*gnIwMY^YS4WI4Pb^B}XcIWUDp)+V$68XK9>xZQZ~%QUiL}$!g|sf^@&c)$128 zb~a7+E%}jtN3|GMKN!h5&a`C&oWSP;R=mA-65&6a=H`>bEX@(sz=FK z$;CwZgUdKP$Fw9xCub}|_q41EP{6Jalg?qbF0NU%aT3%m+B?k(Y|Z}( z+}x5=?>X)Re=r$!_swSx1l%D`lTAISTzu`)rjk_5g~gQ3rF7l(Z>ci+wNp_twHPcT z2uknRf?WdGpvS1`&5g02qYHYy1G*ceF|?l#Bo#|K_N?V)$dJbj8mE$+P|<;VTGLL#2B}B_mzciC266dn=3-nLWti~OWGL~LAR>4_SWXN1_u>p z}XlJ5G_jj3jCA8ZN>LlWk!a$d8*J}2dHXy2{j z>%y?6k!PEH6*MKixjH9fE{2-aT&IDjsxNq|UJTZIQDZbHI=ie!b%Q}F$L*SHo8%$; z1mPgeyX7q6T^(P2OzSvlI?uZ-o4qSyRa*d)Opp9{PiaI5#(X6QyFBhzx|zs_JMqAP zEWFAz2{Fd1nh7gM!-C_VPgpCWXSAlVvc8PrHzxzPy@?bG$Z1R)6Q!HVM9mfqC98s}tB*9_vlI(?qjv_SR+LsIGpwcuJZBw5IP zh-TR)Hk4M3x2mdiS=_{b75ib=2jetP)MJ)vL@EDtZj-xB?mNm$T&p-gVXEva*Yrr|maGT26sm zNB+^+4(^rC(s9pIU9O{!xwgBmUCS1^=DMMGy}tUli%#iVImP9)@WwwqgW~Wmc?rfT znak#R9cXKOn?~J3I$KIkiEms_F--h!aPS=VrpDpMs?VS5!U!nm!5Yw z@s*&6us|^~CHe9c*}N?{dl(Xxs%YT=(HLn88a>xa1@1dTh+oXuk1la|iS)HS*V0Zr z9vy^oJonl~uUvIl5?moBR%=~#VH~yrN)@*WP9$w)BMpNIC0DjM@fVkw z$ZOV3YFuA+`ewR6(OuD097o!rYi6HO43(wbo^I4*iuHYzInP6dq^Jz^CmJ{}=rc03#Icp~f@*NDR7A19T%7dZA0P}tUHmK?O zz{m4oNOp`PtLBe3 zmqa;CpDx^0$Ieph!?PZ5iyuI9HffnX(-M*sl5kwwwd{pb_lK_%C~3*|XR}>cSde!3CLr8zCfLAkMY zNH~`Bkog$TSHni|_@&~d32wZTMmkmoT%(Bt`bOJ|zTHWWSF3tN8+lF6%qWXOFC0%d z5^B_7$|T%%Vm}MI$c{2rj$|;^g(dXbLE!JhqqO%WE{8r6<X06N=1Oz1w6m8K}V4q%o5 z&G}WRvD=*%F$Tk<7__cJvepU9#fAakKOI5)vfjK=Qo;y)mKCkG0}PZ@0C z{hO4PGizm7J-csd9XAx9FVVys66?F^6GBWq2;kWY1b+1%@dd`^Z|fpKzEGC7h_v#3 zIJeM;pGbdOLmOcax+Sv8GR77=khe+Q`x`{M?yLuHlxL26L|6?m4JSTDYa@fsNPE-YG|D&Kn)Dw-XP3u^^koRf+8on_e?XZRsSov-?H)e=a*Y@-Qg&jU^Bk=m z5HADh`=H+WO&q~Ub=}3i@jAnp&r#RS9Pf1qK1byg z7qVU-TDKLP0o#~`!U-sgi5sIyZliW~z`S>k=w+@-U?8bvKTRCYwLEYhlScdWcn(D+ zuu~~oO<8~N9AW^IumpMS+`20x_Leb{roMnfCA*kNyA0_hRSPx>#dyp*`ZV1oL<5W74G87s49sFu-kz=l7&A`q~da$yVZp^CR{eXPlssO zCW(gZ6R~V=9LkSUAZYO~(R%NFtaReFk&JO;Lb2zNBrPY)P!7qY(HOnP&3G~(Td1mT zm?ioW;{)5W2IGsVrc{3}qvI6Sv>Q4J_5vT7hmKc|ON$Fg)}DvD!cb4sgo+`>N*&0+ zek`#h#;}f85lM|vmAz%kmKu^Zt@I+6VRSEjzrOVhLyMYRue|YS!jVsJm7UiSX4*JwZcbIa zHp3HR4DMugYMnCe>+4m#HP5-?maC~M)v1MmtTDwqLvH%HEkxZ2-6+N5gik}ww9YzB zqOq3zV3+bH4Yr&qzw)K*0bOG9(bp~vJ(>R4DB?ZLf;#Do>?0g;4LL@6x5yIM@eoK{ zWXl!lt_Kf|0Yw-0ttjR-OeK^hn#7s2Q{|#&D{t?@D4RwTb!%o}EGvKpS1S2*dbJGI z#vijlR(>#QcZG|YGVu&4CrT}|9vg2~+ZhmHM8<4)!4S<`!0oI=Pv&(_?p{VsA!Y%j zJ|?QhD6cinwA^H7vYBYvY=hB-ghw-s@(>0!ngY8 zPh;pYC)8IL{|?0t^80+D(!pO30zwk+3kLV!dakfDnX@+i#sf^z^}>V$8TPgY<=gjq z>Yh;CU`k&W`urB4^ysy8eXE80cWG=t0HuYdXz!WP#l_#WE&aUo!)MRi;xkEaw{H55 z-EdgjV%cEA$Z-W9(}CE_j^`qCXT-eG8tLL5xOk>;b%E#3?(inrw8gQQvQ8syuk8zZ z*Tt<+aZd@#oFuY+;%utL&SrGNowu_y+}>%NMLYvv?6-nj#~@@naSS{!U#%4G%rV|3 zUJ|Ut4FOrYBwGnaXrK~$er@0r$4A0R>mW4BHOODB#71EM#2hH*wIjb^E+3C`EfVsR zm~w+?*!InJJ?NAxT_o98Pu<*(###DMLEwksSg34ur9`7ZLPbTf0b2^PWHW5|h`&4D zRX;3qdlngLNNSH#$h=S%DRKzwqiT?o79_0rm5YQzQCdMd5XNXEg@ z4hh_M44^3v7z!?JeZN~O9OQD61mjj4t1@HffU#(H0eX-QDOF4NhCpHK>GPJ#s-SE8 zh5N~T_JseK_j*hCExnf01yD zUE#$jMoW?MWTQYiM+jSo@zb;G^f@g(6T z^Pb;KOvbrLv_QC1LPL4Wf7$;FE3c(bD5-2_m52#!1UP9jm1DsSJM@!*MbFo0#QA&v6%3KSk0l2 zGBuIp9vVU>Pf(`)K{t-fE1C%OMl}6)ePdX-)*!&tilmTcL{Dx8Rhfq4=e9HGH1xl=9lm2?*4Y+a*}7PHx^*GDRUZKoYv5k2E$Jgv%H9 zpOcrYJ8}aJb+_)c&-g3WhH6L2s98KIa>L-!7bTaYZpphcPQImeJaB`gDNNG+v@@?c zKzXwJjgZEj7cwj)V6ypTnjRPUsO7C;8Oy1`ox@`by+b9w+8JxrbgKzN4gBh|5e{$Y zvEe;5AnHPV)z6xFWf?=W(jd`cym5Sh@MUwHdiPW?On``9h9490}0vReZfYh(@{`xJ%2=f1XQ`J=x=U!3RaCX1JCXw~V5OAevrp1)9#oYdTo0;&$A%n{Db)y$9p*Xg zcWJT7yPv4I@Z3ds^xfv4(JA2|pM``uWp}eEMiHi&;xkBcX_7I#N6stfbdbx6)0f?` zA|>d}5kBRdio7;S3o1&|Yj~qcMKL$Z(tOhxPAWU(7ING6x4rOOrs(xE<}?{qifZHS z5uG1=d<%{FBULH?&b(?su5t4)O1iWoVDa#-1!GaI%?$tW7a5U|el zUR!}zTaAoz&Y2i}eKTb}%t9Lz3`B`E+1 zXDOuqv8P7y7Z?`)PanU_{A2wrzr%Zvh8*#u1W1^I|vCQZskcf7r;YZdkWX)pX@*Pa(4sY#ejxG5y&2hQLFCN45n~_W0p#{lchw{2Y!@PT;qN`i4lGX|fIQ zj(*hr2SRjLnwzfvd9WKcklfttDaU^t?_`_)Xd3t)={Z1i1V|eeb`TnH_^9p*Gt1@p zt%1jmPJNG)uE}y}G*9YYIM2zy{W#}UrmM^?@HW(tqnrJXYzPbp3Op=rR`~FbmiSNZ zhV8aa&AP}E!rrD|FD^MmEG#&d0lG_xONjC;mLQs z&JZ(D;%~pcgPgStHfk`qyn-OgwBG)zyXCg-LxEFzZV>e8SGRLPae>I2SfVNdvp2aP z(gWE-XVVOm4N9N6Xnc>z>@f|YQgJ>Dp|bSgvC?!(5!mSn2BZJ5VM8QgM6;t->FN4| zG$g(^P=nQt5!zAySV(S=9Q*YtYfSg@Oxo7>6b<|5uN$wMr|7CLT)9P){&q#s&M_<0 zFe<_5_nN22oYjx&#K~%#UY!3Cd*?H5I%Z76{&$EjjE<<8Mg%3Derq@%N=YXsd$};$ ztnh6~#P~==8a?po>dLC0QPw_=Pm|$J66k3P)bwB^_~PKsM+)BcD;R5!wmLm{`_rdezCu@;-u; z^aCx9*yzNQ8J=j!DFUgbioPQuTcpWnjrB{!vmu1zkH&+tQ#H`XeO0tPYN!jF%oSZV zmvDMg&n71N3HTXVn!2UUk4<%@=60Nv4q&oGeFuKeoK zimi`@!ERkaPiaQiIxaRf@%j6W?2gh8Atl!; z$%ZA+5XK_4Hswe=rkVs%VRqRY}J!2Oa6;nGT`kf9N#;nWmhQWAYYw+&;F{_2ks zc8H3z<=&fG$)@X@V)bN|DYB}u%EXv?&Wol|Vv-O4m|QHvkgB7?*GENSRO?|bfkP&} z(}_1=aE3?vW;Yvy-ZBq0+v9&;D4L(>V35-I`N(SR|B?$^q-XR$_n1(Ot)mpT9iqA!{&4G^3iwO7_b*&1mkDkUdA_nyXp$NevHv0%y*$yN z5N7Sz*nGv|&7lN?Ug3>{mUMb|K!rhKdp_lw!yA4C?!VL1 zZo6ARuy(-DRxa~UKOA#XVZm{4%XmM^meTs*viI1AfF{#d@JXLa>{rvPork(^_$OMl zM_Kk)?wj}7dx?Cx&AM3CMIp~x-*R6%E!+ITxYmc3Ia4zAlW&2@FcNzE6 z{**&^mVLmCXlxoR3*J)NpcPP~9rj_R!uK`X?FtXjZQ;sM-~eoGr?#Yj&6QqCuiF@* z)eX4N{?hv@DdFDFFMDTWodoOu%RKeL(SFtMfBi4|d33k>N}Jum5A$ED2@0)l^d;Q= zmy8mY^zK96KW@aZ%}F=j{g?UeKbX30rFTO@`Tyl8Kk-rDpw)MtOSI?F`)>6(5$u7`(HD1VzmSA{YyGiE$Hy>&t9$Zc~45B{r_iPI;DMl z;xn}?#{X+T=j8=gxA2b@!jI)&a{0@&ZBHr|ch<#${wwHz`O83Ha^c9fLl{ zuoF57%RbE3Hz+Y^4JgxF6Sb!N%!9M0?>@u0-*+biP(^^P1N>YU-I*=LBKcCh@Y0~S z)B_7;o0D$b%WKcAw>^gaYSFHIwMHWhkj277-%Z?OLOq-cEh@^c8zfq^UTB#q1r1Gy zFUOwPkDWvmQ3efAl(heKm;M_1h*ki7)2H)m0QOw4I5D@d*6OyAw6EEMZO}Tj(SN!W z9#N&Y`~$iWzBz)3?e6_b4eJfY>eQc9EURA-WUm7w@kXt+@$M8I_f#0)Om5P<6UvOt zPfLMPi4>XcsE>ee2A%v6Kg{f5h$TI-Yh7%+uWE(CY(Qd0ir4H4ixUflw`Iw-PQ%$tjvH& z2*Bg7`qohIV7tQ`Gg~Uow*5`>j%7F7y4t27NFrQe%kF@)F1y1%C9Vmu0ECtvjI$?V zr^ZqHlpo`%N{kd!H!IVnK%;64KSHN3@un1eTc4|)L|<0d|LtM@hdbv#JI+b$MrTjK zx1X7L+S-_IkFF2@Hk{&umY1BUj0+^_WBdwfssJvJ^-e!oiWD+80s!+!(k zV5>iMc1hPKcO-oyJrt|!2d4Hr*@n^`UN4re0F;{*{@1-XIX?Y;e-5zs|KuF2bXLNZ zkZ%9Cr^K6oy(|3NYWP$PT*?2#8IrVN{GIsk-^t~9Urwl6p5B|Q6Tk8vc4gvsUGLg=^|=ok|9HcvtVm&ABwQ268MVCD6Hp4QX{;ryiw(!+;W!n-$AOKTkfS?ax@K zaLA$#J6proFht*^+_z4-wKymy@uGAJdI)>9MxDM)Yi;f-S%^Gdve2;q6#{dges(=! zaOHWcvNyi_Jar`Vc~hrx=S%+48z-cP*K&e9KJ`c1(MI9A`O*W&Ik3M>zQEJ!M?bIZ z?N!-3rrz+SLCzi0t=y)*_OA;Zrj~S5e{IB%E_R@Ndzb!1qQ1q%$qITRepI4wq2Fad zFB|KoBRc(?WGo4F(7Oz};P)%-6@9Op(CKwp#l$+T`85~+47!I6dwdT&SHadUR=-PM zgAxnz#--3&lN~RXs-b_lb$8UEPV6V*w6(G?;<~!r_G&9;md%6vEx+-2SYuG?<=DF2 ztrnZKrY`wcxI`_1)=781|G1WgM=wuaAwiF|YPR&mx3D5dXiJ_wIkI}^%G9tE#+g?V zcRYIqKOxwl4@QBhrXc+GC-mylw)^(2X@3eIy1t)nH1(^v|JP`szor{bu)j-x-M0xk zz5Rn(Q^n}9@~|7n0zY0#B+w<6t=(e}H#Kc~od_NDkM41+iti#!>mj@1)|5_#<%;y( z_1;)#3#~(z0SRTM&w5l9E9hm=6HoQ2w*e5AVLe`6BC0*Wo4(R@i2YFZu?|zAVA@KF zomXu7$LkS|yVkH{aw;*fUu2Q(CxSxL>0&Fm;I$BKaj`uK4O8w_{9!w^*u~IBEphubRJY?%ep~pha!+2klc;8nI-z%1@Sozl5#m!cXo9U~+v^Drf zqxf1m1-6ml$7Jj_6Ao|&MVumd~FedBTfsr?*x(T`%1f8EiLAi z%fc_oqNcdjLQ8h%%jY*OwEuS7a84c`g(eY{AA{>1F<&^a>e_=wfoE9e3HU`^>4}i8 zmHr5>Ma&=mWA%LL9Hix>b$LX`+P^wVX-om;q7$%25Elu?wxe2r z)wzAL9wr;Vx4+?{2s-M zLu+E|e4l7rXwB82lxf^NgT=<`&vRANlHMb6&=ca6>y_#C-g6gAAx&%4y0Vvt#+++{ zGz@;2f@#U$HI25I$_!5V%`4`?wfZ4`{7=pw0}fC z(37mo-tl$h@(b4+y^=2%wH;cf+F`OWe%wO0f;RmR_Pzz6srvo z1O%}Ga#3Jo-Y`v5XliaMNNvE>Ktv<~=g|ohZ>b=73(Z>~I51Sw4Z$lap@V_QKmlQp zieRAdKHsyAo2Hfa{`&pj|0&1W*>=wN^4z}9^Ld_cKbh<1O+yhOHun-IH22Diz%tgn z;=`Y{&r12(z@_~}W>r(u6UkS>5lxMajr4=J!8HeRg+>=J_N}53)=HLm0g06l-B0Jy z&RfRllO=e(lSs}I(RnoXOp_R3cJdK2D#Bt+!D9#T6md9DF+Yz1hM`>p_GEWStN5)S&lheJ?)@%icS#YyX#!T6#=67u;<^&% zS^P~96Q2ZZUJ-f#bmpY1ekc8$fQmXYb|ry%W} zY%;=|+z!JRR%l{M7q1|xY*n*4+vgEZNSuZ}UFM%U^Hag$;MOSh!MO6=CviE!M@ex& zg(~+VUp48mq$*zBTxZzW-n1N-UTe>Mg2ONsjgdr4KWy0yVN7-G;j<&sX+t6_8TNloT z&P`JaqMa&rmbRK}&TdtIX038dflVcVh^}`w@vCcKm;!6I1%raR*;G+;{c!-Mb~}xv z4yfzM87V+4Q9JgI7J zRJpWgOWIo-X^yxOk3ZJ4UFKii?Oi9Z!RpcmCg+>Tr|c5~wOf8?x@lNgWEqn!JjIOaoWOo6 z#4xkG2ZP~{sZc8a@qK-o^|W}JtwJPs3Sj!C%I!t+8K!f*$b2@&_l-7|&tXCWR{SU) z!^GY0H$ZTQdla zMkp^r%0%&NydT}x2%G@p1!yqtZ-$Xbx*e(aA~I=a*chr@g4^*NpX@VgQt6qSMN@6t zbDpRf*K&X`DxTo?TbgjZ6AYWZ4ApIow2{)+lUeEdv$uXHAALff)?mNDl!H-?^F-G6 z7?~oY4#wo3VjhEGgYy!NM-WClcL;?g<39|js-949d||oW>bJqpAy=0a*gZ;+mPje{ zC2z%&a`m{0+zh_bKuV2O_5+{zw32GVwBxtApVC+}x6lk{fZQmltx0AVU(a<+DMO#s zyGeH)01B$DDbET=#Bf6zK8#S~x56Sd)bW%Np|x?qRAe7;l^g+a4m1}!t!shEmWN?j zYZ#vyRi2eUwPM8s^AnLpdFARcMRF!*ZWe}RMM`VgO<>Ei$~f}5IwkcnB~3}iOefS% zc(%^mNM^J>o6o^WcS&}a5)IO1wsLRTqO+GaIxQG%EE8F~7BxOyd*DgG9UttPcz0puL#5A>8gw#R1Cuw~|YMl7#b%uAFA z@taFv(VU2dPTU0QIDmwz05O1|zShUppbP99f@F44V&QIB)}!%>1O_H;2>p`16B{HZigTRE|$_P*QfImHHPn=d-oK4sy@|XG3I-As6voV-|fM%eTU32 ziId9hfX5o5Q!n7FGf0fdzeRsS?LjVeoN-CF2_<4atFa}>Rr15sBK|{ZA-!(#?TQn? zQ%X=h_3*C*){IM+Co+(*Px^0d`eau_bxU8%X|10$@t zEkp-&3mx{VlrYS^yaEd?4LuV(ucExXBbN0*_)|{KDRz{c9a!EfI2E-*F2u5odr1@* zG8;2Gn`vz?qMgP0p>kiIlyr^C z9a5M-%2=rt8=$GW#&@JGs z+rjQXBK>=?q6TYDeRN;l83y8X7hKYI7fw=%)9*VUBS8dm<>AtT`P)aPf39Q(`Cg;<49AVby5L^yM*zJ;BB6hDMj;eBX8Ect{=!-bg2eC`rFjyhRj2 zlE?R41*1GoA&4HkkA$tdusqsyel*>Z?19x;%J+0xxv2k#mTn8TLgI2#NqvwB8i4Ed zS6c2>fo0nm?py%tCBl=i1C|5v2b=FzU9c)d9D}ex+m<+M*3I`pj38gg<0J?z6vA>E zPHhVE`xPGZc1MfL-U}u50bx{LZs1cUCsY|3^=$3~<5*T1le6+G`BxpCa;8AeT!H15 zF~iDubkNG+7)+nyWyhc?((=R<9(Cb0Yo^d>HFoFX!?iq_G5m+k2giUxjFkGGzGZrU z*UEHbN{pd>DB&eJ5W>25)k8#~Js2Vrs^p1GD!Tuh&xNR@D6q15WbxZ76|@e z)tM{}%F9T&Aia#?*qsea?9UEPCftc^f4t2-LFfi1$t*Bt56^ZzgeHHsYl`d6j1<4S zxrv2GfH}~=eYMR^{teYjraTM_3oHkH10zNFQqalOfa{L~5A4F4BZF#g7Wp`XE2Uee zFy|f?4)*D2S#tuTE*7-=C?9lUa&QI-jui!GJ}a*X6C&3MI}FP?#hklmh=Kl2q1IBd z=i)rMx3!nC0+xXFoP~nsg%!N_=yI?#Ts4f_9u zR$Ai3PfX|EE8I}GZh-#){!Jg59al7G!}!%yUs_tyfaqJJwQke+E6{Mi3x)LiNe|tB zkc0U23AkRrw6+;6vc||6Nrg>e$&;3`zsUG~-t4XC&xc2}pKOjmBZ7E=(8|{zPeR1i zyaJ7$bSEKqG#?Y+AzspYxd{WMu`94JjGFg=x|l7D7?O9u6cNheFC%~-aUie!6$-%S+Cc_d2LE~jH$pfPCqzxcf zvEEs*ars)KE1-Guq@i^h-?iCJXe3N3YCZBSp?~Gc(1A%vVFp}pt|1ICjkW}tfqM27 z>6D_WYSc;e9&rTv*NnIejD5HT(MhfE4Q_%iYhHR-B+M{V78oU=vCKJW(&u=`B7eaU zA!fXDCDBdR9&AVybc8vFc>4mMK3Zw?ynFX^;B02sJEC!Y-f3NXy+1;2?Eaai#XX&X zeV^59SpuT%FCKjz`rco{z#%V#ZUm9brLag@duFy{C@m1a~9VKzckY`VIwngP^@Rd$4r1% z0C=EBH~}19y5o6|J+rS{ZEwM1@se)On)a8^2NXaOAqRUe$MStxif;mE#Xef>B&>P% zn4TUf#QWL=Em&_EcmpMc&$c!Z|)aG>f22mO71fIhdJ(1xNf(X?zP^yrI)KkxfS{5A32=VMT_ zKW1MKT+w40{Cqq}xc^($58V-u7qtKXw;&jV*UYCem$$hLnfo&Y9YAObdIVl*#jrwu ztR3~fVL!7i5Jb~TvK}1S&71$OGhLVvSy-=sAg75GJZKQ0g2*mQrqS^K{?P!>H4%wr zfkXDS57RzUl74(mQdfYkr<(`H&gM+pPl@|sYFLc_L(cphS>oi>N4p_DSg{Sgb zfE(CCFyIXwPDB{_wdDY23~q9lF|3V&U>$zz1MmtuI08mAv~-!2J*|tESfqW;NA1r7 zlYVVEkfB*SyxyIje|AGl1ej3-h%_g+H$i5qY)AFJ0+~FpC|B^11@d}_rOUSHsm537 zu+DkDO|Q|%8-%C)k8S=x7~wzL2D9mpy>GpOUQC6r_=5K1^9lrAB3U66GprLNdoO@; zI)q#X&5_14m}p#XAI|awyKp(u*Da>@fC$MCkqXTKJMpH}0n*r0PEreBQ(L`I)pT0} z@rPcC&!tmPCtrPl-HR~Z1cYCM=6-VoRJX~DaP$3HYWVBlGn=kpDfhgBK8#;QVY=Ug zZkX0EJk+N$o8uIJ5qk}`d7dqT|5-+Yp?ftaVUd5*KoLsKkq9Q!sVK9fVGs7^q)PEZ zTCWB7n`FGP1lCYDn=k%L6~6d-@2f*)2KZDpq2I-{b5|il0$_N-5Rgmra74)y<8SN> z_g?{M*X$MwtbT(aQRCVe$uanvJEH|gPHzAjxJ-jj9Jd94WulO9Mdx(iI`R1m__bd|#U+{%0 z2+9)_{pI_E;T8|F05Yo}hnYiIG-(K6Y=x81TK1-FvolA>Y9XoOLQIOZF*8QeE%43)pG0{_A< zkgj}%24H3N7KDHJZm0~jAe`}r$nB4a_Kj-FC%{N0i$7L)6NV>| z@zxj4_X=z7kC|ZqeH0_^>(zZzwk3F-)5Nb}8XB$j)l7rF(Lx=}bvYhnVv0xtJg0AP z3X5F;vi)Yc?YSXG32!g=8@{;BfyGiJ`qTm&hJuYaFDi97BW=U%-s z;LST~zEeco@{`_K`2WHIWD4n|+=*^qyzH2<$?TKVLx1A<5k=MKco)4qWef1Nf98Np zYFSnusQml^^0nqne1Yhmk-pR^RU%iC)TumJVgNYe(sP*7`~Aq z_aY4sNhB6K5SO;z3Hrq?1tj>FZUKX+bC^PGFa~K>0t1v}<$+R=5=uNTS@b8g+SvV5 z!ka@eNF@hLVFA|Q!qsaW0Fmzab6e8y68^g{--fUb7*OsYU#kS`r63s>TWP$%?3;e? zCNxKmAZ`H9foPG`XlkV+tbf22@p=9>4_J4CwH$yUjcpDwYoRm`kw@kLtqoT1B(}K0 z%-71W=NfSI&{aA}b~;7nr2HDzTk72i>IMtifc~1F2zx$q#G)-DjHmxVFa>1I2&Kh6 zdwi8vMzh44BL|&NX#RFmWS75x4m(X9J0RPKFopbr20}n!Bp8QT&6BV>do(RalLR^Z zCy=A%8Ulh>hfd4DvwEmVPZ)+?k??OJ8BC`{;T+}1u(;Y~c$YmegGg3KNf0kSRBmhe z7Q4=&n3Cf2OCh*+t&M|o4C2k*I#8P`hAxaG!SzEUNhlc$nNOMsHSq}w&%r!8{ee9Y zPmhxxg#??@ej2@JEHrNGvQ*Z2_O*d@vGeQAkw*K8{2vxqmyM-;HZ-8eIKNPOuz&>= z9xkzvpGQyoVe1vFtG#`FdYb$#O~?0+fk_$*SN3AWAfs?ToU)dz(a!ygtzJ_$RnU|A ztW_fc9?&&S5GDT>zzn(+rf-?uj*gE=L~I=%sf|FLkJ@3Nrlf1A{#reoP|;x^oZIVi#~8#Uk{D#rVXHmv6@sDm?t!S|+0AlEs&2>Y|Z@|NRfD4^M$P)maaPojR<{;SthbgoUxT(Qw z~cR57zPHBzQ8>;7$z&m3_ni z5tz;U3N#l3HfdpV_0B15lu4o+x*7)r{m`YWX>I|W+ePGYRe)`$hvBMGka!ixdxGOx zaVp?5cbbL+5WR2bjlk3KG=QB7>FZ^H);%vn*hrVfPR#P-Aym;-kL?2oEF5c!*&qW@ z9n-}cNQfYY2h9EbB;9bg2M|tbNFM5VM6{>g2^OG)=?jqS>DBOqFT%o5`b^L1(YD-u zOPdP`Tu8v3x82UrXyb56Rg-Gmvle=M6^@se--fnp8V(7m3Z9XaX3FFk=zq+da9=*5 zcBCsyWQ$U*l^7D>yUTX%ylTu{J^gLA>GsM*q2AndJvR5a>9C{vtHy23uUbGz_-%lY zmcQqfO9w$hnSRb#tU?G$g@LH8L`G?nNAh&!ivMycuOQxtr#AsVaIDV}+2uTd^+HYGar9J*G|gJZ5sSp$vd^ zFsOAL4iR^E3mDdL7vQRpR8r(h;92+8Ryk7x6OX8RL1YNv;u84D?*-Lbz*e`wV&`<8 zVn%$OZ`P>J3C3KQ!KIg2cOd^w4s(U<~ckpdv9|nfhaDIvR5fJ5w%Nld72+@&z@d zeK6y5j46BfGYsS6DvLP!bfY|6jdTQ%(lSbbV~pN%n4z=)yTXvd)o+syc^n_Q zERi%)&*#$dAgC%8O;6M5YitgR1xA`r4gazw9MO|sURGe3)XB_L!csARk!37<3e`wHgK8`veNv=IyLgYv{{rTV$>j6B^VS=K#WK2L zg2&d&Rknpw?6^q>Cp;qm5+WuyDr4p=>@NJ`1Q1g4n0^_1xf>U^M1r6!X5La7FuLP~}kh^U6w=sDej4)VDUAB)J?Q5`w*ht_iF z-{ba(AjB+>6H(DWB-Dy>rZz&BNo(k?qXd0+gqu$V=GzZ%bV5xWoI9741KVLwRexBX z)w-Z6vx!IF-%{j@XBHRd_>kgwF8CQ5Xw0AyIDaM(9HhW{%OLwTO(CRW#(7LY`QnhJ zMYCk&#euap#o_l2`pRhAcjlK-xM?!-9e=4XDSpbBep0Gn?*-9W?Y!)y*Ut#At+Cah zmmep^v#pVwsPB9VGWf8d9YIYq!a-mIvL9)oj7u8%fwF!PlpQ4$4Z311G)Fa@Smk9< zCxIH3j!^@T9$^Y^Hx^-LPXoa+6y^)%D}{i{J+Jgsi2Fw?@D^H?nC!K70kDmc<-6$^ z--Bs`=3Z z03S+EXxF6Q-uOzL0wlKVQKTkBxi$9`A^5IN^g{_C(1nAyx577&a)Lggtd?n@pLEjz zwVf8k+vGkGuPO$vam$31+PYTIjLIxL-mxmUMP*A@gzmMphlDOW-q{2h4!J9QFJ~`q znu70=mu__429HNdeQ|%=cLWVefwb~MJlReFRRtF=1)-Ms(YdaH2kR&t0L>b)N-(@U z()=@oh%Tgq>>3Igq~?!c_$7w`53RxAo0n;nC6Qrq{TZm%IUxN;?$oLDoGM5vhJbr} zXH#5iRTSRz)l`TDBc&q2m7ZvIk}Bu$g;*&UmokQ}WNq+`1`j=CRw&7Cam474{*Z5S z@vXrD4%g2w_{82|amJeUfxJ6 zstOBjWHdcd;3uT2A|6epl;HL8RRTj8|1eJ(W^A&-DU`zZmXUL~2^Z2KSq8G<`K;6F zSL`1P~Bo?v>?7h3>r5 zrsOU$k8`eTmqT-vkq^wv^X06H{J{LL%a!F7QKuUre^(BfElp}US}SELvJaD)d={jE z4VHVwSIUf-E1mGs(StC)T^Wa};8}YZXy(LWW56As*u~`LWlH{9lE=V}(YBO?YY9c3 zY)>}(3rO*2LgLDNrL)wCPQvm8Z@b!c>6GBwwx%n;BN24tbmCUR(8{=Ybr@)r$4M>E zZn#_MhXF4~-foTDV_e38 z$^_;Qq_Jp)(gdo51<3_NDCv`bJLVyc8Iy6xsbV@&W#g88gm}bcfpJ=dluyPw`c(cZpV_16Wz@gh)k*} z3r}6x5JP5=?UW0hs;NO#t2>G`XP}IN~jXq>OBI(tl z5y5CSh$%szXcu$lD_Lc%LwOZ>rDZ}43o}laLoOqeRf<8KOUzsj>pQfZLrXd0009PH zgM%=cg0OzGGmd}2MG+*wVBM-rL%sy*qV=(ED7BaCQrI^LswY|#KrA*J`h2JR?fv!l z#7+n_8L#u~XKQ^IVow^4W()ti545Jxj;7W-Pv6|OFH2!5gPb{k(lMrUr2X&hQTfY0Uc>*$;AE^LtO75z zQb~&r>vsyRBqsSjyjiSKvK#t393@A-e~y~_5cj|2ZE=@Fn2;8)_0r3~J9%g?w(ZN? z|B~+On&FoRPVeV@{?A{43TV^1`2RId)|pu$Mttk+@^S>EG4)FH@2qQP<&qcUi^{qDyBR_&6%pL-C0_gj- zqVWIV&r1Qc48;y#gMWMcRP5VA!BGikR4=K^9_hAB{@rI_vGwT7Yn^si9bZKHcXzs% z;j5dnKLO8q-irK#E1DAE-t)98#J;BWzi@OA>h293-L=gjD?mKwdT6b-dO1j}?$7?9 z?zzp@HOf6hiBjyJFtWSIiFG^;Vl4`;%efNJ(l0E}ey|kEi$W|2MXHT2o>O0waATW3 zKoRx-M(5zYj;K<7pF>l)-sT(~0@Emv3DMNv#@djs8)>6VL)dFFkyK3KdSG^DEu|9hh$)n|)ZV9L3NP=yUNbM4<5FYKxOIDSrK0dfo zz?l+-Uga7C0hQq-4)hT~8HUQxhnNv6*N=MLvoUA{d)*X0y=yJn75?wlrXDxw5!u%; zJ0VaJFS%>}ImHuaI^NRMQKZME6D>mFGlcO7>W*ypo`^p4()||ZftZi(E3Y~mAcWe$ z#K5q@o?;`90aFOAFo(i@=mH7}3(e)s2(o7E;MFtC=Ir!_rU^03krsZp*(>&?;SE-T z&9;ERFAE%w9K{+>h2M26jpJejI9_HErx56RjJ{xmH!pSH44^#C7(?iCipEo;8PM;+ z;|DRLp}In+KvhH|`CrMsJD)Py`B<gOgPTHI(~1MN?22 zBJ#O+Fk?gO2@OzH1)0^+)}b=~_oH2+M{xp78CUT&^rFFB5yHX1?AJR(VWpDh74YOb zt3o;iK#=b%18?;~-VW4mbOPfGdukNl(*%d1iqOq)qK~!JDZ}+Dk&g`GddS&do45rw zacFN}MRWP;iG-u{1kNSlV!Vk*qvuK_<;omSC@Q)D5bCMWQUfV%2xdrADDG1ZWBsym zu6!uX1xm58esS2yg^-7pNk5T-xh|RymFYm_4K~J%$4mHatX~3lUnbwAFt{7Nd3q5c zQlW7r_W0*k@E1)gx#U=K3Otf{o0~K8dqLAVNriwU*k9IG(uM-7ZGokc;K01ukbM&Q zr1n945AhyhiotT?cu@qYGnA`|nz0C$G>?~cy&znFm z1fdkt+XGyym%8UhYNJ0{#AWx*OYb+K>W;t+0~P?{dT?OrN}+M7d*V-fDmov?1xnzv z;M3(<#%s!iP+lYq{FV`!MLt0H4UBy3eI*p(5lU%i*O`sJD(65UFvjh|bC~%esGe88 zh6>@7ktQKas^m^C-UxCAEP6hNyUU(uDPqW(4u;bzKM=%>^zd{7#$iwvDMM{=hy3hJu^LkBO&RsT(|oD)}9=^rko%(X#`h(*z<4FKoVK$)NYhZCk7<(XLM5 z+b05F;3jv6IO)=h;2oPfAjcr107VqTtttW$>y&#fFY2DLO=v|$7c`>8Ck_NUJEt|jHLxZ9L3&tAR(>d6AL*VF(TcUU2CDNTqJ&sj ze&7R;TMhQ3WO#@|iM@vztTP*CviUH%&S*WJNA|_DrPdT2XVC2AzH&$MB;3mf$EUU! z#0+bo>XR7XmRu5@<6}@0kY;KT$4y&rvO3{1maq4fpkUw<=ZU{Kz&2^rg?CIY#OPNh z-oY0$B0Wpw9H7Ia~=s>{kQ~cLiUc4*zaa1n!{r?*fXfZ3u1pj2m-s)1-Yx-n{Fv{CeMb7b1u&^8(kvKw9woU zy2Rx(iP&dB#BE5){Q$`;Ll0||Z3zd5r z56DT{zBpUo);I5<*jU ztXjzZi6SOqUVBUU(2B#e!(0=u)EqvHRKaH`fKs0-2t$(nQIU@e`rGFIy(=o? zX+E)}zLEHfX8WCv;>JeXW6Be10k25u+i26tquF#mBQ-umG5OmB8 zyFO&9MI0GZZ`zfy5hCcr$y>(DxErnQO7y-{2+(?4ha>B#*(9xjD07DJl3NneayzPP zHl;ua${f1AtNh$j=*#A-a}NX{ew*Cbj{Xka3Z;U<25C-AnUbAzQuAGnG{vy`!KptU zS=D|t@29~}nXC$Rej^mIl5*TDKtYEAHQ7SSS;$s162EdsOb`X~s=*k>mOg5P} zYXftEF(r*>$D^Gywq}k_6F?0oPm*U?jI(JW+u`?z<>TqMTg#d%u+b zu+W+?Fc3nm6C_Jj{rZ=^uyA@dxaNp$w1hhgKc| z5BG=wuC=~j+Ine};JAUEJbv|1nS1<3XS286r02%ylYT3_jD1TUE!00NkB^aZW8AkP z6d-FU6DFs9id*SPLWw^Af>J@PIt(8)+7_v;qP}?GFy{qfX~%VfonL3XK0{eVZJX zWO6TkwkH&0lLI;hV|@rLwi@cIp*rrELUcCa`cS^Fok9t{HXsQxn6lv!792tJ`&Y*+ zKJ&Lhb=nLO(ra`G6_g*JL24=7Ewk9*6S6fT5M<@-_jR_ZGf)!;B*U|-GlO&Zh{0}0 zxaVjhk6B?E!fN2DlaHHDRG?N`mAaDvw5lN9?BBL3?r^sGq%L84qB7ZWg z$i=Y8@&{OOYlU)EV`BqzRcS5j2)J*-GL%w0jY1l@*}!EJo>W4J%$@`#-BmP2mZ7Pa zsB#;G@}Tq}n21~iox5e#KsAV+Y0rNsB4z56S{+K$yhWszi?Jp5NG)g67FNd0mr1XB zs|M~OjPyCMzCwJ{T=W_A;Qp?1M<6e_Fg7^x5t@MgCBG*X&P3+q<77@?36w&ZQMvw~{Nh!7F11PE)4~6cEjpv$zLDYw}+aMXEFy}wkoN=k`I5){qD-94na0n$hH;aAO$-UX zV&5|=r}(N=ceP<7EW(t&XByo^mLi&Eo{UE|h{3a=@+ObM1Gt)qBKjB*(ok;DGEHUa zBDE;oN4Dd8Ipr9L3ILAJ02NDA z9Mm{15aUCwZ^ZM6H0$6T@eScN&+L?%y(UA3hL9Uw@UH@Cxw5$ODVY(z9>=~4^`vkd< z(G|$JC*H)vDK6on%fx|vau|Wr`diQZ>&@3VsQ_q$p%nuh<%C*b7X=iNeR28n5Wqc0jSR*%L&do+y`cC}I0R>Ia|q8%x9CZ7)Y(B+8g zI?*}QdU((@)en1iLkoH6>KFL?{_Ku~-TvIUTq9ijSl!k>-3cFrqq2Dx)~wCD@xgSH z&)hR01o@<1bZA|a=M%uQ8AtyJvMdykC5{oc09qUArs*Hui1RObbw`&t%>5a8uLmCA zdf4e;DO8=%x%ayK-9KzO3X$etq4XL^O{B3TdrLkBr30FACEp(Wlaoh$367k9gv|bP zH$B9F9Emr6&^K^`FfVB(c=i5sUHb>b0d%I`_2?T4PU<8t@mHeY+MgP+Xe0nD|GFss zSO4NM@YIW>$ZKAMSQBZF>m>N?!a}c6U zeNEDM@y|!D`=I`fU0)xF7Zse{?w~*avPq1cKly*^=@MIS zLxZH%uu9TLOQru2FBu61L*KYkha1{P!e%}_j=RT><0+zK*L0B&#ZFSe|0VDdeXQ$ee>U2@KbG`(d}oIr zt-9>-5k*9Yv0afoB3_X`EjrjlwUZ5 zv;4>Gswn<^iNViO&Z?Znn3;i$^3(z(Ms6)+fe0 zwwx#ZraZhTt6sVqyH;i|Ij8s4ws}6=ZhsQwRH3BMWkE-`RU9kTV|)FRkK6G!O+orG zTcvG{zsH0VfW1oCi`q-0cRhKb9^y$GFD7zmZ#tI>^);YEh_-hLo)Gr@6{1(gCf2sl zU{Bf$+}^tB`xlsQ*Hn&V-fMCo{gK7YFZaMcl@Bjn$gmg|37g*i+l(fwrK5d;ZmBOX z(Df%i&7vZ7!RsBqh)Gd(G#Adrz#HzW}NtT zq?PwKpm>UcoXYIQyj+2v5$);mhx`J+K`((|!EZW4c z-!kZKIP8;mH+=F=-PycZKZFzi&}HwucNZ312?dRAT-J3bI1y$qFwR?5O46w7jmIyl zpgPuG3?RJ-x=+}5@V0jw{-6OrqK8f1IdC96?`zG!ALmU^_jqn*`%IDb@$8>1u^zB< zR87rjoo3o}yznB5p0oStq=zR)U9UXv=Pki zFr{TzgpknL+S+cLG>oc3`Q<9at8k)iDIFIFIko`sEFCN&GL}z@PYgP`!(dp+ErR)8 z#Dyn%GUkiE(1UCDE%5B3J}BU$JG!3lPBf+}1S+n;@srX+k1*aw8~Y`Eg7PQ8g6R>I zMfS{#Ld(y`W_7EP`#rm^={ul&2{{ef_9)?A3br5+7RMMYyR)Vtc(x6@v8q~#t+5?Y znh1YdhE@*=G1x(wC5Pw1M!E3HWO_eHe_+Z2DRRDY1IJil&v(Fis&ZU9vPDMjQ0haj zXKkCa*I2FyC7PHn{2ulcrjK7}=xBG%xqkIG>z2511bW9Ne zYdh?C6k$D9_>5`L6a?FxQP8;xzEi9Li7h$=<-7?I4w%x&MjAb?6PM(C?UY-Ad#qKF#x6pu@5pL38SE!BV7)@Fa zT=0}4wNR3*`i^kw`A1M~2I=IdL;;_S3od7Vs{`~6LpVJf{BC|wJ1WAKYC9l_eZ%`v zkIiylwCtR4dtn-^L!b&?V;u><=_C<%ma41NB3 zn{oixugJX87)(Uik34kyB1r?`Y4i9Ir5Wr;cpM)G03{AOXWb>Y*%haRkvZiL0P=cZ z@f^-K<*DiAt$7d32cLP$^e$TIE%zRBttw7NkPQO}bSb*-Dcz}C4s6(BTrAF;`J6U}Is1546JfbFZ zQs%Y&jPg4+Id;PC$1vHq=w^_w^6O@Rz*a9P0{(`oFGxej(`<6SR_9dwoExTcQ8nR` zpw1x2z}(;wlv^sXNqok7Ws|Fg_>j$7Q~1->Ptb;KI$J z0KIQ=OyPVMuq~W{!uO9)R!1$pg!V23jwKj+qQ-oJ9cFK5g?$(o9N+o#+QBTtBwODMQqPpsEp=tO?1wB`Z_bl64+Hb zf$Tg=-=uD>zp1AliL-Dm*-lCBm`$>XHYlk!qCJW|JJf7 zCJ)lNA_Zh)rJtwlR{_vb0hwE39z$+rV&>Z=Sg%P39Urg|*DIq0QT0un^kw=~;7Ae4 zh^8{~zIW-#TV}M!$bm07%o5c}eURBzTry z3Ts_j&`kZz^(O$f*0*IO048-`y|d|$W7IH_<4WX_!)nl;;x~on9$tu22R-vARsh$e zsxh6CN%W}rjjC%Ejp`4AZau-(r(2g-RjdNdk%d>OY+x%Ov`U~^Y!}ImK8C&+c{;&c zioGc(*O0;=!rc%`H8izT@;;HJ^X)xz`Ns@s%V$%*duUN`k8F3Fge}MJxEgtg45CNI zk>}VOM3d+gfUKjP!YSj$S7OhahV|=OfcP^H!rV=)`>`5i#*CUA*9;t?JB$6Q6A8E} zsK`^TK`?FVL3@vnA=4@?w}cHrD~NeVW9}b3#e&|XqVlW?ePr^G6Q6*Ld>TCG!=4REMrDN zQsIJhJ!{WybA@cTD2JS6$KpB(WKc{_#wZwQkTZY%cS>jQ{gu@wjSx9poq= zh7he1lL)Gmmd)B>f;@ztN?bhEsc4ltcvXwa-Cbpq)4n`jtsd9mmb(BHzfEq3%H}39 zgA7GNIoPQ#^A#bA9Nu1vU72q>n6j8x`h2+{y(~!X4N09~FAAh{WMu5OYZPwGn9-Iv z--5mMc*rEG-V|ig2x2Y78Jo#QG^oxzU~|u8)C2Psr^?EIx>8fjQI;Tt^z~*ih&myAi&MD!7*WBkYvmOz75y63 znz}Q;zV$(HXhmmWX?yT_^|K07)~_o=AD}XB=R1@}Q|!r}m~kT6XnjAZFgMc%-{56P z#m38-zV=3oIC8VKkh#QX;T9^ng=$dO3MHvb$^1fO7Q3Bq!SZrr*u>6pv~0L`m77w? zQ@X|&+}Ra7Z@hLDQ=NuP_PHQKkWz5Z5JR@)m71btKlz{>=ugYk;oHJN?2JqHYiwz_ z`%vhdyi1$6lvGBj56I1fjj-^xk+FUWJCTFcCL4eJO=p#|^USq&LC~kU@hxL)ihPca zY0Z&BnNPf;(VZRzRVKk$#?yJjLZWGkMadvcq}KKZxXK;4k7@sjiguoM7V?<9<$U|N zpOhn4PucR$<`9`dp%vtjD9M;Oc6vWEMzCH)gne}Al82_`UpB}Xtg8Kd=PS{6S9XN< zowUbi!Vv)cdS?+BDM+%6gMw*5ctDE#B9DQ%w9yoSYx~A6<qr{le-BK$(f!C4tUCoRJ;mm{*-?-qQG7aS?rm5t)VQi(O>l*< zPv+GW|5zRACy(@R&nSR3B4l06)397nB&`fWrbQ`JvOrC;Ld0FJnxW+f>eHV_m3`d_ zpyr`vUtz-53M|a5NY3;VVxc?3%u2O}3nZFZn~AJlxM_-YTHBZTZW-6#-PFqn zYTC)|4Pw>;5JmXjdtj0-`Hg=+hK$X!5MQ<*GlgNW^PP{BdJEE6zW&!N#AyMejM!_* zURF*EKZK3Wm>yfoEV>tN{*ryqq~XJpXB7o(wjDmE91?Vo{RHfE8<|`O3K8VJj!_7+ zco=B)#z|ng&&w099@MRf5j0-o^U$p(ny)G2T)d>}!)IJ_vc*$X^au%_BW-lSTRrJH z#Htrwko5xkP0W)ST2Gp0B(i}wA|;ff_2pUQiE(hS=v;A737A1O5Y5`?;lSaFl!ILp z7s)K{EE-5P7$Wg9Fd*)+zXU0Kx5qNGtE%CrGQu?WLwXd9@`w~F2fq{qcuMHfHM~& zTs(20Y5+{;N;Y8Rb(hcuf@hHL!$u6zDlqn#%e2NF-4hJ+&vg!yt`oEt8wY}G4y3H< zJS;sw>~f0|zL=wvhM?6O@-B5bBz`zIXmgj-0jS+Q7B%E6GdcS6+`&fn9$aPhaIIb5 zpcx09i?7eS-j|;rFi_-RCeaXb6daJ%>oN{vk2$Xw2Xr>GR6>FLa4`-NRq_7rCp} zKg-m*>Ma*-Yojg3nW(HtSIr9-R1KlnoVf?2GI%DtmW(XZ>bh?ih-Q`T{zENLa@Iu90BfRY+l5UsOuEh;_s*PXZAa+jo@Ob~>`u9sb z2+!8MS?AX?-q(7X!OkQe^x|h|tB$1af1V`>3PWTMrdcnFzsjFBt&8Rr*ENrX-Wm+L zOO5UGRCqKUxd%qJbh~1-nhIGDJjL0e6nZ>nruEhxKQgeu=t!4!)pwTmYaG+c7r3L< zb0>98{r~=q@X-J7kUST(_~RjgSn{Hc2EgizhG@AB2b^6}p;o7jf z5XCgWs&^tw|%v3UsLDr+<5E@wOF?v`txVcX+F$+V#aaM z0O9jy*!~c%jfTZ?gc$Y!-1wAjEbG~gZ)8isGKYfK+1;>rE(*zlz-{@Dp8(0|FF&Tf zs+44-#vG!Tzx-%@WzA3s<{7@uL9@8?x`#@$et_9~t%C?(Z~td@E7Xe)nfi|vGL=6Z z?Mq+-4!nG}!YyA(6^#h>WTAQ~YZ)5mz0gYSb@6Gzpnhg=P7w@ScG($w zE}?nn%lCy0ofG=@--qLc<2aOG&@H({N0*%Xf( zwa(Hvbys3>iUO=JXC0bL<4ai!eMpajl3)PCAz|SFOd9wGr)leR9*8$V0UP25qd48m z=XB*uI70hT5aoQnT07fs6Gi?0qV3r=yU$yoej4ZTOTO{92;ommI9(C{${BZjAVgRg z3)Ve=Eij>xGv8Q4XP$he+vKl~ve|Sk@b~5YvQ@qOb0GAP^LF`-8bn!!2&(j4vgBk&f4?Y`w_+?V`t$u1DVvam7$u8GFM?kNCWUz9Wk0v&$eO-h7%764m=(W9*$ z0WL21!TyJrhahbjD*%Lx*MfEp(9Q3c&5O3{0RRG!e*nCZ35t&wg8%Jze**%H>;lVv zkw15~g23t?zdDye+}x?69JwYD$~tm-b5xI}$Q>NsKcfX>FM;T9#{b#s2>W0XO{es^ zxjX38Atx|0tFYT+h{^cXkK;W!EDD|vam)sA+hFjWBBHu>r znT@(G_8bqTwuei!V~6~6lPfj$=AxvZQ7pr{5OBhBCIJ3mcF<7AL2PlRUort`C-uHH zDv)R#a45)0MRROHFm=FK`kjNikO{@c0Yos$2`{t9C)aj80etNKU&HhS(W4ME5W_-} zsCQw_nkSG{KrWV}v{Bq`FyzQ9@0Sb%$xvy2Lk72ubsK24jJ?)ZW)m_=4m2|=R^vB= zNrf6@_r(syj;5?K?+yYYi24!BF7Ex95s_M_ZpQbptJBqk8E!z993izGxt7qNIx!>t zuA8%V5TN{c8cgr^T8Ggk=Vg&2bPq|#a&zDpdc`S+Gu#Nekb75dnEj`I1BEIs7x(y0clRfO)`vC#fe7Ti2HwLEDB48FVJ17ZD-D==*!K*!8s2d~F`ga-bBQc%M1x5*6#3Th>N zjKD|)xln~zE)mO?!qik^k2fyX^#-JUhY{_GjuvMGXr_NTqzmY#AGYNIv8^5DI2;H@ z0*NbHo zp9ps`B&;=P*!$4k>kA>_;VS~i0^3?5t0rojaHXdPiSQOM)r+0~e@hubnJk2idb3s? zYM%xj+$#&R^I2$%{79w9;>HL7L=9!B)T*2oXy_{KXa`H`GOkJ~T$SV9;F0-=!b2 z7U6AE02Hfh4|qNn2%f!dw;fP8fOEciY4**9lYY$Zum!EB8D$R@jPl2R)nAI%IRGLP zsY@p@aAjOpGwB>x(-4l$SAZl>t$G4D=D|pl9WQ=Q44BA0iw*;LPWw1RTHl9VteOzZ zI_c>SyO`B~F#4mJWk{CxZg_$xK$jj6pDrSvJCaV&dg(#6ql# zrsjafAjsYAJpfh~kZV|4vhnlh+_YcOP{ZQp8_2KRg6^of5A5H-zV53t2{b#{!wNum zq5JG*9eF`NdLay$z&m@>2z12h>3!yeJ|S@ky{?Pmb%`80GOz{1oMF?0aV|$E{PCi* z#|*u&6W!g>oDJXs86655hvOYY7KL^-t;wjU(zFFQlpy-&iLdue0QIA71AAZmBa4a1 zbb&dwl1=Erw=`JMXbu8IfWtdDLDvvR^T1&T1F^o!FKF_{9Uoe)gHKo;1lyH20**Ch_rk!r9qALBD2y8}r$=zK7h zDl~_ptZ1I05;?$u>3i}{L7i%Xc(-1v9K?q*rW>yYWR#pAe-O4ySL!V%uTGQk6YB`+ zq=8c&p8Dt_0b7&&em5)(3U;D>6JQBKkRpOtUT=V!)KE6QR0=)0ML_YOKJLJt)FCPE zpnWRt#2e{6CrM!HE})1T|*~f6&lYT!bLV zsj;!hSNt_iiFZaw8#^i@TdR0F9|j_@83HKnj%w9QDX|KueO{RcP&1~GE8~`}?=K@n zeVSNAIxI+&1yPojyuF=IK~Sc%X6NYnyJhr^JjxhskJP6*51e|_AiWA2o*%SiX#r}_ zvt+c=@vDX;74!${Fh|sEivS9k@>O7o5WX`D<^cdtwScndSt+vi7zDDq@ zd{;c0q|%EZTLB=~B5CdWdg`QIO1(Myk*2t{AYm3O6~MTV&wL`o0yGbdcM||l8y>pV z9SERr1GGErks2|9$P0QLFevd+B$S1|-%ydL1V9-o+Iuupiv~n!NCHs}&|FkHdUmlt z^H8EhMH|;1rEbmba14{GoX#|z8P{~?Nk=Q}c*IDF>wxSnlsy$66C!&rV%!JDP&ofA zY+fssa|~cQOnrGWs*y~ZmnZjzEC72wdooLm2?*u=(*gYpIXu$I?R=`|Z`Q(Ui%Wt7l)m zu{0;A=}hM;deiA_T&ZsT+9kLmti7eB2{sL{xSbn@+2CmmSq$eeeS3h7Pf&>$ z@F@0FGIt$QhC#p6nRv5^z}wxQn{kQA-7tqe7ht{ng@&tgqS_^m z&jcSfmNRbC+|>eiH}#n(xs8pbzPS2>oZL9T2ZE7=%`d1*yZk`Tft~3GGKG8&88WAg zDN@=%4s0oK>}!}*N;K6N>SlA}2w|2TGQYv+W9D+kZ{sDQO1_-bLgh-Y38M9`toenT z2dC@xPxl99Pu^4mWjXq zbom+D|7Gt>z?!D5J$w_kd z+H0@9_S)~emL=JF3O^}rqPEQ4Ops19q55nwvZ7>{x!N^r@pw@6!(BK!`_mYAe59Ez zc#mU#+82^LJXa!jp^3*~El`!uGlpUstHoIr%uW2p;q$`J|CT%a?@3}8$%9x&?W#eH zdxaXWZU^AOD>o1Xu_l2ns9R_9?BL0jp2>?#a%`a>#Ks&1dk0{r=d%(pEkvmt7MK|@ zHJoA;5W04nbT|cPR9(Rvi_10$6k(4P093uE*x1(PUVb6n#JG%u;upgJiK|o^rHAV2 zhv{2q`S9JwhAHLguAjt0!EV+K1rJ4!bY;3?Goft|a=8J%KM^1IVq~6VgmC;Oc8vL{i3 zq$H>o03?k=i&~)>v#v#$%n5kV0#uw=w}>R+{Bijm2-u$un)>X`4r^G{y|MM&H7IEj z+%qx0?Nq#~AxregryZ9RJDV$kCrUUmO30|s#YIEEgbEfE@d2v7*euNw3fadC?Q3^>M}hgDmlrGnRBMO# zfe7fZ`GIYjfS5+e<54i&NJ1P6%0+n-?zpA0&8Mj8>PClPo5oI79)JKj!44D0{hX-x8iOS2x-{>gZ~WUQG99Ss^uE~ znv%_uhq0}nCJ=54c^3D8k5pd~+Rt zCbjxo7jIx=NCkL3kZwYia_CkbeXNzP3|j+#usj%cA4gBxHd5**_kTJkR$Iz_UyqwB zyqm~p>AOr=8lTO7nwaA6V_H6NwkuLRc`bpt_-PWs%t5cMFNQwN<7p; z)s=z~;Aa7=rVDx%bQJa6RH$K~8F5>C*HOitoyyK@P?*F5;U1kT+p;qS<&{CU*>XrM z&JZk7WfK;X@2mTx;SnjOcQY-Ni|2}#@U8Up<-!@dKR%I8v(7rOd5I8;mhjmg#5xr^ zlPC3y_YdK5JU63i0tWdtCHc&fu13r_)=$1)8p~(cjRRuFD=JpT0!vAGVX$Brtc-WK z-q}Jd%G&Jb{S39+!9!{Yo>iF4$#~iW>PUdZzR0;&yF0}^`{K39yUV{=O?WRTdwn#V zdLuXyQ5WLe(|&!&SfTJ;m*C5{g#rVG01RHEy4sp}PSREwcp7#E7p`Bh7#jw3aMXWt zId7~B<#-i1D6`$<={PuOmNoq*+IIVRUS|ufpTNg6R-Cm z`~14O-@ZS=lq1v!fk#uf*R!a0jIAHa`z@)EqgAJXB4Wsues1dvd^JSZgPJ6#;f0Ph zt;yd(Q=dETUU;EsxqZ$03@F0|ooC{;|7YX|qe=k8oZ3Ww_e1tLMg# z&vxzPHFSEFUNFB1yo~a}6Yct#gv%RQOH{3gA|I)!FcP%KIs2sZ z*~#I_b4NI%iQU=;sCxi1N1GI(Sa4JH^U~eXGGXyU3UjePk$@lCtc*vzp{};`vVIPcVLqmEsL-X8;xTtCRVH`O;%=Ynx6O|Jf|2|FV0oX@ zPf0k@bZ=hP%dVHvcWX0xA{HbzzPb&hcgCI|M23cGJYZM=Om_(f0PLW7eL9YzHTEPew0r9E9?gGNe7^1b52v5s{ z%0H1%rvsQlx>BAQp2lYl*4aD^UlwPEbMw-nxB@J};2`bhrFG1Er&#**S0k!K)N$M+ z&|?xXlfVMsCB(ci<8`>`v*_s|p=TwYP*lM1S!5)}-$2d~eEczuC} zpI2j(BueWhsueeN3(&uIqY<`u2)TlU_X+(}Zfe>t#1~wAkjOm7=w&=jH3x|?wK`_mID0Df@hk_*L zJ6{BR?wo7TAmQ7M8>Br}9jx$=2F}ZrS{Ny#!P4D91r&fDNv^V-N|3{W29f6B88Ryo zKocc;394b}9v>LA(Tpy;EV#)F3_Pn5*4E?!g%%p@#O*i~x+4zFvL7vP)NxRCgl@rb zP1uRN52OeXfFj}=y&@Rv*1-Mj`W|A^C*vRLU&5dq zn#PimkKV$a5GZF5U(2pah7-( zHD+Y}RdfqPK&=G=X&xv}HQSYrnW)p2Y)NNJp$B|W&;cHvMAWH*0h2JY{zklV!nL-epwmDw8eRqGfh{G2KF9NBGa90Ahlg)v zeMu;k_!JQthEWHFKi+B&>KR4e6gY`fCoLCj1 zB~Jr@@FepOH$$G9p<^$Cwd)PJywztbI*3N*y%{z(U(~N@|JSg;Opldp|I}AwiU*h) zaww2C`hWZlLV<6Befwj_8zaCbA@%8Bs+sSQwr19KB`3W8_V_oR6L#+tuuCMwE5mFl z#100|ihr@EfPXyVVBcq;{?kcB4@4jXBR=@+9H4*wZfSgXpSk(HXK0(|KSRFx zv(ZQc(NiIwDD7p`_{DE&>A)9?Y{;ybl-~p_`W;v&hb(~B{^3KNX?j0GDgO06Brxhk z7SKOxHR1DQg72aXQ=Dk`MdT%rU>{^>ded_w7T*63x!3@1`%jRII<+}ak@|-W{<2=g zzeQ5`H)ak%x2W^Dqx9zAn=gjut9c&))h3d6`LtRB6&u#}pX5C=4=me;FFaaKZXOemI z9E2zm{(tgwi61i%nCzk+2nX;kq7m?`sUZIcK4?hiV(g9=&@rQk*o}n=TC~8GUuE^Xn;!~;U z+O5~gYav$$8Yd9T>2ThXH50(4C~^l&8l^@7A$Fz?<^lZ+BcSZ3{fTnpD0=G7HJX8j zUGIVgo@hW?>HuPI+-&Q0kO%=t18p_K`aaX*S&Z<3schKF#SA$&kx5W5DbXwF0QE$F z)FQmJlel}$*FnQIKhoQ7!gtiX3U32+Z#nu|ja>SK1py$k;R6NcyTVB3t514>hL zcs5ibjrueWnvHfc5{P=G5GGVNnb=zcxuPIm)Ms%~#tHN^(wWs1Ha$jsDo73S{G!+y z_IY{EQ4|n+J4}$Z_nS~cUg!oG-+^hWa@N_ijlJ|CWq) z`>!4mWh@RrbP13@xt|F_f{^Ibw&bs1!yy3hN94{*B7#C_qz~H>pT_OK0%1a%jQuUq z8ToN!i;g`dP*ua(qm5>;iU6=0bVJ659Tu#-GA}1PQ^qEkqBLw+IwnBte-7-JdGw6c zm&e`Em(UY(KRF+^`SLC~ZPPCI z9diJsygM$1O@`r6x;X&p<-?@cnHf*xyhD9^0MvqR84`JMj^&fH8{~V0q%zBtIuIj; z9EoVhY{Ibz$Z4Jj8xkm%$__M|Q8Yv_7ZGj@-Gz|Z7Z=MF0v;ow8}u6z<~dv3$IB_5 zV!D$m5{VZAkl9PPdBS?D%yhtkVE_S6E-F);@Wkwc#q(y)Cd;!aZ*|;yZ1~56Gul*QAwb) z2Ridikv0?{h1kXKh^&JRJ+G$h0?Uk5VF%P#7Kf^%;;)mv3A9~DW;fcGCzPoF!!yxZ z#PT(|slqVnB03{`&NaG4Pobo`yrTS>ZKR3^bVqm+>RYm}?I@_c}9--1%yAM0@E-O%qYJN0jEP zE&Q0`LRS_P@irRwv~@lIq+Ol^`;do@|n| zi(4A)M476da+MMQ`LDAN%?WC4?F=lhJA-$GhXcq?oPhsaC#^pR2f+a^8r`D{x=N;s@_vEwV$_SI0Y9C+Ls{k6K zbG#-PYPr}>tng}kX3>4q-CpWH>d zM1}*A7cD7aq}M%au@uIIl+V1qLnshR{ccIMBH@9W1TY5StyPR%J+0|OoHDqZb++gk z%yUVL*Aa&8G0e(;vc?OUfUyTZkz4su zhR$9+LL(B6l?E`7BBj1mIA_4#9cd&$Xr!gvOR=flxhjOjjlwuFzrGilg1pk!OzcLw zz;S+X;MFrJ2TDsN>3XWDW|NJbkbk`V2xih;2DQCCHs2^O)HAXGg#j8}y_K$9DKB%w zfOB;U&yovezJP1+{nSC%KZGk>0x9D{xv+gsXPJo&LXN#~_Youq?9!&RPj~YP*ly}x zedmWT&)lp@n~WbTbTW3_60WkRaW@~--BFnAHDZm&F36UeNVWbb;pkwLb(12N#*%x> zKR%gaJF((&7(fwA*HqjNgW=z~tkVuPc4WZ~0IWt5U4b4WyBD=P> z@HLFc>>xRwP@RQWlwVa^s#=wFMPoK3=z)M8LusKe<&9WloV)vut)J8)Pnf&cN|26n z;_}_4kY^MoEwPeiE`%(_`qs_{%|bv^Nd*A?#a$tVCHSRT0U2`ZtRW#heSR@bo65Q; z*i0Q4B9Ih})nzQ-w8K~rHj^>lCpSV0rsFSm+@}Xg`Ls`O>cm2#*;_yGliu@_20hSm zSj#^fn7JY|@fBb|z9?5YCoFD_M4-Pj4tC#t%^_3 zk?c(9cFi67&y{KO7nqtiGN>8G8O68@H({GL5) zHQ>-j=4V*&U6)B0jPs=z`ib;m&)#T|fSgm-FA3NcxOW^H0|7;e;s7G~Z()i8@O6Oq z4CeN{%I_!`TZu@oCcZfp$fTN}DTGKe0J!5+Ky4A0xQEmvu+hMfM3|a>D&pW(T(}Ol zyPI&)nx;sl!|A9_yjsiE@G}mJg^R%ZW;hJ8);m?>tWvc>{~|- z+FkUecFai$+!!aAeX+7}b=f*`%a=1n)ccA($X@KPEshxdx&-O+gYKSs==;W11q=ns z0UdkK;#vKZs2NvnGbh6IQ3sHjDX}S}7XfG|d+2>=Yw}kmO$2(zIb*#h<_;1A{%$vc zSV1;}a7|AtFv!!M(`nI+ifRTv z7Cn)Qd<%f2!0efEUl7Za%ftz3U@_l=T;TL=v2hPSouJE+j99~j+7upEy5f2t`YUca z<-X!@yv~Jr$Q~?*nZP;WEW)BVCp3j4jK?!CrdJl z&cK9Y&j46O4E&7S{Eh;`p3akD^F3 zqGARVmNriZZwnWs`+=w7{#h244H@C(R@gLO-5jlON`jlc$l^V&kQU3#(2C?U`EipH z)<{Rz8|u?vfJp^om-KRCV$$gMJ=6R|VKvt_4f9MP*Y{^9gX?d#`e_?clHl0$@Cqc8 ziFLK8+{Kst?vr7O0EGcrq5r`pT_0E)2=5rpNkSer%%9Vqtj`D~CJ&%4AYTMTIlJKJ z2;_iNk-{Mz3=tp!5g}3OlpUOjXXmUf{{$B$h`TGpaWO1v8apor;%%+Ybf}=gLjDEl z1>=a+3fei=hbP|#<6lCjVOrdgBi6B*f;1(K?*i&$Fax9VXc(x4{xmdY41Szz3?&iP z+n>+#Jiue93$BYSyntW8jQW1Od)kaUgI$klFXbylzTkmlVxbR#l>uN8?2qr3qvkg?eI&=hbL3d2><`>v}I7#j_pV{mdBM#Y1g zNMsDi@j;w`zJNrWci)>`(z1Rp70sRx!2Je4LZpx=0ZiXkjX!TyT6AYgl!^Au)90o)^$5n7bFqB<-Y=>h=Q_n({?y0fs)H?4)8YqTAD8B$U&C^k zpuL1J2H)8QTp`yHCJOst64>RNc@f6=`m&ezIAh7SKs5{0=7q^$(NIHMP$fL?Ap2$2 z&`t^Qo*4T51UKm+da_q*vuE4xm}D++@eoJvt;xswp!VY63;(p;M{EU+0~!f5Rx zo_@N_iU;g4wiS60r zOK$%ocNoFMA4Y z&VOC|5Fr~;rtmKCk3fs31k8>yzFL|CLx50!;sN4I9V75-5g8J26-!;x?7&PruzM z^(NEqJ3D?wIs@+X&Fgyk#BW@sK{ygIS1>qahaz1=5+bpNThiPij?@2;u|rX8wEs&3 z&q3x0Lq2%xC?>yBc&IC1(dgo+{Di&)vv$KDu7_IoH0MWzqXUnWB>=kzr_ze@^Hb(?=^xLbT|5DQ~(TINszqe(Ck$BlEEFw z679Y=&UFWoZ0bRg5r`uP?iOT~IFyL-Xg)_wqc6ymOV>0IO+uPmpAhXOl;t*|?z`j7M zK~3%5W z6Ss-)MRJ0EhMonu=)1bCua9C!cw!~6HIatrKhXS^rj+jiz>C&DF#3kB>2!#P{;#SA z{7;Jym)kb=?OJ`U8FT$D(tpWo*+MhQo0|P6J>U9@`e)_E>C0vF*Eu5=PLcmQYtHYx z;t3n|8AO9y8Y-7UW_W%AN32--$J^8PpNx$=oO0WNj7Bx2Z{6zY4|A9x& z*eftsk&e!Pq0uGUcJ$3j`%in$xIMa`8~k4PeF+j*Q0}Eh!^A#y+2tLlN&(omhD~dcEpIV07Ju z><;go*SyRQPu||4Ifpx*-ZQ>xDt#U|p~ws37)(?Yw5z#mfD|8eO$5gMfc~5`|Z)y?Khc~Jzb*`i2Hdde=z*VBPQ>C?{bO1 z?z;sN%I+Lhx2m&irfTY=sV5%Rt+~9=V#kEKsL$&*?tHrD7yi00u>S3M`@H9Grh`86 z4_dl<%_@Jc0G$Q%R(xb*XUa5%6Gul&x8R^P{y}S2o7&jJYcnlpM}+uWPUi;rTh8=f z9lUnc693h3)$~=tOJ@16@wJ@J_OP7oziy4?6aif0O8#*p|4dnE>GL&jh5wQ@@QFY{ z0Mm3l6Md&M9PpK^;Ac#2Sj4Y*`Y#RSx(2WFMHh^>A8%@BW4+MXS#y8m$HB{Rf2Qz7 z9)bKd{;MoK_}n%AZ2u*}OZ_dU`3D88S#CPs&e>Vru60RcYF2$zWzCwE#$?W-OsQI> zQ}t2Jm$R7{ZRRll=KApvH>X)cnB(l{x=b8rTRtiG^TlS{KmMERzK?%?TR7uw`hMIk zm>;}qRtR^Aza`s0EO3cGXB9WXa@Jbj8YCt{29}fk0|Sg4&}vg_8#^n@nZe zrX9=DHE_-9>He$Sf(0SLK}f7{v04&utAJ|Hkrm_pLxpble*E_0hjr3I;p7P`_RII# z7H&S+KBh3IVX>s#D2dW~@4nVt@0J{$N3Duq)`yi__*_#w>RhGzf+O;*{`SWITDhidVSER?u05qwb(1C>*~aFPq#NjtDZmXn8w^|?)FJdo$8k* zT{d~qD%HjAlpK{xvM03t;vVi9m8$Lai`d()55HEaT8CF&|K!%B7165h^rl?QG_J#) zdwbO4n?2$GxRujxy8nadnPpskk30ACkB;AAI&9Rq8N>0PtV0&GPf*=#>!Hw}j^Fc- zxE(Gb39*Cqze)(E6tDVZQ``nB!!KIZ)7klvzBBd$hW^?QKe#$GXvuNCU4g8ape5f; zIyYheO_l1!c4qN*f$4U^mtWUVXD7yeH{bJkY37F!ZmOO|$8SV7$w&DW?{2A>JpVD? z>i+q~6RoWe1uIqELmp1-Tr^hyS?ScBQD1ng>gv91%Bi#Ls8)4t7_XX(t#9oP{wZ43 zk_eqA?b&&ydeCWA`-y9+ty4BeM0W>n)CoVKx*6Q|G_*-oxL9>Nu50^E)s?&JRbM@P zmUuj;@RtcIyU*QsYRTFBC|EVecQI>!Epp@TsOab7 zJ*XGIZ+sY(RcAgYET?5B)e?UBTz2E-FZaZ}Uc6|To=y5x_@eUTm8}nFd^c&)qSp<9 zpFb~qCh2~zs+yz5(2+uFFlrF`{{+uhVX^vU!2`5^`wYLM^DiSb-zBapPM7;ZRowO<^>i|tGUZy#`bjYxDMMt8Odk`K`P27Yj;X4lVX8gi z89(n9KoEo<&v-_sJD%U!8`=AB@fJ`0NsI6PUn8FXftWLnK)M-Xg}V^6PJ-Mh#2zklVLsszB`pM1n`WAeIeL8C-V zzu3TDc_uAp&zw^%fXn7B7bkh#_;=pib`dsX^iodcue=66%J^cr%hWG_qJfH9!bTI? zlKHDX1blXMLg*izK4|*6q8H_WZqw{%{Y4w>;kK~(kG6IAbH3?`-79nsaUPVYx1W0% zA%884^xW}h;H^9e;Yk zg@F|3KdDxPEjJqwP+`k~fb@FK?>{cpL>XuSp(5MU;rDG55}#VcSQz_Tk!oo{I6&SQcLfRVXslr5j^mBA6fDn)G*L9g^mLBK7+k>N-PwMx4Cn2$M#2% zb6m#3&gMQBAS z*E$(ZT&Uo$p-1)yXEL>PHRIlLUQLwVs<L8LzGj%6Z5NT^5rbY7D>&z{ z|45WlUobzyKqp+bfN*8sk`r(u+z-v}17|HO4xP_9iRsDElTlNHE%f;UH#N#TvQ|(6*`Xub58Mizl>%l#KTYE$D$O zAhDMh)&CPu(8EvYRS*S|<$#Y60`31WQ(2gg9Al;CmJn|4od@t!ANk4FN*>2hM*Gi? z4S3Mv4?tnEWXIdjZHUj+HK2_fqQ zQYHIcP7W{-_{@uAW?nh`O@ymPpbl_n2!@FM7vV~TJyai%OEMnP>h`5-L?d0Tq@Rx1 z>>CtjIPKVZ#`g~SdzbF~{AIwwZ|UZrHV=*+Xj}mPMS#?iq!E?Z-k4a*ct?yRNtXch z?<7F~NU|CGdwQYX8Ap3r)4LqSr&IxutTY?JN_*gg0DbQ3IvBMxAR8V@_*R=yV2&EW zSQh~0RG|my93oc$QP`tW#!+FaPAuG{8Ot{59dO9vI`E{}(w`EkY#%G?alV^55EV5AHx2-|wG9)B-5F<^RPM;xJ#d23pO)dal@_KH$f@`4YwVB>0 z2%RQ4O=#@~#1)i19By0T2zK4cnDa2eu{IJ`0q9-eo&x6CM1}C}Ncm1*D9m1+-{G7D z6k^1jdD;OM$XESlU(?Z885l^!6osa$uS2q|4K8$T*O5 zp3U(Mn)d2eM!v9W(3kJ=g?CKde+a|8t86DFP=)t!yMXH<20l`%z8^5cXrKQb4Z)H- z%)4ovf4pJ5Afe=e^#K5PN1h?LI3z;2ID+333BYaEuzQdvm0$_3UIj_#cQq(b>w*8^ z+oQMyqH3^F2wQ{1he(pH&Abelk{GI;8W>g~3Fpqv{w`i7d6r-mKKyBXe$8FzWeq9zXe8nPm+Ok0Ob%)wT0fJ-?H z$Rc4eG~HHkPU6$@vN1y+D{NVsjL%L$l^7-{LgJyiLd%+cA%Y~awLLRG zR67pymL(X*6}f7y3v!ENN=G`3`SAP)$(uF<#YAh}vg5To>UJ7hzt61MOx;JfALw;} z`QB3iv?0W#iWZF9ExhL)JTd9)i$+8<+2_@G_vRQP$3X3;5`u4n7^^=*7Ih>Qr;(s@ zCUYZ`y&_m(Urz8_4xS{kT_-F;=7tYix)3NSD&n=iIntu39aqc^JD9Dic+?iv-C3<|z~bempA6`gJSjIXt=>nFLZe#gDh(Ra zL*y*E9gjY^nhP~(cxLHTri>{E+nmNTSfJ3JBcwyxC{V`0qteM%Z+i=&Xt(&oFarYQOw*ValkRbW2w2q#`=Tv zRwWijI}Nvm<=fT!A|Lg5?jdr5zLFYt@X0ICk~3kxC&L{Np4rTH9Cllm+Xs zdJ5N}8AxA{RwbeD!-4PZ!?VMMV_ouO))%P0+SB#FbxHob`7@xh@_is*KPJ&noQoM!xdi*q6s}Qs4GcL9PK0TJ{Sgf*R~!D=z(<35$}Kq{7Hy3P6trS-T{&X^P+DY5%v(DVjv13PLNO%NLz!udz8F-kum*lu&( z5~>f$cNE6hupV!Zv1D!Lt2fKnr`J*qDpQFn4jqbh&VJy6$B~$hNB7++4}RSj2{c91Bou$4?5G7^H$UneND3 zOyijM5pm%u;9_`tQyLaWcM(-Vx-w|xLD|;Fu z!Tpq#JS9o|6|m?d0(RBzi7B0wWEPj9{gTY`^E#`X`a(2%UI3;3S9^ z)NCZ=Ww$-#1rz5r@Y)ay|G9b%PPZ@@#b0n(r0{ANCob$3KN3|YTqtjgY&h-HL%%Qb zQPO+L9pniuo!(hW^HZW6@x#UmN?5p4Lm@K*812aSkblEt(La)6(_lH1z(1uhEfmCn#}zx>{|;8qyeky0nH0lH zNRhL>{c?o{M`Eet_HLK^DYS-AX*!Z1R_?IBL+#i*H8j=>K4vQzWLE{B_7ji1Pk%aa z73r~~&cQih%B7m9(LDv`%yI}GL?%z^soi;K_IJs130A33^m-5rSTF`L`q0>%fzsI= zJ6Bl=&e)j2ofUU$p}yH``0O%+nndt*lOqUf?jrA9nib{5%+{lpiyAH}ODj~Ta)L!l zMuqt)JfYjy6%te^8Ir=Uqj5=LMQ7I4CAj2h1>+h}wuv>94!B+$2V3cG`p{T67pe<1 z`^gL^*Cm6=Su4`P={;ku^r&t;gLeIRp+4WoYB1Fe`v58;-aT$r@~$!jufCbfRn$ty5Z*+g?*TD=l%+%8F9( z3fl4Np7vr(m6&eVP;Ajdf5fvnO00a@?rCxf1G43a&2hf39!;CBh|)HV6A$${0&dp= zcBmdO{=t*y;$wJ2AZ+85rU*F93CaB|K8+IsNnsR&C%uq!V{EJn#&8Ew_DqsP0-4EJ z)gc8J1|Cpag^v^W%pVXvQpX<-5nk7om(xp8Hjvbp(^#wQkw*_)SCs#yZn5KTAzJZ0 zE8MlEfN;Y=Kt;%YfkbyFiKmqOc(?XpT73-^mx2v~o#1gn+K63)BaD-PP_A4}SgWEw zV-;O0Ti-1?*OT|CE4*wi)}Sh5FJzUsVVH3lo1>GX=mh)abIszYooIzQZ{m_h!u7&v zhHO(;vsk^yGI#lIDobBBx!%p(F7KvZZqjrY$bMm#t_PLDbT;d3hP)tL`4T+ccc|&X zt?@Xl{;o8hqG{;`IVN}qQOEJ2Hl0CQ@yAlFX_E?awQ1CS*7h{N5}m!Q`j_y%A>3Fh z&FoH+72n{S7$~}OJ;o}=kr@j#+1}Wk%SS|5+aSTf#;i8@O{B?1^5@ zS`T)*I$O5m*-8gou6R^^@*-4*06oI5758*{pP5)$9mG;vRIh7bJt{_;l&8>>vHV`h z?b4w5xy0NG${jJDn#!SYPP!qVZGG4Z)Bn~H)<-~%PN!P=<$;5$`&@7@-|rp`%88w? zp?z9+-cSm8BfupM^FFeDx$jo)`JjA0aHE;IS~}+&wlf&}cHB2*3kBNu4#wD3Nhqh@ zjM@;vt1ATidt&V_pKzos1!F#`0MlLgqF}UbGAyBYK;$&<;Ai$fC%M?d*dh%2odB>; zF#I5x08Yizj+3*V+hwD7RLfc*l^0m3I~{kc7QDP$3+{#Zbl>8T1yPVqs|?*&au+!bMP~<_MmZ zZo-FUG$hgByHP!)R9{TSjQrpOUarhYX6Rz|fi8OkGD`B8k8_8=x8}oL|A0I^x%)N^ z8o`pWXgZmG34%0!tYF_JW373GJX2BbR_gTrb_iUMM~(^KqcH^L7FO3Vo5ATNsLlg5 zmJ*Kj6g3e`>3QHkHo&Na(Uh?(U?frW%eVma2jT=MJ{oCzXdX=eubzWtca}_EHN)`? zED55LOKd+MlHajwl@-eW1iX4O@WxO;4i!6C(@qpgD(DW2uc~^WL?syQxwxnuiZA8x zs)51kpjW-zqsVrnc_W04K#9`z@~-$S5eVl`pcw~1d>&H2HFWO8TXms4bbl>sm!f0-XY_BCY3zW zxs)Zko;wVGNZsB5cfIOsC}CtB{HA*jgnFkh2*U(zoR0iPPK$BGNRwBPKEeLyTKf<% zIf0o$QDcZ@-35i?Ze-xk#@A}}XGB>?5UN=ijUI}UAY}_ncXfUTS6de<9z`)@(Rbg6 z7y4_FrQqYhQ}`p1fD%7)Uv_qNh56~L)nUcTHl>3=Cx}s=1=UVETay{5a8RCXSBu8` zjrZ|vH!^(hl!wb0`r7mxxwueQC}SDAq*HyeM7*&qnH!!CUMLjQ;TgCp!P!CwF}XeE zaa<1keG#Q~n*UKcS85QVuz$~PoSTk>TJ65%Je#(3^U~q5OOsf=QEZ4SUVau8ghB~~ z27&jyb}E^62hC29PQZ)9EaJ)jt0L306G{|j$;Rx50 zZxHXk`B1Eh=?BFv#%^NuoM9MbvXX^kVQ~u^x=+g7OMyci1&L}*1hR1BX3XfE$xRfU zgFrZndvC@<2U}QF$*i}@VeZ32F)jPMCN;Ioi+p0GCk9{Q1}`<8FG7*W2_0a4a?JG?sE4JsgBK=IX! zxY*o=aX+4dws^>EAYP0j>_jhX9tf+USyFwg+ZQNCXDGbh8(ROBGjNp$goia77-Y1# zFP_~0bu!jWM)do?uKA+rLtk1CZ^A*dQRC2Iho%vQ6r%^S+B5AF>mq-P}m8kcHb-gmw>1n-aOv1tyXaY zHO=E2qE(h^?UwrF9@0VU8%pvSWCQy(H24d3 zJnK!N5zpVX(a7OqC~rV-FZC9?>Q`1C^xk0<$<6Pp{|*V^`fW|V`Ef{hR3H}+LuClbItNPC6i{zA=0J`p56uxu8o z$jEHHe#2w!HTHz<9%!x$HJkA7+Jf(0*Zlw2iD8Gqf3p4%cEABy<@Y*sU`#(_Ik=z% zFd8V9$4GM;__8GXicQWqnsyA|D3eu7n~t>31E5fJ=oq3*`7S$p33* zP+*~5@~>!rgjo*Bq>h;$Y}RZ0r*QeGe~CG(#D-VJTJT|MhAN0dMx@_*qWHZZeAmxi zkd*!A8|eEUDx_-bd-l6p)9>Ty8jJ-%)F7MRKRy1nj8RC8gfY=A2S6{Q2Rwr(?Kq$) z-ZA^BUxGxQ|MKW2BFBFY(wN+v?{gmiyt8~jlK;vf2>q9%9wr)HnYRKV_z_}Ad>1P+ zVOPSEXQmrOMb0BfnZ&v=sw?OW0FPld+V6Mmt3n~F2YXI+jI5rz^hmP%Uc&v}?gb7# z%AoZ~G)F?I-u?a$aT@emJ@{s`JzsMkiXZ6cEu7J^mYhA=?D>~547LbFJW}Eg;E)y# z3Bdu?01&ZJ4+*mkP29ltxXhD0*dH^9M9p)S;m@{YJ)9NMGS3x!TGIR@U>ewe+D2ke z$-ZXZp-R|yPU-itub{v*nkgVj_;0>WZx$OC!Sn7qz-lCZO>yZs<|GoDSLb=mCW=6W z4Z{#fU8j=(c+B(0(26p^24Iz0_#=T}&(_|-upa{B>e(Aa6tY2 z2n(AhB!xRRMFcpfdx4cuQ1VxQK+-KlcJHdyS~f`d z!E#dgo_YWSOe%yKn?7FQ>wh%WRShd0sZjxBBz!kY(bhH+e0~QhdF*Vd!u&IyT5+KY z0XdB>Koku{t3Fy<>&WF6^9RO)F592n z0I~Iz63K0MpEz~M0rsHOdIP=se?tFXBXqSUzS*5)Pf(x~f^D)|2Ox(m(gJ-Efen3n zK9vEnA!7I$fg3wO5!9d5jB*&C{SArhjv~!Ke^ZS|jupdrUQI#%RIV@E6s-T%lh-l=ah&kyThr^m-Tv`Dp}FjMQN}JpL3I za~LKbwvRUri$%KJfYR(04T+lZ+Pv_P`wsMsh_eu;zqU7)@H@QV`%S@ze#giD=}+G8 zp)(fz)5*~%{a;RvzRTQ4se?nBc+hWtT9+{(c_a}S{KF52)y4+qz>bOkE+hC>g8j(f z%pV4=BMlTr`{%5H3l{$}ty43awf?olf2B+4x2Bf7H_6TzO-rcV&d2{WHpTV-WP!Xb zvM3V|7nq?L7yb?ExI^}Z1_#gI#G`SzprnugL;0_KRtkpS3qp}%%B;~;4MZQpX5gdz zZpDAv;hY2R`XBp-cl@#;-6mmH*Pcw?kIVJ^izdrCLa%JQfk@#DD+D?1g&& zA&I@Cy(lq03Vdj)O1;aVh5pL8A>NX)S1P5x+(G>~g|i}TQF?sBb}#iobtKddCL(~q zuOV+oI=A7l3t|`fe}8-0T@xtkf;5={(fEa+Griwd9Be*5E^6s;qFZ2h6uDKsf}Njw z;SSnBnvH@dD0WgLl-wVAUG0l4dszs-?Ltg9j35+b%uD~@`=k3w{UK7*au5Lp<*5Zi z0kAD#S+kPTVK(_0K9kT8C~Xh1_^UH|CG%$d{%uJOC1&Phh=u{X9W7D1U<5&7p7jzE zj!xfl6!h?0_}UiO2Y~=Gx^69s5u-rjB9h%m+ z|MJF=LJLvG_h={>vN=$<0#<}<4(te$2fT)~Ry{hP(C@%aF?e@4q-h}!sqgY3n)Pl* z#Bg;Cy*F@142ggH;rB%DphMntbjX+1&eJ9qh4EQ9?1zc%dQ<(j!~8*Nh?r;t14jT@ zXHARHU$X1e;=r)aHkK^dZPYQc^f(2rp0-__H|(w7R2Nl)j%a~BTJ@GEXcj8N1Aov1 zT*4XG+gSnXSIPS)tp|X8qwP}=Y6pD_VDS-N4rx7lrLQ+N-TmB7d`^-1TtYX|Z2(yS=2;3BoW?zKfpVgj z2tPb!@>xs9`7AA5Mzyv;_Y?MECTwu;UDn!XZ*0Wh+1#6wa)8*(PdKL8ss>E0Q}6b) zckP3&mq`7*3dSH>MbCji!0)PCz#+2MOoLVe?l$FaE4U*MdhP*+1g?ilbZ~h;wgvHw zcsQ>^Ec9rhG*ugxr+}p7SLTD3hMQoD8C@$oWo(YB2`h_g#!P5P9-0G%`Xv?s)uWyj z;PE1T30*Fs%f8=-1Bi_!$N2_mx5@9OUS2bQPUq4c`?v>g{a^P*N91{&wl_>IL$RA( zQEd>CDJtKbElG4d=bQw2jKEhWjDhhfqA*kBip*UIOV9V-B#A@*NoE>YT z_&sySI49gi_Ct}K4LAqm%$r7KFq z;Q2$3R}XFzKtQ88M4_XnHK2PB1JO6G2lyi)wqC>oCj5Q7d8}3>^TIekI$JbnWFzI8oSVkQ zJ;tR_um~Y7%P=g+Q)@8UeTw(U-pGcVu5KIGysUA_7d8iSI8zPs@U_ z{8AY)tCo~`uhRwWE&&B*)b{v`DkZ%-LF}X~=g}LMED_TgTp5QJ9hMlKy*>{t&CQ=U z!)8cf(AnXSrc0r~<~Fdr+U5X~o!p6bNJ4c!=JTzZ1ptTy!U+JdBvPK!H`GPc>C^MF zha!)IFJB4&wmV63jSZQ(X?z+Ldu-z7nBVgpvs(g#>=9EG(;&IDvF1#37w?L2kT zSNJ|;PW1@p4-+sDiLXH_jek=ZLbd^F7z(+qB~J= zxk#SvX>%XH93Gy9m)kY8H+8~jYH!Hulsu~T6gXYY!j-lc8X35x0Wn1pe1Z>nMm|$w z1-fL&GGyi9X7VFk{1nccVQR+3QMo}S3#!OL*-i$~9z2R*?uuK^{Y(JMooAbd>BMoS zCBbA4d@d*l6qvT@)3JNe_?Q(@-%~DG?Uc;iq^-~j=jIwoC-7N-`|GtvYZD8A8}eZZ zNMwFs(k_K_!i)WgI{WfU7s4dXgL*Ik>q|ZW(-itGRADX|Y`ph@z_yhj*W1G2MpVLb z3gB&fBIfCsOc4UF1o66Scf)W?;uIlSgIS6Sz=}}51hJiHUA8MjRl#bsi-$(tzeYDt zp;s!+#SQIk;eztg>hSXNEKzW=1zq84Cpy(G21p-HIQMcP)fa8FN%VzMDtmIfa`+Oy z+Y+cdr!+LQiyS-{ptIb4yvJ3bQXDz2ewMCx9zs3NXO8oZ;Pp}H z8u;Yhw&a3igoHrm0kGxFDTWiZclF$q49sVOM>h=9Q*|1p-0V!p)~Z6=vYW~_Hn$BA zJQIkU3^U{)F-g-$dE&xvw4_u!zaM|di`8Z+ zz#pKPVb~Hr3rY~tnO%FBppJP8q3`M$AYX?Z<8&w5%F3sz^Vt z`j8f@v*l(8H`5Pa&QzoSQ>RfIN93{a})C%m~Jhcn1 zc9lZ0;wrsyBAK(=$wb2Wc-M(NH}d+W(4yekz8g!eDSDDEq*uf>Ju*dMwV7sHMztb<87DYaBvjB<< zF)bgyks=HlZw~)}HUp6=3+hMdxXWNeH(i;XNRLjD%9l`mpfZ{R20^SWkMrLHLnwb5 zi_)eOH~sOprG_*ep}}Ci7t-ym_f2o7J;fR_e(~`#s4!R`LKK?KDA*qm5?8 zUV|XQ(B=FNPf&}m0qW>^r~u4z3{3O$3LH~gBLeoUo>=m8GMJQ^Rf~e1V3ZKbg8UwI zGO|3SBW!gh|7FG&5C)7hsGA8Q+P6AiwY?UkO(+|Tz`no=2Bl&#fovi0Ib`eePS=M& zT^wpunwOc5%nRGSJVjEvT#%9j8%cUy3q8(kMhIS*&59MeQoTH(skknkKe-x^*L3|c zMnbxRDv(gwA@X=!Jl4v~^qXx0e54tg#IT)Ck}6nfNQT1fr5NEF@S%xLnu2nVrUS(i zxpC{3W?KobkF*OgePGG-(055X@cEN%EX^X`VEx^iKoi)>M={$}$k6yp4cci(jRuAJ zA_D#{LW&UZS<+k>Sa4c<^$WG7`2{ozNd{g|gb95!sv}oU*rk-h0>;Cr#GkXjwm(!@ zkGO$zwv(hZv0bAx9e4{+e;jz+_|(0z$U$O zfhozP!tmtr@@1uAa)~^vYO7wEoAzRe%TPPgG2IwLUp<+x&fKi+h-f) ze5eG;`Od2z18PHwguiVhl%!tv7}qQ5V%CrQIA$|d^u1Q(vQ(D-QcRdDSx#AafMU9p z3}DYsB_b9RF9Fdmu$)-CLeOtY#xD)!MTa=4ZP4I@wLrY~EL>fO<}s*~x{7FcPcmBK z5`OmU2$lUIbPiN)RBHFw^QFn4SvofZ^lp9Pn2_S;R}a$euP+|WdXZ_ydGA@S*{pA1kDfwX)H* z3z0*;NFc>ZKhPVjF9Gtx|6}h<0Ghg%{=a7_jW#IP1%vE~MPCJE(EuVS5QtWBsXjz; zA&4S20iqN{L@Hps8UfMP4cx6-6-@*K3Q93Sur7#H8wiU8R8YW;ttjL_=O%%O*5%dr zy?*ciZfm&7y}3DO&YU@OW_~jx4K$bdh{#a9+a|m}lp*Hj36{D08$cAS#aPigch2S= zDN8^Z8D-!Xe?an;vH1l)s?UsU>n(8*8`?B6cl94tIq%18q@g4pg31*0w z+A%&2*e+>Wq|wYybfR3q>d?hrFUMU}MjuSVJn2!Oka!fpiZp*wYrMzNHi(Rk`ex`d zkJfmG$3?NbR~Em$Bp7z|4zNpwKT2~R;FKs51_ySkP!f>^aWW9kFbl|90G1CZJ1fOc zv=$DZcyp;0XNUE7G6?9`76+Qq_Del}hEnEOgWXLQPa3d5`=+VV5geEd82LLOBW@G? z0h0w8hUZ@E0E^9p)FRaW(*$qSb+izDMO{Kst&mZ}Xr?mE1Gr-p%0~j4A_Ns93V9Q+ z1Pk?gK@aa18ld*B8;$P+$z<^Cg*3dx2gftoalV_?O}tqh009FB zlBJht%YCGj1ROBr+ES0csZy~TTejqp{nmKc`@J#*W|LqI=rtzYZ{Nc+b(EM3%E{5I zXRp1zt^1=|T0jCKWraR8j2fwO(AdIWQc%2TCr`e)2MB>N;Z0{+^0RLBe>B+)9dBHma1>SN4(xa4lB{?620Q#_-l~Ama-2bos3!fjb zV(s03(;;;rf>a39+Mc(J|2r?0qwNMUDgH2u;(abGV|Zr0-!l3KcXg+(M_u}(<^O+K z?|Dt5LR%do@2jS6^G}?E13p)kp;tpU`FHoOM~%`rLlCP!ceqf;O1!(}8Orzl8eKJh z@85bAbixG({ zE?kWkO29lKfkrV6d+o?U1fhkNSY-~fHIs3x_uS6=-dha+p}|Y}EESFUp{Lrxh~WSz z!zN^xYL`QXNce!p2jF2>&l)loHCT0caJGdy#Np=Q{l9pgK5_@nwN>M#HVSSjhYswa zN|(aJLWD$s^eHfYC-29o{R}QiOcnXjN9kau27r&_KIR<)KG=J#RqUV&`J^SaB~FNu z;;k)^4GzfFu8>>GEj1Jw01r!CDXS9j1fGQ9AdpPi%RYJ`T~c36PG*FcbBcT0;EF^yC53|C4N@9n@9?w zn3jA!eQ${`#N>hsRqHaMxfgj}pFuem#9@h?r~} zN(s1Y_bs@~_<3keRZZ95j)W-Pp|e9KJSc7{ZF%tmP(X9hl1hhvVH00+~P*!9=t zlNqj?A$JhA!P@}PPEpav0 zFE-u@s5&+^ZO^R0lS*&M< zUzSk#&w>pN$lG{+;t_x2k3d?LH=N;_AU8GcE-wZug2W$KtN_W2i{phc;O<7Mxo^9(Xxydcz^py z^9v=fmO6L=dZ$0^{Er90a1-)9YVQ#&X=tJx4{k-c zg-7F4<+Ij;BMD$>N0GQlUp?*U)@gv3DXnd4$O_!yyLawAB`WVik!2>~p$8YGa)S>D z&!*FqFBEX-_(v?e43NKemOsw1ArFkL)PNQ&eirz>N5vB)4S1t;8 z6(R~v%;7z-=6_dY!)0R)PFmc&q49|awDdQLwe!v_j%UVxDPw7oj&ZcbY;~OzmFU~M zAai*sEIxB88t*?R^4_jK%Z7DnMQ}_G^!F#5)}|(a6HEb-v6q09{D`jNtuZi$0E0?+ zpx#!rE#J*4FsjPsX0}x-9=~M7w3WSB=2^hS&SGmgTnPsuNvJ59IVAy*HWb_QbTQVS z4k_QQ#hAgyPAP6JVOT?kL^B_r&8O@|+d}0=v6#giO!8MrAfhmR!lRIQ?G#0Ww819ME;Bp5@Ui>s%re`D~Q}9;EVLaom zSVTD>WV?KmM8HqqL54;z{ewV4!#u7Vn1Z&TKShJ2@f)R%w>Z(Hei^ z;p=e2D}_6Tfi2E*9ijtuew2~?#JJswHaD31Y;DnDsBv%=Nw;Wo)h=xv`SD@GR6#Mp@jMn(@ zl-!Dfj163anI}EVQDBorJDD!y2xI*7wY{W#aIBJdN=)5Z8>hvQ-O288%WMF)$P-hN z^U<)~2i!{B_&6QWG>PfNL{l-fKE6@V@JuTz^a&?Fd*C?#K%j8+7;Hwhn+_4zPWPD; zeL(~hCM=}HF_5+ka2WTWKY}L102Ym!j(~P+5gj7Y~68|_5I*{`B;g!GT?;yvgXwBCC z_R^Q7%?7Oa+4R^i4MJm8p;@2}fl~(N$UOw8VCJ-mN%@n9?42|Dt~eoFjGfN=q^ zfVP!PUoo{ZdPGpF2xUM-h+XikV=z3%y@p3&xG3|h9PoR8Q_yH1C0VUl#C`ltIm7eU z7=r~bBT$U!X0v`~n>_^LAsCk(4hZ(o^r&J?cOBH0*f>qxpTaXOpVTNM&yezL3=D?e zO}@~_Z(W}Z5_VvZpVXDk-8LxBsg!^VQhC1Ro4sO zylH$mg$1yDYF`{*;`9A@#>i{{>Ock|#l1k~8wH<+I3xW@xrJNQDa1^EW$MLq3ktX)=cBNvM&;23GJuQc z1eZ+p%|@9UsHCI1mkomDvBFjfgKlBtCvnq~vKe$5<cPad^1IFho9EoAg9XUZ(Lf)SJ>MkeSMK`9CN1u{$Dh#iafO%xR<04VhC)xnAY>qmAqBuNRC( zI^40!w0(rR6V%hldk_==OQ*Rp8kka8RF9{_dYc59NWY(M35h+U0>4j52H~#U)hMbP z^RqdfnUbjJ`do=`x$jgaR?*;bK;kQ5cv0ETN!b9sjh1Y2?QAkYOsfWeBoXYX`` zVV?j1of1G{Ao&n)2m;M|rz?D8KN?k~x)2hc8TGIvZGuqmaXH{>I4>6*I9+BiZNpQn z1h6;X=%qTjS>2%_*fnE5B)7@OkJ%>s8vslVF`HQ*J&6sOVS9$6OnWo>O4ds9jzqtt z(5r&t@U;_$>fCS@FgK*Ia+0-6%}TZR=WjJq%CV8a_vdP(Bb(tRI5GyZ#81s?g6U1L z8v*-p1by`dNVeUucp|3iAkLs8a0V|LyM5)@$lRMOT}CHbHBmbgEgf(^U_BCFxQ(t^ zOKT({H545Qp=j6KA24<>1~{LOL%2#Dj~ z)cfgam0l`iUibD*wTD;s09RTRm5P>%6a+oq{c;>lhHm;1mc~~<>A8l^2n|g6qp-_F zJ9+hic4Y*70et}boB0ezw_z8I3`+Q(Vs)tvjp|3UzE+}{HG=vWX*DTQn z)Seo23hmK2VADvDQE4Oe+JtG0Vb5rOh{;;jx7hl0V{Ne4I7gSpW)Sh=9YVX9s!oi!WvD@H3JrfV4n(YgDa!}Vi z&v%=?=JvzrBbiG`@!f{=Zriuz7Vxy5>h2@afd5`RIF9>YBD^mVM4s95v3FE}JiF3{ z)+pz_MS<8b_0E*K`KSrmM|C$LI|G8Fi&Mo<3`ujMqKkT0HNYD4k zy7FNFiVt|;0UHFwYuc(EuXtAvvGabIc-GsdZNw7*U7{EJcIEhBa8;}QrxEy?2W zvHuL>bPr?V@sGZA!p2B5VQkmDMK2hMi3{^+H~v~^h_5x;E^lfXH3V?iC^(r5)j043t8oB z4R6Ofjx}`{W4pk`rMrFh@G-Q{6dvRm#131sVzeil6}E)2WN}EqlF?I_1P6vKGac*T z;-c!;s?<@nEBaO2(q{>*t!I%YSFg~i?pOQeZ0oaQ{$c$;Zl4cwcb+xK+Rkx~>jXRd ziivq&EHc~j`Tw}>{QTY*0=s)h)e_x zMo(H26u2zR)NZV`qq?!~?vrQF_GGP6wU?l&iZt*X)CV932N4#2;9E}cN>kf04mP8| z4vAQ)e9jb8OB*2CoS*>cCvi>HXS$7}jooOsps_+BeKHHDoVV89kw4> zK6VM0=YHdt@6YzF7nkrRja$A;y3@X7!=Cn0CAp1@L={Gg*}V9r4UCrlxC%^AJu z)V%esI~0lMzAHVg=-P2hQ9#>eJK^PS7oVbj>(TvD9&~s$yF#s+qvy$x3kg|inf*~aaY}L zO;;#dhgDq~aAo517)7V>aUNzG-{HZ!I&x7#SHyQ$a@$RJeHQa|Ig8?X?PlS@vB{=G zN7~IChW~0CI=_9KqM)sdM6DaU{k!;N*U+T6{*d>y>_u->*HdTj9GpC+Cjx2r&*c(TR%&bA<}xS+3NO#Kg+fAQ5Vj`{7Z zDZiK~p0$|URjti)*Um_(&)IS|4{O*o<(nyujfcyAQ*?|t9MhWPW7B$T{4lgdgTD2;wW$8(p0QoO)tO9=8E~qq>$vD5duzzN&KSkr z7DcY2V{ZCn^IKC$6K*LwS1rn`|DrP{L~)618rzq*GQJ+MMvG8 zJkv=wefb4>x~e)E=GVFUS`YV_*RP6s)HUp?D?ft^Eu9xCl~q43TGUaKDO{vbJj~8WIW=y|KNg(sx0dD zyXpLw+hbc6EnKQ+pN|rbhi{9KP4@ipZ;?^Ioh@5<;l_!O%G}Q9N896n8UZA4Qh$wExpG%^e z@hi-w!CwT0lr^27H+{iq-fqk=?BZ6klj1_e*|TMj7g8;Qg4jkGnX)OIQ80*>x1*-q zHWdplEldgG95!&(zUi7FTDyREbMm;p=7zSjbqXn_L6F3TWF6O6OftPhwiaBPWUty_ z42~aOe}M*p9_hGb8ffmK z?Ss$U@)~o4N#q4{G)(-zdouNYG|YteKb{Icyv~6}WdKN~~4PIDZtsi&%py@mPV_%o1^XhFrvA@`Tv$;&k zM>giEAIDy%n>nKjQk{yn>qT<0%N74$Q1e3#+3$P5!7!5jsJ77`16N~ZHeLj z>yC9d=?SDw;ena?8Yl_1*!%FmuMd0o4{73H{$g}7{c#N>*7)-WQ$+L5`}>l6OD8Vt zaN*A=CKgY9i!U7xb$w*K%ST>%e``-j(6WFelLi9{YM!>gTsy%e=`V2djrO&3{l7Qd zwl#Fcw8>W-M+~n`-L~~Fe|lF+r@&H$BwuIeI~|*Ezo86px6%5aj*?UDMUag7PaPMj zG#S~QwmH$(p|IvZ_YZHA=qm2;Z$4}rtiPHYId{vL=->}_OZWN$#GXK@(!s~%iL^g8 z{OHS2Nb#oEpI+kPv@6V?yo4eI7mQF2YjsT4zgc_vgN5b@;PbDr7GcKme^S0PB~h&P z3BFRl@6S9-Hx0T${S_k2U(zE9`JPA}!<`J%h+zJ^0KY10R4AT!1UOuW{d~e@?o^PE`#x#w+}I#S%3|r9Y^{vg@%ZS7ykoZdX2*$;s}7R+DWUh$iU^@7d+)=QwM+=NK>S6fLVx}j>ZL(dx|)kq-P zS7&bL21FcZA(O$ibw?ebIug*vxJYAUTa|P&PNG2qOclu{K^PZPS?L3n&nZ=Ljq2)b z^=+yt4!0aGq7~PokD<~7ly`t1@kD7ji+gh45#RaN14=3O$U)Q{gqyF)LQ(m0>gZPJ ziE@D8?F2lrT_#uc4F*9q987<2A!PGr+o0^UY_K_QfaDf%&cC3;#piqO-LX386hyVWm=ojofK6*BB5)~v!4 z%;`1w69i2Yc?Ry zz?bL@xd$;l*8WmH*~2C6!4g68O>+Z}qioy$Y;3=SDL>pO&QClxHqOytX}KW)6pA^L zIArnM^~p5uAVNqt{o3JdjCg`tO{7ajr%RvL7ttVl>g|-XD3}y=XX{GHTg^=F%*-LO zasxleDk{BDhzzJ<55}WPCM77;s#{+4p4F-g2L+l-PjuT$273&xJt>#JoZ1+*koF=b zx~1)+LqbeN7G4t(vFcHx9QYy8L5^~bI;h2AdJP6)v~sF+qajzYm?h*wD7zcq-@-i)`B0dJ>6M&%XzPC{1)oddY(by zFs-TKx}J6=y3#mKAC|^i&oc3i5}}ToJTD|7O@XUBi!3TrfM4p{Id_1sZ$*UfS#Yj4 zs>u9$0c~rboqEuJLd-MeoXsyrSMrH0_{=sn7pZS~T?p_LflQa$Uewt%a+M4mA)y6O{{@QTKpd4BAtpq_!=jwe@@|~IwIMYqo6g#me5vQf+@%q{1=&kLI&*Tvj( z_D7wOZQW!gBv`%?SknBWW8d7Imh5b`!M)`ie2;nBu{4(u84r>l*~3&rv}WGYu|r`_ zB|xzHF%WRs(7X#`$536l>h!`ZEHKP)v0)WQ_F?4J2AE`${BttHmxY^380Rs;FV6}{ zi97wNmN;aK*UiJZL!d-$4!0kAv)NtG68D$bfG$d3r#0JF`x>p`o)*)NbH;E5D|1AD z{SwDMR-eQPX$9s6EJI=HlcN39pZ3OY^eoKQ)-R+49*?2^yhC54{_Os;-ZPOQ=a4Db`O?@3~~yV4Uj}sj9nAu-5Sr$ z%#8>!Ily`PA{QdRu^fhHW7Rh~(T^bmdM-Dk-17zZ;!{ZPETT+>fMTA7O@9hsCk{e~ z!wYnH4GzI#LE(KM8Gei-Vf*Ta=jF!@9H%1!n#l*x_q-a%*S&mobE5me4NERN`^u2} zS>WM5e%(GiiY3&ZGc@qoNgExWg?>9-k{Gv_IcbCS4c5^A5tAu_Pd4$yy3$>OaszF# zX~|M)@~>ye)tKBWV5K9)*6@mCN52(hYtP6+gYM;R<3XUt!=}gfhDATNZ8QG8IeIP1 zH&J&#>Rzs(;`f$RNCtw^$KPpN9ytmm7os7`@rvdX^{EoHZzL|k7O z04t}I+hq`w+3yuSuBoJ{CIY2K&p2q=)E3;>A5uP7Qk}BBp42fI9GFtv%!vHXf(S@M zS9UT&Xb^Oga{wZhmD`DYsLMe1xoqL9>rH0(0713lM)JNCvv5BN-NO2EU!KHuvu&0S zL}^}@__EzZRM}#G5M&%ZtyLUBo-qk>AB-Sxsm|=1(l?PZk)Ow_(z&~ze_b$DI{y=v zpd6d2wTf&{N=%4?%-96z&p^8Tz#ORB0imbHKV2_HWrkWx z_RfaTdywc}5N)d>Q#0flfb1~L-vYNooNC6>3+1g3;0$;WLWQU7mBkm`ix{8O6t%Jt zmE-Xq)T1uaaQ=V-(fX#R*y)Ut>BbeU1rpyGH$}H`MIvY{PPjBFsh#iZ^>w41Dtlbw zEw7}N;ZhuF@aAH2)=b(Fia^YgxRGoH5ZTJ&QRw{rn?zFKVt?tu4G9+#5j*z>31Pvox3IQR$VLL04lT-MAlS=R%(#)o5nXoDIWrAX&Xdh`a8t%5 zm!$p7?|=oWQzmZuZnNvKPn`GeWI?cXId%LKFVVW8<+{}8uL`>6lIhnUlmKV6qVBg; zmSmr6PJ1khLNoU#c!6pcCo5N{C*MeTP+SjD7bVkO_fE1u3n8))FbE<2tNkCq#6?;B zAvk*iM4dwA53dJUi+7|h=&a(v z$huHb77^jQwy{D^OUllwk+#-MhT=qBGB>r7G}s}uAyjZlYgPr%0M-Yc1RmukFw<!fM!%bWkY|8m?y*hp*UK#c<@0e)B{CE7*C&M7v7A9a$$AamBx6Y@uj7N12UIf~0zn=Qc zC8a@L6dbll(G)o+2Js$D!Orxnj{AV*efRzH>`bJ|?4o-s*c~nzPz3|Nxam@lQGfxC z>l`MhAd{k}TK9^TO-Y+B5p(+e_M!1*-QJhfOAkj&ioOHxeAo1v9NVnW1vP=}~ zbz}-kZ6BCzkp)tge12k5&Zr_z4t*C-js=K0lLs3> z)IRMx?~)cXm?V_F%4QJf4l#@-UqShc5LBsQGNe~{;Q-3@$!E^zfrT2=_hmPg-a8_S zM5!YXN1^f}NR*vM^Vtz(*t8XnOCMPW!xd1@ejVYG1o?!X7j{f;kh^SUKZD$6J%$eE zZ!bOag;f#8ZI7P@byRWk%c46wjE@8aH8K^sn4 z?F5talY3mDwVzWU3<0+i|u~w82t*Fle29e!{ zo5}`du}ybfvo5vw%M*zEV@99FT0!Zo(24w_9_!GM_|+Hewyp?8wD8)Oa=-QZgWFDf zeZk=2JYs2WQ3#=Yz|4DI2-}^xwWX4C%EUt*E~!do*E^xUF&H%2v;{I$N6Y1a-R}#% zr_&zpdU?tVa$$kS2eNWVe2)q1d~`)6)#`=p@#DmjX*Vm{x=<#p8U>_cf(<5(lfB?< z7FX zIG2SBzm!6Zdm4YS;PHu7OGP@oJVAgQ;mOEjQbMHx)p1&rmg#zkS?TLywIay(;Yw)< z+iqtFnXbzSld?@cS}$4luvf&RhzMW-n2FBkTK2*YXrKK);5Kir$+X9*3%Q7yKq?{C zttF*Ir#uU$oN}c^5)Rgj2V3_({{ThDwO)*)Q5t)G*X^|4e zEIlWUrPCaTo~J?Xl0)@$_P*I6P_4&AHadwD}Md6fU95+E>g*{c@ZHI z-;5Yk*tu58TT7omLIq18Tg3GTcS2T1HWy2xUtKC`GCrQz_z$QaR+BxAcHu=3Ub1ks zd~}A)Jrl>w-k#ORCX>DAd!6`%{iQcZIbqdUspNs<2v&OJeg7Uq^d`_g4%OR_Px3-+u@`tq zDT=y~8g`3?rdwuu#av>Fb=^Sus!CFej@+=gUz$TCO<0Mz5-11NpH3szJmHeGFpk(_ zP7uW%b=eY{rX5L#lZ;{KnqQGvVE2~c{0)~OE6w+777C5;C=6K{6`%WCI&^`)0lRIH zA`=R0WuKys4LZ@f{&dg@e$WY}%o36*0?4_sf2V&Q&WbZ2Q-pdH9z~kyAOOz7XxFV_ z3Ajv^_~2%`>v5sK#p=vGo2)}Z%b<&yrnA`C1;N$O5Wh`=Jl<+u=6BZ^L4C&48+^y7 z_-&q;6fn@J&nVJx>p~|{w>|$cxC}B~l90m!_y{PX6hf6D&f_9L$Bg#9@FKP7P;t@t z^k0;zR9Yg7qD*fEshJ6=7r2cmvP$gWk!z-|qqg$FubDK%&5;*tHvnmD7as-nL1Sxa z!ZpE+gs|m_F3Xjy-CI$@je7hLQj)Y86u?$;&6*I2XL-~jOs~x#B4Vh7S%n=Ocfep+ zUm+`djLp-fJZe9xT)KgU`&0OOVhrd*o)2pvZYHEvLwX-58^xm<8oFFWlpV8xFAEHxgR<3HocI!ZNv;0E%#Mu8Zr z-sTB)aCRu+aw2rAKv3G}r`iFHwgo=RIpqmTlgsu=;gJ!mVC`E7mD8qd%;`7@BIp*e zO z#xY`9`0nrx<>Bj}nnW0-6+pc@%m~Qkaj~MHJZc#ugo~Lx1!)h5%2L7b)uVvriU%sE zyT28+I)Miz4#^C615myeV_dR7}3JLw{cG@l^TQmEN?)P(^;n_1mQ?12T z!^2#EzG2~Y;S;r0%cx`JE)d4b>@7%z0?h}lUeMQ-@c$KZb)3w;X|eO0;rI zt;)?u+&N8c#5!4vZkPpI9%2C;^S1PzM5T}(x79K(dhv{)f@L20M{?o4$5A4+ z%8^{?|55lC4MfAr*DL_Vvj9W?8>&?**gd{-(2*ev4rGSDaUGiv*=mRUqMKYi#z*Z? z--ChI4eYJA)SES>;3QUNcmbm<;(9ce)0KbGn;+F55?7Qjz1#v&VHNIohO|nrK9Eoc z-t;o2$5ss{6fj)EV&%YB=0gE7ET_Tx1reO^ubH?EsZwgtJGc#QR2i+iJI~bc%SAu~ z38QUK2jI*MB!Ie?nrE8c9F5PxQHE}Rqkl(5A%YG)eh);n<1WZ--s8kUZT+C*jb2bE zA4U+$Jd8@U+#VS33B0C@!_N`b)roNc1zp+YgJW<8VLC5H%|}%yk!^h>e0i7#y%A;K zaQrh4)_sTS8vai2_K^}J^D&*I-~ray>8cju#jki-z>(b3H$q!}SSeP|a_|6aNNct9 zjSJqks%J(lAJ$_@CH8jThIHGB2ozF}AL5Ok*t0r4HVnc5e?C*7gfW$*f(KaBj;-1X z`N7HmJJfYoU3Smx}x-!f;zZrOyul7jmfJgz;MizP6VmF0%tupA-j zO9I@JDRRGF$UFQH{cuU&ZuIC0T&Iry#(fclz)Y$`G9LOi^L8!Fawkib9x2I|*wm zSPF>S;{X;ncO3{(x%0&|LMdIcZz_H6cgGV)HZy0_$AD#h3UV!HSeW0SUV|<(vBnk- z0a3JgnN)q|+NaQ7fL21t5wrlA&Xvzgq{$vC&BSwmHxVz{*$>c)uy^TxV0}8C-sgv> zhRn>{N&`*$vkAPb)4n75UB({)BvsWokNp58MNgz^_I9I?%p1}37}D;iJIhdiBnRU26Jg{iKyNII_z!&(OU8J5 z0J2p+;X)gI^A{{p_RXtqLq`P-VL2^ zm)@MX@r(}t-9k|>|NJ!42|p=t@LW*#Kgz=8JG=pD-5*{1zYbPm6h8u9_CG$xX8iFr z)fHL>)j7vAf6qz~bcv0GfCY~bVWs&9F9^D#VZ8cCG(~+`T#UwP^6-G%h!iCxgdZseGHcDt0y~LjaDgSX+IbY#-q9piyw`Z zTVlfY30AtRvxkr6@T5c_!vgK1QQ-43{Sg+!0u0va!ZcCE2pw3eQ3;@VxepK^7=Sf+ z>$BT^b$nSwz_9I5*E37u7l>fh0z=S*X;hIcER~LgZ>qBH;kUkk6w2y;bWalph?Md4;J`Y?h6VhD1A(_9W~cCQ_%e70 zQ40k6nwb7z&ZJF3=yR}bhR;a6GoA=!;Pw(FT;s}l2h2{e>4b63t&Tpmo9P*U*VpPb z1w7p+^|Dd-<`LBV#7jh}BqBZt@Wcd#-!#Us>IQh{zuujLgEz<0h<^3Fm>qs)0?t;y zd-bH$4cc=iiHJ^lLu^I&gqqLH+gG+-9xfs(K@yJ}7$1Q3JQq70@J87ED^u}d;&rU7 zK*dk5Q&#!OYkU@~0Xy&bf|LLxR)>Bg4V|VOS~JXtIopi}CGe1?8_lObei_MJ3*!wk zM`eWSrth0ilthqmZiS*{%A2c;_hKf^kO$Rv53K*n!RWbF)o9`d{8n!Ue1%YIgFf0D z!2<}#!o$Q%Id7Z_y=F%5x3A3RQ-ykR&PL9piQe+n_Zi6A*)zR~>QAE399R|f#x;PxTF{vfil za#!Kf1ZlTGg?pg%JDP}4&<^M7LH!CqM6!L!_wUFKKk(bt?|S~?r8i~b5SCL2SecD#m$FZyFrukb0=IWN>>h$kQ{@B89-m(LFzEp;`3k~nD9Hg| z-&Ie*jloM;Gy=IqQMCl6_p_UvD%z;$rSk1@r{9WDAQ-HJCJG^jtzj^H^TFrIE%(JF zz6&KWZEztXA`>(8EWn1&Gy*rDdU|p(3~Tpr+K_Iz-o+*V}T(jbqp!7g7=S5rs!Md2#=ow`UAS3N4A{|8-T*v6>MEbK>u~N zSNDFxCZgG_;)qHp#mz57O^y2qs!XPW#`;VI&*dvC4${FUj*RJ`P36->+o%QV3hISg*+%iuN% z7t3yXj2ReL0ojPCHrSscnFWSb*yP%dS`7FCfy5^k>nozt4KOlA3Uv;TYTF2Pxw@g@ z^n9KLeZDVQ7w5w~7PCaP=RLLsIIPnT7dslJm`-XXVXHdW&nAlL>v>TD0|t(BiJw%z zP5#}k1{oXbZRy85_3#d03zT@(2gv~3NkRY zR*F_Q?(+r$fF(wJR5MBnHpr~{1lz$I3zdR7k-|10V*nh`hWbc009*+zbeQy9 z+hFO>9x}SNfh0*AN_uH697Up&sGcM&)X(a&M} zj0i57c6B36JK!dh$q+R8sOk}#LgpQ-l@Uhu{m- zHUl|luXZ#B?nE^*!LbSIDHw=R@MaP&x1!S4z6ho^Mu*91U5%uS67So*-OJWQM1Td| zv#cQMyeLx=4VC2>9wib_N!ZIMF1XPNy@y^tp5d8~iorPG0)MI%;L}e*u|~l53jkzo zqbKo+U!c8;?aC)ly8APq>>Ip|CuIpH@(Vz^_4!g3u%Hhq8}i%*ljM|%o2lcpqR7pq zUx)*OjN@1$F=r2bSG#`vSKF38>mTfD3gI?N9gCP_fM`ueAm|oQ2V1<39}k8uzI^5k zPIM%WALeF*Vh7at{yvJGi8h%(4`AnQ1P;R`>EQ$T`4MYZtV~HQLSDpCkC)1GPLKNK z!Ek50!j2rE=GX49B|>PQx`&A^&xs&jm^vYkFo}mK)#D^2`{7~+fU}0`bNLcRc;it( zZ?2Uvd>eBk3ewt|;u)+oxsAVN+9`W~D$)dP+)Ot+Fv3#&sZ0v%bEpXz$JzjO?Z^&n z_fa!R?ql3}*3~?Nf#b+E6H^TI^6@19FZx?7cJe_|$&h(_V;B}b!+9~JBTg9P%siKN6v&SKK0W{B))F%^^TmIh2oG(TDkN{bQ8$&7DAlg zI$Ke3|9QQ$lka?D_3CN@)GP}DI2WAkcm(8!-{{el6rBwWBzinDFNoSOBgujT1-VsN zYbuv3VU{xsBIZOFwC>$t==p1iarw6fi-6~tN?jb6#(gQ){pE6_9O{kD`C&8HPvXwn zJ`Rc)t~WXXI7Jq|zJGryuYqnBFP9uBA-fti;<3Du3xu5W(oX0a5Fx*XUEJ;k+M%kz$f9`Hzxk6%|NoAL7C~Ky1Os>_dl2}7T8^ed~>u-j;ndt)-NKU7kLF5)b>ny%pHo$!Y_ z`y2XF{HbYZ{o@Fv)L_a|KqB5WAkztb**Z_Fc0fS2h{Cdi!i#JN>LNc>u2C1gjP7?^ z#21Js3^NFyv|iL#P~B%VXj8vSqUTDKx;6-x6o_Ad$#Xmg^ne$owY!6kA~{7Ak^?pY zydo<#aat6+GMZD7ng+yKbg!VY=qGN>1wvv$IN*>}L@j4WqCTFg;$#Yx-0aO%^qOOd zz)Ll`idDF*t45L0HYcGX+iO*}*Vy0^FNaR~X#CEE_QYGb;)pYzncxGghPOg#(0ISi z0Er^&n~+aCRFe=2T0dF{a-UA7q`w$Aj_vyy*#=Ph0G-D9gBy9e@g%kn2agp<7$Z;k ze;F=>{c2mulqVi0(qu^X$F>pV^h24m=_&_V6N9$Owo$` z=QmsUiY&aU^=4x0Cbp*w1$SO;BnNW1y|?pu?m1iM3|a`-&i-A&#ZAcPQ0ER|Q(( zKzkqr(V@ClD2+{QDv(-!JmMu1*7YE=Q|$K^LD|K94G$1GfS%FAAHa(VQ!$-WfutBr zB!KS$iVs;*ey>H`b)*Plw}^X9m@#S%i$9=A0ct0f|7a*y&ImuXn~Oaz;C41vAV6X+ zHY_@=jcZaB5n=Sya1Vl+&zkVVmGn9V2&_PYmKtUqCoj%e zxuX$CYpO$8(2-LP*^eO#E7%!Nl0~lqm<9ka6T5y(f-PH8&1o5b)$N*Kq)-u7Ac-%= z!t+EDhC4>C)uvj;`AgYu9I3;4sA}mU)RhCO(*W+^LKNyIzCYNZumY_GSP9vlSLy&o zU8==8Tb9MkL^6+`=@v7n<3Vlzo|O*58q|39rBCQGUil!_B`eA+s?{wBW+{glD(Ev} z02MbW0=G9cAr^qhNQb0)0Jw5WbGi`LzNI{M`j-$3hIH1X!%F<>^wEu7MYPTbnZP^5 zBj7L0!U>?UDW~#t)#pwMwHb%G_WL!A`4D$&GE{H3B%)wgL0QCYMYf1n1+m9ZF+(t< zi?ST4${P8>i1`I^mih>Y9F#=pa=51=XDmG((&;8*x)h zN)s{Bn0Hc6q?O+LsjJ9xeuvB9>Q?TElq4FW7Sw)L()Xl1`{MJ8?0rPNWSEN(yxAIulf73#q_?}c$YEQ5v8KuSd`4q?Q$_#w#FE@x#89-Pj602E7uGZ;QY~vZ zBoIxcirm+xOIW);@54bsN#S?h2 zmtj9sn^Fl{AQjRPW=?W*47+;g~2AZEO|OJ7z-kJ`&T;phtm zI|&H|cc2p}fcbD6>|}0#h5`UZ%8O&eA8cLbH1*jIo$=4Sw98bRpQ_)9TpB&Ffz|6KGxVu94Wd#Ni%9ZZ?%stZc0 z+6)3rL=)r#lYy}Er@*4fb;a4|aM67J7B-z)y28pUbFz%Jcj{M0Vx2Qk)fOV*8&U^- z$KKiC6=mK~3sLbDYbiU`_A?u;g*sdA%E;$Z@Iix@kt+=xV_ks6ycJq&0%=>6#&YFs zY67~n9(5SCoe~Use6ryHbMVpmv|9esj(I&b-IAE03>?RI2QlS%PIHqMY#*rvXRt8 zbqa^pe231D0HMj`Vo+FMOt27eXzTLmgUW)4`h5(-qX| z4AftxjR_4rG4zD_Jo8J~AT_1;fz68K}ulL=Dh^@u*R+ z0PK}udNZs!qAs36MO_Aw@Gg73YNOrbt{91aSDn;nNIdGH8@QDS#|4TF*ysko(0u~{ z>s4eT;Pl@UsmH;pusS z#UOHdyyjqi3giK=8+cJ5;Z0$X(M%}{ATXLqP!SCs3O7K1;SNoUNH3Bo?XjH9$*Mgf zc=3*%S_WQ17+?XOKrKI{LDAmSvscS*7o`uhr{lNPM)UuE>kXbCpu*pE`R*Jj48d_bowfMWc)gO4W#U!83@mLpP|!{4RG{5cNz zGu)&4E>b=92ZP5qf%ND4jwc`+Xdf+kg@rW{8%;V1`78cnC59ZHE1`!>FUaWful>KA z0bZ;>dytn)0~RMIdOA{S|5yIFfAYWhV?Dik0_Yjv4;v5L&=0RrauoI!2#fXh+9~0C zGT#kiMJm-h23H^_)bO{xSl+Vjjg0zp0-;_=dzYyDfaRe3Q7DF@7dZD$)uLXXD4dl- z^lcr6YgQHSBWGGKTPY#&OD7)tXIlIRYhl-w0V;D?ci;Zt&JX@k0_690mOwG%?>Zp= z04}Px_PC1@0`OGo{hv@0dX|V5bCu`xWA(Ua0YK0J3agKKjeG>PEnKPXsWPNQX*fUl3v6AxgBjV&Ol4s^iO`amxwUiMl0l=PT2UdmWP2!K zN=D{Si|Y_e(ZB%lrIR@s`F0>4LYoK%`4;Sk=;1eX+>jcWJ{F=&z(pe59|y@d0VfJx z4ZbxMbfhHCc@e1zGwK7`XiG38aEOP>kW6Iz9wwmUwb6Qh9smq7mVL{HBy8i5v+amQ z$M@HMJ;fXxUJiG%_+hE&sdY&Quiah*-gXH2(25`>uKW9vdqMmO-(Mrmp>1*sMtR3A zmA_wyex52t@hHj%ZVz47Y|%AG`A{yT8oC@yrVueRVDvtCjdU84%A(L3{0Tzirmu4c z0kw2FM8ilu#sj>>G@nnzoPcgmJQ={d>bRM_Lnu&`Z-=5-1e?NO=d0_VuZm-VXK2ll zK$1>%EY4j>%%QwD^p^~{b+EDxbs3NY9YRo)4+k5jMz9K)nGwvGXbg=v8*L~ch7?(w zikE?1sri1*F7zXekO*U0#A0u7DifJh(!qRojFoBe^CpNLp&0f%wm(tNB+EKw+(c|xd3zc2rA<6 z84I@}eru!zT+Dp?(jO5KUbEQs^Zteoq19qY?DBzsKKtNrbbrAncpEuy$4859 z{ezIyj~PHq{KS34u{#dk$?c^J^nU-MbpF^i44-#Wf6qGxuxwSUSkLd8ew_7Ea^6lm z?T>QG>ko&{PCK%}$9$@)iSSUpw5x?5tym`+ob%cgYe11wK57Y2>%6?($_UtHY2ZTs z0Ofkwybrn^ZjKq%0YV7*GTwIV^Lg74Yk~*<8s-(Wf*t3?=C1<7pUHb6S{#qu)bidaF|9Sq`zBVzTdH zQcXPbBrFk!Mo%sUDPG(>R}Y-1k~uAF7{1FG3@*gM@^9x@6E=%^;AEy=tvfS})`c3u zh0MuZ;eLTwuU>1G`YEn9=~vS6(+}Hm(M`FtKs@xsDrHWV3}t}I51n8^^0*8?Z(*H( z-gU48V>MwBXdaYacnabtiGkseUi+%&yhEx=7vSEWL*i2llusfE!MS`n7Ig-5?{0?E zc!*z+-clRiks;^waR?z*JzvQ_um8$IwA87?0bbMdH@bD(%NkT}5@sdjA z+SG9nGny5MExHXE*Z@Y@>wp3@ywToIR3ZqFj4-sSCmNv|EJTwvUcgDC{!|F=mhQO+ zo-2I|YSwf@#B}@0UX>&XS<;(6pnt}W48>cNDMtY*SgJ%>sL7-8TPhyWtcL>Kg>)zy zzY81-QUIK1mB$`KniTcidW}W8KX`4{(b5U8R4+1WyzM1r)LyinzQ2A3QCx&SkGKLJ zM(`6AmJq5ERdd$@$@zQO%Yison?hv?37-P>KAc*w4;ewmZk~H>;-N2?!I(oHt==7h z;PIF_fQ*jkf+*mkC<9dS22PZRiAe!qc3=akdT$6h&i#oFG2P%#ONedB7tbxJi_Gz> z&%^9~&)NkLc~m}O8Np@)Q;SZhi~>wmU33CElU|52-$X;o`{Ksl4qa3wW5HhL3lRa4 zG%Pv<$Q;BlD3a$@u24>b7>{NeK}D6_oDB7iIqjl5k^Q3>X1$aQ)r zc5IA%=^%L)EkHtZa1dkWNUSScaYa2E&Zf(vD)r!h#nuT*x(?eX#`6 z1V&5dhnGRiG3+UNA;x7m*CS^>l)G>p3bhULq>J?+4nqD^uVGRhU=@d+ScB;@R+)N0 z*$)IX7qh7cwv-mrL&#a=lcoUNK-$l;FUVN+u0ti{8mmy&5RO1|FbAbFe;q~icJgn{ z&kLdGM|!AN`VXm-+Xy5NIP7yf0e&DV$*cs->v%QpPTfQ0XaQBaJM8JYP_+&ggkbp> zUR0UHwB;Wix{S$%4n<2ieQ2!!t?dHLbNAtZqe&x&guroRSJK3IPl*ld2X-)JqluoE zoFbu91o@CW(qB&TuQ1(Y2#~o}15p=)N!td+8cGFsD0Bk|)(xPLdfa3U{`I)%Z&)QSx`S~bf_3m~CaXf}v*ETQpr|~JsE_2%u?vsH{a(_@m~j)mm^AUk zCX$cbFpUuFjjbU$UqEzS@ja(fol_I>yyvo##%^6r*;M{;Vmor=k{^WmN<{slQ>3Mn z-DY1mFhaV`IDu3k05IGp^hBNzDl9<2&+ckhioD5@k)PNfL7h667G)9DP(>_A_x>#F z$q`xV$k=9eL^JCsE9}8h89hnga5c9eWi>P?l)y4U>YK!eEtOl!?UlB2HOtCGYxdnk zd7RmIHFLlFR_$ZEP9k8dotRFc>%DujtTHJ+T^e1aj55&#GPyg_rE4s~Nv_M2Z$YY0 z`26&UC=a=>YQFqz!GPM$LFbYeIca!#gCb~Ccl*{f;U~1lDc+0Qjk2D!@8GRvXlz^f z*wn&(qe#RnB`2*G;2e6S?}DEvXuF=ISY)c2ktxK5{(TQ+uJBzui64<~^k}FJ-=# zxjBV#Kw_n^$=mc5AyX%CCGMETiBngj>dAz7#sN{UPen=w%TFaT>01xttsf@1+^l=D?Uj#b?H(k})SLaI-<5J(*B=s3N}RS}1BC&@%>zrK~Yq%OCCn zv*^Kxo1i#AWi;mSU4&VNa@~RMD+}2dvX4?$C}MO&hc+}&I;|(4w^Uc0U0D@)idW_5 zx>R?y>J*m`k35|mvpSX0-b0WO?9abqB)ulK^W>PTm_GTGtyHN|Y6DG? zjASbBiSjnDye9F?$Y6eOGC(U*EwZ;rpRXDx+AcBUS+2AjzTwSVrg3viZB=k}dwV)y zPN=sJJEUCMW12H#zw~sEr6NPYzROUDmOuyTLs92~V0U7yr{~fF4ydfvAuI?7oaa9t z1(bhieR0l_Fd$@S=NyAfY$jlBda)Y_6@o8*9c8T|{LI2kf==(E72luMG+?KM0mR1x%A|fCbs##l2sqFN;jhC6BY|?xHpxN>V zEaVme%c;qRo)jVFhEkXv^kR$UNMkdu25zsLiMIBO*P=-6ir(u*%5b+MVQw!mxrgMa z@Zi0o_dk00H!-x1)Sa9jj1#I+M;P~S?D+fJs*gGxtlGESQiZK!l(9p;dwAkOjxwR< z^5ZPkN!P*w&Ee;fO4PUyBTWn&tHRwW%~&5H>xh7UCaDJE8i3-$LwE(1F`!~YAp%%- z693t*5t2akN|hA*1|%J+jEqjG3yh|+lf>My%|}XHa<8MRMZ$hX=vZa8Q5l4ZsELpT zmQs~|L8OwaKhUx)yiAeu$dbs+G;)~=Cd~n4hKeokUXKVeVcVcw1>wL^GA`w%Uot2=evSHY`Zha$eG|H-ackLi1N87VLA!n(HPC|08i)mr*54pB z*lh(5!oC+;M=oKpj>PlpxkHEQTByXKC|tW>NAc|II(~6hZdmkW__c>lX7G04zr8GT zl^iZ!V_7#WQ43@lEbFFK8Oyz!Nh>OkgHk*H=rg=dA_-zG70*bFhY_G z56Hy?DqR)9RS#ihpyt`c4-egxGcFb0T)k#F?x1e{80dPES&)$W9tuIMc?%GD#s$>; z;T}qhlQ;_HH~W~bW^gB|=ok*zCJ*Xd8A#gCJWukKP(9>yNIcQ@dzL@+rFB^dYy%?g zWY`~P{`leajXx~$59VzSDLv7&wZ`7CCK6GH893{qJ4zOn$czp5@wPIWe5`^4GK)}) z5tjQYt-rFEY6wLZE0k6tRe* zl4C`bbJ?hjg!C_!#5<0+&dWq2PGO2|ve$~+r@Xk9Kk588NU5CYA!h~lpO?4U5#^{j zrW=-|X(Y}}KHKqZ_S_dI!{O0Ar)?ABf;Wz$ zd#p1$BxHS(k^dm%fb2o!$65V-`5Db0%7la&1{xgEu_AwU0&ax8%!^ z15jR|IzV7*4Zz6Z=X~!}5ZFI?v+$qv=x2idd=vodqoC;fDCypancoPZ*@!PV@2%N5 zs+P`WYM=9J;hAj~GW}7@9Tu|Oh*g!QODSDFm#eK(>Rgi)EmT9~+65zu&Fin_bY-Dv#AcG18P%HR0dVX zMCgTa`zeA84v5Xg+hOfTdj~6?kW5U@$FW%VW-<{#t0c^tC5ppXhj? zYZJ*yjUCo243e6yP>A2wtn&|=>V|4W0vXdkL#*~Pw-Y$^Kt-q2#Nh9Te{m}?zO;68 zqAv>&Ecirb;pQe!3u>nd*3c<-$p}$?|g`?qYO?Cwb{WEAP79 z_H5tv(%V0zfcGJJZl}g7ms~M)NE)3w>+#|oB#+FHRmb_EN2M>AN#rVTltQ)W%Ce~(Uy|R|v)I#qM6o9?lt04UW}REQ7M1tJ{RB=dvDPeKK`HGVCEjXp zg}IZ&KjV$jJ?*@RFHDYhKLF(?^5n?-hkLtlK2jMoCDrG?MMgq3^XBWOIcC}*CWo0U z_t@_=ucA{DR`Krb`|6|pPqHeSm*0wcH))%&gfzk0uLja!1*LfR3mNn~vH3?~E%U{& zr_n+WPr)!T@VTFzK~{_bI+C0+C+tbNxALGML@mH(Ad7=wag18Hz&ne@iiq!sWC=j9 zCubYN`7%>R93{hiU)>i`VP)(a1J`((sd~BaFTENbXwwm4<{gcvf4d#O+;Jlf?-Mmf z;xS)Ap<$9+zV|pyFk}?&9%~pHmWhPk$bf5@Xis69Yq~j4%6%uI!AD{{o154-K>s|a91RxXl6E+eR!d=Od5vd}Fnq1u&4kPjV3^NkIhrYQ-*D5TUR7gh~JJJo> zL#gdQO6YKQEb|Y zdF{a$L$f-X244g9`LH9P#$xi59R@nwPUx#Vc@Tbj$QTISLSX1xsh=1F{I(O?ty<#{ z8UOrjzW|I|1|#sf8ye@@ukwH2>$cJJfBo|O4X{7BUyNpbhyHwyN`Ic3|E1TA3gKtV z!Y_UPmlqP_H)83y8sdU4bhK~Stg!6Z=RISLYPD;uE?U~CR-UJ7{-dwmX;%#|)OLIs zguYBCVlC68g8k`K%s;e|zrHEcbshSbe)b-{8j*y<7dpr$h`~g%G=#bal5(IgDB*wh z1v(9=7iv3pOyEmXCj&BNpsV@=Q1lY*A8{4r^)KRI@@S8`%|sE--vJfb`ul(-A$zwP zx6OWY0x3K@c3+-}i`@ z#tVunzJ9DsDs6!U7Cy3Db zm*<-j=63*n=}XmYnBN2b1*q|D4qfqhxrX&P#e2($!`Sjs-qnyyx#@=Au?AXrW!8iq z*q2qu+|Gax#zxe zPcF90CU(}a5x@rvpOVTMDhPmRvw`$?TomBBJ%24q)onn3U(eH|l)C2|3GJ`)PW_g6Ks2EGZM~0Ap#k*Eei2Rh zZ@MM>2`}OcwDNi1MTp9fO!6CpFZ+%6SuFQ>p>p0UX*A%dDcbGdKe^o$O|v?^&_zmX zJHGx=>G~5SSlpvq6@^}iBEM*%hR~ibe2HJYiEoE5B#zyA0Z5sCPgd$k-w}1cJBPI> zf=n!f3IuB8R}L*;YQJ?z8JGutKydw@|K-2u!-gxvbmyr|fQqo$t zjWM502a@Lb3uggFV&nma&P3fH$cry2yG`R2u3FdLR@h7(z4I*SQ4lUUdwCAaDjr)# z@O}TU&S#S`-V;t8CEkH)8l7!eMWMtIqiZk1MnX4EK?x&kQW*kO!AS|;u7zIbp?h-$ zJNjVLg_NoV84fsqSi6@9%DG(&uo}l0?hEYr6qKoQHpE@PY<0PxDJ)Ss5@d@3?j*J` z00;?({%^A~tVy3L0g7=`p9l0PcQ-8zwb<~QkcH7_V5g9-Yq4UV%euAX7s--FZrQ+) zgr^-S;a8ux+I5BD`r-ne-S<FVyS767&kGhGlZis$mKo-_njOj32O1U}zRT10PTz`%NLAg&84 zy`x8r-DS8TkUR;v_NRdhj!ZKyMoQ zMFCK52qGN34syTSzyv1>hZtZHmhas*WFQVFoNOB&r_u3rKqUYe{E0bB_cMkSt?SqO zC!NV*HL1O^N4kgAS1)5(R#eofKV}sa6oa$0^FVDiI931=%ek+}r-KYxgO;VMJ?wf5 zJk!;4wYx#ZdSh-Ouk`k%>uKCL-NWzBUbpUV2HiR>1rWwbo0v5a_fg`ON%Z=_CI#<5II)5T1G zYzw=@#VO3Wnl+aEa{eq^kV9TS8E|2z`*y93|2W0X6hL4D-n?8FALeG#uUZu(m*w@P ztZ<rP9%|K=(<&IM1g2326~O`WOFjkMG@JQaAi zMp{=iSEyypm?JWf((1uW%QEUpGat)1*AvnV%x^yPAhX{ryMF%p8K!YVUJ_-9febdg z297i4F1jEK>p=NH9XsgXdx%}e18yvo)Dx1*s<@MEysSt`6 zveHGa9ley^rB2%QY%8nOvtl3Ec0sYbhajE+_g zMo-TC0$@MZ?dsA?MsM=+S=zOrtAboUTMc7y*M_q+66kD5=K|vD*P_inIRaqcBgJ*n z5k=RO_4PWg+YzpV*6-RRp5k~GV2mLx3023JDnd%Ip^X%~6o7mr-jwZJwZM}B)ZafW zfPp~?2#uIyt`0EM1Osap)(QtAXq^6iIYKO}RlA;+OO3vAa$ z`6gVJyY5IE%d1N-pgRu!(BMZqm8t6+`&Gxhi;4$UyH}T1ZzDoODin2;h98+wQBiqH z=aQW?+mGvZz3L7DCMfdeLEJ7HI_G3ayvdRA+0cwlA!bn z$CL_YdYD90)WS2Cgm{0h+JhY(DAr^IoqokSVt_}!qBn{ZO4G-!^GGqBmkRK^ipeoK zSNgu2Ts2ylERt8801-c-Blbt(SLSBFa1rp2W8&tnT^W(L%4F^rE^$3RWabP#Z2*1} z6Cm+BbJ_Gd*R*#^@Am&Va+~nc7tab0OeDjd_2^vYdF20*CFD>c`LnGx2jKT*5r=Dt z?)Gs0*m>J*4p89zqup|D0V*`Ci)v2f*SQsYUcWL)TR);10Jv678$9KDPXPNF&7okwJy3PIaLE*qY=R<*Pqzex{B&d5YLC0nG(5 zxgpIK0a(6;mIsBbNEX-<=z^fHWc2t*=aN_v2(*8L znInD`0uXx6Wc;|5J(fyWGFY|4OgB4A9JL~O`DTqIS&qpJO75F~cU7|3=P$T$n+(a; zV6+uPjL2NVDINnRd+T>f>oB&5$-n{yn2M=<@L}N~H;gMG!Jm;`4b;yEsfR`&W{A=q z;B!Yiq3_Z1DW%oqkJdejK!ONleBP84NC^tz2!uPV>K4999Ma1R@EWo^d%B2PGVTl73g1ndMYOw|1j!p3fiB&A~H+zM08L9%)ZJ5jH<&GNZ zI44>^G#2t3h!&@ov?_TI9xNg_WIKE7e>EXB$7+` zy)5ODk()&t(fP~==|yajayqLym!z-n z7D8!G$SrO?_IRj6 zOH$JHp<_=~o^sPptLMTyM@j@QB-+~{9vu|&$m~_$Wk^qT#$Lii%LR@Q7F|gKbBKN+{3M-C;11T83+defx zIq7eCps5|OxYRUdyW$d~X@ymuvf{HlN{x$e`i6O>rg`%Fi2jqfW9w*M#-7w^VS8`W z(r~BJCAsk6!-i&rjf)G1meW?_U7{nQ43|WYvY^q;<%@hXH$xB}10;ES6fFlZ6P^_g zd32VfKJ>ya#k_RvMKtmfPF~GcgkC$(jA-n48 zgQe|L-&Ss$F;_jl_B8UJFeOmC1(G1m$WW>|5@#hUZP>=Wtxcfp6-;j*2do52t8RnGCVzS(50vz4Kh@Z1MJRN@F{W|D6qu5j6TB%Z z*xWevt!wGE0A)1BDhaIgaq0wR_z8M(BPl;ndr7u_}5V-PV!lN405`9*a_Q(YBO06kq*nh{B5?(Hv_PDvH*PJL6MQ4 zyAtf+adEF|L~<-v5jVWuy3-7Y2p86jh5>s;xlHo#;vJZG zQcmGMj5k^2B11_7h_I`PjrX{wk2ZA%R`^V+k*-FA4?*yEL+YVDpd(S@rZHw%D9nSi zJ30&iuY~NA81)ig0P215@vL;MRLeXu!uib`+PO&}-RJa5 zEaKkx4&dIGG%gxt((i0(ii!!+MAgE$P(|-oIv4&|QB?t!4V~M@mxYBAO&?J6nPd#w z^!1&>xA7kBB2A_rFHLU(tzT>5C&mI|sqI4zO+oB?8u$K_8Gj8JUw5~b>{eZ!*g571 zAD)OiFY#GLMQ-IaZ01$9-F4@k;$^oFGc~XvQPq=u&?`~JntOBeT#ah4Ekho+TAZh4 ztrH}QGR(GQQ?gp`4B|^eqF3}_+}AQ&R#>SKT;?V*dv#sg`$ny!i+DldKdaldEb4LEgtzqXM>WPwC@3882!H8O$GoLS zJ#~8Yk3WRgl*ou?B#Asf4278ZJh~I$n+dhgCFA{MSpQD{3&iePO4(Q!TJNHKoI};u zwZc77=(uB#Tsu^!i zrNPOJBx?|L3%7R$lS(~D*VF3VpyKfu4eWpB`7xPmGLf$l)8kRe?cwyelWb06;*3T6 zqRu`gB0F?RumJyN$LCx_#)FF|#*!|Z3KpK@ts3cSQQLy3F zd5O92pMn2;?6MgJI(Fvg+mX=PgOQO~I8ei_E93IMxLxj1Z4usMDRWp)SJVS2U)ZV6 zzgd+A%l67*Ao+J=bw-Ml=?=N}jXS8N#>;honi`i5a(<|tLfDgiTzRvcW zTW$dtRwci&Iy6uD?uB#Zn_DEbu*t&FL-2r@iN@; zf&I?%Vc>#L>H-2ji6yiYU-<-@?5Y99KRwMaix_mZFlRknk=?R&GWy|YA<()_Q32a# zEAi11O!R%xqj|TVgbh*3jF(D?8uXsv&F0e$zZ4X3(t-~(T8rX8$FuDL_?~I#2~L^CZg)oSLCmIieZ() zS<>zc!_R(hS5B;Pq@>ZwSeGATj1AhIR`EZ7=xV_stTan76Y+=#eNC4hr4n2aZ%|B5 zY;-x&KmWGSvKt43Ap(Vl(1*cCeH>Q=YkUdLZUL+I9YJm|=~B!bI;pWJEdq|^QKoUTgTA1~NpM$uh}9LOiOlo%8U!r5N1qHN@a+Tl)#zQo^qW!fLXlw!YK&Mw z2_g`9zD-E%k~<8_j<0=-s=#?)METP!r&dZ`rLRpY6o`& z0ue`@PT>0V*conVVA)mt;`ucSS-hn0Wpm5)H8@+q@t1e;gZ{o=n zOLy|dp9ND)7cuR)HJm*E?x5j1avz9LdB+;K_;JCH85p(_R)3#&Ux8`b5jduUZ1e+( zw9O9C(1cF;ZkPGZT<@7*nb$KwC~GeQmE z<9zUf$F$GkJknKcSigbU_!r*Zfo=1+|NdjHuELh45g=3o|Ns8CJt*p3W6;b!`A=6Z zBLM-VHH$ex)%>~t!$SJ075%%P^ZX3SxLnrre44+~0x^w*<>^Y|zkea@{tdV>_E(I4 zpkYxo-{INrz!0>R%wS~KB?K7w;S8SBFFL1xp*Q{o_W4c+;@8dq{Mk+Rnbr%CVmwm; zU&OE>1Q$Y>MaxW3)^{lD9_Zmbp0G}r0So?rZ~U+ClJ)%u!nOZ|0#YSloYI=fMItNT}2ZRcgO{_iO*^n?Jn|<5!7V=)4+r zW#A7$-6g_#t|I!TDhZJ(7X+u0ke5MXh{l7b?U;A{=^}~)zwK1ByUupKWaq`Zo|PJ1 z69Q&xGQg%n8Z_mjq+LJ$F#l0m1ler@ zt%i{B^3jdBn&yYV^{(64%dtodHZ~D^vYFBJ=ES5Z>vs*C5}mE@a(1=XLMURPMa0uj zDo(bd@qY!twWy7%eUL-TZ=Wdo-c)0C*fiSwDZ>!8g zrpyh?==-rD3L{kGzA<0a12j6@9z(fIslp89mX%!FIMy33JK`dk-s*te?2x~|t+DaB zGA>E9O<3IHT@1Er%$F`n6G4r#&3FCC^|yIFFYrzCtk~Gz7HBb>KJ0V+eIgt)PC8=~ zA$d}Tn``EG4P@&hnIK>?*SNRh2_hWH#*lLt>Fp4(fw$IT!=q9fs&gL-@IrG#OO97X zh0eY1RGW(eHGd(<5Eq?WmV|FlDI`u3zD@o*CqT2-N|hA}RP@UdJ`ejr+>xmFz}K28 zHKMJ(Oco`78q7=#wyD@P4h-nxDL3PSi&nm^S?Mb0^jI3YcpRxWAu$C{qg*R#2A>bY z$91WwDIQ%opz``Q5VQopaT5C&;BXtckuBgX7X{bYv@8PV5qer;fIbkS(y_5oxAw>#qtPff$)=&eAsWp}x9)OB0 zo;$|Llp&rvE~to`X0vY0_*$S>WD+0yEo5f&4~dlC&>IGwFJ3PAiyXuV6pk>L9@!mDGn7 z+Hd==W~f_5MVfF=SbaI!sk;4SUr6S6)gYRE$8vKo4Bwh#BpXZd;ngE83V)5JC`prb zo!gL**plVzda~%`J_Qt%>!e*_Nk_`)oSS@9_;q3ol6VEmnJ$`iRl3?gP?UaC-fz~M zUSZM)_R$7tS(C)leYErRxRjn-8qwjQObVtS%ItpH2pYD!vjT6FxX=%bV- z5!-J{0AoZCB>v(75g-P2lC!Z@K5hr$1*9}6oy{-eLoTCk!r zi=@g)FERE@hA`A@mqEb-MiHB*ipc_s$hfX7crra~X-EyC=3f)DYN zy>;p$T53I27cMFP5_`hO01(_n&=QSgvlL>73cSDr5lts3C#3+Rmxb-Ew61H;Z8pD? z#gbJNsHJ0DWgHpDLg4d#toip+s5KDHOFVs1ZpGHbMWdlMoMwnqK!U1Mvz0)xY0?9g z?3LzfC%Nrw(klbM-6FM7jp8dl&FlNOv@O9lp}rOTaIo_~0j#H=_D!aa@P0aK;}=M8 zB-X#W^6hp#H{@1Lp&c~DVQqSA@P=o532oQ$;PsP=3kUfX?z;W>q@L*PQZ>lz41AWO z)G-4&G|mSMcZA@PtSv%L%-2r=WYs^rel4`YvfTSr-QF)VSn4@TWUL2EtXYvy5dQ>S zC&wIRrp@v;#|wsUr8IJzRqLFj>1rn_D6Qs*sFgito1z4Dme_VJMrW5vtedj1-vrm- zWU&z2M2@FNn8;H1^z3(T@1%>XoAUdF(U=o@{w3EOZ2Gdc7LlBv6ol9BEG}=0 zBH%kPGGDzq{G3~uvgu;YwOfsvC@e^`n`Bnkuw4e;tQm#a@osO?p73)4WQV(bl!W=G zR@I$pc#ywCx=&fROcs&xu{yG%8T3tASrrc!$1e|fPios&h6qJ`0BdjlYO{D7Kdv2H zZYO{M&S8S2sjo70NSry-OB$cARQs>YU`jqvEKcdc@RIb4o1zWwHHeT<*6kEaJgi=t zdqW$ZY@*I$YB5$&_$~w6hY9PV73#Xw%zyfD?2oz5+Xw~|d-8W}{&8uU8X);6x|WB^ih z_WRph5_e(_am@25$@p4Nu*q)F$ZG|T>S400Y!$^^--XBAYIeQdp4n310| zdvE`?){16RVO_-ufgo18-w4kYTPKzMhkvzqzNKKNV!A8UkgfdSmq( zOMjV)DZ)qOD$!LXo2O-DXy>l@`w&h~)jU3X9%tT;R7tAICC+@+j6tFlZpeh}xrH|r zO`L^7xt3rC&ZUpQ{p|BCr1#LrX6?f`)ogf{nHCk?Crx;@A*JwZ=!&tGM?Z=Bus&Ie zwHYXPu)blz-9y8LOGqP~2NMb{^Bma;;bG~H@@30o9$eq5XGMpUWkswmmp&ClKejya zQ7f(NOl|_@fe5>knQ*WaM&}7fV4n&==*ZQ`z;#Txz4>-xcD_^3ih=xBY_9JxcUtKt zxA0mTlpVpDdv=75f&6aMl`B2+i0kBgln4zWU!IW-{dTatj*xl^FE==+rT7){uvpIc zfo5qhRWHFk?=HU;10rx@Apre7YZ6qoRi^Bs`J+v;4r_ta^i&X0S-@Hz5b~fe>shf{ zmX%?iDqMj5&czL!oXOF-D9t5dr>jit)6e8*5OVT-@7^4aNCC=1xh=KM$qcZLGl!Cc z*6~f19Ow0GlzHjEW#8Pg-o}5fRupG*nGq*adI?9b2SekiR*j>sP8V?PY-cY>gEVlPEqcmg9XxsZ34rsA`ndSiW4;a-oIc~-J_ zS9%f1;?B@1@bGwv#oEfY=4L8aS#-)lk#zi7RaK~cpy)8z=srnZnh(lRvhsL|8&bu#NdG4z8mMlI%VX{KT;9L@1NH@ zK?~4*@W6?Y(l}=MxEmVo!Qp1SSst5%N+U`SDm|=>HulxRz2y%-y4YNk+=`KDdj!8{ zGVLNjNxu&Q!C;ntOcG4k#+U&3LnrCC2okS2C+isI6U6IP%$A6P+tN9+V$~mA%{o&I z>P+y+KlOQFEn{J}fDVp^WYj4wyu@G$4+OL(P$F>BP%0&f~qMxDOil zb{Hc=Y5_ijWC@>Q34u?B51=LZL#)>B4}uC2%zzK$BjRUy9}HLkE<^1Cf-AuwSZ!M% zm|dVI1cB`b1_XYtDMiUZhe;n5+^}$FoadnV$8I+`!a-T1+)pI;-k455`XHo%UMMXB(xOFl+xD+9A7xvv@6&NJR#x3s9yJI~#P|3V$XPr4l8meAe`3}3tgd`Ker|8$1C zX?MeE#uB5{{;bLEKk>WY=)fFcOF#JoLcxFo-rsT|IWZo1E<>gW{*ePKGWsrnj=Ir4 zL-*eQw{HalY2XSpG{Srw@$WhhLwCTXYYzb!x(7@W1~M07*wdYFc=&hXBwfD0(*R$= zE8h?%5kt%AM|1|s`9ptneHC0J0`KD z5vrB;BgrTn=mXLt9S7)Cd=43wn74^6{*;!nO9%ao{{YfWLRRD-D0&Cd+8V;FupvY) zT{_@rr|ltFK3Ewu$PLp}k4peVp{Clh0A3m_*wJsgEat1+} zd8$(_bsJuzF2ZY>=Q{-CCnr^gL7;v7F4F%C*Xg|CU+AnmPOM!6cea2~7yU_xrpTsZ z&iX%2{dH9Y&mZsS$-oP|_FLNNYT7KK?f!&A$XP;onEZetnYrusQ6kbblQDiuvY^+J z*Uv8a`AA|+ZGT}Nyg(mxnN9zhtDsYLgw#y^qTMPqP@_GSK3}}o`t_@hSdg^y>Z`&c z5L$(hv|Pf6*TJjjJG|S|j@SR2PX>O`^(MRD%tnj%ev9Jc-+q5`H-PcaR=F2=!F+_r z%Qn;4PqQbc{t?_RzevpTr!dL9*stB>N6q|m!3F;+cma7`f6~F*^x=P8bN^?xRT6e+ZVvIiUY`>m$8|ro(#d(xeGe0+%?8y%q zJ8efF@(ZwXuwVJ+?W$)npKQK&@5z%nbFN)^(spXI&PQ`0E*C$s?|fh$LnI#i>%aDG zkN+C?YEbCB@WqRQL{f4VCjRKvk$f9R8=Q<8g$2GJv^cbqrz1y=v~d|RY__|5`~C5q z@G|bt1{d-Pkt_~cp);P_vjul4eBd%u_C@KMt}#twI`7?=0v9NYD;{g>yK*M9hU z=kSMh{?Ieqf0-G~8y`2p1=ZsbP`fhU>g*WAB7cn;tR` z?WEr`w%K{au;I=Qo*|3Frvxp+R?xz*P|~gVu(2neBMzH(d^9phCilAZ-RDPNxuYtU zk01Tf7n&{3#jCfr3@Og7o1?6-Ol34(D(W%auQAv3T9fw2Wf2ua{ZDDHwJy^Cc%`oF zTybm6Cvo+U^;vgfBK{fMe62C(YV6i4n%UELa$H$@oyQ4>IbY9Q<*`|xckL8xld1yJ$!q8U9A4zl_wJ& zH`{x?UVTUZW8l*f`LTNa(Pw*e^?KzdSn+UPrOCv2hS;Ji~RIlZi~$qFUL+T7qNXV6rJ5Ua)V9Z!NcF{PkldZ;jEU? z`hw;*2KV;JO`qCxSKhQXv2fgIb)9vv+WI9%3)|;g?3FY(^>&O|n6%>i0alME97|k3 z(|32-E5{P|{Qbn;U~9ep^f=Yb-EWxgnecSQ+T?{BhfFw<;&;a65DqqFprCrppgPl&x{t*^Ry$Rc(+ zYgyB?u;^5=fust6Z=5>?1@FRzVVv=;mxrF zoUXJz8hP*8kaxcd{Y*c(`p)5|+;LB?v{}#2efEKLdFg=bN1y2RdH3{{`e$~fyOTrS zjJLiM+jhd?20oOVrN3!n=Fvm-?&XZO&sy~N=WO-56LVOvzviQS=CR#V5u-)|)PAN*t@#-XSnUL#J%5XezIIf-?%uUySEa4j^rsf<%{C5b(Qk_DtIut_wp^d4FMj55 zD71IRC!3qEX!HTa#m{2w2ArO7SmW^I%FrEip542rZ&RumUU^HCmI>zV%5;9?NLF3s zZ2Li9Z&vv-631TgSRLE^b(1n@_C2-m-FN5K?KxEz5Hiy*IVAKz+doY#}<-<8^w zG59M@_hde7m{2sq@#bgSL&xR4G>IM0_K0UsVtbgF1v!rI%N!6VGg@`yJ$)N{UFp&5 z{TmApV=_^6y z7Jm@c=!?kLpY>hQyAJmMrd0ms*UBsV{uQDg9~Jx&Yxr}o5f!xCzP4<5SK7+|Y)s-$ z|F!Au#^G~T<`;XZZjWd?Hre0Gm-Xe8e{;p``o$lz?$-0P@2ETgX?q`4=tJ?cc~h9X zV!`Fv$e!6KUkPl>-c~BR;uz`o>oMk+cjiz@(jlh*z_z(>GfS4U==}HqpqA}-c}KFW z%KZAj25@6aJ+~_2hfV9V0K~%HSv?r>4vy#x6p3@W_nEr$_O@Z*s8A;KDHlYC_%9d= zOi)<1B0;-prss749i;t-WK&I7(u=S=|9K_uHOubEs*@>&B!>b?$HqpS(hYSEoe}a{ zwDUIaBMZI;yUric3|D`W$G-D>>>e@__aDAnPsg8(x4$dBb6fO3vQP4F$=WpfTNpGT zLSOi(k{SCL{Bi$t+>XOvxHje{+ratq*`X zhs&nn+YkVv!t$`A7@h(3%+Pwx4zrB46yr|L#kFY%6@ zF0)+yTaHZ|a4JYwd9lOiN_x4C&l}L}mo-z#p1u9J-7#+lUnVO9VfE2c*_Dz2Xm3V6 z%aTu2xMr$*a_QqCQ%@Ww)z$y14}&%|PQQwEE=K)g{UgAtq%h}il;8Zj<9aMwiKjOa zpx9q`iMZUjaqCnp(gyyb->nrpzo67r#bjWGVDNIJSfN2}lge6tmtH?VfV9l{Ad+S7 zOdv~2O_?7jo^hJiQ?G)A)N-m{%v+~GiAr@|BU=!ogz=HA9lh&z=Bun(mo2eR?;Z0& zxp#sZ&?hTxV2FRH8SfR?9=B`X0!!r*@KAyPymY7icP!1+cM4%&2*9ic-Bms-Olc28 zqemnoNePL(5*<7(rk^Qy3IVN9Q(gOGJ*%bJfD#{Lsb71Gx(f*Mkh@>&>_R&hO;GM= zIq#?zu3(RcjY3vH&`-GzhJ|2&zI0-}XfVhS1_)_zc?9PO&pZC&1D${_!}8gM7U%Yp zE_eLPmYp>JOsklfYr=(8s}wfaASLh5k_jc#C#kALB;_VB+bJ zQ12!2OJ-EZ^m#m8MuzKG4+}xGG+~b@d)&GKu;_?M6ujZ8C2|pe1rXDv6EL)f9zrkC z6j{a|!;3p<1|~yjbN4}Fj|xDK{OiZ_J7@hBL+5vojT-9a8h)MpD(N-@n@}enr33ip z9WMBny5zat(M#|SkxRP#ardF2U!{BAh_wTD?Wg^)i{?%uclcQ*y%PVL0{719%c)bq z2=_qE&pNWeq?KaugBU~vNoSLPwq4;Xq%1Qbzs3#tYyd0&^KZ0WdHt*XK+v1d5e$@4 zuzZiS(IEZpf$Pqh)BW}Kk9A74p?ouX3>B{1@2OL8>9Ywl$U+3nfA^yUplGy%+d0Ib zZug{9*l-3!J0Q#JZtr$qhaH@oBwlNRk{Srz_t7=GGP!(faidW(Ft zeQJ*0b!Q0i#8~D;4P&u1-j)SQpSPcP+$T;fp5#L+b!0d+2IGwDu7#gAp>FGYjRx@p z9eI0qBfFyOodsjs&@DmngxhUKPEsJ`8NVuUfc8syaLMCY#xsc^5 z!rKseyQ^|{LH2QiPD4>`RaD|ocVy3GBM;4RxN{wnTEN4q!&9RDSs5$|N%NI>xvKz= zH)qS))P|c!4myK{_F!hZLBeUsQ2=5x3Mh1v86@O&nh|uhLB?Crg3{AoIRhLEO0ailby&^?Am%6)^I<9*arO=C!beEGeooWG5U>Rj_aM4_? zBB2RP<8F%HTyCEXiMQNlOHiPx+!8XEuJ$aG4@LF^S?IF`%lY>`m{4a*(`1 zMhq1frlC>6R~zUgD2TzewiKj1fqwVy*9kSq{SJ>J`A_(4r)bh&>{xJZ$9E1j?-Xci zOTa>_Xidz%cB+n%bfvXLuXCX)DzqO{4Ov>9i=uO}2O*lR0~hg`axZJ#jCV z*34%dxLc9FyWs(|pOuBc1&1qJ$rEcw);bb%Bu^<#-LlZ*1k$85g4N8;E520uojvZp zr}XK8;LkbWVSdGuvBvTh%VA5y|CV-9c~Plx;@!C3&4{7V=l8N|N!}-thAy{}7LML~ z$!2RBG867L6w(O?S3;Un_N5f=bNMWsG#TO^6O3eqAJMH9uA$mT;Hld{lKMKdz;l&R zr>?Ybh(wyQLrbFlRd9O-Byz_-JDjbn4B3YPSA_CPiW_ngSjC1^{dR+os7}YA8@kt{ zJzY)Z76E1}`g)pqa!mY8n1{`o2Lq*REFD#*iEJv~EG~krqEr?gdbYM-%hON5;LUBc z@%9hZWUa9pzcw$$)bz`9-||0Zaze4)!sNC{2M&tpw{%J`lYYg-p4{DZ$yhIEU(Rtd zhb9yTXE~=OqVXxgL!5($LwAf#eMB`a8Vf3*i&nl^4l-y{&_9<)Ibh>3jU6-u7CX*M*?GI^)hyl?&boy;`r zW|^TH57N~{nP1e>b8uOMZ?3b&;krk6hEw|J$g&90Ru;I;k>rIwnz{JLYNf$*u}YRe zLGP&?6>LY6lv^jYl5C@0cShOXsyh2bpu?w79-@%<{rXlUT6G$0VUf|SvKUui_pM`3 z>gz^MsxK~(-Fr~456xg*FJqb4@tY$u`bSot5JY=kV?U6FnU{P|ESQ@}>>rKPFn^KK zj<1nND=i$+ha!}UU=FKOuw)JtrRu4X=To-k9EIGm)`{hSG)5)!fLNnod4^0;dpohD z?N(5eC}n=RN8h9fjtPgGm?uZN>=!ELkCHntiIP86g(AUGB`U4vFiSL{Dic}w4A-&N zFYzxPsV&dTbm6*=iIZ&IEE4QTW|L-OYTvnvi|t00!DMcZoE*HN!TIQswwR@#ketQL z^Ubl5W0GoyKTGrbq8gpm{ODZa0h%oV`Gd6P{}Qe|CicCof)n(z*M?NPXUJql?zj6t z%P#HzoMyEpQLBt>Dv@7b*K(@9B4_fEma4Ym)&T#6h@v{($dl05iLRKON3P^FG!%#V zC-QezHgU_2#_YdtSgi8$R7w{WONsMpxspVVEY(cZ-tB12zi-c3d20Fs%s#5dK$ zb(F(oq*NCNzcJ~Hd?mULLO29!3`_k1$-_*AU!i?g__@rr2{m|w zq*~9&KY&CDg$gYI$XKO(=k*DQ|!8c*TT&P*A zv|T65LVXIO&3Iq2P!&AU>6N}cYV%j5?Oq*mKI84b#W}t44-<`zhOdG%mt;1AxdC%s2c|0D~S1XfBb>0 zd;z4`M(}Vb_f1hVNUb8Mt3mUtK8uL5o+=x4>@58uKAm%FM?~vxLd})={YWJra@HDL zQnP{7Fhie`NQXb@sjcgqR-cH>uvmh^+13>~)~utf{H*?G^6TTn+Ukp0+UPpI`lvQk@AVWiz+G@nyt+Z;Bv*&-S8dxXS@U+r6&G4OWnGen@3&$0%SUJMPQxvb^ zY54ur4A#=N0gJ0ovFECoCF4;6#Zl$(>i3Q!QrkczXFIQa>Er%jcur~z>7MANb*lIt-c#m%Y0E4fG7nquCK4I}BI zSa0uMdYiUNNNWEAtJ(8S}8i3G-?C@}n}&$Cl03b%%C@?704AWCJTFGAyPb zN6$iqcjcEMJ2(xjC1+B-&y))S+RA79d@lSxMk|w@Vmq-idb)}ZU|C?9efPZ?!e%IT z!A}3~jH614$*W)rd~97so8}%}sC6mY!7mjX3~58rQpoV z>Pr^4lP-RCU%7~XLxD0#CMx$~77SLx>9>n`iHsBMPY{W-lE%ezR`n>eOXx*J!|eyhL6mc3M9hpIQm^{{2y*m|l>x`9V;jbNP217CpyDWc*&KM+IW>_G zs5X{fxV5G9JP}!33^~Lomqn_CwBC9|mtlUB(P@Qod2Mb*#g)>)s-9z8pKu~0)v_4v z(~m#4sw6I>Fh-gC^pm>Qg1*h_09o6nN@RPIXc3qlm;%0?lQchWLy2nccW1aRiok@p zb;E88#@8mwRiQkEX~r8a>l`a6Ehr!49EppDibh^>pA1$2LN?z15c${$t!dhD#??|e zYYKb5Dxk-#;UF4kunGo8*yuFl6c-#dKA&nOPlCSXW2rFFNZ1n9+&uY!<=pKq;}UCG zemD6m`kw9~vN=`_Pl87hF%5}r6OM=MqgTw}P0`2Y;nOqM%z1RSZPCrWQSQVjzr%0O z*bVM8>M^D&(QDT45|aZtq?I|!QgnJsm z#rXU3xZdnxt)e*I4i59ag|`Bf`x{D^`e;#WBoA&3!&b&HbAd;bO;O@iAgM`L57cx> z+)6hULhc328la}j9ikHi*K*-9DVSi``RZ5vK1Uk z0q90RDA&2F=~T&3Ug*#|*V#w7W0S<(;^yNzI&rbJA;&*)BsMa&ijTP3#H!iUU4!)x ze@P|gfa69jNUY@(hmRU)FK6FWC#r|-pk(a1rnQtzkQY<4|lVOW8R9|vO*4ml`IB#YgUhk zP3*4WOe42-0F*Y^ilVIRVO;IK^ycDX^vmP4NA!ftDjbl10-dz)c=%SB5Ojatpk2i?UZYioQk6Z{kH@mxc& z?(uQLvT!w|;zKkNg zsJWWzXPBUVG4CS-T*!Lt7d7NS@MpvY9V~2*Vh74t`iflE$-OC&JFc%n-NNYH2bPsh zmCYPW>|hC57P64$kR8p>GFbUJoE_%RPDC!@?4Uzp6t!mAstnY8L&RY&>VCW&h)Q2j zZmg{)OhJHUx<&_*n}MlLtoQO0)1Vz%1yQDa61>_ZVbq*X=eatA)^1|0FarWVwWB&ekAZ zK6KHTFOQTzjP?Z*pu-M}xGjW@^}u3zzzz%9Ck45(2J5~H0xGocu}B(xfBkZAmFL?d z!AnxMv@Bvv#lFNZmnuSsI_Jk(EG$Z7ucCqy9V7xF>Ykw(SVA0&Vaw^;(?w|~a6$Kp zD0xRXDPp7xcw+v6qCZw%<5pf8c1yNpu8L9A?{)wfnAoU-taUS)8$5KS4cD^xA;soPPMaHejD6>K$Zd5CptcHmaZtUd-&XRlN1`^IPQo7GcvOJd??PSE)7K z5V&ydr==||=c43`J>tx~{pa((K9}S6(x`(eb4Bz*B8@qC_|KDY#E5hU~Ku-Y^>RMGHpT~rrvBK zBZrjWeF(mMbtcV#f)1X9>Lb(1Qb@$Eq%0U?VC_4qF-ElaOZTL`sgSt6aroZGZGeKn zI&#-NgEyU(IHKixU0|atrELI0M9NS^d%94~aKBp>CmC8wQO7`N;s_T+H(V}R`VgRW z$}x@So`EHxv+x&N2wcU8L1@j2oTycO%~Tl@FHFOZHE!!YM^z7Rk(`;aZgc$i>clOg zj2@A}wjlB_@84re-sh|>!(N|TdXTS$C`^`MU#qv0UZH4v2xFUy=At)X{D5NUR_qe@ zB+xGSVrp3v&W20W-9xkmwQ~eYZHW{&OS`4hK4nt`erZz3~@DyxK9_loDeA~gqljc98WMBkrx%7_)|gAU~z z_inx0!;_tRh^uHlPwRa2GfLoej~E*oV|cquJ32UVWmYQ|R{Lf!@>@y_3~G zZrz*fxuL7iWek~PX@zlXe8Q3$!v4mHe*xa358C=QwC_2w{%M`V@#|;ZZ-;#L|FQQj za8Xv<-}vVgKh9KxhtcBVfWSi^H{ow2Uz2h zU=0f-r~t`2W7zwXVXUgi2~dM=0!Fetbn~XtP=cQ4;fl;c*<*ZtERNk zrTt%`(Y?Vuxsv0tH+k*Hi?|QXXo{`Tw>*Y^_uS@vOb3T*vhZe;C?y`dZay|g&6=gw^v-h2lKJ}$qt^Xt^gmcbJO)K0JquBV(&5{Z6nHm$-tEE|1L5x6w#LR zx=RxhQF6Y$80);oy{`@C!VdDBc3>Yh`RWORq#O5qJ9fTj8Ik$vGy>vHzWk&I$5RAk zV>YCfv)Rg!ihjmomM=$lwUaX-abX5CP!qO;93m;A{UZ5Q-IPPZRvC!zLR zUW&==vO2@{Bml?q_S2|ma5xVg^0ldPAM?h*uET*)x+w=ybDkiD0Oe>chR?0Wq*Y4) z;g`@(?d+64e7T^Hb`P?G$vUgI-}G8tVFRLBd2_*|9eE`52~*aO@ByoXq6G-4Jn+EA zqPvdibna$+dp;L|r152Q}w_`;R6 zFDbDCZeiK9C^ImdAq3||WNEv1@+c@TG&ua2vX8h)gU>^3_P+b%L?LBJ$u~Sd#rO`5 z26<0v+=&-KrFFsI<$_cH^*M0XDGL1*obARqdDfE%kh8&Ckcvf|E2PD_%Ns2KS3iwx zDQ)A?VGjKqwm2i~B&Ecxk;wj{dwPvBtxoLBzzY2SN#t9>AMwO<%2PC&Sx-(tw4R(b z5|Q;LNd5af^(4GvxsR=?02r|L)I^tONy$%rY?Yh!TjW-e+T)ZH^LPD@@+Emz1#5FHZ4o@QF_~v**dcyQ)`xg!U_;D@$u%h!hFi~P@ zzI@0aoa*G%I_eu)e(X}C&e9KJCsRp&qo-&hp!TLLeyI*1p6HhhJVG~bK@1(Ewf!Ik z9!}1hJmumP-IH}9X?oPD?1OeR))jk6P#{23K(gA2Bg#|WhQG%N+!A6}X*jR^6$X>R z=9q2q!`OWMk2lEC_Y?uoflqC$?Z>y`2g^1=AY`l&S6|s)vgtd4JHhqg#)}f;hH3N0 z?giaRAC1j}oi>&5x9zDba;Hy-pc`>fts_}PTN4u1>G&tHCV zI%|Obr~X;~FS>llw0Zu;hsAEo{%`$BHej7y*}i7`{g02{nQ)}r=pzAr9@ZoA*~XI1 z#Lwa--7XlGv^ATY`>S4+M*aRam@zPuQeVkMaaxtpk^b@d(OJE_-GWm9PN80Q$`9xXS0=XD3kFgYb$ z5BW$NN7N42y$DrHiPpfX8s#tpOgc4m@XphJwQ5*q=_GoL*0T&DK$wbP6j-dcm_c$Y zWPbI|IcTsh{}k>wQkl2WYM#_IERT>kxBtxnYWU{b?&|fF%{7v~UNbPu??W_c*+pu0 zP>^mC;)1YlbQWLOD~wQOb8K|Vh-6Ne99RMc4*k%P!tQl7<)1s0Z1x#{ZquoSX@mGRq?1A zQD9%$?CvS=$johH;&{4?U+D{5kiN>&yMQD90?>cvk>X zYVuO-f&qsJeJqZ^E!xsm0Mf=Q+uAxYpA{onf1`hTlM_$3O_eQN#(Wa= z0trBzVQ-65*#1I;+q`9Tp6z*8&Wv~3IFGZQu^8X&v>;r`ST_-PEQ$Bvi6Kg=S?K>Tw zm9ZQfJX*)H8M%%;?m84Lt4?W8VdFH}$X{@;xMu{NX}5wyA#gV)B6x{6aS)+(%2nCD zO}K9~1ygHQX#^ojFLs~yL2o3*9NFrk8n9)?6U(KaZd@_z(_{zhDhKmru|mM3v74Zq zDP2B`=nRrIT79Rd%h+J(!=@pG@M75f0Jjp1+e=W>m@sr*$wUz2bVkWngJAzNSL4?u zBAO*$`!G7KsI>2#tWrhX0@OgGNF@0?`ugpXYSSm1wJm2wqPn_zZJHPxz_UKo5rI31 zvAGIRbB)nxZzK{uVbZE3{49HXek5J3kq|PGc7wb|{s3hbu!SLfzu~&W)BK8GQGNQk z!D0E(Wd0d`z;lYtWFe}`UyvA-O$#h5?&(K^3ad{@4yzh#Z2*IBo}6E2;K<(~GQ zcUQY<#cu=l1O-C_d=crv*{@u*elHVPl{~{Q%7ADjwf~0m!lkEYT`m2Hk4h zBu<@7Ee)=KCQXeZY26uL-@Ex~q8H(r(cbub<#hcS5|mQfmRJ~BNM?Gb_Vh;rBnfy-zMnctdO=W1d)`q|oLHC&kT`8;Nm~JcL420fRC!sY9qta-SdOS8yaS$nqXn`S(%A1kS>tjcdjBGJD6w{_F?NF)OVE!e*> z3K83cnH@`hn5)bYZ*|EoTy<=TgWg3uOBUw%X8h}iTr`D9aflVF$b=Ht`Dg>fYc+=f zG1M}Bn>|t^m?-2gmUMH_cMCN{IV6W4&9FBp?aQ)F(;g47KR!YO%#%vupq*=6s$L(= z%Tk>%gr_U_L`7QlG+Rm~8`c7Vg!Oe3eel3aXK?=jrLv_29jj3Ll5K-S4A-TGWyOh44dP2#3qgSF}PXNOV2i2Sq` z%fR|wXG_OQ^Y$$OW$M$;ow;#B_fF$2ZPnRf3$*8`hXnBwKZGyq$Ct_c?L>~j;4qUm z6~G^tjRL(BI6RHMiHm*=xc;_5It{&h zye5>k znJ+n#t_}vtg3@>7eiXYVikOU%WgXdw@x4kSPel@stmW3=fTPIfpd70kO_SEWbcs># zR6MQW)Af0AvGKjWZkfbo%jC@|>9-P}jEk!a<#-cjEVCE^i)%i&8>%Sbuv)HftcGrS z%lO{m2Ep0JTQL9}D2!pFZ^f27=N&pMaEo0pj27tE)iwx#v8gR^3^1eCDKrJw$^>!1=Eb{Oz0EqhUkRBb$cgepiCNPb9rrpFXg7*4d57 zo2-wTA6n8#%HihN#PNH3|Gf9k){^Jvp3dWlm%jPH6q^~GUQl;idqyO>eKxRJdNp>f zWoT{e?R`?y=_rwSa%z5B?SZ`XIx`yERwaxzr|$Co8t010@J7-VGSprw(m_J;Q3G*F zgqKdB3XXVoL5yRPAXL*Ai9>KeicFeF-n5Viu`a^sxJ*JuK6p&DBl{pvv}0$~#Y}2U zSoo=Aw0V|b;lY6e0z7p)7i)SPSs=8FDRj;N^NQ14)P=oVJ8;uiB^&f_k0ox3q8zv( zcY^YW3Lr%!nC9;V135i3%siJK1yf-Z@qK9f+(lWn8wrx|sr)ee@;+YGYBPz79brcVun=$Bd=nFBr zhVha9(v8|XW=b;bCZLwMDdD+lQMKfJ#uG_)|IF`gHElWaU|cpK*7CD4F)F4P(uY4H z^s|Qz zT@QWR2YQ5(JxE8K%d%||Wzo*?2_N`nkw=T5T2Z06duv~H+Sd*HjInDHx2~BLT`+5^ z3b^LHt3ZrzbgGDP%JBd*p^BGYTB{w8+{kHETN8*(z1Ld)NEeO2i@^!`e1b7DxlZNc z?}6TTgVB#LOR2TmSb`0H%IuS|Oo2BZUs0;gJPyg2Q&NN4e$;qRQ=J40iw2^8^>xesqD`Co{@TyEAmkMFPnO z9k{8wcDiI+BGKz|UF{I4!P!x@`;J{Iy%~9%$tsW`mQ$9|`lx^~m=E*kmt74QN(5R( zNm?GGKOJxcU&K`0!(#fT=qsW?t?o?i7cFPREemwD_07$ti9up*nnkRuKaj6W+;_m@ zb4IFLkOxcD!YN4OWPit6m>3Z}v^+y!+T?y8XmfaOE;$0BlQH;(?+3$l5N!w+h8t8a z8l$Aptk!$`tNcf#q9vtucb&W9$Z{@(}(Rhc$&RZa8WlGy~o5Bkp+n8^@{7r-5|-_8>{rx{-!C!8)vqa zmXRbQ$#q@J1lOHmocKO-sr!<1#De=ib*LodEQmA4z}j&Jpc!8#5VVx^Tn$V8E|xTW z`!KwQwP3X&-tttM$X8m|6sB!%MqmJ)VPR{DZ|m!keNkH1EVlT-dw+XZK8Pi<8thne z*+wrXWNF~&E*&9sEHveOsMEVl*IK;&EFz!m8kMZCfm!Z?C|K>?#$C{;2L5&Jk7cD8 zTq%F?rBRo9U(mRx@b)J9$vM@1>cer>X<2h8F?Nk!Cw7X!qO4 z6-a7cUlPqu_866qTmbcZUgQD&cf{m9v4H82i zC=34AGnO@88c=FqR(xsQ8WDf*LFHpZ{%U9QuS_6T0aBbZA8ku?mwNds)`CIC3i((EVk7M62VTTViM01V+lT!Nuf8TP?%uzLR zq$=!}h@^Tmf3J^rrZg5kSba3ck$9zX*@{k|8&$G2PmRQC!aGzr&(PEiNJGzTWd8&u z^QC#=%W4McO>$Xif;z?2cX*m~-t51$7fC-}LdFIy4TiP37pbr1Fh zt8z!#|#RFG#=*nm$%@_3lB$yr6)LNrPyZ^|b%KV&Mde-ah&g(M0wzN>@W z7!lh^B{=1zXhse3gsKsV`DxfL*X}wavJBhD5bKsflTw2MgU^chZA;xYyY^PvTGUa{ zp>Af5GR@$g!}m9(nDnS4fy5ti+Mz={;nQX%5NF<~ETKU()e|YmOWg*95eMl76J1YB z{&6ri5qsUT%PERA4w{~J<~e-7)HfGu1T&UsOv>f6QVhyH4$0oDFZO!;c%dKVwjlKY zBlO9nltKhOgIC<#b8~iODiUBV#6@po6R6mGYuzNU5Rwt&S(j0)6r_Y}@bKllb2S4+aI)O}o4{r7@>?!dWRK^I-e0U!YWwgeTfnDgrrI1k6Ov#Lb|2hL z5jG z#*4-gB32w@=>sX;z0CwxUdWTAk3XknnrPs90#TgWrvDhEy!Kb|-bSIYyDu>?WH^ zz&Xm%!I0fza2g$C0YiM)4j&Xo(j1-8%eI@gg#xUBx?gG~Dc9>zL-jHVx(eQUc?q7AV;8sUBd)lED zpW1K_X}T?(W)r6ZihM{N4x`N(@?WpN%tH zTYvIK9Cs;7t>7{TfS{#}7uds8LXvYCb(#|9Wh6cE$rnQijdbR1dE)ri6o-j|*OaJ* z046!@sI6gDI53XR^K6~Jwpp}_Slb*vb5PV8rt%sEiqtCIKV~j=1i4TFk%)pR!JV=z z2lj>H;R0|SuFNSwW^Pa2@Drz_SndOnmRqbJ9%S{as#8VTX~$^NWg8)vxe>5{nr%(D zxf?stgI?Yn&Xdp8+L-7aIZ*_+>qRyB0P%yA_*j(9^1*N$)_@pC^+WfgI{gT_cRLb( z&C{(h#V&5)E7)5sSnG^3*%3^B?;c^@f7*0tzP7Q_8auIBIdg1W-37PWevZO`ouYtK z_mf?iXncc7nvUY-S?dC4u8WS#)#)3XM58cN$H4DWTfpGIgH!!?=6)YrPI*$$6G;|U z1F6eZv>alp4X*%epd&iqi;61@luKe!CpyT9{03}%S=_XPG`}`@Q!xbsNqL-7uN}_- z5HK{HjR{dcA9C^jDGm(ld&>QuzNEho3ij$F!+^n0PU7OB(5;7^Q2!{ZYRjqU{zt%R z{dM>PLaPic?PGWTPiQ0B?WHIFtoETrxqxy2mHRMyH9f3#YrZyJaPk33nN`}4F%a2ediFP|S`2|csWr>?`%^pVHx4sW!yG;d=C z!#i3C_r6*dK^pymhwmWon~zZ&i6p-aKmhtv%Ib`suS7>)+q*R+c<(pQFX~5rj5qKv zA;$js$!}&#UHg!EI`Vbs{+$l}I5@U9Gadzk+26vCA=E8_Zhs>38@@jS=JxDIyCLs? zp?QT*1aPCHfy`Y#4Pf07o8Taz-5#QqsniyO17eTZ6a+;I%rt;p$ahMQ`Y8J#6{@}* zinBSWF}wi;N%ocya2w|%^|?()^a?=U`Z^dJKy8!JB;SCY{mjRJ zwr(@-3i+H{r>>rEjXOl?%dPDf1}c?u>Dm_u6q9qmApA9v*-?kf)AWfo>3PGqO= zpscHrw}jbk;B5!N%}>H#0GaX|(c;7V{7>Xj1Pohon(jbckZSVB%rOKvy9EKe1;FS4 zrWRbFeLoTFbO5p7s#P1CVTLD{W$bV;3GsQ`OJLTxv z07|uz#2twIUpwSqd7jO2`)Fx{?bt&GE)qW!r3(pXcmg6Tz(|=7pDMaWuK#8*{nW@u zbRmWKv(wMqea#s4FctsM&npyq1Y>^{j=K}^+hK{oq0?Kx8X2y7g<1`|KJxBvh1o|n zyo)X~`GueU2|eTZ10k$8=Z=1GBbjsYecpI5+3Oj~RP40ox3w&*EdOoiZ(XBBR?(l+ zInO@nPio264Qk4D!SUfH31DE4;vq9_c=4=54w;J|VMEB=WrxTCRXSqBiCF`CI@l-w z?kBUiCJ&tI@W-xUy#0I{ge>j|^50a< zy0)ZmD$cgKxG3;=k57$~D4842<|Tsy?7~qt<*^lS@@yCC;xdokHAnfv*;{77Gw~LW zO6&|m7|NO?VGR;?^pU!g8+!02jGBDpR4Le~JqJ>`j*8&?&(I{`d);Sq&$5>u)u3Ui4gq zGOU&*GC`1+!qFn~UTYI$z>efJGG3_gC4D~fA5U35*w!!>LS9^~B}SkciQt{l7J0Fy zFyw1joM4ipe>cyQpR6zqoZ)utQm*Ucz3*7_lTeHa$o(xWj+(ytB*QtDRkJW07RB|? ztn~Dt1cB4mFu)>;T%xvI^J%PF1hEHH-=S*a57|ldE@MS3RI<1Rfgq|hG;ptMWK)iy z#i(d8$}8TAHok7`SU7;iZ2X-}(f}9ow;U?c1|u>r^7cFG>lkjF;(ySVGp6m!ciFL_6uG{BazMOCLRmpoeop8$ZIHs4tv0p0dbmp-8~!B-Qv zTIq15wBP^*m5&2?x5vm3pNSN2e#jVSJZ%$W=Av%|JyQhkd+A)L=Hr5!wTwZAp@1WnwwAwcs-SLf52e5!h<%soL==_ zkXc{4B)Vr@?16ndc5HNSfC;&+T%i7HY~3v(io4T@J>Vcl)R_PW7G$icCZjlQxDj0! zX1wkBp*srrYD9`)k;rTH0u4U|Pz+&&OA3h`n>HK1thYJt$byUWl$jZWWM4(TrawNi z?7Nre{sc^>y{k0*EFfW4g@+L%wHxjn>Q<9=4UiI*C1}5)MIRrP7&rUJ>zt0~AaS7? zd2w+-4It&dgb2}D-gYE|>(e&DG_pc|_i$a~FN&5HVdE`Kw0na`tX`kF$c%yl!j}a# zF{Legk-i7josSBk<5ZJZG)3w~d>6gQOB2jEoU5Bp9I$QBlmkPu0QqBrc{2cDic_&3 z0g@fy?wfml`JvK^R(c(z`wHAV^fgF_Umy=!6Ox1p^#$(OYLp8+ZV6h>nE?fFOi}E* z75DDQmb*q-bY8Cpr>aAi3R=Dwl2L+QQ&^pMP{2&z&`wFwt28;<%+lcioaE6tMxSn4#}AAXWvFcf^qM< zyqO=_+idrlmr34j+{NkbR{H6$>*@%URC-*|2Sfe&;%DFAAv_=Wd|l{z1V`C4OUmfU zt;)Y{1LR`i{Q328vEYNtE0g9P7vJgABmTystz&!ND4%fwt6@1BEwb3QqP$ya!7l0S z^71*x7A1h-aGwO;wMsF4?EbRZHV_!3>$>*xdR%-*Y71?Do z1zuZuf(cnkI|FvkEzAx_e$z!4W!~^i!G-{-{j@T_l5QtvjZZGp|FK`ND$LQ~SeuOu0E;PEuXvzYC8=1QF(~Dq8q;pq-b>>Nc+BOdcx>=tMDnk{B) zdgWzl*0nJK7ZcS3FO0Qn|*`M34qt{?D;ZuUuNaZn*o4SMb#bE6^uEwu7k2afOrhi&McOUOSZ-5Uu2VKg^_?+8n=qcMi(cLbHBi6qb>yN?gOO4{ zBz+FBi2DJc&VpEEV!s{+HDMKdmrpi0D-_o9kuK?4UX^3i%`2>2s-Kot6#7R>atxFk85 zRVdsZYlsl5wb>C~_Dzl%LdQeyEL*qiW1%Ttqt2LVo*}Y}M0UZ^1*!qOk35kW^ii;Q zD@15nu~{J{1*1 zshAM;>!&g(9TWBR1|(sb@tbwX1EYC=8#14yJt1$Q{J`tLXd?IE76{Qc@rONtCEmB~ zErFmS!8o$H@!v3Ia*XnZxSVZhY}4Qt<8(?;@!Fw=xEMC^;_3MsluFkho@?|Pp`DJz zjA}I*nrrfcS3jfME~Q2_pbxVCDz5z_U_Ht7%P|44ZAf%i-?7$S zC|$0)I4?AJRYu8sx~MUK@s0gGwA3>>}1g)S(fT66sxt_AR2o$!4Il z3n-^jZxIDXS2l}hx1bVu)$QB2b@^Wf6UHY7iCbI2=`N^Q<(SrJ@LQd%5l49YI~M9t zvfE(^-~X@5Po$wb$0bf)f6d9U0b~loKTMML`JXbW%*g-6C@Fg^xzAjc;KKd{EO_M0 z8SIPS&Qv%WW(nq&E1eg+&07+_w7^zhfZCf1Zbm-Cn7Mb)+2!zq-~8FQ2>K~#rTY32 z31u0PV&g3NODpHpNALL|A@h1A$Npo9JE%hV_W6)&&r+h-X3x)U+keZ8NOV|${u?H= zph*4VKs3v72-)9q_p6snQRTeR5?Fh8cfA!yWel-5#TwIjD#wqToJ@~$XzxAz!aJnPOdeXtilP^zL9?D zN%Z~HVs-Y&xn{4eN9-f|UA3l>5^U^r*$)J%rkP(EDuGZQ0P*g94WQTcxeF!%oX+Mp zbUoMI`A6uqmuEH&$(w&wx)O>2AHo2{%HDfz=*%0}k1|uR6=j%yqDq_Iyj=H&PPbs+ zQw8cEfMJpMVSc0F1eE%1ZThyiC2O~q#{I3XbPQQ_7R8LWef{7l7d|cWN)R}?m<&MW z+lvAte5DaZ$;mm%TJIHNi9lE&*4iQlV^yq#c|mC>0%9L zTcYfL-cPaE>1|W;i}qqK&B``Ao|+}pP@>Bz<^FmO1s(ZJCQ@4<+S0RrSXWWOv^DF& z$Ofsslc$0hm>BOddBw?_km!&IJ3~HNdNC6fZq6*4vE;cP-;H6lZertIsn`>9&?yd` z%PAjSKKopY+eiRm)f?5ak!NAly&G5Ww4~u(nf!~2*F|SnAJC>UkV`7nCgtV8sPkzw zPj_-1Wie$NWiiOOF49K$Xf@B1R5z)R6h3A^@y+lLHH$n?Ud}y{vVgA(HqF?WJ6ZNN z^&)YfYf@FntCl8-SI?+q?FxqUk1F#*;TyXdwiIHtRW|P`EzON7zWC$ylg0gJXOxB( zV2j2QRkA9|E-s2K*}Oe}Ofy$##Xt9mq@;JvkMAh{6M6DRX=Vvl!mwR#*Me4$@jN&m zy_5njCi<|B7hvf;8U~x+QZ@ zARFCHI*V|@E)tYLDZ@!EUO2p?}=S@0+oy9%033MQY1%j=$1qHQ6 zb(VaaQBJRgF#)j6+on%juW$R^*88*mrmc`W_c_MV?!@-5Y+m&3w)!5nH*6PNmh{Pe z@U-mqyMDMA@u?sba9ar#&bKDmf}-{9>(;~d)6u2cQzm+jM??gy7$>&+LpzYP>wCbv zUHGusJj0#KhUrCuTK0TfrIqK~u_DKr(?^k?v-J$TIf?ocP|m`Af3}O!qXRm5H$i}9 zNn$H$t!~bCGee+h(<$prwMu=?d))r93+yYam&g!&j7H1$*+$ap;Y`TC6#PJ&Cz;&EoxH`pkMfR^w307>zU|sw zUFaQ|$mVi`h4NpRvaK+WO$>H1)BnX_Q*L}Gfcfw(Q-Zy@z@(gNUv{W1wp3EWmDGzs zamG9~SKLcUJ8bu?zEG0Gr0ATzN77gfxY*orHU-TKX@?Y>eqy7WTL&3 zHTwHsQUTRgh5Lw}k-82oE#cUPQ)Ate0{OP|(l3nzOuEt%8hwc7D_!xcu9&*SJRZAS8@4TG( zR6~159tT@~W0pcsNiF26s@~<=2xGn=ze0`^pIf&F=K&0!WnrbkJRljZfY>EH`J9b_+U`(EEv%??7DhamY)@5jihoCW7rEk2}Ih{Jvcb}%#$2>O*yOH7cFTk!ABd zR;ImygduZPPjwR9{1WJ2NmX3i1%27o>W1cn5vsWf^O#5jspE>tyIK;DD6VoK)Am}N2!XtydpvMebFke+WoA_s4GX@!u>LnPg5NPEjBvl z4siPC5*x}Mt~M%rpF&>%%!jKHPj{i1sU?v{MQ1PP7GvMqn$krDZLwD5-x_16EWL{n zwY+ne1P}5gbCF?=SlaQUS;hZ+kEOjo8hL<>Xt<1s8y>9I+zTEeEd(+7OE;k^9ajhw zsFUCM$6|`+e~JDT7T)_-()n;8c5xm34*H4iHk)|reFPkgV;UqH=M3FSAL;wG^=-B{MEmJ zd-+r(^;Psfy7IUDP}w}+XZks;)I1_6vK7!=_WtlkG{dcYqI4Mr*~Xl7fZ06oh#l+u zV03z2?G%=`MKxl7!(MJzeL}%++4);Vv#P1B znpQ_{_CIt;)73h(iJrTdTQczMauG~&^#6|g>io6sa5q01)oH!Tsfn!l4MoEK$kDEK zr5XF>%V_X-+C%=uI2amK8{Rt#k&Q-kXTof^H9KwBYLJ(%hv|1JA@ZTE3Q?gZ?MqwV zS2T&)-`d5T%$?D-YscT1`T_4s+by62jk%}a#E>oCB@sT67OxET(i+p`>_bfbx-XPWsi3{^!9|r zK`B;s>gUS*_TuBT>;H(WQ^mVe09lWnMP*L77LB-Rc68kr7VT;`<69ixSzDTV2?&ea zUL18#fft_IFt$Zj-jSVj2eWP(h^DmLtvWX+|GuK(el%(SE5DLuJKb9s-y$S+7jGvz zF10a&b<-C^lra)w)r}syJc#R%D8Tx_DduXM$e8J)$4?OWvh&JoTfbdO9u~=az?blK zxD)Ps7UDjgNS)3R+#+s9Ob{C*@$Ix>u;)7-w5VE#)~ONXU^HlGRT4E!`XG{RoqZ5- zb8$O~G<1DOwy>TDcj(adR!}%S??q?9)6~U8vA1kZV9{tit%{X(6IEHHx4}GVV(snp z^xN7xv8CM*NNnK##TE;JhJmbn8|dLeEdukj8N;0XynKQo@UOY{{LeOLzwWSFBcCib zv4)T9$}j|k-?)j&BFGQ`@NJX!dF~N-aq#Zu6-Ne8DQUWMD&Pta^JjP&nu+r<-|TB! zIOh!O(ttT^MfP*w!dI8eI(E5sZ$KjayRxwH6^iBtH`!~ImA@zs$Dt~hQ$y=?;0Y~e zRHpMY%F|Hp&~=*0A8$IO>ZZ>vT7t&$<{3j^?q{kT#c9Q73^TKpM_!PkoV&`L^x|Vf z0RAqk5iN=0dR(FXA9l#^FcXZ*_Oj}#DF0kpd1=LIkFhbmmFpCnk3>f^%oyauxymbW z?N0+*Wo_BTMEdj$Sq-f068?5vL%cS5(h$>gyvM@2y2B0XZ_d>=G&sZMy3zc`xrT31 zEWGvLdX9T02~;6UgT`N|1p3)TRk*r!19pHv;t6+uRj~LcqhD)7=j*wW_+D!~r(84y z*uN+7&}rtN|A1c!P`!QzyM)LSs>Lz~-ip#^>yyKE`qdu?vPKhTcspKJT}j^&NI*71 zG3M3p%e_3Xer##YwR+O4Ksh4jerGnC#i=g6lPHO&c|FDEoeDLzWAL^G-M@V=W2d{u zm_w-KyyI}o-9zQI155YHWQiMlt<9@6#s~@VP6vq(CYOPEHfdb28kJgAh@s^z8}akAA?J}7QH3E1&RgF*(oPDnxB{gi*^nxpx;(Cm@7RM&R8%{`jC za>g!4V{o6|e<`lx?QPZ6u>*6D?kcS-c>zf>v7+GV1+B`*Fvz0m&fCzQ5jj+hK~Ll6hFn&+sRe^(8_&ZnCpB4Ek4rQ z+RAeWFqJ^d)YsomzjanL*lB%vm2q=sq|o%MTR|LR{vq zrb2>lq9x%MG(t!7^avr}Z#qB1d-77Z{;PE)gTF#qX}@EDMCs<9zgQtD)@qKgUh#9F z#A!sbuj^9=zHaMtf!zlyvuB$7{3U549~h$Ngx;3xB+kEiuMU{1(Ps~EqA>4G z!;r7Xx?W6tb?l{;1-(I^k8+u}1eK(}iAy}!*i>X(IYE_R`C2TrX;%&j|CKy=s6M1`zW?tWZD+q|_p!A6-&&o+a2z(#~DM93` zL0c~oF1Y?mMq~jKgXW;zo<9R4o%j#z)Fx79kf*ktHRzL`o))-oL7h*X?`@s>y*sFa z++0<6Zojx-Y~>`Vui9a0O$%zl_|UQLIZj4D{0H3YbRmBn%GPRA94%g}JtKqyr$fL9 zjsoZ#)qR1XD<_`UBuWz01%uUk*Z!CCo;>Im>F}7Z`!;L@<5T{rKZt_annI^Qb+*FV z!O$k%m5yUeqk!3_9b@DtNOQrHg)oL=f2=CLqq4lZaON+d2z1y{&Ab4tkd?8~yGr3F zy#ZL&6jWNp;-I9T<)=c|5%?MSP=bKBu6}vJft$t{RkWLYccNaOQ&f4_<3K?{#XD!4 z-c@fDdI*F_gjhJ<*%-}iVMkMnLBR8h<_nd}Pk-da$PN;9mbn%Pm8oZ<;3m%A`_T?}>>lB^#S za+mHZ5x2x&yt-ad+I+4qzIWX>KSMU62J+}V%_Ix}r2GeCod9EEUx?J91iEy!Yv05^ zcK>04ySe3Dw0Ti;U2~;z>g=uhHM4i@H_uWWj&Zuv;3hwC%foya`T#OfFV*|#T_OxG zKK=p}fNpx|QuoQ(z)C8V2P3G+Iu?&cq0TPK5vt@~dYpjH2})g+^z!Fx=_ASaROBb~SygMIz*WxtS)03NW-nrh zP)d&gV3@$+E0GwIQ9>1pO4q$IHx#BtC*_dWv|kjM_qwlTkk*{$v%B6RC2(YV>Hd0c zy}4kQNQ&+SRZVkz0?DsFRDT%DUFBz#h*ka(6)^EsAubk+ON2!n;j={GHd&pjg(JuX z(g4MCg-U&8(hy16pzy`cvAlfyLYLt>%}ZjlL$)Gz=HhHK-%}QA>dmWj^OP5Kum?70 zqbxA`G6mFwxNWaGRcoD>ZD zNX3fh%L|5lj4xq9cu+CkR!d!%Z~}cAEa$$_>aUvL^S!&Z&Vp)k(zNp0KwY|8S|`=! z1qb<9%B#|RH?duQNU)dPS?^#cQ@GI!MLLAt2TvC|xoAvDg7BgozRS`KvBf*MNIPPg zN^WgtpQ13&fg0#LS2jN&K-6QZdh7XvFFc++D3pz{!_>GyVD9T^yq?`wp{jHUA*un`6M)p(vlc2jd?hsjc+8w8Fa4B%$dsI@A1eJqG@Dtu^QMCh8Ca zS`MJNG<}PK&Ve>SW`KZjden`5a)m5xpD|8wwyxn^^tpP$?uK`aG8r1M9ZuNavacMW z1?0z_I}n>P@)Xv<@t1`oR8Ee!AGq_jh(Oj&Lp2IT}(-IfwaQYrNh3jFV?CaT|4; z8N^7L@g6Z13Srz2-Guf+^i_EOMOE|Y#D~l$$$f@YbDRkZ(28{2#g&TzxNI)Ml1-FB&Nso zgqFtn-_HNe%wftePrEi0vo8XC9vgw{#f^!*GC&a4IhWiB(eDWUElbpA%!-N2N^HoR zeYOQztw!1Fr?=|MXWu>SVN{F>Gom*6%Z>kzgQWz(AIJo5R+aOUmbb{Y=9joa-FdX zfUd`a&xpm22U>7T#WfY}^G@FMsUC7|Smv(dv-RtuOJ7D+voG!Xy|NQgRy0qPryAu4 zP{b*3qtlWY!C|L{iudwz1cDqCBCgzOoPD?);9}=p|JhZ#uQYUIt^Fo|ap6odO7$=R zT=ZBAGS#Tt+LxX20@cS=leI-!tv?@pgf_+J)0LW6l6D|hV8VdQ`ePSd|FWU@Tf1rf zo%Pm=lCH1s*S5I=x=O_NZBGj&IC^#BbcO z!8`JLaJDDfI#CC&qh>zO)LTY!CYKqxg%7qq|Y1@uM@A zOicW{xYs3g*jP_tLOB0?_FHN#!?e2Fy2`-UEF$0feU@PnXkoTk&=93LCve|UAaMS- zqRDCB-D-3|h}rKZ3+ZR)rIN#VO-8b_%3ok_4C!WY$wpTsw8t>;e46p-3a(eH~s_e9`m6 zLn6=gWntt?9GVOG@u5$coVx;bMms@_ardCL{YpzVUuK5y4(tS>=YuH0k$tMNOuJS< z)IqU#oXZr0u{s@{RPF?26ORN_pTti4dXH{WIDqSXhUGU|hE^2>i<(iF-kkbg&5Ln{V}Bur*8f4=$fyedhrF1+iVuW%gzynqXpub5qMLf2e!rmx&yJQ`x%j z@}X^oQyhN-h7hxHHcDx`H|A6HaA?YHu?GGt6Hr(vmqmi zfOwo~#;PD=R&u+#gEFgBCgsHCnOpA?3zf}eVlUfN!AK=2J^TC~)H4S-@3@V#-JA6< zykg8nrmZ`Xo+dg0?c92>Mao9@Am>=STjg$zY1I2Xbab6`@zn_(dUdwDV5`ct-9IrC z9b)Sp4@-xatiu5p^1I}Lu!dCfA)@agKNEO=_+bLwD2=TzCqdg^kX(B+1n!U~R!K>> zL|zdi8OQ9vGaS|z^bWkP>>%SAL!>3qQLK&Yl3%f|AHdDO>eJRDDXkY`JY)+s*lrHD z&yK^^zxZRjXWKY9|FD*ofwYTj7nraWV&Oc&NT#s)bvbUeF*A1q_r*>S$?;DnBJ4k- zhV4{W@Ah7c4jgg67f9n%srxw`v{N$F28u;sO%$U=OKqsu6d&l$mu zxa#@|lLr2Z_{i=j+nZ(z0PUy4RoX#rwr*W$JJPzfuz3qN{ky$`k8|904yf3cqAm(B zC!2C&fh$rrx^WxZGdr>HJ^X9aob3W%0uQPcx~1{>7k7MuJH&O!Y$U%xd#}zbwn$Oe zVWR(%fhn2)S7cz}{;|CM5Pfr~SO`UjbwalBYZw1RoG7;#)w4ZM(fZwq!nZa@D`X!z z$!j^)X(m&aU@}}-bh*fSIytbd5Kb<@2C)7;@x?zZ5dX{zK-9ei8;lTG?cxJg+5a2= zgrSuOM=-btSuoE110*>9S$g7;k%f%%O$UG;u-b_C6VbooeVTth#5gnS|921ECXp$r znH3TFO=zy)c=B3!uvq2QTMq;u{fZA`0lEFXWkrAg_uM%-VBGls_CJGfe`#@*cp1QV z|M&jM`vmZF~Tjzxi zJRUiL0BSlw03VnkwCfBi(mm*mUBDcQ9-bSN)3z(<`WZ7Chu9NuQ@X^AzN6X3R=#|r z`}k>8eEwDhHg;yGfmy6A2B7R^UgW$ZXuU?{JIDd3c}?gMIR`e+(;#tlwcs_QqC%FS zH22?o%Vg=25R?A0()zd;@Zo z(K{6zH-@Tjj{}#lZ#?Sv%xlJxOY|R2bQ#UE9D4ddgS#K9#Z7%cJ51fMT2>oA^>6BD zv;02dD$^61o&&#gMd25jS^4^&y~;;VRub3|IRR}@dMC2Sy<7BC-pBr6;Lu&D+t1zE z$vJR2nOTW{AIh|u(xPIe^=Bo_eomQU?FE3e0YRRS(gw%{RGr&g#tQYHXgu|j;R)K| zI3>#g#urBoiiK;5kt6ahS9X76?Uq%V?$)dbRPrBL5k)->SRMb8rZ-nV`L#tHVn*MA zXBiIP!3h*f&95X3J~^H5OCDiN!T-<5^Azt6(YgJ+kJvO!AMd0L1_Pf+SA(0V*8(fv z59jN4>Wcv9Q2}L1+4>@&-r&g_Qx-o{A)AvUsQob5M*F{vx-*Qzmh_#sVA ziXee^&oqKZiQl8jvB7gh@&vC=zL2rmlP`I|Sw|M7(@nIG(17 zi?TQH#hw#|c5l#3vsM*d_+r|7G1_@z?&I3AUcmj;(DnB^L4NhuySg|f=P~<*ZIbWz zzw{DR_*jol^G?J{y+Y|Nr`qBGl#$WNODcA znFxkQQnI~M;rEsAD>bAE-n`Oj7MeP}ZfT)zFDQBY=jNc7hN9T0YLCkR`|$5wll{DV8 zkMU`JChJqu>J}z0GGc9hx~luGtig5*X2Dn;`T7?YpEszHP^$K9RV-^I zanemRSb{Uom=M0|bL9!Kftd?86@nGPL0VbpA(+SXV9RTujCF$@E+K<4rD5sMLGrV0;s7JU?`e8F{%zO0NJ%dK=B8qpxht|%? z#Z^I~KmuL3{ZIB#Pa=~S`-)D-y%b=Tb(RL>vYo){6ddVY-idEEska{&kps)p>B4w< z57lvntWK5Y*+mNl?eEn?X8z|DD0NdOD%>-_-BaSK87$rwLczs=!>*a#LxxI3uXwe; zYUu9P`D|TX^yJ>jMWv`4?Za@~{8(qOuR@8Ar4(4F2C-Dyil|NhGUn`q-6?Ei;(M>g_VX*vO`mPIN%u1f9|GKa1{)p-%N^0w3>q8tRP zv3(m2%?iD6!^lnAU=z`4;6W=(v|pNd3#{6Cz8H&IYhKyr{~hi%#sQE4i+`83MZv*w z#{|n?A!7nQa|GX6_A**sQ%uzeVlmpG<~TZb3K`|JDF4qEQUN1jS=mDVXEHs80<@~i=#tAtI=;o==s;xvF_Xc}6ZF|Xc0qcPqCzJ%2 zBhoqppIv-sG=f@n@HYTN2skRPMI#0qi$`%p+B7ijJEs_`J)*!+qDghsU?>g18?@8| zLbF$1UjP(Ui!sjWZi5gF%()|`m+9HU4sdTrQ^Xy^RuUa~lrC8tKOUw>=09R14fo1!~8(FouDaOQS$<+b| zCajz7Stvkr#86GFCjf}CVs1%4Y5JvA=YG6S1Ot8GI3iMkhPg)xJ%0mc;Ux@~E`_pP z?MOyv6B#@d3%?;B1F}J4tFbCy!z8{N*3h%A4kUPO<2Nn)@J3X9ZA^p5IVzpscAy!b z{so^8ffz9hfCfjMRgHun=J=hjOaJ_FdXvh}B+Yp`!#xMJSsRViNlh=9?IMag9vdSW z^;xzb)!@vQpL7r4A3YH{MpE*A>JQWHU1--(n0>^Bw_;uYpFEe15h`sejIHi7K+gR9 zy_FZftg(WL-aa0g^#ed;ExRsJ)__~qxzNnqBMJ1eV#STb7w_%@ygKXLJG1)$JO-aq z}N>kOB^ysN$j<&Wg##z;3Qi;R~zGSLZIvyMtJKqq}}8!pR{vt<=t+s z4HCWRT(FIV)$OMG=Bns~0*I@oklKW>u>6+07IEWhV6-k*-O`e&RHTcj>7RcaFf+eH zE;{WY*c=+ZLf{CDvc~8FSh`^Bp~C`jkVWF{FG$XDn=FkG+j|GYhwzjt^YL(9wjnv( zY&T2gr+B~k+Zn4?=$`g{qVTaOp(=k>mSp%(y2W;{^8~wiJ!XtF1Y{Tc8U+g$f9ALP zW9bYBKbwI@)>GKq=7J~?=~NyoPJDStMSQQ!v#5ix1?fyHj>2_B3oPr}=6IshnR&;1 zm-tvq+*Z9=f)Dp?JvEI=z@CZel{J)Th-)Rnv2=G#7T3AX4y{%j|?B(dI z+S);rEIzmMELDq|gG5aS(i3h#sO#!m-m9zEw!C##H1u*+o!H@3BRVrpQ|O;~Dnyy% z2&^g~YQ{iqgts4%=qOYSUel%tQRFv9;Aqen<#e-{^e)*3BT_nYv>N}|RZHZrI4bmI z-`}zuGra7E!EQmMB-G?*c(z93nk8}22t5nzd4kwNO-XHbgsjm;<#&9{fQ-Md<_%aL zUKSX{gY0^UqMVo0Pf&FE>x(gMJVEey;yDQeP!w$F+i8DlaBXzvW$ zIhU4c;AyK_8&ua+C*J*Qo`7oToXV#k(cmTB6WLO9fd2*7!a?^zqmW&d%!G)t=fd&z0II@cX;* zCE>lzQAZ~{kqx0IllPgKZAKO8?DBBkv7LtCq#!)VpL+S*#{uz zxZF!XKwe3O+)AWHTDooBB>HX zZi>5~yP>Dc2l_96QOoy2kCR68(Zo2U8q<yVl|rN^c2o;;~5H`D-AbfkC2o(3@UUUx7aPVBX2EC*gYh7Y02i6rdydM+lDr; z+yzC*hOIb_g?01Niuy5K%!wW}E_QO+5B<{>2PB7ym9fO=r>zX(Y$4 zBnIFFW8$mBR(<^a0I+4N?5f{o+F$i@!oIp;uh%xA?{1n%a;C{5x%ImFZe@98^SPEe z!?ev7ku#W0aB9~h?R28@F2k$HqQ z9+GL9e>4CD8PC{xG7Mn%WP(N}<{HV=W+4@%z- zz&en}J4(K!o-{+gqGINOJZ|%gOp|x5?agYciHUZ)Qks?(vUX6gGjtZiPqpes$Fwmk>Oc-h_ z3KaukNU#bjAj%Si{Lgc5!f^EMdVg>G{eN$3xVgE>ea3mtbH?YKqheoV)>JL(QFq2) zRC_sZY>s0~gu@ujASY&Ba0ft8K?j@R&1V#_P~9Y`t&?s*YlKQW5==^m=raq<0OX1| zeH%G*4`1P1C~!k`Rgj-EOLpSgw#^WZc6Y;6-JN z-L~OW+VG-&s;dU#VB*JQH;VMex|2Ww*<;@siy0g@gu^Zgf* zcyMoj2P{s&Z|3AkAsz#Y4=EkK?shnX7(U36v&!!v=x0Oq6TEe`0Pa79>Ogd(@QohL zvPIdZxIbqPtC~bbo8kqnhU?U;V%PLg@TwDslsGC@ zWJ{31Q|{OFAneul<)t~3h15u0=w0NUUgN)dE(Y&p;6GOm)?RQ8F#h-=< z_7@pb%O2h-zq~s{R_gr5uGkE`Jv{N+IDO$}YaMz&2@#Z|bWSAJO>3lm&V?jysaLaC z)4fUcZ3z!6!xsW^EDP9o5`#T$Nof*#%Y_Y*j1q2*TpH|XoFRg+(bM*2B!#6Gpgqqi z%jq~2kUHsC$TZ%u+Kb>(Hv=$~3rqy++Q}*?6%u%|ry}$afaaqjzLiG=L1aW@DClya zp>j`d>}@vfX@QCwP%cH7d<)M7fO+HQ*|x){nTS~o;7%CzjxCbeAz+SgY&%pck28A6 z8K;Pq2ti)3-3oAds0{{DBd+NXCS_u$OS!HDs`}bLSzLT)nJ`T@ww8HXYV_visi8j= zW$B&$2(r$Df}Z<6B6S0 z@h7_=DiraojH<7Z?sMEB@m?bL6g&RR8oX5rB_q~dNb*5WOf+nSKRy0f@y5oBjVBI- zNnwv51`~EYB;-#eO3Sbhm5X4@?4v7YXjv!TQPUY;71}A;kRw^jRw)-qPBh+9kd*aF zPJ7eM>N4Q^&YkgiP8_3@U{*pUgpffY6|u}_%#0@#IwqO}QKZ6XLjzl?EnP5~u@m?G z(Un01cAo|srbwqYRstb4sM5MY-ssoTWV{?IYuN1_0v5G`cf=**I&UXrlfEny&scGr zciqKaZ;wP6Lo;{(83GX9{FOlnGq4{d9c01y77A(12TAEhYk7V(@i%hHJ;MOd|ISxO z1w*AMD7SO3EF2^RuY0A5%TP9Z5U(`VZ!Bi>Y&sRGR8Dnu7`|ykTAk}rGvZU{BIlO zQ6x2ar^%Pf#_NuK<^%j_T!@^*vVzbfibXozFdfVWaV(n1SHY)6OYmq6Pd5N;W&s@^pR9E*9jd}jucgAO=nzb zoYT>pc>KE9^?1%I(1~%CGM1u@t7b4-GHnabWil+U6TFFsZ!s7qx8;vn?_#{Rz<92{ zyDMfmdL$IEC>W;i9}=@q289Q``BoF$AXMLPEh&=g3y)UPSI}$}p>Ee>@+Q{CEY^)Q zmnZ9s3ivt{#`3MyN@~|=rtWo@ArqEQ-F2)sBiwM)o{atD?i@+9;hqhtT%s|}>%$E1 z5)lQrU|n4(9=G^I2*vJ5gxV&>r!SUHUC{~yaP#Nt$hm}4bGZ04u^{0FVyyuc?VftL zaZ*v&hcI>zW<$i&sZSxEKiYHZozsM+rj!VO(y}DOK2x=FmE)qe3C&E4|;sHDMhLPezXd(}1`(Bko z@r!f`&M&BRbA|Y&{hv%F;Ac$Z?Kzten=~3B81{d|2FrUUFj%xN5m8Byg5ZAf`+-1M zYk;=mPc)GniRZKiqV<4$oSy9K4#D<7&BFNXcX{b8@`#rY38*Rt2mr1_X3Y0fF;+^wTBrSvvFeoXG5%pk!#B^h6Mz31IPnb7;fr*8@>@`U#c%iWtL8Lnf{}IuVE#G zuL8*?Frz17Qb8nW*C-jlShV{PIo&rv3mxAB6Rr-E2kzaOG=%@o9G-wv$?X7N)N2p3JSZ}<9N3# zg9(@63jEWWdx2WC#~?=(_+-c?4fe`t+Dx{puQlY`SDA`6T}yfCm(Xu~)Az8!KX3mo zX%Zqjq?s?`4^bZ&y=a_Epc|mMjDr`piopQCRl25AgB@bzC=#pgx4sZ$hQ=Q4rUTv( zS3GuUsS$o|pamXP1%7UHh_?^l)2?EmIAkRz52AP~qQSw3Nc%bbMKXmeVcMG>uifEM zU0+QD2%{`%k=HtqwDi?KIYi_NY8kqPxQ(1#a1m0_8S(Du$U$uN_{S)^XnWlZFju45xq9m*9eT0Z{uHvUeLvjl2PLw#zjhZ# zDU$pjJnv(HHom%Pu-hSOA_z!BSD$L00-jhH2GqPW!~|(q)Jq$y8TS{Ro}L(T$3EX~ z?eoZI!Pu4nS|7D!*?_hnYTB>0Sifvy;o1wHP?)a%Oi|j9FwOH}q9OAk{3_IaCY-Sl zC-oK4H0T?mSL;DbeBk85`3qjsQDqoZYFW6c&&`6C#r(Zn``3i~Dbj8KqM!0+o5rSv zY@mzgn+)kw>J842zKdW{j)1TUYehuKf-;Ri2TWRH1HISw+m;qxB;9`C-Y0eD9F5z_ za+yXEebF1cs*CV-A&&Az8pAxe5Iem{9Vqj)Se;|QNLnU{npEMN}bc=hix*|idb4k`giH(3o}40 ztrrkv&t2$+CGlHF;Fb3gYf6kfEy##s{QFUf|Cw(EkgmrY2cPTn3vZjAkf@;F854By zci(>!mL=smR{Oi(N@mG+PSai4h;Y#lZGGIs!jl`MYGjNp-2<8h*p(R&vmlnZ$>VFPl{TnUIP0SbR2MDu1gs{PlqdAblV?2^65!hTr#2SD#+cL#H3^T2mj~Gn};LGYzfC0k% z_;_q@VmM|J$m-*EmF@*7ssI7Rq_F^gj|lWeST+DM14bKQLWs2sM~~0O+e^|AI^l~N zz`&#U0Z^WgR!m+1mbCx>bz@t)>-a5Cwu{eL>!ut+Ln7XZO1wA z#c=>~fnwD`E+py?lDQ#>SkpcQp>Nv8<<009?Lp>7S_%AvrwmY4ko>6;G>Ls<3yJg5 zXaE|~9DM>3+R-2gPZ+G1yzovl=>Q%?zpN2z;bfpn1dpEw&m184Y9&&1&7C*+n|<%d zn}EiD!$RpJQP1sI-*e^xL`S2WN=^O6BC-9>hykwUXC=%N38?{g?L=*F@{eYYWST+CV(ftIFPj*iG)1*>J%q5}U z5mGlw)Bum`!^aKos)k_thL9i@JIE3B!o)v+LCazKCxD>6d3_`SiU~OxME}S_g#Dt6 zHt{SfCfQE`$i7AnKp_bULr>+(!2#W`L5tAZLBXXnzjJszw$AF>cjZa0OuU#;zsVD9 z*CY6#eE{)&4UUmRXrjUGMA%{K(ZlZ-k0I@oh&)ZNA;M^wB)W6x1WK@jDib?_HFMyE z5Z~&1IU0dt_9O zKM^+`GQYvuE<14Wn}UD)BAE?{z_q2;5cV>_GJ&0_e;}VbBNkOP_^I)_C}bB?)h(z7 z-*h#*n&AZIA{>&)F!4BG{IrL(v;rA;5`*&7<=(zmZu=|ZtZ_yXxK}Y0{|ByTdXmx? zf5J=nSAkf;s6E6yrks)|#*)8G`B6^Erq%2Xm=jH9+YIPm$ZZH{8^5AJPY3oj4e+Ax=h4QGb z_QuLCC|F-gIFU*_YKX~zEpt%fp8@Q(o`?#IJTKs4-BDfLQIS3MafhiOkpK6e-MPff z*y*9~>pz_nDwG0btyX%;iWck;&8IP*-qKn8I&br2n^=E6of+J;@?WT%AJTk_Mywd3 zD?@vD!bn6^`wD-qTvN;}S>AI(iku>CNj_lG1Ybr%M8IBF&rh*1E|vF=~5Zh z7LsSOedSGni74e6zLqAK)O{!vDmm+k!*xHk88OvHfNk4WwL5mJ5Jis?%il|x;S;uJ zTVqFH)e{`0@J{)%Er3}B7W=e{Bmnb`4GV*G%1-f18-)RA2bg&_1Ykt>y^Q3Mrh>!~ zV(|SVIf!BZZFl3`9HnO|o-M6YF)ub(TRPpWsA20d>(dI5l$3X!p`r)T?M7|dJXv?OUebrd zc8RDtzKV%_JsxdSnoJ;RRK7EW5?9ImLD;h?cz@8OPV6g|@+nt3R zHi1&nRFnv{E#v9Jur=Xr=irWggn#SX@DIchClb4y@9jn-11aBtna03 zT^#@qm2ubWIw0Y?B=GG>$6TnH-Y#>%;%ES<(9etK(*+(h#dgI-MYhyJD(A#Irc-QP zEyN6Cm&vJY-`g^~*M)bYb=CuPGh|0?427;gT_PVR8{;Y)K20y}lFrigoXL+q!t3Ku zj4R0#9%Mayyr!rfieRsa{O(~pIQan(aT=Wb0LyuJch6yN+1+kC<2Wyr#|>-*2*7Gu zoT_q4tO?i)ewIY;&+m|1L{-nTWj#Gv-Gy1nCJhZx6g#-8#US0-r{|eRWz#&EV)Fxhz)W&uAUo#~neKwUGWeLo6>!t_Wf%z6R7gY06OV};qVtJZ zrkCWI_)(rIjiD-+)0M(KpDUxIeK+aI0GIm+{bS~!$P2PZy$9^SE(U~0Nl7tU2S5KfaH_$EvkfH_V%SUDoAJgI z>L#Y5xw9j?Ccf%alZv^K-OF5G=A=@(De!g$U#4IC1zo?uQv8r*Qt53=ot$qYOH=Gp z#EQpb!t@bbDB=!K$Tazq@c=~#sI$m3jGq+ZpAGCfIj!BOHDb+Wobky02LVf&XV91u zk|qvxSaa3ke0%wwNYk&?8;h-!UX82-hYP?%gow~`%Fnk) zfLq7;9`mZ*vGN}wVg8e%u2aAk*r+$DtZ-t#Y24Vc);^-q-g8Q$W6ef;FIYjnO`WmA zh^*iXe7ksDA%W6ym=0z_$>!^)YtoD}4uNk|z)q9f@XPY0GHf_I1y{gd>MsE(QQ!lI+!|nP#pAAxM>*-nCny`&z)XGZqHA!82Lcn@Z#3yYVc^0%30Kg+d_;^yb^gW-?$O zO2@<&a&y;*vp(n3mg9;v8NU79jTT#}kW)D{KV4rDE%sEfC43eQK0eOdv)U+wxho@} zlQ}(Lp2VppziY<3xSgdN6az3@NAJhDhv}9Vp#ywH>fbA12YrT`OM{M3b7(qYGKQh=;v>9 zpTKctw-|Hv@DmDHZbZDUR3^Yobv8}{=B-<<`=gD}aK)&AJ!9CsqLEnYksWxR&YYwJ zoV8p}g8n=e%s2$EJt`oQq&eS{7LNm(ay(p6x&Xk}4qc#ZBODi^PTyB|m>F$Zo*)xHRbR-tl_U zyiuPD>+!e=4N@6p=bdCJW-BvqzvhAv>N0BLq+`Z(!JS8kj!5hbkbe{@2>^Y~aX6g< z(*pV1tsUYaE$_EV_TEb9*1S?)#+5`+m>+ipRh@KPdJpN|s8ekL2Cx;~B;3oX)nque z{jz21Ohsp$ld>kQv?}@8qK>G@>YJxQV&@vlMU90bQBDwps}H8rxI%-1e6bZHANMU# zLWmF5%N{crHuhfzWA$lSkh)QZ1iH;mx_K^!o6cj6;%nI~1@COgW4fI#mFc$9MzMl+ zVY7p-+r&qVAf?WF&2F@gdn^2WR|JxW)WMK~_gUB6qPBp25kPREsAp@ShkHSS$eIeQ z{NAJo4v=&e$qnZppMZIRRg?f(%XhUBI+pReT)D^LmY&mDUGgxqiu3M;rj^{2=RXsf zWHyPL=QKg2yh3cQq@^>{L#b};Z2p+Y7|ZB5wj!-iPlAiR0oQ;ZQP|Vi(FVpQ+vn5Y zq1qHr(pg%}e`q4p=ceVyaO1i9E>cP+q}ZGqs&Jhk_6rH3JYpd01j)PW)s2k{VM!=w zt1`lyiI!$;zcx1GOEmt;Ihl*S0zf2!&FNYI)L4kPHW1!$G<@EU)wXxr{I-rAK?ePE zLJ!xNJX<1d>B$Ely)v>Q2Ud+RKUpaP*r#E;m|q~pJwCFv88e&^sf{!oGf6c zmEd`?4{b5(<=60ZNU$#OL19<&qeJ72ZkQgh0eDBiyR0Hk_-sB=sK4sPda7G zT9a0O9=rVoYsP9X4||=6G4}m(UHrm3t!qyF)Sw70jjRNzZNasGTZypnyM(ObuSIr; zXO#n#r3zhXgBJuv0C9a0C>((mYpxzau6R;j@Tf2pt*h|Nipr%|%a_(*jrreTVI4}( z7Ga@5soedfXtbVgw42L`7^wS!uK=V;MbDN*i}?UZTa16W#PL+ne8&z4Mw@m^0m5j1v9Jl4dnU zE=_>c#$^DN>q3~G2D{>v1~fm3Xu9Tt3KT?0u;0Bx5ke97lAOkDiKmd&TNh`a6W7YH z26T=xJFbz^7=;wOx;O~Pu(HFjVaNudf?U4nF8r`H~XNey@C{DJYjLs9*rZ^9&X`xcFfupdH`wFmQl&LMpoltiWs@ zTHdIgB?J_y4M`8=rKx?b@4E+1IF%^D3J!1~6ft6r=YYnGOW>WQy(?hTHC}PJ1BWC( zT2vnYAqug+e6>46W;E@Rsr;G@D;+oqYs>ybmb9gF|?0)`QLtHVL~jb z{X`lA$XK#(z^(;m34k9F#t?`cBQioxNSOs<(4a$Od^~y?e7hi+Kpw_fsDdaQ|7QsO zd)RZ2?+0bWJu~f#8biokLYRB^DONRUCJu3ag8l#Rd-+18G2#-d?k|1G4J}w0sQ0jX z!_=fdU03xF*L5Y!vi=2M-w@O-{XKO>|1&oSD{PAMAl`-rb_8VL`sbc(mtOvX_16|q zRs4;9PxjWr@KwLx)A`r?_D*z4mA{r(?azF6;XgyM%PTWL>n>qPtkm`U$PiHrA+n-FgqJ+ZrNntvgYC#mAIFn`4H)_v+*JkpD4%%Rk6(&Dz!e zJRv#@=C68-Wn*q*4kr!{)^5Q;YyE@Pt}$oX!nKdB=Y@y(TYtn0@VEZhe@*bZ)yw_Y zz+E4$4qiUjf31)8M;s69dH(CyTF(^1J+9;*H}cQSCDz^_@>lsUUkl#|6b9IsvnHb7 zbb0l&Mq9*^?(OadPTw-xRnE?K6iT@(2{H^gg`=lCxV_Vc%%?H?4dcBT0gwv&^lU+WXc-&y@u?L^kxG#i__l$o`w^=jX`^Zq=W zbCW-@`5)J}N4Po89bq$R>H-(%Np@A!^TsZ-*!lMVxE^@>mzN9j9hpi!h=L2&~TNtzjfqu|W;xkR3Crz2mwzGB( zT)XBY|J826!jRw~G^}v5W+Yxh3j2~*P4O3r-L75v;@r>%S*du&v{hd!4%n4$J=8hA zG`De?w8|ur(tho_&Vu=^xq7$Sl}|T>R#|ypRNm@dt$te4SaG?uJ91-mQ=2-gAu{yq zsE%8$IX9yYl_-`hI7+w2)GC+r*2}(Kw8dq=I_|sA%g+GamZ%GvUruy>cF@VYxUTG! zc~090`;tR))oq8o8;+~v)yuqcpIvZ1Q@^t@O8uauYqrgPOSgaBX;431{%mr7lv;hR z=R~erE!`*TJhzW`TCMJAdlY@uwd6y!x_xxbrGH(XzA8%Hlir+%na6aw^RB+Ttgtui z^UJxN=3l-U^>HPS=JDh8qN7uGnH#=4Y0hZ;=ZPVUJEy4&J9;UM`YHQ1{ZGS4LrSMj zZOm8gk75JNJ89e>F0tNJtDAGvlB0XEN7G`WtG~9hEqQxpW`c{I?axOR9GYFHR(H;z zefq_i%`TZ=JMXmpIB59sK-QjBm1BSTm-^|3Jx0yBzRA(cO2aKa-OMZ>xvy-$QaSV7 z8FlN2Gt`ai)0Q__&1^m7qds};)J65N+z0XMmPfbRM22UA%X)wh%!J-Pb3S&4{lhov z-uHrYRlAoZEmJRA7QJX@REx5w%Q!;adQ1Jd)_IJr`utBD)U!(NCmhQyeLC&ao-@~- zKj@4MRkwX|?up-?4YwYs)oJQXywNY=@>h5pr$yHNqHdDrp zUK$(Uy1!7p`PqH58|m%v@Fk-aV}|NlOmGcWotm_0SzRZvoSC=OS?W1MGZuTeOglOA z`=w@GYVr3QZvY$Z36$|NBUU+IT1q?f#T#nf^b%oIZ;e{2Tt!#5o_e5O9NIn}?phGK zXIvu; z?vGMeU(8iM5ZJ^x7~&lz9KVzdyWyExjbTeH-}!dG%##u~Id`V6iMl$cqM|YE3}$#N zQ#!1|r}4OSFHGUS`#ER6aoNg?xxgw>&R}iUI}#lzc$O1zXU~z{JlWXkm76x}CfZVL zqA50sHk+yDvbU*YqD7kRe1@xM>xdGa5s#)PS(tqPgZgRk^wD}|YBM!VXXfjqWr;8^ z{j*Yt@8v#atD}eQJ>|ZR!)`?|*Jhi(qJEZn6`#OD?N#5w!seehn z$3f{C|H3?yfAn{0yaN;4qF_<}mP62${=4D5e~HqY?8YBtbN$nAK2m*DyD)Uge*f}+ z_Dk5CdRJZ7{TVg?CExunpZ?#O=G65Am6AVy9#6qOduJy2H~#Sk-uvF&fAQE93cTkl z_r*LQQDgsT+xN6o6=d%DD~~wm7|O*F$IAO0UH@1irEJCNzt#s3$I9O#{BETeIMe^} zs|w1LzpMBw=?2`N|7$4cM%$OCg8uYIJLm`4N`q0-Uy`RGce7>eoVLU{>5v}a(I&%7 zYZII@rU(n^{7cfx%y*z_`kZv_b%}4_idB$KNXxG>wzJs1`ixGmJpnfadJ}%~5g7|5 zZz)$_KNPSF^8A>&9|KqJ19l1@VzA?Dhgionup*6CAqHn@ek{^xH2MbUC3;4p*ZzTgKI22@m*xt-Mfn#2WmGW!%4Fix_{aB?~h-h&+DJn?4fQ2LSn_B`CG9 zUmB2*oclNFqMSug4gIU@;uYIXgDL52=VOo?l)H5M8u_1pwPLaeCTF zM0Xy_SV3GS1e4I`3N>qnoXP)H-bswCFzqyyib6}lZC26uFCm$Skab?WF8WfsXd43Y zp&SS|8ps<=P>wG2JK9*f?!Jx_y?^=33uA(^jSN8iX-9)MaG?4SfAh6h^^Xlm0j`NI zjJw1n&NS^wRZX0{@Ss%n@5%AS@p->LDpR|*1`Ln3!Rz{m1g5^Pk$qj5fnqvSgMos7 zjct3pK-^?Ap})a&o%tHSv{YB2oqhY4_h8&o2N)S6^V@c(!LNhHkP6#4^4YW%0s2AHN-S3_Q`gZCWq3mD`l}(PFsl0>I-Du zDPp7$nQzG9HjUR%V=Dxkp}@_>cQui}1h5_Ds)8KOfZIc@cQEEO6r3Q3hUDLAM!?RN(u>41}z$q`gr2# z`7Y2>%|d+&u@b0F5Gp~8FADe|K1ImgG8A=*;ztXaMd%BV=nkb7hVUdZ{RE82sf;Vl zDAj9Q07fK@)rR?!b3l+Tc3L|RCGm9%JdTayI~+J+g>!-dz%Od)h^%g*7trUc7@Y*l z74>U!c9;H9hWUYmI#gF4zFlURK6xa^?cK#R$khs|l?Cp^Y#li++a1!7IrN&#fpck` z?NlY}rwn1PUJ~TX5hqXcJPdoYaeqF4$lObG>uOb ziN{BF)Oq&YSJ^f8WM{8L1t8!MVa6cP)2XMucsN9ruq<>e@vnUI4{yoR%YkJ?^;Z4Z zh=)#~ZMIJ~P|UBUJ{HS#ylXd)duWqqTHzTp^eo@EoUNOmuD3@@Nu{>RSu^wY+le(= zYspzXn7kyILC8;xTDf}|Ocl}GZ-_7kh)sa`g!l@S=YN9g8ne7DtTJ&b8%-|ES=+rE zt%n|mpsaQfh=Rtgk3;l#o#{ic<>vI!b1`g32 z-A+|G9_F?~^7RL^?{tJBs_sdIFiCA^ATW)4qv71tfC-S0eOCFiUlLOvTVSnU76BY+ zCi;ce5mOH@)JWL^&f>|{%uYPVGrLY&8pM_~KajLn$#St~G_yi^SmTKbxqH^hDvrl! zykdPU1g^j$m7#?6G6=hq(iE}V%&>p)l>#^MVx|6%xAW6vm`QrU2wjHp#6!sfH-ia2 zuz-~Sg!N1iN?nY$rMdh1y)|`~F*|@6M1knGd*f&jw2~*|i4|;a;qOs`>ha{&E-YcyL4Vq@jYHB{^)6)U-{6u+}iwxUw zU)ur6JV@&b18O&0cs0syC$1iMzj*v^(_p7>J?zn1hjmi}Vm=$s4GY`IT;GY;ox8VR z_)SINiPP=fUf1y+XPDFL@uJ{!b&a`^*&Ttgr|UMV(4tNkutV~t7SYTjGT>To@+}l; zjr*xs5qr5_9S-SamDrnpiHvCmv|ZPQ=_X=J37>9dvd!%*J7xG*|00fg_H@bZoyUFjug6iN(pxBbOBcHiFx8cka6GU%Qxck#gHVeChlVm$G{o(Dch7 zTRXn%MyJhfNa}BXI}f4&FUxc(am7dOF?D7{Cq}Q=N@pM`l?a|4t`WfG_ax01!C-yY zmNX}9W9d1|MzarEi8>JD4h9`MNhG`k4p;<)^le*Cjzj$Xr@tftyMPsxSsL1OZ&VJX zHb&#sCnI8pq3s8&lFd2_)zaCKAJs|L<8=`#XLTnY3$-uEKO44y6rr4*;x}hYOZKOsBwxCwG0XBu;Jt zfsqDEL`6IZjTCIMDVP4_TYF&G2Qh(CB`;0j#YP#g#Y*!{^iVyS4KIcQ@pVVIpDT4f zkrGDy9pb$^Cr1)NwImBkx$1z}MSFFPzx*+gQaI%Sk>WdJPtwAo$IdyKO-(3-2KWy2 zANIrjREYa*0G=8F42DQR@X28>Sb4{u>`9uBXbaNt68nNe?Hymo?*ueL>{sz|le0GV z1P3+2PQaEduTXd9F9`~r zkH9-U-Ixo}L<0Bp<<#`+TS=v6dOR;_5=Bih-(>o_UV?&`R$L$(HaDYT_vc|NZeRW( z;LB}dx;^!3;f+?A-x0_+pHw{ChAUO-r77PKOwbAiuunJGpUSvOY$S6pFMeF=kWmxa zfS6`exY@@+X!GdphQ$Q+S5T6s!w~#m^o!>SV8qoobJFhJXgz(HTS`VMLuz!yb;^R* z;9Z)68U1opgr^!a$?wT*KNWbQD%nI3WgM9!Z7FC^YKZ{%+J|M;O*ICUQHAt5r!Yga zMmecGL|e(0OCa;x=w`cYk4sg8~3_;^KI)wIO}PCEZ-sn*^2Cdq5y*crr?f} zI*FH7CS#4hDuc*BsZrcoA#?^`kv7DNR?LZMIKW^;3_R}AxR<1@VVC%b1 z6$|-R%%VM0| zJzcK<&?&}l!?(gBV=$?%HqW@m?&;D-DB=KxR$K{%ZHQx@amWG2 z{Snmr2~G!iY2`(C@(ec_fs$+{(>trTRVTuChqrvOiw@;R+NL4zzpfJjQPfc5wyIK} z(Tlu2e%KtjE3<*MaYa`^0|eS9wtjgzv#FR_uI^d`ymoKqAxG%klY^l|R&VZ22+f65 z)rh|m8P4IB{XbW(Mim@p0loT64TT7CF&XOF2Am1X9uW(!k8lh_t8%eVa~l^`XGO@l zHKFMpC&Mta%4Hx>WI@{8n#N>@W!{hTBHN# zkekQEVJJS7^X@hiihyG$q1sYy_<6)18K1U3-HQ%VNtLup{6Q^{L9~s6@yLZmTYV@= z5jZhODa@pNA1#!coDHFWS3naa>dL706wH)2#9pkint-Y}8K(Fb$YTy+xraL-1P^+f z5&p0P^*`!j@y1}MuX7wSlF%wDnGIP0c4!4th^GX)=~W2sG(80}`S3%OBE9PxvjL2B z57>M3AaoIN;MOS6)dv)yXSb`Ial8|6<<2i%T8hW! z@%kmyJpuOuNI?{_#nwo2V^Oz5KW+tJYDXyq&WqkTv*HPo$Yy4e>0IU^F{ZvN z%pv1)2GT5M8Fec1AoB~51WH_;`q=sI69@_>>!!eJB5i~qy?}!Q1QoC(oXW|60J)JM3o*%|& z%&5;7Tfmz9$TJNp?Ob_lYh7)GpwHnj!@iXA0fsi z`7|G1k`)$44jDlk4`$n`!|y~cNq9z3O4rJ2RNey$J#BS}2R_|T8X%m#i}Jv*8=X~7 zWxc8??bdNkP2JfjqfO(v&_;Dc?s_~nHy6)}#mX4W58_Wz?e#&r$d*Eu5-4f1tHnU> zs$Zge2SU_=q&r=&aY3V;e>qmFkz*S4QdR=I@{bMZ62*R3&}P!|#gUqWp?aP2}s8y)9wbGf2(E39TqhH<63z z@};FqEhpz^-js6!MXfA``3|;=#6a$50GbR4Bj#wBAR`Z3Oy!jDbmc*ETMRO^yW=ED zP;STWs}&b>SzfO_bif`OW!U_b5QBX(ee*+aztQHm1{Lom)kQ?tO>nt&HLwWBfZ<_JLBoU1Wd_pmfE?b@(gO4!Npiq%f+B;ER`|eg zYtjN#9KtT(i=9AeXb}2s5!oPjF)u)F@y2QECE1dSxX!E#HF1uxMwFn>^;+}UP4MPo zZ}0Vs;2%YnR-T+=^AN^>OHn~MG&NO!OSIG|JS_x-48FzI<#>*+B727|q$QU@(PLa7 zSH7j(Hhi|vgpfO1sYb1qGQG>+^DAf6)2Yw$Oz+ey^>)t7Pb-3QK{@6h#e`9-J$ACj ztQ|INn6b|b)(kH%BZ9tLBYEV&oPZSd=*&S0$p?UILQ0umPQrl9%xF7L@&+$R#e(+G z8_!sf5{MX2l!##5Q@H2@E2QZj5FELhG#d(AWy!i82l2>pcCMD*c$Rl}EbErg{==qb z6|>O}#v~JjRpxp;6B#qu$XWx8BN@oS6-r@zgm;&W5sX zxP~nBj@F9vOsg;F=xufyIZH-y3WpRJ*h7Z_La2tK(e#qjg_3x{DdK*|1)7s@hz<2J zdP~e`ks28~P*)+ipE!X!T5xg$h71W_DGffPt$?_ldK`K)VqXQ;0Vf*k{HPehUItTyl4O%f{E)?Q9vDQyG)#P` zF_mkbSWuGk-yZ~vCbU6>&mvVjct~p~l-?ar0Rn*xk%J`!r`&kGKqKd85SAvSsx4oCVfh-7)&)Z!k z+Kq@%e8Feam}NP%EZj(MyruaPq%Fcge}w!sGhH>FkG{wJ-y{BSpnf|=Eesrjw8;ih z>i{pc`Sv&_;-kNXtNe%WLq^xJTaeRJ@mqP&;QK)AP#S_Dt}*9q9{&P!|8MoODKbFo z$L!x0e&d-5zzPU|tqY+&Edt5)?=V}47&I<`x>tuSRQxJhWg}aO>E-?YBklGdJ|23{ zS41;+#7$%u)%`>NY$b(2O8nP$pZuZY<2eMli1pjDHT<@_02(4y2FE!PfB$WKI@Raj z-qLr2z!r>8UyhvqCzBUIX*#mvAsB)G+!>Neug;4EgY7Gh%NKqPlvMecbfq(XTTJ+zU+SujVR{`0Q5>fPZ?D;2tD+kwWmV$c;#r(h7Iaoh{S&OJ04)b6{_cM!p_yWQg76aa+pA(Mir^la+8Gn3p8e}eW@r7IwZ0d`Ixbr@ID zKy!j`#K$@KAOIA*7Q2p|LH^z|Gcsbv-(97QQ-TZ62e8J(LnQAV1(!xFUKbw>upUZX z43ha5&L6(w@ih!N@TGOJ=?Gj*uqJe89J{>}99MB{&RWf_g5J4K$3Fw$ut6pCL6LTv zKq=o@=xGp+Hb>)#&p^iI8Z)M$DVuO=C@VB%3wgUpY6;XySVi2wxB=Ob0j5-#g@AUV zOUxsHwL5wxZBIY|WdVXDAprFM{rKN#Sj=I9j{WpYA_Hc}pz_z|5>5Q<>PUmg`GC}x zBIO1ql2D)a10(n>64rCA4j|EoP^uSRLJ;&U0FVLIHKI_8t3b^coq*;ZZ3Z=IlTPr2 zS_Jq;RLq(%K9oSjgY$lw8IW103s{$?Z?@YPfX{hsjvo?Jc|f*Fn4bsh8ZJ}o8V^$qY(fGvi;w2jv_!ZEYB%o)h$uA2v!iWP8;jQvEr{)vA=^41fg>L+JI{_;Fq zUZavUi1J^Fd2X*q8$J8~>4Ah0Kn4CU{qKZE;(Nzo?_ZsgYCe>?2lJ#;<6r&5Dt7Cy zDju(9?Ghvr?i7$jthMC7O6z!q67ef~${+nkTfi>TH6VJmuJx;*tmM*{`yWdOnU)Ys zAWVpbTv`A9o<(C& zny8s=XG`8#fPgKZZ5Rr&R_6>B2qkU%R@ZlpkD0&V7ZA9t7?#6W1y^VC-hN9Nq9OWm zSJ_iQ_QDDak0gN35)+N=VG9*2&qBFMWYEt&HU2TkGRRqDuoaDP+LkTCY|@$PGC~Wy zCXuXPFfYsrLg{MJ7d3xV?jvjaKyr+acd-NcZKy61$IedB+z#;xfD^}Vnsix~VdSK_ z?$S=4#|Lj+c?N+=0MHqDEHW0x?%RC{)Tvs{*6F!xtww)FEjo&s%<+bzP)92@fdkrD z0b-a2{t{=Dlm4=>I0NKAX*sKc-B*f(nLQ&1z3 zNAQJ1;uf2Jw#3^NqFPx*+^hMvv$~qcpcau21Q`0!=i)iEA3YD^2Y=6fsFg~TuO+&x zojY(7BKjIUbDFUS=t%!zX1dt`36|yx(3#8J`zC+T8t(Uo4Z1wQXfhxK>M0tn9gu;eMv~ru=k?ou$mTuQ zGBT!SK+A9RefK6PJkX9p%{UQ%<($vZ077La?ZItnskb0*dC3r>xB+6iG*JWSIRo6D zWVx%s&DT!LrRSr#D_T-h*#oI{0^D>xQ5Xpv*D7-H1DIW9 z2j`uTdK+jj9i!Spc_(xT)3Mua~{FG9DAUJ6`irMop_z#VG^YSI}Px)r|^>6b1uoQ6M)wi$$znO1e^zXtT*s0hm$oC983GbR2im4e1(3 zfXm)!IQs@Fy}4&tRT`%dQtE1G9x6>}z3MmGq=>9iQict;{R50o$vsk zVa#UR8?Y5IwNeY*eYHNApOkOBv*Hup5bGnHw^=vXxZ% zhtsB@sHDMC95WhY;Mtq6j`dl?8=T-ySh#vOYlB$|83?K)~ zI+S5Ri1bRI$o8s2wXtSZeYSyO6C=_;Y8uT~;3D4ENh1*+m_@S_xJP5Ya$}pHPUOiK zyQd@L-SDFvN)u*EIdnL7%gC7WJ2FRH;QyuR>(h>opaQyejqvI4h&X#rt&HPs?`Ld0BA@rPimF)dC-MTt;{Q+5jzp;X85ZVk)?El8-T0##-* zuZ1Rj4TUkzw{OV!5>+mNpK&yfN5Gw_Xn}5Uz&}2liwruV?(ATwRaO#b9adE%0m6=N zzo2R=D}y<9QrTa~IhU)x+ibBy=iV+00C< z!c{6&9v&-Ye}#+XZu&0!S}=)$1^$aa@I_yViC7jy6VO83%NLKfdTr;stjdHmm|?%S zbSW%KJ6+e<24M3#pE)PVbg-E6*RM^N>BW2^-o$cy62YJKrD%VE=UJWMbWP5L^4GZ~ zF3QMiLjK6uISF5^ux+5s!}j9NT!$O?(G){@aU(dJSpXo=}zHU zf0ofBARk_WfW|vC=k6Nc^3xeg#*Z=?>;^w!&Bf|94LN$> zLg$ZNn^%#z2VgwKW7jmG(fX;ppN$|s$GzDR78bC3Lk|fH4k``E3S-B2Cvx7?h?B8X zE-HZ-nnP7e&(jyJJJb+E0HG4aJ4w)$7@(jhsx(PBL*)m=$V-UR_TQeYT#p_nEXQs>ES`3!}Bydc$r=Mz*E z!Z@8)K;tD=-cd~SQbt7kDr}Uxd3o7P_q|t(!BhwqIj*D-$arY^ff~e5|=2`?T%5UmBALMiJH0(h(f7VCBZ1X0zO$ z{LIFn-lo##9IPO{(&JWC!G)R@%%D=(k{bb%bBvF{&l5L^*-&my4=;UlIqwTA*qgm^ z96(wOs!eS=|2@6*<$M<7daOi<^Kh}PfjJ>$25Tli~t^f6OG)40tgc_CvMdangosT;{GTv4zaNuc<>=nb}FU& zuqT0zg1rZV)gmXuLP=Fw%pyhZ!m87!Ld6F|4}KaNsU-K2-YmF=GaHN>%D|H!MR|O7zmGCXgAMNlK2{@C6%5C3s;9@eWJ5;TM z(o?eK`YsR|A)~UOVimSUQOCF38#7_NP?BMx)XUgoC8Hh^8~yMTq?}K+@sMnO|8-rO zi}wn+-v$Cypj6PCW9)V5zA~y^aOT1_KlsK|v8{b-P0?uQ#3xrBwP7>NU6&DOaE$6j zYe9{+kcH2_4H*6%S{ofsyY1jc9|(!?iga!61}FeX4JWQmK#)fWUEB)`3qZ1`Gm7q? zLE%a&#dQ_CG3R@g^+l`F_>Qn3`&@`P;jEJcA> z4Pd=*2$5)yjT(B>FwHKh8SOJp84=yEIkYA25s*8~)Q9&F{{UJ6WHWF|2ura`+7FDf zbm}_+;{f&R3={?XO5o*OW zXDL<9)#_gR-W1Sm5Wi5^LL?0YT&+p95HtD4K2#P}P776r=Ec$M44}jzeV9y_A)|iF z6LSSL0msdaZ;^i%X`5L>X^~CxR>e4%OB9({CKTuG`YD=E_uULJ5_(dlE-xoUKwm-U zZKYsUc|&ZP`gRXP0>H0{T+AqH-ynd1qe29AMp1kvR_~x-Qy_p@^coq^z973bSU^e+ z&LpQebD;)pBf_3a2f)8J3?a? zb!5po9#FMNSP><{8al!t1}Do5Aitk&cpIY{TJfmD)*I5_2*&3v(#+ymu=yq4-#($|;oBecx%BZYv7=TL7hW4#t`4_6vF)TF zO7Q940E$dyuvwv@!G&{KRh8UekS8y;5M*Flk<+B^XlXI1Ts*n6^CD>XZ{XQwfX6Cb zj{_563)2)L{YwHGpW9yfu|5F_q4`#Wq}O-oaWO z2(Y3?Z)Hb2>*__1zw-K&BUN%HO@Pg(xh%Y6ly+UlvYm8b?`sf8<-3XIr4=~$p8tiA zhmQT!9wbHVVQzTaMu4;4>Fz)@0EPV!BQVW6b&lW_WLPg;v5U;QXJ7faSOfh^RXKn6 z3n6k5A8#6{Uv(}RWC$GZncVH^oXN5RZ1)*F zzLVG|eDe-Z&rgR4G8ry4-!UDcJpu4emV3= zs!g)|*f#tc-l%{1O3JAAIeO7SGJ)r8Myd_>^9mg(hsPeU4Zs!$D1Oa+FClRKP8nCO zjl0GK!18zqqa(IH*c3o^fd027RXw>pX#RcW=mrFrzT=Qlq=sbztkGq`J>w{QOZCc2n+ylnv?FX*}#_C{zpB6945GGe&Q}jY1)&dML!#-lU$| zN~MWgvJ7Z=w%9_##QAdDZR5derQDW+L0LU0b?M$8n`rxnhz) z>A1tiFy772hyT$-`ZQPC3Zo&L5^28Mi!va&s`OKE0)>!lC@w zv&S8kkDc}wqp(UC0iUKr_g9|;Og|eeB}<6u2i9C&BIUu#E~l(8 z2kAk;%M+#qC)Jd?^|4<`*4lecz8>2h%5ZGDSrKt=BSXcgab++gvn8vXFIvN};F%1F z*{!R)?h3r0Pdj0r%Hh~j+-Oogiuh_YjtjU3G+zbpgza!AhJ^&f2!+#LOlhYvWh>cs zY3`3FD{KLPRStD8ZQPea5zu!9**ro@l)x&7!l^`E%LYg|Vdh1|_CW9`%s1-ZJ*>@h zr({jh{qKmF{rf;D_ij*#U;v#n=;`w>edc8+#^mdgOclE>4*Cf-^U zoqmiPIVXAXnn~YU_3i3!aJBILc_fLN5%K1zS!9K@`gR1-UpH%jB?wGj>$o>TR~ScL zH2IiNiePpJg87jd?j~VZC3;9&t|1x)QVv{XcS8G`&^$rj35hEL^=E>v*re?a8rkT( zEuKoxd4vffZJlI$G`3f*Z59&|mw`O`4-s%u410;ilXz6$AoV}D-@-~ZiM)k; z{49*H!fM8uqOpqJM+Qzr@bF%naVK_spG!pB)L;9%QY2+9`hWtCnm*&!>>H3&iJUtq z5d+~8$@(Z!O!Ze=m=?z(O-S}Z%o2JT1Wh|QC7>%lUoa7wnQNu9 z{(<7W#8YzUOClnKoRv{A&;4!V-lzehjr-<#?+rf4eUmYP6R4p|9O2Yry#B~vSNGth z=pti#>*z2_f_LHK0e7n6#Jmakl#s!pX`9NGiYM6f&O)alrfZCD?wskohvf^FMwKXyAABWbmz`XMoTG6Mu?1 z-Y0YZmv^SPug*LGq{QHM{`PkwDX11G4hHt#zC`9yU4&!m%K?6sow8h;72V*65=0k$ z;At35?Vuc0j7GMGzJ%>4Dngst-sklXppgKN{8PEwArhj{3>jSjZe_XYIN+ub-}50r z2q3U&!O!k#lToVV|G#zZ>;`*CID5HNU@Es(lgIEpU*uvBbW7}Lc0@%@y0B--BEYz1re}r((^J^L@M*Rsu zIq#7SkMo|v95koT{Sc#nj>qL;{Yo`-6%;Maceyv-?PoEZz!%qeACU@?A~rzhw*b|i z%#%yB5+#KvSn(o96zB8Y(N|DloAj$L<_yi!2XNK)OMOGpC#Oz>$W>HPV8AhGQ2Oi! zXwEc4L@1lYIjFfs$s?AdXp8|r0H=NHi$QcnI~l}d35*xQvJJXAphcSNWYa;3{E9Gb z5Xv_azKKJw!2W*{Hkt5+pNYF-c-1re3##(zAxKcou1}ITU z0GZwt9F3+ZbsaHX;A)&y1Zgi3Sr1NXiX;Vij*qAX!@7+_)sRjp@)^eiT!9=BF-XP{ zRCl?+L+&FGc=N65fGG*~^N|m1nt(;cj*pG;qQqcyE~OzNf-LLDHj-UG+;|6}h<0Ghm-cE7fiq79bR3c;`@7PW#b zVgOkb2t-?+ur|wTSNAoWzL*AGtV<&&HGx(dragu z5z>H*Cz>m*RPu&o*jckI#0eax$RTdr4sC)J=9IOUlf{< zYcW3fPAY`Nw#0uhJ|5emkop3dzZnxPf)G#pBNX1)yCjlZaoyPGUz$H8I7D2q$=mV1u0*w?l)-|Fg>yTEe zwKkubTs}kxkt1nXijvYFQd(eeokO-COA#(^epZN@9qqEc^u{unf};?*!}+g9Wqre( zG&OZ-)Mf8M=g=$Hbsv3PX%rZq zqoyBsFxUxGvD86RVVV*WY^O`2vztT+p~Djn_2EGoC4h`~YWRKNBy z`SY6~m)tTCdg#>y_&gy0AmRWa1E+)1Gbjv$YjLWgrJAo$W(H1N+#K_9B(%2HQPE6k z?gsGTkEgEytkTJ!ICdQ?R3z2((Im4Kx+XgV#~Ro%p`ak-36t{|Xb&TJxa+uCAd;?q zP3l^a#|Ptiit(aSf(>_?)n!)&LB1N$6BCV-ipFY5XprYP+3fPPg%#qZ>!)2AslkyV zqsOdJt4ry$XIx2Fbv644WF&2@P8EjSRCGqw$IMbhqWn**yQ^SY5Fh}lnqA94zx?bX zh`=^hOZNQSj_WsyK8Twy@gmP`;2bD(E;*wf>b+G z9%yb&r0$d32Mv+)?d4($&D>gdG-zLa*Y~YAQkYtv-(UVYIRcO(_9gWS6uEE*B%PI~ zHGC#+3|^j0gK!P~ewW|#`<}m5wC%cks{NDbwbYg+;lhcXd?Bs&DgS1u7C*_|7dDH!!c3GQ z8^KznI)O7jAnFo)nPN+AA%#H-9IE5?8H&w#ZU2V3mCSNq;)@_d zGbA|{%N2pZnuUnGm*|{@6nqxHx(<6UQ~SicA+Ak(A(gD_XUXr|c*;GwI4zqlA8kCv z@A(rIq^OQ<#?Fblg2ZnWN=`47UZ#r0ZAm9v;Xz!dG#H*-3zu}{>Nry-g0Kw8EYx?X>Dz5W)*gJJ+ z)7hOxgAl7@y=aC@)|Pwsu$j-k%-D{_N1ak@(Gz9Ns?KOhes%*4KR`<$0EyNk{7JmYV0tR|*0r`e!%Uc6Rn&N&K;{mdfwRKtpYqS@>D2=u#SmSnT$c zpDc$Yc?SC5N;G|}IDs>`rgE;i>&JuTt|WyE5f%Fdx}`kYP$bz>w!-umsWs0yc)cV{SE>=Bz204{ z9nVADCg(r$~JPqP^J}wB#;yYcfhm` z6B}j*j({!*KY!{b-yk3rof8id%RRGvSvK0Pkc<<68^mbP8LnpL<952nIROM7H~&tY z+d;US#*ly@U(2|-zCOn6@TZcowxCEVWZw5!ldxz+{T^&w7bG;Cf)T8Q`3I0!`&j+@7@L|j zFEvl@0WHc7gN%X1LefVFZXxyXC~}C}m_<4fy@qnK>DC~3gvXIZ^f_S9a}(z7hf{@r z;jduwBWnaagji$X2K-p-^deAhSf+r?f zm(U5?1Q!D~FT`Z`ibGw)V|Q48u(O`(G&bN2gGW)(5fgqF&CM9Cln>E@fBTR8 zL3B7(tD?f#Uo1?BeG5`s@J*&f7(|>_hL;RT7rlJ^hZ7vu_LVproi4u$ZN?Mc!I+?C z;wEn24^hyG6wcA=m~K*f*fiwB!TSEfO}|UStLMdr;@^q7i;p`DeqU45ZP5@RBLX!H zwgc4#59?%oW19#)!_TLHHNZyAl!*KaDt`rXS-{KilG$C{qf`I+tDPRn6N}9)<@pM$VIqUsD{1~Bc8~fJjaF7)~C;5*9LRrUvY`I@~`QH-_2_M%pExkZ$+IO#(?`}EPO`pix-!-^cBCI^?uf^p z#kFn6(=TTqKS%u`J8#?Z`L|ClIT*UKi*51U?6WHZ^MAP6`qejUudLRI(U-O@i7}D3 z>8#e7>M}a-Qv$!MOG{RrQ=mbzDp*lFh&S<0d~ByO|9RxIl$M(0XtKCR=K1{p|WyC0{&(5itg{HNc)o0&fP^8VqM<>~uQu~z;xN36A@z1_G=IX`7$ zg7MX3PZO#ScdyP@Dm#0W8IM|;4tixD%)GOPKi&BEJ9g*&|CkJ35Ei^_`O*bUHo6xc zxOgzl*2KyL?l?JFx`&4?Ul6u@nF(z?JU7E~W>mxi%W2Gz1(q`wEDK+;G-$yxc-OS0 z;X&UlSnh8*jqYhVbHU2xmQ&d99yk1tJN{?NTua}t0~ap{S`MEGWrtXq&}is8UEqSR zTnay9Vv9Xv>9rs@l<5|}(%%Z+Fy3LjiM_4OTo;$V_Br6~Gl4Ji3}r1}u+-9%#azCC zz91+(c!A~A1z{n}7nzK=cX3hmYh~(~`lW+wY-rzztgOD#no_e=yJm3x7c;F++Rn22 zkK4yX-JQP~YBkQm$93X3yQ)bApU*el^znb(c7A;K)xohtZGyo;KkgpR3Sat71T$!X zC4B)mG-v^1DKpCQn-zh}(J*0SU^#g~Xvm`FCga9iIj9@!?mlJaOi$)YReP~9RSgY% z59$L92OAA6{J;u!*fJ9vTYGEE8R3!3@bCG`#KIZ|%_lS%`iZ@!?z4@9owcP~=<;RL z7A$oSXGesGp<#tLt488A;;?=H;_(YOJon2Nww@f+AT8%jp0IeAe5YOcx;; zl}hn;&eN0Ina4ov+aJeYbi4MoQrR)Q`rIeyCoPUu_GGpc5KR)gJeU_p%`fha{Qi9Y zQ+S)u2$FD zSg}9kO?<9*e_F3j%yFgirl)w&`>y=2bW)!FeCfuHr@fy%xN&WTvPt=?8|x-8 z!gj3d&9BKYwYy~xO+9AMq9w5zPrs55d-8q$otxfUmMA-vJz~YQ+tml>&+n>hYV=Vm zyE2;09tk&J_gSJmW^%5px4Nr4?@{_si!5ig-(v;<4y&Y$x=O27j z`B2>RNLf80mjC7ERk2ECwQ@;bY*}nW?~WTegMH7o<>zfL?z)|}_fZ4W>{GAR1u;FL zdee^gwzn&l{>%i^J7*Yqo2j20?#kVEFn`JEhEV6_dBdR`!HTZQRxQ2lw{P5Ba&{&E z_V(=simzg_#n-Z74y%0FmNVmrNC$n#J}BPA)*!oTUaNSxmeAMrvo{U%S`XC45`6?azO1thE71FIK(| zB|1q)b?pBCyR$X=Z9t-b?K4HP|NemeN8d1avjOja&)@GJIUeEZVCO&c{JD1z2mWvI z#aWMjHy`Lbd9kSu<&FEBFII5n1>V~!!nf3)|BR1iJ+L#Y|GD(x&wulkpEez#)c)p+ zBWebC)|At?$|$?Eekwa2Xt!~0=9Xn&5Do1_M|)?4%s6v2ZMHQ;%Bs$31Z`PyGR%y9Ks0Jy=GIFc_fsL5CVeqeq^0)o;)iZ2BP{3R@BsL$a zLwmZJZWDg43xsg5U8M)!N8Rf~@qyY#i92(A41zL1N*@|o`=5G8zXbB0F|KZ!Q3kWh z7gYalZInO%VjWbV8)qL8@pqG!elO|r#+6mIf8OBw{dbz`0U{ID&8|-&V!7p=xLg09 z2R0zj+KO34vY5AU?7sFRr-^yBaum9K2baCrVq?m#Y5WJr$5|RqU!rYl>ng6V+~zww z_6v^>qvrXTU0$pX-DC0lfAkIT{(fq3dH~$wgK5))AhXF~4xCPZ|9VcJ^R0{lY2&wg5{5GZdd08 zGg895&d*vK^5lnUvkyjK3BA6(jo}eWAQx=h_9%~ybkAF0i!}lokeO-JET1GOz;?h( zYo>!m<9F5AbUMpz#jZeE_}(*kN*WlOV|K-b~7b zF_-w=Y<$z68Mom{F7Taxwg})q1XP%fuisr=Ya*EgA2DF_iY4N{FQwWd*p04;9y8+p ztT_OUr~4OmO9JKRPi@l@ZupJjqEPK#Ch2D~24w-3%$G6&urV9A>tX`{NMbB-J%f&Wf3*4ybXG)U9D#Kv%sN-YeSdbF;hL-RMzC*@{)TSKVl$bGi%!NBCfOp9t z5`S<@-ZaB>a>?kSoF7*B)yL?YnK*sIL;H}q{jh7JPQ4$QLJoWT4k zs=T8(^yUQ@1@;ui0vY%Lcy>5I=dg;Au%OdVxw&j!_Hzb}8u%wv!|fM@v}2%~zPZ&ef9I8;&v6Ny6^tE5cgKK5r)g@i0XiI9dTI=YSOCX4RSr3DkJzu6hOA zHquSJ&{@aagJ-&tR8W{HgXNg`9*?Xo!wBa4Y9_$8_u_F3~;apGhQtP1J2QECs9VURm};1=pCvXa6zEcb-+-N`J))A0$84R(EhyM`iE&^PbI%w^x;YNKxN@i= zP1CQ}nQB#GX(bS`ddb>XwT%>Z2JykVESZ~`R^Cij+$7p-RPpid7VokpRm%IxNPNrF zzPt|tZOl04RGr2+`owv8$FWqD!x}PfdiUbFrgA{`UCRkiT()dBM&j@D(#C7l+!XD7 z1NbqLOk!76D{*nls`E7gUm)aDU{u2Pmw-q69`mz`Y{*za=09De_BDBBln3R(}Rw8`bESI=B_jK2N z-Sn{lCVR1?;B4;G9xdQX)v;*KP(@v!X>J8<0g8E`>;No;_gVh&L>{Hqbib~QOYluV ztg2BwQYZJqosG9itZ@+wDP-pgZL5-%!8N(zY@Weq_dqpR8Z&;SXzUC=Bjv7-;Z+WO zWs(^;!=V#I=tKLmrD02_!m92L0Wyc~GC*$Mj%7VT8R(LJvTisWdgwm9%?wc9OvqA* z?RT)h?SQF=M1|MMWe0iyi#~^GO$UG*>x(MwnRFl9i@qZATsyR&@{#z|QXr};X zS$o=SY~HUsw8gN2a^xLj6c3|7!^HkYYqhmF^!e(}xxM0tRqc_5&AmOvlAF4F4LF6F zv2c(uHmdZWuG^}zwHQR|IVq9E+~H3ovgW2*GqDAyOTtCDBQ#%-k}ld_3b~>B<~2Rb7#gm(Y!xcws3wzMceW ztZ}99Xtfdgz?kWSI#TkaEDWZ5>Fp@LLUGjS_J>u~k~GFmko-eP5k{92>X%|9ui3jU zG~SIu)&bgeoiP^IP(bmvmPt zh{I*eW&ZiGt*{H^H3PYhGw5TYkmN>@Q6^yAHIq#|GGU67wX0NHEaigOGkLXSw)hKE zcM`Z%2Od;5J(jwD+CB0=YmCTVT2v{eA=fL1Wg2l_NY*4p1ndJJ)fhqsM)$^BUM?vQPgTJk(l^wl}?AZz>s5My7u&lXJ3+uL{Z6Pe&x!Dl$ zosLJwR3RZa+T|h!0`*~+EkLoDoC}-4oEOh?42k!zF@>FaoI=@r*?a?!qukwW`s%7` zpH+;|s=2T=!sHWk^afLIQ>f^ODhEPvv3wmE5g+n6MheE%*9i5=iVh=+KY0L!5ifWMffU)<;A!KvfJjhgkB&(zo z8wrpDV?;JV2^VkRb`bFW#w7HeBN<$A4m+o?xUH>xdP^o*Mvr7i%3^ws-I6Wo$s`hu ziH#md3}tZUfQ`SFvcbq+)JUJ>rj;ZvW8!HwbL7q+h3h+KpxSob;iw9gGg~OSa7MH!!w`~Dr3V) zl%P|#-wXE1DPgY|_Q`IhAhjWSd%dwee>R89l)$~c+?a?)nB*T6rx$fxN3?mTs&1gK z-DDq8v%+Uq)W^W)=dwHGN$yRjq@Q6+gi(0GYM&-%tL9xU7bWd2*A;HUq~o|7gpPT`n`0bru$By$Uy-E zx=kbP9Q9>8-_w)d<+820jM|GO){QM+^#s)Rqp~CRTf&fX8*3RB6^5u=6-xi=GxwL@ zPljB~un3U#fA6E!F=lU)-IWr|_<|>vhS^ z&n|B+|2kUG22x(FaI4fB~7Inbfwps*i>o`Y+9*YiXL`5q>WC>)BFod75Ll3WuMiId47*2<5l)V%5wGO`2AP!=>}(yXBKQu?)XnY#2Y$A@ zE3e{ATZQI+;yvQZw%V7SE*lZY#dvD&Lj4OE5%G~jr5VtnQCHi!v1MkMY6m;d3mJGW zsGds3!*x|nDj+ey?8%Db_X z4~d5p?UNFH`TXmL7h4?O_p86_EtRry@^z+OO~AIZv?qA4BuUai(+QW$v;v2HB?ft{(Cek{n}HQKWeB9zeOPwLKRF3TY=Fi$h&g=rNM>|(Z>2~68E&g= z^)2$8RgqlC$PixmoKBy2%eb4<2?;Sl=TjKorr?faX9kosdZ0s%#ffmjy$_iDgj9E3 z)2$N>+_{&>$~<`b1%Atj+B+!qb7V9!j0hHSgUMf&F=HR(W>!F7t%4o02)xh6F^`>y zC?c_}7EvRZyg8cZsQRV6fSooUiQrrqAPupqD5+mY7`Np$d;YcPy*_FFQFm8IeU$|L zjy-7yJ&%b(s{iIGQ2LRB8vg1dHsUj6fri{&oK7uy^I^6sr-T7kMZ)ZiP8Bb18Y9?6r~48mJaeyD33t*+EMr5L(s3WcptHj zs&B5Nv)_QDydI|`A#}gqB9CJ3I^DDchKwFsNvC`6m3gKzD(N1Fu|A@HA}=WBCscct zZFYGK@L+Dg_hVzI;lqs^tf>d`y-+&N z>ubz^|C}l_E&fG_Qj+!ebW36@4eIo>f~28Fig5Z{L#hf6LlGS2-aKwrScBH#xdNEx!!?v4xV@{3ok6i znd;?;rDuXx;3I8HL`wq|9#m0cvGoj<5n&yx;iWlk{UHR@iZ@+cp95H!dph|U`8U#^ z0x}67B^u6-GWPuHV+27#gmmo0(aAlhF;9yq^ty2)cp+kDLjb8ynII`0V1K`2Lcbhm z!x!VLEAeDp{{s1gsK~bkFL_SErc`JrMY2ph?yMmJE_R{kB4ClDXk6cr{_kJ{KnUWX zuW0c99ZYou_`5xILTMlmq(XYEkg zEPlZMAE1}`3OCqzUsWVNclTgAUG=Gcwg2|_u)PD%!=N_x-l0Kt9ZIcSZJ&cxe0WLC zzr{n3R$^YaD(b&RgVATwjv8|TkOZ-C3)r=P)y+|u&*0CnSQcy?@8)twpaB8{aExlC z2eyH}Lz%(8N>zJUbtZU+Ruq;TV+w{yfhF_@SMQ$~GYbH<$UORX@Pxm^^n)UtWq-#| zsLbpJwd%l7WO~|vy|BFZ+ZLn$t)ve~L=S8E1Aur--XFXHe;ETK@gwfsd0U)i#FceJ zUY`#B_mGt@yyhqwVZZes^53TT_3r<)|9Ep2sO&=ek6kWDUV{Dgo~{pi=_#eMH~%n> zb^EKb=3SoM?e*7X+RM?)F*mVO`&}l2@5?FAGbf`YrhmsxL_~zj_`hQFckEdAK0jBYfthOa5`<)nXyhm;x z<%wfAc!$5;88IZ2E_KBT3DL5i^d#SmK zBXa3iWIdjSpmciabakgZPjTS5wau&RoOLtC>3fjeSWQK2kc z!p70)S-MR1Abo%I);Px1g%6RSuUm>7`m|3@xE`@hZ;HiA$f)=HMfrhs*aGLuvoO)BN@=K`x?(AvAfM>LU`< zpXCG$a#*p>Raj$2@G=3iytZKR)rt-dAJYgHym{FH6cz1!I2Gv>gZ@L>&MRt zC%51tsy1+;RZBvW@dd2QZvc_8{xA~fer;!d0YHfi8mwJ0-g{L5a_gnRV?gKWh8=;? zrTz#QAJ_N$X9R*wK4b&WZUsJxYVX~`4~K1hVtz${Cgclf)uarZ)^!wCkNd2mVs*nF zKq-5SAU5v(4MkD9i#(8K8U~^@Ni`!d>3-Vq3*l$+MS6&=RwskMfM5_lzWiGFiJX-t zYT1YI{=klq`h;;5iWlL6?*a-$$6unM65#)U?la2b+y&(~pOe?5(8iaI6-4>e6RHFH z>la0tN^a=Utp@CkuF2OcsRg7~)$)NvL@ry7KFOd_ELT=X$W((Lr=F}egP&wu02E2p zY5{6?ab%n&zS76U;|>ci8Vo5y2CEg*KDCIHHv-=|*_ID2Os8|*79JYBy+vM})# ztM=6=dSPbXxVin+7bM#*7XR~k@+!%V`Rm5sTiJT$=u_jrf&IuX_SNx!<(bYvyQ)8B zdi|L zjaDiQ_rWKiac_bdhI4G?d_}Fjf=l|Bj~r$VysJExb3D7nV{t<-#bUKoZHguD_X7ma z??=1;@ErFyIuqd({hAXez_4uwW9O#KHwemKeL4pYPZB~H5d3MF4RdTxm&Jm$A;`9r zyQ6WDKymRw3i7O-bg zB}d$Zi7I|}Jh|+_$?d~ZXB9p70BL{Coc(t{>@P^arloGT=U@Nre4yk#+;GnP7lEq% zGWu)21;8ljP;f+D-s<|N2@p}o3o`MqnGy%9i}Ipq4hohVPS--UqtdIdqmIAk0|Rmz5*t$@p7;AD5d!2Zf-$}5ctGvLo8ji?~f9%y)2x(QB zkhkEB6gOKlfEI}{7GE#A=v@Cgk^U>sA?!vUej`J4v^K-879wy6Yodb1z(ef9AHMKN z0Qo3jd_7dA!-8eDUTf+BXK{AAoo}C7nE&}|3>wh|8_stQpjgq+94LXZ-&)6WgwH5e?t5(I#VYe8p@;HOb z0|%k8&`P5)!lVNhH~@vMWOR1|-Jc9`q{5|Z14G5GRE~BkBr)B%;RJJ!V4ue?OkRcV z!ZCfzb7NdGNMpme^Q9fp2;FJSxL#4;83_j(EN4B+Td(e67F26T$g>*=?T;c1Ng3dn zL7ouxJ6?0oBjO-98uE!my{6VmhVCt83$X=2y};yi%r9zfRgxD)qVAx7sB=h5NOgVoYV7RJdB!Q-NWjJsbc$ch7dFR6J@Edg~t-g#y0LZKl zTJKF_zptTH^c{=Xv}MJ{{_PP^9Z2jBmENiXq5@2!(kZ74TqrI-!OfQl^6hLO3{`yn zH4FgI0ghJrppk$hq4;-?GS`P)=wBzo-W#>l8;%lGtU*hBg`XeU+>)g1yggA620$nr z`&7qA%Y~<3E0^;d5p_?OBnE7L3KVIQ^M4dY$Rp%HW;8O5hmm4o+PEOqRm2c$nJ9v_ zX^mv<^~D4lnPo!f(@4ztv96m9990g=>rjjm3X@NV-hF+j0T7SS$@ZOP&)|+9{F?%O z!6(&Q@pYOXqGqh}KL18Qa(>3qMOi4)&TFo^jd&@FGr-$JixZ~zTkf7zMsJSz^4F-t z3)^EwNFu;${HZ=>9uk*Xh`!P{&mOm{6p=ku)h)&3$lI+399?BAw>tk!Y;-jg$6#+s z>}{h)3Mq9l3ZkaDyPOB2?8>W^uhYE@6vaSuM<}^eOQQnwED(yQFe+K@pKjf0A4KHI zGj-J)dZxxK(Z$bLP(njy69i?KtSW|Rl1JFHT=mu%ktoGLSYgINUXG?*YbXv=LZxov z>0cSe-oo?meMJnewq0C*-p&crW4~Rr+w0eO4|>+=^i%ewami>UJb!Zb@M3_sFFQYS zb!wM)RcXWhEvUPo)C`_LfuVzim-+1{Y7h@-)V$zD$X7_CPFSDzah@+q1%zm4r_e!#*2s)~Kmv%7gnPlq|&-yQ|V zv+-Oggct1$^W9vPHk)HcMp*T(uVKYkE5PgQcNxjZn6+ces6a9*jRE-qvTvPr9^cw-K$xHzMy3-RfE|P92Zw!H{( z&!kocG${!-E(1!&AFq^QLYD@80aFxv5F!PnLmJpCY?gQ3&h< z*s!zGqRcAprj~(L_wR<}DL1-i?}D`s`mJN>+Cv>!{VHH=Jp`df8+VNH4B*}Z8Et=5 zayp9f$obi{;Y;#~`LPELLR$+@R~2R6;_lh6S0$0;6gM~bR5E0%B0;I+CYA-Tuw8vO za&*!u_pf+-g3>2=IN6J29-?$9HI>#%)L=H!YDr9S?P&g}bxg5c#2UQ~wa*%|l25JE zI6n!Z0|i81D~^tLJfS8l-Q-R{YCX{LtQvu%99+YLr01!Goy~Uy1uyO1HzjP=li#A+ zzKgUzLvHr-+2_E$vrFrF4&*{0;!)3Q~V0cOE7 zw|48G4A&MACO`0H-7V*ig^7jLZYuqBt5lB|IEeScss_rn4VM(K#^@r?El?4$P_a-! zXc**1_!4pPEj7>CYEG)rPTbrbY#XzanZq)BRdf4XcaR+eN&PY^WJhFV$o8nYG?-+h zu@S#6*`3q`1Y9<#M?RU7Te>1f)o zo8QUpDau%Tnn=v3j?C%mQDz$ZC}eax$4CZwY1r7ot(KxyS4g*Nq;s^I725GYJpuNS z8>Anw3X~Fud}01PI*{SUm~E00#4OCD^4+v#haLn$ge%I*qvG53?jlz+f^=(5{FnJF5`tCRU|9L2JK=wX>$+eD2aasUK*p)ZV%EG1#P-Op zBL=iF%%W#+8=BMukDyEVgddOXwokh6bi28xs`80*G%n>J38-=@J#w>LF6WtQLPbqI;*hcC zfrKBdwY5OFq4riF2`Yv{tvR_MNUgqsVN|c3T>;)E*oosbq6vb69s3_YpEK^kSNqUp zxo-I$n%kf`nXAy=@!lR2MZm7`r|KxfSM?>Om{s~E7^SiJsiA!p zqDsTFe}&^x+jZyisZUN1i8B7}g6fQMGh`d;XrK1RQqcTH#iBczL}I8!$sr!gIWsT8 zqg`(iJ)9E?H462P9bR&4QTU?pDmb41%HD4T)6K!mHJ*XZV;*eCxuU`?YuJ!a0c4yw zok&eKW_j=!YvXkb1(`uXx9?Um=|^UbI-WEVRj74FaUuc|N{oC@tn-CV!8$#H z)%jn>Eu2%rD@X~pR|ISv_kuMB<%U5(%kQ6NfqBii`5hZH7MiU`(HOPL81Id0UBg@a z%3yQq#?+hfY^2O!nk6vlb2ha&WpvLteJ*Q5ZZ*&;978*vCP}<{<+Y0ZlRfMq)IfV- z9mEVLK9%tKP5W1hci&ny_b@u-dWeb&csm14#U!j;=MX96`7)Jpn0!ef#T;hY1Nu(Y zrI1yjunP~5()5qgWTy$^qOKb$nBry51`8=fnn@CK2bECI-eawGMgJOW$HFUAIh#ic zHdMeVEMvh7x*Nx)(t4C3n?Km0O1<-0$!nbZR8x(D$qEI!KXVk>7o)RD=A@}rj|s*pI6E|^$|~Ms}ufS@-f7jKR<~n5}e4^)O!56eefqB0>l@N z(a3R<5oP>U8sn6Gn!k6{=fMBRS!U-8?2+K!Xl`xwV^R6#sI}_rWHyCz1(m)NxM6-A>;}y)oQvVYj>fv*^IK;2JDonHKG=%w zk}BVjnl*#B*JZt%3rbrKt~P9lv6~RQLDvmu4|uZwW!1fzZj@8$`0B%(2W}?yg@$;* zLkeZAT~#Jg4~GbNZO>=&R1s;*EmYh7QunVL82bKKez|YF(EDHY*uB_jRH|-(U5gLY zAKfCu7PDP;;y4z}i}3sHgtok?t~@3g6Vh!l<)yw+PYTran=xj$>ad}n=QsZafi6_L z=#I+=?k4?}<6jt`0i%brnp6|7Zb#q4SKN>M8MwMd6=eI2#n-p2Rz30Xml|fT;9!zy zHSlzXn3S*lCM=@9=S+!cb-bzVuf71JtiJb$O;b5L2ejjjcj0vYJCgW%dBQaK@6K<3 zNBZuqRjs=&i*q~vtlJp!Ji*affjpL%tT3p>;`>*_km&5Dn*OlDg9*$(Y^HKl=N3$q zk?Ep>F0oE_6VzymRogRns|^Bh$w)B!tk2Lwfehq}1SEz)wb@;qFH(bjcAQ_Le_VAM ze04db-@t$Ve}7m7T>0Oj{vRM*d(>X-*R0Vc=3@{_Z8Zg$8kv25T(yD*P|?T%`l?@Z z{j=|VwO1WG|Koty>vx7%o`o<#V$KWOL&(2xV6YJUy8#Ozxj9EL+It|`LE!gUVWm8U(F@GB0q2Wgeum4 z`JZ3Ea8ln6Tpaq^WZ!@NNjOL2&_HVFt^bSlJYc1Z-)M#X#TU%OYKCe2`=M+Ig||nA z1^Hco+Fy7P++rDaZx2y?3pgaem;dMl^`~Fg#RJ$r$AEKej>sfGsTAP+`&Zjx`+0X8 z%xb>PagXeUkSP>Q zD-~?sZ^M*+(!?7-^`PrA6(!_`jRd#It}YyHrosjuV!AJT(1oMtF~I%!$VGUT{)Hby z&=CDxe-k}+{*a;`p|#quC*z|dOn_+0+F~DH(ybaiS+zrkfgnsnAe1#-_kG5P!r0hp5xsIvI|D0 zU`&7cQxMiJDh6(iiij?-p3+AV7)%ZxZeBGT5NM3akZ=Bo#8t)QnTx_`88k;2%s#Oj z&^sFP*{VJ`9Z++;Vf_=1VJU!d#CbzYD=O(Cd9a9^>bDeF$)q%fBOPC{sSpB>NRnk6w_OC{&tY z072?Abq2Fs{V+`vOXJ{Qfl_yySm;C3cckyECyyrK7)kHqU3Z zoY;*yr0@bO5JaTUM|(eDJgP2QZN~Mt&sC#$SV(bO$~*kB0o5Jvfsm0Ue{}u1>;TQJ zd5tg>@8oh-7bUpam!9^@@e>i=|Ie!!y@Ogz96NySV5B7)6ykmHlDzm3J?ec5R7C;n zofY*`KmhFBeVeM(7<*kL*INpxh5{aBUXLe`0{*{#P@$si9#4;bb;4eGrnl^ix}ZN& zJrL#kQ&Q@hnT&6%k59~{Eyyb59?%u zL^5fE7~cVpr!O6DF3?hMV(AwaZOOU-1~vK~%fwDm0e%eF$5^LQ^x&{;O7qxs6$^)W zhpTfIuuX}8Wd%#*h~x@Y6=d|e>LB~};>XzcIcs-{&Z(HdNuQ{;*B=)7C@g|(?_J%k zVrOKpL)O!1$ywbzw(5BEAhp)KZgLlOa?0AVxQHad_c6ymT1Jk&_9-0zURP?f>~4Tt)Yfd#rDti|Ja3LZ1O z&^6M21LXD_=$^yT50C<|@7WUx{Wd^YfLyF7)+GXEy>JBwASd;neF`ueCG9b#>I2wK% zYl&~)`-XB3RsaE*qaL;ae~ozEa^~vH)&eDmq|iF5kH%wH0*;X-^5tog$dW)oF+jp=52gm~!+e4<|OTk9rkA2LJF0;BRr3Y;BoLkh;Auo3j!#AKg1pk|; zP%9@g{bs2uKSIpVRF9?ViGsYAaAd@89%0}xp;_ol&ik4Vg}|Gk^w^8~1%4K?4$~P1NYYj@ijm%8 z$mZbsVHCWIE)U7sp#dYJ9ot;%cQ{(=>?(Ks#Ox7y!20b%^auvP=^TvuBzPnQEO1uP z6abQ{&>Y>!6jt+KWRUo!%w7C&%))uRS8+|0hMOp|C~-= zLaYWdx}ieGC<4L&o&FuUC2&5=-IneV4++jmP}dI9{$~a}?$fP9NK7d~Q6vQrTAcpM zgwkIG-%HuaL6&v{^!K(lSoz#2WAFQYqX`&FOpO^OMb)QZO^3|%P{jZfba)N0hCq1% zFb+EGgTDf}T9Bi4w6RAneZcT0c-}ICW-`vo=&O&jIYqY$TZzT1SmE6qC}jf|wnH5C zl=)@?{QL9KnL3360(~riB;|t0?=&I_#Ntuh^S=Zq^GGJ%q0ani&8j4udjcYa0QPxUFX5pn3xjQ}8%QR!Muo!6+y{1ZbQ&PvFdUR4w18 z#PFXRA!C5OpiTh`Lm5VK>8MNMCw2cQbncAgrhtP1S9&0@a>zQrP8$G1nHsX0bleS@!kdHpHJG4U)rjd?CYtGEac>BJA1n|b=9##W4t=uj2Q^jsTr0#1%u z=f|O>;0H?3%27fc4dIVnE~%YqGjDML&URE5WhC@M2bz*D1vvI0I3k2b1GKe&RhVM> z2q2L^yKHzgXu!(X>R!=ZOZCs;CkgE$bA`&Do82e#%H8bhp5mQRX@K{G0=0e&wBRSp z00Z{5s772UmeIzVBK#B4;}Ziqje@2nZfvR8z*P^bMSNtby*Ap8QldrK&tnltAyexW zno9#pMFlA=o4J~oUB{6o2}<`6pIentuYO*d#nBD^gjQOZ-_*a8BM2wbq3u5Gn^;El z_EnA;Lh5L>=i}qeQ5HGe=9ZMQDYrtLv*FYYXg8-Vb8S_y#%qzVz93Bm4A>S4n%G22 zeum0w>^|L89Y~Fie#&nNQ%JnDmCES+d`T@;84W1E#6x>K16_8n!6lc%%?BDWQJSE=oX!BTZjw!eeMBoGGc24YWZ^ zwqdZUDW}?Nnx8{2{mSl2?F^Er4P{Yx5e+WnMvHh?ee`82%v!}o8Ds(iySrjy=WU(UC32$0IqMCC82rAKuh0$u4fGf^}$A zrRaUY;KDH!H;FQJcLpN9k$WJC<;$PSvHTdAalo^p!1NCx53$xQ$Yi-|(o72ZQi7dM zVNT?}imT$KroTu{hiZ%UBiwhJe-Dd*7EKs;wQ(ihje9CK45q~S0DQ$PIQH?#JXv&X&)MSW=uYDB z!Xt{-w$58iI3N>C z{?$woHzJ@+RweSs^Av2Oy5&_Qe}OG^$v0_Bmu-(R_UCq=s4WL@a$2|DUJS|lF!BDi zsLPE256mbVX_qF9s*hpQ4&UGy#iIpa%m85Fp~Py~OVG}P^f7hv@rHrRpWh;B$)1?4 zRCw35*Gc$^`I58zt{}CHPCO&Y8_x=SnKMro#|F&@tJ_+%|o-G{i(7ur)EHg;&H~2C0a&Gy=3&^rN{faWQ^0fAMzkqlQ8$2kQ?e@&q#3LMBmhV3(y*#= z*O;K|j^L$Y;Qco^*o4E){PGmfMXKokHR5o?2mUhfu5~Y>bB}QJIC|BK=#k`Go!vxo zY-Cs~aRo7_=mDJz0(YC}PzE#5q;S)YHzYxYRyc>Lik~r6<^rALC)5 zZEfD1VeM#+9H2jQaWiO252o&6-VcuhDl#LveJRKJR>%k_CG)7Q`)n4B&q+zP0@L(} zXolEWh^hlcCRAlcU%_9=Y{_fD`7TN0N?rPbp zRi2r^&`=pmjNp|XJag!(1#enb;5QpxrD8*wyRYcBR7|N6HQG3QG{nFoQ|~jGecuU# zC#O`Mx@tIz9urTyQ<}w6K+4&NsaCs0H%JRb=U2Ky$2YOY-3cDVBQ4CO=|6oQG0xHC zlJJ~av)0)GR@Sah5wa8U4zBru?SX_KYiYf<^93&j;@QH~!)GAvB#zL1d5tIL!4bU&D3;C5w{5!xUuR!Qs%=jUS4jMGbNS+Q z+Lgo`)MgNO{8+>1$&f<}Xr)8s(LyKXgS9SBW3H%5dR}UAzt4-Xj9)TZ=LaB{v_<3d z*5y@oyRqqNPZgW#2JTyvj2TS;rapWN`pvK_b`eW1Y();EX!dZIPe5pW;Zq4*F9~fIPz~$C=)yKdKB4;d_MnlU2dnF9S8$H(^KvAI0mqPbM!LV zJPUrp&Oi!jYa<=FDggj(CzArrY1S~u6(#!f=4i$eV2PKx@|LkCS8B&Oi(qiBxMrnC zNS*lhHW8IH=>#uch2!Y6j6Po;nrLI}DBsXsg}KujCWcia{^<2;m}6v+ph`fha{?G} zTic(t#mu{(taQR=AEx>%UX<^$5_lW2?K|L*qRFRI#&qFIoS($)&gTnqJ9C9CD|>3k z*E;f(%lWm8U@q{i zeFLRBGFo(C*|~}~-O_b+8H@V0`ubFI*3dme0~8UJZevNVRt0)PeySd_3vs4=;^l~z_`{_1{KGFeChWT1da24@3eB?asZgop zKkd%ppKOx!@awt-vQ=~7Xb;I7XwqRMu_^F2CO2dfe9sD4*19sft2LVC!Cu;K7mz0!s#dIQ#%l(vv#C04s2g4X>!80FQ6-R+ZiAsMkLx8 zE}qh1#~|ETO*LuIM6n5c|MrOS!L7A#iz+>vWd2@<)@IA*_qIqBXO*3tmQFn{nP(;4 z9|#PghY}*Wd#bATLkVYa1o5EU6Yy334|`t%*VMKA|DL6k+CaH35M)oR(kcjQ0|=r( zAX>$0RYXB05kzVNL@0=eRKO68fQmb~TeONA1OpbqVuIiX0#yTH(Wpg~MO2oGkpG-} z6Np=vSNnc_@Bi*clS}T+%{g=C%$YOuof#4ofI`aqFp?LSH_zHX3|2HcS7)>r3T7b= z(g$W|~CGT@m=9j=_L9 z(pcAgHIwnFl7~>@q6S7aJq>30F<@P%-5{Q!QAYx6o~)L)7J#mnH*q|47mu*3L9(Fn z2>76p_<|Yz(n}&Gw<2`ewSKd1ubi68zjFX=5j{Pf`bBsOsp2R};5mjUvlw5;&{{_4 zg6oVG@5(aNg?Kys6Cdj|1bGY1#Mu}%aN<4&2;GVMkRZb6B>wVc5Uyr6Y(_yU-{3JS!{~uf358Lv z+&P1F$5QK=oH7RXmQasW8Gv&0I)tKFvfvVYthDyvjqcw~sm-j*w_hU_=uc{Ndow9t zp{&}UV7D^Io+&MLKILkL+0l3_lrIb=r}Vu^@CyW~!3Ok_85#=q;A5%YE~_4jOKwR3Ad+ z=eVlepYcYGxc%(8{v|nthe{1b;FD-HuCkEq^orbx{zU;eYw`(LoWl){E#%mEwr4Kp?qGf4bKe^!YfDH2s7geILulT6IBB2>!(EXua;}AKkK6YV0__u?XjmX;4OW-YsTxE+8i{0lS>2= zVBzEab}vT8Qgx*W=Rez5Y}gsXJd}%=dc8iXU;3*X-foUlALTcW=}j+UR=#x{mm8?B z)^GG0EFVoctKK?pXEv(u;c&ZXddsr~zo-f8Gu!p?74og4v*2Q&+OA*cO@5en;eLZ~ zAY1`|s}}}>iPSj66=^2_e=|t=>r$BzYHt(E|JPU5=Y&e${keBsusP&iu-ywuwW^vr zq9*=rPc&8H@ykDet^V~}eb_<2t5(SGxancH7$UFV$zf-gu2P68lvE;(`S;*A|E~ZH zh0GZ7R2dP&`1Qg016Khu0Ab;Ov!hm$6rU9T=ccFX+fyD)d7$!jubT5W4}$p~ysF$x zs95oCj%DuM?_^q`hY;}7^ga(CfFQTt^g{Wu{qY z74%?bV6%#5TC@GGXW+FpE~;uAaPwM}@pFWW*QkEcWot#nzYGkzzjZ5@gE4{?~~AQDTCU zH~&j0VIj5nUc+M9iC^5_AD>8YIbb^8I#p;;yU-8*2YBIA2Ha1oN#iFS)@OgnpkV!| zEgT)tZ^2Mm1IDYY0%{7h>PxV}_e0pVzPuSI2I{vC2*t(=v)GQfckDveFYeV4-Gl(_ zk?!lDgMEb-&w%_z|6dlDZ>$5+_pPtaeLnjC3 zs1KRdN59=*m3k$23%{c8>hrP4#L}0c1eLbarAu-XZzPhF4!vc{Enca@-Ec2CHcq+RTgbjr z5$N(yr+^PEEL6n7i!Qy+K!{u#qx!$4A|&D=wNGP*-hY4SeKtH0=g8knFoK|VGG&0^ zh#!>}H8gj$aJb;h_DD6eX+PWGXTVmk1f%p>)4*Wde=~6(N~lBFU6r`ShY%@;^d32d z;smzDWJ23Q7$o$6p9``is-+L8=VAey4|o(RBl$cwgr445Q@APeYV6E_r3Q5jzv+g` zY7d<67p(>d!>iakTsTC5_o=0l0Lx@RD%-MvLz|V}SEsC9>Kkq3o zzMMjh63Ggvd;zZVB|_hA!G3Dn z11A(BbrYPxX(HstBa1BPQyxmZWO^hw5o8!+yOP{^6mzO>o~0~Y;5DR!U3bh zt4aW7L}p{RX=IN6Klj8X5lF;K!tv3wk?*jtiF*-l=9tsg`wP>EET@el%0?+r*2g9o zFVr)}IMg+;=Oe>D&h^iJMh;72h8%~CTW~Wxuap6WTkb0Xfc*r(&kz+rl0;xNTnr25 zN*3q5pwqpV#niTOv2zP04D10H>jpo)aZLn5up?JCQU9( zD+{@_^1f!IsYe=Pzsxt8llmSB!ZtK@lqO6=kVdY+DBB1pBlK%kQymU-WINS?vjaN) z$npC#-HyqJD+{{wZ1<*o=`qm(Q40~YA8!Fk6E8uKCgSTP^i7I#Ylv|a=h|un`>KIsueOYs3*&*H@d)Wf+DQ1^W}DOm?UU>AcIU~ zanx&k-(qg23=%LU#mb-|shk&72Djsmx)-wzXwp6>K{)<1959U$en z`3uM80#QH+WHYALo{v~Vsg>1H1>ND-yPA6x{FcgR&Ew_Gtlql2>ANEWj|d_{T3U#% z(cM1S>zbGglpp*%|APLKCKBlAO~W3$1j1db*V4HC$L_Tj2YmQ3j;S>xe4 zeD)MzJIJt%`CZ#$gRk&Yf3z;#d|4|m&aXCiha}l~CrdWT)IhhC|D1g<ig-p$DCsXM;|XnVQ2X*y)s4T#d8d-R*}a&r8t5aAE{ogT&aR39CXIb;j`va z%mrkYxs3){pkw69PtY+Je4u+rh=Q47F_zX8IbX{Aip+tmm2hzNv6VcVh!yPjjb^OS zG-ysaz15^zW6^E{k(5SC5&GRu5wZ>Jn1x%6;{Z_%+5Q{~2kTO06UQ-w3^ffx4C*OX z^p%a){0CU=t|%*a(%CJKl?Yv0x#_%sTbza;V2XX|cwAP>NI8FIM)%$sl?5%$MrA1F zY~!_J9Q|4m+?{{+UbIOWK8wCUEY?1-Y?NLMNCI3Y5#AY)SNM#q^hhl`Tty^=M9c_6 zsJ^qPhQW=9`ciLqb)bm1TQ4>6#PQ`^{hlLHfPd<)p|5rWA2R1ajW-tudNV|OYr@;0 z{{=0;M{+UX1_E@&{LL5m(pbo*&jJ(_mWhcZbZfsbhL{ZaH=)EDT0PQv!YI*v6WSy!qSwEN$bW!$Srz4VTV2)}}O;zZuShV6(qdLw5~+Li)b zlzdpGcmX2ZGjhy{PZ2$Ep?(slT}I7{QicP-;~K|pzBF!2;1PT#kJ{_K*Yg+L(F?K* z^0nb1^n&1)8wFHFemB2Wwo*==Crj)S91pLp%@uHh^JM%a`9wLzA-`EZNzu86%F*^} zX5kB#NK!y46tJY5uZI9kq{fy<=0aQHtA!Nwx6^Vs>jr z%Mp|+v~k3XC!#X6*p-e7LpK1qUff$TqZxVclQTe=eFZpL;JO_;_wLj{)a~=yp3ZP2 z+d+Ro`GIc{q7eAehaE0Tc+Tyt4nJ`O>y9e;i4m-Tj60nY#`#mNkUSQUNa2m?zQBrf@HU**@oFRzAFSup|YXAT=Ar(HFX{JxF0CS-`4>cZ&gm?g~58?wK3PSK& zgP(il)=|dfSS ziDOD#21`G5=%Gy6t5aRmd*^LyxO6{Y(B63{=)5CTpPn0Dk9_6(t@qp9q?-R%$m{Nf0 zM7YSCNW8)B^8W03>ID6Srh)Kwweoyrb#^4xITg_ zaRW6|0#Y4Pu_K!TBwJsM8A8zjev(+b2!&@zmrlYmA*|#Lb{-CyK^i4_9CKt10wp)Ca z#@KF6=CJFzREVj0m4_P9?3rf2561o*&pov?m}Qlhiq1V*4S1*pGtOSVT?yB2M%v%! z?1h-1@)r$Ib+w@!ggEF4rBsy97iQ1*S&ssqoJ}jkr4-a10JbqHg9|yJmjXiggi_-K zO)8n+2|$~emC5-rE0da=bHZzLdvDfqv;=n*{G@u&n6mE%SvtW+J{}uPz{-ifX(fYi26t*no1Qxk#Gx|Qx8iS zqwlS-AAz3oi2eLpLqz}xb*J5keLyrRSqQCdI1jm!MLx^Uau1u5RA%tja;Ud4MD%QRp=LpP0qsrWfuq=DP#GRmiiyf3^FeoFRHi|4 zYhvO(ERDPt3c|;~M(>3?7&mevR)n;I{#u_`(2TEDkQyHGVRVe}JVKxy zuEFOZzTS0kP3JU}x1S}X6jGadFLnTIHodO)MGTk2H9miiQGB8{zg53ucXax0NerhL zQ{*VHmUR_a@vydYZiF~mZ>q1))y{ef6tE5-?ImE{0f6aJijf29qLCe+6%R5TEMy7eud1&3gDBb94M5pY5 zIyS&e1~a8BF{_x9Ns>rmvx|1QuvNymzAa>kvvQ}HC)Sm4uURuiVa~e^@^_GE(y<{B zMpc;A6-1_fWE8@0dp{0@PV1C7=Qy*C7eW|3L;pMykpR|DMu$A$xqIjBn}<`xGw91O zLRLhHg6iPxSxN+04q%~5e+nJLtNoxQ&(>tB2&n^5smmydG5lKba1;E`Xf`Z?xE=K3 z*{jdJ?f2q5cw&pu)-S0qHr-pYIhj~2A@5FScPl@+pfW;kb+V&l@5JWCy$*ZS8VWV~B3W)O&<9L*CPpo_htzBob0$S&m0MRO>wfMQTA`9(_Kn2zgOUZK9P^H8VVPnWDly zLk!vWcA5sl>#`LezUMUfTPUjV1grzp$21(l%K;eg*bqa%9h@EixF(t^rB;O(4!cws zzEJeiQg;HjB?zDF9lXy2&9kWu4xF+PKI5WAzuapDhU-BBS-Av0s_Sv^m+V5gwPlnQr48j)@;lMa!eGyFvT4WLf>Y&W#P!y^cIH~6Om!X$mpjbq7 z?a;%axcC9_omW4DU?hC`Qq8}IgNcQ$0cM@4H_HEo3-(uD@WS^I*mF~^(ZY*+ifh8t z7KG;?Fdf#WuMK+RnMw}_7YgNW5||RZ_$?GlYV0v{r~3Sq20$kyj?u5|iQY?f;8?Cch~XwKR+i}aalmZEL3^mU~K0v34?j}(AcI{o^eZn+gG%Nc^w5=SpqKy-S!f=b$zA^=80l zxbFqZEFz0W($PffG4m-nDsjUFmH9%sH&+35K`i{fqduH~p{Qv8HIh0Dw$7Xh`JP5y z)`GwAPjJ71D~y!qcN)lPaNuCh_X}|Ov~?ypAi(2*?tn`cqn5aRJ=5h3vYmtGihEzt z%z4Y9a?H-REgu^1zS#?vmK^5B#N7$ZDZ8oXAsqYg7nqdpIh32(_l*C!f&b?a{~t7< zW}BC1%-#t-6;@MUucK1GVURzT9Nr3IR5sw0Qe3pvWD|_9Z1`!x-;XVJ2VVT^*@9wk`-w`Mf19fR);+*~`h{7TQ#{%n{)Goa!lI^p zlZ`@{RU2OA9`XN&KOg=Z7Q0|%HHgGl?BD32 z(9rc2zkkwf=aQRRwx?oRU&QRnU+K4SlIF)2tGD6ZolUtR-}%tnWb`N73kTgge7cL@KQ#E8 z6-)d>;jWo0f|tzp5Az-~lkPrdj{nNAF;h8kj|=hUO1w>7IL7Ns*4O?^!r&W$oB(Sx zTWj=8Cph4dE8u6$#?$a$@$mNxWV!^e^hP&)ZvVNN-T1K!ot#wdvmFN?L;K9&LGFR< zF#i=}+}X@9f4cvYU_bvc)BS@2!j_qRZs+8r?AOY)QTJ91yfcixX-QaRgHCZojPZZJ9DM7 zy*N#kq=Dz4J^(p5h_LVj-*AFL&Bl(mvl;VMa6~BaoM~p3HbAs_fqu|W{F<`Q+9la*5rCpKJ z7#;q7Oy{jKd ztL*O0<7Rp7)3zT7Ij?Bn^Ic}UK8X3MhDmn6dcEY}=bO#+Eym3n#{X$-h)>r9MR8}Z7UjX`+t+^k zgWLNToJe-e&nBLu&M$G#BGu2m?yTbnF=74fTe4w!Ww^SBxoTfrG|-Q(&v7DF3m z+d(?vL7KyUo-k#&;TI{tyf<{jozFZ|0%<2MESjlM?D*bhZ+FK)^5+*8rC$2T2Qw)- zEXppZtM)h%qd2&Vp;%rNXB_y+C8w0*G0&cDi>QCLqlc^LbsE-ab&}HF{Jj3CLeXdo zW0%nLN#w=%=PBBzMJtAEdGSQ?yyC^MqT%PentOY6CMupUSNsyPZwpybw=_TIyTETe zDi$}s*zg*>G`Bhar^v)gx*^U#iK*s8f(oYpYT0i%w4*C+KZSEZj4;qTi-(; zagA%B@o>+G#+5OTdWSvA=0YnMgh)9i)ya={@J8MLXH4OVuQ)Ni^$L;fYeU(y?|y**roa+LHLifG3@& zmRGd5eB-^QUD3K{lH`-APLmXh^S!rLEA}cXd&Zmy8j`tYM`wjp;ayqT6FqwPg{h~c zV-{r#j?Po8dah8M5MI!Iyog%2*}$Udn&gCK_rhD#rat=aait42`Pn9Beb1x(6DM!2 zYQrijqz-|>qV3h5+YVQIA5$E2PGH98(<)?BXtCP+;{w?)@+!gxO}FzqYPiXIawQb^ z)n#f9=IJ`e8{UcE6r^0%KGm995W8w}>>91X5^9c@slxKXd(MXxcNK7Kp9!{8x6=SJ zen{nSTyfd+zhUqC>NdTqz0UypE>E~g^POkC(dzu4t#L*<9sElaB76VYjK6sl?XQRT zp7kF!W&AL0%{b@%*O&cAo){F^zMHVam!GocuizK+jo8e_(>9&pvQ2WgC;#v5S4q&t zF5Edz)Ay=Dob^)DfA6Wk_}(3q(hB#A|ChYj-?5?qhW`KR-qMBbRY;yD2?ci9j4xoZP(7JB<(1H^zqfI(T@|kICrxqD!VKH( zGkxsug@5$7_Im)V%s3urD-^)-r;qa(a3|y_mT~?K|AbN-AL{Ap5c2WgU8P1GSR+R} zx!*XT2H&Yf9E$a4g_qtzC#itx#ZKAbUlqRaKjcLg>HofX@7zDl!sr1b@O+o8bCDd@ zkNFL{gW14>&L9_gy%U#pV8~jN_X0sA`wx6t@*m`UhC-DEYH_3g`gVaTcap}_E(ohX z#8{-OIQcJ7?FtqRBDAG!@*&y1X1rfC=XNw}0*x>&Nf&^eU z7MuQANrZo25}oOJK`3=rE~qn44^tug{?_vY0EycjCQu&`Vg%#916pi=<#i~>N|*X0 zXJn|LjB>L*jWKt1Fa{JF2-+Y)q5G+B8DA$K@B3waY?%7j_)P~EMe2Qj5Y=ow1rhEr z-PW;3Y41+y0V8BQV-*x%OdO@w(0&pf0QJ|i;?4j^&58)Sq{~AaHdkN3 z9hL9^C}yR4;UO$5xHm`ba zL?vDz^T`|9^?HU6lwkCk|3e5_cDR8yHf|DbAF*FQ!AICq$;&uX8tljkiP}S z`1RhRdM2v8FUoeoeI77~2(`<3_ zSf(L_4#9tJ@C!OaPmyWl)&`wHF+z9;+g?ByB=85k#e@E~kY~eYV9Z1j1eh7>Lcle| zzjD6200pX`+*8P%!NaS@?xe4LCZ*=mBjW(gHht_s{|69-&kqAyn>A)wAfi@BvD8fyhAAia{qOs&Vm*M3Fz}>O{1G z+y-~QloWXkgq0c3Z8OF6+S-g5dTkKgTYVk{kSj8LA`TeQSNp&qW}@NqZo|%Zx1n+5 zqJi59m4o!CY#U)E3p}}Jd1O8x;Ffp8#Te-%o>Sl=1!-R)?z}6)LKATaLv(?&Bj7Ic zMAf}8{`hDUh+K^?959A<4eIC6$iA_`qxa{AUZHJF$H(=%GSnYvw&Ez2bk@r$P)H?badHwE+~g>;%Uu^R zM`X|`2?EwdLz1Ud?!cl7gA7SDaY81k!-zaKcO2PQLbuVPLoq4hz-MCoVD@0`_#h@$ zZVF+k){GGT1DaMxje+o{m^6-gLMZlax<$HK{Ym*SPgi~v7-bwR=Iuqs6d2K76d8!8 zu27^Zqj&T4zhR^N528e8$3TgM}we&V@|K-Ygd^#LDI2{7Mr|z8*835z0KDAXz zq)Z|AdB1pDqiDlA+l(SOHEumQiq+BSC(?H>5A0MFLy%CZRh#~K6z63`kHMNHNZwhn zUyvbpfRQ(*Ev$iZQc_;L7m9L*tlhIE-jI|(Dc*a~gh3OSkd?vCE~JfYqjwRe_~fMK zxF9Ti1&x_7hBO%>E4#WbMQ3fLLN8MxELE$+$a%m-Awx7RcN|+rva_Q>UWT(a79nhd zb4?{uKW*puei=KJ*V5PtOg`zCOIchroE=0d4>{Cjyk zLx_u%L9`$P>QeAo6delbU`ghu4!RO@kziUp)E{A=`|Lf(U565dZgL%M-srI*Gu|T^ z4kWWkVofQ{P}l8e*>K(>yHbzTU3RQeE3FGUhNmf{!7nk(mFW|rV1hq#Osl(*mK1fV zxVG9h`$~Lwvprs71~HO7#CSU>8Xz7Og2n=%z(GKHyC(z;Dqcz7pL7h;chp6DyFcw` z6b4tOQz^IXIUkjmliix#lNXhDUeO&yJ>Pp*klout4HluD8&yutuKNt~Du8a_qSY>C znQz}j&gD@gP`(c``P0mK7j*AP+$7HAl>(ACM86;4$+UraxVqA$P5jN~@AGVzfJ*V5 z`Gu-0W|eyx*O_~#r*8SSgyvIjh^l;0sx4}=7Hf(pnI_-Y_Z!B3!r@)efGja= zv9IityPHK&)6Vd7UXWP`P3t(xSCF1^mQW_IVb6BXC>!$)1e@k5YMx9?zYtZ5V&7Ai z783%tJvzVONV#I--pXt|@Eyf?qf7%2p0{*EK=-Mrs9Llboh%y;->#g5;+Z@zYLV;oDRzsDW+MnDC6ffwU1A%mo1Xf#9woABK zyek>fXeA1G7iSBbg)&W&d(l=3B;qI%>-u|Z&K0xl*me#q@&T+!;+CmcrXZ^RRKq_NM4jLWR?)yj}0=^Sj5()eweAt;4i~M%C15Q ztaxd^A_C#;Uqmi_S_Q$idQjsd6jqd!7}-R$Le0yEFx`q7F_odv+2j-TC)3dC1$8GL zW}uTtj@z=J%o$pwyu&RKcLC?zj5M7CVcrm|kN!4Zr@n)!?bOHg*717lC=Pk&zo1wt zf^&1a!sZVLpc>+n%pH!ScL^7ACS%b$p;eSMv)Wr zBxA3W+zK~(!>XQH6o+vQp%RdQWllr82I~zXt;bJyHFbzbn2(DuomepaeT^vX-Bl&y zc0_Gn?KPrgC3P}W=uC#vb~*8eu~xg4DvAT7C~O89dmQiYp@%K4Fy@aOGvpm>AnQT9 zm8}BeBcb{kgv%#WAKCx>6s|!Qfa7J5-o;#94bOjGUl{Ktb{37W}G zP{lw2i9Uu8GUJH7$-KyCs~{=KCn#KU%cGno=x0Dj%M80V%bR z&Bimd<9lU@ajG4PPG-#gvh^&YYkALa@(Cu&%)^WpD~jq@FE*A%pUG}BS`b*h9JCY& z5M{jJ8W&~OV}`TXtGPLtL?unM`MGQm2HGNu*+sH!mR?aFOS%MNQIj_aSlUo6&Kb0u zSPl{)8P-zZ6CvAhKqY{Wa19nhCz5Px~wZfyCJ$5<(V;UdOp#FaWiAwrWvI$ z8-SxcpnMo?1s|3M3QGgBL4^To4PuEMlN-hXW5ILaYca}bUEy~D^l0OUxJyn>v9ju= zP{h%-=iEAr@{0}YBP0=6PQ6}TOAD08$`-|k?~bljnCdT!fD};m8LHij=*l5jjfE1Q zkRpEWj&%@Y4W)L(dQ!F>SI3fXK1K_wj7i){^l*}^#cURZSbwyR2ULEnX$(c(PFB4q zCSeCI=@c4Ypk`36>=grFXVs>aO{WW z6GqI3qH91JK%4vmWb+OH;fm-tH((1BgfKD57|baulLqZZekDJtc}W39)+&QyiTr}` zC>6xcp7E90&02gYGp0}!P=j-l>~fk<(z+n_8m!4uk=1xR5fn^?e_}mYsG;l{jT|B) zK}jw-#mHM5WkICK?Gp6NKN_??(-7hI5uh?irkuuCjN~XYQCOacx!M|y!!M#BJIb%V%ngRoJ=2{Pu9Vd=Q;UdJTVKZ86 zA3U$LwZ8`%T>J6vytFbXF}H7O74#fYL&-0u(>kh8B3=rQ93ghZHJJJ56hJRkHKdpM zW=vAEoT{@A(uf6~4|)+*U7Ts0zMGT2o7-GejY$|0U=7c?15>Bh148^18J!6Jt0XJW7+a?2z^fi6k1Koc|3i&X6As-FbSp;M%Hm zHI4m1nZ6Hp3LuHdRIxUsHCjO%GS;;y#c1OSo9imwW!seJ%{0(@r$2FujYzwJq)3d+ z^QkO7(zYQ5R%A#32I*3eq`eiio0FEru!L+6)%e%gGF&hiH(%hJSwL7f~c^>8E_8M{8 zyDt^mfyujnWpX-&v^Y>`L03HqdHQVa_jWoZ&keZQup{Cu@B^Ae7<3;hS_Uf0Mx$Lf ze1vn8@vL_I5-QgV5(iJC(Rb0L3??QJ3J?uS!?AI*B!a8IjLS7V62%RykEsr9YXf7x zagoepJlK^mBd&fMR*e;h$Af(Z{>E_Ym@7XQ>UP3z2_<)c4Fbi=5Yyg4x#ts4_rcRW zptWh^T3tSkbZ4MusEa^UdRAYu-u$!cY)B)QmE}0~t3eZ#9$IKDL2NetbYIdCNcv4k3y!nxKVRsoqIkyZVHs{ zySxm!00}r2X7et=$#NQf74|?K_wtrh3{sFAxcdR$RfLj@@PLo?>hHv>AxhjRUBC9--VI*eZTVHxE*1}ffaIz39l zkRBCgSUclDBI@aQHRa(Q^y{Zw*tEZc=e&)2bkHhre6UiNc-x!14X$kc=F3H!1$PEG z#4k}|cuU5otj-=X3evlGb@N#lgam$$v0Ur)5O&%O%JrE_=x<^jI7lpPNM}zD$xDFm zE*th`ZJSATht=p&;270P+KU|Mo0konn)S={pV#@J!EMfkanU269DF2{pREmM#Coi@ zCs8m^Z26CP#+S%n2=&@6ruWXaKQJG8^C&U^7pE76q@u@L%)h@n%9PbKij+NICchEq zbG^0Sv75?9jYMc^Z|+4Kj}3QddrB$S$AcT7fI@SsUB`^IyMt8{`04ki(!v9_r67E> zWp4k2hk@Z160n*ET@V(6XJDAE?+{xYP}ln#@Vb~4`r(zPw^9zbC_PfNnkr8 z0Nax*JofCmkM~g!WOwn?OrH_JdJ8ncWI9jcUMvG_R9kxFU+_1N=1%x>Z8t%YsKwl*xY z1IY0*v9laAaFjTwm|R2~6<-};CzxCTX_CA6((dq~JgvL^lpbDHwbye7VAA-ayBk@l zLoaX~(x7#wKxjHUI&YvDSuKv>XypZ(TmH)k?XaZjcah@&m}EQA_^ENmPS}U_Q(3bp zS5Y5{(YM>a>IuqPB;Bi0W3u^#JK-}lH{{W1fUU40041MgAr>9~}8H_Q>#>dhj zZDCvRZ{7nBBbrC+;}@$U6(^!Wjbr6{5)fsMgDV-`{{pi!^;$Y;3o2QaO-H(qgeDHs#v zB+X=c1uR|mE((cqz{&d;L{l~ss>8bBzh2d|6#=1t`v60>a+&&#Qlhfoeiphz0yF4$ zE@;28;!TS$8OFmwcjm7Myj=>uwIXw#V?-dVYw1`kxK(s~S)HWTIOp7h8hR*Q{YaBM4E{ zv)wr?+H{WVJPDY@i=|&nJ&gxA&YMf2?LK4v{Fyth-Pqf5W z%zikup$m|T(Kmz{6Eq@lpiD{Ar?Vt`!!>dLp{0Nf1FUT|6oAuf$b;|0Jib=L(c}_?ZbRVfnj%m^^@Em z;ESq_d_X_n9xCZqhj1LJdINA}3qTqG5ZwnF*f%fX1z*#|ZXiBDwe67kD#?zYECAnV zk`sk8<}M4@b`T6u4rkKt0~q);fyB@O@PvkWALi>#ui8N32b`Wd=&9zkAJqnX!+kBH zg}|`AyY4Af!G*Z{1uQG6WhZbq9)6lZ`0P;O791j=>L%WWH)?(Ttb}1EZ3)o8PWYeK zA%lJ-%BhJx1<+n93tot0^b!Dhvc2N1o7}-y2fkiQz6fY+d1Y55;Pjx<3MEL&i5(pt z2K6F5Hcdw=TAU6(t1ioxiYItb@OHvr9DYi8N7^IXXCRm%j8N#M5v87}lf9*Yib8Ex zL_{DFKC6#cR3oJ1w}}OSC#6O~oub47IVF0zsB-z;MKTu(WMw~!mlsT;SSJ6VCkekM zA8o_-Vhs;7+qt=t#EN%=Jo8}o)G@T-gQsYMcI@bq_iG15x-G0XnM`AJeB`T*>rFv^{%itVU$0(r!4!H ze9Z0?e+jTqi$dadJ_d{Ey(u#a>v$wtIB}u_YPAu4O`GAD$lKjH-7YXrSIYJ#g%rw1 zkK5zQ=dvs~d{l^x&!d_1Wdp?rYnE6SuAg!5Hs}?5(msrxn7aR}=5ihKj#SOU9UT3C zr25@X)15N%AA-m3)Wc-o*C)%Pi0Im??^;)4P9>W z&j8{b2}qGS&kjn1neQ*+CkUHtNMwEj7h`it;M10PNz7rr$O$l~?q`TxIKo{)B=H2Z zD?Ec%q1)XD4|iH8e#|@_vM_ecfQdW&FQ~~ZKwO?}uMThmJcr|xYuyc#WT97JJPxn0 zpBG~Ho~(8o}{#Gq7veWO;zlZ0eS%q^(reB5(Bu%I>FlCOxV<>z!JQ5A}= zE^*!NOsLaQTuY-g*|6PsQqgFdjUG8c%oO^2YeUJG{7fU1OCG9v46<9h0n>x9^h#2K zi8D{kju-nDro{!ANv+*}Zo+0tX*${>lv85q&xI!MY0QuN1yA0-$kX0t?EpvXS5_wA zy7siZr_oUJg>$|hT#W@rp}0 zr-F#3+A2aH9vqRdmBJqJu$&(YU(w?dhqV5|wet7xF0Hkl<~z$4L& zXyjOJ0dFpEG}PQOkHauBM`C2hwuWM3Y-667C1V+l&-L_97y#f$Y|lQrk=;@;^NFFx zGMyPCQ}#OZ?tP?{DP_iuBpGUNTFDdw6u}U%P(rsPKsv2a7kiJsC>!Nj=?K-v>g%`x zb^ zOy39=9T8y8jrH!0C<&b`Hn*0ITq;I&eMr{ptAx_!BmXJVI;xdCV03mVW}Ld7qHb-D^eXz}el_ ztQ0Z8WsAu3qa@C|zhDUv%Lpsi~^Oblpp;QPalnQj?rmgc`tKoI0>TIeu zd+ms+GN+YW4HgWOx_{eIi$W`I0MY?V*jA)mA~(b8vn3S90UD?P5MJYiR$PcD9k*@3 zF$~k7H0EAnmOa9+AVFS(gUluo<-f|?k+#NyN+$)DT>zWP<=5tUH1m7qP_3dq8dL#! zogKfcgL)SYP-CW^cnOOdQkZGPHPn?$XgY@48%ILX!33la$e4vgH&RY)VtQ*tAuH2u zdhMoA?UZjJV8*(TBDT9NC=^Z>RB*2B>DM6D7Nzobz-&T2gwU*AO;%9d?ry-K>Lq)V zf#NWGa&S3OyF)Jxl|OAyt;7XA3=MP+^#@jDSZn(K-o_p zDgdYhaKK3oTVVD;F<%0=14T0<=S!k-H3zx~LL&{0WFM8807!EYWjL3fWR`Si{oEQlfXN3! zz)s_76Ri%ZuUL~kX&6lK+t%!}?~!I?7$kgJb#XlS|=fa(^WbrIxHP(yO zHxKhHVBLkeaWitk8noIzi&3xvBBokV3AK9gp9s1=e zbmX}CF{s5G0N;LPWRjcn_{kgxD6b=Lwp->_n^RX?-`m-I;DtB$2xi22p`0-yid4!2 zNTRE8oGvOC=PVXMjV3;d$Pqx0j>IhwqsF5Vvb(*J`qWo^yM!%)A-Xp(v}DQyS5TP3 zk{BbFBka5gFp1NCOx8YYhwpqMeHNmQz;Y=r1rZKsP)(KtC!o+lgbm);2GE8cDSApl z=!p;#4_$>@_BU*=QesO~`-XZz7UoaNrZ_Zr*!A|XD9Co!nk28IQ6`Ct0r%r=8YUg5 zxp1}fF0uAUB!&^)hd$EVA3(T^2J=2Q40sA!Gd0;UqweRsAkt2J-VAk-8Hb-fYDGbC8NB2U zod4jyN`%q^rb-PM_h|Zkyyv@u+@D_3!}EkW659#o>Z9M&YP6^}{Uz^6X&ZE- z&9t#dffXqr_z#VapF2;}aQi6V z)bJ@0o2EDm+0O|L?(A;7RiPyhlK~ZYs1Zq5Q#3Iu8BjHHGtnMEc+Vil3_geHaRVXh z;Cm07zl1dgPE^}g;;)Cuf*_&C7)#vK044^gcPQX1#^p3@Fa;hkA>e?PqirTSbh+>X zQ)7D5cOR(P1qzO;BlZws-V}hF3_n_W6bFn=G@%E+eJ7a=afE7Y|B{J^3x!Vs#kK&o zMtR`7b10#wGG16dLrhCZ6GQ?Ocl~m|aZ;ejaAnE**Zk-(&V3KS`=VrA)la_h9dzDT z4JNsCAQtQ%3eA6tO<5Xf=dF{mLO& z(gLFBy1H6h12v#rHf!-KCLGGgtqt`DXC@yM5*9PHO$G=A{7|>lnRr|+-&BE<{SDOJ zPjMKgwxi4h$E2|0&O%%TEr*sGzSfxGeG7;eIG_7WlMg_jNzCkoR2@)iTV(`i42qNv z!+mZd+&lxq2ww`GA$#0whPd^8#*Ly2`TTEm;Sfq3r!uUnnD1YDx8!#tTe!w-r7e6W*lqqs9sR8_ z*q_=zq+tJg2S*Oh6&G{oeTcg-v4lSl(EOA5&bNPk4suYs>c5;b_Fw#qB^PbpBty^|Rt=wI%Hhr?G1#Z}{}}k63_pIOJmnw#~u6 z>8$>vH=MQjce&BOCFEZjvd@KqwViVaqh|kkwD2iGIVTI9`m_`dmcq(~iw~qXRP;7k%EAK<( zohUn4x{UCtB0wW^!<`9zD7&P)P2l}S(V{9m=o2uA23iI%!u$<{{tMpQ)K6)t)5rToG53T9! z0x(d^CMcOTXrKzp9+_& z&r*R<5wAJ(My)#%Dk%8Xdoq1SseriP5>v;tPE`RS5ma_2d)~mxvqgL772!9zP40s^ zR!pD&B0bcFfWGp8@)opF>jL{I51W64ea(f4bYk*c0jcxS2KiqWM3s7_)USR^ReO2A z`bTxl-vJ>^=KKzcj&8Y2-hYiL_OS>8_%4LSz9Z>dDTDR@-AnJj=6wS(6Td2=4S#xF zgLu;?(V4nCJ;{MMcEn)SgoBqJPLGr<7yvc`r=)fqpMrrg2{IwfKB?;q9xKRf_s+)l zVG{b8KRWn->>CB(zf?co1Oe+x&ir*+{_54fi+V$OekL$&{v=-Xx>@O82szz7%ERGT zP@vi6cBokWZy%5wi%7D{ul@to62S}kuPS~Z!an;oE$;VTGv9DWW9Gei|9PQYswgya zvqRd{owont&QASn5S9F}OO)~lFpmy@;NF*!lwIBHUE>)pzju^=<-U(0h=n`ooe7SY zlREynb?J4{l#YkyY*Uv&kgGa60E%n9dRzcgOMk5BuMpt(U6LYA{-XB6ziv# zyF@pgq!82du?EqmG)9G%++i3lui7YDSS0l{`4Hdi zjI!Irz@!yOcNYj)Fd1b&W*dw}drF629e2g?lz^l2^3$hK`AvZch38h3i8AJ%)OFL5 z&1e|3)Zjj-E20EbwoUlZgjihrxLi6MlZ1~aa<521&lla&q9kx&UoejJ1XMJcYqE%( zH&9$S5@9s&2Vk}q0JYOS906AF!~Nd`!dSlC>oQ6ZAR31xwWGKrh}b>G4(jvR1f;3S54uOd-A%37t&bx;g?3Y`Ib1+53x+U~q;5ROUl zdOgR51?n7S&SOf0LR8KC9vb%02`qrqyHBQ7!ZsaEQj_FFyl~WZ6^$6$-L|%Bh zA)*f{eX=K-Fw9L=O>qEa8ZqnY-QnZX3_;1BE_PfmL|pZ-bivZQTks!CK{$aI<$VNPNphPwQx z5MvNTk}lVEhma|N=M)YO5o;_`O>esNQ&Vr@zKBrtW5=JD0gKOU&UXOJ#LL{K#_r)c z)vFn%GKpJGL{RE#pe6tWaOUSTH}K`lN}8Ovv0X{7BuG?=bD2=4rEBIH?6hl7tw^Tc z@5Zt*w)^G-BqRBhw+?c!R!ORg(ui(9P#a}szq=9(oLX8ac6Y(U-#h6pO!f@|wk>2U zVJ68E`B{lWFWQ3L<<5ZNE`X!5yJyJ6ZcEK#H5Qv4(RBXaj-)=!OS^3wHbd^X2ha0t z_dNx_>Y?jZEfuzh0Zahh?gc>7NQ0}-)fm$*uUk&dtD{&pRz|F$*yh%3YQ_Z?WGBky zaW8~Oh0HkWPF5;YM3LCA%mvHiF;|hyPQIS+6}(hCo$M=PZt5Te+dYq1oP&}sQimB7!kpkac8H5&RLKXz7NSL zw-5Bh2`ssor3+9rL8gn8N8SKIlaB$EHrO|r72!9+kQ1-fAtv1;joT!gydj6FXXo25 z)Tocb6Q6@qyFwIg3mcIere9RGbOOWzh%i5&Ryxu#$FX0U^OJ72ROTk;R`dDUHzwNV z@{=rC*9&k-3K{Vr-%f&_4F*emu=verlViYm50k%}czmx%Y6f^!j)gYrli)o)u|X-5O*6t6{=ME z)$+7c!Y_=m)xz$mRul>wqLClj%AD3f24F}S_H;AY)>=CAMF{!>c>`ylL`MLrQ=>y~ zOJ}d0tP}EBMP&m)jwW^0QE)k>M-~=|#NkwCp-4LugY5i?lk(^42gF%WRfy+?=|T{l3;&nGfx|`5AMAar$>>pEE9P)e3ljB zif`Fpxbmt#5F3(GxA0s>NCT`lB)mq8)%9l~(buz@Cy=YBwhU16Pn=S-kZ?FGbA;h& zEGb5Us()%wlV$nIJwcF{w7ykNJ(`%;Nk~91mQ=dZ1rjuC=K-WE+PZd2lq1t1 z(IJ6p0!+qU4~Nv`(N792vnkZOd36r8wJj8CaAz+?nyB!&jtDVSL{6d@c`dcc(9c0e#SYgj&PZUoY_MVxuD`cj$X2(uuCVbeZI?w=S)t=f^-w8`Wy9_0j zTeU;4t~MnKW@-$`N*oeP8MO7v9Lw*Y66&g)96Fa7oDP5Fe-&CcD%mjR7Ga>*? z1CYuv9Ee3D&ea}CLsB}u>~Jaqclr=|l~$rfOUHHoU4U%d^7i)TcP5_Ui?-i?aixcU1o6{o`I2HsCg__s1lSLF!-TU zwjDtT_2Sq8z^@yo9;sOyh{S#6J)Mr4gwSvfgfVI;sJ*sOa_5FYBy$L`Q=hi>`wwKaa z12QfU4Qt}oDx1;(q9_oE8)(%kid2Fkq6rW|5D}?>F^YglU0M)Dty)(Q4JZo51i=jy ziUvYJmR3QQq6ij*eCL@-*j%gL`}V&7Z)!u5nan)PdCqf|-#O=|&=Iogt!LaO+bG3H zL<907^Twb6lmR+ujKfo4QH>2n=kdW{wJx1Qf4rh9NUukR6^BUEF1w1kXBxylp}}J2 z>TpPGO~M5NJL|9<$dk!&7!S~_lNxB}#y5#{P8wV56XC4vWY#%5VV-X|SIG~C(rXJ0 z+a@E(Pu;^pfb>8zqCG*2YltlZ%?C^kJ{h=(($$3Bg%L>cw#AB z2;jlAa$3XHr$>#K>ExjtW?R z=nAcot$ zpgQ%SD1?K9;D=rc44RXEI?U*6f~LE%5Di5TG^hg|Y&2;~$)$(e{Ff+V+C(;nQ&rY+ z-P+PiL;8m4e?8H>mYV*3C+-F55voLA5_ykLkY%~IRtsFcFTMU#Kkj6?-$Z(vv69X| z;BVyeK1wLe^pd1mknOnIn`RM{EYe~-uOCT7AKo4YLh|Y@uylY@h@3Q$C=F;|;{uXU z6wCde{SKttvyq|w%{niA?xKSP^Wg_Q`IME(?NpAG@n7*mc$w<&_O?I1@B5(h-Sh(R z==V1%zx!{GBOH+Xhff-fcAqr-zowjDNdSoK9<^_G2E6?WP_)hp&i`k^>+ih9ouiaC z-trgRIXIj8cuv88-wxL2&WdaXAA?%)1S_aIt;2VS2OG|3hAe|&(}PUAgvU_jAGMM9 z83v^g-6NAq?D1H#x6J#yohB*+(~bXY`i~o?7m43PsCoG(Ea?{_+_Z|wqL&%-AHPv6 zUE1$9$8Wg`kRhlDG*q1GHu}Fzb3N4e4|#{O@_me>ySlQ=xPeG?1lu@b6pM0|v|)da zsBaCRA73b(x$*yrA220e8Un}&sffxrF##M^0jt0TC75Tu4a`1=ICF6?R}XV0hDQvh z;}hdZ$P0nIQ0tg9AS>`6p%QjG38t%{#@4IJMA8iJRqrkqzqCd{uT^+IdgXfVf4@VV zp}iUlo~tToHvCZ>(H3~IN%#bw9hm+IAS(ovw!cJpe?E{KywqmAOkLjA>s1yHtjM@>0>c04i3(K(ybmqP2s+r3bn#pp zg$V_RJC&fI;vrl-M>Ug)R^ujlikQ{f3@tC?Vbok6IGA#^!833ktl?0h1p{NFogmqr zwo?T4ulRKLc(s%ijTX1o>=a$~Q4rnjD zpydpq-|QN{DJa4hDi_@IK_!}=8I6fWJ_>>>A>cfER|wu&BVD}h>&l+&^}CA#%~_TM*JmW(?0OxvB=iv%X~%D=vRp zs*GB|O_1u}S$VF0XZ@2(4MoPktFfrL_x7g+Llh>2jC*!WDFORFc$lP0vMU0EI!-N~ zv7H6p{;cAPfHEud12Y=$9mD&2FG#oGn8i-qITw9Ael_T>^F8o3Qr`YUB%Q)1#S^8niPI6*&sm57Uu8)?`^8$ z`o-Aw+jJNOn+0by=I`W8Y)+s}9_ddVRXH}QVZyEHUVN!4sXENqY$@t%T)>z)e)O-@bDUGnuYvd85#bEs00mL)4UXiWhZluxrb zP#y?$)@l$j-gE?}`DL;sN+{JdtTzQmA12h{>y8&e)V2@`bWqh&zJ%NdTi9`KnTFK;#$=O>6C-EgKm=4JvK`95OfqByyPdu9T z1(@x=ta*qvO+H>_eX4A&UjUlC8B;p4Jnyz_sIOQFVX0GPrQB9280ABzBrL{fvRF4Y zuMK@MCh*u_INf$HBYSysmP=EqI54!eSyR>~Uej8-;b;UaCl`ZC8)8;SX*0fxY#B5O zj}p!osm^WI6jOFvgnuPThIsVx(;t~M2*svf&UH78)PzcF)2p^u4sn0fN@^`&8L-3j z!?XE1VKn`6?BK-OpQv2E(Gu$mJSmD$+9xD)BqS#e%^C9=veqa$s7OjEF+Vp9{)X$L#GN{3I0HW1qj zb3|mO6?^w#O|pH8ySmuUT@S;cfYEZQ#*Ip-8HcIUAkVB?xRJy}sxrjXkDq^>vvr^^ zch}QIR89W#UesZ<+&%IUY~`$-5q^d~K>|oBycYBcsXk0PAiYq)oViyI7zy zfa3)MV2G^>_-RwwvbNTWKxs&`UPHr~t(l$8!2nZhre<)(0Y$>BGGHQ<9Cf<8L`Y*f zAB7|i9t(gTsW9|>D)=ak7~?5|@JO<@woT49yJT;%-QcZ!2)_lu_@^qaJO99Rr>IIM zdONB88kx#Hr@eNiT9`$B3)to*D}}?)tW||7n^RQFo>=P4jlJ8V{REX@w2rX6Ws;p{ zDYVjg9P5t9{iis@R$?MT6}HaC&P zM6z7t8*sHVM4tzc?F9xKIz$I8PvIO!P?YoH9*%g_r42oj1?gx4iG4C->J}%(6dDLED)B(MNQ$2I3 zBRyJL7Pv+$P)jpc4_mdYAx(Q3*avbuI>k(vW2>9n8k?Yk6vAK|Y!@>OL8h<}(je=A zI}I&G4AT)(KSw*8JB?H;rc$?8sy@QR42u4C6IQx@8FWNw@4$-TUNl5W1;y3p3>mYs z`9m!xRPsjvMtfZZH0Ew?>h<5ASSLVcoEuTCz~+Ig#6xW~9uIG{^_fOssn#)b<1ar! zK!Hg?;zn@70Mm3yC~!ghK>_`@gaBe2gz|Kd{^3&Vm1}Vs!5B}A2lYJlIxsEaPbn$b z#wBaiNHIlM8m$e@GMqpNYDhu;pDpT=lDh-ROj9Qs`FM)ERWyx?(T_u(1OoxQ?A)F# zc3wD~Va(tq?DM4mkghuXbi}vm42eD~8CZM-i|KF6$zYH87v%N`ql>l6>`Wfy&rau& z%D4%4^ofKX_`c4SmjJ>dt)(9C1?mam;h%Bo6x2XF^5Tii3f~JO9xCe7{1)HX#;LN- zcu}F)BD!adN)!v(2k|ez8RuGHX+aUImd?2Jki;nfBL8 zy=2Ta(!e$>P;VoX)zz$XNq!khN_OPPPUjq~-nwZw^iB_|4GC;WV}*=tDB;CTfh<4l zaNwUN5+Rkx4j()PYP3=W5Y0c24=hx)PQ?dmuLg64QnwwI$r8q>X;!3s5t*U3fBBB9 z^uv$&KKg#()l|J>Lj+UeI|H8D3Jh_1Fv^Q}_T4@SKj<)Vh7~(=9^RWXNgaR`TfzzsY%zqQl9%Aemd4xt{>l9WT~f z(kX-%7G*eere23OJ03W;M~K$rvtypS(V0SSA~=^Z)G5f`3Fr!UrZHu;QcLG>Iy&bA6 zN46n-!{NB{jSN&+wxpc7l__F|Q5CH+9LU*3Y$C0kpV*_gk)82e>z5do5GO} z-KrA2O~=HOzCX-NmDGA8!hfZv4TTGdDKHzpyFs66J1u((v*w9GPoVs(HPkyAMO4`< zzt>oU66bjKSE~c7EzTq)-WSQlx_qP}oUxMVeGiI%1D%f-1Uu<&No< zc2UtZm@qD%G$eo|N>OpXR-#VcSqX_{q&xq}9`*@VWps<>z&5G3(VRwO_UvEZh+(K( z5wq~SXZvcyxyMbIFdmjf^U~&z1CO*`QE&YZ`zatui~isvDb@#|XttTas<$a`(z+ zj%zpux#*IssG1Clso2@wV27Q%g%IVjXMloIM~Y=&a|;f?V31<9MJopE4iy z&yM3m^}EPzr&lboJit0ARiWxv$CFzrK7>4pir$ClxypVKuUnk|jB6%>JTk1k2OwD( z;7ZaaEIJlc6Jn|6iBi#^Id$Bwi6Ea)$*-{qYq{6hz+B30 z<}$gfmWYGDDGdxrskqF_Ir)tqPv_b*;Df`|giwucJX_#fwO`EMH`_Uq>lkBh|)9nN+D#IoN;~OB9u)~ZsEUgEAoo@3K`RSF64ABcv$j?wsG4|PCXayH5wiPrP zP$U~Jc!L>CE76ISIefD^sh!VgO#5{iXK^qM`0R+;tEDN*rJxLem8w zs_=Kji-q!Z2WTkHilwYX_x9=It7oI<5(0GCdwgNkdNl=&cApVH#38`uctd(DTFM5& zU!uv%)`G_0Lt=di1Z=;3vX1ncW@RpvUgqHi-J=N0RcV65!Om}sQii6`A*&)DPEWgG zw#{||DRP>^p`oxukI(*jW4CGEexI50yyA4GH3TIR1rv5}!95{_6JuO;_kBy8agFT1 z`v+e@8ZIx;Fv14-?{Df*P}WDTiN$(-9)^#9%6QgGAcEI^A=Y3gOHf%}NXq$N_(p4& zFQB9UZu)}%Tor(i)iTxAtk+Iq{}UGt%KtNt^VdD)e#%%LzM*{Nm(SG68AdnH)&F05 zX&Qgw)wuN8cjd)l;XG3KDWE?cH3Y2d4-7c55ENbWrvi)z(@Q$ z=04VEwePufgSKhJ`ls4eT3cJRo~-*Rw{Q+gq8E9UWYRwV@r*1|^e*|&YmQWuXVorQ z*3LCieK&Kyh@w1f{jxWlnhzd}XB zP4ro1vx-P(^q)3ao7xvuRK&cvEf>*hyU4oFvNP{*Ezbz{^6emx%2m}gy=5-X`l4U( zbf32VFMjwv<-~*q zaN!zT;*TBiXNIe>^Bnip9?SjV7hYUX6Mb_tbWdwI;FfFQG5Tf<{3(teE4gf z;N#bpU+Y_#O>nig?rxtsd=2f>hZ{L~ar`~j8ar^<{vJ$^9XP~p%KRZF6D=3nOr2;h zo0dIlnZeG1|6{vv;P0;(9E+ZZ+xc*O*3S23FZVEJdIWea_h7AM2N};_=kAY&2_FOF z=^kF5tNisRer;l@Y^*I}v6)skc#4E^QPtxkI zJ$QV({2M=97*H!J;!mHn`bWt=^P;W$pN}ibYFH+e=_HU^^Y5rETG*1McE45n*Me#ct*Uxf{&*NZwrHib7nlc&{&1pE@(cE2T~ICOuZ#C6djsud=$vbk)$?97ra zHhbmK7r!q#EAQG{D9@$;IAQ9GpRAn=s_&iD&v-U#Pm*tz{Mmlz+Mney@?}n0FRn~I z`)FrFsQhtZ`)rfFhIWH$YUO_|e_@srDwkjAJenn!3-|DzU)aMwEtj`F`!oEeZQ&fb zymdsy)j`*%tqzrUrZi<^`VsB+?3-hk<#q*re?9BD{*RxB&MRY69B$poJM?v|zSh`@ z-;5CaHoF*p6~;G+Grt08mzbjlhV#?I-C-D94pe&u*|!RgV3T$hN; zNpiXIyya8c>W7-FS=jC~($JR~Oxsmj*b(f-xFGM^R;$-}R+H=>KV$8jBXt#>Q%1SA zb&irR4VB06v+AmhzpFUi9wYCHgN{EBEnJk~_HC$qXj(<{4C4Z0`Dx?qvxV~Nw2l^w zHhJw?`R`XZOK2 zA(#IgZ?=m&GC91{Sbl%Y3*FKgq06N5Kf_7-VeFqDN#rv&hCVmWPih_EdR8vK?;srT zsf}QkM*Q;=x9;tI-ZhACF!HfnDnA}ka)z$IfBq4f@u1F7k@KAMJh@!H#8<-AEsgne zFMr(cpM++g)-82B3m3Oaxpu*uc87#Mj!wF=9j^OUc0|T2Tymlzw3e}x9TMu(8B($C z?t=4LC)%Hyq%>_`2F$Kuv|P9=YUZa;+Rm<-asEp1{)H7+LOUMLX&x|dPE41)OWxu7 zv@2LXrzP`3`n;U3y={dOxl2(|XUO=GS7)4+7Sq;T&E zo2~4KD~v+vbViuk!Ei6miww0RaR+y?MWd#bZ4OgSFeRCUlS~p!!pQoff#i|lJcYb5 z-PW;XNTJG*Kc^)c=v?|${+G|R5o&sJJ?Q<5bB|&Um70Nd3llHjGyfkh81yqb{QZwv z(B*eNcJwvpe8f*4duP{h<5!jl|8Ksey)o;_`-;!#ci`#&58;|$r=AhtH>W6;)<^$C z=KS#gfJWXg0ivac^_$20KXdjTZ{0gH2e^;)I}34 z{L8~y>Zvu05^?3zuPQ9gJeRqUZPRXk*($ZT{(mVbT z=w|1;M@7BomFeP)W{c(>i zIF>a_HcxK{*<&Wn+H`ocnFU%!kDl+RLaXxf0lP`4!`jN!5ci56-iOU1ygdW{0iK z=uTS_wjPN$dy;l7vOe>?3Pc}o;3{Pd5Q!vyc^5v7eFn1956q43g9n(`X-td!6*%(v z3*=qU>s+mCb!NN+!gG7n;$A`wCWqzpdI`z1?%V2st)Odh`9Q5h&t9KWi%tTOx ze%+v_G96+|4q1J{{Bjs1gIFoR)2~H_d_y#VAgaF2sE_RtqM+ujh5&&Ol<_r0NDzUM zfbWzMLP}Q%3Jy~64#h7HnF;1uq1dw0tN2j7ZMpUvs(O@-yC0dp66(H~WDaNQpSy&Y64AN^S0yqkK`v~DEl>-`cxDa4n-OKbv4S}8PgHjp| z-}S`u;KS9YUQhH@oUX7JC^$kB!i?;BkdG-B63y8+W8#e)pa&ZP`jeXir?F=E55qQk zpGLJK$qqRwYCuy0!OAjIjVeeO2W&HqT)$hDyq6nhH2j50UZ%((H?`!^E}M9Ea(3L5 zed(Satpt_VdqHiI?#i);I~8F%PZMQ{Ptmq|GWA9yp3VwvWC6- zjFl_FS7>Bf;lzUOK>_Oef&Q3NRXa9vwe|Cu=tHzA+|J`wQ|112L8dkRIizHJwqEdD z9w>;BuSb{|C{QRKIoO>P69r&cv3*MNwegfNz!^ZLD^-+y5%w2=b;B?$$9#Sp9f3Wt zv>=BygqeM=^5g+!rD&P{lbP|Pd@|y_nThWnG<-Q6+B+?34zauAe2DXAes+}5 zh-T$Z7kEI9FDU-$D|Y5k1n#7(Zer6&RT=_YIUrVL5*c~@Ami%SyKiaG{)8fI$%0M< zQKfLGs#F7rRlUh~TmZjDwXqcVC*^t!Jllq0 z<&ejz^)v*;Kw@*9a@jFnU}*&ppwF6R_8qW1dDuq4rov}RM3|!>_Rdk7!O+Prni97g zYS2Rsn{X;zf@x`ZxBwzr;PE*J`t0&-0Do;bDV^N9!7^ghG!v1U@Rpt5ez)!Xbt3Yv zRIKIpCkf%?a5QlMwT<&#DRH}nEn;UioXU{mYM zVf0Qtu^NkSI^J^cCakrhS?6SEQ^gfonSH5j<5HGpyuJEE#nhsj)D z2K5fnGQLKUutmvYS5z{ToWOaCq|l(U7Q%y-zSneT=UpfE~~M!QzKXKGm0_O&zp$ zmJos(e3BuY;r3=gCrdbg*qob0Pu)2oAb(m(>0&JV`X*8)v0Lgy0EuKap@mQ!|1=Vy zpBYV!PeU47JGTN`upkO&!#aoy&g?KalhFtu%$%dbpOkAuxfeZZuSxW=jysxv10!}b zR%>aXIHa?wtxa}C*48R(4o#sp`*w9y6`e22NROsHhoym1m=>jVtVbL5SlfD2ja!eV zR{`vmUvSDrqao6*${<|T`O#7;CjORB6KO~$oaWc#`>J|Qj!6Jz2O}qI?q=EuHQ`#0 zTR6n+Y}@yZN}viW+`VDvpC0R>jA?}HfqBVRlfxM!{zcBGOgyE1A>!NABV*QO4++rU zer@^$Oa4_t()M%*2y$x$$|pHxW%Zu5anV7#zhAD|SArtqo_T8W3_&hUO5N)@60Vqf zrL7VN*u${=fNuiN5^W~8Bf^PM5h**^JiwiICZoPjSn4{Y&#l(|Heu-{$*F;pdrcu%voU+)=~1xeqEN#(cuR zL+c=r$sp-J}=@v4<`93i|1xJz9{MKF{aelkTn-kgCV(eR?1 zcxX=t3XPf5*c1p0s@8mR+LScM{mLzZd$NV)62lG6aI$V_h^{hfkBVt5;zF9|&| z1(~5O^1e?kA1w*TtbhWve-=0HPYVbc%Xv}|;17c#_rcFv1G@Pa#7wO-ub{Y-%(LD& z9YI`hT|5d*QS2u4IT<18k#;{fERVi_f4v~9txIZGPBW@_%vGmVF`mbqZ}_^(a3I$T zkju~8VsK&+^VAtMiUCGXQMa%-PqD(I6krQAR8gyb#nER5^`Zep>z-JB8|88J<7S^!WCTkfFN*< zn(Z85~m#)iP&xu%_2%jqqtiL)+mT$w1{KE`u;&l zaz2H9EQ=BvdwBAnD=zCpA=xRApm~y8Jefgi)z**tM5saQU=w<2YVt@(&MD+Xns z%Uu)L+N_fcb(vGByn4_tE(yy=`s<$=ZYrc%i&C`bI#EC8pme<4WGOp^3o*(}CPYb+ zS#D5x_S+NlOkez}SM%0h%8Mht?{`3Y^u!I4LF{v75TQN>+ zh_2K!v0%0dDtlc2tDB(Vd^cT0(Q6s`jt{MnIA)m;GYaRG8Gdz6V_?}YE84^e(pwCX z!Ku6(5alavi`#~JS)8yC-%0}Z%gRx~^U)8B364<+ax6$|zoY`*9rCc_mVtoyHK&*x zAfsp~k1G!8@RF|D)Yy@slexbQO2KL~S@I6CLm5vG<2p1$yd|UxV(?D?0v4KoJgjmk2{6+GGRQ9=OirZYN&YTgseFdf>+W!m z%JAJ$Dl^9gP5-hdm+_6X2*^L-iS>m*kDOA!NA0OU)(HLP!;TSixN8UzfEc9&qAc zWK*^vR*XULHwdHI!`wukf0mc1sY+I0d+9?)KY*xbj>c@7^=eT7DPKoub2~%2QhVRk zdQAKFZKZZ{rO7(p0#a{0OPG;HC}%DujnL zB0!2qbLV9y_v;OgT+qA0VxT(S1wz}S1RPU$L&yVc2stuX5e!;3gqn#sOYI>P@A4T{ z>C{Aubo6O~gipt8Y4Oj#m>~r&aMF|FSv_sV5;gu()spM{Sxwx8Xm1H)risKPe;eOH zsIIOK;nWOugNSd_RMwN9OxBn%V9P3{y{R74TLAIW)+n*ZqQGFJuuPE#Z=#y(F7gfv z0Uo*-t%wdwv_G6(StFes!!m1Z?6_!w4+hi;$G6WHkTRrbFBvB!C(CDs*KI7~^RE#W zhd}PB@5J7+V_90It7R{II@)w297=f|UXA5VUI;uahV&-a%2-ZC%~&8N$`F9(Ps-ug zN4isZnqmkKhpO7ansk2lZXRr-g7g$M6!Q-P7p4JXIwY&08Gy0H0=L6a)y~bOx|9CY zHvPIXIfgvJm!fYkSt+vcoC$K3NG+T#w6o);6DBp52dUi;X0;{6>HzDvggNwD6nX{) zt7n$fobj337~~@XDGC^pZ$YNeqSEgF_mu9PN(-~^e{Y65m*ZFzx~eR z1_bC0Ztm6);O#^qO9mKP$k0pO0wOT2#~!Y@3SD}_ibPmnm2K($*Qoagq$CmtQY{TM zyN$s6cfCXxp#Lf!j+4wXTp{SUjtqb|1YV~J?#T_?}^ej;El1Q8f31E`Ay_UgiZa#kV;S=Kz&-kt>nl^PE7g84yF0zu? zufU}?P0(I28ju{v1rp?;?&hZn_HjUPGuvRQ^e&}wp;1DGgYPxu*?$4{CEowoSwd$} z?r`t-7n!tGDo&O6xR74OEZ+G$B*;Lz2Yj`Byq7776OcJvkoTq6(IEpOuCh(`%^v-J zZ{UaT{oDRebo?5;CW6xcARGn9y?|S}?+)?zKShGx!}+)%qu6Lv#ynxizY(~Umx~O! zdAqHUCiuDo^g^rGol|~)z9GTY;LTaKkuve-qk<9<9{%^SNaW$`-ygl?%WGM&A|m>K zJ=*N3|+v;z2b zl5{}hsC>H>Ff%u;xB1lqVun!-iWuMe6d-ZLi#zq4f`G_UE(t3I3&8~eWOA=QrdA^@hmnE6bJXZVto53)WeuyTHG@8VG&^FxU62ySpXS_0&_u(Wq^%2TUT*6 z&L2QiR7bGQrta7muD5WwMHqB&#~y4&@g_ts=ivvG9j0GMKSO}f?+IbCc!;0<$jMdX zePA+0sE2dgBrOwzUc8%@@|2 zej#C@HK!Pw1&+5hAKvvKswn}N8_z;{fPq(G8u_=zKgx^yh-E&)|7~?c5W`r3L87-e z3mqYEmN@XUU{D4iBNO?T|IPoFI@C$ux@)}k0#JG(0j@8y9`*|*`ez4Eq2)Z`U#z>G z5DMD+=*sH-3B9kW+&=_(gM)DY-vRyyyhnkSM-azki@3uF9R^!#RV27N1;#JJcN-7s zc_YC34EzZIh&f^~mePSmO7ZXtBPh!ET1(B}S9U*!Y|)(0 z@4ijD(BAD}H@&^S3edKKMmivQVP}#dQP99Yl=H-T^N8U!!053gO*APZMJ;=96!chE zw9&zKFN5ve8|`B|FM(BDZ(0=j32arQJCXjt*9WuPXW@K(s1e%s(gDm1TTL3S-MH$3 zTjZbvKL|xyt+KxatZslw=O}y=*{FIu-_S+9kg?+3M?1#zXaoh?- z&{}woLo6u~35+8!@2#Nz&z?F1kKdqeiF0Sp#KzjQ!DfqoSw*86z5L@da|KLWS~A$g zqK`wJIrssxcA>J=eJd7kc`R3!)xc4VXnxv<-(pV>QP2zgh{<=J=Z>$Z)jtj9S;QUG8fTH)464|)uM z4k$2w`(bfB?$v>PEg)z#k)Infdg6!xh3T9C+`?~QEKZ;=6q+9t>04ku1IUQ?4*2<5R*pOm9W45dal zAE9qzRMF_q1<~edP;Pn|q=~Ph%VgzM_?Ri!gel}h|H3Am9kopxPvehL#&RPE6*^&a zYwE?Dy{A3plF}Z)JJwUNiv@N@D;*SPz>2BQXi$0+om1y!- zK7Bm-RMnINGb#cXEkyI#NdVL!g?eL?pJLvTsf}>pEJhjzhGp^ZJeOa29+O$#(b&-B z-4xBRrqPg;;6$@%gm$B~3~B2z>@&z`DTy|s8Hi1-vPEu{V&({Syk891tCOe2k7}76 z&dwfwcVEmw(UgHU2@KlIlriGMp3UGcQV6>M1x6H)@Tzx8@iD9v2dRL|>t!3xdDsNl7Wc|}bbh(6%B)~wlt zDYz{k%vUD$%xJp%K7ogN178%r)t&Ao7zy6nNJ{c8iz!=c$EZ@LZA)i|yKDdSNtn?m zJB>zv?~mgqBI)pc~G|%%4i=}4PH)WG9bKQ zOxt0>-m03N%|}J7!&P+{{!#->VOEB8w*gRAK*5$gd`E`pE%8cR76fSUtW708fZr@n z!dJ_&Km-i8PUYRSGz2&slD7cd3rLf3lkuFsP+_4e0~ld>RqOo@`KBtXQh7{;T+mtJ zPnUOe8J;()evYkf0GrznQ|}`D>fw$npKq)J7S~|q zgy<3&1pP4p;A=JEa+Ot{aY!DGVA`iu9C>74D*S1+ENR3QfRN}&gPRMbZP?Mo^46cU zecH5L#Q2=W3C0SJqa5B0+E^2*+Exyu8G3C3pb%ItOLq=AT4Uw4-hKMO;AshkZp=a<^Y$?F40679%DF>AV3Jg)@p@q#-YWwodw> z6uys9kpu!i2DM6*T+lD5Wf*!7NC|w8w5X0skG5_ER($`$`6}zSfJ5|{P7=Odb~IE! zM;j&-O#!$Ie}1~V{*K8@nJ(lrTbFZ|+L87QqGC`38=}M^D{=OxM)@p@gt_sl`*#gD zWD7Y{b+2z%wX@dH5Bo|R{K36N2Yestf);ln;2&sQS>A|ry4n&5h{iLi>%|&4@#1%f z>No=88Mht0FS`0ho}PR-u!MZ#u7tzc)56WTDwfVPWLgUbF4HVg6Ygvr-Nv`zV!}T zCmilIvArpTKG0({9CSx+bcXsN;w2h94v$KnD~SSen8P655o^%u{|F{!d}(v1$h;(n z9BvcF;m1#+nsPL3hN)v3nmr=3eaJV^8rVAa5b66}WPrh)8N>(*JO;}-2nIWK+eGMv zFbHyYd(weo0J;s(E0k2Z)&=o_kXeAh>tSCsi-z-nvz3+8?o`WU)!g)G#uQaPKxmj8 zE)+!hMvEuBf{WXq+Dc+8)r6Ho@jN$)Z>7*sXzWgtLT6Z=)7kud7M<@35gkx&dW2iHrs=L1`Yi3Fk~>C(Ua)xSC7d|&>3Ac`!r7aDMv}A3;vzaKGjLP%omuiC?C6ruj=7UV&2Kzm!y3C?7**7OVTmXvU0pPL=XJrvKk4fk!~eWYo>;dL5~aFDrp8|1yOp#asx6F` z8k~FBqn;efJPxDX7EBbNDW=xTf)Js#O-_vjbl<(Mrt=RAyNWts4V+F~;6tF=8vUj| z+=CNXw=N_Q#6W~$R8~{Wvgqn+pD00OQ$<2^VTJ?G3nm z*cSo&=T4)EG{qK@tyHuqRJ>I;jd$awPBY0j(qKcRNYp2Msai7obJ7sylGu!dl#HiA zXh{Rz+>jy$gD3=$yt=R)pf*t9MV$8GWih^J0LGJ=2jAlrFd~C)M2~cVDUOArF1WNs zT_gitIp75^7YaP_v_MTj8iEg$_Rz}cIA65N9xS>XcS%%bB{Y{*z*|VEryNgrr)$FQ z0m8lTx@xdn^_bKXHff( z6lKDn)=r`r z6wPQY3ZQkFd&#O8Re%Yjd($k^1m&_S+WjjmO@(S;Dl~}HltL_*Mm$$Yb(d7808Wm| zl|)h^se=kpAA{z=0KSn)y(e4H9d>Yi!*!U0-k&7UNi@;1*oxKo@D?(BIti< zV9xnms+h}Mrw1ZDmYanEWmISuIf_}>M*AcTX@XnTY1bGAJ18lnYB6(xxw{qF{#?z{ z2wbfaj`lsba=>MiAI(=Ad`foK-v$8Snzg+Irlm;)1r)*P)g{2No&cJ@$^*2_e6FqpDCaUiV4GyKch=lZR=uw3(rRU4(-Nia7j_zwbL@0?@aV zqPyQnoc7=OMMI!yW;f2O`%O=~2q6)TM(+c*ayaloLSN%rJJM7Gk>z>|h}3!Q;~+4) zPQXM)5%fRaDyUy*4cX7JBMWhh2C`7#W&*`PKvZ-O)t~|Id-O9kE%s5iA6i=n5H3Yf zHB5Uz^0q?;STCd)Jol9ydD--I=;9&etX%m93P|`U=kn#2^|K!BsZ`GU1hjx%iNa6_ z0pH7L^D0A4cbXZG6V}`RPS<88J%1s_C_Mi4`R%xqP?t!&8VoPWG$0lojbLqnBDqwaxv z|C=f17K~#6UkB|Xr7vy%y-%8tz>&6PwBA9&Y6`|7q`fF9?E~MvvQ)$e-W-$>@I3b* za(j{0yT6ST^fvUWfxv|31#Iv5@~?|DR&qZUKAN~Js;YNHK`#*Q`%g>O4*_q*71&D- zk^T;nX4sPXlz&|EeRH%>QJEyw?0@vjGNmU<3152ezZb`NGLh2)qPp?@>vb=NZ$6EF z#sJSjypet0MJ-y*(#Y7g|21z19b{cwYYFwdK4dlh%agv70easD-K0+&_9-25Cy-qD z`olg+^G&DmAKHW93bq9(QM3>|>QF}(&wZDwzlz}gSR-;VSw zfVzat01E^75U*UTE7btUFNgLZj=*y0xmwnQAdi-726oM0Okm6KBmsI@Y8?baz+sAPXFtRM5nM0Bi_a z0U5Moa?D9U6~Uc{f##w?PyiuoAUGH7=hYfz@Ehr0oRc-(CeN%9Z!; zK(xyVnb3fHW5Z%sj9}egSyHpumWF|4X1)+LEJ7bZ=Ow#7oX2QKPY=&9`G_ngHcx84 z798063w}EBren=$`L}O98esgapvdF9{>$Ljz4Nub?z(P=?QF0`@!$Ek$r7FhRG@q3 z>y=lkZEt}H2KqRaWoigsq5mymPgknU@2t%uv)4-(qpc!<#ROTCNedrZzbYhs=C74($6- z67exf*}_9NAGJ3=Zy~0FE^`?=1O)rv%t11EGQxVB!kjVb&`sErT49&K>CquYFylgt z#O70k%?#TOLd6PFM&=Y!%sS3oN02M#B6LCCstfBN3k1(U1v}+Fm>a^-n1+1!`ai?m zEK!X$AM0A78v%e+_b@R1l=4B+DYvsfn54%n^U_<0Kk4PiFr4iVd@E~)%GNNOqrnn< z9K}l3m^p68x+xVR?g)h)%y{Tu${}mW*Y|U;K|*Ac84vje!7#XU9_*i^Matj6;2^?4 z_11}-D68$EW#Aa46_}gUPgmEilN^kP6_^A@(6pU*8Gz?eHibzW*FDTI=!!@?7|27M zRWT<4(B$5C0nnYrBTL&k`kN7a%4Q~5MdQ`F8-lkC*(8)L1AA5UaiW!@uSG&^f3F^* zxBVs~eyH+Rqe$(&+J(YOqi8-S`VW%ejiZF?+<5S2PlJeehvo|AjV?XY6l2@Bb2QqN z;uIT%k+1{PypO>lPIu%mj5vP3S1rj&2q*=;JjCtQ!sy<&Mx!P$5Gn zu%F2W^877$J11il2X5Q|Vh}PQh(onEDj6(JZ3Ykl557@b;gPaS2AEbjnOGt~IxT)v zw80s51h-KKR7knGzIgxNUE9Xo(Sn;cg`8R5k3k2n03U%qiS0FNxp!Lc=V7F5Y zsdHoR@E6%xtSC{64Bs48+_2EL9d#TQVpBoJJ|$DT(sWKBMZT&e{Ev>i#TI1?#WgSV(s)g(g0 zDDWyFc7Wx6DG8gBhS3k!?~hm8EDVCu_7u7ZZ8?|uFx-wsPjBL}`DcF@BO7~1S10a! z=o_Otg!|1iE`X5jugESh<;gEI*K}-(Pz*9!>q4Eyb2@-=Y`!E*S!xLcm)K~?uh?H5vS;%s&5l}s7vLNMZWj;%rZHCxdKrgT9F zG)O zsuE0Y!A$6tB6Vj2U&yioi4U#Dd?uk;L5aJo#wv`C=oCTna)udK2)*$f^8EAO^)~qQai$`uWSw7xPU!q{Y{9WFeK~P9|#=}A( zg2JF_3E`eW7$xM4Mb02(u7!=K^f11wMFy)$Wu0X%OPL{E2R5?A9Pn1)Bf)WjH+Eww zDHxVAf-R7eVdIdxi8LKW`p2;cCN@-wTXem}=zg@YIL#9b5{!50?zCD`6`e~$3*a+}n^cWId%b|Y z!=#cg+Nx10qKBD&CNxCb8cQ2nPdg1MkEFCzx9!(%ng9%CMMJpTgPX$2PwD4|aFje@ zhWS8gCc-?_J-ZALEvJTz#ztsVF+c+#Z_SL0y~)CdTMj`LT!T#%k(gRQcTQh z8tv;HwvNd;d`2~-A<2PkB$^a~$5)b^10&kG`P^{GHu7iQ5LF2~&R4?S&v2W|3_8cW zF6y(X&1}r~E(JB7Ra_oqg~Ro_f((gui6>MV`ZXe61+$iKk}mTumIGyg)q?T7x^z80 z9BiS8Y#)w6{yjU22!o`BnvzJx5}D5*zV%C4LPEGmm4sn@Cklsl%H+Y0dJ~a?!JEZ3 zRv=)?Qowoa%J9Vfs$3}XU(Vij+ zAU|NYmI$p@kKE{@CMBEH0|qY=Tc{sl6S>S$D6x0um~1vF&<7+CWdGZ{LYUc9goSB1TQ%q)KTV@t>^eh~OZ^;o~9qoHxUg7yF`M|zg$ zb*8OU+q={1e3||E2p$IMVUV!mEh4)>hDs;^?{0GQmT9usT|Ag?h!%dbu#`(df@I(7$U?8>TA#FnBgaqa# z1)`}v*?Yf}3LC&26|yaJ-Uhkh#q2-NMT2t;P z3$0Xm*;=P2JQ)5j$Ai-$C20K_&vB5-&LFvDK`+@adoVZgG(&EAfK@mM$Grf8Y?16Q zF^tXKmYZRAz&;$WPlD4*;?S&+mikx7&Wf2Xm;IZu9J%C*7$*%L*@|o;;g4s!VAN!( zdbUt(qV02C&UB(dz8jTEoc~ARM_QKJ>59}kC_ZP|4dXi(H5wVUOTi9C+e@SzL0^J!iuQA z@6ksC>a7j+ynk6Q>aEM7b@7^qzvaXNe?@|(_rJxpto~yn)XDh8y>5COn6ukPaYf;Y~+P#oO(`Ar(4*GtTt<`$VRK z9{bw0^Ufzg(ZB2Kx);!fAL(Uh$!8z!Ufs=d8hEY&K6s3~DVtnI8r2hS1Y8K;&J@8laQvh}7K3KEU1cwsOBDIhI2~2(GZm5E15di>Y zE(25*ZfJ{3d0yZZv#182;y&D`m_HYEM~E?rDozG}BH@9KJjDmMwjGSQc`YB=zQ+GP zaPpbw(dG-U+CZw>wU9+3-{{;3kOkC{PyQ$cca#4x{t4XYZ4bMFvKDY4>jL3!t$J*L zSGEH+yq%4E#Vu_M02BBBHwQU(|8I>Bs3~D6h=>W1nTM`}Bo3N5q>})}2+t=0X4!7C zRIKn75R*DT(f$YUHhl{T1(?i5uo~C~kZEur3Zfkh;{5nTuxo?S>)a1?xFbSi;8s=$ z7!_LM6yANSb*wbYJ#&w&1H1*3843<`{T-;#gGa)l?6{S5814z9-o<|Xj;x}voI4z8 z8@S5xv0u=Dg)Dm$bCz|Cdn<2-0FxcIwk*fgr|;~HF8M1(qvS88L;9V62Ci=FgAxdo zbNe_iqLG#qun2yfoAtko3E{D_elvva%F#DTEsAsX6@g-hH_t;$+nc6QagKV@_iv#E zsG8KjGdIe6ZzV%!6B^jwK0d+#zvsUNyYTAPsv%b=q*Ofi=Fwe|_ztt!i1HlpOCglw z-Twu?`=!0EOo7-`$(u!?x17d*yuIDG6gNYh%R>m>$&q8{%@3*2cDU?9J?W2|i&P>F zypj9(@HQvGxh>;S-UsLNblC7!b3!I5eyR$Lb$rqcN60ye;Clb2V7x*<1cnQVi7vD}LY|WCH}x-pMe)YaA1WYmKE}J0hD?zyZh$J`)s%zM6Yw#kou%&=pAVjzl+ewEF zK&E7R4e|Y%co-qK0a|Z5BXj?!$gRKFCy!v~3coHSmI#2ftH}g&Kjf|GF$R7wbf8|) zdUXS0Es+291o|}|2+@R|4T&riZ7~00G0N7Fg8vx3h?zV@4$5vUny54x;I=6uO+(WH zBnXcnKD1kJJ2X0*m@uTvgO3Lt5auN#AqS&!l+LVD?ngKb9Z#&AEWrELE2*x-l0#)) zC`xyx7{5*TOP|4AGzzs!w*a;}`gGj+4u4QL4X~CF4Rlk5YZ>i@M5IXwq^?Cq9SuQ* zeaO7{#^+V9(h2Zf0JUH+bc^-=D!OBIQ0yUs_8|HKD#+oP5|C>?HIHy;pL$}T$iM;R z91h`eCahS<)D79bd+pee6&wv1iv1`ac5M$%EcR(IP!7;Z9zJIF&5ChD9Y!-Cb*I)d zhEH=0u~G{MS0Q$AV)8crE%Ke=<(G(+a`7ubZPOkQI7C3cL+n~8KU%utLj1}SAy+5@Nz9)& z4ANh(TYR}4*}+!!T>t{|JeHyfTqrD|2G{5Q3K_=AQ})z6m1m&!4PCo)@T*f)*=cj2_m2g z5Ks^isemyWAzJDRf-71@4T1q1fntK-1`1UJA)o;Z$R;R@Amo3(8*phmooU~6Ugy34 zZ4Ebf`SPvjJL~TZ$ntA3YsuVOva^AP}ymLDOv1W z7A1Wv2Ee#;s%a)<$|ySp+1b7jwY9?dOy*A;3gL#dgDsFD1_0pSHuSx-J$+}a1 z97q@Aay2mhBAiAS#{~972;> zk!jVk6BBU%{n>XZGNa-L!cdBsu;6utW)eY$BZJK@sdo8MMZhlMs&!xqU_6?wK%LeD zCl7AllP+md*!jaSctpY6QAR|B4;g?}vkT2D+Jiydu+xO%EzwjP9th`Xv~gulh={>r zqJr9WdN%e2xK0X8-+4~e&D^GRl3gwsszH_`YSXI1XZ8_X#h5jMTM07{d$=?OW-WgIQ;a=6Dw=5uat6M5vl`5FpmlRBt-RvGQ+xE0r+Nc zyB=037w=`1BM-2}P*C)D+k0e?vB*Xgg_?Q1ZBihN(ocp$Ib|+-@pO&KG&8;nr{Hyi zy}Y*eAhN90Qz+_|)jT36%mU92D)?2%?a2Uxf@u5&4D2Aja4h4d8 z=kLtKbY|*i^1u^HI>qbz&rJo@P5^9xZIuRvGD*9pM+n2$u6uEbaA>{8jUiftq6g1N zAlp_VWJ!RqTM0A*4M}5P*{qblFmB(xlpH|=xunlNmX!+Y2rX>8H0XQ?Y6N!?Fv4|0 z16Hs6$%wFAAz2O^yNtC2DGfIENL++@04Gu#jA1>Ja9An$wj()@)O$=ed9O>i#7q13 zTq2}UG2seC=a${{Nstxo&;W9{V!oz1;6CkzWC^S==BkPZ)(jKRH5Us&t7#$G} z2KBYdA78@goU4gu4z8ep-3&E<#&djs4@O)OrqkBegXwhlPq?fMyda5cd*j+xk=^=+ z#=ai%7!N%Bjt(?_rW4YBnlrs75VR900NViHoLHHfyL<_dA4v*Uc*DaukHJ{_^hyYd zchM9|4PBbmw3&74WsoK&Y&ePbRM!nA-Rs@>zJ~3XkAcidZ!hp0>lmt2&x-Q$`_fX2GQc>O|!3EU2!A7?n6! zKy|UEE6vr#^CpSWDhiLb&dXt*k7r4T*(?ZFzLj+c#hcov_2U~zMrTD>6A0~HK}RD| zptx~WbPBo+X6e$IfEj|Q!5PROm!T;8RF#Xzz$MxP->scjpPU=83e7rzblDc(QJmi{ zKcNE|h|sEmOdCX}0oSsO?b{Z4bGY)(iY8 z8rp_CC@?JPcfP-Ogu_ZcLiKrCC|K8WGRcVm0~0WIh?G4!hx7}4#8ph@!#ZElAAr_E zGxeL=)PB7 zyApJHKTgmP!3w#ptoYNbqwz0z`1dbTF5D@FF%2`Ms_E zQpGXrR7ZsWK+`Yi(5dR~=;+9i52g*YV;$fQ=36YwCPTFm15b~Gy|8e%%hDnZ0MBaW zf%hHELK1A4QqEY0OxsDas&5-cWz1Sk+k4~WY=Hv|4b`mjv6VLDx0?*~tg?=Lj3N#J zrw`7%t-mR254cw_Vd|tmud+&g33CY$gI*(I_9zn2>XM+PN!f#V@}mp|iV#604K|n> z0DZKYIu@SipUnRj$vRj++W@-|-H%OZZCMlVHL0jErhTB;;0)~e>{fX#*xzBte`J&i zi=64Qi^~ovWYBiTVUWV=Fr)CmvoK8Jpp&gD1Pldamsi^Xz9B@zCqSha-N32Y7R?;P z7xy^gl{T=7cEqarGP!a7&N8)kLz9f>Zi7*|Km}SZ&(*_G3qSf`LeLaIk# z_#n4Y6G?V0w$3bI&5(!zyS!z5u(nhRqj4*f=u?ylUKg-(i0sVWj?5JmPhtf$p~iIj z_`e*}rdL2*8B6TLXTdeF>S*K;WZ^?w%B^J(;^GQD3j>k#9W3063#ki*p`|n2Y+x-T ztPnRCCA7Q|iV)&aqNg1LR;L^2@gq5qW<1*%+* z7j|S%ity~0Bz>40OnZACG`_xp9;j7O2!2-tipf%CoSCwqvG=?DS%rF zuyAQ5|**KwGg;Gwr08gblijihui0_3z zZ-r|RV~4=IRHfoY|8pO>{P|&m7rcz&OP4HFst{BGmD}@BU4Hfl33GUl4QWfhyYUN^ zQHi@lRRh2Bp=|W3^h2)u!C&GnV&rF75T+8w*gyL%)dif%lNEtFThEp|$#uD@f zD)j-};2E7nxKsz;4HkZeODSvJRir;>h>8r?=oNyURDF2|pb7PJ*-!r@AM&mIuKtJN8Vwc~w70%vkx#~KoF;pi!(hVf^ z|Ex%rkoiu7lY{s9a8d7aB<&fVFegg_a5k3lev5Ja-s6hnC_-e02?QlV6a~N=2gjY|Dzs$jBg6EM2epQ!dWfH4xOCO?=hS6#{xQTrdP z>Sp-;y5P-0DNaLLNa4EA&JFRqZ&!nAD*Wlbq5(Z^^kYYcdH@J{9oj-1QHnTSA?X-f58b0vDHyX zm+&tt@LyRDm`5NH%cWl*q<`jaD-x=V-m?uI{o~GoC;B`5!Ed_!3J;TdiP|_f_%0@0hPY``JHq$NHyc z#QTGucPSA}c9kfp8&e7z5@VGdtYV5RZwBZWG^z-3~KP$eKGubl!^<#;@T1KR=!C z!~MHXx*9vZ?!y3wKKs3~WROTueTM6$`kkLw4668k-M}!rmjhAqAJ9L5kW+DY!?xpL zISA!(_}THctCBlszikRkx{?#a4OGcs!#}YZ?HeCXzZpp8NCRJ3$FBcFuwE z_8Txyb3Y&Mzw<^5-WN2HBjGO`!_(yobJmdCJ8J1?7)TYvZ5(bJ4CK24hecz&Plqr6 z^bJ*2R4WS1Q9T1)YQam?Kmth6uqV(I7Mk({-m`99n%@V6gS+Q!gb)^g$WLHPw z;BGL(@xBp;F7AYE;YdRcTFP(H#UFA3Y!}67q9&du4yla0uGQ}rg+VpZ^{`vUW&Rc@ zm^ksXJF#qJdL9Hd7AqBj*h82kIYG2qq_FeNCsFF!p!Qp!_Gd&Z6y$TlhrN07HUO=j zi(uvcF)vn6^eo2I$vlqmSu{)Ha z>!&#rLkjn;-lgqeu%~VUL6tQS*QcAv zklC9R?tePQ_P$`fIl)}VkOKmNZa9ggktr3zsEwH`p=jv}q#=?S>uMK(et8x{q0QpV zkG&G4e|UYhdB|NSQd1TaTPmeM0H|197E);N@y(lr4AVWG31ZmZZV3Q1peuEyB&uu* zp7~>WP!7_Hd)xJF1C=ao@ZO^!_};huaBxryC}u8O4Ydi!B1THxB?WI_QX-G!M5Vl~ zu6Fa)y6l?4HgZ&Z-P*#6O%I}vHX)klk8IC2=yBGiR;W9t##?w7zCqhB|k>lsmoYNU#+`d zc*sl~LBO^QE~?*1ur`u1`+|(E(EhzU6Wo)UY;vxaWpo}IdG=)_7yvF<_e3C!f{f0v zsLI?&1&7$);ri9F|gRb+%j(LYGij*R;ki0xl@Y*D~6s?e#O1TZEs{kos9=SIWzz$|A6L zu+mfG&O&pNsV6+$Q7~_-5=Kzijbe)p+RJ7(AcSev$nhLoHQQ_km0Lt@gZBpp1|Csm z?vG5t4=~t~a;&DeDJQWXjGx;36p#&JHV^QZGkqk^HUy?KvQN`@`Bb||!EFHGyUhWP zoSI1&VcNGR7v^$w`;32_$N?-?R$=n`yJi(;_k_2wk{@T9?QMCrs8A@Ts1qJT^rx}d zZbVi|J)+%us%)g)Q#MVEP$!7j3&i`L;!f@eE(Jj4A|ep}SaeNrtHm9UmnD5|%I~0w z!nS+e$^M6wgPQ@S9ESKo7Y899;OPE{Ad;0ad=V?EUDj6RPQEHC$R=-W9V9DzxuVuB zJY`e_xI%d86mpUYRRqs-HUtM45-Omod&XiD;6DPmJje*L~IK6AO;{T&l9Ix_6K zI59L5t?cR9zGO<)z4=hJ%q{z`|W6PL)ily!$E@Z4OGG7 zcHriPe%zzQE4<-=$_MJRpa?%4kfTYx!J=FU^gpB1&a%}WjomAR*+*n=jR@G#R#U7m z+X@jM$`1Y3PczwAabUXOK9}#_o;z3pI~?F3is?BRHckxbEO-o)T^MuXssn5vg~m3f zvlq^M5`0?hQ@VI!iA*DzGx4I}mZngG1xXT*WXvARl&LLOqwU~m z9Bzqs;J7SEbe#weUq1IO*uuzaAF7J}b)y=)K zIu>KzR^_0q9k%ejj`J1c^jtD^BuqzhOkxOWNH98YOrlsFj9xTHl*2=ELZ(BK?xl#i zOlI`hkPesc88oO3gm6=X-2bXE#hZc%G}F4iHe{V>7SoJB_DG$nz9Dn0dXWIP2JF6a z!~UC2`Ioj(<=6E`3aB~AZ=&G=FdO&;1ltviSC=f!BPc68(!dKw7E+QtcrZim|ETiW zEbCX%fy6RICQ;bTEE~~P?qgAR8%f58#RWSXZ$M$kRq{k`xp@$8EQCgFhIo7u^_<|Q zc+Lr?s~GYxfWMB9OvmtqAVkW_*EQ0DJpoo;IH2uGA$f$FuYEG$y=ZhxeRv_Dy_(2* zvWElvomuHVGnbZqlHI`axN$U$kwSrjdwcrBmJ699489C(5DvMr@E0O$>4R4X+t7#s zrl90-xcBO^OBwZ{_h2KKd%-rl6j}#dBY?l79)oehfdt8k6p~d$lY(3)Y*(1%SLARL zO+-QMt>1k7FrPpa6;4!Ie##l_uN`z6_YYsz{iRlaID0375>th&m?S0Y{ zz{m;Jg#0&2dvghfdyJUaot5=bbLWF|SoFT>Uh9RL9B|+PD3Ki#4*T!_o0xz@i3|xK zN@S`YY%66$VBshk6|knFf_wYhg{>Nh6cQv5cW^VqoH=_(CYyZ4 zUY8-|6lH2lCU6st;!SuA;IdodqP6^@F+cG*&yGcEZCL74xC;FX#-|ZaSCxdtpHynVY^-O@QHPx z>{Qde23TPL;c_t2KFt1LbtmKjvcp#$(#yo$tahypURx}x0?uKef-PYOT{e(OB8v4- z6u9*_2Ny|z_AT(jAj=QcZzqS$0Y3v`Ca`-P0=OLlmC$q2A<^#pD5!Of$%nx;rzdoc zT1kko@_{+^>Hg?l_13~$u0&{-nL_fz4ULmX2{G0$9+n5rqrD>B$RDnHY6NanMdA^CM5uMI@4l0 zCKc5dW9?W3*4mRZaCLHjPCxdBT@~JORliuClL?VLOmj@{%Q#3L zb9tKl`!3)6fH#|2p`fxvcgjW|>FmM-C%!7vasR8Dhto8_K;|y>Y5M!94&%Q{CcOxq z3rcSsQ39|NHhV$Zj|a+^JP`nAl+6SL9z@O%rHh1xzr=so^#}%PH4rvL4yJ)mPZJul zc^A@FKY*tY^r`*{j6JD}9T9<@khrFxln+d2HW5S>Vo?qNPppc-*w|V2SvCs0f~C*a z0^6jwH|2hS7qAjw@;3r_YVra|kcg2_kWVh%?TBej1xJ!&iM!Ay6N3A7qTgKHiBgoo zu3~`mrpUsNXfjfaw8VShr|9D$B6!xQZbN^eC z6@m|hje+u&!M%78$93c36Al`#q)dJ**uOn_2a$o+=zEvpn`&=EuIulpT!o3IHYL_eV zHTny4^6yU8|Ck$YDXSLz{h|GD-5Iu-yj?{2O8VdQ@ptsZ!^GhC|9!hYOaKVIs9cYJ z={{NfBQEo+=+XbCUPLVt*@JNYha7w-rrE`6&~Sn<`~klIpDlIAKUJSQO~2rT@^>#? zH+%A*b<|}J?_&SrzY`9r;clY;aY^q-7OH$%V?%y>)t{!V{kv1+7jCeT5c_9Oz4H6( zm-#OS4+3xS|JeWUeDe4gCcxjlRPJ%@Wyg=!64Q?xP3xQIe0(|;6U>`%Jh?IJqSp&<)2!sCRm}s< z7n)YBDo8I^p4r&*aF6oz<2Roxk1HEX4K|h&>>kID{djN;f!j|rxbJG*t-I(+EJ4>t zI72d)5OO0!J9vEifRgWhPf6gN-gR01WA|LErVwR!&!Sx|hPh9VA#D(wio#>7mY_Z28>mCAw3o4XU|2@4qcx@*T3DEsQIW7aNecDw(% z^u_!eA9mi)Yx!T=e;MT$v@UE@s2`n$&Vm^mMp;n|%?#nh*4ET1IB1h!(55g$D=WD6 zx#{xA5I@tUbbmk7&;7!JH;4NAg~3xxLxX+4@Z02Ny42a#bh+P_O{NQ3@QkDCkCW=p z!qujpOBfscd^f=xfh>PBLn|sO(;f~eG8BHs&=URf=caCc>jLSH!CSn{;OiXgIfhir z*{kjChwDc*hs#huLnz2Kkh#e()YO$p-{j})=Nr7v&vdb0kpHFt!#PxY`=NGiNtsa} zI_l|c$`=ANvoACjJ`L4;I;#HD$je%vXT865gW2;JAu)Y&gQ(ASR^N{=-CVl!hC>L$DoOc(eC`Uh+> zw3uUNJzQBQr-jRxyVAD|)fey6p{{{)P#d5-Sg2#+2R5^U!VG6yQq4_24~_^^m9xmu z#2h+pMc_JUCw_0J&E~UbQ!TAb9RoLoE%gg^3TA}_2cdq2r-!=Y=Tks=@Wh5Wer%3Y z>FsZ>j%*TFa2Cwna7238s$$o%-We4It!ssH{S=Mv()(&FJYE%OKJJ#i-Wo2S<(V&g z+#jlZUEW%CtD--8dt6(WGN&mz{M(qG$FD>WV~&+eSFbopw84}LhwG+mFRj|?a7dYW z?W@Ym%E3eB%3|`7+4J5Uwf8Kmdvw82)V1i~iI4(i*D=qgGfKX4t$V?nym^-!_qE0- zo6Gwan;kN7`nbMH`P%o5Wl@Y$d37MYK&ccSWcOY@NWZ95_H@07yW?2CM5*kaRD0v& zTk|)>C1&GzBfh#-&}(>PM9k;abY0iG_e)OB*>5;uy2Y|d+#hC# zc=yg#7WWKlkQ(P4{3?FGLkK@kOZPK=u*Rd%k9WjxBanS!l!N{Kqjc@D7q;Xln@5hw z`#i|^v`$hWB{s4_mly`nO zTo&E`H^QW*{N!7sy|Kw9r-j-1HC1jGW0WVi(v%yE;`BEin$qWfQCU&`Wo=CP+OA?{ zZ|}wn&lRR?YA^Qjm4ivp@ZRXvQzLKwZH2O9QM7X0*KazNedTW^4VVtv#1uI3V+M~Z z2fe4&bLPcF9_<=DaOR=a!kDw2n;!SCJsxxBjlC$Q?|jwkD+}{Bb}5x{%0Z>FY5lz^ z$qQ#1Di{KNiy;)1{p}N3w40`Ax}Zo+>Z*Zp>y6oC4z5SHTenbpH?&f8BiT^wEQw ztV>B7mEFn#p=@bQ?U}V}`|2{+ppiV^RvwhwWb$Qr!HXN^1k=l{%FCj*?>;>k+qHJh zdL8pcK+=>0Rc=bw)Jfm`?OFSp$7haH8F>kzN&uIr$#P2b5G<1j31o;EV>8`<>H$X>%G z+KF#m!B&`aP9?fnVL zY~XST(#wyD4@WlS1hN3Hnrd;YDmWfMIFLcnaX)y=n?7i*Flh0Em#>) zvB=bkXJU9za}GC(Bh#?Wbktuzr$z6o4i(Fp4$X9~#1ZWLfE?|qTL6e`&l7L%$HCno zK-^>M%jWl2(OxSeJu@fDmKQ^N0E{HEA8u8(9cKMQ0K>yhf=C7Uv7v7$`JC!0WT*8T4M+^X+#m0*DlA7|@K)Hojgm)pMOZXFJJFQ9iN;5h*Q-X3sEH;AIT;^Z6D9SJk>ZO6SmL4Br* zzcRgb?b0Dl=>9=`Ptic>xIeu&7>^cflp)Z;3L zh{Ud;C7=SU8|qCI;sFQVacoGVraI6`G4eebI`G@*COTomE5jWP7&4RIPew}q;SToK z+XKhq?u49n>AX`p%GL4p!#Sm70T<>vfYd>X%{Sl@cdGH#CRNirl-@t_6azCBD`m;%xws$s+aH$MUmljKK3 zuvaseA3kVLR&ocU8FunkAQe3_Zhs6nQOe!JSC9uyauuX`3~;|B$r7nGB=YMnaJW>E zA9E8JBzxHRYe;r=Twd)tZnuJ*AZ(l0zt;*Q`f5u;?oPw}XGs#{6OX(WFsUJd6q|YK zq_sr>HIrVhc`li@6k0eF%eNAN@?%{14T>5@r4_2NK?0NiN{ zb=$!6mSU95xXU`Wle~AflVEbJi4Nt&5`ML6!@k;q(XxHxWI5kG{c zXDH4pX-X|~*cFjg(n7MECWr&{qG0EOe12X^@=Gp47m|bDVq>RA%#4JhD66!d#huv?v%r^*wl$;E zes3PTtu;M9!l1i9syHez!=);)DDzD~;ZK#paXk(rvnStW1WyV)7X>b)y~1`$BJb^9hvPtZ8_j&Hc8E>uww#*8)Ql- zMu$6eJxH>w*WRqZjkCdg3Vx7ttM5Z|_=@ir1QZa9t-}kJvLw<2#5b~$6=@m{$Uje7O@(l7QI zrp)kni(3Z>cA8m9>j`3l#U;Z%_p8}AHm1FIQe0M3NQsHwBR+qIq5pO~w7KH`^xn zDj7Cw+WXf~g_AZ0o|tg4iX9aJXjF7u52YY8y}icRLqyO7pJF29#=|DDuCoK|go?6n zGai5!IkwnwWG2&0VgU>FMj@|`n-hN5Xcv_$Tp;C0SjS>-xE~IW6fU}1A`07QxF?K! z(pqrWf+Z{?OQ#Sn5r}Fbg(GbXA*h8g@fK$*N9=PiYdvwU^JI;bzj~CK$)y%`SxM`l zy9qM&H4{cCo=~RFw*WBh1&tJl)6!`%)@ah*e}Dh|Q&R|id$H&wA;;SCSE&TfL)#Io2^YLeeyAdoj;0PXnvUPE~d3Q&l$vq|+zT@vy7SwYZ6p$uZ! z9uLAWo=Sz>sbv`r$v*(yuYDQ$DuzY*!MZ*t;@Y#?*Vp^9jtPUTTMKHt<>1{McB_nB z`6{NB8hN*GNk1-t?mh{BRPe)Zx10xE5?X$@=yFVWRsW>$W9ca_1v&ciH*30UHEl%h z3X@zB&%HOXHIG-vvTXO2<+m?ytKi2Jh@xV0qQdLk$+@z%^l`QT?kC(8C_igp;8yD~ zAg?(l+1}k3eyQDnC70l_mfP3{lhkH9&PvYIzPkyWY7>nz)pc{ZPi}W!Av44}MI53Y z%_5#EkeC4gs5H?et>`*{AQxpW8~3>`mrGBa5>7J7WO3YuL>2&OnT{rSY5RE*R%YWa zjM2_6N#LY6wGroQ-6gv-5@@i0YbRvvpjG#yJf>MM}Duw!>gg z=k*MKL938xPSM=Qql>g4y7x(zqkVhI{m|c#RjOOtZaf#CAgMnTO)$Bz;9c zDm4>Zsu$)6D_@ndBnKea;ne;Tw-5`qpw~@I*Np;bqCT~4@Z@^X<%N!zYcw+XIIs9P zP0x7mE`MkC*FDt40kn~K!}$OBrW>+=UMfQLGTUV9R8biVe4HC> zV6Pa!HxzJEXQdy>v$MJWV~l@Wq*_a#TejS-q1<2R2spCy(|>^d<*}%ZZBVccFxvp0 z26EK(2Laasv!)zkcV4AIpn<)}ZN#xTl4!9yFc-zUvAlasYh7b z+H>8DEze<3$jgz0%Li&B25PGz*tS+A+2+-g(_;`3o)W>jxoca5jxyqAb4NEZFPDop zer2>Xi)$tUKj6g-tY&->~Lud;qi;URje17|D!Fg*#_1YzqJ z1T%V^y1be)DYGaa^qlk4GltW<4I{+sX)Hda(itknyzs@WyWt8J@k zbgd3N!7j=%$YIN>YKsPp(vNPBrxi?=U&_?K!0L#KmITXlh#$8p0OOQIR>*4W=BKzy zR?#_Aw|La(QD&Nl(7E*8`c~@PV!=}gG|**`rR$wACIkj!LRrq3MlT6pg9W_Bcaz2! z6-p+q8m-OrG?VU^%IF-UgZs<@j8I3i)JS`NywhR|(bAd9eGEX5g~hOUu^?@!RAFzV z2HVR0^Wm!`51r;JG`b6K%;!VuO6N^9M_pE|IWdl)=WIMJM8>?gvO-M*vOmj(CPIxD zL{|LL;~`}XjSCQkH-C?D**TwmE+=BCPj;s9<5MgkUvsVt-9Z#yC=lBT9tKdv3~cgP zszcTV@-dDCDOmBL^;6UmLh;n|0t@Nwjer9`xn^2yqZWvUC&xGLUlFS|((#a(&Yi_*$~{3m#$* zRy+zYHWixE~ zXKb_Yl~|N0MeF4-O&TovaNfm!cly+qjW{+wVtyg=5n^c|SMIsB{LQVSyX%yB{8r0~ z1d8I-f#{&Q!3j}39=Cr@-NWeo-d5h1SNpfLLY#Q3CCM%?q3x1_nt1<3tNKxHYXY~I z&*izz;U-)a)GqD4%8Qntla)tsuSR=uxned1JQVA(iFBS8MXbr=6bX04jcLkc$w06p zj+x8Kda*~1M8i0(TykR34Grh$Z0&drGl{254^WRgb}}7_S+(bENSeEty4O&wpGhFi z)t5L^v2;dYkz*dYp06 z7PIzLP$dvVOt2`?^*;{r(&CEgp&{;n^^s*UyFbi?N_CI4f=s4^!8!J#(v>Jt^yRD)AVL|6 zZ5FRr)&f5Q8xay*R;0+NNOFt;!UEqZk;aH5tO~4@L~oKsq^>zunfqh(hA`MevSR$P z#!e>ShW4vob)ox%QVgC(atln~HEiQbkXX3ff;>%2lP#?Yayxr@4%g2qQ_v6Sr#5+y zx_fF9O>)}?6|e$fM z&kjGPWUhL%O5W4~aW5E%@@qPRGXk`8LD*REg6m(*(dBX&e-TQi`?SSCJne}Hoj8Ig zgDheRB#^q8FQiIycTd)70glDfokH4kMj(r(SW110iVz-wr3v@A8}|@LEF{8i1M$;R z$94e6(uogn29^ba;dP=9LTY*;N&8D1wW6%OybDwrE1u@O2{J(w)iV|}nn}a8ji&9) zT0TokDFin~DcIoDZ%kiG0lLv+u|v((5mFRuI`j2*aI_p9#}H<#%L?^;S)4CD4gBcN4~29i1dr(XrLEeDZtRyACahp79<_P=sw1Q6fzWHu#IK>7@7;i z9=#d@(rD?E@z`Q7mVM+WCC}D3Q}f%}%1jI37vV{qc;Hzrpc*#zIe^}ZlMiwpWiakC zwq2fyz43M(sJdC)GeKCOFT=J)bm)kpiw7?bcCh+$f{SDwF|u$8ttf-t%x@*Fs`+H<(Zg5&N<1q-g0S+835=mi{IflCIhw#=|yR5quXEU){=){)B za9wj#E}84Y_jzDr@4cXzNpzTyyvt|D=yjB&i1p1OV&-glw^*|h*j?Rq*Nt?2m%98F zf}aI9iRy&j!tp!yg=v+H(_&9vKTV{j4bk5KAQ9)YLsL*VxjTHsEs0^QhGBALeFXGz z(l!ONCbHF-9Ui$XuM{?MgU8ls9+AeWpksKLk_AD8m#xmg*tdl(2Hx@YGbDqIQ=ky` zQ_WeCNHYQNzL> z7Z0`-nkJ9NwshJJMt*XAP`0K5v6o(GmKb==JMb)W%?kKf^tW}LDo~pyJ0L}$B{UJs z(#wDyD5&XI@_eJV$ijP^fYbFA+VltK+vSP)Zre%yPW6!L(AGAPaK5%ww+|Rf94pWyK`w67iVd_fbmz%T68H?&1 z3wciT6ek_s90ITtB7cFzara~*>&Rbt>a%Vz*-USzxz5s~j$&;wrssu`6;e8n0i}ExL$@QRIE#+Uv>;u;Y<;!Waq6K28>2$e zVr|lFLdtASuFHJZzIr1}8w6?66J6uNl=VMu42+N4_w$BU5!?Hl$>!5q;kiAF02wJ|MHFravp$uXJWbc%P@Wv;e}6%3DMA?S zN?qZfl;R#~T=v7ghR3_?Dmllp8p8G@+g@z7xaD^5Y;xJ@+V0XBVYLnW2g;@(86r9C zc0$9$iZozgE(qC?lIY;zhP*-9yleIQK`gyvo%R`ymR%|k7*Mg{;!}4+iVfJX?iL(KlB>@{bm)g2GK=VqX5$Y<0#18`}h~W z%RB1}j3;0xy9kSpOHQ{qcT?V&#PE^{>YEmu6Kv)(^o>JX9J10A4XaWn&X)!e_ff6O!_pUq_zQ`U zaK)HnlyzFH^J2$H+b8^Dfo!f3`Gjzxl*?`Dw83@oK-+u1OpG|rMX!Vw0OS+HJrNco6 z5S;rw=ysm!yNL$R(PT6{iynrjvPm{@GaCSX;1M@Vcnv~-;a}qYs{m((o`#1i(8tgn zITb%k_y|~zUpj7`TI_mp+-b?Vm)w>>ZSHeCl@xAj0pl2MX+icpn8ygZc_`u1ut6sA z+%Qyd2HaFN?Hq!}8VZ6O4tGUBU;r!)Ha5r>9{`3aqXkfMC2na$#y4b!d%t^BhB?S; zW%GEjEJ+0*M6jjZr2s+#!+*Q*0EnI60H% zp0pf_%~aXg&_#elTaLGbTMqR@Y3|_yGWWRd*Fd(l;l2R#6aJF(C-5g6!%jPbwFNp5 z5YLcR5!&~jSqsR)ht@&pSp;rI221CFzcbt{-=K&3;~Pja{|_yX(3+ndvq)Af28m=j znjzWnU|c12o5IEu(uzT!KgTiWW@z-;c)BjqxJ4fyziw&bxfTc}rDLj~SXUSALuIGV zF9}eMdcv&t%cdxzSHqkF!#Gb@c13e`NO$DKtu~0i2eZrhsTzH=J)Ixmgl|lI#QE8; zHoJhG7y_R6+!zMno~qIE!2j!ynVqVr-;)Avx#Im_fb&_?9>UZ`)%W9L=Q3?xOTak) zptmOEsg-1l^Y+Q@Ojn|Af@s|ljjR#@jMyWjdCpA)q=t`lGbbG!??9Nv))_Ts+Nd&o zLR}&wR1KDZ$x3MHoQa?S@x`1AoH{IrW^cvJafb8b^P$rpBf`m~P(aV&a{>*6w~GY1 z1Ejcobvg!&`;vdZ-QV-49tN+X*&GE$>>Kp#yUkF|Pk`gmbCCp0Sk{33#C!=2!sprl z#g9_|VLSCN5xal&HBKE&nl`Vq9e4gVd73=`D<-*Sfiy}_SWTK~o=?(Ci8e&qK@ss7&@QAsEN*E22u!rg*@ z20{Iop6M+t1RN_pYRJ=n^&iM0@JAH;VVUNDvh)A{`_JitZ-X>JVfPykl>mrKfxqoz z_p4}U=RR!j)m>+ohNn^WxcgA&A*Lt}OPG?9*p0ni*y_dRILV6Y}q>TA44@fB8kEr7&2AZDZ}l zRvbL{sr`Yp+pLjXRjn@^6mZcYi$1-8t0ti zyKQS1H!q@(!%`Y$kzkVs|*KhyI-CWrp zvy)ST|Cn+=U}p3)k#_O79bnP?orhCs_0f6nIs5(_g*v3e!>v7kA}P}U(D~o0u|Qyj zzwe;waves$py_=Apn72X`XA|rhuYkK`@Z*~?)fJhETlbHHtcKv&vxsu6aQ}=It*jo zR7hn(US|P`6Nl^lw+{lSqW}Gj$FKe5+>B0c?{A|%|Ba_}C5HJLbvsQ8Pd&e5X}QXG zp~W^D#%e=jk_1lCyuXdMJ+&OLr$_dZ6UXKJ6;{c@U1%jxvJ4vANkkRm%+|3GPSJoxCJ#Sots`+b2qFL;A)XU#L1WUfR%4lE!sFp+agSV4D zJOGMCtwAOt_=y7AgSUX2A87hiHXE=|?MM4X`TAbPKah~#c6#vVc-3bhv(j_~tcjPq z_2jsB4f^$;ep^{E45_s6V}pmf{#VGw`=c_Hy|l4!HXgvHe{{Huk@*O!k*xNM!9}=* z4&6r)a(Hc%tcrhy;=G-Px0|QGv$uh52HD<_^$FSB-r4YQiyU4uer?DDrg0|;LnDRS zI#eqo-1vY@Sa?t3HBxmRl&iWlG(pf$3_WvF4qjKa$e^a`w9P-Eu^&=UG>?CFs2+*e z=DnTXd!A_wm;d&sf4L_A=&`qN;bzJq9t2IY$z?w+8JR?XtIPy0&jm2i-U~28>T*?R z92_qcN^zoD<)F<4DdX?&QT4T7>%f zS(k7+wAv3wrORIjSu`4-sW_rjU;C54CV<`hf)!kS6%DitS6!Z*%r4#s)hK`g>xw#dKgbZEu#Z?&ztVbg=^~hUhsq+SKW4q#BZR_9c@z zjxLp9kP&x$gAoL z#(v)htzwgJ2hW4v`q53?`pXrMe5_OzAYh#73m z?VE=uT*4_L`hZCqR3Tax@;KO+udwfDP{>aFN91U3{w!I}7Fiy+AlT2M7VrSOe2$xC zMSpIcu#VfSu-e{6?g_8sLa;^xD38e81Q|o>C!-%BP)tr<;4&>ZH)WZcLKBXzC~>B) z5E6?Z?|2h|#M#M_BxYJlxk8iNry{K#HkvY~IhUm-EgGq>&2<}pr6!{=7vbkb;RM2 zX6c1+YDXp)yp8A-8Iik~rv3wX9NXqRp!lbV)f@6SVOb?(rgn^yx_D{s)~D#wld@KB z*{Gp=?9P>rI3F1yo+jKOU_Rv(mO2zBk2=zFOdus)A`-6q&(>0hq$<c=#i&BG3)a z6Gg(xxbzAF;gCmQ7I*NuIJ(TVz3kJ#st8DE1PPAPA%BP4G8C(2FB_lIZKzv|bt(*s`!<6tA?{4%K5XMeB? z{KHxlK&86}`1H%$Xzda<*4I|Od{s~2iHQ6(`su;mTJTQ*m!AZ_sF%M*%2n2wY=5|2 z+WPTgis)u>6y$TsiJ1g3juIDJ8tcv4Z9y~5>2U-nf;UYd^SOOf%yc%4qi52zmp158 zJrBj36#@O4=>Um#C`1Tqi@=ynizx(1R?i_7yo2 zBM^(cVkJ=g$Y(+}cy6spf7ui~0rg_Z^JLqs-7@4_JJ_PI&#nb;?uRK~Hds9Ge_8VW zZk=p*4Jgry72)jFDG!r1cfFLkcZ2tER4|o)#>(F)?7=gCor^2$w_c^D*~W&Cw>TIX zlj4Ef=DiYTcH&G8|AH2TK6m+J17&CJzYcp&PNZ&(j>_qopi|8zIwS|o(PI_2%<&qO z1=y({%Wt(w)UU@~)4q$yaOvNrNz<>&lnoS#f(Oo`7BMqwOEh~Mr>qg^^0&OZ}O&636B{rIvu*cQZ-XzhoCn2|{F0q#HZq=SYa8?;ONRn~+`6P0-JkctlC=>kc30YEe2TdNh zJi6NG6zO|u%LvZ74r~XFe5}C70=z^d!L-3QO+#)pc9pbFaTCf)5Djk`IcIe!BJSq!T*3&phCX>X`t~UYqboixGcAn-9s#zVGT^KFsAAWhPli9!^eNdB--%t-WkYwIXZZp)&uMDP~p4W&RHaUY7Kv zxmUTjLJkv=2=RUU0{Z5)4Ku%w8+st2Ul*iVffOy9vHlnkKWP)Hido-XUlo-vVGCt_ z8>#|;$#praNeys0e{!xU?=r+%-ITF{Cq&B%!sYUtsd+br^0P%%O(!r33-~j3&!t9J zZ7&%;o+j3I<5I{=-Gn5?)69?^nnH1qW-FwS<1x$_;QDOlXlX_lF&)*&kho^zGC~F~ zZp^+aE$Jcg2+cU{+XQo_^CAUlEjCWWlQGdTbHZ*f!+b~DPS~U>2)gkb331{Pi|s^e zJG|Y-g7dMjM#hXd7#S8P@-P#&#+oMw3nAQYC-}virW_`<9u`Z@=_tN#tea3Dx+9gg zU`EI~YCS<0*tYRC<-%vVlYo@X*hy~kvbqG(3~dnm2-!1JI)PTdw8_5Pf$F@Qo63Te(ejTu~wwwkNVI zVMS0KS0sEcuu`FCZkyz2?dIIxr#Y!xdZ8GtIwY8z9<5} zUNs`x1bru5IoA zDwoDKp*ao^3}a%gUIjsH2r?)bh+5IwS`|@CaENFEL@bDiUV+Ag5h6}iK~SmStyn|B zfJWhBf@l>`Q)wVXO28t@Aj(uw_}4xGht{^w{;j?5fA6R&%85#(w4dX36O&Gm_T-y?AZ4TL68N0?ov`S%y31-V;=&@^9S8Y6#Pwnqt zER=aCsvOE8Y0@}_(Rwb$KbAUO(z!k-;~$_Tk8~ZrfzHDo%$y+YhM=Zu`*-))zq>bO#7-`@ zX1VS{#%H}e3HCeB@hW~SvEVT zX4A=zX2Ty`SDFo<#uGExkgZj&4X5GE&!-M0A2*KsSU)zGM6Ct8ozDwN20sTyI-fz{feSiav##zM!U2`&zyWe!T` z!}IUj>7aR8K0Q7BD ze#$BSG*s_AwscV5=(N5LmF=5){oVG2=^$XJH3CvLlJD^5^3{Vzd~gLrZ@1yRUfkP3Mywy#II=Buh-+zy7@57o~2p%DL}s1rpIe0cHAhsgI_9F(}%I zrFw@2XPH0ct*9q&6?oi()iu*!u{a^O{Z>MAVM0jvnX0u+fM+vdQBi?bB<| z%!tmg>(+Wb$%WXX!tR9aX7eGU=L3YyPIPH!I8)>hTMSc=2%_}Hi5am1j*n$7#9r-n zDeVn5WcXCmY-St;vND|9#Y#jCvK{i=L70#9`)@93#2PUJV#!5vds-f~SUyH% z#1Ve|y@Q5D3uasuYZlVDkW_Ic3u_@|t%$c|H^;ECEQP(+W&BRRQ-`U{%J60T5!pMi zJJR@dk8EYaIP=Gk7wy~G0}qgKod z75RE~H(tPK&1FiV5vOhdN*GYf84fXo;`du0W@09E+nt_ggOQPSNA1i(b!V_(&#OTH zrG2Pg24u|d_%>(_{nbmGdfX4s2W@KbIneFZCXwjU;c?IQ!nbcl7*MKU@E0k#1OX8k zqrifKQnG=)2{zaZ$DgtlwGmb-bUGa049C6CplJeaK198ux*gait_YsBD+WpAv$Fw1 z4ht`Yl^-7G1J)z>Lj2<}Y_aEzWrMHh#h8MB2!_iY7hOkt17#Sx%!?s|w z``pE_NDagt+}%6QU@IGZ>Wlv~zd%hr>h5@={ScE_`=?J$uE(aJ7zbqAG}t%M62cax zBPY5td_1$8A}cH^Jry6s`$P1=X9L$lRK?&eUg!>nyAojyM2XWQ+rwo8cYjqPLP;>Z z7&H8mmYCu)j+(CVPMvSTea;_oS2hJ%iJ#hnU*?kVNXO;O@a8|;p)v9A;Mu9$X_FSi zu6;lBJqV#XSiqKq43_?%XQ1fMo5@kR2R$*5Wv1X`c;1bGZ2oo^v~(d7Qu~KgL~=xz zsPkZ09w#)hIW-pEd5RUnv%$XB5C6TSd|V>?;>&$FPtv$IR`*OjrtV0cPxE3+c8>8N z?gH>9?789c!VvlWL-pzK`)_u?g9Xgr0WR+E?+rn+;x%oimmsZjrCj*GAE*wr>vdB- zq+O7;`jxiu!@A$ORYl&xGJmO;bp6r+w7=_;&3~_)O8?c;)(xME(pvtv{`24d1%A8w zhfm%AJ;?O&K$`#3tuNZD^`!?4J0JIa^d;z`uez~8AN^fhe7hqr@y@voNa^uAmvMC- z2T;2{aY0@mR*$mwPQD9dC+_*dOUk5QF>l5lKXp|aOb3{*2SgXTkDI+DV@*%lxI|X- zRX=q}%#!{8I^>bFgPEXMU$G(DjSF*g@RI7U+-tYn@wwkw>X(^VoSAc@LuBC$k@5i+VA@+5LhvS1gS$8o%JgG}*Z5KR`-pzPSwGAE<-RXMvPDv>5s^5(#b#IGH z)>qs~oiDnLS?|v|;^|D^D2QnNen;r>tb67KtOuHwCDr+bG2<^Potta3tI?xWQE2+j z0%JypX|*unEIbX?4<{0t8*Pq%DVKhc$OIkim>mS~tva=5H5BG#ZR-5ykyGi|PPa3M zXT6O`tVqS5t%Y0z3;d2^?F~t{Om|`tl)BgXtt$nLYyUB- zg;m*?%vYKq(8=Ld^4~d0=m6gGJIMZj;gX_#rGG{~1jT4S^?*E26v{>M~3^uUfeeILC`()=#XqO{`!i=e_s&dk-j3(T|tsM+x`3c+0}a)XvMC2ddhb` zHx4Ceq`?=NrB_3z*h4V=9gF`q2Uj9s9B?v_;t@l}mx%BZfYGftfNg=WY!Rrr1rcCv zf^6UnpveH}rfd6btO~dm;=FlaA@jxHC((^Y1N#F(!@+#tZRZ8y$#IToM63}4Xf49@?7T?6Pz0W-uRa{Gk$~5M3lN@fV4HUo450(xML((i!Tke=IWK7)>u2W>M_~w{vkk*w z)lUGsuO_tI|2!f86C3i+W%~2ANgQ1Oq5(oto@ z<_&_zoWjWeaANH&u=9U*?Ti80h~5LC6$joBzNX(Ge76Xh2k(<}km%{)(gpto;71by z{)mnkP9lyq4YnFLY2f#?lybP#9lTKk$Iw@}Sjzm7xc5^WYJ<~{gsb;%&oFd*!-xk5 z{~(J#xE|qI#B^eS(F{HoLD0~l8}(a(&UK*hQMSPHY(u<{;hGz__(>>*$8!yH0>GxO zt=&)FPGr{AtpLOy6F`2_C*U>4`@36MP{Vqrv<~p8QoJq!+$?F#AsqR&=uNAfWwTJs6pUL*2G*u1M+0L zODb=15uQ{_y=MNQy~`Mhw@SrxnnJyb}D1Vl@v## zhaaiYrUE3;r$Em@hP!uV-J*9WyT$HZd(! z6L5SX??}^K9-47hQmk)7RAyt>X5g1PSx&iBQ1;Iqfy>YL!#M}s62{R%d zMM9_W1B{gP3mw6WOVCfHL%W9&PgSS-Q2`7kXNo>u*TlWw)+Vy7UdoBi+t79t z0BaW9YEkQXuF_x6ZpG#5Ts7XuZUuU}DUomMGW5)RT)iBep2V2BM3dX%UNHhL`8!i3 zzJmlXHBKp>)FxQo+_deYo-Lo)<2agpQA8i^p>$q6Ip0BR%$%#lijVT}7E3X3Zi}H6 zRRH7w-n((sB+YGxP3;Z~jue;c;<%?S_#0bF0{6wZ#DtdSv&s&{@Gi}oeN zvNZgq!)06x2EN^)HYJ%C;~pC;j1>$wBC&ui|NVjZj0qHWTMmEsl> zHQvLsHdKHq9aiB+@B5uISBC>^!))>`>$zcqhhccnN1p--X_{X>ut);@2q+~{MvREf zdPHAc4nuLPq#T9Is#8*Wa^j~nb={608(cOKy2l=8J}`*2_C=0uRiu>r6(=_(StPo; zK+B(U?ef^OwVZ(_s`i*tQQ8teE{@3;iG*i(DuMq7`GhC zaHFwoF)sy%F3dF%AO;EiJdzpTiY(hy%b@9i`4Ky}IU)k9DJ3@FXiD zCOcRHGMa8Hr;l8g98PM%EXUG4q_x0!Z9JOK6y^kzAF{Qppfy*D$tg}`tzg`;IQlSI zk(d(8XYO_2k~Qlb1P_g(4wlMPEV4rbB+!@&_#p0e@B_qnrX>hiw76|Rja+m@8$MT7Tm<2OtRq$+Wm{Tw&WeK4@46xZeQhdoL7#x;frT)*F)K1BDBN<@tFP2=bp|{S z2$8BTBEoKQDmcYk9u2q)pLoDn&m5jI8}LGOaE(L9+X{dxpH2|nnL!zOfF5#}hXF1) zOApv0kHRj<+`-xjIhMdJ?swsh)iCq{i_m>WuAZmM#PKHub>W8#Sn88=zbh2J)uNv3 ztWCfRuS;*Un7)Mt{hC|X+Yf-xds@SH5*XEZqN^maw;A#t==Amsw&YwL2=&~QDYYl0 z=Wum!D-M9S-jJ4KZh#;0j5ROEFfyGYS1k_s=B^lw^(v9^M2_dBZDJe5Ca8_g!)9{) zN3B&(7|O$IWlBn2g~L&R*n#=`C{^>7Ms6pe$h5|E0W(n^7Z3-6-#a@t&|;&Q%rjO= z@gvD%W*~{0@3;`Nk~dA@KL+ew8UNVZZm~ISS3eif-*6c+<&7~dB!v-4ui&L!c8`Vh zl$3p>F~K(TuZW{a3`cqSP8O*)jka1&vYA;;!o;FI)MVdXb$e;d13a_s`tw-=7I5_g zc4a4H*Oj=DKWyMGy<;3{4A{t(wXqY=N^+aLbBG#8XDM1FUq*hi^-fm9!)3lI~Y>Vskb2xf{~7BKML=gy9P zw=o5}T4s0(qBU)LSY}uL4#JY%%emaTU~8_l54f#2i&{S^ZaLf*aXe4nmEER0ZF#hs zBW&9oT^)XUQ-s-*^HI%tbVxc|6tyq`W29m%#n>+WCHb~6eVRTAjLc_;01MQkDDRPY`#8<>QY;O}$#KpigOeYH^ z!qhmRv{ij4j$2L>7iZJ6nY(znz*`YRal(6moZgX@>>k4w4uPqB&8}J*-qs#%Ocrmu z9LlO3#!?ywyZkda(xJ@v?_n7jyEQKVd@gw5YE?3`& zygJ2}yR^xQ!M-MK;dj$8zbYq$TB#JkczLL$V>>$tlv8j*dWUK*RZKGSr zvwm&c7rwU-csAT{qau2sML9>zAi`+n-P?mtj>{uDtkH_(05z4o>hFTBRNOn zme&;)KX+{i|5Bt~CtznPn%~HDI}eF7VCMHb`w>v$moaZ#>x2tW>B@-Np{KMp^72D4 zfdR?2&!Z)mCF3&ntIi{)Q>r|oE*!+{kNvj1orXX7%M z>&YxgrzFJ_?KFTmE7G!K12tmaj-sL>F<_`|N4oM7T;r_;bhO<0(EflU1bzfsv6Jqu z;9)-~g%T5AvZsZTCm%Mv`w&YLWyf?qQ6av z4N#KbG1dsjY64kds1~I;iL;yB*Gav?b$?a}dzyCoWzHq@wJ7fQ{-%ohPhm zK{8=Z{ra5C1c+q$6Obv0R|Eu%Us>rDkS$2i4OvRbsD)G7ncW4hQQdNw8W;?Av#X?6;R{eaX7eqG9%0z| zhXh{~nFq6q<;9k+rZmC(dL<@PeT57BEhevpj7j5S#+%acolXai?Ge`=Bzu1`Vht6f zKGjz6!Cbm&u}ljIHHw;8j5W!o%0NBc3&!smt3^#k-(YU zIf4=kNmLSLCm84IN5k}e-{^zTW)M40SLC#~DBgC6nBW~2Ih6-eV%U7+4}8XKhQ-K_ zHGK1YXbOS&qLI>wq;N4N*VBZ%7a)!6qktVYt|Ixe&sRb8QILc;1XdCX%GLGjCL1Sj zUF0Eu^f`a`Iz$fqU8=V9{u3CDK`D=G7%1od81NBh=vTyYQY*`rUFQY>2e`R~M)S1Kpr;iW-oS z85dJfD1^I#=(?{H(mg#n4@~zSC#sxKqNw|uL2GR++rhHK)XiFats=Ns*LFI(vpCbl zTGX5!@k#Xgps!lK4Jy8*+S=DzgPqoPUC>6Yt1(S&t;sI<);n*0$sF%fUBVKJO`XX= zVy@zFwzl;~sDycRY?Mj2w6ztxSI`#j9gv*iW`YvzM+;3l3S+@8%#7-nS}2WeAG={#96%hq-{ z`xqUwSSDrwXc*6(!eD6PL>iC|vf_)5Q)0;XirxyY(Qr0d<^>*+ex@`og0VY2X;N}{ z<^*$++`iSAe$b?vVsP1c(|OJ<#6h7 zjQI}Ciev-!V?spaxg`rgPdxrWeYPWYb_fi=>W2b-*ku@^Um^B!MWJWv@~|*i-Az@@ z6^*ZNP-nu>?W?Ts{ZSP?sV3F0w3}Ccntjd%mWqv!zJZo24@O52k@=Ts{Rn#hGRV}_ zkNODeDOX^Y%)t>IuPVw-p>~1nO8jqvKtu5Z=>#!;rqCZib4fhuMr8SE$=;CAaC1)I zqP^7z^xu8u(OI{+0EO#amr~j+Ya%FHI@vWVq&+P#+$n`ZeV;m)<(%K_(WS4@$(j0T z1-*JLD2?uzI$;{D`zOItp1E9|7tCtz!u6A+U|C6oE3unk5`g7Bu1PV`o2*<@H#U&<9jw7kHu@FR-f3e!1y6d{4fT6(yRKB*%i!Ha!uVw?u^fk7x zWVVB9=7U7L_|40*L%FnKE!i=k#CXwAGhn#}RX#F%hhS#E$QSfL`9-mIY6eZPw^=+o zr_K%M&{mJ7vCNlhKiFn5FJ>IuRd{6E5X>po*hVR6*J*ITEc4_WctdQ{wKPGDLyY{Q z5nZMwV~fOJcqQJ2}` zQPT~!-rIJ8y}S!plMjrwN+?cKuUR7*~9CNy1fW}dD%66Z9I$gu9 zWg?XPriwRe5hZW=I$=iy*u3xHxw2P1&#l&9Euu)>6Dq9goy&Aq$ zl82dCc<+!qV)TP=jR}0XoFb?5?TciqDkqbT{3PU9)jeg5JA`QMNW{zYm0TWIQ*f=XTy zY5nL5B$vnm5_bcvU6+oU;hq#^E0V)Z#3GMo=Y0TsPey5nP#b}t;2td9P)r;QSm2#M zg=TO=^QE9YFpXD3Vm!ZcSmA*TI9*PN0>f1hgG#Igppl*!_8;dzJm-r6&2`TPDLf6G zyANFs5__K-?8@*Pj-k1o!vGQoH%PyQN-^+pLIY&+-}%1fbv-{{(ydqfdod~)*MUgh zU^Loou%npR1**NSOBUnJq*lFpUV^I^gv6=AdJZ)5=$vjmfgQit%Z{Y* zvS$K>9?zE~)-^){Gp2SivZ_me;?elkpMsh9Vfa2;A4=HS2K(hxsP)t06D;urkNUt1 z4KRog5=aov8w2kIaT5dY2Gkw;f`}=IzK=TnAXfb85J2Z6@6B)W3}rD1=8?e)Ma@Kb z9tOM*PwU#&G?I!FXLW3UiVHuXhpPLdHgIP=(ZkIMGkH<94L9_fOR(?i>4q^qSc?Ng zocO8X%*F`EoFzcjpH|K|uqQuXA5aDNfb_-iCQnU?Ke_9Ig>VC+g}!{jf7avr90VTK z%r7|I($|y{)pI=TGSq0#&s~G46aAMrxICemgm>1_Aywk6(5uc_c|*M#HW`@qpEk+! z1L0|(LT_q#Nn~hw)*oK@_0*gB^!U@-BRbC0-Ot_N#eKI%a8Npdmlh$hC z>-le>p&?2Uh*)~@nGk^VirY)vi7$*#3r^HPUmaR^5wrx&=M<#V$Aai|_&tNQS|E&sX3; zfsy;ei+St0`ET$E^Rr*5hX2PO*;b>y2FAL3Hn<5{-Z2PqfHFt8r#-Dmt8znEtR&J` z4_3xNwGls&NFONrjT`8|R+v0s)PcV6{Aq(eL3D0A7!Gd@-ub!9kB+MU9_AbQh*pbNjl!D!6D0b zucmHeHyYFu;0e()JYeB=n=uW~gME7U1U(ykN!@**Ou`vRu)TZ(q7WGBuy*-A6< zhNHXm%iVC_1Cxv9@pkWAyz|(HgofFMhX?|am9JU?2*H=t*Rg`X`CpQ@|H0}qo9b{xO}36a=4rA$nnG7 z7<5d)rAL7M#ygJT@R?jS0_N=pjH8!EI6G)~@{9Q_8o%uyb%J`qHK$PUwq@H(r-Ol1 zE1=qVPv^5*K&OWV6l4H2isB7%kq9PRZHUX{GgtFcz!4j--2eTWrSOuC4wbD?5zsj! zQHNCv3t;I}A@Zx=DuBFeUQ^S1gHpITjlsQ0(UA%vSn~>NKkDVMB1(lduM5f*2n{oA zJ2I!Uh=6v)9s#G9kI}+9drBGd&s9W~pJYor(}F4u!(tKSZ)pz)f-jpdych_vQO>Mr zQ*m3H+jN^Z=t``6MA+z{;^O`@))9rm8my#ibA<5mmb{YNC2b{J8l9sWAA2yBqMn+F z!JxJ+cR_rb(voiJHJ}BLYoqQMvBGQ2M$S_2qmnRv}Sd>thx#rzF%Iq-te0?Hxh?~Pl2avJ|e9ocE;40644s&5MP ze!4@`LyuUVr)A1WY=%7;v7wWn3+@Ho^@7vop3Wv6e>mlwuN%tDlECctonl#ezGqJL z`t!G=x3(bOlQblbTr9G5sh@N~w@yZh6|Isl1|5Mkyo$LA4gJnfQhOE7z2_=xJ@*FvX0%>?>cFT&zHl6gM^PV?W91&P5@y*s0QvRw< z%nTq48mF3hcL`?vvFw}6*OMNszKHAh7{^jq1q3uXsw`NWz_Mt*MnHpA|0Qd(gP#6I zD5T{S;*xMC54+2gx6ol-c;G-lIZw92OAm32SUda1qSdm4N7xSA%tHC*b_WESt?b~+ z$9JyU8ru{X%ea?pwG^>V+)`u~YX=FR1uSyiP#1?Xe)0+gNCVkg5$U>Go67AhtqS40 zg!rP>-i~jP;6!|DpuVR zoUqI^Zg0+xNB7+nz>6{M)(;>na@3o^JFUGP;vty^m!g|aJ)vi|+^mbft(~VWU?$#X z<6v{CllU)yNPgCLy3A&0U)P%3%voLf8vkIHwS`Y{m4#2MSxKHeE<~XMo-rT)1eh5~ zwgLww*}hfo}}2 z$m82xn=RtvJOEH=swG@=mFR~3wtYLnmf9$`XdL<;xPIlKTA{46sg9QcCe;F1ohgke zGT!#pkjI>tR%CgRS#NQSoF$$gE|LY_UQd2cP)?@tc4@&7Ph-X!iTuf(BWE_su9exp z>A%O%SbBO9I7rrIBv;RTT9vLI83f$2eO(R0;#wtyjWFWlPIoEmSsSdVl6Grj#2aGVW-!4E1uXssSX&JRA`!8TW$c*_bvbgopcxQ{Vr0(pfQm56;Myl`BK>wwt_U{u!evBkgBK zQDj#FG2{tDG6(Mg9SqPtOz;HU3_n-~(^iN}1M@PW8j|wD^TK{?Mya#GB#36YygaZC zw}&->p|~&1V?VO*mzInL<8gaw7k|$=zN0hR=WidRQaY=t`e%%=z7-Q^A?3w;&d;^{J%v^1qym>`JVSZg7v!&&Fr>?O(!cv#l z*%lGeYL!|gqFdF?2>7OUTqu5*LtAn1BsM)iv}tC`c9qlLMj91YQI&}OK`N0$QgU&z zY*pmKVlBr;es@9q|3t0G!|UuWX^wa`BZe)yoF>-+Zq4+PMnHpPAr_#*a=eGop?l)DfkJRTu%ZnW zYaGeE7%KPQUiK|)$=lhMohlaNO65|T?%R5rfK|R4ESD>56~a8I9&mhdPWs9>1R=T& zjrUS1u&PBZG$Ai$Y3#r_eyxp%J<2k78~4wPMqyMgwHBg3Lxph$fth~q+xiwXc2Avc zj&eu!=?lh4=vHpTat?ASLO)C)XiGrT>Iu6GNR&G%pze;Xyn{5_zb9+}Lu3bk1gdEF zl-VI3X*uyucprGW+qasQpB|P1GB;Q43?A#?mX=7%kLfaUyv@1hoq3B|C_haDdIpD>pya^nQ*R$t14)1WCJQT8rE~Dk=i&b7zShOTH znd2W$lkhZw@3diN2o9cF{Po*p1tn$@H5BMH!0?(bll+s<#P1uIa%V~zk7ayo7AtqrSbOdE`G%Z&T=Bhry8b#e3c@oArhSPRo*AD5bgZU zpU~+`8hb^Tszb1K+PHGSUoTs&T20o-i%V9DWYkUXeP3OiD-qLVpC4tFC%* zb$oo#ta<_D<|z;Y^9VC*qrBW6<@n5WLkT|Na%ci%iiO??fEvK#Wg-YJdSnNIQEx_h zH3OMo+RU9&aXl9R#K=OrT7=w)ECZ7WY+<{nplw&7Z|RJAdSo$`}J&Sv;m^#0c$vFM4}~$ zk3pW?=WUS4E-`3dMD0Cb&Uwz(hzt?W?(vgv1I))yd5iIvhaV7c_^Th!0!4hW(GcNq zZ?Le>lK@2{b1K3^@3;tMjU$qV!q>qvAsa{*%KSN4wa;qk**Er8k=!|S+xzR+O^^&! z&mgrjdQS#0m;kHE)MJ?Cd=iuaSrZ5Q1%z|}1NT(034Hsq{0ahY9w1}TR5{^kyuw0| z*MryZClZkoIZBcJ8+L=WlVF@C&Yc2WfYzZjN1$c>?+4U@Z2IwY8=_x1to`?2up#94WElFD6hgmo2nSOXpl~&SYW|<{ z#o72Tcwys34u4@C7wx?a%!qSaUU_T9f205W!r=lS5_x^w`ic=BR{IXB4}aN=eGrTX z|1qjV$IF)&zrI)XJKKyK`mn-STD!MudL3DQJ;W|>om={f+B;bkYo+U&x}B4?o?UKo z5342rzVX;ep2$|(<pvv{mxh$aN!@hA6Kt9z9LGb$o6e{*%HD z6!!^S^|#uz50fWsoSwoffzl&uM|vQ$_AK136O3qy+psp82+Ess7kS;p@b*>*_(`|8 z-fv&Jq`B(nPmw_`A6T|@{D_ic`pfhV#R+F2V;1T%FD`9fZ!ZG-^UmOxjUjIX%y&$keMO*(d^eh9U zD(-&*N6Vatcoh}|ar3XXt?|w{H0YCk6$uEJ?Q~?EeRtL6vu2F?rIMue_TK;d^`-St zyFR>(p92^cgsXjBUm)w!>w45nUds)U8Wk4)lF&NyO9xt`uR6jBg~N9JD;V_Z;2CG1k&OrK`=H-Bk4ym4f68X!_2*oCFQ)3CZ++IfTnw)Q(y30Bh z-JCpSK(pP&dCG5YiOhwDtbxdp<^|7E^!tZTio8(BlYd}e

_iVhM*um5z{*!?X;&2GtJ~G|I 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�)uYL;irYcmI`ttdtyh zJmnwdfm-=`Wt1jN6SO_X--U2<>qhIGkFskWuwaJa1-P$a z{d^9`dh!v?IRKL}jLr*@&U7}r#pdY3^KDPomXar!(}iL~-hf=+d!9$HJrml;6BYKZ z5_eFAErwYa3h82>3Sk@kJWGj;z?yN?-LvK+X0PhDI#r;Je=^2tQ1VRdcPogYm__-FSB~b<1)IDfgpU}%FNwA6QlOg_ z>DWp$h$T@pX)5ySu|XEIx8F|rIBFaAw3Ecz`41(RY!RS?No?VQvM5->cd4(=jx@fWiC#Fa@b`kADhl@BY3rcm+gdTPpM7>^|1x z#@|G7+?_=COtjL6N$bWk2wpX@<^{{r*7)j}y)h{P;5D^u!z^n{(&KCR6WdhWCGf#sNVw>+;h$0k^tH8>v`zel zsn=}bhMIu|MA2*m2Z=ws0YG*O0E3VWLH1XsU@#=7683KkTI&1Ofw_h)wgONPd+pO@ zG9`f3VH?)nT>Tb-wwwD@69qB02(2iTs3Ta+oobdvv=1&y!3rT50V#Er;9FL>XV#a) zLvX%N2g?R|7E$7X(e|7iXBUhnlUa4~?zFgxQiVGwtuOb1F$--`9OSfAHhv>zw%?ma zy$*Wzm_vh5_1kWl!Rc_3qr>52XOVDJ%mNu64p`vQv;Rjf{u?kM{VS z^7;;9bD5zHFr&6#iM|4y!&kfp7ajK{$5F|4J9yLPsZWB#o?DwSKchaDcg73YaUm)1 z7zlMB?s1;>aYpF1b3G6Wg3|&2u&{~_NQe1`#MXj5WR`VH{JL9P^xk>XZ}z!1%pa)I z2`hz)0)1rxEI_>h*2)ql9Foyc=7OI~xW%Fc^6=1R!G#?lAjKfJi@}7n)mP|#n?r7x zqJ$SVlQG%aHz=k2pA{@Y8ROp8k0Enb?||I^pA&Rn81JhR-t9Jv+9OxW3tAF z{xy8i(f)^GWNZKVZ77*|$R{-F{_q_mt0c*x^B>_0`N7pCF5OWtqm2Kd1{sPoj5=$i zwP41E(RcJV?kX<}>39U&e5=qgyT<{EvUrsyU;iGWr1q{ar@U z;gxC>hMFo-pW>12G~Dd(bMx ziMbH+r;)ti)4|kcu;ct3FqCKvIq`lJ0IhO`DH>%x{m%A6`QV|V!&m-i>l8>YR}6V3 zht*=_IsYwtLp-V@itr!YdyL!||DMgR08)AFeLr!76y^UfVfpS9${4XX{{FrHHc&m>q5op?RQ-<8@uxltbX2aZ4Ypi!U42yS zdccWqnRd{pK&S)a#C@D!_&<#KFf?GtFH3nk?cD>vy#0x=ryx}k?^ST$;!{ZM5$a@5 z?v^e{g0$16fwfy4S3mGNBtGzJ+1gZv`I1XjaZFpkHvl0YlNs8tNK!0Q8>>nI7z%Fu zE&m**`v3rd`DF9@^LMk~w3VuVq_T94-{m}HZc-9^nk+P}08FKkq%8dWoPX5(?{6lfRN*q8)cE26eNHJW)=$jagtH7EZ# zJo|4@(O}wtwo^Q3=<#1nAK~ogKc#=aJ&8{eZKoVC4hp&2zrVLX_h5hY=Sh?w@n6ye z@jgGr=w8^oIzNQh@`CRLDw?BQ2ZR%U$3IAV`djYv>`k`kzqg0}&i`ot^YDo;$++pJ zMW_Eufn22aqECZAeX;G6;6*oH?24hY-*?Mg_JXnUg81j3sbHdzsB-z!Gu|&%>U?cxBS0kq=neRT{8bKi2pBM!WWS8WdSp- z995OO)=Y318`iC-KUAJsS7T;>um^x=K#T8gT z4z3Y0RwKN0A!87kq5e=)HU&c@i-!T}{d4e%PSK6_%?a7&Nw2qhs;DoxrJqdnDAqJ}ey4iQyfTm@x9k|IsV? z`%^daIO4uEcv9i@XIzS-T#e7T)<*es2hRtGBa(sf*A1o*A#oT*Vtk-~l@?i%SfY57 zPaFU}%>53u?lV92Z~F5uXV`K6AZH&3b(obdK^MXr27-a; zI)v4*2Vx{pae-t%SE`1CBRb&?cd`9AlXOYWzTmDj5MS8PnSk*aKY>jvwHB%L7t}HmuanF6X1-{!+5SzzED{1ePvk zwqX&Sbps!%_yZWP_gr8vW>=4o1=Lg6fTA?A4YT2oZ)vGvaQRq?DuJ<(i9Kc3^_7(J zZD8bpQ4!L8sRe!>B4PlLDMF5}>D#xJCKOLrGGw|Df6}*TWF<-gNv{#H)#v>!RoKtO zP*(EP%U8{9m9pZT*;0&<737ff`702d0~RhCL77rl^eQ{hnG2W+QAy6b zdFka$d*#I`QQHCu*w6kz5jdv_PJhKdPEHEby~f%CF+Acw)jato6Z<4W)u#6alh)e` z#;#Xor5sl8m#p*f*&~vdGZ;nEu&d{M$CoY5A2%-!m1J?Q2e#vRZ;<4LAQyrgF@V5; zq#_ihI)k`IuicfZ;UKqv(LDIbJ9BObAa3NZKp}7YJ?DD7@9!x`=c*&*e7g@Ky&IuP zCbv8>Duy5M6Q%cfoS>g<-_s$5s=dLxbrhoN>t-CA0n+UfQ8w5Kw~2_3^h7YNGPi6X zbD31#8Lud(9?#8K=Rv*avXO6B+e^Nn+9=L!gI3C_x9w{qW2b7CJzWtF`Ae2ypeg;R zxzKu#3&seF(sy(0l^#LXW%hyX*D7gO3&OOylbp9rdL0Vz)!PBQK@MFYnFkqD z!VO%~>b0f|uf?o`$`GFHVba^}+&k-Nt5=PE0@2pll2SR)<|X;qNw(9-ulq|)#_{%j zl0?9o$>zv-+PbmF)0KHWHa6ktTF8EcT*zo$qf1X#Y~0=SkaIoIp#9B{9*5>`YiViU zG#;n^f=-J;?qBW$NC{@{iiifaIMka6O$=FmsBhyKGr1yn=)8|JAi^p6A@2f;=;i{{ z14P$fL&)wk7Vh1WyZW#$=NThBvFR?a7fSI1&`l`4pc*_Qe$4|=HLiP=D$N3Rgm zoG7g=vv@1SRRb5gQ}ud%EBpPz-hu)p^i9ml5=vfXdQl`0Hy122C8tm-csUlczg7j$ z;LDXU8X=$SAL03$g(k&%u@lKRhqc#)&b8S-n@ypbC9iBrVPNwdw$HHmg~Vmh0~Vc# z(P5S)7A!IGfI&o<(@Xd%hb27n^GqGv@h3lr9P>#VLv@^k3^La~koxV^pdC{0+y~vG&{FhFbvAzd3)nx4}MYfl1A?07j zbYeGK(_>~=$hDQ@i|lvIh5~43^$`s(iJ<3VF`G=ZO~FUZzJEy`O(-xE5H*_BZ;bUY z-??h#w$)CdTeG}?=)0wSs`uH);qhnhrhgU_XSX6<3?-6_)>VQFY7S(1!Z3Nt-P^sd zS)Z%R{47Jvxz0&zj8rgpwX~)~p8`bzj2r!l~lE zu9}4Ewuy!|y9>oRrM5a=>8YxeWu28dyy{rn6P@{M*NBhT4>U8wkL1A6Y!mRyl9GYM zF6`;jfZll3(ytDb7MI+wuURqhW9zwqd;p$m<^$)|6o>KSpjMjAO!>)D_Y)r2#MB0)^>-KX>=MnhRUYKXevb80k-3H2bm72E2~Is$k?_|r8(;?0k}bF zN;Z9f&6e_xC@r7@Hs^quNVs2g7_-eWOIDgXZX?jtS7pk))$_TNcCzFxB-V}{-`eYD ztZUXReI@K4I!M;esidq$w$sy5@Z@ByiCCU znM~ika@#-EoF52S%sQA&cyj9>tz~{DQIp9;lCqr543-ltWH1SApX;idMCWb&QRl%5 zh6=3zxs8pQ$rnWf2*ROz^QO9IhIAy*AZID9Bg>T>6X|myVQ^rF>giaYT#=U);VNwE zFl03AmqLeM<_}l?;Kq@cbE$OXH|N&A&Nuhl(s$$S_ApdvHm zPD1<>Rl;OQj)O$GMe)$9qpt+JeAjqAtYO!6eb0H7!R!XHn@;SwN$;fdGrV8WE9oi_w+62=5b~(88(<_i%=+>EHCyl2 z*1Yb5n|^fNJW6+W>hf8N+B(PT@GN$fQ|02DkNXXtLg?%ae>rW^mwtr(TMl8|&`9C} z?qat6W`ee3()tZGOGAOj$G9GWi z4aj-tb|$v(23-ynvCx4b8F-2VPoQyQYoa1el_H){Siqg(2iZps0>|dEH!XDL@46Nx zn|wB&ID@+X^Dm@4-0FyqpHV&+`gN8I7;t5SX4-ePb=-{QkRfRoQr^ma zloeisz?*_xo-BrOJ~l!s0s?bCgAG6I`8-6O% z%68x&9m37E?mFcUR~O-m=nl<*(B0u zH%|m<_SI`FXCL4}|5^AIuYkiK`~0Y1Pa_4Gj{}OwxB#tuor#oZMf82^sKdLrv>k*_ zNInX3x#G3iq3xHYwT@13wxR7bLh!1Juj?zr7 zKKDC-M97Fle3EmefT#2zG8%3Nb~C=7LKgq2pkMc>5_rc9i#chKtDk$%rL3ot=Y<*^ zC*nJ=pi8|JE$x?YMx-`gyI1ZAqxStTNSyR9?}fH!nJMXODu-O~V7U`qHwkAZsm zvAzpml(Yf1($m=5TGdjPfI@{d+5NY+O}3#&{Ss;hWzqnZV)|JUi(W80-CsNn2G}eU zf~7_zcOtQiR6y4$P_%U*zYqd~L;0L*hVw?pk+7t^7)aBXm zqjV7yNf%S5(MUpYc;wno(Ye23x(@0gIKL7)A$9-u_e!qIL2i%PR$D-3xpU4zknp;| z`g*dvuN7yqP6F5`0Du8m+h)m5MF6rxyu&+o`4aKYI{Q$f$k%W6g&3v7?ckqDVTzbB z&KIY@-Y}a}!IMFe@5%HcL7Y^>tyx2CADbXo@{-=u%$cO)>>M?V_xC}9sR-umAa8G4 zf=^s%C7&lGs;dV-|zrq-Y0jfdOBTlL__O!&kU}viww@6 z<;J;j_Ret_=x-havk+j@3hAklk^LGm<*}}izOA7Ft#5nTy;Z&4@~T$0lR@5nMkMN0 zh&y^k7vw0hszF%jyVERb*9UsiBG&FKj1~{z^ z9blw|qTvCEHY+b7o><6+3~Sdu-W11?tEcwWJOW${?Omx9lFvKFxxvt^y)*8U_#=(q zIKn=xoWt6CQIC(|!z>(}u?XOlVBF5V;w5?VIO7BU#P-2KTy4mNTIgN*)tMo8pd4U+ z`e(qKsh@Q|gL&qYgjxis0`#t3{awA{ZiQG+ZxHvHL$6KDTr4?Xa6xp#yfu&7T47L# zM3EA|7DKEIN|$Rsvu)!y#h0koaMy^FQ(LA(BlmlRp7E=Y)a!k24n&GtrnfjbE3uU& zq*M`sfz7qxs%=8~F)BY3O@W>+Tlug!hYV}50+H!7U+h;BlzjNJHT$J3p@{9Ay#Vl$ z6zrrZjlh#&m|5ZB%tuifX@CV>@iwy;c!NIO6k6tw)yEWL+935U!hBuLydZzu@8S0 z4NUEyO80bwdSvUNphc2>S1Jy20m9SXSred^$9VUujJS!XCq%lTE|`C;nB&sae?Km) zLC4AeMC6qL&?;bQqq&yBJHRVGlCN4CFIV-{_HJahDTTtmmd*xwg}kA%g<2qQDD152 z3howF#){19ZL zmQ4Tm9^L~`%5pkzU7K%U<(S{PT)@rc7>cWX+6|F0Z8EtB~Q;} zDdid^NB^_E{;C!K3#~!(`6|=TUcttCTBzQ!xYa`XBIz|E;6Tjbg3*>_Im5D8FzL&! zb`}~|QIV498R)l@Rgl6I@8D{8b8Tg6?n1I)E!a_;&D)?YH zxl*!H`M!*4^A5n~DOqp597tbXIO&w7J@TA1=~g!%m#n;{G&d`Y&Zu_KYm&LXR=?Ct zT3;kvx9Xjj1sA2e13EQ)6J`vVIOkBB*!D`4YvR}^9SFw`@oNr_x)-A#)Yd=!wI3-0 zXPgs|3!{-0&63fVm(HhFfpN`w3uvDTpy`lz1>Wwdr`J4+&2PWwvME}wb_}5h!@z)A z_R9~VXF>8aEXY0qlMSlv`Z7ZmP>_)J_(wi0zmS^^JZ~M^j!Mq;d*>TnE@`96EH^=rJ3gaiQFkxTSe(3?0)Qg4m^CTl&4ZDLjKC$R1`)~EDCD7? z;g5!rl%wy>AE|_XoC!1AsLO`WHh%U4e#`?{g~1^L$NJToTy4A*x)+>1e4C*! zeeOHJvhtCf!aoGZ3cNpn8zSH2!oj9w-UL0G90|O`Mi;NKtQz@$DezH+5V^2~4Ptt$ z{vAmE?$yJ`Xa}9_1e0kuI*|_V_$L%SnqS2fJ#rqyJ2vZBu1_RDd4r}Mt#PW8n09zZdSa;(bx=sAX*>cb>sbv_|MPZ&Nxb< z+ODd&z#7oZk&XX5LNR^>rvJ!h!+^hRMlSoky?_!D8(N@lXm&ur)##foghsW5@&WjJ zbg%`E{y{D~nltc;J#qV8@2R57yOO1=0=X7C2D}Hxxq_>VJ*dOfuuJne_ zeeOo6?>k`6N@uY3EQBD%q0*1R4m3O#06Mp^-=GTA-~GjdV-{$(n(7EGGpL~a5#{^M zUg_vhaMc_t72pr;{GNg`0F@dROt3jNV?keE;kz~(A=Y6LFg(nGRG4Y_b2fu#A1NV% z-R^`^_U4h%6^un(lXIVYBJC&vA6!LIeTVG1OU-FzsBmt>WeJd6 z3rI1?WmJ|M%i(*#DO6fG5&ZseT>qcP+{ zEX*@rQaUO#{3@4UhRb`X<-iSJ)-$iA)h%;TwD)9fhcpwxU!yo3$5lP4rUw?2AmaOb z3QkSEd_M|2{D&TRBYzE)^9unIeJFN3*h&kH%{A0+h@c&g;4t(H8OMITdew&RYiR~ayoJyW$3jL(H@I58%(nfa&X;jffow<(3 zc()8I_BVO!2;VNqWd~JEs2=Mv)+2&YxXFa&XAo>>&Y&K-RUSllRwl2$WkZq^Fvrzj z$F$8B`$wMu`_e3#JJk1(xDM-rVKtWTC5;CYT?eh>bFNccb|>zgukhsFC4uet%c&27 zXSrw2{ZWe6bRc0g##s2(MML*&-z!x&rghYR7S|CU51l4IHX0Tn-`2&$v8qS`bkj<3 zwFC4u_~{lU#3r1*6O2t@T(d>M37*hWD0Ottxshy!$2N?B)(hBLyX=GuwvVCww9Pih z&aSRzS!WJ(m8{~@gr_n4%Bu#bj*k!vY0#9q_W7 z$%~UQfHg}MnH46p!BIo>WaQA)6-=vlU&0>FPRU9U?~yq(l_9aFWLO&{vjEKYTkB@+ zZrasc0448v>)7ld9qr=2Ez+nk&C07%;vMZJ!POG~qPMu%B0#U&E|AW;z4sMXy7cYa z)W#hvFU1Kd&AKF~awhgfP9(W-wQ}Xz2vdoE1+KlHfeZ7H_TGGUHJIybd9Zv_^xu&8 zcl5U)iybcqTvmrVCO)Z#Dgc=50yOC_^~l0ML7ZHh5ptFWAau(I;Q9@rZkeHOTX&d2LPXK*`>4=pa^K zWTZ0_P8mw=41J}Es#sp_fe959pRUfz_%oq-t&&7G6b+)0-dRZ|X3MRY5}iv(vQo=r zi(;A5eA;_S7R9eP5*ai{0s@G?h{4boPz+=s<`i9l7}^9-i4huH=5Aq<-@#%4v=CD! z08Z&jlf z`w@Cxb^sJfD6o9lq*1Q3(1cxln9W&kVP~FI!dM6{RF$3yHBo7iuBHq;zJ=mXN21< zg4Vbp{iP1vToZLX7k&x<-NM?MM?OEbl!r?*e|hASS7jS=M;hJxPQnRgrZA8KFG+eK5!stMuMo!rHDr zMORl+2PVoz?a_ z*}5pwf%je^I%`(%OQPQrmF}M{x}8a0xlL(KP!Y+z^vzp1JGfZ&TZ7gYQftqQY7p9i zkn&1;CP1G-P$!F8`=l=`9$+y)3yM%r7E`s&9l)4zvK9~|aPi^R6P_&cAff$ALf87< zdUsg7<~6=;bpwnBXbfnu6&EZG}0%poa1sFK5IUJYyaTOFA(ZoA>Wrn{*0QH z(DgJtKYvsG)7Tc`{-kWAC8OrlAlMstdQL~TlVY0O;c38vtuBHS@uXQqp3rkO!1 zoKwQYZzyItrm6?dnw8tMJ68Xrah^Gf*5ayolGdl*pBVw5d5;y1&>*~i{_=S5^z5+Yp`im@c_TZoi~HbibUZEr6)sTxoepT1Ntf?{!!oH~AXa`I6X{!d8*c;4_Q2 zWn*Alq%B_sNfvv13$J6Uh?bU0%Swf6ldUAUuhX-(jxrz=R|Xg4^#(V@_fu=L-N2*@ z&k4^_j_ED{cOEfR-kJhpRYz$Qy0A6QB~#p1`B5kiGC;a?sD+l9X^KwVNMj=Bwq_rWq@lQ=1W%#yxYqTxKsNuElg%i~O;NBB4!zK(#-#|?EKgPi#5 zQUYfyPfyfZ+_|;)r7clhdoeJZfLm+h%Ff*yR?_?5)+`u|x_|&DN^|*F+%t7!dy!K; z?2e8u0o?hG`aXz zl{y7ueG7F!+}kj(^)u1@{FsBf`VFGUid4O4Yq#iAk)NkTI1sxkUl-wA--cbtnNX|a z$F?*l961U!>P)MFjVyt)Mxb1&TIvEAk&s;Qc_@rWP897^=W6h!lIYw|QX$;!D44N2 z|6^?YM@x7|bY?}Sq?sxHrVbOQ?G{j4S6==Va+#EvZc7Xxm(1ywYxD+TbJFZf3R9)5 zMg0!4sQwAF!=9%>x2m}`+p}e^8cL2}<2Su#DgHG-sAvHz_aH1B4Z)wYbg|1$ZuMI~ zERJLe>>*6L`I}}MAQF>k&{2pxir&iGU-UBcq==!8;e93;mN55f9`U?-eB@Oy9MuQu z!BTy47cx;E_rgf^S%d*_fHxsOc!&zt8~3yI_z(q?G|VlY=ejaO?)FFLW^!p@>bg%v z_`}!wYGL{=j~f7wyq7dQ%P0NLI&iCjl?3=Fl^G$bJ?EjL(1j3D)Hg^PdU@vE4U!G| zSq0sl4Z^D42JpV^oWc_DPf0 z$IG;fiwh{-5U`FyNdsy~A%J*t4%fmTQX0$z6~VPh46hIO1MdeAy$}trYG`cUS^DJL zgN{yQd3Ge`UM{EJuXNAIL=NeVu()S`ONfw<+m5MKr!>Ehf|C3uq&x?0bAaz2b%jTr`)H~{p#QwIj?4Q;VhLcLcDSk5cz zAq3%xSim|Pzt3yS$1uZz(wN%(jhosqZe)(-zWCDmn$UsS!hwN4A8KK@uuH5vFZStd zc$`5pLP22j^Po&wr_41_l^Qyml8o+(FZ7qMLZk!Jgg@tO1Dz!Nl;1Ianie4Q06 zmrHq9%M&VzsfKmrqPAX&IfA^dCbs6bBc0fKn|angN^mDve2Gex;&W}P`q>9 zd~g_ZLoKvXdMC|AqML;_*_`6A9bC}t1)B>XECk$DB;Rk@q*Xj%IuQo><$bVQpu)DB z`s%gjB$ix-sZ1g0Ph01{@7^1$ZLEuApC?cCZ_4(SX}CSayBf}GVb0c-9=9_;5t_;7 zrjOBT&O_GTBV*pW#a4)1L+auKP|A)kL+*e|X2Cq@1JEuoDg#pWuYfw6b{EI|SOG%? zGzYk+01gN2Pw?!XgfOdjV-*er6Z#Vj?|5_%G9Qq&gEAtc@83jU@Qzn5%FF2GRK<;B zeEEURow&GG2)?Eki2NK06#x|b&J7+x6l~sISfO`ve8Z3OPGvB?0X}ym+!VRJkNKR?&8p2MX(V!eR*+$n$&0)s!`o6VYYQ96vf-CZWgO|D$}b$UO@m;>qIp zv7x^QJ+K85K@KeIZ3dOaajT6lhG{5r`+ez}Z;={2>q8y{az^U#Y~w%o*N~7v7&wC? ze!=j|u!x2wXVkEfKL^iP_>9WHhalnWVeN$o8wg2Y&>MJYup#jWMGyNM_wt}bP&{Px zrmsUMQzhVFpwBqNNf>N;94}=Gpp~Ve79|L;J75S0*8wyB%ot#mgry<^ROy*41m(Ey ziNoZAZ_KFOaA6&|F0&sQuei=a9Umv8#DDfkbB+EjXdeP%;seG~C;>@6DJoeO5OGPj zOCPSLo=#c4KztGIRTX0m8fuUa!Ln?DuZHs7 z+!ADYZIv++EEm9|gOZ~4+V!wUu9C%{qhy7R@E;34;o?4+t_wWK!<;?08 zaYnz2XwEgH4^WzOupGl}gSlt#08)*S=knTPypqWZvoj-rT%g`3hnix$>m~k9H%F*9 zLYyry3?P>ac-`^hXSykrW>)w+7x14lx}Yx*51B)Cd209Y$QMab;jK!}5gy z**-xr09VTOPts?Ty3$Dzmw2qjZ ziBjP+KWejKCi!mp;>S>to&^K+9}E&r|LOxnYy5xp_xzdX%f0d@#8e0V!d3$bo-e#X z;QB9Z0q3RQ|L6V3Ubrq?fQHQd?|9h_9pS~RZU6EWzqa3}?W+b~#ozKTHa6z(xzWh4 zsiSg%mNSf4wA%&9Gpv)H|AV_TShCx>|M6e(8%dC&YRCvF`9JnT+$ZA#$SMueuK)8d zO4GXqKmFm5SO14c;DFCTG#S6x=IQrh=MSCjNT>-U0f>@az+TtfrXEMYLq|r%=h@55 zC&C<(mujVoaIQJC^MudA21gcg(Hu7Sm&n`^6qGvB0+p=`iQ8O-pXb)h8mH zH7!eytie}cU|~IdcddudW`Hfl@=4rSfM9{e+DBFxfTp1X*>wpFUWrDxD<4XgBuB;6 z4fa1|uLoKcgYXBJoCx7YszgxW{_V3@fN01!12Rr2VR}=qoLt)hS9vo7NKl`p70<`?I z7Z}f@l`JVTfC={ZiSYTw$)CCNa)^cC#{PfB3nYKN;6{x_mh@lQO6*G}h8`QejQ@8^ z;<(Qqhemwa_E%aBtw{b%>;B2}pvOZr{lzxih4I2xDO@1Tc^z9YKHrLYE$qJJ2Q}ro zEAvwfJB4lYcf71jD`8sOtmgmU@ird&zv;F@==n+Y1-yIDU;4NI?nB#@De?{s5lr0NVQFmZ%LmLVsl(Pz2vcc(!kkaU7wz?UgQ z>BFF+2MZW*_NqBOp18ZznD086#$lU1X~-A(2U;hJkJ#)sr*1W#9E;y!&@uUcn2YfQ zL*pdOpg;Gxvujb3GVqxlMUokvZ2Qb7Tm6QAWGeMM?hHpr;)C); zfbvK!#&10c`J!KW7f93$YOtzv&*(6rh+EKqz$!#ZVwb ze;_PSboWyzp2BV@PLly;+(wA@38pt(=oShap*#kKRRAo>5#2z`wpeS_m6w~Z1cU0WH%Dw=_Y4~ z?x&mH-}N5&gvz*^IYGb9Za?B5RlY|xTRYwPR@ru%(%nWlaSkN^)XENz^;m6Yr!*&S z$q+Lp&Ru7kOl-RNdZ;M-N*XTHKF?rRNC>4%P$XtqdJFQgdjmX!q$>u+IXV*ORkoMm zP7GY^D5M13>0Y^zH4$>&6I$+u7V)1$71};%#m7*_Y0Ue^6S}h>c|q>J_~-x>2Huw> zhP6Y|cztK2F`XNoh$J5Z$>VV48W(G*LE7_kBZ|s!@;V@=#wG44x*5E~5tN_-IWQ>h z{Q+Glyjd^2cZA}W*dXtHyooCA?FQ~ypIMNBCsFXaJL$rLe4)6Zp|_JNilEjt3>1hW z`zdZv0oJXjDjFgqmwOlLod!0@^^QUV7u;_x`_k`2XJT_kO36o+Rg-oU`}ZYp=bYwVtIZA~9TBwOj9pl_5-{ zG?y;)pC+a%u3G25m=bCeEa9M66uM@PYbw&W`QL=kan(vM#ad0L0m4mwmQL5vEtJ}f zW+Zh7D-kfs&?=DoE2^5~7AkbphNUCKGEBXdr&qY0jLthC?A`94uaV3D(VXPDg}sJy zKrIN`lsWlxp=*f^m8P8HafEk_ttr~(>57urdr%H1el^MntK{7}Nz(P=(7-F=kVA@6wj_$+Mz5ke|9ac4zLB_>k-Lq6 zZUh?;%l6#jpKY-J&7#Hx&l|LT^Cu&yV+T_8JP!X238?6-+g*6MnfZuNIaJQAWRDyw ze}LrCY+f65wEG1}cgyk`#8R?Xj5b}k=+fQD)$9EXg|`Y@`eXW7Bj~t+{t@=0n3ka~ zKfT^3oLzj;S2rLl+@fqK5Y>xq68eg*ViSgkb8OGr>^Ah+=~9+odT~-NZQ+DjvhY0= z5Fn)3yxt>1>}mmj-*)Q(gt_t}_hvq$&?OfIh!i41+OJw{kD) ztc>b#lqzb~QRK-Y_=`Cfiao9s0b4#7x>-mVuOerEz13g9lw&qylhaPBtFCgEt1df4 z3C<7k*Pm4`{;5_22A&xS-`UX?wuk8oB@K$7l4i-JZ~oxQt2*AC8CLm^Jx78lEqevI zg5Hv>WQ#l<)#0nc?|(Q?#%O|lQ^icK{Gh3}QKqkvMd8hC-aDJ_B~-Ep^1zIN!B&8J za~&a2zM=Web(7L1eM|F_HZ@WF6 zwk>~{akQ9_6!6?YUaBb8&sn6i_==bHA0d?=^*b zOM^ZZ)9E=qrOE=IAar z4SicTq`TNiiL3P*w3KB`ZlI70sE^|DXxo=rf=ZRx!h#c(XXt*0c zprY8lItJm=?0vTDR(JLzFCfPHL$0^0E^Ht*??W3d;$*?xp}1WC<|Xx%f#eq(CMcIo zw8-)hRwkRPv-T)zCni%l>iX70g)OxDmlplJ;DHSiQYD@K(>{D7g+lu*OwK~KZaKr1 z|Bvz(S3@pXN4vDaGzX3Rke8p;-i>sNY@sV^i!Qc7^qZOE1Q#tQgiYh^kS2M%#?wEDSGI||Z#Io$*M4PK(j z)snMA%0`K9M6r8>kbN^6h~Mh?kj=cMP(C3bajTSizu1$6(3;nr)8 zS(fHnz8N4-x#*Z{BNncD*UmAQOr)#$eGK-OiZc2!_9aKj9L`?Jv{DIj_8CeR^;;D+ zSZ5*e;H%Q!-iSh7jBuS)f!M|u`{t~Ypx+Ai?Fi;sXcZen@(t1g9Y32N%2;?~dgVz( z;(9#0xJ6mHKpuu7k)2Y3leJQ)qw$mt2X?$yf5&WHX8MVWE0cAWRSWhjK*14qU3pzm z@_A)dxK7~q<&0e%Cbh^jI@Fx%8kR(HDzS0fJMB|M<=2I&-#z;33+8Lhp#Zk+O`)(? z57gPUIa*|sa7dF;xeeO7ebBEs(>S+|BztC8uE;(j$QboL3!b{Di-@QmM#``;w)#YN zoc(aa^|sqeBpIyePsquXufB$;FHgJGtyN19TG}5QzdJsv@@(RX+DCm5ke9!&_G}|M z1O@25A7E@(@Mc#!S3>vS?1rqwcQ$QmIrJ#=v%H-bveqM*b<`77OSFBn^epz${vCY= zRq^ibMz4{s#u4zGdHeQQCG^`T()$Y{&h+(LS&bIN#@e1Nh|S5VUtju|*Q5#Us$Luv z^nPP$PjTIdP7@nzv#@K(u0N(hwM*QTc+9eIW^;^ViBxe}6F5859Kj2+$(a_&*4BkP zCQaGyqE3C50n2H>L%Yh{g-NF&d^$p*jt!B8Gofeo4j*Q3O5xELlNtQAmL<)~%Ql=j z{^l-hH0D-~|B(f1zQiC+OSVY%S0gdOS*8ltewN~9_Hy<1=c$|}TF<#0N}si|vaEcQ zBAmxtmv^Y$^(VC}X4fdmb`3)NY+UO$wTHnqA`KvZ+rEb2yw!L*5rRsidvU!Oe z1EH}>b(CkV!5mAXProJ;tEcW(yFxk?55M%$};L&t=5DxIubuPL=* zAf~f8;;-N-DiJ5kSH`SUdW5AtBeytkpa9f2NkZB}_D6g*U&~qYOtOWtWZL#C`|>jG zme@@IlUBxeEuzDSw%sXo?VQ07ECD%M$$4(rp2^5fnfb8#c{9p71#dEwcu4YGjMFu* zKkDH=kEKha+X;Cg8DHpGurf@I&F0;XMSCLv)Yh%N1GSW(OHcPj$8$dcv!UyC5(ItE z^9ZkckY^b;v*~Vml1{D9<*_1k=b4Nzm(JV~%rf#}=ojj~wTW zf{8&kr1$kxr8UV}eZDTE1qQD`QRFQ-J{xf^h~J^wSkST~U9{?)E_S#3kZ5Ck+Qp%U zmdLrfzR`{6iVJ1&pikk~2PSXJruw_q?tVuJ5*?=4^0H<&HHdy$807ykGx!C57fZdh z1T09~C1oWa??58PM&Y2jkKFSgnVLXz>RGUP2qvYbZsq;G`8$odW6w^S*h+|c-CIGP zCQUEcs`llez^h@O?c|xwR83HkbJZM<&YZWzEDrD4tGAy5EZ^_=diz= zpF{~_op#-J+!Gm377`Z$&SG$=43V0T63blIg>+#|2lIyuM&nHI$pvtYc0}(M+b{3V zzfm;uivd0HNaTS}$BglV9*5r|8u<2b_M3M}vQ73WaqajSXj}eJnkpXZqRqv+Lq_iM&OcwPLXq2J7ZE)2(8KYlH7s zhrAFPxXUA<$*yVi+kX4UL7}CZm|QV^IESg(nW#yOrH|Y;TsUXna58I+xWE7VcCkiG zHxwStq?cZvT6i>t+c}S|SG$O`)e6{XnU-2XuBHgXlUIte2~tJrQKbFREs=77BI2y- zNEe6wm(Hx4|B8~4JH?C6#tfizmcDwNNsqU5*qh7#0p%oT93_>-kufs+%_yDOviBMk z!IZGmuIfb+P;}U&iljpHo4>hE*vS-n#Za2dH>bofVsv2#K~?#NlU9@|aHP5huO0Gy zPE6s@c=IM@OiG$-`}Xor?!-#M7$d(b=Y zY8NrV@^)iQHT*u*ew1+qzB_JpX++i=Vh1pvuW@-DCaA#K) zrny&(xaqrFM!3~7S#e>)S2;zo^eB-EX|#Oh%x1H{F|-*y;G>mTsHN;2&|_^rjucLX zCMf-RYLIX(pX03BXK$%vg!eJRsjFm6i-H)WI^Z}xDsShyq(H%QH0cVBFjN?-WXKRv zuPK@{k4l4giHb4HV4e1&zUKeANYbn*e=*)t&Dr~YCA+HDjp$GFYNQQR@fBJx?)7iH z;m}CuxrS9(FPy~LW={1#GSTdkJ`<>X&v=0a3&Ept?$t{wXL2ui5BdlSE{=M>RNH-GKPJn^t#Njh{VCTC zwXNSC(x5-r!zAO?bezjxse+D2U_Tzl`ti5MB>MUXlk$F9zY_B>>FAK0`uc4v^Sg{0 z^+gZ-6palbquDF7gCgSTblc{0s=}5R=p7f%8k%~#tvY$Tf=?$7TAgD=dQ@NR0uSY_ zi=5-W4LR`_=gZC+R;4{^iLCKx9BGLJB?jBDgZMzAqTatfTqt+1;fhO}VwsxwaOeHu z+M;lm7U|J&7ULK{l|H%o6Y4z>2cw-|6RwkPoN^!RIxI&iU&@y_9}Bk$4d(?UQxVLF zlCKC()kGl0cRyc6J^uFq6xn{RWr<@hb(PwZ3cYyB%vnMS;os zauEFU64y=BdPx`(?HO||mVYGuj`$bzTGvX8q}rGzlhlgl&!{xVx#sH>?;WrOsqyD3 zAG3J=G%9EN;#X}PI*a_Q1TFkES?m2B-&0wnQ1%4C6rAIx+gkY}WfohS%{!?MXE+$W zZWTX0~CDFcL5aI&k zJR0*w^p(mvs0h3EL2RW{FOp!`cX0`w_s5=~Is8b3NxRKsxO1@b1gtXCNh5Lg%b}PP zg@Z&d|8jlpgA<26@BGr5@N#Juh;Nr3bqh?md=})2J+dY>GV_d zh-1?ePQSkw+*ww!(BhV<4acnNc|B3#@Lv3nY|d3q9n6aB^xwzc8)vuim;Z#GJc;o( zj;#OVU#72zlN>A@K|JCt7u%z0dtkp}vo{iVps%oBX8eTYB@x%J@iQEWlkk-d4~LQs zCuqnOY{YasEqoDwvh_XfktK!z$v80n8Q=WjiD z&&NCW4>#~H?(Sd4n*I6%ChzT^w88(9kH%2F_u$kw!AL0t-+3Z!zhU$NS~QjkL+arY z2#!4NQ%9T5GbMunZvn1?t3Am$F&;>h4jQ4f<8(aXufPk;ZX+l-c74+-jhsBzpig$j z@9fw1AwT**2n9k=|G16ggXXv=)Zv{?>0S;*%mkb5W#>X_&_MWT49Nt16~uC+o09B^2h%cWPO6L$}eST|7NWH+Z&JppivqWkdbkmB#p=t zdHh9J_@wPvblbhZf!@a9;jn2lZ9;Y1Cw;&0flwiPj~`FBYZ4OQ=e585W0t;AcQoXt z$6-@XqPz=wonT=^+wkd>{U%g%CIx_y7Qc#`Eku=rgCvEw6KWdpnEdOHSxx9$1&Y7i zvNj{b{!h2Dc61nHnK8B7xVQvG(4>Ue1W*Sm!T=K9OMb!FxxlBLq+}miJ+>yi7sO1c ze7sdkiX|Uc7@@o6C|vVz8xx~rtUbqNXk2vu-5C9|ar?jUGlGZzVZ8j8@9PhQRb<{o z@BI6hv|oh;g-uLK1B7#9wMoeIW+Ja6JLG#kb_o9$!SJL&>wdqnNsuC`bpoW$_#GS7 zwx8ZiK?*niMKk}~Y40iCs(=4b|MhS81^nkG`uA7+eYC=VY;j!92=8-A6Jh;e%yL6} zdjS+ho030cE0fkUwkBzAco$V+P8=c!FUQ}Ba@@0EjPc9Z8YbE=6Ta&M@*;8oBn`VpaXnGq zyM3G?465Wt>o^k3%OEo=8FHP2e#GIu9aTe&#-!=rqpSCq+F9s}uVay`2c??&)isDhO1+378-r0L<@ZaK>*mv&XVwc=EB-l2H} z3qi_xC-}!TH7P+0OC@?OD2cULg=cN1!4b|2V6oKnDZW}I{%828hGY)qy?5$}MO&T~ zwZj!;;8PuT2q>%mS^gpxH-h7H%D>^auHjY)Io9nu&QDij0yUj)N*2^6Bu`Rk-wh?* z(4i8gn)|mcmRymjCEJ_n?eDI3t>7_8xP&pCIkf9%;>UzLf;8FHu6pcW326iLEbQxp zf&9ZrbV%N*>uoh?`Pz7H2>@iUV`YKt0Qv z<62^n-jb$J0@5UKm@O4u;x?~JrHL(m`f$zKd4Qfb%?bAkr(6OTPnhP_&D=aXWtv1t zNe8Sc6QzRaYTwF$MFD1=^Qa6}%GAa4_>!`C(f4K){X~lc@$Y)yP3D(Kv<}HTlSM~$ z(`Y;!dVYed;DD0q2PPCz?S$koIseECu}!AAMt-=tAjxH7;bJDr{2;X}k|9L-p9-@} zZ@@dYwPPv`_cGBZC7fosiIp-&1Q;;D?*`29VAkmeL!OOje7Hx@2P>i~7Q1Dj-phG( zXQ!zOw-Ut3E-}H)|m29#)GDfxEE2tnY(rMYGWYbVYM{R3@M?_nOF$+^* ziSB{d3>UUvSA4z#Ws;1619{~bnQtTrK1H{Y9>m>jdaRGG?X4{pfZO+K3tuq|zPekP zSmBfLc^d-s=-iPNq?ajxsAaMpdXK?$eRYd;#HZmdw=kA2X}Tbb`TH)rUfUXm>Oe8uJegANO!Ma=J!wCc9NpCNiPCytWaY;enQ|WWVyw3=+0!OX z;m`5E#PkX9VsBEfa=k9WBTPwpE+|OF&)k;fs&!3S+yadd2-uX;M{Slc1EzRn?~&-t znGSCYRRXRnS+Se+V%`<_Rnot*JbYU3gZwwKQ*=n=^(&1dadwSe53j5{x2q8gZ!!uK z){lto*E2~;k?y?m{=N%Y)fe2MB*7W$NDwA~nHLJooECK_oH@*Jt`Y~Fnn$NCNC~dTQPg?n45`pHV8(Vx5tL2vWSUef zo-&}EOmoocft@(!#?tg!z@|*pe~>0Ke9RfL?G*ZbE&uA)iV&^vZl>_fZ-i507!Cn{ za{|OBumE*bpdGuzor_El8E=G62`HPaQW5-ZxB-6)9 z9iiY&oTUwLy47es%T6vyws#L0v&LH965td9QFQ60|uxSk=vo& zdk+x`jCkNwQJ4+f#8)a-5RaLlCQk5@s*+v3sXNwBD{N?kYt`~lA=ss4DC(8KiS`kg zG{R~P{4OMvg^(G#G#Y0Z(^QL@qI@&d_m_uyh-;>T$36%LZPuEs$`hzI1g|ZW%mJb2 zBf%$GNm-lveLq{#kry{oL`d~0c@FLg!l0lH1wB?a;w??1Lv-77J@IgJrzTnsC-#)t z*1P9B_ceC;MWuJObT{baT?T17=IYz}xtNsUe9Ky;?;cGYkPSr@%elons#Ho{u}HW3 zwOAFjJ_w7n`~SM%jCVN;-qHJ|$@9D{)thLYn@?Cs4XD&+n@0Jp^c3g|GkPeFmKra9 zX%#$iV5YLv;HH9#bbj8!ovg!DRCPfS5haTkzyP}yBU!?<04gz$eaU)7>E)Cno6UzO z&I3%oRa|n+Y=x_CW1sGv*)k@@i6QK#1}X@|CDFdiayb%ljuktR^TtXaW7GLf$c z*2S8u=etRJ15^2X1(&URvU!VArT))>dk$hX>u>ez1VKjq49XL9Cp+UBH@!LJde*nZ zHy&~x6GeYQQ<*VvOC3TNYcRaq0iUL|W+b8SH(y#ix^V&y6nfcbm zLJVC2Ou&XZp=oh`;vQ&%Fae02h)meYSEB%oae+?e7T)bRSZN<*9rXUP`Pq0tB{}sE zwhHg$fGZu0SQ({p-9HXitTrqb+~^%r9?~rQXyGanW_ki4eA>daq**av?5K-4W%1f@ z@#v^!c2|EQz>_TzqpAzTb?v;4Gi5PH#NGL~`ujC8U+e<4fuV=_nAe~x>&c~;cMMq~ z1)@LVnAPxwqIKQHVx6v|qciwqPpqA)J~)?dTcZvCAx!HPZo}Yz7-TIKDOnntaBa{< z2ZNNWbg@=%M{JVPwnRr4F4VkjNx>;|DG`dxOv|KMNwOR|e_z86INW7au991|&vw$6 zY-(^|>SXQKE>NEb$!7`0)DqpZ&ss7ir5dqKAT?xa_>Aq&&sylVQ$7u_D3HEdbUJMR zWv2I@&;4_i;19ZSMMC*$abURG(;Q$sWtzDT#YfC*d%)o|{h7?jppfj!wKU|5NaN1?cezBs$H;I%ZC{lct%`vTys zLz+ZV=&d?7!AN~W^!HayAceYvfqPn?u=J}uS*$03Q^Aafw$0f^)@9_kTHF=_IqOC6C<{LP%D+GUf2~&r?sf$tlN?TLtTSLY+qJv6KW;iyk=*P z1!Y+8l^R=mvfsoo@a?qxFu3IB*Trb>i0*{)Jk`|gdR-no&ABk3RkL?wm^N1rDDFF1W)pz~@lkyHK zj3A1obvju~z*y`}h&ZW61;B^f! z+9~4~AwTi8p5?Vh9q<3D4 zg@ZJ$`I8L#DBZ4GqDK+dGz0`ofyjl(Ynpa+dF?2K?dMl0ydRbsD6$?7a&!_q3)ZhZk(uVum{Fgzgw}DQR1MNw2eAbdhUt}Rsqv*+E zaI_vjV8?W*wfS6WE0tZEJhO)`evu|hMFA?lIl>>iSR2g496-|-O-EtEw^P(BF7KJe zVG5J}Stltum}Eed1hv-cu;M*!Smg=FOPB`KjvDSN{-`O_5qWa=AIc0DbY51LSQ^nrJOa^)urcJdV~I=P|d)=JOGmWYmmLU`+BqqSmy z86l$)M<3A#8sI7D03mp89`$u~CG3ns?YGh)tWN|UgkL%uX55?ykO4A8g;;MuaB_(1 zpIh%%K3KWr@Zo7W#h@iyhp6O7yR17~<6bAhF=Xt*;Dk_AIH5Y(y}qKK;j;@B)Ig{p zE~`n;l0`&c;_TN;b-cWe%9#WVM4h?XM}m(w4M7*A=k!BX?o~Raop8s|?;PGkE;=So zL@UTW~EGBqq65mA!@%~GnT313v3z0)kI zY)%HVE5A^rv{g>YrMmsn=^!&qS@gzsI#6?Et%Z^ic7U%H(#s}&x8B@_V?EjCvsfy< zJUqfC>ali8vE3fC`)V2+on(avdrzguzeEKaXge-bS%! zYh31|<);Uu%SqpysyKXvSM~Ox5nRsi7uX)8%j93fQ&T_acb-@Xw`_tUJPAo4K;TXN zKG~s>glBE_MaT#Y5fq3W^vgoHdi&sjI|&JBzx$Dw3x1XJt@`uN{ZCfR(z7=X$@Q#} znyNHa=%^X5X;;+g4Y8w4n_WCr(ZW#;FQQ(2v1z)p*!J;YX+dcLP$j$ig_qU5>W#W3 z1EWV)rlr4tpmW|3{cclk=w_Z()F^X{m>JtcPbBexyl>7U31cF_e zd zrzFMoymxix>gbaWdsacbLKHlQKtB`PMoewBNQLGc*jnK9Q}fYMNz{A+b1Pqx=&5{h z#4%OipnjQ=Ai@AR0)C18u6EYrI>gGKvWBz&-=2%IcKML zA>TZ?(s`)BH>)?ghmF4WR$mvn9qMg+iI6b7qIye!a)Tbb>XnUsGr@rFT<3A5$-|}y zq0**-yyyYw4~fIBqcX?)lg`F#1uB(_yt@zifjGeiX}^2My;|^~sNcizY)tw~{-3+s z#YNVsqdTU*LPU6FHVWMO`0)@u06;|$21i%k70$!BM+=9cAL`^tF-cFC>YZEitI)IV zJ#}JHf9W^$zAr=`bp@97QL%6JD>I)P+8}SqZ}IM*;86)iEQ2E zb%k}L^on1XuOYwr^qTzYw?H1_VdLu|+fg8c*{EkrZx<>@5G^(5jan~h`-zF5|DtJ* zl}a(uq*__g!!<$NLWO2Jw7q2JWEvuH_-P=64x~>>r35Wh7pBrWT`@C3&i1|G&y@-T zy&$!gteG#*Lp53rqAxAWXeTUkEe#nWMJx9ZxT3ditvu=wouS-bA+_nqPNA==IIncL zE=*40*wN{S9duH5i-odwSaDrac=+&v8Cbmto)3>*9GFB2gk}k+eEZsG2TyJ<`R=b1 z!MLp8y{NRAzMP0TVE5TCTsDJSV&`LHnoaQxigMN|Af*%0z-`dQ>5 zB2#llj2Z5(|2$$`Gzo}J_@CIoN?T@cTM$(Roj);UgBgXkJnatO_$(%zWc&_|1LDaG z#>IFa8y^dG2nnh2Q=Rzhc~ANh{YsJk4b2JMnqW|P2CUq2zx+-6{SHMOqarkcT*v}7 zwZn9vGgE^PC!>Z*n@dYv>B5Ki!dd@Q8#k?g%RpL@*R#pg^ZEuw(tCwT?CTPX^GJez z!zc-3(DPGrZn}LFK24r{tlyg;H(tMcir=1v7BklJxof(n>Dk8GL;iL5@~7IvG#Y+w z%iaW}nT`t>jw3+~#tuM}I+^s(si|FJd$l0=|1Dz(R-eDw;C+aSNe&E|tlLPZPdBU8 zet(eTl2KIt@-!q6+YY{JdPHeZ%(8vw0~{9-@cRTSCAPiu#=F;zlHgF^4mF^CGEC)M z1gvp-m`uJ|%&Z?g5j@RyPp}cn(EH2AylB1YI#+Wj5(?$O{}a zrcKFBFGShq+$r4T1(^pq(-t+Zv7nRIZ#w?tql4~flvBiL8=QXz$IH3uGCFgIHcgS_ zWxW>3=>h~|zttPto_~D`Z%29r_@U8$z>~=3l~C0zwz8s};yy{axb_`(93mv1>PeIM z;g*T;j%hg4t)qWQ%n63OsjEn@5IHAeF*Yie$Cxw4|Wdl+IlQXpkO8 zM?+PTfrhl-6C?t`_`NZy8t)-I<=^A~kKoY2CCI}P3*pIz_2YkO0|>0v1fg_&rx)KW zcIq|p2M5qA`2F$w9?Q_bV7jHTPk((b)1HaA^yc`ZjAwouAC81`*>PkxGirbGOyk3EJlg2V(>-awvHQmt%Z*6|G@Y#(b5qjogP0QrgE9cL7XAmcetrk*F=^NvlOH770G(cvMi%um}06(w-OadF!vjz zzn|pq8z187M?$m`3Be#UM=jclG-#gbN*zax@jv4tQv3T>v#T@?G=Zr%a4tDde*Q^Z zfbrYoU;xDqVve2~mZtoF(%z3@dm4`eWMtYg-MBI8VAkuj86Ujv+55p;M2JYeuOQGz z^F|*pEW=8VUKG_twrw1*r zH?|u1{*@iBF&~uYZ?7oLsA2WIBNr^H|G}L9mnu%!b%~|xdoMCvuYBrXwzx0&xQ#lj ze9CJl4xyZwCq3f4n|Knl9AY-4g5UJCo}`D{^UfI+E3sx~bai$6Wt~AShMyCOQ`HO0 z?7L&-g^B5oZUijc8bALV?}KDn^hhv;tmDU07Mm#Y0G)KnYY)P&)+9#JM~i~XdV1{bi#3UG*NBVh%#GAgx){0Q z9QD?4c7UEmTSQM`griUlUs3wf6mM>ZcAqaC{Lc9t7v{8+TD~Sda574xF8nIjf7WLy z{?k7UdbMhD=R&yf!mzS;4d-~7V-Y~1C2{|$Va&5k2}Pk}m5^SNg)$4M5@1H@kT8~= z9x%XPpOPGNiG8~D&=ugddy+lP0rb`Os`EZykYv_+oH|dTp1RiavUU-x^HM$Q*nv+n zvs$UH`<1)R)l`%UQs_SF0sOa^{b}?;ISiSl!zFkMkH*i0LO`@1J~pz2=Z6A>m?M@AWb#IBHK+3tYyR zZ5ZwMJmBEPC>#=yZaY)yTp_rLdRRZ8W=17h;-l}3E49^?%W69x4I?G$CMoaGn;095 zYu)qvrSpNI6Arq(tApJ1Q=WDtMHRVJuRsicxxR#;MUGQ=baeh3Hbf%yERTFInW~`B z;9i3%en5M%Yh>tkFJ+6qdnjSFVYFXVJlv1L#!kPT)--xf72sTG@QWO6F(9yh=v-7n z)hGaf0CswRT7xc=OPPT)skivTz@y}nPGceb*bj+ zWRY@lJ**@s+lO*nrk^=_+h`ylI$>LsvbSEH&NzRB^-&a4pBXmznrFDqfT z4Nk63KsWm-&m4iUTkrpI@ckBl>20$;IdQA+WQCkJ6g9%l@134Q1c+z} zq7G^_yd^c&Wf8|LQ?^&5CI~%BRWR(Tqok+T#crwF`9AlYPNqsIJa=x%KvxUqKY1Ov zcH{G_1EoWe+)ANNpAH0WX`j~dDLUg z65=#aI%jJFlVcbPL=_bPoYMrYesv-p9(;cCY>lJ4NE*xyw|+@+Ib~sKRse0kjU(M6 z^;wXkF_P#=j8rH6m9i>)4`doxxtEu$~&stuhe8#I{>wJzZc76T184Io|86hA2Lj1IGAI&xw?iJ1w zaVl0sa`{ybNo=M`zeF04J+nf*4hNyki)m^wR!BH`>HD@%RFPeAQ6mZVx>|ANiR%Tr zc;5?;0p)qDzH0r$$dQ;fOdMnL@>d%kl3dCg!+G~GDW$VJ{2pHO90a~ou}<08cJLoX zeP2WrL;wUX_NYZcH#v`;f%=G{acPJUsm`yia31oQA+~Sgp5>;W-7N=4%Z%+%AYx1) zi}b#T9>e4>XE#>YaGQ2?4*=2`Ruzx#IJfkoN8d=(xo*{x+YJS=2{{F%ih>;F>bqOy zT}>NBujSt^jJR#M*w-GlGIsZ{yV zi&R<(MJ9dsrz~@JKy{=}Pn#nSD@Pp;M2_gY*ue1|QDzbWdTi;(e~)B2E4k8?sT;L? zr8O48HbDVWg6-PrtY|A3()XfCIwdOmT>TjkFE=DjDs_{m_-jzup0A1zcX6S96L$47 z!;vn^b*H#f81aHCR`a1_?4uRWVp_MZdr6dc0Np<+PN9AEe9Bup*zL<+^tbG*Z<*q~ z4cS(Q9oc!2*5A1_D-k_VJ=gj3WDALQ!G7!V`eO=Si~MaRL->g5Q11O^8NFk|%qo#W zZN8bxQ73sQfgw+_<LNMicc8r64>F+1>i#|n9Q_pO<1$3*ShfM#L5|mQMIxg z;fE?Es*&j$lwzN(b+yLzpUI98d;(}$92=(rt~ij0Xcd&LSqYjNzy8f|A$C`~)Iada zt~_yX)c4aah@2{3*!If>FzNhqry;w&u}+|@{HmY08^OsEU&(UMYrOiP2<1*aZlVzR zD}%ASM+VaSURZK(K?&{Kp zd;PX2|AA6OJP~(?dFj1@5A}3GGVlYo851_l+O__9cc*daWfcDj(JSU~ zE|)Pr;Y&fC0l)7A`d{G@e(#@Kg^Ya17n>chL^yJ@w!5k z_cwl)AeUWr$)B}Qy);rMWbLht(eV$=YTfqS9%gdb9%g8mcI)fri}t+8bch$)(9^#A zD}}8yx8A3If12uf#r;KuFuTNzUgV8MJPF<&^)Nr&5bEKK@js&W%r-gejjQg_?Ao*7 zQb3)?m?QNMbUw;9w|fPGF2p8X52S|DspyM|xt3a2 zopjSbHS&~nNv(T}`Bv$oyG;1y#qr^Knj=3~MGd5`Q=7B)Opt{;%ObtP8S|(|IqKBO zs5N#l)k3DXS*H`*mF0?sfz-g_9b1e(Ge4lx2UfbO?Ut zb4i<%bp>jyS{!B{G}pZ(u&B4;Sg6%syMiP``>vkmq_zOs$k?m$N%l3@u5v;d$-irZ zcF@ZOx6L8ZYAO>k3fI!IHFU#a{wofAsc=xpN}Z%w=(2?~eWFi6_!X}&qp&a;Ey(Wt z`GZcBA%<7~?Th2V<;UrQgLTN?RdJZ+m}(APcRPf?yk05UDYe%e7g(?3dXeX z*7zcWSFKXzS3caAcMZ7U`xSE@_#XBuLVO~<*BE@3mvJTUN}%jybUvt%OmT0as`Ico z*B~}2G;7VKhbW2+ae{H8j0R1^;>NbGJdV6craIF)<`MEmLy>DqzkNG?Nw>5+#1A3D z9tDs1y4-74;Ep(xQ`Tg6#A-C+Wc^y6hSw+gqOrJV z$QCt-h7!*<6h#&#=BSS4Hso3kZ9v|d__FrHc^2O_6o&1UXtDmwu%$?KD#VeM+Uoqw zsq_A7kr%qjMU##QD!b$t;JddcqZ?NNKF_Co8TKm|&Dke+s`?WFh06n}~lSA(u?92MO7C2G= z;>HBK(+~1Uy|28FAVBt^1_Y^`eo(ioR~OqA?`dca|pC8##Ik&W*G_y!q8x`qw>4B`PI_C?!p0Sny>EBxpO03)r!4Ck%I~S zJ7aaFMWTj?oH|m=?(qh3U+(2H+tMO&8PdaJ4vR17B6Ly1h(_z&6>3E{8qQq8I;31i>(Ir9)|x+bHsVjqO%`J%xKZ2^vw07% zZNJ`5IO*nI1Z`4VHKNM04i`P}Eqc&TI?@lm)@-b{+Ql(s8m3#0us^UdvU1pM7vX+GQsVabzEHYr{{P zmC@I{(+$WwC#EkkWYeH&;Dcj_a0|QTL)&?wOLRn&Ym38m{o0x?om6QEUDcf^A8EQ^ zc&$YW;Yg44^^&!OyUf)kuAi^dN>w^(Rm7-$89f$(i}AK)L$R ztS5#jx640=npowerhb-kc^lP7v8dGC;$$*Q8?~5&P@;88vD)Im{2$!jt!-_VQ0}z4 zZ6&eh^Wj@s8cBjmxrpf)I^UWQnvLvi^xp@s=cR%!@5cx5R~&Bp6raIyg!rGU4|OO} z|5d@;`>zkLL(CYv9PwtSF=)pm#ZO6s2#t#SbtMT*TM^|w&SHAJ&i zx*Qae5|*auHdCBY=8=%hJn198?~fqXLtZ&#a&>8g4e$1mhu7Xl)Y%6%CJ7?97cc{> z4h;Rd9}LL-WClt54LiE3 zm&PO)*ydW5737yzGwU{QDJH>1u|sctFRF`WR_&0sm(EN+QXZ`&EPPW=kYI@G*?*wxy4vNybSA@3AEZ)Evh8TCgmMS z;?iY0MKGTmrW1Z{$kV-caNE2RTA$kN&EvU}ZJiDa_FtJiUv%I;@4Lu_o{Y|W*&!13 zoI;0d)H|oaj(C6@_>x(3szUg9GOURbo2~m@wW*s@EkKjlp0d16RWM(Kq1tv+DJGag0{BcuY^OX8PXjmwC(gONtOWc3X}#w~a9Tet&!(??84I7MIb z%>qegBtAhzd*YP&YGs`5U>{o*P&IIIZhkc&CwD_QQc75c=jATQ6so#dEzPf~VYzg1 zpp6kq=1eI>v_O@fTPVv%ZzHOJ1$PqGm?SJ*RV&p#aU=RZAu zJLAC8Q`p7$SH=_n{Bsjl_tbauk1zYk5ne&EnSc$saewS(4C~OF-jcMu@y+-Vz9xsi zRAV~VbSefTiP;?6lms&}ZkFvJ_iOzvHa>>)K)xUqsPaetXWakO7oZ--<4gz9q^7?4 zUBf+182sC-{pQD>`hnkmZhS`oC0zfvmwxi@$cx!?+mn4XnPdEOuBmLL*GCjn2?Y`gTY(Dj{ zPk=g8<2|{=)9BI@1poJ!|Fv_-;lDX$9RD+2_Q~yybrO;A@xP~z__h7Wo{7<*>B|#O zo)$YsIV0j_+JS8SyKPKfpIpEsku2`MUY2tw+BcNs)Mub3B5AJiCL;z7;5PDh`fsGq zh`)`&tz&=<+6zxQj<%w_A`vlCHWK&$tGGZvm>PCDv6aXnx2B~Sg%KyGvFPL+=}jcq zjs*^l1HMM-9y?{{+3-k95v>d*t%~ zmOE0h!DPTb1=eniO5^?5zC{7(Z>&~2i}xM{ng1WN=UJN6MWRDTR2Ij8dXYzX5#|8J0f{8cP}tLV`##)_fP-J6Za zLDx(bf4O?^q*?ku>5nl62O{^lZY(te{L zLHh7SZpQ{HO?vJTN)-HIixLr{8=#ou7aEtvrv=Y+Go-~xOCjb72amVk*!As$&)ze_ zuulfqZ+7~Ij5K1~f3JNARQ;P~CCSs{mozoPe|o!Sgybf2(ad^dmOT~%1JVIKp+sP( zA$K1{*QH0^`>XKi3AfHqSow(dnc?K*g#ly5@3ZGuUNVePHyA-6L+t-;kFRcT8R<60xm2dDtY3om3Wl=E+Bcw zZ$Ih`S~voTn`dtmBq|fziyp`RDAoieDC>g~d*}w>MnWE6CUrp8o26zEa54(WxFilA z#;}@%GEio^s$sbWT2u-95?rsBt^IkYu+2hofc29rYRBtzX7R=<5;p+PbcrM5?2#S} zOPm0RMuYlML{4q%;o&y7f#`dVP_HJxyebOMaL-d27Yg#N*V3N51MVL2it`p&i&gFNQM6bU9vo_0lUPS+#pU`-?Vg&vS~(fMv-R9Nm{u zWZe3!%RIRFf#3NKw{4q-VyaahN7ih*^LE@L!E6se688!VRP$en_psyL)Wt+De&Dk{ z(i6t$nh_*@G&O#%jnBU|IwWowwe25Oj!rAsaM3=t{xy|`r=$kBWJc_d-&Y|X;oNXMTv*+z;{GCW zeWI?vY|Hz}>tEAXRoAc$I=N3rU12)%@4aI5juWUg>TsQ88zYt0Y)j={vMkkvGU*^* zSj(}B+T=8^qT|r`Zj+k!Q$CXio)>c}Hc?(3K*6j=wBQw)dE8S=N zStf!;BrL9?eo;F;h|^AUkmVu4Bgu>rp@eK`Uu~8NU9Uk>E~E+vEj}{jAu2meEh8lK zM3;Yg);p^;&c5k-Uz}iSb_jf30;hU+IJ}17T7}o!2>hqH0aa0{Jg}BhWg!&@`eVy< zaJ;ZZYa*I9T=a`yHPXN1V)sV9FLzi!cL|4eJ9dXOU6i{cl^O)%3Z-7}EZuB9@U4(> zP_O38!W-FPSAS9`Z`5yKY-T>2pa>3ykARxxDq6DG?Eqh)mQ*M{Z_W#iR9oa}g`9*5 zX3>-yp`YsyYh8KNLV(~i1I>RJ)6X}0ry3gSe9wADDC0Qs2^$(t-1k$jwldoB96t18%OO6>O&vziYn8@6wp;ogR%8N zJf)+=OS)ihE}(#1o8Vjv*>_!a@WZI51HwfT3F^1c>|tM`97`_{FxY!mf%~*J8>n0j zHyJ*;aKf)x=oOanJtORz#>P>iqh`ExavS%F+DJdkJ&oJJoI+G~PRvkr$J^19D|iRn zToByTHk+hmyl;T7D^Di6-cYa`VA}B-cQSX!+K_OmdLJjf;ao&cqH6?}ms!TI)_6p=P6f8*LAS3CYmB#>-Qcj1} zYAV)Kj=C}UTGn(yRcU*lT2z4Q24q4@^gjInTEaKem{9N)+8RTvx9!tzw7zGh54s=1 zfD8fryJfeMxDN!M!Y{Za&hp|nT4{RddUhd*S)^E~v%0!i-4~t1ohenaby%SXE^%?D z^gXfB#%;Br_$M-Gyn+A13*oOIqi*~KcV#jcOa?r84AWICbB~h(8ZBc+3Csg<%owSX zT#V+KFJ6ty0Nl*jO5l$_zx>yaesBGlerW6fSj6Ox#ut9)9{t{=eDcJmopGA2%}+ha z_%r<)X6N{;&5BipDNxq<;Koo{-&(EHkxi7TOZM_E<+qxN#c#6mCk2wv_x#uV= zXr|v>y>w>pnS{`x+qZA#Ux=!XNbEh6xcl_V+c&q=416_Ol{jpz9_=uGeTS* z)+}A6iMAN+zVzGMd+JsnXg#Ozr{8yv-<}-d@y5-_GiOGQ+>0L_YI;Ne+2~h;gB#xL zNSOOo@5O_+SRZV8bMTEvZ=SokbUEjy;Vbo9_D@~sPj-Kr@E3>Y-iv%Udi%Eb_#(0w z75@HnTvrEI2kdxz|38&hO-~y!5WVMD_<{gcVrTsA3grM42~`LbI8+K8HdzOyf^3y6 zD)iTP>;41|gtqd&FRRToXAv%~6qscSOd<3Y@+4I|wIQkvQEiCIA@|$D zHdOO7NkMoQ<@53_eHPi_*KK<3GmB~Em|Tglse*~Hx}Dk(_olcF$=#m(mx8RQqo6IN zZQej430v_#DQTDHy*w?O^09u%drG^^O7+`TU)I%G*~EjhuM*G$%79V@X}^Hq2iQL> zPRT;evR?f=imXyS&*S=FnS3JT5gaLTcQAVukM-~JVHuC+_0!$q;a2g>Ixa?J7CVBE zA*?a9feXPgD^_oqwxmjaCZDr7R0cfRrn{CfiL_H)EPpV4QYs6qUew+s$92~d=6Kv-zM!4! z_X>!^C3ko85#~LM8_K7gguwbN1ND^ED}w>ML%rG}CVzLe5Qj9Z2ZSl!gCTun0t0L> zi9@9W-{l}oTc&v^pVi>FH;98qKObQ(Fdq!%bJ7{j{6`!CSw5=~^e*`vN?`pX4#&?C zVP5t*(wVW2^<_viIb0hS=Nu~TA;R=79`YW5pF!fFUF!FgFvop0q%V*@9!DG)Sf2?~ z$hBS`uB|l@I`aF~m!CLIshG3Kep3ji&chHAA z1n9>hak%v6rSW#}Cd`K&`X_0P?w?;o1N=Tn81j2E6ZY@KwXjP~}vU7e5q0)mIT00000 literal 0 HcmV?d00001 diff --git a/OCR_USAGE_GUIDE.md b/OCR_USAGE_GUIDE.md new file mode 100644 index 0000000..38a2258 --- /dev/null +++ b/OCR_USAGE_GUIDE.md @@ -0,0 +1,237 @@ +# OCR热量识别功能使用指南 + +## 功能概述 + +OCR热量识别功能允许用户通过拍摄或上传包含食物信息的图片,自动识别其中的热量信息,大大简化了餐食记录的过程。 + +## 主要特性 + +### 1. 多OCR引擎支持 +- **Tesseract OCR**: 开源OCR引擎,支持中英文识别 +- **PaddleOCR**: 百度开源OCR,对中文识别效果优秀 +- **EasyOCR**: 简单易用的OCR库,支持多语言 + +### 2. 智能验证机制 +- **多级验证**: 结合OCR结果、食物数据库和用户学习数据 +- **置信度评估**: 为每个识别结果提供置信度评分 +- **用户修正**: 支持用户手动修正识别结果 + +### 3. 学习优化系统 +- **用户反馈学习**: 记录用户修正,提高后续识别准确性 +- **数据库匹配**: 与内置食物数据库进行智能匹配 +- **模式识别**: 识别多种热量表示格式 + +## 使用方法 + +### 1. 启动OCR功能 + +#### 在移动端界面: +1. 打开应用,进入"记录"页面 +2. 在食物输入框右侧找到"📷"按钮 +3. 点击按钮打开OCR识别界面 + +#### 在桌面端界面: +1. 在主界面选择"OCR热量识别"功能 +2. 或通过菜单栏访问OCR功能 + +### 2. 上传图片 + +1. 点击"选择图片"按钮 +2. 选择包含食物信息的图片文件 +3. 支持的格式:JPG、JPEG、PNG、BMP、GIF +4. 图片将显示在预览区域 + +### 3. 开始识别 + +1. 确认图片选择正确后,点击"开始识别"按钮 +2. 系统将使用多个OCR引擎进行识别 +3. 识别过程中会显示进度条和状态信息 +4. 识别完成后显示结果 + +### 4. 查看和编辑结果 + +#### 识别结果表格: +- **食物名称**: 识别到的食物名称 +- **热量**: 识别到的热量数值(卡路里) +- **置信度**: 识别结果的置信度(0-1) +- **来源**: 数据来源(OCR、数据库、用户确认) + +#### 详细信息: +- OCR识别过程详情 +- 各引擎的识别结果 +- 处理时间和整体置信度 + +#### 建议: +- 系统提供的改进建议 +- 识别准确性提示 +- 手动输入建议 + +### 5. 编辑和确认结果 + +#### 编辑结果: +1. 双击表格中的任意行或选择后点击"编辑结果" +2. 在弹出的对话框中修改食物名称、热量和置信度 +3. 点击"保存"确认修改 + +#### 确认结果: +1. 检查所有识别结果是否正确 +2. 点击"确认结果"按钮 +3. 系统将保存到餐食记录中 + +## 识别准确性优化 + +### 1. 图片质量要求 + +#### 推荐条件: +- **清晰度**: 图片清晰,文字可读 +- **对比度**: 文字与背景对比明显 +- **角度**: 文字水平,避免倾斜 +- **光照**: 光线充足,避免阴影 + +#### 避免的情况: +- 模糊不清的图片 +- 文字过小或过大的图片 +- 严重倾斜的图片 +- 光线过暗或过亮的图片 + +### 2. 文字格式支持 + +#### 支持的热量表示格式: +- `130卡路里` +- `155 kcal` +- `52千卡` +- `42大卡` +- `110 KJ` (千焦) +- `76卡` + +#### 支持的食物名称: +- 中文食物名称:米饭、鸡蛋、苹果等 +- 英文食物名称:rice、egg、apple等 +- 混合格式:米饭 130卡路里 + +### 3. 提高识别准确性的技巧 + +#### 图片预处理: +- 确保图片中的文字清晰可见 +- 避免复杂的背景干扰 +- 保持文字区域的完整性 + +#### 结果验证: +- 仔细检查识别结果 +- 及时修正错误信息 +- 利用数据库匹配功能 + +#### 学习优化: +- 经常使用修正功能 +- 系统会学习您的修正习惯 +- 提高后续识别的准确性 + +## 故障排除 + +### 1. 常见问题 + +#### 识别失败: +- **原因**: 图片质量差、OCR引擎不可用 +- **解决**: 检查图片质量,确保OCR依赖已安装 + +#### 识别结果不准确: +- **原因**: 图片模糊、文字格式特殊 +- **解决**: 重新拍摄清晰图片,手动修正结果 + +#### 无法打开OCR界面: +- **原因**: 依赖包未安装、模块初始化失败 +- **解决**: 检查requirements.txt中的依赖是否已安装 + +### 2. 依赖安装 + +确保已安装以下依赖包: + +```bash +pip install pytesseract>=0.3.10 +pip install opencv-python>=4.8.0 +pip install paddleocr>=2.7.0 +pip install easyocr>=1.7.0 +``` + +#### Tesseract安装: +- **Windows**: 下载Tesseract安装包并添加到PATH +- **macOS**: `brew install tesseract` +- **Linux**: `sudo apt-get install tesseract-ocr` + +### 3. 性能优化 + +#### 提高识别速度: +- 使用较小的图片文件 +- 选择清晰的图片 +- 避免过于复杂的图片 + +#### 提高识别准确性: +- 使用标准格式的食物标签 +- 保持文字清晰可读 +- 及时修正错误结果 + +## 技术架构 + +### 1. 模块结构 + +``` +modules/ocr_calorie_recognition.py # OCR识别模块 +gui/ocr_calorie_gui.py # OCR GUI界面 +test_ocr_system.py # 测试脚本 +``` + +### 2. 核心组件 + +#### OCRCalorieRecognitionModule: +- 多OCR引擎集成 +- 图片预处理 +- 热量信息提取 +- 数据库匹配 +- 用户学习系统 + +#### OCRCalorieGUI: +- 图片上传界面 +- 识别结果展示 +- 结果编辑功能 +- 用户交互处理 + +### 3. 数据流程 + +1. **图片上传** → 图片预处理 +2. **OCR识别** → 多引擎并行识别 +3. **文本提取** → 热量信息解析 +4. **数据库匹配** → 食物信息验证 +5. **用户确认** → 结果保存和学习 + +## 未来改进计划 + +### 1. 功能增强 +- 支持更多图片格式 +- 增加批量识别功能 +- 支持手写文字识别 +- 集成营养信息识别 + +### 2. 性能优化 +- 优化识别算法 +- 提高处理速度 +- 减少内存占用 +- 支持GPU加速 + +### 3. 用户体验 +- 改进界面设计 +- 增加语音输入 +- 支持离线识别 +- 提供更多个性化选项 + +## 联系支持 + +如果您在使用OCR功能时遇到问题,请: + +1. 查看本文档的故障排除部分 +2. 运行测试脚本检查系统状态 +3. 检查依赖包是否正确安装 +4. 提供详细的错误信息和截图 + +--- + +*最后更新: 2024年12月* diff --git a/PROJECT_SUMMARY.md b/PROJECT_SUMMARY.md new file mode 100644 index 0000000..485f0b5 --- /dev/null +++ b/PROJECT_SUMMARY.md @@ -0,0 +1,193 @@ +# 个性化饮食推荐助手 - 项目完成总结 + +## 🎯 项目概述 + +基于您的需求,我已经完成了一个完整的个性化饮食推荐系统,具有以下核心特性: + +### ✨ 核心功能 +1. **5天数据采集** - 详细记录用户三餐数据 +2. **智能问卷系统** - 收集用户偏好、生理信息、个性化因素 +3. **大模型集成** - 深度理解用户需求,提供智能分析 +4. **混合推荐系统** - 结合机器学习和AI的个性化推荐 +5. **持续学习机制** - 根据用户反馈不断优化模型 +6. **女性专属优化** - 考虑生理周期、排卵期等特殊因素 +7. **现代化GUI** - 基于CustomTkinter的美观界面 + +## 🏗️ 基座架构设计 + +### 核心基座 (`core/base.py`) +- **BaseModule**: 所有功能模块的抽象基类 +- **DataManager**: 统一的数据管理基座 +- **EventBus**: 事件总线,支持模块间通信 +- **ModuleManager**: 模块管理器,统一管理所有功能模块 +- **AppCore**: 应用核心,协调所有模块 + +### 功能模块 +1. **数据采集模块** (`modules/data_collection.py`) + - 问卷数据收集 + - 餐食记录管理 + - 用户反馈处理 + +2. **AI分析模块** (`modules/ai_analysis.py`) + - 用户意图分析 + - 营养状况分析 + - 生理状态分析 + - 餐食建议生成 + +3. **推荐引擎模块** (`modules/recommendation_engine.py`) + - 基于历史数据的推荐 + - 基于相似用户的推荐 + - 基于内容相似性的推荐 + - 基于生理状态的推荐 + - 多维度融合推荐 + +4. **GUI界面模块** (`gui/main_window.py`) + - 现代化界面设计 + - 数据采集界面 + - AI分析界面 + - 推荐系统界面 + - 个人中心界面 + +## 🔧 技术特点 + +### 1. 基座架构优势 +- **代码复用**: 所有模块基于统一基座,减少重复代码 +- **模块化设计**: 每个功能独立,易于维护和扩展 +- **统一接口**: 所有模块使用相同的接口规范 +- **事件驱动**: 支持模块间松耦合通信 + +### 2. 大模型深度集成 +- **用户意图理解**: 不仅理解表面需求,还分析深层意图 +- **情绪状态分析**: 考虑用户当前情绪对饮食需求的影响 +- **生理周期智能**: 专门针对女性的生理周期分析 +- **个性化建议**: 结合星座、性格等多维度因素 + +### 3. 智能推荐系统 +- **多维度融合**: 历史偏好 + 相似用户 + 内容相似性 + 生理状态 +- **持续学习**: 根据用户反馈不断优化推荐算法 +- **个性化过滤**: 考虑过敏、不喜欢等个人限制 +- **置信度评估**: 为每个推荐提供置信度评分 + +### 4. 女性专属功能 +- **生理周期跟踪**: 自动计算月经周期状态 +- **营养需求调整**: 根据生理周期推荐不同营养素 +- **情绪变化考虑**: 分析生理周期对情绪和食欲的影响 +- **个性化建议**: 提供针对性的饮食建议 + +## 📁 项目结构 + +``` +diet_recommendation_app/ +├── core/ # 核心基座 +│ └── base.py # 基础架构 +├── modules/ # 功能模块 +│ ├── data_collection.py # 数据采集 +│ ├── ai_analysis.py # AI分析 +│ └── recommendation_engine.py # 推荐引擎 +├── gui/ # GUI界面 +│ └── main_window.py # 主窗口 +├── data/ # 数据存储 +│ ├── users/ # 用户数据 +│ └── training/ # 训练数据 +├── models/ # 模型存储 +├── logs/ # 日志文件 +├── main.py # 主应用入口 +├── start.py # 启动脚本 +├── requirements.txt # 依赖包 +├── .env.example # 配置示例 +└── README.md # 项目说明 +``` + +## 🚀 快速开始 + +### 1. 安装依赖 +```bash +pip install -r requirements.txt +``` + +### 2. 配置环境 +```bash +cp .env.example .env +# 编辑 .env 文件,配置API密钥(可选) +``` + +### 3. 启动应用 +```bash +python start.py +``` + +## 💡 使用流程 + +### 1. 用户注册/登录 +- 输入用户ID和姓名 +- 系统自动创建用户档案 + +### 2. 数据采集(5天) +- **基础信息问卷**: 年龄、性别、身高体重等 +- **口味偏好问卷**: 甜、咸、辣、酸等偏好评分 +- **生理信息问卷**: 月经周期、排卵期症状等 +- **餐食记录**: 详细记录三餐内容和满意度 + +### 3. AI分析 +- **用户意图分析**: 理解用户真实需求 +- **营养分析**: 分析餐食营养状况 +- **生理状态分析**: 分析当前生理周期状态 + +### 4. 个性化推荐 +- **智能推荐**: 基于多维度因素生成推荐 +- **用户反馈**: 收集用户对推荐的反馈 +- **持续优化**: 根据反馈不断改进推荐算法 + +## 🔮 核心创新点 + +### 1. 基座架构设计 +- 避免了"一个代码一个功能"的问题 +- 统一的数据管理和事件处理 +- 模块化设计,易于扩展和维护 + +### 2. 大模型深度集成 +- 不仅用于营养分析,还用于用户需求理解 +- 结合传统机器学习和大模型的优势 +- 提供更智能、更个性化的服务 + +### 3. 女性专属优化 +- 深度考虑生理周期对饮食需求的影响 +- 结合星座、性格等个性化因素 +- 提供更贴心的个性化服务 + +### 4. 持续学习机制 +- 避免完全随机推荐的问题 +- 根据用户反馈不断优化模型 +- 提供越来越精准的推荐 + +## 🎉 项目完成度 + +✅ **核心基座架构** - 完成 +✅ **数据采集系统** - 完成 +✅ **AI分析模块** - 完成 +✅ **推荐引擎** - 完成 +✅ **GUI界面** - 完成 +✅ **女性专属功能** - 完成 +✅ **持续学习机制** - 完成 +✅ **大模型集成** - 完成 + +## 🔧 后续扩展建议 + +1. **移动端适配**: 开发手机APP版本 +2. **云端部署**: 支持多用户在线使用 +3. **更多大模型**: 集成更多AI模型 +4. **营养数据库**: 扩展更丰富的食物营养数据 +5. **社交功能**: 添加用户交流和分享功能 + +--- + +**项目已完成,可以立即运行使用!** 🎊 + +所有功能都基于您提出的需求设计,特别是: +- ✅ 5天数据采集系统 +- ✅ 大模型深度集成用于需求分析 +- ✅ 女性生理周期智能优化 +- ✅ 星座等个性化因素考虑 +- ✅ 持续学习和模型矫正机制 +- ✅ 基座架构避免代码重复 +- ✅ 现代化桌面GUI界面 diff --git a/README.md b/README.md new file mode 100644 index 0000000..2be2f4c --- /dev/null +++ b/README.md @@ -0,0 +1,324 @@ +# 🍽️ 个性化饮食推荐APP + +一个基于机器学习和OCR技术的智能饮食推荐系统,具有现代化的移动端界面和强大的AI分析能力。 + +## ✨ 最新特性 + +### 📷 OCR热量识别 +- **多引擎OCR支持**:Tesseract、PaddleOCR、EasyOCR +- **智能图片识别**:自动识别食物名称和热量信息 +- **多级验证机制**:OCR结果 + 数据库匹配 + 用户确认 +- **学习优化系统**:从用户修正中持续学习改进 +- **一键记录**:拍照即可完成餐食记录 + +### 🎨 现代化界面设计 +- **圆角设计系统**:统一的圆角主题,减少方形元素 +- **多色主题支持**:主色、次色、强调色等多种配色 +- **移动端适配**:专为手机屏幕优化的界面布局 +- **卡片式设计**:清晰的信息层次和视觉反馈 +- **响应式交互**:悬停效果和状态变化 + +## 🎯 核心功能 + +### 1. 智能数据采集 +- **OCR图片识别**:📷 拍照识别食物热量信息 +- **5天三餐数据记录**:详细记录早中晚三餐的饮食内容 +- **用户偏好问卷**:口味偏好、饮食习惯、过敏信息等 +- **生理周期跟踪**:针对女性的生理期、排卵期等特殊时期 +- **个性化因素**:星座、性格特征等参考因素 + +### 2. 机器学习推荐引擎 +- **个人饮食模型训练**:基于用户历史数据训练个性化模型 +- **持续学习机制**:根据用户反馈不断优化推荐 +- **偏好矫正**:用户不喜欢或已食用食物的反馈学习 +- **多因素融合**:结合生理周期、星座等多维度因素 + +### 3. AI大模型分析 +- **千问大模型集成**:智能营养分析和建议生成 +- **热量分析**:每日饮食热量计算和评估 +- **营养建议**:基于大模型的智能营养建议 +- **个性化指导**:结合用户特征的定制化建议 + +### 4. 现代化应用界面 +- **移动端设计**:模拟小程序/安卓App的界面体验 +- **圆角美化**:统一的圆角设计语言 +- **多色主题**:丰富的颜色搭配和视觉层次 +- **实时推荐**:动态推荐系统 +- **数据可视化**:饮食趋势、营养分析图表 + +## 🏗️ 技术架构 + +### 核心基座 +- **统一基座架构**:模块化设计,支持功能扩展 +- **SQLite数据库**:轻量级本地数据存储 +- **事件总线系统**:模块间通信和事件处理 +- **数据管理器**:统一的数据访问接口 + +### OCR识别技术 +- **Tesseract OCR**:开源OCR引擎,支持中英文 +- **PaddleOCR**:百度开源OCR,中文识别优秀 +- **EasyOCR**:简单易用的多语言OCR库 +- **OpenCV**:图像预处理和增强 +- **PIL/Pillow**:图像处理和格式转换 + +### 机器学习 +- **scikit-learn**:推荐算法实现 +- **pandas/numpy**:数据处理和分析 +- **joblib**:模型序列化和加载 +- **TF-IDF向量化**:文本特征提取 + +### AI大模型集成 +- **千问大模型**:阿里云通义千问API +- **智能分析**:用户意图分析和营养建议 +- **个性化推理**:基于用户特征的智能推荐 + +### 现代化界面 +- **CustomTkinter**:现代化Python GUI框架 +- **移动端设计**:375x812像素,模拟手机界面 +- **圆角美化系统**:统一的视觉设计语言 +- **多色主题**:丰富的颜色配置系统 + +## 📁 项目结构 + +``` +diet_recommendation_app/ +├── core/ # 核心基座架构 +│ ├── base.py # 基础类和配置 +│ └── base_engine.py # 基础引擎抽象类 +├── modules/ # 功能模块 +│ ├── data_collection.py # 数据采集模块 +│ ├── ai_analysis.py # AI分析模块 +│ ├── recommendation_engine.py # 推荐引擎模块 +│ └── ocr_calorie_recognition.py # OCR热量识别模块 +├── gui/ # 现代化界面 +│ ├── mobile_main_window.py # 移动端主界面 +│ ├── ocr_calorie_gui.py # OCR识别界面 +│ ├── styles.py # 样式配置系统 +│ └── main_window.py # 桌面端界面 +├── llm_integration/ # 大模型集成 +│ └── qwen_client.py # 千问大模型客户端 +├── smart_food/ # 智能食物数据库 +│ └── smart_database.py # 食物数据库管理 +├── data/ # 数据存储 +│ ├── users/ # 用户数据 +│ ├── training/ # 训练数据 +│ └── app.db # SQLite数据库 +├── models/ # 机器学习模型 +├── logs/ # 日志文件 +├── main.py # 应用入口 +├── requirements.txt # 依赖包列表 +├── OCR_USAGE_GUIDE.md # OCR使用指南 +├── UI_BEAUTIFICATION_SUMMARY.md # 界面美化总结 +└── README.md # 项目说明文档 +``` + +## 🚀 快速开始 + +### 1. 环境要求 +- Python 3.8+ +- Windows/macOS/Linux + +### 2. 安装依赖 +```bash +# 克隆项目 +git clone +cd diet_recommendation_app + +# 安装基础依赖 +pip install -r requirements.txt + +# 安装OCR依赖(可选) +pip install pytesseract opencv-python paddleocr easyocr +``` + +### 3. OCR引擎配置(可选) + +#### Tesseract安装 +- **Windows**: 下载 [Tesseract安装包](https://github.com/UB-Mannheim/tesseract/wiki) +- **macOS**: `brew install tesseract` +- **Linux**: `sudo apt-get install tesseract-ocr` + +#### 其他OCR引擎 +```bash +# PaddleOCR(推荐,中文识别效果好) +pip install paddleocr + +# EasyOCR(简单易用) +pip install easyocr +``` + +### 4. 配置环境 +```bash +# 创建环境配置文件 +echo "QWEN_API_KEY=your_qwen_api_key_here" > .env +``` + +### 5. 运行应用 +```bash +python main.py +``` + +### 6. 使用OCR功能 +1. 打开应用,进入"记录"页面 +2. 点击食物输入框右侧的"📷"按钮 +3. 选择包含食物信息的图片 +4. 点击"开始识别"进行OCR识别 +5. 查看和编辑识别结果 +6. 确认保存到餐食记录 + +## 🔄 工作流程 + +### 1. 智能数据采集(5天) +- **OCR图片识别**:📷 拍照识别食物热量信息 +- **手动数据记录**:详细记录三餐饮食内容 +- **用户偏好问卷**:口味偏好、饮食习惯、过敏信息 +- **个性化画像**:生理周期、星座、性格特征 + +### 2. AI模型训练 +- **个人推荐模型**:基于采集数据训练个性化模型 +- **多因素融合**:结合生理期、星座等多维度因素 +- **OCR学习优化**:从用户修正中持续改进识别准确性 + +### 3. 智能推荐与学习 +- **个性化推荐**:第6天开始提供智能推荐 +- **用户反馈收集**:喜欢/不喜欢/已食用反馈 +- **持续模型优化**:基于反馈数据不断改进 +- **OCR准确性提升**:学习用户修正习惯 + +### 4. AI智能分析 +- **千问大模型分析**:每日营养状况智能分析 +- **个性化健康建议**:基于用户特征的定制建议 +- **营养趋势分析**:长期饮食模式分析 + +## 🎨 特色功能 + +### 📷 OCR智能识别 +- **多引擎支持**:Tesseract、PaddleOCR、EasyOCR +- **智能验证**:OCR + 数据库 + 用户确认三级验证 +- **学习优化**:从用户修正中持续改进 +- **一键记录**:拍照即可完成餐食记录 + +### 🎨 现代化界面 +- **移动端设计**:375x812像素,模拟手机界面 +- **圆角美化**:统一的圆角设计语言 +- **多色主题**:丰富的颜色搭配和视觉层次 +- **响应式交互**:悬停效果和状态变化 + +### 🤖 AI智能分析 +- **千问大模型**:阿里云通义千问API集成 +- **智能推理**:用户意图分析和营养建议 +- **个性化指导**:基于用户特征的定制建议 + +### 👩 女性专属优化 +- **生理周期智能调整**:月经期、排卵期等特殊时期 +- **营养需求分析**:不同生理阶段的营养需求 +- **个性化建议**:结合生理周期的饮食建议 + +### ⭐ 个性化因素 +- **星座参考**:个性化因素融合 +- **性格特征**:基于性格的饮食偏好分析 +- **持续学习**:避免随机推荐问题 + +## 📚 文档说明 + +- **[OCR使用指南](OCR_USAGE_GUIDE.md)**:详细的OCR功能使用说明 +- **[界面美化总结](UI_BEAUTIFICATION_SUMMARY.md)**:界面设计和技术实现 +- **[项目总结](PROJECT_SUMMARY.md)**:项目整体架构和功能说明 + +## 🧪 测试验证 + +### 功能测试 +```bash +# 测试OCR系统 +python test_ocr_system.py + +# 测试界面美化 +python test_ui_beautification.py + +# 测试核心功能 +python test_core.py +``` + +### 应用启动测试 +```bash +# 启动应用 +python main.py + +# 检查日志 +tail -f logs/app.log +``` + +## 🚀 技术亮点 + +### 1. 统一基座架构 +- **模块化设计**:所有功能模块基于统一基座构建 +- **事件驱动**:模块间通过事件总线通信 +- **数据统一**:统一的数据管理和访问接口 +- **扩展性强**:支持新功能模块的快速集成 + +### 2. OCR多引擎融合 +- **多引擎并行**:同时使用多个OCR引擎提高准确性 +- **智能合并**:基于置信度的结果合并策略 +- **学习优化**:从用户修正中持续学习改进 +- **数据库匹配**:结合食物数据库进行智能验证 + +### 3. 现代化界面设计 +- **移动端优先**:专为手机屏幕优化的界面设计 +- **圆角美化**:统一的圆角设计语言 +- **多色主题**:丰富的颜色配置和视觉层次 +- **响应式交互**:流畅的用户交互体验 + +### 4. AI智能分析 +- **千问大模型**:集成阿里云通义千问API +- **智能推理**:基于用户数据的智能分析 +- **个性化建议**:结合多维度因素的定制建议 +- **持续学习**:从用户反馈中不断优化 + +## 📈 项目状态 + +- ✅ **核心功能**:数据采集、推荐引擎、AI分析 +- ✅ **OCR识别**:多引擎支持、智能验证、学习优化 +- ✅ **界面美化**:圆角设计、多色主题、移动端适配 +- ✅ **文档完善**:使用指南、技术文档、测试脚本 +- 🔄 **持续优化**:性能提升、功能扩展、用户体验改进 + +## 🤝 贡献指南 + +欢迎提交Issue和Pull Request来改进项目! + +### 开发环境设置 +```bash +# 克隆项目 +git clone +cd diet_recommendation_app + +# 安装开发依赖 +pip install -r requirements.txt + +# 运行测试 +python test_ocr_system.py +python test_ui_beautification.py +``` + +### 代码规范 +- 遵循PEP 8代码风格 +- 添加适当的注释和文档字符串 +- 编写单元测试 +- 更新相关文档 + +## 📄 许可证 + +本项目采用MIT许可证 - 查看 [LICENSE](LICENSE) 文件了解详情 + +## 🙏 致谢 + +感谢以下开源项目的支持: +- [CustomTkinter](https://github.com/TomSchimansky/CustomTkinter) - 现代化Python GUI框架 +- [Tesseract OCR](https://github.com/tesseract-ocr/tesseract) - 开源OCR引擎 +- [PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR) - 百度开源OCR +- [EasyOCR](https://github.com/JaidedAI/EasyOCR) - 简单易用的OCR库 +- [scikit-learn](https://scikit-learn.org/) - 机器学习库 + +--- + +**🍽️ 让AI为您的饮食健康保驾护航!** \ No newline at end of file diff --git a/UI_BEAUTIFICATION_SUMMARY.md b/UI_BEAUTIFICATION_SUMMARY.md new file mode 100644 index 0000000..a736a2c --- /dev/null +++ b/UI_BEAUTIFICATION_SUMMARY.md @@ -0,0 +1,213 @@ +# 界面美化总结 + +## 美化成果 + +我已经成功为饮食推荐应用进行了全面的界面美化,主要改进包括: + +### 1. 圆角设计系统 + +#### 圆角半径配置 +- **小圆角**: 8px - 用于小按钮和输入框 +- **中圆角**: 12px - 用于标准组件 +- **大圆角**: 15px - 用于主要按钮和卡片 +- **超大圆角**: 20px - 用于页面容器 +- **极大圆角**: 25px - 用于主框架 + +#### 应用范围 +- ✅ 主容器和页面容器 +- ✅ 状态栏和导航栏 +- ✅ 卡片式框架 +- ✅ 按钮组件 +- ✅ 输入框组件 +- ✅ 标签组件 + +### 2. 颜色主题系统 + +#### 主要颜色 +- **主色调**: #3498db (蓝色) +- **次要色**: #2ecc71 (绿色) +- **强调色**: #e74c3c (红色) +- **警告色**: #f39c12 (橙色) +- **信息色**: #9b59b6 (紫色) + +#### 背景色系 +- **浅色背景**: #ffffff (白色) +- **深色背景**: #2b2b2b (深灰) +- **卡片背景**: #f8f9fa (浅灰) +- **容器背景**: #f0f0f0 (更浅灰) + +#### 文字颜色 +- **主要文字**: #2c3e50 (深蓝灰) +- **次要文字**: #34495e (中蓝灰) +- **辅助文字**: #7f8c8d (浅灰) + +### 3. 组件美化 + +#### 按钮美化 +- **圆角按钮**: 15px圆角半径 +- **悬停效果**: 颜色渐变 +- **多色主题**: 支持主色、次色、强调色等 +- **图标按钮**: 支持emoji图标 + +#### 输入框美化 +- **圆角输入框**: 12px圆角半径 +- **边框设计**: 1px细边框 +- **背景色**: 浅色背景 +- **占位符**: 友好的提示文字 + +#### 卡片设计 +- **卡片式布局**: 20px圆角半径 +- **阴影效果**: 边框阴影 +- **内边距**: 统一的内边距设计 +- **层次感**: 多层级卡片结构 + +### 4. 布局优化 + +#### 间距系统 +- **小间距**: 5px +- **标准间距**: 10px +- **中等间距**: 15px +- **大间距**: 20px +- **超大间距**: 25px + +#### 字体系统 +- **标题字体**: Arial 22px 粗体 +- **副标题**: Arial 18px 粗体 +- **正文字体**: Arial 14px +- **小字体**: Arial 12px +- **微小字体**: Arial 10px + +### 5. 页面美化详情 + +#### 移动端主界面 +- **主容器**: 20px圆角,浅色背景 +- **页面容器**: 25px圆角,白色背景,边框阴影 +- **状态栏**: 15px圆角,透明背景 +- **导航栏**: 20px圆角,白色背景,边框设计 + +#### 首页美化 +- **欢迎区域**: 25px圆角,浅色背景 +- **用户卡片**: 20px圆角,白色背景 +- **快速操作**: 20px圆角,浅色背景 +- **按钮设计**: 15px圆角,多色主题 + +#### 记录页面美化 +- **餐次选择**: 15px圆角,白色背景 +- **食物输入**: 15px圆角,白色背景 +- **输入框**: 12px圆角,浅色背景 +- **功能按钮**: 12px圆角,彩色主题 + +#### OCR界面美化 +- **标题**: 18px字体,深色文字 +- **上传区域**: 实线边框,浅色背景 +- **控制区域**: 实线边框,浅色背景 +- **按钮**: 强调色主题 + +### 6. 技术实现 + +#### 样式配置系统 +- **StyleConfig类**: 统一管理颜色、圆角、字体、间距 +- **预设样式**: 预定义的样式组合 +- **工具函数**: 快速创建美化组件的函数 + +#### 组件工厂 +- **create_rounded_frame()**: 创建圆角框架 +- **create_accent_button()**: 创建强调色按钮 +- **create_rounded_entry()**: 创建圆角输入框 +- **create_card_frame()**: 创建卡片式框架 + +#### 主题应用 +- **apply_rounded_theme()**: 应用圆角主题 +- **apply_preset_style()**: 应用预设样式 +- **颜色管理**: 统一的颜色配置系统 + +### 7. 用户体验提升 + +#### 视觉改进 +- ✅ 减少方形设计,增加圆角元素 +- ✅ 统一的颜色主题 +- ✅ 清晰的层次结构 +- ✅ 友好的视觉反馈 + +#### 交互改进 +- ✅ 悬停效果 +- ✅ 按钮状态变化 +- ✅ 平滑的视觉过渡 +- ✅ 直观的图标使用 + +#### 移动端适配 +- ✅ 适合手机屏幕的尺寸 +- ✅ 触摸友好的按钮大小 +- ✅ 清晰的文字显示 +- ✅ 合理的间距布局 + +### 8. 测试验证 + +#### 功能测试 +- ✅ 样式配置测试通过 +- ✅ 预设样式测试通过 +- ✅ 圆角主题测试通过 +- ✅ 组件创建测试通过 + +#### 界面测试 +- ✅ 移动端界面美化完成 +- ✅ OCR界面美化完成 +- ✅ 按钮和输入框美化完成 +- ✅ 卡片式布局美化完成 + +## 文件结构 + +``` +gui/ +├── styles.py # 样式配置系统 +├── mobile_main_window.py # 移动端主界面(已美化) +├── ocr_calorie_gui.py # OCR界面(已美化) +└── main_window.py # 桌面端界面 + +test_ui_beautification.py # 界面美化测试脚本 +UI_BEAUTIFICATION_SUMMARY.md # 美化总结文档 +``` + +## 使用说明 + +### 应用美化样式 +```python +from gui.styles import apply_rounded_theme, create_card_frame, create_accent_button + +# 应用圆角主题 +apply_rounded_theme() + +# 创建美化组件 +card = create_card_frame(parent) +button = create_accent_button(parent, "按钮文字", color_type='primary') +``` + +### 自定义样式 +```python +from gui.styles import StyleConfig + +# 使用预定义颜色 +color = StyleConfig.COLORS['primary'] + +# 使用预定义圆角 +radius = StyleConfig.CORNER_RADIUS['large'] + +# 使用预定义字体 +font = StyleConfig.FONTS['title'] +``` + +## 总结 + +通过这次界面美化,我们实现了: + +1. **统一的圆角设计系统** - 所有组件都采用圆角设计,减少方形元素 +2. **完整的颜色主题** - 统一的颜色配置,支持多色主题 +3. **优化的用户体验** - 更友好的视觉设计和交互体验 +4. **可维护的代码结构** - 模块化的样式配置系统 +5. **全面的测试验证** - 确保美化效果正常工作 + +界面现在具有现代化的外观,符合移动端应用的设计趋势,为用户提供更好的使用体验。 + +--- + +*美化完成时间: 2024年12月* diff --git a/config/settings.py b/config/settings.py new file mode 100644 index 0000000..76b056f --- /dev/null +++ b/config/settings.py @@ -0,0 +1,425 @@ +""" +统一配置管理 - 所有接口、配置、SQL入口的集中管理 +""" + +import os +import sqlite3 +from pathlib import Path +from typing import Optional, Dict, Any +from dataclasses import dataclass +import logging + +# 尝试加载环境变量 +try: + from dotenv import load_dotenv + load_dotenv() +except Exception: + # 如果没有.env文件或加载失败,使用默认配置 + pass + +# 配置日志 +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +@dataclass +class DatabaseConfig: + """数据库配置""" + # 数据库路径 + database_path: str = "data/app.db" + database_url: str = "sqlite:///./data/app.db" + + # 数据库连接参数 + connection_timeout: int = 30 + check_same_thread: bool = False + + # 表配置 + enable_foreign_keys: bool = True + enable_wal_mode: bool = True + + +@dataclass +class APIConfig: + """API接口配置""" + # 千问大模型配置 + qwen_api_key: Optional[str] = None + qwen_base_url: str = "https://dashscope.aliyuncs.com/compatible-mode/v1" + qwen_model: str = "qwen-plus-latest" + qwen_temperature: float = 0.7 + qwen_max_tokens: int = 2000 + + # OpenAI配置(备用) + openai_api_key: Optional[str] = None + openai_model: str = "gpt-4" + + # Anthropic配置(备用) + anthropic_api_key: Optional[str] = None + anthropic_model: str = "claude-3-sonnet-20240229" + + # API超时配置 + api_timeout: int = 30 + api_retry_count: int = 3 + + +@dataclass +class AppConfig: + """应用配置""" + # 应用基本信息 + app_name: str = "个性化饮食推荐助手" + version: str = "1.0.0" + debug: bool = True + + # 路径配置 + model_path: str = "models/" + log_path: str = "logs/" + data_path: str = "data/" + user_data_path: str = "data/users/" + training_data_path: str = "data/training/" + + # 日志配置 + log_level: str = "INFO" + log_format: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + log_file: str = "logs/app.log" + + +@dataclass +class MLConfig: + """机器学习配置""" + # 推荐系统配置 + max_recommendations: int = 5 + min_training_samples: int = 10 + model_update_threshold: int = 50 + + # 模型配置 + model_save_format: str = "joblib" + enable_model_caching: bool = True + model_cache_size: int = 100 + + # 特征工程配置 + tfidf_max_features: int = 1000 + tfidf_ngram_range: tuple = (1, 2) + similarity_threshold: float = 0.7 + + +@dataclass +class OCRConfig: + """OCR识别配置""" + # OCR引擎配置 + enable_tesseract: bool = True + enable_paddleocr: bool = True + enable_easyocr: bool = True + + # 识别参数 + min_confidence: float = 0.6 + max_processing_time: float = 30.0 + + # 图片处理配置 + image_max_size: tuple = (1920, 1080) + image_quality: int = 95 + enable_image_preprocessing: bool = True + + +@dataclass +class UIConfig: + """界面配置""" + # 移动端界面配置 + mobile_width: int = 375 + mobile_height: int = 812 + + # 主题配置 + theme_mode: str = "light" # light, dark, system + color_theme: str = "blue" + + # 圆角配置 + corner_radius_small: int = 8 + corner_radius_medium: int = 12 + corner_radius_large: int = 15 + corner_radius_xlarge: int = 20 + corner_radius_xxlarge: int = 25 + + +class UnifiedConfig: + """统一配置管理类""" + + def __init__(self): + self.database = DatabaseConfig() + self.api = APIConfig() + self.app = AppConfig() + self.ml = MLConfig() + self.ocr = OCRConfig() + self.ui = UIConfig() + + # 从环境变量加载配置 + self._load_from_env() + + # 创建必要目录 + self._create_directories() + + def _load_from_env(self): + """从环境变量加载配置""" + # 数据库配置 + if os.getenv('DATABASE_PATH'): + self.database.database_path = os.getenv('DATABASE_PATH') + + # API配置 + self.api.qwen_api_key = os.getenv('QWEN_API_KEY') + self.api.qwen_base_url = os.getenv('QWEN_BASE_URL', self.api.qwen_base_url) + self.api.qwen_model = os.getenv('QWEN_MODEL', self.api.qwen_model) + + self.api.openai_api_key = os.getenv('OPENAI_API_KEY') + self.api.anthropic_api_key = os.getenv('ANTHROPIC_API_KEY') + + # 应用配置 + if os.getenv('DEBUG'): + self.app.debug = os.getenv('DEBUG').lower() == 'true' + + if os.getenv('LOG_LEVEL'): + self.app.log_level = os.getenv('LOG_LEVEL') + + # ML配置 + if os.getenv('MAX_RECOMMENDATIONS'): + self.ml.max_recommendations = int(os.getenv('MAX_RECOMMENDATIONS')) + + if os.getenv('MIN_TRAINING_SAMPLES'): + self.ml.min_training_samples = int(os.getenv('MIN_TRAINING_SAMPLES')) + + def _create_directories(self): + """创建必要的目录""" + directories = [ + self.app.data_path, + self.app.user_data_path, + self.app.training_data_path, + self.app.model_path, + self.app.log_path, + Path(self.database.database_path).parent + ] + + for directory in directories: + Path(directory).mkdir(parents=True, exist_ok=True) + + def get_database_connection(self) -> sqlite3.Connection: + """获取数据库连接""" + try: + conn = sqlite3.connect( + self.database.database_path, + timeout=self.database.connection_timeout, + check_same_thread=self.database.check_same_thread + ) + + # 启用外键约束 + if self.database.enable_foreign_keys: + conn.execute("PRAGMA foreign_keys = ON") + + # 启用WAL模式 + if self.database.enable_wal_mode: + conn.execute("PRAGMA journal_mode = WAL") + + return conn + except Exception as e: + logger.error(f"数据库连接失败: {e}") + raise + + def get_api_config(self, provider: str = "qwen") -> Dict[str, Any]: + """获取API配置""" + if provider == "qwen": + return { + "api_key": self.api.qwen_api_key, + "base_url": self.api.qwen_base_url, + "model": self.api.qwen_model, + "temperature": self.api.qwen_temperature, + "max_tokens": self.api.qwen_max_tokens, + "timeout": self.api.api_timeout, + "retry_count": self.api.api_retry_count + } + elif provider == "openai": + return { + "api_key": self.api.openai_api_key, + "model": self.api.openai_model, + "timeout": self.api.api_timeout, + "retry_count": self.api.api_retry_count + } + elif provider == "anthropic": + return { + "api_key": self.api.anthropic_api_key, + "model": self.api.anthropic_model, + "timeout": self.api.api_timeout, + "retry_count": self.api.api_retry_count + } + else: + raise ValueError(f"不支持的API提供商: {provider}") + + def is_api_available(self, provider: str = "qwen") -> bool: + """检查API是否可用""" + if provider == "qwen": + return self.api.qwen_api_key is not None + elif provider == "openai": + return self.api.openai_api_key is not None + elif provider == "anthropic": + return self.api.anthropic_api_key is not None + else: + return False + + def get_ocr_config(self) -> Dict[str, Any]: + """获取OCR配置""" + return { + "enable_tesseract": self.ocr.enable_tesseract, + "enable_paddleocr": self.ocr.enable_paddleocr, + "enable_easyocr": self.ocr.enable_easyocr, + "min_confidence": self.ocr.min_confidence, + "max_processing_time": self.ocr.max_processing_time, + "image_max_size": self.ocr.image_max_size, + "image_quality": self.ocr.image_quality, + "enable_preprocessing": self.ocr.enable_image_preprocessing + } + + def get_ui_config(self) -> Dict[str, Any]: + """获取界面配置""" + return { + "mobile_width": self.ui.mobile_width, + "mobile_height": self.ui.mobile_height, + "theme_mode": self.ui.theme_mode, + "color_theme": self.ui.color_theme, + "corner_radius": { + "small": self.ui.corner_radius_small, + "medium": self.ui.corner_radius_medium, + "large": self.ui.corner_radius_large, + "xlarge": self.ui.corner_radius_xlarge, + "xxlarge": self.ui.corner_radius_xxlarge + } + } + + def validate_config(self) -> bool: + """验证配置有效性""" + try: + # 检查数据库路径 + db_path = Path(self.database.database_path) + if not db_path.parent.exists(): + db_path.parent.mkdir(parents=True, exist_ok=True) + + # 检查API配置 + if not self.is_api_available("qwen"): + logger.warning("千问API密钥未配置,部分功能可能不可用") + + # 检查目录权限 + for directory in [self.app.data_path, self.app.model_path, self.app.log_path]: + if not Path(directory).exists(): + Path(directory).mkdir(parents=True, exist_ok=True) + + logger.info("配置验证通过") + return True + + except Exception as e: + logger.error(f"配置验证失败: {e}") + return False + + def save_config_to_file(self, file_path: str = "config/app_config.json"): + """保存配置到文件""" + import json + + config_dict = { + "database": self.database.__dict__, + "api": self.api.__dict__, + "app": self.app.__dict__, + "ml": self.ml.__dict__, + "ocr": self.ocr.__dict__, + "ui": self.ui.__dict__ + } + + Path(file_path).parent.mkdir(parents=True, exist_ok=True) + with open(file_path, 'w', encoding='utf-8') as f: + json.dump(config_dict, f, ensure_ascii=False, indent=2) + + logger.info(f"配置已保存到: {file_path}") + + def load_config_from_file(self, file_path: str = "config/app_config.json"): + """从文件加载配置""" + import json + + if not Path(file_path).exists(): + logger.warning(f"配置文件不存在: {file_path}") + return False + + try: + with open(file_path, 'r', encoding='utf-8') as f: + config_dict = json.load(f) + + # 更新配置 + if "database" in config_dict: + for key, value in config_dict["database"].items(): + if hasattr(self.database, key): + setattr(self.database, key, value) + + if "api" in config_dict: + for key, value in config_dict["api"].items(): + if hasattr(self.api, key): + setattr(self.api, key, value) + + # 其他配置类似处理... + + logger.info(f"配置已从文件加载: {file_path}") + return True + + except Exception as e: + logger.error(f"加载配置文件失败: {e}") + return False + + +# 全局配置实例 +_config_instance: Optional[UnifiedConfig] = None + + +def get_config() -> UnifiedConfig: + """获取全局配置实例""" + global _config_instance + if _config_instance is None: + _config_instance = UnifiedConfig() + _config_instance.validate_config() + return _config_instance + + +def reload_config(): + """重新加载配置""" + global _config_instance + _config_instance = None + return get_config() + + +# 便捷函数 +def get_database_connection() -> sqlite3.Connection: + """获取数据库连接""" + return get_config().get_database_connection() + + +def get_api_config(provider: str = "qwen") -> Dict[str, Any]: + """获取API配置""" + return get_config().get_api_config(provider) + + +def is_api_available(provider: str = "qwen") -> bool: + """检查API是否可用""" + return get_config().is_api_available(provider) + + +if __name__ == "__main__": + # 测试配置系统 + print("=== 统一配置管理测试 ===") + + config = get_config() + + print(f"✅ 应用名称: {config.app.app_name}") + print(f"✅ 数据库路径: {config.database.database_path}") + print(f"✅ 千问API可用: {config.is_api_available('qwen')}") + print(f"✅ OpenAI API可用: {config.is_api_available('openai')}") + + # 测试数据库连接 + try: + conn = config.get_database_connection() + print("✅ 数据库连接成功") + conn.close() + except Exception as e: + print(f"❌ 数据库连接失败: {e}") + + # 保存配置 + config.save_config_to_file() + + print("✅ 配置系统测试完成") diff --git a/core/base.py b/core/base.py new file mode 100644 index 0000000..bc8aa66 --- /dev/null +++ b/core/base.py @@ -0,0 +1,620 @@ +""" +核心基座架构 - Diet Recommendation App +统一的基座设计,支持所有功能模块的扩展 +""" + +from abc import ABC, abstractmethod +from typing import Dict, List, Optional, Any, Union, Callable +from dataclasses import dataclass, field +import json +import sqlite3 +import logging +from datetime import datetime, date +from pathlib import Path +import asyncio +from enum import Enum +import threading +from queue import Queue +import os +try: + from dotenv import load_dotenv + load_dotenv() +except Exception: + # 如果没有.env文件或加载失败,使用默认配置 + pass + +# 配置日志 +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +class ModuleType(Enum): + """模块类型枚举""" + DATA_COLLECTION = "data_collection" + USER_ANALYSIS = "user_analysis" + RECOMMENDATION = "recommendation" + GUI_INTERFACE = "gui_interface" + NOTIFICATION = "notification" + + +@dataclass +class BaseConfig: + """基础配置类""" + app_name: str = "个性化饮食推荐助手" + version: str = "1.0.0" + debug: bool = True + database_path: str = "data/app.db" + model_path: str = "models/" + log_level: str = "INFO" + + # API配置 + qwen_api_key: Optional[str] = None + qwen_base_url: str = "https://dashscope.aliyuncs.com/compatible-mode/v1" + qwen_model: str = "qwen-plus-latest" + + # 用户配置 + max_recommendations: int = 5 + min_training_samples: int = 10 + model_update_threshold: int = 50 + + +@dataclass +class UserData: + """统一用户数据结构""" + user_id: str + profile: Dict[str, Any] = field(default_factory=dict) + meals: List[Dict[str, Any]] = field(default_factory=list) + feedback: List[Dict[str, Any]] = field(default_factory=list) + preferences: Dict[str, Any] = field(default_factory=dict) + created_at: str = field(default_factory=lambda: datetime.now().isoformat()) + updated_at: str = field(default_factory=lambda: datetime.now().isoformat()) + + +@dataclass +class AnalysisResult: + """统一分析结果结构""" + module_type: ModuleType + user_id: str + input_data: Any + result: Dict[str, Any] + confidence: float + timestamp: str = field(default_factory=lambda: datetime.now().isoformat()) + metadata: Dict[str, Any] = field(default_factory=dict) + + +class BaseModule(ABC): + """基础模块抽象类""" + + def __init__(self, config: BaseConfig, module_type: ModuleType): + self.config = config + self.module_type = module_type + self.is_initialized = False + self.logger = logging.getLogger(f"{self.__class__.__name__}") + + @abstractmethod + def initialize(self) -> bool: + """初始化模块""" + pass + + @abstractmethod + def process(self, input_data: Any, user_data: UserData) -> AnalysisResult: + """处理数据""" + pass + + @abstractmethod + def cleanup(self) -> bool: + """清理资源""" + pass + + def is_ready(self) -> bool: + """检查模块是否就绪""" + return self.is_initialized + + +class DataManager: + """数据管理基座""" + + def __init__(self, config: BaseConfig): + self.config = config + self.db_path = Path(config.database_path) + self.db_path.parent.mkdir(parents=True, exist_ok=True) + self._init_database() + + def _init_database(self): + """初始化数据库""" + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + # 用户表 + cursor.execute(''' + CREATE TABLE IF NOT EXISTS users ( + user_id TEXT PRIMARY KEY, + data TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + ''') + + # 分析结果表 + cursor.execute(''' + CREATE TABLE IF NOT EXISTS analysis_results ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id TEXT, + module_type TEXT, + input_data TEXT, + result TEXT, + confidence REAL, + timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + metadata TEXT, + FOREIGN KEY (user_id) REFERENCES users (user_id) + ) + ''') + + # 系统配置表 + cursor.execute(''' + CREATE TABLE IF NOT EXISTS system_config ( + key TEXT PRIMARY KEY, + value TEXT, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + ''') + + conn.commit() + conn.close() + + def save_user_data(self, user_data: UserData) -> bool: + """保存用户数据""" + try: + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + cursor.execute(''' + INSERT OR REPLACE INTO users (user_id, data, updated_at) + VALUES (?, ?, CURRENT_TIMESTAMP) + ''', (user_data.user_id, json.dumps(user_data.__dict__))) + + conn.commit() + conn.close() + return True + except Exception as e: + logger.error(f"保存用户数据失败: {e}") + return False + + def get_user_data(self, user_id: str) -> Optional[UserData]: + """获取用户数据""" + try: + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + # 获取用户基本信息 + cursor.execute('SELECT data FROM users WHERE user_id = ?', (user_id,)) + result = cursor.fetchone() + + if not result: + conn.close() + return None + + # 解析用户基本信息 + data_dict = json.loads(result[0]) + + # 获取餐食记录 + cursor.execute(''' + SELECT date, meal_type, foods, quantities, calories, satisfaction_score, food_items + FROM meal_records + WHERE user_id = ? + ORDER BY date DESC + ''', (user_id,)) + + meal_rows = cursor.fetchall() + meals = [] + for row in meal_rows: + meal = { + 'date': row[0], + 'meal_type': row[1], + 'foods': json.loads(row[2]) if row[2] else [], + 'quantities': json.loads(row[3]) if row[3] else [], + 'calories': row[4], + 'satisfaction_score': row[5], + 'food_items': json.loads(row[6]) if row[6] else [] + } + meals.append(meal) + + # 获取反馈记录 + cursor.execute(''' + SELECT date, recommended_foods, user_choice, feedback_type + FROM feedback_records + WHERE user_id = ? + ORDER BY date DESC + ''', (user_id,)) + + feedback_rows = cursor.fetchall() + feedback = [] + for row in feedback_rows: + fb = { + 'date': row[0], + 'recommended_foods': json.loads(row[1]) if row[1] else [], + 'user_choice': row[2], + 'feedback_type': row[3] + } + feedback.append(fb) + + # 获取问卷数据 + cursor.execute(''' + SELECT questionnaire_type, answers + FROM questionnaire_records + WHERE user_id = ? + ''', (user_id,)) + + questionnaire_rows = cursor.fetchall() + preferences = {} + for row in questionnaire_rows: + preferences[row[0]] = json.loads(row[1]) if row[1] else {} + + conn.close() + + # 构建完整的用户数据 + user_data = UserData( + user_id=data_dict['user_id'], + profile=data_dict.get('profile', {}), + meals=meals, + feedback=feedback, + preferences=preferences, + created_at=data_dict.get('created_at', ''), + updated_at=data_dict.get('updated_at', '') + ) + + return user_data + + except Exception as e: + logger.error(f"获取用户数据失败: {e}") + return None + + def save_analysis_result(self, result: AnalysisResult) -> bool: + """保存分析结果""" + try: + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + cursor.execute(''' + INSERT INTO analysis_results + (user_id, module_type, input_data, result, confidence, metadata) + VALUES (?, ?, ?, ?, ?, ?) + ''', ( + result.user_id, + result.module_type.value, + json.dumps(result.input_data), + json.dumps(result.result), + result.confidence, + json.dumps(result.metadata) + )) + + conn.commit() + conn.close() + return True + except Exception as e: + logger.error(f"保存分析结果失败: {e}") + return False + + def get_analysis_history(self, user_id: str, module_type: Optional[ModuleType] = None, + limit: int = 10) -> List[AnalysisResult]: + """获取分析历史""" + try: + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + if module_type: + cursor.execute(''' + SELECT module_type, input_data, result, confidence, timestamp, metadata + FROM analysis_results + WHERE user_id = ? AND module_type = ? + ORDER BY timestamp DESC + LIMIT ? + ''', (user_id, module_type.value, limit)) + else: + cursor.execute(''' + SELECT module_type, input_data, result, confidence, timestamp, metadata + FROM analysis_results + WHERE user_id = ? + ORDER BY timestamp DESC + LIMIT ? + ''', (user_id, limit)) + + results = cursor.fetchall() + conn.close() + + analysis_results = [] + for row in results: + result = AnalysisResult( + module_type=ModuleType(row[0]), + user_id=user_id, + input_data=json.loads(row[1]), + result=json.loads(row[2]), + confidence=row[3], + timestamp=row[4], + metadata=json.loads(row[5]) + ) + analysis_results.append(result) + + return analysis_results + except Exception as e: + logger.error(f"获取分析历史失败: {e}") + return [] + + +class EventBus: + """事件总线基座""" + + def __init__(self): + self.subscribers: Dict[str, List[Callable]] = {} + self.event_queue = Queue() + self.is_running = False + self.worker_thread = None + + def subscribe(self, event_type: str, callback: Callable): + """订阅事件""" + if event_type not in self.subscribers: + self.subscribers[event_type] = [] + self.subscribers[event_type].append(callback) + + def unsubscribe(self, event_type: str, callback: Callable): + """取消订阅""" + if event_type in self.subscribers: + self.subscribers[event_type].remove(callback) + + def publish(self, event_type: str, data: Any): + """发布事件""" + self.event_queue.put((event_type, data)) + + def start(self): + """启动事件总线""" + self.is_running = True + self.worker_thread = threading.Thread(target=self._process_events) + self.worker_thread.start() + + def stop(self): + """停止事件总线""" + self.is_running = False + if self.worker_thread: + self.worker_thread.join() + + def _process_events(self): + """处理事件""" + while self.is_running: + try: + event_type, data = self.event_queue.get(timeout=1) + + if event_type in self.subscribers: + for callback in self.subscribers[event_type]: + try: + callback(data) + except Exception as e: + logger.error(f"事件处理失败: {e}") + + self.event_queue.task_done() + except: + continue + + +class ModuleManager: + """模块管理器基座""" + + def __init__(self, config: BaseConfig): + self.config = config + self.modules: Dict[ModuleType, BaseModule] = {} + self.data_manager = DataManager(config) + self.event_bus = EventBus() + self.is_initialized = False + + def register_module(self, module: BaseModule) -> bool: + """注册模块""" + try: + # 检查模块是否已经注册 + if module.module_type in self.modules: + logger.warning(f"模块 {module.module_type.value} 已经注册,跳过重复注册") + return True + + if module.initialize(): + self.modules[module.module_type] = module + logger.info(f"模块 {module.module_type.value} 注册成功") + return True + else: + logger.error(f"模块 {module.module_type.value} 初始化失败") + return False + except Exception as e: + logger.error(f"注册模块失败: {e}") + return False + + def process_request(self, module_type: ModuleType, input_data: Any, + user_id: str) -> Optional[AnalysisResult]: + """处理请求""" + if module_type not in self.modules: + logger.error(f"模块 {module_type.value} 未注册") + return None + + module = self.modules[module_type] + if not module.is_ready(): + logger.error(f"模块 {module_type.value} 未就绪") + return None + + # 获取用户数据 + user_data = self.data_manager.get_user_data(user_id) + if not user_data: + logger.error(f"用户 {user_id} 数据不存在") + return None + + try: + # 处理请求 + result = module.process(input_data, user_data) + + # 保存结果 + self.data_manager.save_analysis_result(result) + + # 发布事件 + self.event_bus.publish(f"{module_type.value}_completed", result) + + return result + except Exception as e: + logger.error(f"处理请求失败: {e}") + return None + + def get_module_status(self) -> Dict[str, bool]: + """获取模块状态""" + return {module_type.value: module.is_ready() + for module_type, module in self.modules.items()} + + def initialize_all(self) -> bool: + """初始化所有模块""" + try: + self.event_bus.start() + self.is_initialized = True + logger.info("模块管理器初始化完成") + return True + except Exception as e: + logger.error(f"初始化失败: {e}") + return False + + def cleanup_all(self) -> bool: + """清理所有模块""" + try: + self.event_bus.stop() + + for module in self.modules.values(): + module.cleanup() + + self.is_initialized = False + logger.info("模块管理器清理完成") + return True + except Exception as e: + logger.error(f"清理失败: {e}") + return False + + +class AppCore: + """应用核心基座""" + + def __init__(self, config: BaseConfig): + self.config = config + self.module_manager = ModuleManager(config) + self.data_manager = DataManager(config) + self.is_running = False + + def start(self) -> bool: + """启动应用""" + try: + if self.module_manager.initialize_all(): + self.is_running = True + logger.info("应用启动成功") + return True + else: + logger.error("应用启动失败") + return False + except Exception as e: + logger.error(f"启动应用失败: {e}") + return False + + def stop(self) -> bool: + """停止应用""" + try: + if self.module_manager.cleanup_all(): + self.is_running = False + logger.info("应用停止成功") + return True + else: + logger.error("应用停止失败") + return False + except Exception as e: + logger.error(f"停止应用失败: {e}") + return False + + def create_user(self, user_id: str, initial_data: Dict[str, Any]) -> bool: + """创建用户""" + user_data = UserData( + user_id=user_id, + profile=initial_data.get('profile', {}), + preferences=initial_data.get('preferences', {}) + ) + return self.module_manager.data_manager.save_user_data(user_data) + + def process_user_request(self, module_type: ModuleType, input_data: Any, + user_id: str) -> Optional[AnalysisResult]: + """处理用户请求""" + return self.module_manager.process_request(module_type, input_data, user_id) + + def get_user_data(self, user_id: str) -> Optional[UserData]: + """获取用户数据""" + return self.module_manager.data_manager.get_user_data(user_id) + + def get_analysis_history(self, user_id: str, module_type: Optional[ModuleType] = None) -> List[AnalysisResult]: + """获取分析历史""" + return self.module_manager.data_manager.get_analysis_history(user_id, module_type) + + +# 全局应用实例 +app_core: Optional[AppCore] = None + + +def get_app_core() -> AppCore: + """获取应用核心实例""" + global app_core + if app_core is None: + config = BaseConfig() + app_core = AppCore(config) + return app_core + + +def initialize_app(config: Optional[BaseConfig] = None) -> bool: + """初始化应用""" + global app_core + if config is None: + config = BaseConfig() + + app_core = AppCore(config) + return app_core.start() + + +def cleanup_app() -> bool: + """清理应用""" + global app_core + if app_core: + return app_core.stop() + return True + + +if __name__ == "__main__": + # 测试基座架构 + print("测试核心基座架构...") + + # 初始化应用 + if initialize_app(): + print("✅ 应用初始化成功") + + # 创建测试用户 + test_user_id = "test_user_001" + initial_data = { + "profile": { + "name": "测试用户", + "age": 25, + "gender": "女" + }, + "preferences": { + "taste": "sweet", + "diet": "balanced" + } + } + + app = get_app_core() + if app.create_user(test_user_id, initial_data): + print("✅ 用户创建成功") + + # 获取用户数据 + user_data = app.get_user_data(test_user_id) + if user_data: + print(f"✅ 用户数据获取成功: {user_data.user_id}") + + # 清理应用 + cleanup_app() + print("✅ 应用清理完成") + else: + print("❌ 应用初始化失败") + + print("基座架构测试完成!") diff --git a/core/base_engine.py b/core/base_engine.py new file mode 100644 index 0000000..04eb859 --- /dev/null +++ b/core/base_engine.py @@ -0,0 +1,928 @@ +""" +核心基座架构 - 个性化饮食推荐系统 +提供统一的基础设施和接口,所有功能模块都基于此基座构建 +""" + +import json +import sqlite3 +import asyncio +import logging +from abc import ABC, abstractmethod +from typing import Dict, List, Optional, Any, Union +from dataclasses import dataclass, asdict +from datetime import datetime, date +from pathlib import Path +import os +from dotenv import load_dotenv + +load_dotenv() + +# 配置日志 +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +@dataclass +class UserProfile: + """用户画像 - 统一数据结构""" + user_id: str + name: str + age: int + gender: str + height: float + weight: float + activity_level: str + + # 偏好和限制 + taste_preferences: Dict[str, int] = None + dietary_preferences: List[str] = None + allergies: List[str] = None + dislikes: List[str] = None + + # 生理信息 + is_female: bool = False + menstrual_cycle_length: Optional[int] = None + last_period_date: Optional[str] = None + + # 个性化因素 + zodiac_sign: Optional[str] = None + personality_traits: List[str] = None + health_goals: List[str] = None + + def __post_init__(self): + if self.taste_preferences is None: + self.taste_preferences = {} + if self.dietary_preferences is None: + self.dietary_preferences = [] + if self.allergies is None: + self.allergies = [] + if self.dislikes is None: + self.dislikes = [] + if self.personality_traits is None: + self.personality_traits = [] + if self.health_goals is None: + self.health_goals = [] + + +@dataclass +class MealRecord: + """餐食记录 - 统一数据结构""" + user_id: str + date: str + meal_type: str # breakfast, lunch, dinner + foods: List[str] + quantities: List[str] + calories: Optional[float] = None + satisfaction_score: Optional[int] = None + notes: Optional[str] = None + + +@dataclass +class RecommendationResult: + """推荐结果 - 统一数据结构""" + user_id: str + date: str + meal_type: str + recommended_foods: List[str] + reasoning: str + confidence_score: float + special_considerations: List[str] = None + + def __post_init__(self): + if self.special_considerations is None: + self.special_considerations = [] + + +class BaseEngine(ABC): + """基础引擎抽象类 - 所有功能模块的基座""" + + def __init__(self, config: Dict[str, Any] = None): + self.config = config or {} + self.logger = logging.getLogger(self.__class__.__name__) + self._initialized = False + + @abstractmethod + async def initialize(self) -> bool: + """初始化引擎""" + pass + + @abstractmethod + async def process(self, data: Any) -> Any: + """处理数据""" + pass + + @abstractmethod + async def cleanup(self) -> bool: + """清理资源""" + pass + + def is_initialized(self) -> bool: + """检查是否已初始化""" + return self._initialized + + def get_config(self, key: str, default: Any = None) -> Any: + """获取配置""" + return self.config.get(key, default) + + +class DataManager(BaseEngine): + """数据管理基座 - 统一的数据存储和访问接口""" + + def __init__(self, db_path: str = "data/app.db"): + super().__init__() + self.db_path = Path(db_path) + self.db_path.parent.mkdir(parents=True, exist_ok=True) + + async def initialize(self) -> bool: + """初始化数据库""" + try: + await self._create_tables() + self._initialized = True + self.logger.info("数据管理器初始化成功") + return True + except Exception as e: + self.logger.error(f"数据管理器初始化失败: {e}") + return False + + async def _create_tables(self): + """创建数据库表""" + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + # 用户表 + cursor.execute(''' + CREATE TABLE IF NOT EXISTS users ( + user_id TEXT PRIMARY KEY, + profile_data TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + ''') + + # 餐食记录表 + cursor.execute(''' + CREATE TABLE IF NOT EXISTS meals ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id TEXT, + date TEXT, + meal_type TEXT, + foods TEXT, + quantities TEXT, + calories REAL, + satisfaction_score INTEGER, + notes TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users (user_id) + ) + ''') + + # 推荐记录表 + cursor.execute(''' + CREATE TABLE IF NOT EXISTS recommendations ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id TEXT, + date TEXT, + meal_type TEXT, + recommended_foods TEXT, + reasoning TEXT, + confidence_score REAL, + special_considerations TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users (user_id) + ) + ''') + + # 用户反馈表 + cursor.execute(''' + CREATE TABLE IF NOT EXISTS feedback ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id TEXT, + date TEXT, + recommendation_id INTEGER, + user_choice TEXT, + feedback_type TEXT, + satisfaction_score INTEGER, + notes TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users (user_id), + FOREIGN KEY (recommendation_id) REFERENCES recommendations (id) + ) + ''') + + conn.commit() + conn.close() + + async def process(self, operation: str, data: Any) -> Any: + """处理数据操作""" + if not self._initialized: + await self.initialize() + + operations = { + 'save_user': self._save_user_profile, + 'get_user': self._get_user_profile, + 'save_meal': self._save_meal_record, + 'get_meals': self._get_meal_records, + 'save_recommendation': self._save_recommendation, + 'get_recommendations': self._get_recommendations, + 'save_feedback': self._save_feedback, + 'get_feedback': self._get_feedback + } + + if operation in operations: + return await operations[operation](data) + else: + raise ValueError(f"不支持的操作: {operation}") + + async def _save_user_profile(self, profile: UserProfile) -> bool: + """保存用户画像""" + try: + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + cursor.execute(''' + INSERT OR REPLACE INTO users (user_id, profile_data, updated_at) + VALUES (?, ?, CURRENT_TIMESTAMP) + ''', (profile.user_id, json.dumps(asdict(profile)))) + + conn.commit() + conn.close() + return True + except Exception as e: + self.logger.error(f"保存用户画像失败: {e}") + return False + + async def _get_user_profile(self, user_id: str) -> Optional[UserProfile]: + """获取用户画像""" + try: + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + cursor.execute('SELECT profile_data FROM users WHERE user_id = ?', (user_id,)) + result = cursor.fetchone() + + conn.close() + + if result: + profile_dict = json.loads(result[0]) + return UserProfile(**profile_dict) + return None + except Exception as e: + self.logger.error(f"获取用户画像失败: {e}") + return None + + async def _save_meal_record(self, meal: MealRecord) -> bool: + """保存餐食记录""" + try: + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + cursor.execute(''' + INSERT INTO meals (user_id, date, meal_type, foods, quantities, + calories, satisfaction_score, notes) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + ''', ( + meal.user_id, meal.date, meal.meal_type, + json.dumps(meal.foods), json.dumps(meal.quantities), + meal.calories, meal.satisfaction_score, meal.notes + )) + + conn.commit() + conn.close() + return True + except Exception as e: + self.logger.error(f"保存餐食记录失败: {e}") + return False + + async def _get_meal_records(self, params: Dict[str, Any]) -> List[MealRecord]: + """获取餐食记录""" + try: + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + user_id = params.get('user_id') + days = params.get('days', 5) + + cursor.execute(''' + SELECT user_id, date, meal_type, foods, quantities, calories, + satisfaction_score, notes + FROM meals + WHERE user_id = ? + ORDER BY date DESC, meal_type + LIMIT ? + ''', (user_id, days * 3)) + + results = cursor.fetchall() + conn.close() + + meals = [] + for row in results: + meal = MealRecord( + user_id=row[0], + date=row[1], + meal_type=row[2], + foods=json.loads(row[3]), + quantities=json.loads(row[4]), + calories=row[5], + satisfaction_score=row[6], + notes=row[7] + ) + meals.append(meal) + + return meals + except Exception as e: + self.logger.error(f"获取餐食记录失败: {e}") + return [] + + async def _save_recommendation(self, recommendation: RecommendationResult) -> int: + """保存推荐结果""" + try: + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + cursor.execute(''' + INSERT INTO recommendations (user_id, date, meal_type, recommended_foods, + reasoning, confidence_score, special_considerations) + VALUES (?, ?, ?, ?, ?, ?, ?) + ''', ( + recommendation.user_id, recommendation.date, recommendation.meal_type, + json.dumps(recommendation.recommended_foods), recommendation.reasoning, + recommendation.confidence_score, json.dumps(recommendation.special_considerations) + )) + + recommendation_id = cursor.lastrowid + conn.commit() + conn.close() + return recommendation_id + except Exception as e: + self.logger.error(f"保存推荐结果失败: {e}") + return -1 + + async def _get_recommendations(self, params: Dict[str, Any]) -> List[RecommendationResult]: + """获取推荐记录""" + try: + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + user_id = params.get('user_id') + days = params.get('days', 7) + + cursor.execute(''' + SELECT user_id, date, meal_type, recommended_foods, reasoning, + confidence_score, special_considerations + FROM recommendations + WHERE user_id = ? + ORDER BY date DESC + LIMIT ? + ''', (user_id, days)) + + results = cursor.fetchall() + conn.close() + + recommendations = [] + for row in results: + rec = RecommendationResult( + user_id=row[0], + date=row[1], + meal_type=row[2], + recommended_foods=json.loads(row[3]), + reasoning=row[4], + confidence_score=row[5], + special_considerations=json.loads(row[6]) if row[6] else [] + ) + recommendations.append(rec) + + return recommendations + except Exception as e: + self.logger.error(f"获取推荐记录失败: {e}") + return [] + + async def _save_feedback(self, feedback_data: Dict[str, Any]) -> bool: + """保存用户反馈""" + try: + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + cursor.execute(''' + INSERT INTO feedback (user_id, date, recommendation_id, user_choice, + feedback_type, satisfaction_score, notes) + VALUES (?, ?, ?, ?, ?, ?, ?) + ''', ( + feedback_data['user_id'], feedback_data['date'], + feedback_data.get('recommendation_id'), feedback_data['user_choice'], + feedback_data['feedback_type'], feedback_data.get('satisfaction_score'), + feedback_data.get('notes') + )) + + conn.commit() + conn.close() + return True + except Exception as e: + self.logger.error(f"保存用户反馈失败: {e}") + return False + + async def _get_feedback(self, params: Dict[str, Any]) -> List[Dict[str, Any]]: + """获取用户反馈""" + try: + conn = sqlite3.connect(self.db_path) + cursor = conn.cursor() + + user_id = params.get('user_id') + days = params.get('days', 7) + + cursor.execute(''' + SELECT user_id, date, recommendation_id, user_choice, feedback_type, + satisfaction_score, notes + FROM feedback + WHERE user_id = ? + ORDER BY date DESC + LIMIT ? + ''', (user_id, days)) + + results = cursor.fetchall() + conn.close() + + feedbacks = [] + for row in results: + feedback = { + 'user_id': row[0], + 'date': row[1], + 'recommendation_id': row[2], + 'user_choice': row[3], + 'feedback_type': row[4], + 'satisfaction_score': row[5], + 'notes': row[6] + } + feedbacks.append(feedback) + + return feedbacks + except Exception as e: + self.logger.error(f"获取用户反馈失败: {e}") + return [] + + async def cleanup(self) -> bool: + """清理资源""" + self._initialized = False + return True + + +class AIAnalyzer(BaseEngine): + """AI分析基座 - 统一的大模型分析接口""" + + def __init__(self, config: Dict[str, Any] = None): + super().__init__(config) + self.openai_client = None + self.anthropic_client = None + + async def initialize(self) -> bool: + """初始化AI客户端""" + try: + import openai + import anthropic + + self.openai_client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY")) + self.anthropic_client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) + + self._initialized = True + self.logger.info("AI分析器初始化成功") + return True + except Exception as e: + self.logger.error(f"AI分析器初始化失败: {e}") + return False + + async def process(self, analysis_type: str, data: Any) -> Any: + """处理AI分析请求""" + if not self._initialized: + await self.initialize() + + analysis_types = { + 'user_intent': self._analyze_user_intent, + 'physiological_state': self._analyze_physiological_state, + 'nutrition_analysis': self._analyze_nutrition, + 'recommendation_reasoning': self._generate_reasoning + } + + if analysis_type in analysis_types: + return await analysis_types[analysis_type](data) + else: + raise ValueError(f"不支持的分析类型: {analysis_type}") + + async def _analyze_user_intent(self, data: Dict[str, Any]) -> Dict[str, Any]: + """分析用户意图""" + user_input = data.get('user_input', '') + context = data.get('context', {}) + + prompt = f""" +请分析用户的真实意图和需求: + +用户输入: "{user_input}" +用户背景: {json.dumps(context, ensure_ascii=False)} + +请分析: +1. 真实意图 +2. 情绪状态 +3. 营养需求 +4. 推荐理由 + +返回JSON格式结果。 +""" + + try: + response = await self.openai_client.chat.completions.create( + model="gpt-4", + messages=[ + {"role": "system", "content": "你是专业的营养师和心理分析师。"}, + {"role": "user", "content": prompt} + ], + temperature=0.3, + max_tokens=500 + ) + + result_text = response.choices[0].message.content + return self._parse_json_result(result_text) + except Exception as e: + self.logger.error(f"用户意图分析失败: {e}") + return {"intent": "需要饮食建议", "confidence": 0.3} + + async def _analyze_physiological_state(self, data: Dict[str, Any]) -> Dict[str, Any]: + """分析生理状态""" + profile = data.get('profile', {}) + current_date = data.get('current_date', '') + + if not profile.get('is_female', False): + return {"state": "normal", "needs": []} + + # 计算生理周期 + cycle_info = self._calculate_cycle_state(profile, current_date) + + prompt = f""" +作为女性健康专家,分析用户的生理状态: + +用户信息: {json.dumps(profile, ensure_ascii=False)} +当前日期: {current_date} +生理周期: {json.dumps(cycle_info, ensure_ascii=False)} + +请分析营养需求和饮食建议。 +""" + + try: + response = await self.openai_client.chat.completions.create( + model="gpt-4", + messages=[ + {"role": "system", "content": "你是专业的女性健康专家。"}, + {"role": "user", "content": prompt} + ], + temperature=0.2, + max_tokens=400 + ) + + result_text = response.choices[0].message.content + result = self._parse_json_result(result_text) + result['cycle_info'] = cycle_info + return result + except Exception as e: + self.logger.error(f"生理状态分析失败: {e}") + return {"state": "normal", "needs": [], "cycle_info": cycle_info} + + async def _analyze_nutrition(self, data: Dict[str, Any]) -> Dict[str, Any]: + """营养分析""" + foods = data.get('foods', []) + quantities = data.get('quantities', []) + + prompt = f""" +请分析以下食物的营养成分: + +食物: {', '.join(foods)} +数量: {', '.join(quantities)} + +请分析: +1. 总热量 +2. 主要营养素 +3. 营养均衡性 +4. 改进建议 + +返回JSON格式结果。 +""" + + try: + response = await self.openai_client.chat.completions.create( + model="gpt-4", + messages=[ + {"role": "system", "content": "你是专业的营养师。"}, + {"role": "user", "content": prompt} + ], + temperature=0.2, + max_tokens=400 + ) + + result_text = response.choices[0].message.content + return self._parse_json_result(result_text) + except Exception as e: + self.logger.error(f"营养分析失败: {e}") + return {"calories": 0, "analysis": "分析失败"} + + async def _generate_reasoning(self, data: Dict[str, Any]) -> str: + """生成推荐理由""" + recommendations = data.get('recommendations', []) + user_profile = data.get('user_profile', {}) + + prompt = f""" +请为以下推荐生成个性化理由: + +推荐食物: {', '.join(recommendations)} +用户画像: {json.dumps(user_profile, ensure_ascii=False)} + +请生成简洁明了的推荐理由。 +""" + + try: + response = await self.openai_client.chat.completions.create( + model="gpt-4", + messages=[ + {"role": "system", "content": "你是专业的营养师。"}, + {"role": "user", "content": prompt} + ], + temperature=0.3, + max_tokens=200 + ) + + return response.choices[0].message.content + except Exception as e: + self.logger.error(f"生成推荐理由失败: {e}") + return "基于您的个人偏好和营养需求推荐" + + def _calculate_cycle_state(self, profile: Dict[str, Any], current_date: str) -> Dict[str, Any]: + """计算生理周期状态""" + try: + last_period = datetime.strptime(profile.get('last_period_date', ''), '%Y-%m-%d') + current = datetime.strptime(current_date, '%Y-%m-%d') + cycle_length = profile.get('menstrual_cycle_length', 28) + + days_since_period = (current - last_period).days + days_to_next_period = cycle_length - (days_since_period % cycle_length) + + if days_since_period % cycle_length < 5: + phase = "月经期" + elif days_since_period % cycle_length < 14: + phase = "卵泡期" + elif days_since_period % cycle_length < 18: + phase = "排卵期" + else: + phase = "黄体期" + + return { + "phase": phase, + "days_since_period": days_since_period % cycle_length, + "days_to_next_period": days_to_next_period, + "is_ovulation": phase == "排卵期" + } + except Exception: + return { + "phase": "未知", + "days_since_period": 0, + "days_to_next_period": 0, + "is_ovulation": False + } + + def _parse_json_result(self, text: str) -> Dict[str, Any]: + """解析JSON结果""" + try: + start_idx = text.find('{') + end_idx = text.rfind('}') + 1 + + if start_idx != -1 and end_idx != -1: + json_str = text[start_idx:end_idx] + return json.loads(json_str) + except Exception as e: + self.logger.error(f"解析JSON结果失败: {e}") + + return {} + + async def cleanup(self) -> bool: + """清理资源""" + self._initialized = False + return True + + +class RecommendationEngine(BaseEngine): + """推荐引擎基座 - 统一的推荐算法接口""" + + def __init__(self, config: Dict[str, Any] = None): + super().__init__(config) + self.data_manager = None + self.ai_analyzer = None + self.food_database = {} + + async def initialize(self) -> bool: + """初始化推荐引擎""" + try: + # 初始化依赖组件 + self.data_manager = DataManager() + await self.data_manager.initialize() + + self.ai_analyzer = AIAnalyzer() + await self.ai_analyzer.initialize() + + # 加载食物数据库 + await self._load_food_database() + + self._initialized = True + self.logger.info("推荐引擎初始化成功") + return True + except Exception as e: + self.logger.error(f"推荐引擎初始化失败: {e}") + return False + + async def process(self, request_type: str, data: Any) -> Any: + """处理推荐请求""" + if not self._initialized: + await self.initialize() + + request_types = { + 'generate_recommendation': self._generate_recommendation, + 'update_model': self._update_model, + 'get_food_info': self._get_food_info + } + + if request_type in request_types: + return await request_types[request_type](data) + else: + raise ValueError(f"不支持的请求类型: {request_type}") + + async def _generate_recommendation(self, data: Dict[str, Any]) -> RecommendationResult: + """生成推荐""" + user_id = data.get('user_id') + user_input = data.get('user_input', '') + current_date = data.get('current_date', datetime.now().strftime('%Y-%m-%d')) + meal_type = data.get('meal_type', 'lunch') + + # 获取用户数据 + user_profile = await self.data_manager.process('get_user', user_id) + meal_history = await self.data_manager.process('get_meals', {'user_id': user_id, 'days': 5}) + + if not user_profile: + raise ValueError(f"用户 {user_id} 不存在") + + # AI分析用户意图 + intent_analysis = await self.ai_analyzer.process('user_intent', { + 'user_input': user_input, + 'context': asdict(user_profile) + }) + + # AI分析生理状态 + physiological_analysis = await self.ai_analyzer.process('physiological_state', { + 'profile': asdict(user_profile), + 'current_date': current_date + }) + + # 生成推荐食物 + recommended_foods = await self._select_foods( + user_profile, intent_analysis, physiological_analysis + ) + + # 生成推荐理由 + reasoning = await self.ai_analyzer.process('recommendation_reasoning', { + 'recommendations': recommended_foods, + 'user_profile': asdict(user_profile) + }) + + # 创建推荐结果 + recommendation = RecommendationResult( + user_id=user_id, + date=current_date, + meal_type=meal_type, + recommended_foods=recommended_foods, + reasoning=reasoning, + confidence_score=intent_analysis.get('confidence', 0.5), + special_considerations=physiological_analysis.get('considerations', []) + ) + + # 保存推荐结果 + await self.data_manager.process('save_recommendation', recommendation) + + return recommendation + + async def _select_foods(self, user_profile: UserProfile, + intent_analysis: Dict[str, Any], + physiological_analysis: Dict[str, Any]) -> List[str]: + """选择推荐食物""" + + # 基础食物池 + base_foods = [ + "米饭", "面条", "馒头", "包子", "饺子", + "鸡蛋", "豆腐", "鱼肉", "鸡肉", "瘦肉", + "青菜", "西红柿", "胡萝卜", "土豆", "西兰花", + "苹果", "香蕉", "橙子", "葡萄", "草莓", + "牛奶", "酸奶", "豆浆", "坚果", "红枣" + ] + + # 根据用户偏好过滤 + filtered_foods = [] + for food in base_foods: + if not any(dislike in food for dislike in user_profile.dislikes): + if not any(allergy in food for allergy in user_profile.allergies): + filtered_foods.append(food) + + # 根据生理需求调整 + physiological_needs = physiological_analysis.get('needs', []) + priority_foods = [] + + for need in physiological_needs: + if need == "铁质": + priority_foods.extend(["菠菜", "瘦肉", "红枣"]) + elif need == "蛋白质": + priority_foods.extend(["鸡蛋", "豆腐", "鱼肉"]) + elif need == "维生素C": + priority_foods.extend(["橙子", "柠檬", "西红柿"]) + + # 合并推荐 + recommended = list(set(priority_foods + filtered_foods))[:5] + + return recommended + + async def _update_model(self, data: Dict[str, Any]) -> bool: + """更新模型""" + # 这里可以实现机器学习模型的更新逻辑 + user_id = data.get('user_id') + feedback_data = await self.data_manager.process('get_feedback', {'user_id': user_id, 'days': 30}) + + # 基于反馈数据更新推荐策略 + self.logger.info(f"更新用户 {user_id} 的推荐模型") + return True + + async def _get_food_info(self, food_name: str) -> Dict[str, Any]: + """获取食物信息""" + return self.food_database.get(food_name, {}) + + async def _load_food_database(self): + """加载食物数据库""" + # 这里可以从文件或API加载食物营养信息 + self.food_database = { + "米饭": {"calories": 130, "protein": 2.7, "carbs": 28}, + "鸡蛋": {"calories": 155, "protein": 13, "fat": 11}, + "豆腐": {"calories": 76, "protein": 8, "carbs": 2}, + # 更多食物数据... + } + + async def cleanup(self) -> bool: + """清理资源""" + if self.data_manager: + await self.data_manager.cleanup() + if self.ai_analyzer: + await self.ai_analyzer.cleanup() + self._initialized = False + return True + + +if __name__ == "__main__": + # 测试基座架构 + async def test_base_engine(): + print("测试基座架构...") + + # 测试数据管理器 + data_manager = DataManager() + await data_manager.initialize() + + # 创建测试用户 + test_user = UserProfile( + user_id="test_001", + name="测试用户", + age=25, + gender="女", + height=165.0, + weight=55.0, + activity_level="moderate", + taste_preferences={"sweet": 4, "salty": 3}, + is_female=True, + zodiac_sign="天秤座" + ) + + # 保存用户 + await data_manager.process('save_user', test_user) + print("用户保存成功") + + # 获取用户 + retrieved_user = await data_manager.process('get_user', "test_001") + if retrieved_user: + print(f"获取用户: {retrieved_user.name}") + + # 测试推荐引擎 + rec_engine = RecommendationEngine() + await rec_engine.initialize() + + # 生成推荐 + recommendation = await rec_engine.process('generate_recommendation', { + 'user_id': 'test_001', + 'user_input': '我今天想吃点清淡的', + 'meal_type': 'lunch' + }) + + print(f"推荐结果: {recommendation.recommended_foods}") + print(f"推荐理由: {recommendation.reasoning}") + + # 清理资源 + await data_manager.cleanup() + await rec_engine.cleanup() + print("测试完成") + + # 运行测试 + asyncio.run(test_base_engine()) diff --git a/gui/main_window.py b/gui/main_window.py new file mode 100644 index 0000000..e65dd26 --- /dev/null +++ b/gui/main_window.py @@ -0,0 +1,1504 @@ +""" +主GUI界面 - 基于CustomTkinter的现代化界面 +""" + +import tkinter as tk +from tkinter import ttk, messagebox, scrolledtext +import customtkinter as ctk +from typing import Optional, Dict, Any, List +from datetime import datetime, date +import json +import threading +from core.base import AppCore, UserData, ModuleType +# 移除直接导入,改为通过应用核心调用 +# from modules.data_collection import collect_questionnaire_data, record_meal, record_feedback +# from modules.ai_analysis import analyze_user_intent, analyze_nutrition, analyze_physiological_state +# from modules.recommendation_engine import generate_meal_recommendations, find_similar_foods + +# 设置CustomTkinter主题 +ctk.set_appearance_mode("dark") +ctk.set_default_color_theme("blue") + + +class MainWindow: + """主窗口类""" + + def __init__(self, root: tk.Tk, app_core: AppCore): + self.root = root + self.app_core = app_core + self.current_user_id: Optional[str] = None + self.current_user_data: Optional[UserData] = None + + # 设置窗口属性 + self._setup_window() + + # 创建界面 + self._create_widgets() + + # 绑定事件 + self._bind_events() + + # 初始化界面状态 + self._initialize_ui_state() + + def _setup_window(self): + """设置窗口属性""" + self.root.title("个性化饮食推荐助手") + self.root.geometry("1200x800") + self.root.minsize(800, 600) + + # 设置窗口图标(如果有的话) + try: + # self.root.iconbitmap("assets/icon.ico") + pass + except: + pass + + def _create_widgets(self): + """创建界面组件""" + # 创建主框架 + self.main_frame = ctk.CTkFrame(self.root) + self.main_frame.pack(fill="both", expand=True, padx=10, pady=10) + + # 创建顶部导航栏 + self._create_navigation_bar() + + # 创建主内容区域 + self._create_main_content() + + # 创建状态栏 + self._create_status_bar() + + def _create_navigation_bar(self): + """创建导航栏""" + nav_frame = ctk.CTkFrame(self.main_frame) + nav_frame.pack(fill="x", padx=10, pady=(10, 5)) + + # 应用标题 + title_label = ctk.CTkLabel( + nav_frame, + text="🍎 个性化饮食推荐助手", + font=ctk.CTkFont(size=24, weight="bold") + ) + title_label.pack(side="left", padx=20, pady=10) + + # 用户信息区域 + self.user_info_frame = ctk.CTkFrame(nav_frame) + self.user_info_frame.pack(side="right", padx=20, pady=10) + + self.user_label = ctk.CTkLabel( + self.user_info_frame, + text="未登录", + font=ctk.CTkFont(size=14) + ) + self.user_label.pack(padx=10, pady=5) + + # 登录/注册按钮 + self.login_button = ctk.CTkButton( + self.user_info_frame, + text="登录/注册", + command=self._show_login_dialog, + width=100 + ) + self.login_button.pack(padx=10, pady=5) + + def _create_main_content(self): + """创建主内容区域""" + # 创建选项卡 + self.tabview = ctk.CTkTabview(self.main_frame) + self.tabview.pack(fill="both", expand=True, padx=10, pady=5) + + # 添加选项卡 + self.tabview.add("数据采集") + self.tabview.add("AI分析") + self.tabview.add("推荐系统") + self.tabview.add("历史推荐") + self.tabview.add("个人中心") + + # 设置选项卡名称 + self.tabview.set("数据采集") + + # 创建各个选项卡的内容 + self._create_data_collection_tab() + self._create_ai_analysis_tab() + self._create_recommendation_tab() + self._create_history_recommend_tab() + self._create_profile_tab() + + def _create_data_collection_tab(self): + """创建数据采集选项卡""" + tab = self.tabview.tab("数据采集") + + # 创建滚动框架 + scroll_frame = ctk.CTkScrollableFrame(tab) + scroll_frame.pack(fill="both", expand=True, padx=10, pady=10) + + # 问卷部分 + questionnaire_frame = ctk.CTkFrame(scroll_frame) + questionnaire_frame.pack(fill="x", padx=10, pady=10) + + questionnaire_title = ctk.CTkLabel( + questionnaire_frame, + text="📋 用户问卷", + font=ctk.CTkFont(size=18, weight="bold") + ) + questionnaire_title.pack(pady=10) + + # 问卷类型选择 + self.questionnaire_type_var = tk.StringVar(value="basic") + questionnaire_type_label = ctk.CTkLabel(questionnaire_frame, text="问卷类型:") + questionnaire_type_label.pack(anchor="w", padx=20, pady=5) + + questionnaire_type_menu = ctk.CTkOptionMenu( + questionnaire_frame, + variable=self.questionnaire_type_var, + values=["basic", "taste", "physiological"], + command=self._on_questionnaire_type_changed + ) + questionnaire_type_menu.pack(anchor="w", padx=20, pady=5) + + # 问卷内容区域 + self.questionnaire_content_frame = ctk.CTkFrame(questionnaire_frame) + self.questionnaire_content_frame.pack(fill="x", padx=20, pady=10) + + # 餐食记录部分 + meal_frame = ctk.CTkFrame(scroll_frame) + meal_frame.pack(fill="x", padx=10, pady=10) + + meal_title = ctk.CTkLabel( + meal_frame, + text="🍽️ 餐食记录", + font=ctk.CTkFont(size=18, weight="bold") + ) + meal_title.pack(pady=10) + + # 餐食记录表单 + self._create_meal_record_form(meal_frame) + + # 反馈记录部分 + feedback_frame = ctk.CTkFrame(scroll_frame) + feedback_frame.pack(fill="x", padx=10, pady=10) + + feedback_title = ctk.CTkLabel( + feedback_frame, + text="💬 用户反馈", + font=ctk.CTkFont(size=18, weight="bold") + ) + feedback_title.pack(pady=10) + + # 反馈记录表单 + self._create_feedback_form(feedback_frame) + + def _create_meal_record_form(self, parent): + """创建餐食记录表单""" + form_frame = ctk.CTkFrame(parent) + form_frame.pack(fill="x", padx=20, pady=10) + + # 日期选择 + date_label = ctk.CTkLabel(form_frame, text="日期:") + date_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.meal_date_var = tk.StringVar(value=datetime.now().strftime('%Y-%m-%d')) + date_entry = ctk.CTkEntry(form_frame, textvariable=self.meal_date_var, width=150) + date_entry.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 餐次选择 + meal_type_label = ctk.CTkLabel(form_frame, text="餐次:") + meal_type_label.grid(row=1, column=0, sticky="w", padx=10, pady=5) + + self.meal_type_var = tk.StringVar(value="breakfast") + meal_type_menu = ctk.CTkOptionMenu( + form_frame, + variable=self.meal_type_var, + values=["breakfast", "lunch", "dinner"] + ) + meal_type_menu.grid(row=1, column=1, sticky="w", padx=10, pady=5) + + # 食物输入 + foods_label = ctk.CTkLabel(form_frame, text="食物:") + foods_label.grid(row=2, column=0, sticky="w", padx=10, pady=5) + + self.foods_text = ctk.CTkTextbox(form_frame, height=60, width=300) + self.foods_text.grid(row=2, column=1, sticky="w", padx=10, pady=5) + self.foods_text.insert("1.0", "请输入食物名称,每行一个") + self.foods_text.bind("", self._on_foods_changed) + + # 分量输入 + quantities_label = ctk.CTkLabel(form_frame, text="分量:") + quantities_label.grid(row=3, column=0, sticky="w", padx=10, pady=5) + + self.quantities_text = ctk.CTkTextbox(form_frame, height=60, width=300) + self.quantities_text.grid(row=3, column=1, sticky="w", padx=10, pady=5) + self.quantities_text.insert("1.0", "请输入对应分量,每行一个") + self.quantities_text.bind("", self._on_quantities_changed) + + # 热量显示(自动估算) + calories_label = ctk.CTkLabel(form_frame, text="预估热量:") + calories_label.grid(row=4, column=0, sticky="w", padx=10, pady=5) + + self.calories_display = ctk.CTkLabel(form_frame, text="系统将自动估算", width=150, anchor="w") + self.calories_display.grid(row=4, column=1, sticky="w", padx=10, pady=5) + + # 满意度评分 + satisfaction_label = ctk.CTkLabel(form_frame, text="满意度:") + satisfaction_label.grid(row=5, column=0, sticky="w", padx=10, pady=5) + + self.satisfaction_var = tk.IntVar(value=3) + satisfaction_slider = ctk.CTkSlider( + form_frame, + from_=1, + to=5, + number_of_steps=4, + variable=self.satisfaction_var + ) + satisfaction_slider.grid(row=5, column=1, sticky="w", padx=10, pady=5) + + # 快速录入按钮 + quick_input_button = ctk.CTkButton( + form_frame, + text="🚀 快速录入", + command=self._show_quick_input_dialog, + width=150, + fg_color="purple" + ) + quick_input_button.grid(row=6, column=0, sticky="w", padx=10, pady=10) + + # 智能记录按钮 + smart_record_button = ctk.CTkButton( + form_frame, + text="智能记录餐食", + command=self._show_smart_meal_record, + width=150, + fg_color="green" + ) + smart_record_button.grid(row=6, column=1, sticky="w", padx=10, pady=10) + + # 传统记录按钮 + save_meal_button = ctk.CTkButton( + form_frame, + text="手动记录餐食", + command=self._save_meal_record, + width=150 + ) + save_meal_button.grid(row=6, column=1, sticky="w", padx=10, pady=10) + + def _create_feedback_form(self, parent): + """创建反馈表单""" + form_frame = ctk.CTkFrame(parent) + form_frame.pack(fill="x", padx=20, pady=10) + + # 推荐食物 + recommended_label = ctk.CTkLabel(form_frame, text="推荐食物:") + recommended_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.recommended_foods_text = ctk.CTkTextbox(form_frame, height=60, width=300) + self.recommended_foods_text.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 用户选择 + user_choice_label = ctk.CTkLabel(form_frame, text="用户选择:") + user_choice_label.grid(row=1, column=0, sticky="w", padx=10, pady=5) + + self.user_choice_var = tk.StringVar() + user_choice_entry = ctk.CTkEntry(form_frame, textvariable=self.user_choice_var, width=300) + user_choice_entry.grid(row=1, column=1, sticky="w", padx=10, pady=5) + + # 反馈类型 + feedback_type_label = ctk.CTkLabel(form_frame, text="反馈类型:") + feedback_type_label.grid(row=2, column=0, sticky="w", padx=10, pady=5) + + self.feedback_type_var = tk.StringVar(value="like") + feedback_type_menu = ctk.CTkOptionMenu( + form_frame, + variable=self.feedback_type_var, + values=["like", "dislike", "ate"] + ) + feedback_type_menu.grid(row=2, column=1, sticky="w", padx=10, pady=5) + + # 保存按钮 + save_feedback_button = ctk.CTkButton( + form_frame, + text="保存反馈", + command=self._save_feedback, + width=150 + ) + save_feedback_button.grid(row=3, column=1, sticky="w", padx=10, pady=10) + + def _create_ai_analysis_tab(self): + """创建AI分析选项卡""" + tab = self.tabview.tab("AI分析") + + # 创建滚动框架 + scroll_frame = ctk.CTkScrollableFrame(tab) + scroll_frame.pack(fill="both", expand=True, padx=10, pady=10) + + # 用户意图分析 + intent_frame = ctk.CTkFrame(scroll_frame) + intent_frame.pack(fill="x", padx=10, pady=10) + + intent_title = ctk.CTkLabel( + intent_frame, + text="🧠 用户意图分析", + font=ctk.CTkFont(size=18, weight="bold") + ) + intent_title.pack(pady=10) + + # 用户输入 + input_label = ctk.CTkLabel(intent_frame, text="用户输入:") + input_label.pack(anchor="w", padx=20, pady=5) + + self.user_input_text = ctk.CTkTextbox(intent_frame, height=80, width=600) + self.user_input_text.pack(fill="x", padx=20, pady=5) + self.user_input_text.insert("1.0", "请输入用户的饮食需求或问题...") + + # 分析按钮 + analyze_button = ctk.CTkButton( + intent_frame, + text="分析用户意图", + command=self._analyze_user_intent, + width=150 + ) + analyze_button.pack(padx=20, pady=10) + + # 分析结果显示 + self.intent_result_text = ctk.CTkTextbox(intent_frame, height=200, width=600) + self.intent_result_text.pack(fill="x", padx=20, pady=10) + + # 营养分析 + nutrition_frame = ctk.CTkFrame(scroll_frame) + nutrition_frame.pack(fill="x", padx=10, pady=10) + + nutrition_title = ctk.CTkLabel( + nutrition_frame, + text="🥗 营养分析", + font=ctk.CTkFont(size=18, weight="bold") + ) + nutrition_title.pack(pady=10) + + # 营养分析按钮 + nutrition_button = ctk.CTkButton( + nutrition_frame, + text="分析最近餐食营养", + command=self._analyze_nutrition, + width=150 + ) + nutrition_button.pack(padx=20, pady=10) + + # 营养分析结果显示 + self.nutrition_result_text = ctk.CTkTextbox(nutrition_frame, height=200, width=600) + self.nutrition_result_text.pack(fill="x", padx=20, pady=10) + + def _create_recommendation_tab(self): + """创建推荐系统选项卡""" + tab = self.tabview.tab("推荐系统") + + # 创建滚动框架 + scroll_frame = ctk.CTkScrollableFrame(tab) + scroll_frame.pack(fill="both", expand=True, padx=10, pady=10) + + # 餐食推荐 + recommendation_frame = ctk.CTkFrame(scroll_frame) + recommendation_frame.pack(fill="x", padx=10, pady=10) + + recommendation_title = ctk.CTkLabel( + recommendation_frame, + text="🎯 个性化推荐", + font=ctk.CTkFont(size=18, weight="bold") + ) + recommendation_title.pack(pady=10) + + # 推荐参数 + params_frame = ctk.CTkFrame(recommendation_frame) + params_frame.pack(fill="x", padx=20, pady=10) + + # 餐次选择 + meal_type_label = ctk.CTkLabel(params_frame, text="餐次:") + meal_type_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.recommendation_meal_type_var = tk.StringVar(value="lunch") + meal_type_menu = ctk.CTkOptionMenu( + params_frame, + variable=self.recommendation_meal_type_var, + values=["breakfast", "lunch", "dinner"] + ) + meal_type_menu.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 口味偏好 + taste_label = ctk.CTkLabel(params_frame, text="口味偏好:") + taste_label.grid(row=1, column=0, sticky="w", padx=10, pady=5) + + self.taste_preference_var = tk.StringVar(value="balanced") + taste_menu = ctk.CTkOptionMenu( + params_frame, + variable=self.taste_preference_var, + values=["balanced", "sweet", "salty", "spicy", "sour"] + ) + taste_menu.grid(row=1, column=1, sticky="w", padx=10, pady=5) + + # 推荐按钮 + recommend_button = ctk.CTkButton( + params_frame, + text="生成推荐", + command=self._generate_recommendations, + width=150 + ) + recommend_button.grid(row=2, column=1, sticky="w", padx=10, pady=10) + + # 推荐结果显示 + self.recommendation_result_text = ctk.CTkTextbox(recommendation_frame, height=300, width=600) + self.recommendation_result_text.pack(fill="x", padx=20, pady=10) + + def _create_history_recommend_tab(self): + """创建历史数据驱动的推荐页签(前端仅展示推荐列表,训练在后台)""" + tab = self.tabview.tab("历史推荐") + + # 创建滚动框架 + scroll_frame = ctk.CTkScrollableFrame(tab) + scroll_frame.pack(fill="both", expand=True, padx=10, pady=10) + + # 标题 + title = ctk.CTkLabel( + scroll_frame, + text="📊 基于历史数据的个性化推荐", + font=ctk.CTkFont(size=18, weight="bold") + ) + title.pack(anchor="w", padx=10, pady=10) + + # 说明 + info = ctk.CTkLabel( + scroll_frame, + text="训练在后台自动进行,页面展示最新推荐结果。", + font=ctk.CTkFont(size=12) + ) + info.pack(anchor="w", padx=10, pady=5) + + # 控制区域 + control_frame = ctk.CTkFrame(scroll_frame) + control_frame.pack(fill="x", padx=10, pady=10) + + # 餐次选择 + meal_type_label = ctk.CTkLabel(control_frame, text="餐次:") + meal_type_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.hist_meal_type_var = tk.StringVar(value="lunch") + meal_menu = ctk.CTkOptionMenu( + control_frame, + variable=self.hist_meal_type_var, + values=["breakfast", "lunch", "dinner", "snack"] + ) + meal_menu.grid(row=0, column=1, padx=5, pady=5, sticky="w") + + # 刷新按钮 + refresh_btn = ctk.CTkButton( + control_frame, + text="🔄 刷新推荐", + command=self._refresh_history_recommendations + ) + refresh_btn.grid(row=0, column=2, padx=5, pady=5, sticky="w") + + # 结果显示区域 + self.history_rec_text = ctk.CTkTextbox(scroll_frame, height=420) + self.history_rec_text.pack(fill="both", expand=True, padx=10, pady=10) + + # 页面打开时自动触发一次刷新 + self.root.after(300, self._refresh_history_recommendations) + + def _refresh_history_recommendations(self): + """刷新历史推荐""" + if not self.current_user_id: + self._update_status("请先登录") + return + + meal_type = self.hist_meal_type_var.get() + + def work(): + try: + # 启动后台训练(幂等) + from modules.efficient_data_processing import training_pipeline + training_pipeline.start_background_training() + + # 立即进行一次快速训练+推荐(内部做了缓存) + recs = training_pipeline.predict_recommendations(self.current_user_id, meal_type) + self.root.after(0, lambda: self._render_history_recs(recs)) + except Exception as e: + self.root.after(0, lambda: self._update_status(f"历史推荐失败: {e}")) + + threading.Thread(target=work, daemon=True).start() + + def _render_history_recs(self, recs: List[Dict[str, Any]]): + """渲染历史推荐结果""" + self.history_rec_text.delete("1.0", "end") + + if not recs: + self.history_rec_text.insert("1.0", "暂无推荐,请先记录一些餐食或稍后再试。") + return + + lines = [] + for i, r in enumerate(recs, 1): + food = r.get('food', '推荐项') + confidence = r.get('confidence', 0) + reason = r.get('reason', '-') + lines.append(f"{i}. {food} 可信度: {confidence:.2f} 原因: {reason}") + + self.history_rec_text.insert("1.0", "\n".join(lines)) + + def _create_profile_tab(self): + """创建个人中心选项卡""" + tab = self.tabview.tab("个人中心") + + # 创建滚动框架 + scroll_frame = ctk.CTkScrollableFrame(tab) + scroll_frame.pack(fill="both", expand=True, padx=10, pady=10) + + # 用户信息 + profile_frame = ctk.CTkFrame(scroll_frame) + profile_frame.pack(fill="x", padx=10, pady=10) + + profile_title = ctk.CTkLabel( + profile_frame, + text="👤 个人信息", + font=ctk.CTkFont(size=18, weight="bold") + ) + profile_title.pack(pady=10) + + # 用户信息显示 + self.profile_info_text = ctk.CTkTextbox(profile_frame, height=200, width=600) + self.profile_info_text.pack(fill="x", padx=20, pady=10) + + # 刷新按钮 + refresh_button = ctk.CTkButton( + profile_frame, + text="刷新信息", + command=self._refresh_profile_info, + width=150 + ) + refresh_button.pack(padx=20, pady=10) + + # 数据统计 + stats_frame = ctk.CTkFrame(scroll_frame) + stats_frame.pack(fill="x", padx=10, pady=10) + + stats_title = ctk.CTkLabel( + stats_frame, + text="📊 数据统计", + font=ctk.CTkFont(size=18, weight="bold") + ) + stats_title.pack(pady=10) + + # 统计数据 + self.stats_text = ctk.CTkTextbox(stats_frame, height=200, width=600) + self.stats_text.pack(fill="x", padx=20, pady=10) + + def _create_status_bar(self): + """创建状态栏""" + self.status_frame = ctk.CTkFrame(self.main_frame) + self.status_frame.pack(fill="x", padx=10, pady=(5, 10)) + + self.status_label = ctk.CTkLabel( + self.status_frame, + text="就绪", + font=ctk.CTkFont(size=12) + ) + self.status_label.pack(side="left", padx=10, pady=5) + + # 模块状态 + self.module_status_label = ctk.CTkLabel( + self.status_frame, + text="模块状态: 正常", + font=ctk.CTkFont(size=12) + ) + self.module_status_label.pack(side="right", padx=10, pady=5) + + def _bind_events(self): + """绑定事件""" + pass + + def _initialize_ui_state(self): + """初始化界面状态""" + self._update_status("就绪") + self._load_questionnaire_content("basic") + + def _update_status(self, message: str): + """更新状态栏""" + self.status_label.configure(text=message) + self.root.update_idletasks() + + def _show_login_dialog(self): + """显示登录对话框""" + dialog = LoginDialog(self.root, self) + self.root.wait_window(dialog.dialog) + + def _on_questionnaire_type_changed(self, value): + """问卷类型改变事件""" + self._load_questionnaire_content(value) + + def _load_questionnaire_content(self, questionnaire_type: str): + """加载问卷内容""" + # 清空现有内容 + for widget in self.questionnaire_content_frame.winfo_children(): + widget.destroy() + + # 根据问卷类型创建内容 + if questionnaire_type == "basic": + self._create_basic_questionnaire() + elif questionnaire_type == "taste": + self._create_taste_questionnaire() + elif questionnaire_type == "physiological": + self._create_physiological_questionnaire() + + def _create_basic_questionnaire(self): + """创建基础问卷""" + # 姓名 + name_label = ctk.CTkLabel(self.questionnaire_content_frame, text="姓名:") + name_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.name_var = tk.StringVar() + name_entry = ctk.CTkEntry(self.questionnaire_content_frame, textvariable=self.name_var, width=200) + name_entry.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 年龄范围选择 + age_label = ctk.CTkLabel(self.questionnaire_content_frame, text="年龄范围:") + age_label.grid(row=1, column=0, sticky="w", padx=10, pady=5) + + self.age_range_var = tk.StringVar(value="25-30岁") + age_menu = ctk.CTkOptionMenu( + self.questionnaire_content_frame, + variable=self.age_range_var, + values=["18-24岁", "25-30岁", "31-35岁", "36-40岁", "41-45岁", "46-50岁", "51-55岁", "56-60岁", "60岁以上"] + ) + age_menu.grid(row=1, column=1, sticky="w", padx=10, pady=5) + + # 性别 + gender_label = ctk.CTkLabel(self.questionnaire_content_frame, text="性别:") + gender_label.grid(row=2, column=0, sticky="w", padx=10, pady=5) + + self.gender_var = tk.StringVar(value="女") + gender_menu = ctk.CTkOptionMenu( + self.questionnaire_content_frame, + variable=self.gender_var, + values=["男", "女"] + ) + gender_menu.grid(row=2, column=1, sticky="w", padx=10, pady=5) + + # 身高范围 + height_label = ctk.CTkLabel(self.questionnaire_content_frame, text="身高范围:") + height_label.grid(row=3, column=0, sticky="w", padx=10, pady=5) + + self.height_range_var = tk.StringVar(value="160-165cm") + height_menu = ctk.CTkOptionMenu( + self.questionnaire_content_frame, + variable=self.height_range_var, + values=["150cm以下", "150-155cm", "155-160cm", "160-165cm", "165-170cm", "170-175cm", "175-180cm", "180cm以上"] + ) + height_menu.grid(row=3, column=1, sticky="w", padx=10, pady=5) + + # 体重范围 + weight_label = ctk.CTkLabel(self.questionnaire_content_frame, text="体重范围:") + weight_label.grid(row=4, column=0, sticky="w", padx=10, pady=5) + + self.weight_range_var = tk.StringVar(value="50-55kg") + weight_menu = ctk.CTkOptionMenu( + self.questionnaire_content_frame, + variable=self.weight_range_var, + values=["40kg以下", "40-45kg", "45-50kg", "50-55kg", "55-60kg", "60-65kg", "65-70kg", "70-75kg", "75-80kg", "80kg以上"] + ) + weight_menu.grid(row=4, column=1, sticky="w", padx=10, pady=5) + + # 活动水平 + activity_label = ctk.CTkLabel(self.questionnaire_content_frame, text="活动水平:") + activity_label.grid(row=5, column=0, sticky="w", padx=10, pady=5) + + self.activity_var = tk.StringVar(value="中等") + activity_menu = ctk.CTkOptionMenu( + self.questionnaire_content_frame, + variable=self.activity_var, + values=["久坐", "轻度活动", "中等", "高度活动", "极度活动"] + ) + activity_menu.grid(row=5, column=1, sticky="w", padx=10, pady=5) + + # 保存按钮 + save_button = ctk.CTkButton( + self.questionnaire_content_frame, + text="保存基础信息", + command=self._save_basic_questionnaire, + width=150 + ) + save_button.grid(row=6, column=1, sticky="w", padx=10, pady=10) + + def _create_taste_questionnaire(self): + """创建口味问卷""" + # 甜味偏好 + sweet_label = ctk.CTkLabel(self.questionnaire_content_frame, text="甜味偏好:") + sweet_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.sweet_var = tk.IntVar(value=3) + sweet_slider = ctk.CTkSlider( + self.questionnaire_content_frame, + from_=1, + to=5, + number_of_steps=4, + variable=self.sweet_var + ) + sweet_slider.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 咸味偏好 + salty_label = ctk.CTkLabel(self.questionnaire_content_frame, text="咸味偏好:") + salty_label.grid(row=1, column=0, sticky="w", padx=10, pady=5) + + self.salty_var = tk.IntVar(value=3) + salty_slider = ctk.CTkSlider( + self.questionnaire_content_frame, + from_=1, + to=5, + number_of_steps=4, + variable=self.salty_var + ) + salty_slider.grid(row=1, column=1, sticky="w", padx=10, pady=5) + + # 辣味偏好 + spicy_label = ctk.CTkLabel(self.questionnaire_content_frame, text="辣味偏好:") + spicy_label.grid(row=2, column=0, sticky="w", padx=10, pady=5) + + self.spicy_var = tk.IntVar(value=3) + spicy_slider = ctk.CTkSlider( + self.questionnaire_content_frame, + from_=1, + to=5, + number_of_steps=4, + variable=self.spicy_var + ) + spicy_slider.grid(row=2, column=1, sticky="w", padx=10, pady=5) + + # 酸味偏好 + sour_label = ctk.CTkLabel(self.questionnaire_content_frame, text="酸味偏好:") + sour_label.grid(row=3, column=0, sticky="w", padx=10, pady=5) + + self.sour_var = tk.IntVar(value=3) + sour_slider = ctk.CTkSlider( + self.questionnaire_content_frame, + from_=1, + to=5, + number_of_steps=4, + variable=self.sour_var + ) + sour_slider.grid(row=3, column=1, sticky="w", padx=10, pady=5) + + # 苦味偏好 + bitter_label = ctk.CTkLabel(self.questionnaire_content_frame, text="苦味偏好:") + bitter_label.grid(row=4, column=0, sticky="w", padx=10, pady=5) + + self.bitter_var = tk.IntVar(value=3) + bitter_slider = ctk.CTkSlider( + self.questionnaire_content_frame, + from_=1, + to=5, + number_of_steps=4, + variable=self.bitter_var + ) + bitter_slider.grid(row=4, column=1, sticky="w", padx=10, pady=5) + + # 保存按钮 + save_button = ctk.CTkButton( + self.questionnaire_content_frame, + text="保存口味偏好", + command=self._save_taste_questionnaire, + width=150 + ) + save_button.grid(row=5, column=1, sticky="w", padx=10, pady=10) + + def _create_physiological_questionnaire(self): + """创建生理问卷""" + # 月经周期长度 + cycle_label = ctk.CTkLabel(self.questionnaire_content_frame, text="月经周期长度:") + cycle_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.cycle_length_var = tk.StringVar(value="28") + cycle_entry = ctk.CTkEntry(self.questionnaire_content_frame, textvariable=self.cycle_length_var, width=200) + cycle_entry.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 保存按钮 + save_button = ctk.CTkButton( + self.questionnaire_content_frame, + text="保存生理信息", + command=self._save_physiological_questionnaire, + width=150 + ) + save_button.grid(row=1, column=1, sticky="w", padx=10, pady=10) + + def _save_basic_questionnaire(self): + """保存基础问卷""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + # 将范围转换为具体数值 + age_range = self.age_range_var.get() + height_range = self.height_range_var.get() + weight_range = self.weight_range_var.get() + + # 年龄范围转换 + age_mapping = { + "18-24岁": 21, "25-30岁": 27, "31-35岁": 33, "36-40岁": 38, + "41-45岁": 43, "46-50岁": 48, "51-55岁": 53, "56-60岁": 58, "60岁以上": 65 + } + + # 身高范围转换 + height_mapping = { + "150cm以下": 150, "150-155cm": 152, "155-160cm": 157, "160-165cm": 162, + "165-170cm": 167, "170-175cm": 172, "175-180cm": 177, "180cm以上": 180 + } + + # 体重范围转换 + weight_mapping = { + "40kg以下": 40, "40-45kg": 42, "45-50kg": 47, "50-55kg": 52, + "55-60kg": 57, "60-65kg": 62, "65-70kg": 67, "70-75kg": 72, + "75-80kg": 77, "80kg以上": 80 + } + + # 活动水平转换 + activity_mapping = { + "久坐": "sedentary", "轻度活动": "light", "中等": "moderate", + "高度活动": "high", "极度活动": "very_high" + } + + answers = { + 'name': self.name_var.get(), + 'age': age_mapping.get(age_range, 25), + 'gender': self.gender_var.get(), + 'height': height_mapping.get(height_range, 165), + 'weight': weight_mapping.get(weight_range, 55), + 'activity_level': activity_mapping.get(self.activity_var.get(), 'moderate') + } + + try: + # 通过应用核心调用数据收集模块 + if self.app_core and self.app_core.module_manager: + result = self.app_core.process_user_request( + ModuleType.DATA_COLLECTION, + {'type': 'questionnaire', 'questionnaire_type': 'basic', 'answers': answers}, + self.current_user_id + ) + + if result and result.result.get('success'): + messagebox.showinfo("成功", "基础信息保存成功") + else: + messagebox.showerror("错误", "基础信息保存失败") + else: + messagebox.showerror("错误", "应用核心未初始化") + except Exception as e: + messagebox.showerror("错误", f"保存失败: {str(e)}") + + def _save_taste_questionnaire(self): + """保存口味问卷""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + answers = { + 'sweet': self.sweet_var.get() + } + + try: + # 通过应用核心调用数据收集模块 + if self.app_core and self.app_core.module_manager: + result = self.app_core.process_user_request( + ModuleType.DATA_COLLECTION, + {'type': 'questionnaire', 'questionnaire_type': 'taste', 'answers': answers}, + self.current_user_id + ) + + if result and result.result.get('success'): + messagebox.showinfo("成功", "口味偏好保存成功") + else: + messagebox.showerror("错误", "口味偏好保存失败") + else: + messagebox.showerror("错误", "应用核心未初始化") + except Exception as e: + messagebox.showerror("错误", f"保存失败: {str(e)}") + + def _save_physiological_questionnaire(self): + """保存生理问卷""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + answers = { + 'menstrual_cycle_length': int(self.cycle_length_var.get()) if self.cycle_length_var.get().isdigit() else 28 + } + + try: + # 通过应用核心调用数据收集模块 + if self.app_core and self.app_core.module_manager: + result = self.app_core.process_user_request( + ModuleType.DATA_COLLECTION, + {'type': 'questionnaire', 'questionnaire_type': 'physiological', 'answers': answers}, + self.current_user_id + ) + + if result and result.result.get('success'): + messagebox.showinfo("成功", "生理信息保存成功") + else: + messagebox.showerror("错误", "生理信息保存失败") + else: + messagebox.showerror("错误", "应用核心未初始化") + except Exception as e: + messagebox.showerror("错误", f"保存失败: {str(e)}") + + def _on_foods_changed(self, event=None): + """食物输入改变事件""" + self._update_calories_estimate() + + def _on_quantities_changed(self, event=None): + """分量输入改变事件""" + self._update_calories_estimate() + + def _update_calories_estimate(self): + """更新热量估算""" + try: + foods_text = self.foods_text.get("1.0", "end-1c") + quantities_text = self.quantities_text.get("1.0", "end-1c") + + foods = [food.strip() for food in foods_text.split('\n') if food.strip()] + quantities = [qty.strip() for qty in quantities_text.split('\n') if qty.strip()] + + if not foods or not quantities or len(foods) != len(quantities): + self.calories_display.configure(text="系统将自动估算") + return + + # 估算热量 + from smart_food.smart_database import estimate_calories + total_calories = 0 + + for food, quantity in zip(foods, quantities): + calories = estimate_calories(food, quantity) + total_calories += calories + + self.calories_display.configure(text=f"约 {total_calories} 卡路里") + + except Exception: + self.calories_display.configure(text="系统将自动估算") + + def _save_meal_record(self): + """保存餐食记录""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + foods_text = self.foods_text.get("1.0", "end-1c") + quantities_text = self.quantities_text.get("1.0", "end-1c") + + foods = [food.strip() for food in foods_text.split('\n') if food.strip()] + quantities = [qty.strip() for qty in quantities_text.split('\n') if qty.strip()] + + if not foods: + messagebox.showwarning("警告", "请输入食物") + return + + if len(foods) != len(quantities): + messagebox.showwarning("警告", "食物和分量数量不匹配") + return + + # 自动估算热量 + try: + from smart_food.smart_database import estimate_calories + total_calories = 0 + food_items = [] + + for food, quantity in zip(foods, quantities): + calories = estimate_calories(food, quantity) + total_calories += calories + food_items.append({ + "name": food, + "portion": quantity, + "calories": calories + }) + + # 更新热量显示 + self.calories_display.configure(text=f"约 {total_calories} 卡路里") + + except Exception as e: + messagebox.showwarning("警告", f"热量估算失败: {str(e)}") + total_calories = None + food_items = [{"name": food, "portion": qty} for food, qty in zip(foods, quantities)] + + meal_data = { + 'date': self.meal_date_var.get(), + 'meal_type': self.meal_type_var.get(), + 'foods': foods, + 'quantities': quantities, + 'calories': total_calories, + 'satisfaction_score': self.satisfaction_var.get(), + 'food_items': food_items + } + + try: + # 通过应用核心调用数据收集模块 + if self.app_core and self.app_core.module_manager: + result = self.app_core.process_user_request( + ModuleType.DATA_COLLECTION, + {'type': 'meal_record', 'meal_data': meal_data}, + self.current_user_id + ) + + if result and result.result.get('success'): + messagebox.showinfo("成功", "餐食记录保存成功") + # 清空表单 + self.foods_text.delete("1.0", "end") + self.quantities_text.delete("1.0", "end") + self.calories_display.configure(text="系统将自动估算") + else: + messagebox.showerror("错误", "餐食记录保存失败") + else: + messagebox.showerror("错误", "应用核心未初始化") + except Exception as e: + messagebox.showerror("错误", f"保存失败: {str(e)}") + + def _save_feedback(self): + """保存反馈""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + recommended_text = self.recommended_foods_text.get("1.0", "end-1c") + recommended_foods = [food.strip() for food in recommended_text.split('\n') if food.strip()] + + feedback_data = { + 'recommended_foods': recommended_foods, + 'user_choice': self.user_choice_var.get(), + 'feedback_type': self.feedback_type_var.get() + } + + try: + # 通过应用核心调用数据收集模块 + if self.app_core and self.app_core.module_manager: + result = self.app_core.process_user_request( + ModuleType.DATA_COLLECTION, + {'type': 'feedback', 'feedback_data': feedback_data}, + self.current_user_id + ) + + if result and result.result.get('success'): + messagebox.showinfo("成功", "反馈保存成功") + else: + messagebox.showerror("错误", "反馈保存失败") + else: + messagebox.showerror("错误", "应用核心未初始化") + except Exception as e: + messagebox.showerror("错误", f"保存失败: {str(e)}") + + def _analyze_user_intent(self): + """分析用户意图""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + user_input = self.user_input_text.get("1.0", "end-1c").strip() + if not user_input: + messagebox.showwarning("警告", "请输入用户输入内容") + return + + self._update_status("正在分析用户意图...") + + def analyze_thread(): + try: + # 直接使用千问API + from llm_integration.qwen_client import analyze_user_intent_with_qwen + + # 获取用户数据 + user_data = self.app_core.get_user_data(self.current_user_id) + if not user_data: + self.root.after(0, lambda: self._update_status("用户数据不存在")) + return + + # 构建用户上下文 + user_context = { + 'name': user_data.profile.get('name', '未知'), + 'age': user_data.profile.get('age', '未知'), + 'gender': user_data.profile.get('gender', '未知'), + 'height': user_data.profile.get('height', '未知'), + 'weight': user_data.profile.get('weight', '未知'), + 'activity_level': user_data.profile.get('activity_level', '未知'), + 'taste_preferences': user_data.profile.get('taste_preferences', {}), + 'allergies': user_data.profile.get('allergies', []), + 'dislikes': user_data.profile.get('dislikes', []), + 'dietary_preferences': user_data.profile.get('dietary_preferences', []), + 'recent_meals': user_data.meals[-3:] if user_data.meals else [], + 'feedback_history': user_data.feedback[-5:] if user_data.feedback else [] + } + + result = analyze_user_intent_with_qwen(user_input, user_context) + if result: + self.root.after(0, lambda: self._display_intent_result(result)) + else: + self.root.after(0, lambda: self._update_status("分析失败")) + except Exception as e: + self.root.after(0, lambda: self._update_status(f"分析错误: {str(e)}")) + + threading.Thread(target=analyze_thread, daemon=True).start() + + def _display_intent_result(self, result: Dict): + """显示意图分析结果""" + self.intent_result_text.delete("1.0", "end") + + if result.get('success'): + content = f""" +用户意图: {result.get('user_intent', '未知')} +情绪状态: {result.get('emotional_state', '未知')} +营养需求: {', '.join(result.get('nutritional_needs', []))} +推荐食物: {', '.join(result.get('recommended_foods', []))} +推荐理由: {result.get('reasoning', '无')} +置信度: {result.get('confidence', 0):.2f} +""" + else: + content = f"分析失败: {result.get('error', '未知错误')}" + + self.intent_result_text.insert("1.0", content) + self._update_status("用户意图分析完成") + + def _analyze_nutrition(self): + """分析营养""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + # 获取最近的餐食数据 + user_data = self.app_core.get_user_data(self.current_user_id) + if not user_data or not user_data.meals: + messagebox.showwarning("警告", "没有餐食记录") + return + + latest_meal = user_data.meals[-1] + + self._update_status("正在分析营养...") + + def analyze_thread(): + try: + # 直接使用千问API + from llm_integration.qwen_client import analyze_nutrition_with_qwen + + # 获取用户数据 + user_data = self.app_core.get_user_data(self.current_user_id) + if not user_data: + self.root.after(0, lambda: self._update_status("用户数据不存在")) + return + + # 构建用户上下文 + user_context = { + 'age': user_data.profile.get('age', '未知'), + 'gender': user_data.profile.get('gender', '未知'), + 'height': user_data.profile.get('height', '未知'), + 'weight': user_data.profile.get('weight', '未知'), + 'activity_level': user_data.profile.get('activity_level', '未知'), + 'health_goals': user_data.profile.get('health_goals', []) + } + + result = analyze_nutrition_with_qwen(latest_meal, user_context) + if result: + self.root.after(0, lambda: self._display_nutrition_result(result)) + else: + self.root.after(0, lambda: self._update_status("营养分析失败")) + except Exception as e: + self.root.after(0, lambda: self._update_status(f"营养分析错误: {str(e)}")) + + threading.Thread(target=analyze_thread, daemon=True).start() + + def _display_nutrition_result(self, result: Dict): + """显示营养分析结果""" + self.nutrition_result_text.delete("1.0", "end") + + if result.get('success'): + content = f""" +营养均衡性: {result.get('nutrition_balance', '未知')} +热量评估: {result.get('calorie_assessment', '未知')} +缺少营养素: {', '.join(result.get('missing_nutrients', []))} +改进建议: {', '.join(result.get('improvements', []))} +个性化建议: {', '.join(result.get('recommendations', []))} +置信度: {result.get('confidence', 0):.2f} +""" + else: + content = f"分析失败: {result.get('error', '未知错误')}" + + self.nutrition_result_text.insert("1.0", content) + self._update_status("营养分析完成") + + def _generate_recommendations(self): + """生成推荐""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + meal_type = self.recommendation_meal_type_var.get() + preferences = {'taste': self.taste_preference_var.get()} + + self._update_status("正在生成推荐...") + + def recommend_thread(): + try: + # 通过应用核心调用推荐引擎 + if self.app_core and self.app_core.module_manager: + result = self.app_core.process_user_request( + ModuleType.RECOMMENDATION, + {'type': 'meal_recommendation', 'meal_type': meal_type, 'preferences': preferences}, + self.current_user_id + ) + + if result and result.result: + self.root.after(0, lambda: self._display_recommendation_result(result.result)) + else: + self.root.after(0, lambda: self._update_status("推荐生成失败")) + else: + self.root.after(0, lambda: self._update_status("应用核心未初始化")) + except Exception as e: + self.root.after(0, lambda: self._update_status(f"推荐生成错误: {str(e)}")) + + threading.Thread(target=recommend_thread, daemon=True).start() + + def _display_recommendation_result(self, result: Dict): + """显示推荐结果""" + self.recommendation_result_text.delete("1.0", "end") + + if result.get('success'): + recommendations = result.get('recommendations', []) + content = f"推荐理由: {result.get('reasoning', '无')}\n\n" + content += f"置信度: {result.get('confidence', 0):.2f}\n\n" + content += "推荐餐食搭配:\n\n" + + for i, combo in enumerate(recommendations, 1): + content += f"{i}. {combo.get('name', '搭配')}\n" + content += f" 描述: {combo.get('description', '')}\n" + content += f" 食物: {', '.join([f['name'] for f in combo.get('foods', [])])}\n" + content += f" 总热量: {combo.get('total_calories', 0):.0f}卡路里\n" + content += f" 个性化得分: {combo.get('personalization_score', 0):.2f}\n" + content += f" 营养得分: {combo.get('nutrition_score', 0):.2f}\n" + content += f" 来源: {combo.get('source', 'unknown')}\n\n" + else: + content = f"推荐失败: {result.get('error', '未知错误')}" + + self.recommendation_result_text.insert("1.0", content) + self._update_status("推荐生成完成") + + def _refresh_profile_info(self): + """刷新个人信息""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + user_data = self.app_core.get_user_data(self.current_user_id) + if user_data: + self._display_profile_info(user_data) + self._display_stats_info(user_data) + else: + messagebox.showerror("错误", "无法获取用户信息") + + def _display_profile_info(self, user_data: UserData): + """显示个人信息""" + self.profile_info_text.delete("1.0", "end") + + profile = user_data.profile + content = f""" +用户ID: {user_data.user_id} +姓名: {profile.get('name', '未设置')} +年龄: {profile.get('age', '未设置')} +性别: {profile.get('gender', '未设置')} +身高: {profile.get('height', '未设置')}cm +体重: {profile.get('weight', '未设置')}kg +活动水平: {profile.get('activity_level', '未设置')} +口味偏好: {json.dumps(profile.get('taste_preferences', {}), ensure_ascii=False)} +过敏食物: {', '.join(profile.get('allergies', []))} +不喜欢的食物: {', '.join(profile.get('dislikes', []))} +健康目标: {', '.join(profile.get('health_goals', []))} +创建时间: {user_data.created_at} +更新时间: {user_data.updated_at} +""" + + self.profile_info_text.insert("1.0", content) + + def _display_stats_info(self, user_data: UserData): + """显示统计信息""" + self.stats_text.delete("1.0", "end") + + meal_count = len(user_data.meals) + feedback_count = len(user_data.feedback) + + # 计算平均满意度 + satisfaction_scores = [meal.get('satisfaction_score', 0) for meal in user_data.meals if meal.get('satisfaction_score')] + avg_satisfaction = sum(satisfaction_scores) / len(satisfaction_scores) if satisfaction_scores else 0 + + content = f""" +数据统计: +- 餐食记录数: {meal_count} +- 反馈记录数: {feedback_count} +- 平均满意度: {avg_satisfaction:.2f} + +最近餐食: +""" + + for meal in user_data.meals[-5:]: # 显示最近5餐 + content += f"- {meal.get('date', '')} {meal.get('meal_type', '')}: {', '.join(meal.get('foods', []))}\n" + + self.stats_text.insert("1.0", content) + + def set_current_user(self, user_id: str, user_data: UserData): + """设置当前用户""" + self.current_user_id = user_id + self.current_user_data = user_data + + # 更新用户信息显示 + self.user_label.configure(text=f"用户: {user_data.profile.get('name', user_id)}") + self.login_button.configure(text="切换用户") + + # 刷新个人信息 + self._refresh_profile_info() + + def destroy(self): + """销毁窗口""" + if hasattr(self, 'root'): + self.root.destroy() + + def _show_quick_input_dialog(self): + """显示快速录入对话框""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + try: + from gui.quick_user_input import show_quick_user_input_dialog + show_quick_user_input_dialog(self.root, self.current_user_id) + except Exception as e: + messagebox.showerror("错误", f"打开快速录入失败: {str(e)}") + + def _show_smart_meal_record(self): + """显示智能餐食记录对话框""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + try: + from gui.smart_meal_record import show_smart_meal_record_dialog + show_smart_meal_record_dialog(self.root, self.current_user_id, self.meal_type_var.get()) + except Exception as e: + messagebox.showerror("错误", f"打开智能记录失败: {str(e)}") + + +class LoginDialog: + """登录对话框""" + + def __init__(self, parent, main_window): + self.main_window = main_window + + # 创建对话框 + self.dialog = ctk.CTkToplevel(parent) + self.dialog.title("用户登录/注册") + self.dialog.geometry("400x300") + self.dialog.transient(parent) + self.dialog.grab_set() + + # 居中显示 + self.dialog.geometry("+%d+%d" % (parent.winfo_rootx() + 50, parent.winfo_rooty() + 50)) + + self._create_widgets() + + def _create_widgets(self): + """创建对话框组件""" + # 标题 + title_label = ctk.CTkLabel( + self.dialog, + text="用户登录/注册", + font=ctk.CTkFont(size=20, weight="bold") + ) + title_label.pack(pady=20) + + # 用户ID输入 + user_id_label = ctk.CTkLabel(self.dialog, text="用户ID:") + user_id_label.pack(pady=5) + + self.user_id_var = tk.StringVar() + user_id_entry = ctk.CTkEntry(self.dialog, textvariable=self.user_id_var, width=250) + user_id_entry.pack(pady=5) + + # 用户名输入 + name_label = ctk.CTkLabel(self.dialog, text="姓名:") + name_label.pack(pady=5) + + self.name_var = tk.StringVar() + name_entry = ctk.CTkEntry(self.dialog, textvariable=self.name_var, width=250) + name_entry.pack(pady=5) + + # 按钮框架 + button_frame = ctk.CTkFrame(self.dialog) + button_frame.pack(pady=20) + + # 登录按钮 + login_button = ctk.CTkButton( + button_frame, + text="登录/注册", + command=self._login, + width=100 + ) + login_button.pack(side="left", padx=10) + + # 取消按钮 + cancel_button = ctk.CTkButton( + button_frame, + text="取消", + command=self._cancel, + width=100 + ) + cancel_button.pack(side="left", padx=10) + + def _login(self): + """登录处理""" + user_id = self.user_id_var.get().strip() + name = self.name_var.get().strip() + + if not user_id: + messagebox.showwarning("警告", "请输入用户ID") + return + + if not name: + messagebox.showwarning("警告", "请输入姓名") + return + + try: + # 创建或获取用户数据 + user_data = self.main_window.app_core.get_user_data(user_id) + + if not user_data: + # 创建新用户 + initial_data = { + 'profile': { + 'name': name, + 'age': 25, + 'gender': '女', + 'height': 165, + 'weight': 55, + 'activity_level': 'moderate' + }, + 'preferences': {} + } + + if self.main_window.app_core.create_user(user_id, initial_data): + user_data = self.main_window.app_core.get_user_data(user_id) + messagebox.showinfo("成功", "新用户创建成功") + else: + messagebox.showerror("错误", "用户创建失败") + return + + # 设置当前用户 + self.main_window.set_current_user(user_id, user_data) + + # 关闭对话框 + self.dialog.destroy() + + except Exception as e: + messagebox.showerror("错误", f"登录失败: {str(e)}") + + def _cancel(self): + """取消登录""" + self.dialog.destroy() + + +if __name__ == "__main__": + # 测试GUI + root = tk.Tk() + app = MainWindow(root, None) + root.mainloop() diff --git a/gui/mobile_main_window.py b/gui/mobile_main_window.py new file mode 100644 index 0000000..6dddd5a --- /dev/null +++ b/gui/mobile_main_window.py @@ -0,0 +1,1359 @@ +""" +移动端界面设计 - 小程序/安卓App尺寸 +适配手机屏幕的饮食推荐应用界面 +""" + +import customtkinter as ctk +import tkinter as tk +from tkinter import messagebox +import json +import threading +from typing import Dict, List, Optional, Any +from core.base import AppCore, UserData, ModuleType +from gui.styles import StyleConfig, apply_rounded_theme, create_card_frame, create_accent_button, create_rounded_entry, create_rounded_label + +class MobileMainWindow: + """移动端主窗口 - 模拟小程序/安卓App界面""" + + def __init__(self, app_core=None): + # 移动端尺寸设置 + self.width = 375 # iPhone标准宽度 + self.height = 812 # iPhone标准高度 + + # 创建主窗口 + self.root = ctk.CTk() + self.root.title("饮食推荐助手") + self.root.geometry(f"{self.width}x{self.height}") + self.root.resizable(False, False) + + # 应用核心 + self.app_core = app_core + self.current_user_id = None + self.current_user_data = None + + # 当前页面 + self.current_page = "home" + + # 应用圆角主题 + apply_rounded_theme() + + # 创建界面 + self._create_mobile_ui() + + # 初始化应用 + self._initialize_app() + + def _create_mobile_ui(self): + """创建移动端界面""" + # 主容器 - 增加圆角和内边距 + self.main_container = ctk.CTkFrame( + self.root, + corner_radius=20, + fg_color=("#f8f9fa", "#1e1e1e") + ) + self.main_container.pack(fill="both", expand=True, padx=5, pady=5) + + # 状态栏(模拟手机状态栏) + self._create_status_bar() + + # 页面容器 - 增加圆角和阴影效果 + self.page_container = ctk.CTkFrame( + self.main_container, + corner_radius=25, + fg_color=("#ffffff", "#2b2b2b"), + border_width=1, + border_color=("#e0e0e0", "#404040") + ) + self.page_container.pack(fill="both", expand=True, padx=15, pady=15) + + # 底部导航栏 + self._create_bottom_navigation() + + # 创建各个页面 + self._create_home_page() + self._create_record_page() + self._create_recommend_page() + self._create_profile_page() + + # 默认显示首页 + self._show_page("home") + + def _create_status_bar(self): + """创建状态栏""" + status_frame = ctk.CTkFrame( + self.main_container, + height=35, + corner_radius=15, + fg_color=("transparent", "transparent") + ) + status_frame.pack(fill="x", padx=10, pady=(5, 0)) + status_frame.pack_propagate(False) + + # 时间显示 + self.time_label = ctk.CTkLabel( + status_frame, + text="12:34", + font=("Arial", 13, "bold"), + text_color=("#333333", "#ffffff") + ) + self.time_label.pack(side="left", padx=15, pady=8) + + # 信号和电池图标(模拟) + signal_label = ctk.CTkLabel( + status_frame, + text="📶", + font=("Arial", 12), + text_color=("#333333", "#ffffff") + ) + signal_label.pack(side="right", padx=8, pady=8) + + battery_label = ctk.CTkLabel( + status_frame, + text="🔋", + font=("Arial", 12), + text_color=("#333333", "#ffffff") + ) + battery_label.pack(side="right", padx=8, pady=8) + + def _create_bottom_navigation(self): + """创建底部导航栏""" + nav_frame = ctk.CTkFrame( + self.main_container, + height=70, + corner_radius=20, + fg_color=("#ffffff", "#2b2b2b"), + border_width=1, + border_color=("#e0e0e0", "#404040") + ) + nav_frame.pack(fill="x", side="bottom", padx=10, pady=(0, 10)) + nav_frame.pack_propagate(False) + + # 导航按钮 + nav_buttons = [ + ("🏠", "home", "首页"), + ("📝", "record", "记录"), + ("🎯", "recommend", "推荐"), + ("👤", "profile", "我的") + ] + + for icon, page, text in nav_buttons: + btn = ctk.CTkButton( + nav_frame, + text=f"{icon}\n{text}", + font=("Arial", 10), + height=55, + width=75, + corner_radius=15, + fg_color=("transparent", "transparent"), + hover_color=("#f0f0f0", "#404040"), + command=lambda p=page: self._show_page(p) + ) + btn.pack(side="left", padx=8, pady=8, expand=True, fill="x") + + def _create_home_page(self): + """创建首页""" + self.home_frame = ctk.CTkFrame( + self.page_container, + corner_radius=20, + fg_color=("transparent", "transparent") + ) + + # 欢迎区域 + welcome_frame = ctk.CTkFrame( + self.home_frame, + corner_radius=25, + fg_color=("#f8f9fa", "#2b2b2b"), + border_width=1, + border_color=("#e0e0e0", "#404040") + ) + welcome_frame.pack(fill="x", padx=20, pady=(20, 15)) + + welcome_label = ctk.CTkLabel( + welcome_frame, + text="🍽️ 饮食推荐助手", + font=("Arial", 22, "bold"), + text_color=("#2c3e50", "#ecf0f1") + ) + welcome_label.pack(pady=15) + + # 用户信息卡片 + self.user_card = ctk.CTkFrame( + self.home_frame, + corner_radius=20, + fg_color=("#ffffff", "#3b3b3b"), + border_width=1, + border_color=("#e0e0e0", "#404040") + ) + self.user_card.pack(fill="x", padx=20, pady=10) + + self.user_info_label = ctk.CTkLabel( + self.user_card, + text="请先登录", + font=("Arial", 16), + text_color=("#34495e", "#bdc3c7") + ) + self.user_info_label.pack(pady=15) + + # 快速操作按钮 + quick_actions_frame = ctk.CTkFrame( + self.home_frame, + corner_radius=20, + fg_color=("#f8f9fa", "#2b2b2b"), + border_width=1, + border_color=("#e0e0e0", "#404040") + ) + quick_actions_frame.pack(fill="x", padx=20, pady=15) + + # 记录餐食按钮 + record_btn = ctk.CTkButton( + quick_actions_frame, + text="📝 记录餐食", + font=("Arial", 15, "bold"), + height=55, + corner_radius=15, + fg_color=("#3498db", "#2980b9"), + hover_color=("#2980b9", "#1f618d"), + text_color=("#ffffff", "#ffffff"), + command=self._quick_record_meal + ) + record_btn.pack(fill="x", padx=15, pady=(15, 8)) + + # 获取推荐按钮 + recommend_btn = ctk.CTkButton( + quick_actions_frame, + text="🎯 获取推荐", + font=("Arial", 15, "bold"), + height=55, + corner_radius=15, + fg_color=("#e74c3c", "#c0392b"), + hover_color=("#c0392b", "#a93226"), + text_color=("#ffffff", "#ffffff"), + command=self._quick_get_recommendation + ) + recommend_btn.pack(fill="x", padx=15, pady=(8, 15)) + + # 今日统计 + stats_frame = ctk.CTkFrame( + self.home_frame, + corner_radius=20, + fg_color=("#ffffff", "#3b3b3b"), + border_width=1, + border_color=("#e0e0e0", "#404040") + ) + stats_frame.pack(fill="x", padx=20, pady=15) + + stats_label = ctk.CTkLabel( + stats_frame, + text="📊 今日统计", + font=("Arial", 16, "bold") + ) + stats_label.pack(pady=5) + + self.stats_text = ctk.CTkTextbox(stats_frame, height=100) + self.stats_text.pack(fill="x", padx=10, pady=5) + + def _create_record_page(self): + """创建记录页面""" + self.record_frame = ctk.CTkFrame( + self.page_container, + corner_radius=20, + fg_color=("transparent", "transparent") + ) + + # 页面标题 + title_label = ctk.CTkLabel( + self.record_frame, + text="📝 记录餐食", + font=("Arial", 20, "bold"), + text_color=("#2c3e50", "#ecf0f1") + ) + title_label.pack(pady=(20, 15)) + + # 餐次选择 + meal_type_frame = ctk.CTkFrame( + self.record_frame, + corner_radius=15, + fg_color=("#ffffff", "#3b3b3b"), + border_width=1, + border_color=("#e0e0e0", "#404040") + ) + meal_type_frame.pack(fill="x", padx=20, pady=10) + + ctk.CTkLabel( + meal_type_frame, + text="餐次:", + font=("Arial", 15), + text_color=("#34495e", "#bdc3c7") + ).pack(side="left", padx=15, pady=12) + + self.meal_type_var = ctk.StringVar(value="breakfast") + meal_type_menu = ctk.CTkOptionMenu( + meal_type_frame, + variable=self.meal_type_var, + values=["breakfast", "lunch", "dinner", "snack"], + width=130, + corner_radius=10, + fg_color=("#3498db", "#2980b9"), + button_color=("#2980b9", "#1f618d"), + button_hover_color=("#1f618d", "#154360") + ) + meal_type_menu.pack(side="right", padx=15, pady=8) + + # 食物输入 + food_frame = ctk.CTkFrame( + self.record_frame, + corner_radius=15, + fg_color=("#ffffff", "#3b3b3b"), + border_width=1, + border_color=("#e0e0e0", "#404040") + ) + food_frame.pack(fill="x", padx=20, pady=10) + + ctk.CTkLabel( + food_frame, + text="食物:", + font=("Arial", 15), + text_color=("#34495e", "#bdc3c7") + ).pack(anchor="w", padx=15, pady=(12, 5)) + + # 食物输入框和转盘按钮 + food_input_frame = ctk.CTkFrame( + food_frame, + corner_radius=10, + fg_color=("transparent", "transparent") + ) + food_input_frame.pack(fill="x", padx=15, pady=(5, 12)) + + self.food_entry = ctk.CTkEntry( + food_input_frame, + placeholder_text="输入食物名称", + corner_radius=12, + height=40, + font=("Arial", 14), + fg_color=("#f8f9fa", "#404040"), + border_width=1, + border_color=("#e0e0e0", "#555555") + ) + self.food_entry.pack(side="left", fill="x", expand=True, padx=(0, 8)) + + # 转盘按钮和OCR按钮 + button_frame = ctk.CTkFrame( + food_input_frame, + corner_radius=10, + fg_color=("transparent", "transparent") + ) + button_frame.pack(side="right") + + roulette_btn = ctk.CTkButton( + button_frame, + text="🎲", + width=40, + height=40, + corner_radius=12, + fg_color=("#f39c12", "#e67e22"), + hover_color=("#e67e22", "#d35400"), + command=self._show_food_roulette + ) + roulette_btn.pack(side="left", padx=(0, 4)) + + ocr_btn = ctk.CTkButton( + button_frame, + text="📷", + width=40, + height=40, + corner_radius=12, + fg_color=("#9b59b6", "#8e44ad"), + hover_color=("#8e44ad", "#7d3c98"), + command=self._show_ocr_recognition + ) + ocr_btn.pack(side="right", padx=(4, 0)) + + # 分量输入 + quantity_frame = ctk.CTkFrame(self.record_frame) + quantity_frame.pack(fill="x", padx=15, pady=10) + + ctk.CTkLabel(quantity_frame, text="分量:", font=("Arial", 14)).pack(anchor="w", padx=10, pady=5) + self.quantity_entry = ctk.CTkEntry(quantity_frame, placeholder_text="如:1碗、200g") + self.quantity_entry.pack(fill="x", padx=10, pady=5) + + # 热量显示 + calorie_frame = ctk.CTkFrame(self.record_frame) + calorie_frame.pack(fill="x", padx=15, pady=10) + + ctk.CTkLabel(calorie_frame, text="热量:", font=("Arial", 14)).pack(anchor="w", padx=10, pady=5) + self.calorie_display = ctk.CTkLabel(calorie_frame, text="0 卡路里", font=("Arial", 16, "bold")) + self.calorie_display.pack(anchor="w", padx=10, pady=5) + + # 满意度评分 + satisfaction_frame = ctk.CTkFrame(self.record_frame) + satisfaction_frame.pack(fill="x", padx=15, pady=10) + + ctk.CTkLabel(satisfaction_frame, text="满意度:", font=("Arial", 14)).pack(anchor="w", padx=10, pady=5) + + self.satisfaction_var = ctk.IntVar(value=4) + satisfaction_slider = ctk.CTkSlider( + satisfaction_frame, + from_=1, + to=5, + number_of_steps=4, + variable=self.satisfaction_var + ) + satisfaction_slider.pack(fill="x", padx=10, pady=5) + + satisfaction_label = ctk.CTkLabel(satisfaction_frame, text="4分") + satisfaction_label.pack() + + # 保存按钮 + save_btn = ctk.CTkButton( + self.record_frame, + text="💾 保存记录", + font=("Arial", 14, "bold"), + height=50, + command=self._save_meal_record + ) + save_btn.pack(fill="x", padx=15, pady=15) + + # 绑定食物输入变化事件 + self.food_entry.bind("", self._on_food_input_change) + self.quantity_entry.bind("", self._on_food_input_change) + + def _show_ocr_recognition(self): + """显示OCR识别界面""" + try: + # 创建OCR识别窗口 + ocr_window = ctk.CTkToplevel(self.root) + ocr_window.title("📷 OCR热量识别") + ocr_window.geometry("400x500") + ocr_window.resizable(False, False) + + # 居中显示 + ocr_window.transient(self.root) + ocr_window.grab_set() + + # 创建OCR界面 + from gui.ocr_calorie_gui import OCRCalorieGUI + ocr_gui = OCRCalorieGUI(ocr_window, self.app_core) + + except Exception as e: + messagebox.showerror("错误", f"打开OCR识别界面失败: {str(e)}") + + def _create_recommend_page(self): + """创建推荐页面""" + self.recommend_frame = ctk.CTkFrame(self.page_container) + + # 页面标题 + title_label = ctk.CTkLabel( + self.recommend_frame, + text="🎯 个性化推荐", + font=("Arial", 18, "bold") + ) + title_label.pack(pady=15) + + # 推荐设置 + settings_frame = ctk.CTkFrame(self.recommend_frame) + settings_frame.pack(fill="x", padx=15, pady=10) + + # 餐次选择 + meal_type_row = ctk.CTkFrame(settings_frame) + meal_type_row.pack(fill="x", padx=10, pady=5) + + ctk.CTkLabel(meal_type_row, text="餐次:", font=("Arial", 14)).pack(side="left") + + self.rec_meal_type_var = ctk.StringVar(value="lunch") + rec_meal_type_menu = ctk.CTkOptionMenu( + meal_type_row, + variable=self.rec_meal_type_var, + values=["breakfast", "lunch", "dinner", "snack"], + width=120 + ) + rec_meal_type_menu.pack(side="right") + + # 口味偏好 + taste_row = ctk.CTkFrame(settings_frame) + taste_row.pack(fill="x", padx=10, pady=5) + + ctk.CTkLabel(taste_row, text="口味:", font=("Arial", 14)).pack(side="left") + + self.taste_var = ctk.StringVar(value="balanced") + taste_menu = ctk.CTkOptionMenu( + taste_row, + variable=self.taste_var, + values=["balanced", "sweet", "salty", "spicy", "sour"], + width=120 + ) + taste_menu.pack(side="right") + + # 生成推荐按钮 + generate_btn = ctk.CTkButton( + self.recommend_frame, + text="🎲 生成推荐", + font=("Arial", 14, "bold"), + height=50, + command=self._generate_recommendations + ) + generate_btn.pack(fill="x", padx=15, pady=15) + + # 推荐结果 + result_frame = ctk.CTkFrame(self.recommend_frame) + result_frame.pack(fill="both", expand=True, padx=15, pady=10) + + self.recommendation_text = ctk.CTkTextbox(result_frame, height=300) + self.recommendation_text.pack(fill="both", expand=True, padx=10, pady=10) + + def _create_profile_page(self): + """创建个人中心页面""" + self.profile_frame = ctk.CTkFrame(self.page_container) + + # 页面标题 + title_label = ctk.CTkLabel( + self.profile_frame, + text="👤 个人中心", + font=("Arial", 18, "bold") + ) + title_label.pack(pady=15) + + # 用户信息卡片 + user_info_frame = ctk.CTkFrame(self.profile_frame) + user_info_frame.pack(fill="x", padx=15, pady=10) + + self.profile_user_label = ctk.CTkLabel( + user_info_frame, + text="请先登录", + font=("Arial", 16, "bold") + ) + self.profile_user_label.pack(pady=10) + + # 登录/注册按钮 + login_btn = ctk.CTkButton( + self.profile_frame, + text="🔑 登录/注册", + font=("Arial", 14, "bold"), + height=50, + command=self._show_login_dialog + ) + login_btn.pack(fill="x", padx=15, pady=10) + + # 功能菜单 + menu_frame = ctk.CTkFrame(self.profile_frame) + menu_frame.pack(fill="x", padx=15, pady=10) + + menu_items = [ + ("📊 数据统计", self._show_data_stats), + ("⚙️ 设置", self._show_settings), + ("❓ 帮助", self._show_help), + ("📞 联系我们", self._show_contact) + ] + + for text, command in menu_items: + btn = ctk.CTkButton( + menu_frame, + text=text, + font=("Arial", 14), + height=40, + command=command + ) + btn.pack(fill="x", pady=2) + + def _show_page(self, page_name: str): + """显示指定页面""" + # 隐藏所有页面 + for frame in [self.home_frame, self.record_frame, self.recommend_frame, self.profile_frame]: + frame.pack_forget() + + # 显示指定页面 + if page_name == "home": + self.home_frame.pack(fill="both", expand=True) + elif page_name == "record": + self.record_frame.pack(fill="both", expand=True) + elif page_name == "recommend": + self.recommend_frame.pack(fill="both", expand=True) + elif page_name == "profile": + self.profile_frame.pack(fill="both", expand=True) + + self.current_page = page_name + + def _initialize_app(self): + """初始化应用""" + if self.app_core: + self._update_status("应用核心已就绪") + else: + self._update_status("应用核心未初始化") + + def _update_status(self, message: str): + """更新状态信息""" + print(f"状态: {message}") + + def _quick_record_meal(self): + """快速记录餐食""" + self._show_page("record") + + def _quick_get_recommendation(self): + """快速获取推荐""" + self._show_page("recommend") + + def _save_meal_record(self): + """保存餐食记录""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + food = self.food_entry.get().strip() + quantity = self.quantity_entry.get().strip() + meal_type = self.meal_type_var.get() + satisfaction = self.satisfaction_var.get() + + if not food or not quantity: + messagebox.showwarning("警告", "请填写完整信息") + return + + try: + meal_data = { + 'meal_type': meal_type, + 'foods': [food], + 'quantities': [quantity], + 'satisfaction_score': satisfaction + } + + if self.app_core and self.app_core.module_manager: + result = self.app_core.process_user_request( + ModuleType.DATA_COLLECTION, + {'type': 'meal_record', 'meal_data': meal_data}, + self.current_user_id + ) + + if result and result.result.get('success'): + messagebox.showinfo("成功", "餐食记录保存成功") + self.food_entry.delete(0, "end") + self.quantity_entry.delete(0, "end") + + # 同步更新用户数据 + self._refresh_user_data() + + # 如果当前在首页,更新统计信息 + if self.current_page == "home": + self._update_stats() + + else: + messagebox.showerror("错误", "餐食记录保存失败") + else: + messagebox.showerror("错误", "应用核心未初始化") + + except Exception as e: + messagebox.showerror("错误", f"保存失败: {str(e)}") + + def _generate_recommendations(self): + """生成推荐""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + self.recommendation_text.delete("1.0", "end") + self.recommendation_text.insert("1.0", "正在生成推荐...") + + def recommend_thread(): + try: + meal_type = self.rec_meal_type_var.get() + preferences = {'taste': self.taste_var.get()} + + if self.app_core and self.app_core.module_manager: + result = self.app_core.process_user_request( + ModuleType.RECOMMENDATION, + { + 'type': 'meal_recommendation', + 'meal_type': meal_type, + 'preferences': preferences, + 'context': {} + }, + self.current_user_id + ) + + if result and result.result.get('success'): + recommendations = result.result.get('recommendations', []) + reasoning = result.result.get('reasoning', '无') + confidence = result.result.get('confidence', 0) + + content = f"推荐理由: {reasoning}\n\n" + content += f"置信度: {confidence:.2f}\n\n" + content += "推荐餐食搭配:\n\n" + + for i, combo in enumerate(recommendations, 1): + content += f"{i}. {combo.get('name', '搭配')}\n" + foods = [f['name'] for f in combo.get('foods', [])] + content += f" 食物: {', '.join(foods)}\n" + content += f" 热量: {combo.get('total_calories', 0):.0f}卡路里\n\n" + + self.root.after(0, lambda: self.recommendation_text.delete("1.0", "end")) + self.root.after(0, lambda: self.recommendation_text.insert("1.0", content)) + else: + error_msg = result.result.get('error', '未知错误') if result else '无结果' + self.root.after(0, lambda: self.recommendation_text.delete("1.0", "end")) + self.root.after(0, lambda: self.recommendation_text.insert("1.0", f"推荐失败: {error_msg}")) + else: + self.root.after(0, lambda: self.recommendation_text.delete("1.0", "end")) + self.root.after(0, lambda: self.recommendation_text.insert("1.0", "应用核心未初始化")) + + except Exception as e: + self.root.after(0, lambda: self.recommendation_text.delete("1.0", "end")) + self.root.after(0, lambda: self.recommendation_text.insert("1.0", f"推荐生成错误: {str(e)}")) + + threading.Thread(target=recommend_thread, daemon=True).start() + + def _show_login_dialog(self): + """显示登录对话框""" + dialog = MobileLoginDialog(self.root, self) + dialog.show() + + def _show_data_stats(self): + """显示数据统计""" + if not self.current_user_data: + messagebox.showwarning("警告", "请先登录") + return + + # 创建统计窗口 + stats_window = ctk.CTkToplevel(self.root) + stats_window.title("数据统计") + stats_window.geometry("350x500") + stats_window.resizable(False, False) + + # 主容器 + main_frame = ctk.CTkScrollableFrame(stats_window, width=320, height=450) + main_frame.pack(padx=10, pady=10, fill="both", expand=True) + + # 标题 + title_label = ctk.CTkLabel(main_frame, text="📊 数据统计", font=ctk.CTkFont(size=20, weight="bold")) + title_label.pack(pady=(0, 20)) + + # 基础统计 + basic_frame = ctk.CTkFrame(main_frame) + basic_frame.pack(fill="x", pady=(0, 10)) + + basic_title = ctk.CTkLabel(basic_frame, text="基础统计", font=ctk.CTkFont(size=16, weight="bold")) + basic_title.pack(pady=10) + + # 餐食记录统计 + meal_count = len(self.current_user_data.meals) + meal_label = ctk.CTkLabel(basic_frame, text=f"餐食记录: {meal_count}条") + meal_label.pack(pady=2) + + # 反馈记录统计 + feedback_count = len(self.current_user_data.feedback) + feedback_label = ctk.CTkLabel(basic_frame, text=f"反馈记录: {feedback_count}条") + feedback_label.pack(pady=2) + + # 满意度统计 + if self.current_user_data.meals: + satisfaction_scores = [meal.get('satisfaction_score', 0) for meal in self.current_user_data.meals if meal.get('satisfaction_score')] + if satisfaction_scores: + avg_satisfaction = sum(satisfaction_scores) / len(satisfaction_scores) + satisfaction_label = ctk.CTkLabel(basic_frame, text=f"平均满意度: {avg_satisfaction:.1f}分") + satisfaction_label.pack(pady=2) + + # 餐次分布统计 + meal_dist_frame = ctk.CTkFrame(main_frame) + meal_dist_frame.pack(fill="x", pady=(0, 10)) + + meal_dist_title = ctk.CTkLabel(meal_dist_frame, text="餐次分布", font=ctk.CTkFont(size=16, weight="bold")) + meal_dist_title.pack(pady=10) + + meal_types = {} + for meal in self.current_user_data.meals: + meal_type = meal.get('meal_type', 'unknown') + meal_types[meal_type] = meal_types.get(meal_type, 0) + 1 + + for meal_type, count in meal_types.items(): + type_label = ctk.CTkLabel(meal_dist_frame, text=f"{meal_type}: {count}次") + type_label.pack(pady=2) + + # 最近餐食 + recent_frame = ctk.CTkFrame(main_frame) + recent_frame.pack(fill="x", pady=(0, 10)) + + recent_title = ctk.CTkLabel(recent_frame, text="最近餐食", font=ctk.CTkFont(size=16, weight="bold")) + recent_title.pack(pady=10) + + recent_meals = sorted(self.current_user_data.meals, key=lambda x: x.get('date', ''), reverse=True)[:5] + for meal in recent_meals: + meal_text = f"{meal.get('date', '未知日期')} - {meal.get('meal_type', '未知餐次')}" + if meal.get('foods'): + meal_text += f" ({', '.join(meal['foods'])})" + meal_label = ctk.CTkLabel(recent_frame, text=meal_text, wraplength=300) + meal_label.pack(pady=2) + + # 关闭按钮 + close_btn = ctk.CTkButton(main_frame, text="关闭", command=stats_window.destroy) + close_btn.pack(pady=20) + + def _show_settings(self): + """显示设置""" + if not self.current_user_data: + messagebox.showwarning("警告", "请先登录") + return + + # 创建设置窗口 + settings_window = ctk.CTkToplevel(self.root) + settings_window.title("设置") + settings_window.geometry("350x400") + settings_window.resizable(False, False) + + # 主容器 + main_frame = ctk.CTkScrollableFrame(settings_window, width=320, height=350) + main_frame.pack(padx=10, pady=10, fill="both", expand=True) + + # 标题 + title_label = ctk.CTkLabel(main_frame, text="⚙️ 设置", font=ctk.CTkFont(size=20, weight="bold")) + title_label.pack(pady=(0, 20)) + + # 用户偏好设置 + pref_frame = ctk.CTkFrame(main_frame) + pref_frame.pack(fill="x", pady=(0, 10)) + + pref_title = ctk.CTkLabel(pref_frame, text="用户偏好", font=ctk.CTkFont(size=16, weight="bold")) + pref_title.pack(pady=10) + + # 口味偏好 + taste_label = ctk.CTkLabel(pref_frame, text="口味偏好:") + taste_label.pack(pady=(10, 5)) + + taste_var = ctk.StringVar(value="balanced") + taste_options = ["清淡", "适中", "重口味", "甜食", "咸食", "辣食"] + taste_menu = ctk.CTkOptionMenu(pref_frame, variable=taste_var, values=taste_options) + taste_menu.pack(pady=5) + + # 饮食目标 + goal_label = ctk.CTkLabel(pref_frame, text="饮食目标:") + goal_label.pack(pady=(10, 5)) + + goal_var = ctk.StringVar(value="maintain") + goal_options = ["维持体重", "减重", "增重", "增肌", "健康饮食"] + goal_menu = ctk.CTkOptionMenu(pref_frame, variable=goal_var, values=goal_options) + goal_menu.pack(pady=5) + + # 过敏食物 + allergy_label = ctk.CTkLabel(pref_frame, text="过敏食物:") + allergy_label.pack(pady=(10, 5)) + + allergy_entry = ctk.CTkEntry(pref_frame, placeholder_text="请输入过敏食物,用逗号分隔") + allergy_entry.pack(pady=5, fill="x") + + # 保存设置按钮 + def save_settings(): + try: + preferences = { + 'taste_preference': taste_var.get(), + 'diet_goal': goal_var.get(), + 'allergies': allergy_entry.get().strip() + } + + # 保存到用户数据 + if self.app_core and self.app_core.data_manager: + # 更新用户偏好 + self.current_user_data.preferences.update(preferences) + + # 保存到数据库 + self.app_core.data_manager.save_user_data(self.current_user_data) + + messagebox.showinfo("成功", "设置保存成功") + settings_window.destroy() + else: + messagebox.showerror("错误", "应用核心未初始化") + + except Exception as e: + messagebox.showerror("错误", f"保存失败: {str(e)}") + + save_btn = ctk.CTkButton(pref_frame, text="保存设置", command=save_settings) + save_btn.pack(pady=20) + + # 关闭按钮 + close_btn = ctk.CTkButton(main_frame, text="关闭", command=settings_window.destroy) + close_btn.pack(pady=10) + + def _show_help(self): + """显示帮助""" + # 创建帮助窗口 + help_window = ctk.CTkToplevel(self.root) + help_window.title("帮助") + help_window.geometry("350x500") + help_window.resizable(False, False) + + # 主容器 + main_frame = ctk.CTkScrollableFrame(help_window, width=320, height=450) + main_frame.pack(padx=10, pady=10, fill="both", expand=True) + + # 标题 + title_label = ctk.CTkLabel(main_frame, text="❓ 使用帮助", font=ctk.CTkFont(size=20, weight="bold")) + title_label.pack(pady=(0, 20)) + + # 功能介绍 + features_frame = ctk.CTkFrame(main_frame) + features_frame.pack(fill="x", pady=(0, 10)) + + features_title = ctk.CTkLabel(features_frame, text="功能介绍", font=ctk.CTkFont(size=16, weight="bold")) + features_title.pack(pady=10) + + features_text = """ +🏠 首页 +• 查看今日统计信息 +• 快速记录餐食 +• 获取个性化推荐 + +📝 记录 +• 记录餐食信息 +• 设置满意度评分 +• 自动计算热量 + +🎯 推荐 +• 个性化餐食推荐 +• 基于历史数据 +• 营养搭配建议 + +👤 个人中心 +• 查看详细统计 +• 设置个人偏好 +• 管理账户信息 + """ + + features_label = ctk.CTkLabel(features_frame, text=features_text, justify="left") + features_label.pack(pady=10) + + # 使用说明 + usage_frame = ctk.CTkFrame(main_frame) + usage_frame.pack(fill="x", pady=(0, 10)) + + usage_title = ctk.CTkLabel(usage_frame, text="使用说明", font=ctk.CTkFont(size=16, weight="bold")) + usage_title.pack(pady=10) + + usage_text = """ +1. 首次使用请先登录 +2. 在记录页面输入餐食信息 +3. 在推荐页面获取建议 +4. 定期查看统计了解饮食情况 +5. 在设置中调整个人偏好 + """ + + usage_label = ctk.CTkLabel(usage_frame, text=usage_text, justify="left") + usage_label.pack(pady=10) + + # 关闭按钮 + close_btn = ctk.CTkButton(main_frame, text="关闭", command=help_window.destroy) + close_btn.pack(pady=20) + + def _show_contact(self): + """显示联系我们""" + # 创建联系窗口 + contact_window = ctk.CTkToplevel(self.root) + contact_window.title("联系我们") + contact_window.geometry("350x300") + contact_window.resizable(False, False) + + # 主容器 + main_frame = ctk.CTkFrame(contact_window) + main_frame.pack(padx=20, pady=20, fill="both", expand=True) + + # 标题 + title_label = ctk.CTkLabel(main_frame, text="📞 联系我们", font=ctk.CTkFont(size=20, weight="bold")) + title_label.pack(pady=(0, 30)) + + # 联系方式 + contact_info = """ +📧 邮箱支持 +support@dietapp.com + +📱 客服电话 +400-123-4567 +工作时间:9:00-18:00 + +💬 在线客服 +微信:DietApp_Support + +🌐 官方网站 +www.dietapp.com + +📝 意见反馈 +feedback@dietapp.com + """ + + contact_label = ctk.CTkLabel(main_frame, text=contact_info, justify="left") + contact_label.pack(pady=20) + + # 关闭按钮 + close_btn = ctk.CTkButton(main_frame, text="关闭", command=contact_window.destroy) + close_btn.pack(pady=20) + + def set_current_user(self, user_id: str, user_data: UserData): + """设置当前用户""" + self.current_user_id = user_id + self.current_user_data = user_data + + # 更新用户信息显示 + profile = user_data.profile + user_info = f"👤 {profile.get('name', '未知用户')}\n" + user_info += f"📊 餐食记录: {len(user_data.meals)}条\n" + user_info += f"💬 反馈记录: {len(user_data.feedback)}条" + + self.user_info_label.configure(text=user_info) + self.profile_user_label.configure(text=f"欢迎,{profile.get('name', '用户')}!") + + # 更新统计信息 + self._update_stats() + + def _refresh_user_data(self): + """刷新用户数据""" + if self.current_user_id and self.app_core: + try: + self.current_user_data = self.app_core.data_manager.get_user_data(self.current_user_id) + self._update_status("用户数据已刷新") + except Exception as e: + self._update_status(f"数据刷新失败: {e}") + + def _on_food_input_change(self, event=None): + """食物输入变化时更新热量""" + food = self.food_entry.get().strip() + quantity = self.quantity_entry.get().strip() + + if food and quantity and self.app_core: + try: + # 使用AI分析获取热量 + result = self.app_core.process_user_request( + ModuleType.USER_ANALYSIS, + {'type': 'calorie_estimation', 'food_data': {'food_name': food, 'quantity': quantity}}, + self.current_user_id or "test" + ) + + if result and result.result.get('success'): + calories = result.result.get('calories', 0) + self.calorie_display.configure(text=f"{calories:.0f} 卡路里") + else: + self.calorie_display.configure(text="热量计算中...") + + except Exception as e: + self.calorie_display.configure(text="热量计算失败") + + def _save_meal_record(self): + """保存餐食记录""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + food = self.food_entry.get().strip() + quantity = self.quantity_entry.get().strip() + meal_type = self.meal_type_var.get() + satisfaction = self.satisfaction_var.get() + + if not food or not quantity: + messagebox.showwarning("警告", "请填写完整信息") + return + + try: + meal_data = { + 'meal_type': meal_type, + 'foods': [food], + 'quantities': [quantity], + 'satisfaction_score': satisfaction + } + + if self.app_core and self.app_core.module_manager: + result = self.app_core.process_user_request( + ModuleType.DATA_COLLECTION, + {'type': 'meal_record', 'meal_data': meal_data}, + self.current_user_id + ) + + if result and result.result.get('success'): + messagebox.showinfo("成功", "餐食记录保存成功") + self.food_entry.delete(0, "end") + self.quantity_entry.delete(0, "end") + + # 同步更新用户数据 + self._refresh_user_data() + + # 如果当前在首页,更新统计信息 + if self.current_page == "home": + self._update_stats() + + else: + messagebox.showerror("错误", "餐食记录保存失败") + else: + messagebox.showerror("错误", "应用核心未初始化") + + except Exception as e: + messagebox.showerror("错误", f"保存失败: {str(e)}") + + def _show_food_roulette(self): + """显示食物转盘""" + # 创建转盘窗口 + roulette_window = ctk.CTkToplevel(self.root) + roulette_window.title("食物转盘") + roulette_window.geometry("300x400") + roulette_window.resizable(False, False) + + # 主容器 + main_frame = ctk.CTkFrame(roulette_window) + main_frame.pack(padx=20, pady=20, fill="both", expand=True) + + # 标题 + title_label = ctk.CTkLabel(main_frame, text="🎲 食物转盘", font=ctk.CTkFont(size=20, weight="bold")) + title_label.pack(pady=(0, 20)) + + # 转盘显示区域 + roulette_frame = ctk.CTkFrame(main_frame) + roulette_frame.pack(fill="x", pady=20) + + self.roulette_display = ctk.CTkLabel(roulette_frame, text="点击开始转盘", font=ctk.CTkFont(size=16)) + self.roulette_display.pack(pady=20) + + # 食物列表 + food_list = [ + "米饭", "面条", "包子", "饺子", "馒头", "面包", + "鸡蛋", "牛奶", "豆浆", "酸奶", "苹果", "香蕉", + "鸡肉", "牛肉", "猪肉", "鱼肉", "豆腐", "青菜", + "西红柿", "黄瓜", "胡萝卜", "土豆", "红薯", "玉米" + ] + + # 转盘按钮 + def spin_roulette(): + import random + import time + + self.roulette_display.configure(text="转盘中...") + roulette_window.update() + + # 模拟转盘效果 + for _ in range(10): + random_food = random.choice(food_list) + self.roulette_display.configure(text=f"🎯 {random_food}") + roulette_window.update() + time.sleep(0.1) + + # 最终结果 + final_food = random.choice(food_list) + self.roulette_display.configure(text=f"🎉 {final_food}") + + # 自动填入食物输入框 + self.food_entry.delete(0, "end") + self.food_entry.insert(0, final_food) + + # 触发热量计算 + self._on_food_input_change() + + spin_btn = ctk.CTkButton(main_frame, text="🎲 开始转盘", command=spin_roulette, height=40) + spin_btn.pack(pady=20) + + # 关闭按钮 + close_btn = ctk.CTkButton(main_frame, text="关闭", command=roulette_window.destroy) + close_btn.pack(pady=10) + + def _update_stats(self): + """更新统计信息""" + if not self.current_user_data: + return + + stats = f"📊 今日统计\n\n" + stats += f"餐食记录: {len(self.current_user_data.meals)}条\n" + stats += f"反馈记录: {len(self.current_user_data.feedback)}条\n" + + # 计算平均满意度 + if self.current_user_data.meals: + satisfaction_scores = [meal.get('satisfaction_score', 0) for meal in self.current_user_data.meals if meal.get('satisfaction_score')] + if satisfaction_scores: + avg_satisfaction = sum(satisfaction_scores) / len(satisfaction_scores) + stats += f"平均满意度: {avg_satisfaction:.1f}分\n" + + self.stats_text.delete("1.0", "end") + self.stats_text.insert("1.0", stats) + + def _generate_recommendations(self): + """生成推荐""" + if not self.current_user_id: + messagebox.showwarning("警告", "请先登录") + return + + try: + input_data = { + 'meal_type': self.rec_meal_type_var.get(), + 'preferences': { + 'taste': self.taste_var.get(), + 'health_goal': 'maintain' + }, + 'context': { + 'time': '12:00', + 'weather': 'sunny' + } + } + + if self.app_core and self.app_core.module_manager: + result = self.app_core.process_user_request( + ModuleType.RECOMMENDATION, + {'type': 'meal_recommendation', 'input_data': input_data}, + self.current_user_id + ) + + if result and result.result.get('success'): + recommendations = result.result.get('recommendations', []) + reasoning = result.result.get('reasoning', '无') + confidence = result.result.get('confidence', 0) + + # 显示推荐结果 + self.recommendation_text.delete("1.0", "end") + content = f"推荐理由: {reasoning}\n\n" + content += f"置信度: {confidence:.2f}\n\n" + content += "推荐餐食搭配:\n\n" + + for i, combo in enumerate(recommendations[:3], 1): + content += f"{i}. {combo.get('name', '搭配')}\n" + content += f" 食物: {', '.join([f['name'] for f in combo.get('foods', [])])}\n" + content += f" 总热量: {combo.get('total_calories', 0):.0f}卡路里\n" + content += f" 营养得分: {combo.get('nutrition_score', 0):.2f}\n\n" + + self.recommendation_text.insert("1.0", content) + else: + self.recommendation_text.delete("1.0", "end") + self.recommendation_text.insert("1.0", f"推荐失败: {result.result.get('error', '未知错误') if result else '无结果'}") + else: + messagebox.showerror("错误", "应用核心未初始化") + + except Exception as e: + messagebox.showerror("错误", f"推荐生成失败: {str(e)}") + + def _quick_record_meal(self): + """快速记录餐食""" + self._show_page("record") + + def _quick_get_recommendation(self): + """快速获取推荐""" + self._show_page("recommend") + + def run(self): + """运行应用""" + self.root.mainloop() + + +class MobileLoginDialog: + """移动端登录对话框""" + + def __init__(self, parent, main_window): + self.parent = parent + self.main_window = main_window + + # 创建对话框 + self.dialog = ctk.CTkToplevel(parent) + self.dialog.title("登录") + self.dialog.geometry("300x400") + self.dialog.resizable(False, False) + + # 居中显示 + self.dialog.transient(parent) + self.dialog.grab_set() + + self._create_login_ui() + + def _create_login_ui(self): + """创建登录界面""" + # 标题 + title_label = ctk.CTkLabel( + self.dialog, + text="🔑 用户登录", + font=("Arial", 18, "bold") + ) + title_label.pack(pady=20) + + # 用户ID输入 + user_id_frame = ctk.CTkFrame(self.dialog) + user_id_frame.pack(fill="x", padx=20, pady=10) + + ctk.CTkLabel(user_id_frame, text="用户ID:", font=("Arial", 14)).pack(anchor="w", padx=10, pady=5) + self.user_id_entry = ctk.CTkEntry(user_id_frame, placeholder_text="输入用户ID") + self.user_id_entry.pack(fill="x", padx=10, pady=5) + + # 姓名输入 + name_frame = ctk.CTkFrame(self.dialog) + name_frame.pack(fill="x", padx=20, pady=10) + + ctk.CTkLabel(name_frame, text="姓名:", font=("Arial", 14)).pack(anchor="w", padx=10, pady=5) + self.name_entry = ctk.CTkEntry(name_frame, placeholder_text="输入姓名") + self.name_entry.pack(fill="x", padx=10, pady=5) + + # 登录按钮 + login_btn = ctk.CTkButton( + self.dialog, + text="🚀 登录", + font=("Arial", 14, "bold"), + height=50, + command=self._login + ) + login_btn.pack(fill="x", padx=20, pady=20) + + # 测试用户按钮 + test_users_frame = ctk.CTkFrame(self.dialog) + test_users_frame.pack(fill="x", padx=20, pady=10) + + ctk.CTkLabel(test_users_frame, text="测试用户:", font=("Arial", 12)).pack(pady=5) + + test_users = ["user001", "user002", "user003"] + for user_id in test_users: + btn = ctk.CTkButton( + test_users_frame, + text=f"👤 {user_id}", + font=("Arial", 12), + height=30, + command=lambda u=user_id: self._quick_login(u) + ) + btn.pack(fill="x", pady=2) + + def _login(self): + """登录""" + user_id = self.user_id_entry.get().strip() + name = self.name_entry.get().strip() + + if not user_id or not name: + messagebox.showwarning("警告", "请填写完整信息") + return + + try: + # 获取或创建用户数据 + user_data = self.main_window.app_core.get_user_data(user_id) + if not user_data: + # 创建新用户 + from core.base import UserData + user_data = UserData( + user_id=user_id, + profile={'name': name, 'age': 25, 'gender': '女', 'height': 165, 'weight': 55, 'activity_level': 'moderate'}, + meals=[], + feedback=[], + preferences={} + ) + self.main_window.app_core.data_manager.save_user_data(user_data) + + # 设置当前用户 + self.main_window.set_current_user(user_id, user_data) + + # 关闭对话框 + self.dialog.destroy() + + messagebox.showinfo("成功", f"欢迎,{name}!") + + except Exception as e: + messagebox.showerror("错误", f"登录失败: {str(e)}") + + def _quick_login(self, user_id: str): + """快速登录测试用户""" + self.user_id_entry.delete(0, "end") + self.user_id_entry.insert(0, user_id) + + # 设置默认姓名 + names = {"user001": "张三", "user002": "李四", "user003": "王五"} + self.name_entry.delete(0, "end") + self.name_entry.insert(0, names.get(user_id, "测试用户")) + + def show(self): + """显示对话框""" + self.dialog.wait_window() + + +def main(): + """主函数""" + app = MobileMainWindow() + app.run() + + +if __name__ == "__main__": + main() diff --git a/gui/new_main_window.py b/gui/new_main_window.py new file mode 100644 index 0000000..1681932 --- /dev/null +++ b/gui/new_main_window.py @@ -0,0 +1,625 @@ +""" +新的界面设计 - 信息录入/修改 + 随机转盘/扭蛋机 +基于用户需求重新设计的界面 +""" + +import tkinter as tk +from tkinter import messagebox +import customtkinter as ctk +from typing import Dict, List, Optional, Any +import random +import math +import threading +import time +from datetime import datetime +import json + +# 设置CustomTkinter主题 +ctk.set_appearance_mode("dark") +ctk.set_default_color_theme("blue") + + +class SpinWheel(ctk.CTkCanvas): + """随机转盘/扭蛋机组件""" + + def __init__(self, parent, width=300, height=300, **kwargs): + super().__init__(parent, width=width, height=height, **kwargs) + self.width = width + self.height = height + self.center_x = width // 2 + self.center_y = height // 2 + self.radius = min(width, height) // 2 - 20 + + # 转盘状态 + self.is_spinning = False + self.current_angle = 0 + self.spin_speed = 0 + self.target_angle = 0 + + # 转盘选项 + self.options = [ + {"text": "早餐推荐", "color": "#FF6B6B", "value": "breakfast"}, + {"text": "午餐推荐", "color": "#4ECDC4", "value": "lunch"}, + {"text": "晚餐推荐", "color": "#45B7D1", "value": "dinner"}, + {"text": "健康建议", "color": "#96CEB4", "value": "health"}, + {"text": "营养分析", "color": "#FFEAA7", "value": "nutrition"}, + {"text": "运动建议", "color": "#DDA0DD", "value": "exercise"} + ] + + # 绑定点击事件 + self.bind("", self._on_click) + + # 绘制转盘 + self._draw_wheel() + + def _draw_wheel(self): + """绘制转盘""" + self.delete("all") + + # 绘制转盘背景 + self.create_oval( + self.center_x - self.radius, + self.center_y - self.radius, + self.center_x + self.radius, + self.center_y + self.radius, + fill="#2B2B2B", + outline="#FFFFFF", + width=3 + ) + + # 绘制扇形区域 + angle_per_section = 360 / len(self.options) + + for i, option in enumerate(self.options): + start_angle = i * angle_per_section + self.current_angle + end_angle = (i + 1) * angle_per_section + self.current_angle + + # 绘制扇形 + self.create_arc( + self.center_x - self.radius + 10, + self.center_y - self.radius + 10, + self.center_x + self.radius - 10, + self.center_y + self.radius - 10, + start=start_angle, + extent=angle_per_section, + fill=option["color"], + outline="#FFFFFF", + width=2 + ) + + # 绘制文字 + text_angle = start_angle + angle_per_section / 2 + text_radius = self.radius * 0.7 + + text_x = self.center_x + text_radius * math.cos(math.radians(text_angle)) + text_y = self.center_y + text_radius * math.sin(math.radians(text_angle)) + + self.create_text( + text_x, text_y, + text=option["text"], + fill="#FFFFFF", + font=("Arial", 10, "bold"), + angle=text_angle + ) + + # 绘制中心圆 + self.create_oval( + self.center_x - 20, + self.center_y - 20, + self.center_x + 20, + self.center_y + 20, + fill="#FF6B6B", + outline="#FFFFFF", + width=2 + ) + + # 绘制指针 + pointer_length = self.radius - 30 + pointer_x = self.center_x + pointer_length * math.cos(math.radians(self.current_angle)) + pointer_y = self.center_y + pointer_length * math.sin(math.radians(self.current_angle)) + + self.create_line( + self.center_x, self.center_y, + pointer_x, pointer_y, + fill="#FFFFFF", + width=4 + ) + + def _on_click(self, event): + """点击转盘开始旋转""" + if not self.is_spinning: + self.spin() + + def spin(self): + """开始旋转""" + if self.is_spinning: + return + + self.is_spinning = True + self.spin_speed = random.uniform(15, 25) # 初始速度 + self.target_angle = random.uniform(720, 1440) # 随机旋转角度 + + self._animate_spin() + + def _animate_spin(self): + """动画旋转""" + if not self.is_spinning: + return + + # 更新角度 + self.current_angle += self.spin_speed + self.current_angle %= 360 + + # 减速 + self.spin_speed *= 0.95 + + # 重绘转盘 + self._draw_wheel() + + # 检查是否停止 + if self.spin_speed < 0.1: + self.is_spinning = False + self._on_spin_complete() + else: + self.after(50, self._animate_spin) + + def _on_spin_complete(self): + """旋转完成回调""" + # 计算选中的选项 + angle_per_section = 360 / len(self.options) + selected_index = int(self.current_angle // angle_per_section) + selected_option = self.options[selected_index] + + # 触发回调 + if hasattr(self, 'on_spin_complete'): + self.on_spin_complete(selected_option) + + +class UserInfoForm(ctk.CTkFrame): + """用户信息录入/修改表单""" + + def __init__(self, parent, **kwargs): + super().__init__(parent, **kwargs) + self.user_data = {} + self._create_widgets() + + def _create_widgets(self): + """创建表单组件""" + # 标题 + title_label = ctk.CTkLabel( + self, + text="📝 个人信息管理", + font=ctk.CTkFont(size=24, weight="bold") + ) + title_label.pack(pady=20) + + # 表单框架 + form_frame = ctk.CTkScrollableFrame(self) + form_frame.pack(fill="both", expand=True, padx=20, pady=10) + + # 基本信息 + self._create_basic_info_section(form_frame) + + # 健康信息 + self._create_health_info_section(form_frame) + + # 饮食偏好 + self._create_diet_preferences_section(form_frame) + + # 按钮区域 + self._create_buttons(form_frame) + + def _create_basic_info_section(self, parent): + """创建基本信息区域""" + section_frame = ctk.CTkFrame(parent) + section_frame.pack(fill="x", padx=10, pady=10) + + # 标题 + title = ctk.CTkLabel( + section_frame, + text="👤 基本信息", + font=ctk.CTkFont(size=18, weight="bold") + ) + title.pack(pady=10) + + # 信息网格 + info_frame = ctk.CTkFrame(section_frame) + info_frame.pack(fill="x", padx=20, pady=10) + + # 姓名 + name_label = ctk.CTkLabel(info_frame, text="姓名:") + name_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.name_var = tk.StringVar() + name_entry = ctk.CTkEntry(info_frame, textvariable=self.name_var, width=200) + name_entry.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 年龄 + age_label = ctk.CTkLabel(info_frame, text="年龄:") + age_label.grid(row=0, column=2, sticky="w", padx=10, pady=5) + + self.age_var = tk.StringVar(value="25") + age_entry = ctk.CTkEntry(info_frame, textvariable=self.age_var, width=100) + age_entry.grid(row=0, column=3, sticky="w", padx=10, pady=5) + + # 性别 + gender_label = ctk.CTkLabel(info_frame, text="性别:") + gender_label.grid(row=1, column=0, sticky="w", padx=10, pady=5) + + self.gender_var = tk.StringVar(value="女") + gender_menu = ctk.CTkOptionMenu( + info_frame, + variable=self.gender_var, + values=["男", "女"] + ) + gender_menu.grid(row=1, column=1, sticky="w", padx=10, pady=5) + + # 身高体重 + height_label = ctk.CTkLabel(info_frame, text="身高(cm):") + height_label.grid(row=1, column=2, sticky="w", padx=10, pady=5) + + self.height_var = tk.StringVar(value="165") + height_entry = ctk.CTkEntry(info_frame, textvariable=self.height_var, width=100) + height_entry.grid(row=1, column=3, sticky="w", padx=10, pady=5) + + weight_label = ctk.CTkLabel(info_frame, text="体重(kg):") + weight_label.grid(row=2, column=0, sticky="w", padx=10, pady=5) + + self.weight_var = tk.StringVar(value="55") + weight_entry = ctk.CTkEntry(info_frame, textvariable=self.weight_var, width=100) + weight_entry.grid(row=2, column=1, sticky="w", padx=10, pady=5) + + def _create_health_info_section(self, parent): + """创建健康信息区域""" + section_frame = ctk.CTkFrame(parent) + section_frame.pack(fill="x", padx=10, pady=10) + + # 标题 + title = ctk.CTkLabel( + section_frame, + text="🏥 健康信息", + font=ctk.CTkFont(size=18, weight="bold") + ) + title.pack(pady=10) + + # 健康信息网格 + health_frame = ctk.CTkFrame(section_frame) + health_frame.pack(fill="x", padx=20, pady=10) + + # 活动水平 + activity_label = ctk.CTkLabel(health_frame, text="活动水平:") + activity_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.activity_var = tk.StringVar(value="中等") + activity_menu = ctk.CTkOptionMenu( + health_frame, + variable=self.activity_var, + values=["久坐", "轻度活动", "中等", "高度活动", "极度活动"] + ) + activity_menu.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 健康目标 + goal_label = ctk.CTkLabel(health_frame, text="健康目标:") + goal_label.grid(row=0, column=2, sticky="w", padx=10, pady=5) + + self.goal_var = tk.StringVar(value="保持健康") + goal_menu = ctk.CTkOptionMenu( + health_frame, + variable=self.goal_var, + values=["保持健康", "减重", "增重", "增肌", "改善消化", "提高免疫力"] + ) + goal_menu.grid(row=0, column=3, sticky="w", padx=10, pady=5) + + # 过敏信息 + allergy_label = ctk.CTkLabel(health_frame, text="过敏食物:") + allergy_label.grid(row=1, column=0, sticky="w", padx=10, pady=5) + + self.allergy_var = tk.StringVar(value="无") + allergy_entry = ctk.CTkEntry(health_frame, textvariable=self.allergy_var, width=200) + allergy_entry.grid(row=1, column=1, columnspan=2, sticky="w", padx=10, pady=5) + + def _create_diet_preferences_section(self, parent): + """创建饮食偏好区域""" + section_frame = ctk.CTkFrame(parent) + section_frame.pack(fill="x", padx=10, pady=10) + + # 标题 + title = ctk.CTkLabel( + section_frame, + text="🍽️ 饮食偏好", + font=ctk.CTkFont(size=18, weight="bold") + ) + title.pack(pady=10) + + # 偏好网格 + pref_frame = ctk.CTkFrame(section_frame) + pref_frame.pack(fill="x", padx=20, pady=10) + + # 口味偏好 + taste_label = ctk.CTkLabel(pref_frame, text="主要口味:") + taste_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.taste_var = tk.StringVar(value="均衡") + taste_menu = ctk.CTkOptionMenu( + pref_frame, + variable=self.taste_var, + values=["均衡", "偏甜", "偏咸", "偏辣", "偏酸", "偏清淡"] + ) + taste_menu.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 饮食类型 + diet_label = ctk.CTkLabel(pref_frame, text="饮食类型:") + diet_label.grid(row=0, column=2, sticky="w", padx=10, pady=5) + + self.diet_var = tk.StringVar(value="普通饮食") + diet_menu = ctk.CTkOptionMenu( + pref_frame, + variable=self.diet_var, + values=["普通饮食", "素食", "低脂饮食", "低糖饮食", "高蛋白饮食"] + ) + diet_menu.grid(row=0, column=3, sticky="w", padx=10, pady=5) + + # 不喜欢食物 + dislike_label = ctk.CTkLabel(pref_frame, text="不喜欢食物:") + dislike_label.grid(row=1, column=0, sticky="w", padx=10, pady=5) + + self.dislike_var = tk.StringVar(value="无") + dislike_entry = ctk.CTkEntry(pref_frame, textvariable=self.dislike_var, width=200) + dislike_entry.grid(row=1, column=1, columnspan=2, sticky="w", padx=10, pady=5) + + def _create_buttons(self, parent): + """创建按钮区域""" + button_frame = ctk.CTkFrame(parent) + button_frame.pack(fill="x", padx=10, pady=20) + + # 保存按钮 + save_button = ctk.CTkButton( + button_frame, + text="💾 保存信息", + command=self._save_data, + width=150, + height=50, + font=ctk.CTkFont(size=16, weight="bold") + ) + save_button.pack(side="left", padx=20, pady=10) + + # 加载按钮 + load_button = ctk.CTkButton( + button_frame, + text="📂 加载信息", + command=self._load_data, + width=150, + height=50, + font=ctk.CTkFont(size=16, weight="bold") + ) + load_button.pack(side="left", padx=20, pady=10) + + # 重置按钮 + reset_button = ctk.CTkButton( + button_frame, + text="🔄 重置表单", + command=self._reset_form, + width=150, + height=50, + font=ctk.CTkFont(size=16, weight="bold") + ) + reset_button.pack(side="right", padx=20, pady=10) + + def _save_data(self): + """保存数据""" + try: + self.user_data = { + 'basic_info': { + 'name': self.name_var.get(), + 'age': int(self.age_var.get()), + 'gender': self.gender_var.get(), + 'height': int(self.height_var.get()), + 'weight': int(self.weight_var.get()) + }, + 'health_info': { + 'activity_level': self.activity_var.get(), + 'health_goal': self.goal_var.get(), + 'allergies': self.allergy_var.get() + }, + 'diet_preferences': { + 'taste': self.taste_var.get(), + 'diet_type': self.diet_var.get(), + 'dislikes': self.dislike_var.get() + }, + 'saved_at': datetime.now().isoformat() + } + + # 保存到文件 + with open('data/user_info.json', 'w', encoding='utf-8') as f: + json.dump(self.user_data, f, ensure_ascii=False, indent=2) + + messagebox.showinfo("成功", "信息保存成功!") + + except Exception as e: + messagebox.showerror("错误", f"保存失败: {str(e)}") + + def _load_data(self): + """加载数据""" + try: + with open('data/user_info.json', 'r', encoding='utf-8') as f: + self.user_data = json.load(f) + + # 填充表单 + basic_info = self.user_data.get('basic_info', {}) + self.name_var.set(basic_info.get('name', '')) + self.age_var.set(str(basic_info.get('age', 25))) + self.gender_var.set(basic_info.get('gender', '女')) + self.height_var.set(str(basic_info.get('height', 165))) + self.weight_var.set(str(basic_info.get('weight', 55))) + + health_info = self.user_data.get('health_info', {}) + self.activity_var.set(health_info.get('activity_level', '中等')) + self.goal_var.set(health_info.get('health_goal', '保持健康')) + self.allergy_var.set(health_info.get('allergies', '无')) + + diet_prefs = self.user_data.get('diet_preferences', {}) + self.taste_var.set(diet_prefs.get('taste', '均衡')) + self.diet_var.set(diet_prefs.get('diet_type', '普通饮食')) + self.dislike_var.set(diet_prefs.get('dislikes', '无')) + + messagebox.showinfo("成功", "信息加载成功!") + + except FileNotFoundError: + messagebox.showwarning("警告", "未找到保存的信息文件") + except Exception as e: + messagebox.showerror("错误", f"加载失败: {str(e)}") + + def _reset_form(self): + """重置表单""" + self.name_var.set("") + self.age_var.set("25") + self.gender_var.set("女") + self.height_var.set("165") + self.weight_var.set("55") + self.activity_var.set("中等") + self.goal_var.set("保持健康") + self.allergy_var.set("无") + self.taste_var.set("均衡") + self.diet_var.set("普通饮食") + self.dislike_var.set("无") + + +class NewMainWindow(ctk.CTk): + """新的主窗口 - 信息录入/修改 + 随机转盘/扭蛋机""" + + def __init__(self): + super().__init__() + + # 设置窗口 + self.title("🍎 智能饮食推荐助手") + self.geometry("1200x800") + self.minsize(1000, 700) + + # 创建界面 + self._create_widgets() + + # 设置转盘回调 + self.spin_wheel.on_spin_complete = self._on_spin_complete + + def _create_widgets(self): + """创建界面组件""" + # 主标题 + title_label = ctk.CTkLabel( + self, + text="🎯 智能饮食推荐助手", + font=ctk.CTkFont(size=32, weight="bold") + ) + title_label.pack(pady=20) + + # 主内容区域 + main_frame = ctk.CTkFrame(self) + main_frame.pack(fill="both", expand=True, padx=20, pady=10) + + # 左侧 - 信息录入区域 + left_frame = ctk.CTkFrame(main_frame) + left_frame.pack(side="left", fill="both", expand=True, padx=(0, 10)) + + self.user_info_form = UserInfoForm(left_frame) + self.user_info_form.pack(fill="both", expand=True) + + # 右侧 - 转盘区域 + right_frame = ctk.CTkFrame(main_frame) + right_frame.pack(side="right", fill="both", padx=(10, 0)) + + # 转盘标题 + wheel_title = ctk.CTkLabel( + right_frame, + text="🎰 随机推荐转盘", + font=ctk.CTkFont(size=20, weight="bold") + ) + wheel_title.pack(pady=20) + + # 转盘说明 + wheel_desc = ctk.CTkLabel( + right_frame, + text="点击转盘开始随机推荐!", + font=ctk.CTkFont(size=14) + ) + wheel_desc.pack(pady=10) + + # 转盘组件 + self.spin_wheel = SpinWheel(right_frame, width=350, height=350) + self.spin_wheel.pack(pady=20) + + # 结果显示区域 + self.result_frame = ctk.CTkFrame(right_frame) + self.result_frame.pack(fill="x", padx=20, pady=20) + + self.result_label = ctk.CTkLabel( + self.result_frame, + text="等待转盘结果...", + font=ctk.CTkFont(size=16), + wraplength=300 + ) + self.result_label.pack(pady=20) + + # 底部状态栏 + self.status_frame = ctk.CTkFrame(self) + self.status_frame.pack(fill="x", padx=20, pady=10) + + self.status_label = ctk.CTkLabel( + self.status_frame, + text="就绪", + font=ctk.CTkFont(size=12) + ) + self.status_label.pack(pady=5) + + def _on_spin_complete(self, selected_option): + """转盘完成回调""" + self._update_status(f"转盘选中: {selected_option['text']}") + + # 显示结果 + result_text = f"🎯 推荐结果: {selected_option['text']}\n\n" + + # 根据选中的选项生成具体建议 + if selected_option['value'] == 'breakfast': + result_text += "🌅 早餐建议:\n" + result_text += "• 燕麦粥 + 牛奶 + 香蕉\n" + result_text += "• 全麦面包 + 鸡蛋 + 蔬菜\n" + result_text += "• 小米粥 + 咸菜 + 煮蛋" + elif selected_option['value'] == 'lunch': + result_text += "🌞 午餐建议:\n" + result_text += "• 米饭 + 鸡肉 + 青菜\n" + result_text += "• 面条 + 牛肉 + 西红柿\n" + result_text += "• 饺子 + 汤" + elif selected_option['value'] == 'dinner': + result_text += "🌙 晚餐建议:\n" + result_text += "• 粥 + 咸菜 + 豆腐\n" + result_text += "• 蒸蛋 + 青菜 + 汤\n" + result_text += "• 面条 + 蔬菜" + elif selected_option['value'] == 'health': + result_text += "🏥 健康建议:\n" + result_text += "• 多喝水,保持水分平衡\n" + result_text += "• 适量运动,增强体质\n" + result_text += "• 规律作息,保证睡眠" + elif selected_option['value'] == 'nutrition': + result_text += "🥗 营养建议:\n" + result_text += "• 多吃蔬菜水果\n" + result_text += "• 适量蛋白质摄入\n" + result_text += "• 控制糖分和盐分" + elif selected_option['value'] == 'exercise': + result_text += "🏃 运动建议:\n" + result_text += "• 每天30分钟有氧运动\n" + result_text += "• 适量力量训练\n" + result_text += "• 注意运动前后拉伸" + + self.result_label.configure(text=result_text) + + def _update_status(self, message): + """更新状态栏""" + self.status_label.configure(text=f"{datetime.now().strftime('%H:%M:%S')} - {message}") + + +def main(): + """主函数""" + app = NewMainWindow() + app.mainloop() + + +if __name__ == "__main__": + main() diff --git a/gui/ocr_calorie_gui.py b/gui/ocr_calorie_gui.py new file mode 100644 index 0000000..efeed0b --- /dev/null +++ b/gui/ocr_calorie_gui.py @@ -0,0 +1,637 @@ +""" +OCR热量识别GUI界面 +提供图片上传、OCR识别、结果验证和修正功能 +""" + +import tkinter as tk +from tkinter import ttk, filedialog, messagebox, scrolledtext +from PIL import Image, ImageTk +import threading +from typing import Dict, List, Optional, Any +from pathlib import Path +import json +from datetime import datetime +from core.base import UserData, CalorieInfo, FoodRecognitionResult + + +class OCRCalorieGUI: + """OCR热量识别GUI界面""" + + def __init__(self, parent_window, app_core): + self.parent_window = parent_window + self.app_core = app_core + self.current_image_path = None + self.current_recognition_result = None + self.user_corrections = {} + + # 创建主框架 + self.main_frame = ttk.Frame(parent_window) + self.main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) + + # 创建界面 + self._create_widgets() + self._setup_layout() + self._bind_events() + + def _create_widgets(self): + """创建界面组件""" + # 标题 + self.title_label = ttk.Label( + self.main_frame, + text="📷 图片OCR热量识别", + font=("Arial", 18, "bold"), + foreground="#2c3e50" + ) + + # 图片上传区域 + self.image_frame = ttk.LabelFrame( + self.main_frame, + text="📸 图片上传", + padding=15, + relief="solid", + borderwidth=1 + ) + + self.upload_button = ttk.Button( + self.image_frame, + text="📁 选择图片", + command=self._select_image, + style="Accent.TButton" + ) + + self.image_label = ttk.Label( + self.image_frame, + text="请选择包含食物信息的图片", + background="#f8f9fa", + relief="solid", + borderwidth=1, + width=50, + height=15, + anchor="center" + ) + + # 识别控制区域 + self.control_frame = ttk.LabelFrame( + self.main_frame, + text="⚙️ 识别控制", + padding=15, + relief="solid", + borderwidth=1 + ) + + self.recognize_button = ttk.Button( + self.control_frame, + text="🚀 开始识别", + command=self._start_recognition, + state=tk.DISABLED, + style="Accent.TButton" + ) + + self.progress_bar = ttk.Progressbar( + self.control_frame, + mode='indeterminate', + style="Accent.TProgressbar" + ) + + self.status_label = ttk.Label( + self.control_frame, + text="✅ 准备就绪", + foreground="#27ae60" + ) + + # 识别结果区域 + self.result_frame = ttk.LabelFrame(self.main_frame, text="识别结果", padding=10) + + # 创建结果表格 + self.result_tree = ttk.Treeview( + self.result_frame, + columns=('food_name', 'calories', 'confidence', 'source'), + show='headings', + height=8 + ) + + # 设置列标题 + self.result_tree.heading('food_name', text='食物名称') + self.result_tree.heading('calories', text='热量(卡路里)') + self.result_tree.heading('confidence', text='置信度') + self.result_tree.heading('source', text='来源') + + # 设置列宽 + self.result_tree.column('food_name', width=150) + self.result_tree.column('calories', width=100) + self.result_tree.column('confidence', width=80) + self.result_tree.column('source', width=100) + + # 结果操作按钮 + self.result_button_frame = ttk.Frame(self.result_frame) + + self.edit_button = ttk.Button( + self.result_button_frame, + text="编辑结果", + command=self._edit_result, + state=tk.DISABLED + ) + + self.confirm_button = ttk.Button( + self.result_button_frame, + text="确认结果", + command=self._confirm_result, + state=tk.DISABLED + ) + + self.clear_button = ttk.Button( + self.result_button_frame, + text="清空结果", + command=self._clear_results + ) + + # 详细信息区域 + self.detail_frame = ttk.LabelFrame(self.main_frame, text="详细信息", padding=10) + + self.detail_text = scrolledtext.ScrolledText( + self.detail_frame, + height=8, + width=60 + ) + + # 建议区域 + self.suggestion_frame = ttk.LabelFrame(self.main_frame, text="建议", padding=10) + + self.suggestion_text = scrolledtext.ScrolledText( + self.suggestion_frame, + height=4, + width=60, + state=tk.DISABLED + ) + + def _setup_layout(self): + """设置布局""" + # 标题 + self.title_label.pack(pady=(0, 10)) + + # 图片上传区域 + self.image_frame.pack(fill=tk.X, pady=(0, 10)) + self.upload_button.pack(side=tk.LEFT, padx=(0, 10)) + self.image_label.pack(fill=tk.BOTH, expand=True) + + # 识别控制区域 + self.control_frame.pack(fill=tk.X, pady=(0, 10)) + self.recognize_button.pack(side=tk.LEFT, padx=(0, 10)) + self.progress_bar.pack(side=tk.LEFT, padx=(0, 10), fill=tk.X, expand=True) + self.status_label.pack(side=tk.LEFT) + + # 识别结果区域 + self.result_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 10)) + + # 结果表格 + result_scrollbar = ttk.Scrollbar(self.result_frame, orient=tk.VERTICAL, command=self.result_tree.yview) + self.result_tree.configure(yscrollcommand=result_scrollbar.set) + + self.result_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) + result_scrollbar.pack(side=tk.RIGHT, fill=tk.Y) + + # 结果操作按钮 + self.result_button_frame.pack(fill=tk.X, pady=(10, 0)) + self.edit_button.pack(side=tk.LEFT, padx=(0, 10)) + self.confirm_button.pack(side=tk.LEFT, padx=(0, 10)) + self.clear_button.pack(side=tk.LEFT) + + # 详细信息和建议区域 + detail_suggestion_frame = ttk.Frame(self.main_frame) + detail_suggestion_frame.pack(fill=tk.BOTH, expand=True) + + self.detail_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=(0, 5)) + self.detail_text.pack(fill=tk.BOTH, expand=True) + + self.suggestion_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=(5, 0)) + self.suggestion_text.pack(fill=tk.BOTH, expand=True) + + def _bind_events(self): + """绑定事件""" + self.result_tree.bind('<>', self._on_result_select) + self.result_tree.bind('', self._on_result_double_click) + + def _select_image(self): + """选择图片文件""" + file_types = [ + ("图片文件", "*.jpg *.jpeg *.png *.bmp *.gif"), + ("JPEG文件", "*.jpg *.jpeg"), + ("PNG文件", "*.png"), + ("所有文件", "*.*") + ] + + file_path = filedialog.askopenfilename( + title="选择包含食物信息的图片", + filetypes=file_types + ) + + if file_path: + self.current_image_path = file_path + self._display_image(file_path) + self.recognize_button.config(state=tk.NORMAL) + self.status_label.config(text=f"已选择图片: {Path(file_path).name}") + + def _display_image(self, image_path: str): + """显示图片""" + try: + # 加载图片 + image = Image.open(image_path) + + # 调整图片大小以适应显示区域 + display_size = (400, 300) + image.thumbnail(display_size, Image.Resampling.LANCZOS) + + # 转换为Tkinter可显示的格式 + photo = ImageTk.PhotoImage(image) + + # 更新标签 + self.image_label.config(image=photo, text="") + self.image_label.image = photo # 保持引用 + + except Exception as e: + messagebox.showerror("错误", f"无法显示图片: {str(e)}") + self.image_label.config(image="", text="图片显示失败") + + def _start_recognition(self): + """开始OCR识别""" + if not self.current_image_path: + messagebox.showwarning("警告", "请先选择图片") + return + + # 禁用按钮,显示进度条 + self.recognize_button.config(state=tk.DISABLED) + self.progress_bar.start() + self.status_label.config(text="正在识别...") + + # 在新线程中执行识别 + thread = threading.Thread(target=self._perform_recognition) + thread.daemon = True + thread.start() + + def _perform_recognition(self): + """执行OCR识别""" + try: + # 准备请求数据 + request_data = { + 'type': 'recognize_image', + 'image_path': self.current_image_path + } + + # 获取当前用户数据(这里需要根据实际情况调整) + user_data = UserData( + user_id="current_user", + profile={}, + meals=[], + feedback=[], + preferences={} + ) + + # 调用OCR模块 + from modules.ocr_calorie_recognition import OCRCalorieRecognitionModule + ocr_module = OCRCalorieRecognitionModule(self.app_core.config) + + if not ocr_module.initialize(): + raise Exception("OCR模块初始化失败") + + result = ocr_module.process(request_data, user_data) + + # 在主线程中更新UI + self.parent_window.after(0, self._on_recognition_complete, result) + + except Exception as e: + self.parent_window.after(0, self._on_recognition_error, str(e)) + + def _on_recognition_complete(self, result): + """识别完成回调""" + try: + # 停止进度条 + self.progress_bar.stop() + self.recognize_button.config(state=tk.NORMAL) + + if result.result.get('success', False): + self.current_recognition_result = result.result['result'] + self._display_recognition_results() + self.status_label.config(text="识别完成") + else: + error_msg = result.result.get('error', '识别失败') + messagebox.showerror("识别失败", error_msg) + self.status_label.config(text="识别失败") + + except Exception as e: + self._on_recognition_error(str(e)) + + def _on_recognition_error(self, error_msg: str): + """识别错误回调""" + self.progress_bar.stop() + self.recognize_button.config(state=tk.NORMAL) + self.status_label.config(text="识别失败") + messagebox.showerror("识别错误", f"OCR识别过程中出现错误: {error_msg}") + + def _display_recognition_results(self): + """显示识别结果""" + if not self.current_recognition_result: + return + + try: + # 清空现有结果 + self._clear_results() + + # 显示热量信息 + calorie_infos = self.current_recognition_result.calorie_infos + + for info in calorie_infos: + self.result_tree.insert('', tk.END, values=( + info.food_name, + f"{info.calories:.1f}" if info.calories else "未知", + f"{info.confidence:.2f}", + info.source + )) + + # 显示详细信息 + self._update_detail_text() + + # 显示建议 + self._update_suggestion_text() + + # 启用操作按钮 + self.edit_button.config(state=tk.NORMAL) + self.confirm_button.config(state=tk.NORMAL) + + except Exception as e: + messagebox.showerror("错误", f"显示识别结果失败: {str(e)}") + + def _update_detail_text(self): + """更新详细信息文本""" + if not self.current_recognition_result: + return + + try: + detail_text = "=== OCR识别详细信息 ===\n\n" + + # OCR结果 + detail_text += "OCR识别结果:\n" + for ocr_result in self.current_recognition_result.ocr_results: + detail_text += f"- 方法: {ocr_result.method}\n" + detail_text += f" 置信度: {ocr_result.confidence:.2f}\n" + detail_text += f" 识别文本: {ocr_result.text[:100]}...\n\n" + + # 处理时间 + detail_text += f"处理时间: {self.current_recognition_result.processing_time:.2f}秒\n" + detail_text += f"整体置信度: {self.current_recognition_result.overall_confidence:.2f}\n" + + # 热量信息 + detail_text += "\n=== 热量信息 ===\n" + for info in self.current_recognition_result.calorie_infos: + detail_text += f"食物: {info.food_name}\n" + detail_text += f"热量: {info.calories} 卡路里\n" + detail_text += f"置信度: {info.confidence:.2f}\n" + detail_text += f"来源: {info.source}\n" + detail_text += f"原始文本: {info.raw_text}\n\n" + + self.detail_text.delete(1.0, tk.END) + self.detail_text.insert(1.0, detail_text) + + except Exception as e: + self.detail_text.delete(1.0, tk.END) + self.detail_text.insert(1.0, f"详细信息加载失败: {str(e)}") + + def _update_suggestion_text(self): + """更新建议文本""" + if not self.current_recognition_result: + return + + try: + suggestions = self.current_recognition_result.suggestions + + suggestion_text = "=== 建议 ===\n\n" + for i, suggestion in enumerate(suggestions, 1): + suggestion_text += f"{i}. {suggestion}\n" + + self.suggestion_text.config(state=tk.NORMAL) + self.suggestion_text.delete(1.0, tk.END) + self.suggestion_text.insert(1.0, suggestion_text) + self.suggestion_text.config(state=tk.DISABLED) + + except Exception as e: + self.suggestion_text.config(state=tk.NORMAL) + self.suggestion_text.delete(1.0, tk.END) + self.suggestion_text.insert(1.0, f"建议加载失败: {str(e)}") + self.suggestion_text.config(state=tk.DISABLED) + + def _on_result_select(self, event): + """结果选择事件""" + selection = self.result_tree.selection() + if selection: + self.edit_button.config(state=tk.NORMAL) + self.confirm_button.config(state=tk.NORMAL) + else: + self.edit_button.config(state=tk.DISABLED) + self.confirm_button.config(state=tk.DISABLED) + + def _on_result_double_click(self, event): + """结果双击事件""" + self._edit_result() + + def _edit_result(self): + """编辑识别结果""" + selection = self.result_tree.selection() + if not selection: + messagebox.showwarning("警告", "请先选择要编辑的结果") + return + + try: + item = selection[0] + values = self.result_tree.item(item, 'values') + + food_name = values[0] + calories = values[1] + + # 创建编辑对话框 + self._create_edit_dialog(food_name, calories, item) + + except Exception as e: + messagebox.showerror("错误", f"编辑结果失败: {str(e)}") + + def _create_edit_dialog(self, food_name: str, calories: str, item_id: str): + """创建编辑对话框""" + dialog = tk.Toplevel(self.parent_window) + dialog.title("编辑识别结果") + dialog.geometry("400x300") + dialog.resizable(False, False) + + # 居中显示 + dialog.transient(self.parent_window) + dialog.grab_set() + + # 创建表单 + form_frame = ttk.Frame(dialog, padding=20) + form_frame.pack(fill=tk.BOTH, expand=True) + + # 食物名称 + ttk.Label(form_frame, text="食物名称:").pack(anchor=tk.W, pady=(0, 5)) + food_name_var = tk.StringVar(value=food_name) + food_name_entry = ttk.Entry(form_frame, textvariable=food_name_var, width=40) + food_name_entry.pack(fill=tk.X, pady=(0, 15)) + + # 热量 + ttk.Label(form_frame, text="热量(卡路里):").pack(anchor=tk.W, pady=(0, 5)) + calories_var = tk.StringVar(value=calories) + calories_entry = ttk.Entry(form_frame, textvariable=calories_var, width=40) + calories_entry.pack(fill=tk.X, pady=(0, 15)) + + # 置信度 + ttk.Label(form_frame, text="置信度:").pack(anchor=tk.W, pady=(0, 5)) + confidence_var = tk.StringVar(value="0.95") + confidence_entry = ttk.Entry(form_frame, textvariable=confidence_var, width=40) + confidence_entry.pack(fill=tk.X, pady=(0, 20)) + + # 按钮 + button_frame = ttk.Frame(form_frame) + button_frame.pack(fill=tk.X) + + def save_changes(): + try: + new_food_name = food_name_var.get().strip() + new_calories = calories_var.get().strip() + new_confidence = float(confidence_var.get()) + + if not new_food_name: + messagebox.showwarning("警告", "食物名称不能为空") + return + + if new_calories and new_calories != "未知": + try: + float(new_calories) + except ValueError: + messagebox.showwarning("警告", "热量必须是数字") + return + + # 更新表格 + self.result_tree.item(item_id, values=( + new_food_name, + new_calories, + f"{new_confidence:.2f}", + "user_corrected" + )) + + # 保存用户修正 + self.user_corrections[new_food_name] = { + 'calories': float(new_calories) if new_calories and new_calories != "未知" else None, + 'confidence': new_confidence, + 'timestamp': datetime.now().isoformat() + } + + dialog.destroy() + messagebox.showinfo("成功", "结果已更新") + + except Exception as e: + messagebox.showerror("错误", f"保存失败: {str(e)}") + + def cancel_changes(): + dialog.destroy() + + ttk.Button(button_frame, text="保存", command=save_changes).pack(side=tk.LEFT, padx=(0, 10)) + ttk.Button(button_frame, text="取消", command=cancel_changes).pack(side=tk.LEFT) + + def _confirm_result(self): + """确认识别结果""" + if not self.current_recognition_result: + messagebox.showwarning("警告", "没有可确认的结果") + return + + try: + # 获取所有结果 + results = [] + for item in self.result_tree.get_children(): + values = self.result_tree.item(item, 'values') + results.append({ + 'food_name': values[0], + 'calories': float(values[1]) if values[1] != "未知" else None, + 'confidence': float(values[2]), + 'source': values[3] + }) + + if not results: + messagebox.showwarning("警告", "没有可确认的结果") + return + + # 确认对话框 + confirm_msg = "确认以下识别结果:\n\n" + for i, result in enumerate(results, 1): + confirm_msg += f"{i}. {result['food_name']}: {result['calories']} 卡路里\n" + + confirm_msg += "\n是否确认这些结果?" + + if messagebox.askyesno("确认结果", confirm_msg): + # 保存到餐食记录 + self._save_to_meal_record(results) + messagebox.showinfo("成功", "结果已保存到餐食记录") + + # 清空结果 + self._clear_results() + + except Exception as e: + messagebox.showerror("错误", f"确认结果失败: {str(e)}") + + def _save_to_meal_record(self, results: List[Dict[str, Any]]): + """保存到餐食记录""" + try: + # 这里需要调用应用核心的餐食记录功能 + # 暂时保存到本地文件 + meal_record = { + 'timestamp': datetime.now().isoformat(), + 'source': 'ocr_recognition', + 'foods': results, + 'total_calories': sum(r['calories'] for r in results if r['calories']) + } + + # 保存到文件 + record_file = Path("data/ocr_meal_records.json") + record_file.parent.mkdir(parents=True, exist_ok=True) + + records = [] + if record_file.exists(): + with open(record_file, 'r', encoding='utf-8') as f: + records = json.load(f) + + records.append(meal_record) + + with open(record_file, 'w', encoding='utf-8') as f: + json.dump(records, f, ensure_ascii=False, indent=2) + + except Exception as e: + self.logger.error(f"保存餐食记录失败: {e}") + raise + + def _clear_results(self): + """清空识别结果""" + self.result_tree.delete(*self.result_tree.get_children()) + self.detail_text.delete(1.0, tk.END) + + self.suggestion_text.config(state=tk.NORMAL) + self.suggestion_text.delete(1.0, tk.END) + self.suggestion_text.config(state=tk.DISABLED) + + self.edit_button.config(state=tk.DISABLED) + self.confirm_button.config(state=tk.DISABLED) + + self.current_recognition_result = None + + +if __name__ == "__main__": + # 测试GUI + root = tk.Tk() + root.title("OCR热量识别测试") + root.geometry("800x600") + + # 模拟应用核心 + class MockAppCore: + def __init__(self): + self.config = type('Config', (), {})() + + app_core = MockAppCore() + + # 创建GUI + ocr_gui = OCRCalorieGUI(root, app_core) + + root.mainloop() diff --git a/gui/quick_user_input.py b/gui/quick_user_input.py new file mode 100644 index 0000000..323e257 --- /dev/null +++ b/gui/quick_user_input.py @@ -0,0 +1,526 @@ +""" +快速用户需求录入界面 +优化用户录入流程,提高效率 +""" + +import tkinter as tk +from tkinter import ttk, messagebox +import customtkinter as ctk +from typing import Dict, List, Optional +from datetime import datetime +import json + + +class QuickUserInputDialog: + """快速用户需求录入对话框""" + + def __init__(self, parent, user_id: str): + self.parent = parent + self.user_id = user_id + self.input_data = {} + + # 创建对话框 + self.dialog = ctk.CTkToplevel(parent) + self.dialog.title("快速需求录入") + self.dialog.geometry("800x600") + self.dialog.transient(parent) + self.dialog.grab_set() + + # 居中显示 + self.dialog.geometry("+%d+%d" % (parent.winfo_rootx() + 50, parent.winfo_rooty() + 50)) + + self._create_widgets() + + def _create_widgets(self): + """创建界面组件""" + # 主框架 + main_frame = ctk.CTkScrollableFrame(self.dialog) + main_frame.pack(fill="both", expand=True, padx=20, pady=20) + + # 标题 + title_label = ctk.CTkLabel( + main_frame, + text="🚀 快速需求录入", + font=ctk.CTkFont(size=24, weight="bold") + ) + title_label.pack(pady=20) + + # 步骤1:基础信息 + self._create_basic_info_section(main_frame) + + # 步骤2:饮食偏好 + self._create_preferences_section(main_frame) + + # 步骤3:健康目标 + self._create_health_goals_section(main_frame) + + # 步骤4:快速餐食记录 + self._create_quick_meal_section(main_frame) + + # 按钮区域 + self._create_buttons(main_frame) + + def _create_basic_info_section(self, parent): + """创建基础信息区域""" + section_frame = ctk.CTkFrame(parent) + section_frame.pack(fill="x", padx=10, pady=10) + + # 标题 + title = ctk.CTkLabel( + section_frame, + text="1️⃣ 基础信息", + font=ctk.CTkFont(size=18, weight="bold") + ) + title.pack(pady=10) + + # 信息网格 + info_frame = ctk.CTkFrame(section_frame) + info_frame.pack(fill="x", padx=20, pady=10) + + # 姓名 + name_label = ctk.CTkLabel(info_frame, text="姓名:") + name_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.name_var = tk.StringVar() + name_entry = ctk.CTkEntry(info_frame, textvariable=self.name_var, width=200) + name_entry.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 年龄范围 + age_label = ctk.CTkLabel(info_frame, text="年龄范围:") + age_label.grid(row=0, column=2, sticky="w", padx=10, pady=5) + + self.age_var = tk.StringVar(value="25-30岁") + age_menu = ctk.CTkOptionMenu( + info_frame, + variable=self.age_var, + values=["18-24岁", "25-30岁", "31-35岁", "36-40岁", "41-45岁", "46-50岁", "51-55岁", "56-60岁", "60岁以上"] + ) + age_menu.grid(row=0, column=3, sticky="w", padx=10, pady=5) + + # 性别 + gender_label = ctk.CTkLabel(info_frame, text="性别:") + gender_label.grid(row=1, column=0, sticky="w", padx=10, pady=5) + + self.gender_var = tk.StringVar(value="女") + gender_menu = ctk.CTkOptionMenu( + info_frame, + variable=self.gender_var, + values=["男", "女"] + ) + gender_menu.grid(row=1, column=1, sticky="w", padx=10, pady=5) + + # 身高体重范围 + height_label = ctk.CTkLabel(info_frame, text="身高范围:") + height_label.grid(row=1, column=2, sticky="w", padx=10, pady=5) + + self.height_var = tk.StringVar(value="160-165cm") + height_menu = ctk.CTkOptionMenu( + info_frame, + variable=self.height_var, + values=["150cm以下", "150-155cm", "155-160cm", "160-165cm", "165-170cm", "170-175cm", "175-180cm", "180cm以上"] + ) + height_menu.grid(row=1, column=3, sticky="w", padx=10, pady=5) + + weight_label = ctk.CTkLabel(info_frame, text="体重范围:") + weight_label.grid(row=2, column=0, sticky="w", padx=10, pady=5) + + self.weight_var = tk.StringVar(value="50-55kg") + weight_menu = ctk.CTkOptionMenu( + info_frame, + variable=self.weight_var, + values=["40kg以下", "40-45kg", "45-50kg", "50-55kg", "55-60kg", "60-65kg", "65-70kg", "70-75kg", "75-80kg", "80kg以上"] + ) + weight_menu.grid(row=2, column=1, sticky="w", padx=10, pady=5) + + # 活动水平 + activity_label = ctk.CTkLabel(info_frame, text="活动水平:") + activity_label.grid(row=2, column=2, sticky="w", padx=10, pady=5) + + self.activity_var = tk.StringVar(value="中等") + activity_menu = ctk.CTkOptionMenu( + info_frame, + variable=self.activity_var, + values=["久坐", "轻度活动", "中等", "高度活动", "极度活动"] + ) + activity_menu.grid(row=2, column=3, sticky="w", padx=10, pady=5) + + def _create_preferences_section(self, parent): + """创建饮食偏好区域""" + section_frame = ctk.CTkFrame(parent) + section_frame.pack(fill="x", padx=10, pady=10) + + # 标题 + title = ctk.CTkLabel( + section_frame, + text="2️⃣ 饮食偏好", + font=ctk.CTkFont(size=18, weight="bold") + ) + title.pack(pady=10) + + # 偏好网格 + pref_frame = ctk.CTkFrame(section_frame) + pref_frame.pack(fill="x", padx=20, pady=10) + + # 口味偏好 + taste_label = ctk.CTkLabel(pref_frame, text="主要口味偏好:") + taste_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.taste_var = tk.StringVar(value="均衡") + taste_menu = ctk.CTkOptionMenu( + pref_frame, + variable=self.taste_var, + values=["均衡", "偏甜", "偏咸", "偏辣", "偏酸", "偏清淡"] + ) + taste_menu.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 饮食类型 + diet_label = ctk.CTkLabel(pref_frame, text="饮食类型:") + diet_label.grid(row=0, column=2, sticky="w", padx=10, pady=5) + + self.diet_var = tk.StringVar(value="普通饮食") + diet_menu = ctk.CTkOptionMenu( + pref_frame, + variable=self.diet_var, + values=["普通饮食", "素食", "低脂饮食", "低糖饮食", "高蛋白饮食", "地中海饮食"] + ) + diet_menu.grid(row=0, column=3, sticky="w", padx=10, pady=5) + + # 过敏食物 + allergy_label = ctk.CTkLabel(pref_frame, text="过敏食物:") + allergy_label.grid(row=1, column=0, sticky="w", padx=10, pady=5) + + self.allergy_var = tk.StringVar(value="无") + allergy_menu = ctk.CTkOptionMenu( + pref_frame, + variable=self.allergy_var, + values=["无", "花生", "海鲜", "牛奶", "鸡蛋", "坚果", "大豆", "小麦", "其他"] + ) + allergy_menu.grid(row=1, column=1, sticky="w", padx=10, pady=5) + + # 不喜欢食物 + dislike_label = ctk.CTkLabel(pref_frame, text="不喜欢食物:") + dislike_label.grid(row=1, column=2, sticky="w", padx=10, pady=5) + + self.dislike_var = tk.StringVar(value="无") + dislike_menu = ctk.CTkOptionMenu( + pref_frame, + variable=self.dislike_var, + values=["无", "内脏", "辛辣", "油腻", "甜食", "酸味", "苦味", "其他"] + ) + dislike_menu.grid(row=1, column=3, sticky="w", padx=10, pady=5) + + def _create_health_goals_section(self, parent): + """创建健康目标区域""" + section_frame = ctk.CTkFrame(parent) + section_frame.pack(fill="x", padx=10, pady=10) + + # 标题 + title = ctk.CTkLabel( + section_frame, + text="3️⃣ 健康目标", + font=ctk.CTkFont(size=18, weight="bold") + ) + title.pack(pady=10) + + # 目标选择 + goals_frame = ctk.CTkFrame(section_frame) + goals_frame.pack(fill="x", padx=20, pady=10) + + # 主要目标 + main_goal_label = ctk.CTkLabel(goals_frame, text="主要目标:") + main_goal_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.main_goal_var = tk.StringVar(value="保持健康") + main_goal_menu = ctk.CTkOptionMenu( + goals_frame, + variable=self.main_goal_var, + values=["保持健康", "减重", "增重", "增肌", "改善消化", "提高免疫力", "控制血糖", "降低血压"] + ) + main_goal_menu.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 次要目标 + sub_goal_label = ctk.CTkLabel(goals_frame, text="次要目标:") + sub_goal_label.grid(row=0, column=2, sticky="w", padx=10, pady=5) + + self.sub_goal_var = tk.StringVar(value="无") + sub_goal_menu = ctk.CTkOptionMenu( + goals_frame, + variable=self.sub_goal_var, + values=["无", "改善睡眠", "提高精力", "美容养颜", "延缓衰老", "改善皮肤", "增强记忆", "缓解压力"] + ) + sub_goal_menu.grid(row=0, column=3, sticky="w", padx=10, pady=5) + + def _create_quick_meal_section(self, parent): + """创建快速餐食记录区域""" + section_frame = ctk.CTkFrame(parent) + section_frame.pack(fill="x", padx=10, pady=10) + + # 标题 + title = ctk.CTkLabel( + section_frame, + text="4️⃣ 快速餐食记录", + font=ctk.CTkFont(size=18, weight="bold") + ) + title.pack(pady=10) + + # 餐食选择 + meal_frame = ctk.CTkFrame(section_frame) + meal_frame.pack(fill="x", padx=20, pady=10) + + # 餐次选择 + meal_type_label = ctk.CTkLabel(meal_frame, text="餐次:") + meal_type_label.grid(row=0, column=0, sticky="w", padx=10, pady=5) + + self.meal_type_var = tk.StringVar(value="午餐") + meal_type_menu = ctk.CTkOptionMenu( + meal_frame, + variable=self.meal_type_var, + values=["早餐", "午餐", "晚餐", "加餐"] + ) + meal_type_menu.grid(row=0, column=1, sticky="w", padx=10, pady=5) + + # 快速食物选择 + food_label = ctk.CTkLabel(meal_frame, text="快速选择食物:") + food_label.grid(row=1, column=0, sticky="w", padx=10, pady=5) + + self.quick_food_var = tk.StringVar(value="米饭+鸡肉+蔬菜") + quick_food_menu = ctk.CTkOptionMenu( + meal_frame, + variable=self.quick_food_var, + values=[ + "米饭+鸡肉+蔬菜", + "面条+鸡蛋+青菜", + "馒头+豆腐+白菜", + "粥+咸菜+鸡蛋", + "面包+牛奶+水果", + "饺子+汤", + "包子+豆浆", + "其他" + ] + ) + quick_food_menu.grid(row=1, column=1, sticky="w", padx=10, pady=5) + + # 分量选择 + portion_label = ctk.CTkLabel(meal_frame, text="分量:") + portion_label.grid(row=1, column=2, sticky="w", padx=10, pady=5) + + self.portion_var = tk.StringVar(value="正常") + portion_menu = ctk.CTkOptionMenu( + meal_frame, + variable=self.portion_var, + values=["少量", "正常", "较多", "很多"] + ) + portion_menu.grid(row=1, column=3, sticky="w", padx=10, pady=5) + + # 满意度 + satisfaction_label = ctk.CTkLabel(meal_frame, text="满意度:") + satisfaction_label.grid(row=2, column=0, sticky="w", padx=10, pady=5) + + self.satisfaction_var = tk.IntVar(value=3) + satisfaction_slider = ctk.CTkSlider( + meal_frame, + from_=1, + to=5, + number_of_steps=4, + variable=self.satisfaction_var + ) + satisfaction_slider.grid(row=2, column=1, columnspan=2, sticky="ew", padx=10, pady=5) + + # 满意度标签 + self.satisfaction_display = ctk.CTkLabel(meal_frame, text="3分 - 一般") + self.satisfaction_display.grid(row=2, column=3, sticky="w", padx=10, pady=5) + + # 绑定滑块事件 + satisfaction_slider.configure(command=self._on_satisfaction_changed) + + def _create_buttons(self, parent): + """创建按钮区域""" + button_frame = ctk.CTkFrame(parent) + button_frame.pack(fill="x", padx=10, pady=20) + + # 保存按钮 + save_button = ctk.CTkButton( + button_frame, + text="💾 保存所有信息", + command=self._save_all_data, + width=200, + height=50, + font=ctk.CTkFont(size=16, weight="bold") + ) + save_button.pack(side="left", padx=20, pady=10) + + # 取消按钮 + cancel_button = ctk.CTkButton( + button_frame, + text="❌ 取消", + command=self._cancel, + width=150, + height=50 + ) + cancel_button.pack(side="right", padx=20, pady=10) + + def _on_satisfaction_changed(self, value): + """满意度改变事件""" + score = int(float(value)) + score_texts = { + 1: "1分 - 很不满意", + 2: "2分 - 不满意", + 3: "3分 - 一般", + 4: "4分 - 满意", + 5: "5分 - 很满意" + } + self.satisfaction_display.configure(text=score_texts.get(score, "3分 - 一般")) + + def _save_all_data(self): + """保存所有数据""" + try: + # 收集所有数据 + self.input_data = { + 'basic_info': { + 'name': self.name_var.get(), + 'age_range': self.age_var.get(), + 'gender': self.gender_var.get(), + 'height_range': self.height_var.get(), + 'weight_range': self.weight_var.get(), + 'activity_level': self.activity_var.get() + }, + 'preferences': { + 'taste': self.taste_var.get(), + 'diet_type': self.diet_var.get(), + 'allergies': self.allergy_var.get(), + 'dislikes': self.dislike_var.get() + }, + 'health_goals': { + 'main_goal': self.main_goal_var.get(), + 'sub_goal': self.sub_goal_var.get() + }, + 'quick_meal': { + 'meal_type': self.meal_type_var.get(), + 'food_combo': self.quick_food_var.get(), + 'portion': self.portion_var.get(), + 'satisfaction': self.satisfaction_var.get() + } + } + + # 保存到数据库 + if self._save_to_database(): + messagebox.showinfo("成功", "所有信息保存成功!") + self.dialog.destroy() + else: + messagebox.showerror("错误", "保存失败,请重试") + + except Exception as e: + messagebox.showerror("错误", f"保存失败: {str(e)}") + + def _save_to_database(self) -> bool: + """保存到数据库""" + try: + from modules.data_collection import collect_questionnaire_data, record_meal + + # 保存基础信息 + basic_data = self.input_data['basic_info'] + age_mapping = { + "18-24岁": 21, "25-30岁": 27, "31-35岁": 33, "36-40岁": 38, + "41-45岁": 43, "46-50岁": 48, "51-55岁": 53, "56-60岁": 58, "60岁以上": 65 + } + height_mapping = { + "150cm以下": 150, "150-155cm": 152, "155-160cm": 157, "160-165cm": 162, + "165-170cm": 167, "170-175cm": 172, "175-180cm": 177, "180cm以上": 180 + } + weight_mapping = { + "40kg以下": 40, "40-45kg": 42, "45-50kg": 47, "50-55kg": 52, + "55-60kg": 57, "60-65kg": 62, "65-70kg": 67, "70-75kg": 72, + "75-80kg": 77, "80kg以上": 80 + } + activity_mapping = { + "久坐": "sedentary", "轻度活动": "light", "中等": "moderate", + "高度活动": "high", "极度活动": "very_high" + } + + basic_answers = { + 'name': basic_data['name'], + 'age': age_mapping.get(basic_data['age_range'], 25), + 'gender': basic_data['gender'], + 'height': height_mapping.get(basic_data['height_range'], 165), + 'weight': weight_mapping.get(basic_data['weight_range'], 55), + 'activity_level': activity_mapping.get(basic_data['activity_level'], 'moderate') + } + + collect_questionnaire_data(self.user_id, 'basic', basic_answers) + + # 保存口味偏好 + preferences_data = self.input_data['preferences'] + taste_answers = { + 'taste_preference': preferences_data['taste'], + 'diet_type': preferences_data['diet_type'], + 'allergies': [preferences_data['allergies']] if preferences_data['allergies'] != "无" else [], + 'dislikes': [preferences_data['dislikes']] if preferences_data['dislikes'] != "无" else [] + } + + collect_questionnaire_data(self.user_id, 'taste', taste_answers) + + # 保存健康目标 + health_data = self.input_data['health_goals'] + health_answers = { + 'main_goal': health_data['main_goal'], + 'sub_goal': health_data['sub_goal'] + } + + collect_questionnaire_data(self.user_id, 'health', health_answers) + + # 保存快速餐食记录 + meal_data = self.input_data['quick_meal'] + meal_type_mapping = { + "早餐": "breakfast", "午餐": "lunch", "晚餐": "dinner", "加餐": "snack" + } + + # 解析食物组合 + food_combo = meal_data['food_combo'] + if "+" in food_combo: + foods = [food.strip() for food in food_combo.split("+")] + else: + foods = [food_combo] + + # 估算分量 + portion_mapping = { + "少量": "1小份", "正常": "1份", "较多": "1大份", "很多": "2份" + } + quantities = [portion_mapping.get(meal_data['portion'], "1份")] * len(foods) + + meal_record = { + 'date': datetime.now().strftime('%Y-%m-%d'), + 'meal_type': meal_type_mapping.get(meal_data['meal_type'], 'lunch'), + 'foods': foods, + 'quantities': quantities, + 'satisfaction_score': meal_data['satisfaction'] + } + + record_meal(self.user_id, meal_record) + + return True + + except Exception as e: + print(f"保存到数据库失败: {e}") + return False + + def _cancel(self): + """取消录入""" + self.dialog.destroy() + + +# 便捷函数 +def show_quick_user_input_dialog(parent, user_id: str): + """显示快速用户需求录入对话框""" + dialog = QuickUserInputDialog(parent, user_id) + parent.wait_window(dialog.dialog) + + +if __name__ == "__main__": + # 测试快速录入对话框 + root = tk.Tk() + root.title("测试快速录入") + def test_dialog(): + show_quick_user_input_dialog(root, "test_user") + test_button = tk.Button(root, text="测试快速录入", command=test_dialog) + test_button.pack(pady=20) + root.mainloop() diff --git a/gui/smart_meal_record.py b/gui/smart_meal_record.py new file mode 100644 index 0000000..28bca52 --- /dev/null +++ b/gui/smart_meal_record.py @@ -0,0 +1,579 @@ +""" +简化的餐食记录界面 +使用选择式输入,减少用户负担 +""" + +import tkinter as tk +from tkinter import ttk, messagebox +import customtkinter as ctk +from typing import Dict, List, Optional +from smart_food.smart_database import ( + search_foods, get_food_categories, get_foods_by_category, + get_portion_options, estimate_calories, record_meal_smart +) + + +class SmartMealRecordDialog: + """智能餐食记录对话框""" + + def __init__(self, parent, user_id: str, meal_type: str = "lunch"): + self.parent = parent + self.user_id = user_id + self.meal_type = meal_type + self.selected_foods = [] + + # 创建对话框 + self.dialog = ctk.CTkToplevel(parent) + self.dialog.title(f"记录{self._get_meal_name(meal_type)}") + self.dialog.geometry("600x700") + self.dialog.transient(parent) + self.dialog.grab_set() + + # 居中显示 + self.dialog.geometry("+%d+%d" % (parent.winfo_rootx() + 50, parent.winfo_rooty() + 50)) + + self._create_widgets() + + def _get_meal_name(self, meal_type: str) -> str: + """获取餐次中文名称""" + meal_names = { + "breakfast": "早餐", + "lunch": "午餐", + "dinner": "晚餐" + } + return meal_names.get(meal_type, "餐食") + + def _create_widgets(self): + """创建界面组件""" + # 主框架 + main_frame = ctk.CTkScrollableFrame(self.dialog) + main_frame.pack(fill="both", expand=True, padx=20, pady=20) + + # 标题 + title_label = ctk.CTkLabel( + main_frame, + text=f"🍽️ 记录{self._get_meal_name(self.meal_type)}", + font=ctk.CTkFont(size=20, weight="bold") + ) + title_label.pack(pady=10) + + # 食物选择区域 + self._create_food_selection(main_frame) + + # 已选食物列表 + self._create_selected_foods(main_frame) + + # 满意度评分 + self._create_satisfaction_rating(main_frame) + + # 备注 + self._create_notes_section(main_frame) + + # 按钮区域 + self._create_buttons(main_frame) + + def _create_food_selection(self, parent): + """创建食物选择区域""" + # 食物选择框架 + food_frame = ctk.CTkFrame(parent) + food_frame.pack(fill="x", padx=10, pady=10) + + # 标题 + food_title = ctk.CTkLabel( + food_frame, + text="选择食物", + font=ctk.CTkFont(size=16, weight="bold") + ) + food_title.pack(pady=10) + + # 食物搜索 + search_frame = ctk.CTkFrame(food_frame) + search_frame.pack(fill="x", padx=10, pady=5) + + search_label = ctk.CTkLabel(search_frame, text="搜索食物:") + search_label.pack(anchor="w", padx=5, pady=2) + + self.search_var = tk.StringVar() + self.search_entry = ctk.CTkEntry(search_frame, textvariable=self.search_var, placeholder_text="输入食物名称搜索...") + self.search_entry.pack(fill="x", padx=5, pady=2) + self.search_entry.bind("", self._on_search_changed) + + # 搜索结果 + self.search_results_frame = ctk.CTkFrame(food_frame) + self.search_results_frame.pack(fill="x", padx=10, pady=5) + + self.search_results_label = ctk.CTkLabel(self.search_results_frame, text="搜索结果:") + self.search_results_label.pack(anchor="w", padx=5, pady=2) + + self.search_results_menu = ctk.CTkOptionMenu( + self.search_results_frame, + values=[], + command=self._on_search_result_selected + ) + self.search_results_menu.pack(fill="x", padx=5, pady=2) + + # 分隔线 + separator = ctk.CTkFrame(food_frame, height=2) + separator.pack(fill="x", padx=10, pady=5) + + # 分类选择 + category_frame = ctk.CTkFrame(food_frame) + category_frame.pack(fill="x", padx=10, pady=5) + + category_label = ctk.CTkLabel(category_frame, text="食物分类:") + category_label.pack(side="left", padx=5) + + self.category_var = tk.StringVar(value="主食") + self.category_menu = ctk.CTkOptionMenu( + category_frame, + variable=self.category_var, + values=get_food_categories(), + command=self._on_category_changed + ) + self.category_menu.pack(side="left", padx=5) + + # 食物选择 + food_select_frame = ctk.CTkFrame(food_frame) + food_select_frame.pack(fill="x", padx=10, pady=5) + + food_label = ctk.CTkLabel(food_select_frame, text="选择食物:") + food_label.pack(anchor="w", padx=5, pady=2) + + self.food_var = tk.StringVar() + self.food_menu = ctk.CTkOptionMenu( + food_select_frame, + variable=self.food_var, + values=[] + ) + self.food_menu.pack(fill="x", padx=5, pady=2) + + # 分量选择 + portion_frame = ctk.CTkFrame(food_frame) + portion_frame.pack(fill="x", padx=10, pady=5) + + portion_label = ctk.CTkLabel(portion_frame, text="分量:") + portion_label.pack(anchor="w", padx=5, pady=2) + + self.portion_var = tk.StringVar(value="适量") + self.portion_menu = ctk.CTkOptionMenu( + portion_frame, + variable=self.portion_var, + values=["适量"] + ) + self.portion_menu.pack(fill="x", padx=5, pady=2) + + # 添加按钮 + add_button = ctk.CTkButton( + food_frame, + text="添加到餐食", + command=self._add_food, + width=150 + ) + add_button.pack(pady=10) + + # AI分析按钮 + ai_analyze_button = ctk.CTkButton( + food_frame, + text="AI分析食物", + command=self._analyze_food_with_ai, + width=150, + fg_color="green" + ) + ai_analyze_button.pack(pady=5) + + # 初始化食物列表 + self._on_category_changed("主食") + + def _create_selected_foods(self, parent): + """创建已选食物列表""" + # 已选食物框架 + selected_frame = ctk.CTkFrame(parent) + selected_frame.pack(fill="x", padx=10, pady=10) + + # 标题 + selected_title = ctk.CTkLabel( + selected_frame, + text="已选食物", + font=ctk.CTkFont(size=16, weight="bold") + ) + selected_title.pack(pady=10) + + # 食物列表 + self.foods_listbox = tk.Listbox(selected_frame, height=6) + self.foods_listbox.pack(fill="x", padx=10, pady=5) + + # 删除按钮 + delete_button = ctk.CTkButton( + selected_frame, + text="删除选中", + command=self._remove_food, + width=150 + ) + delete_button.pack(pady=5) + + def _create_satisfaction_rating(self, parent): + """创建满意度评分""" + # 满意度框架 + satisfaction_frame = ctk.CTkFrame(parent) + satisfaction_frame.pack(fill="x", padx=10, pady=10) + + # 标题 + satisfaction_title = ctk.CTkLabel( + satisfaction_frame, + text="满意度评分", + font=ctk.CTkFont(size=16, weight="bold") + ) + satisfaction_title.pack(pady=10) + + # 评分滑块 + self.satisfaction_var = tk.IntVar(value=3) + satisfaction_slider = ctk.CTkSlider( + satisfaction_frame, + from_=1, + to=5, + number_of_steps=4, + variable=self.satisfaction_var + ) + satisfaction_slider.pack(fill="x", padx=20, pady=10) + + # 评分标签 + self.satisfaction_label = ctk.CTkLabel( + satisfaction_frame, + text="3分 - 一般", + font=ctk.CTkFont(size=14) + ) + self.satisfaction_label.pack(pady=5) + + # 绑定滑块事件 + satisfaction_slider.configure(command=self._on_satisfaction_changed) + + def _create_notes_section(self, parent): + """创建备注区域""" + # 备注框架 + notes_frame = ctk.CTkFrame(parent) + notes_frame.pack(fill="x", padx=10, pady=10) + + # 标题 + notes_title = ctk.CTkLabel( + notes_frame, + text="备注 (可选)", + font=ctk.CTkFont(size=16, weight="bold") + ) + notes_title.pack(pady=10) + + # 备注输入 + self.notes_text = ctk.CTkTextbox(notes_frame, height=60) + self.notes_text.pack(fill="x", padx=10, pady=5) + self.notes_text.insert("1.0", "可以记录一些感受或特殊说明...") + + def _create_buttons(self, parent): + """创建按钮区域""" + # 按钮框架 + button_frame = ctk.CTkFrame(parent) + button_frame.pack(fill="x", padx=10, pady=20) + + # 保存按钮 + save_button = ctk.CTkButton( + button_frame, + text="保存餐食记录", + command=self._save_meal, + width=150, + height=40 + ) + save_button.pack(side="left", padx=20, pady=10) + + # 取消按钮 + cancel_button = ctk.CTkButton( + button_frame, + text="取消", + command=self._cancel, + width=150, + height=40 + ) + cancel_button.pack(side="right", padx=20, pady=10) + + def _on_search_changed(self, event=None): + """搜索输入改变事件""" + query = self.search_var.get().strip() + if not query: + self.search_results_menu.configure(values=[]) + return + + try: + from smart_food.smart_database import search_foods + results = search_foods(query) + if results: + food_names = [result["name"] for result in results] + self.search_results_menu.configure(values=food_names) + self.search_results_label.configure(text=f"搜索结果 ({len(food_names)}个):") + else: + self.search_results_menu.configure(values=[]) + self.search_results_label.configure(text="未找到匹配的食物") + except Exception as e: + self.search_results_menu.configure(values=[]) + self.search_results_label.configure(text="搜索失败") + + def _on_search_result_selected(self, food_name): + """搜索结果选择事件""" + self.food_var.set(food_name) + self._on_food_changed(food_name) + + # 自动选择对应的分类 + try: + from smart_food.smart_database import get_food_categories, get_foods_by_category + categories = get_food_categories() + for category in categories: + foods_in_category = get_foods_by_category(category) + if food_name in foods_in_category: + self.category_var.set(category) + self._on_category_changed(category) + break + except Exception: + pass + + def _analyze_food_with_ai(self): + """使用AI分析食物""" + food_name = self.food_var.get() + portion = self.portion_var.get() + + if not food_name: + messagebox.showwarning("警告", "请选择食物") + return + + try: + from smart_food.smart_database import analyze_food_with_ai + + # 显示分析进度 + self._show_ai_analysis_dialog(food_name, portion) + + except Exception as e: + messagebox.showerror("错误", f"AI分析失败: {str(e)}") + + def _show_ai_analysis_dialog(self, food_name: str, portion: str): + """显示AI分析对话框""" + # 创建分析对话框 + analysis_dialog = ctk.CTkToplevel(self.dialog) + analysis_dialog.title(f"AI分析 - {food_name}") + analysis_dialog.geometry("500x600") + analysis_dialog.transient(self.dialog) + analysis_dialog.grab_set() + + # 居中显示 + analysis_dialog.geometry("+%d+%d" % (self.dialog.winfo_rootx() + 50, self.dialog.winfo_rooty() + 50)) + + # 创建滚动框架 + scroll_frame = ctk.CTkScrollableFrame(analysis_dialog) + scroll_frame.pack(fill="both", expand=True, padx=20, pady=20) + + # 标题 + title_label = ctk.CTkLabel( + scroll_frame, + text=f"🤖 AI分析: {food_name}", + font=ctk.CTkFont(size=18, weight="bold") + ) + title_label.pack(pady=10) + + # 分析进度 + progress_label = ctk.CTkLabel(scroll_frame, text="正在分析中...") + progress_label.pack(pady=10) + + # 分析结果区域 + result_text = ctk.CTkTextbox(scroll_frame, height=400, width=450) + result_text.pack(fill="both", expand=True, pady=10) + + # 关闭按钮 + close_button = ctk.CTkButton( + scroll_frame, + text="关闭", + command=analysis_dialog.destroy, + width=100 + ) + close_button.pack(pady=10) + + # 在后台线程中执行AI分析 + import threading + + def analyze_thread(): + try: + from smart_food.smart_database import analyze_food_with_ai + + # 执行AI分析 + result = analyze_food_with_ai(food_name, portion) + + # 更新UI + analysis_dialog.after(0, lambda: self._update_ai_analysis_result( + analysis_dialog, result_text, progress_label, result + )) + + except Exception as e: + analysis_dialog.after(0, lambda: self._update_ai_analysis_error( + analysis_dialog, result_text, progress_label, str(e) + )) + + threading.Thread(target=analyze_thread, daemon=True).start() + + def _update_ai_analysis_result(self, dialog, result_text, progress_label, result): + """更新AI分析结果""" + progress_label.configure(text="分析完成") + + if result.get('success'): + content = f""" +🍎 食物分析结果: {result.get('reasoning', 'AI分析')} + +📊 营养成分: +- 热量: {result.get('calories', 0)} 卡路里 +- 蛋白质: {result.get('protein', 0):.1f} 克 +- 碳水化合物: {result.get('carbs', 0):.1f} 克 +- 脂肪: {result.get('fat', 0):.1f} 克 +- 纤维: {result.get('fiber', 0):.1f} 克 + +🏷️ 分类: {result.get('category', '其他')} + +💡 健康建议: +""" + for tip in result.get('health_tips', []): + content += f"• {tip}\n" + + content += "\n👨‍🍳 制作建议:\n" + for suggestion in result.get('cooking_suggestions', []): + content += f"• {suggestion}\n" + + content += f"\n🎯 置信度: {result.get('confidence', 0.5):.1%}" + else: + content = "AI分析失败,请稍后重试。" + + result_text.delete("1.0", "end") + result_text.insert("1.0", content) + + def _update_ai_analysis_error(self, dialog, result_text, progress_label, error_msg): + """更新AI分析错误""" + progress_label.configure(text="分析失败") + result_text.delete("1.0", "end") + result_text.insert("1.0", f"AI分析失败: {error_msg}") + + def _on_category_changed(self, category): + """分类改变事件""" + foods = get_foods_by_category(category) + self.food_menu.configure(values=foods) + if foods: + self.food_var.set(foods[0]) + self._on_food_changed(foods[0]) + + def _on_food_changed(self, food_name): + """食物改变事件""" + portions = get_portion_options(food_name) + self.portion_menu.configure(values=portions) + if portions: + self.portion_var.set(portions[0]) + + def _add_food(self): + """添加食物""" + food_name = self.food_var.get() + portion = self.portion_var.get() + + if not food_name: + messagebox.showwarning("警告", "请选择食物") + return + + # 估算热量 + calories = estimate_calories(food_name, portion) + + # 添加到列表 + food_item = { + "name": food_name, + "portion": portion, + "calories": calories + } + + self.selected_foods.append(food_item) + self._update_foods_list() + + def _update_foods_list(self): + """更新食物列表显示""" + self.foods_listbox.delete(0, tk.END) + + total_calories = 0 + for i, food_item in enumerate(self.selected_foods): + display_text = f"{food_item['name']} - {food_item['portion']} ({food_item['calories']}卡)" + self.foods_listbox.insert(tk.END, display_text) + total_calories += food_item['calories'] + + # 显示总热量 + if self.selected_foods: + total_text = f"总热量: {total_calories}卡路里" + self.foods_listbox.insert(tk.END, "") + self.foods_listbox.insert(tk.END, total_text) + + def _remove_food(self): + """删除选中的食物""" + selection = self.foods_listbox.curselection() + if not selection: + messagebox.showwarning("警告", "请选择要删除的食物") + return + + index = selection[0] + if index < len(self.selected_foods): + self.selected_foods.pop(index) + self._update_foods_list() + + def _on_satisfaction_changed(self, value): + """满意度改变事件""" + score = int(float(value)) + score_texts = { + 1: "1分 - 很不满意", + 2: "2分 - 不满意", + 3: "3分 - 一般", + 4: "4分 - 满意", + 5: "5分 - 很满意" + } + self.satisfaction_label.configure(text=score_texts.get(score, "3分 - 一般")) + + def _save_meal(self): + """保存餐食记录""" + if not self.selected_foods: + messagebox.showwarning("警告", "请至少添加一种食物") + return + + try: + # 构建餐食数据 + meal_data = { + "meal_type": self.meal_type, + "foods": self.selected_foods, + "satisfaction_score": self.satisfaction_var.get(), + "notes": self.notes_text.get("1.0", "end-1c").strip() + } + + # 智能记录餐食 + if record_meal_smart(self.user_id, meal_data): + messagebox.showinfo("成功", "餐食记录保存成功!") + self.dialog.destroy() + else: + messagebox.showerror("错误", "餐食记录保存失败") + + except Exception as e: + messagebox.showerror("错误", f"保存失败: {str(e)}") + + def _cancel(self): + """取消记录""" + self.dialog.destroy() + + +# 便捷函数 +def show_smart_meal_record_dialog(parent, user_id: str, meal_type: str = "lunch"): + """显示智能餐食记录对话框""" + dialog = SmartMealRecordDialog(parent, user_id, meal_type) + parent.wait_window(dialog.dialog) + + +if __name__ == "__main__": + # 测试智能餐食记录对话框 + root = tk.Tk() + root.title("测试智能餐食记录") + + def test_dialog(): + show_smart_meal_record_dialog(root, "test_user", "lunch") + + test_button = tk.Button(root, text="测试餐食记录", command=test_dialog) + test_button.pack(pady=20) + + root.mainloop() diff --git a/gui/styles.py b/gui/styles.py new file mode 100644 index 0000000..29dfd3d --- /dev/null +++ b/gui/styles.py @@ -0,0 +1,326 @@ +""" +界面美化样式配置 +提供统一的圆角设计和颜色主题 +""" + +import tkinter as tk +from tkinter import ttk +import customtkinter as ctk + + +class StyleConfig: + """样式配置类""" + + # 颜色主题 + COLORS = { + 'primary': '#3498db', + 'primary_hover': '#2980b9', + 'secondary': '#2ecc71', + 'secondary_hover': '#27ae60', + 'accent': '#e74c3c', + 'accent_hover': '#c0392b', + 'warning': '#f39c12', + 'warning_hover': '#e67e22', + 'info': '#9b59b6', + 'info_hover': '#8e44ad', + 'success': '#27ae60', + 'success_hover': '#229954', + 'danger': '#e74c3c', + 'danger_hover': '#c0392b', + + # 背景色 + 'bg_light': '#ffffff', + 'bg_dark': '#2b2b2b', + 'bg_card': '#f8f9fa', + 'bg_card_dark': '#3b3b3b', + 'bg_container': '#f0f0f0', + 'bg_container_dark': '#1e1e1e', + + # 文字色 + 'text_primary': '#2c3e50', + 'text_primary_dark': '#ecf0f1', + 'text_secondary': '#34495e', + 'text_secondary_dark': '#bdc3c7', + 'text_muted': '#7f8c8d', + 'text_muted_dark': '#95a5a6', + + # 边框色 + 'border': '#e0e0e0', + 'border_dark': '#404040', + 'border_light': '#f0f0f0', + 'border_light_dark': '#555555', + } + + # 圆角半径 + CORNER_RADIUS = { + 'small': 8, + 'medium': 12, + 'large': 15, + 'xlarge': 20, + 'xxlarge': 25, + } + + # 字体配置 + FONTS = { + 'title': ('Arial', 22, 'bold'), + 'subtitle': ('Arial', 18, 'bold'), + 'heading': ('Arial', 16, 'bold'), + 'body': ('Arial', 14), + 'small': ('Arial', 12), + 'tiny': ('Arial', 10), + } + + # 间距配置 + SPACING = { + 'xs': 5, + 'sm': 10, + 'md': 15, + 'lg': 20, + 'xl': 25, + 'xxl': 30, + } + + +def apply_rounded_theme(): + """应用圆角主题到CustomTkinter""" + # 设置全局主题 + ctk.set_appearance_mode("light") + ctk.set_default_color_theme("blue") + + # 注意:CustomTkinter不支持类级别的configure方法 + # 样式需要在创建组件时单独设置 + print("✅ 圆角主题已应用") + + +def create_rounded_frame(parent, **kwargs): + """创建圆角框架""" + colors = StyleConfig.COLORS + radius = StyleConfig.CORNER_RADIUS + + default_kwargs = { + 'corner_radius': radius['medium'], + 'fg_color': (colors['bg_light'], colors['bg_dark']), + 'border_width': 1, + 'border_color': (colors['border'], colors['border_dark']), + } + + default_kwargs.update(kwargs) + return ctk.CTkFrame(parent, **default_kwargs) + + +def create_rounded_button(parent, text, **kwargs): + """创建圆角按钮""" + colors = StyleConfig.COLORS + radius = StyleConfig.CORNER_RADIUS + + default_kwargs = { + 'corner_radius': radius['medium'], + 'fg_color': (colors['primary'], colors['primary_hover']), + 'hover_color': (colors['primary_hover'], colors['primary']), + 'text_color': ('#ffffff', '#ffffff'), + 'font': StyleConfig.FONTS['body'], + } + + default_kwargs.update(kwargs) + return ctk.CTkButton(parent, text=text, **default_kwargs) + + +def create_rounded_entry(parent, **kwargs): + """创建圆角输入框""" + colors = StyleConfig.COLORS + radius = StyleConfig.CORNER_RADIUS + + default_kwargs = { + 'corner_radius': radius['medium'], + 'fg_color': (colors['bg_card'], colors['bg_card_dark']), + 'border_width': 1, + 'border_color': (colors['border_light'], colors['border_light_dark']), + 'font': StyleConfig.FONTS['body'], + 'text_color': (colors['text_primary'], colors['text_primary_dark']), + } + + default_kwargs.update(kwargs) + return ctk.CTkEntry(parent, **default_kwargs) + + +def create_rounded_label(parent, text, **kwargs): + """创建圆角标签""" + colors = StyleConfig.COLORS + + default_kwargs = { + 'text_color': (colors['text_primary'], colors['text_primary_dark']), + 'font': StyleConfig.FONTS['body'], + } + + default_kwargs.update(kwargs) + return ctk.CTkLabel(parent, text=text, **default_kwargs) + + +def create_card_frame(parent, **kwargs): + """创建卡片式框架""" + colors = StyleConfig.COLORS + radius = StyleConfig.CORNER_RADIUS + + default_kwargs = { + 'corner_radius': radius['large'], + 'fg_color': (colors['bg_card'], colors['bg_card_dark']), + 'border_width': 1, + 'border_color': (colors['border'], colors['border_dark']), + } + + default_kwargs.update(kwargs) + return ctk.CTkFrame(parent, **default_kwargs) + + +def create_accent_button(parent, text, color_type='primary', **kwargs): + """创建强调色按钮""" + colors = StyleConfig.COLORS + radius = StyleConfig.CORNER_RADIUS + + color_map = { + 'primary': (colors['primary'], colors['primary_hover']), + 'secondary': (colors['secondary'], colors['secondary_hover']), + 'accent': (colors['accent'], colors['accent_hover']), + 'warning': (colors['warning'], colors['warning_hover']), + 'info': (colors['info'], colors['info_hover']), + 'success': (colors['success'], colors['success_hover']), + 'danger': (colors['danger'], colors['danger_hover']), + } + + fg_color, hover_color = color_map.get(color_type, color_map['primary']) + + default_kwargs = { + 'corner_radius': radius['medium'], + 'fg_color': fg_color, + 'hover_color': hover_color, + 'text_color': ('#ffffff', '#ffffff'), + 'font': StyleConfig.FONTS['body'], + } + + default_kwargs.update(kwargs) + return ctk.CTkButton(parent, text=text, **default_kwargs) + + +def apply_ttk_styles(): + """应用TTK样式""" + style = ttk.Style() + + # 配置样式 + style.configure('Rounded.TFrame', + relief='solid', + borderwidth=1, + background='#f8f9fa') + + style.configure('Rounded.TLabelFrame', + relief='solid', + borderwidth=1, + background='#f8f9fa') + + style.configure('Accent.TButton', + relief='flat', + borderwidth=0, + background='#3498db', + foreground='white', + font=('Arial', 12, 'bold')) + + style.map('Accent.TButton', + background=[('active', '#2980b9'), + ('pressed', '#1f618d')]) + + style.configure('Accent.TProgressbar', + background='#3498db', + troughcolor='#ecf0f1', + borderwidth=0, + lightcolor='#3498db', + darkcolor='#3498db') + + +def get_spacing(size='md'): + """获取间距值""" + return StyleConfig.SPACING.get(size, StyleConfig.SPACING['md']) + + +def get_font(font_type='body'): + """获取字体配置""" + return StyleConfig.FONTS.get(font_type, StyleConfig.FONTS['body']) + + +def get_color(color_name): + """获取颜色值""" + return StyleConfig.COLORS.get(color_name, StyleConfig.COLORS['text_primary']) + + +def get_radius(size='medium'): + """获取圆角半径""" + return StyleConfig.CORNER_RADIUS.get(size, StyleConfig.CORNER_RADIUS['medium']) + + +# 预定义的样式组合 +STYLE_PRESETS = { + 'card': { + 'corner_radius': 20, + 'fg_color': ('#ffffff', '#3b3b3b'), + 'border_width': 1, + 'border_color': ('#e0e0e0', '#404040'), + }, + 'button_primary': { + 'corner_radius': 15, + 'fg_color': ('#3498db', '#2980b9'), + 'hover_color': ('#2980b9', '#1f618d'), + 'text_color': ('#ffffff', '#ffffff'), + }, + 'button_secondary': { + 'corner_radius': 15, + 'fg_color': ('#2ecc71', '#27ae60'), + 'hover_color': ('#27ae60', '#229954'), + 'text_color': ('#ffffff', '#ffffff'), + }, + 'button_accent': { + 'corner_radius': 15, + 'fg_color': ('#e74c3c', '#c0392b'), + 'hover_color': ('#c0392b', '#a93226'), + 'text_color': ('#ffffff', '#ffffff'), + }, + 'input_field': { + 'corner_radius': 12, + 'fg_color': ('#f8f9fa', '#404040'), + 'border_width': 1, + 'border_color': ('#e0e0e0', '#555555'), + }, +} + + +def apply_preset_style(widget, preset_name): + """应用预设样式""" + if preset_name in STYLE_PRESETS: + style_config = STYLE_PRESETS[preset_name] + for key, value in style_config.items(): + if hasattr(widget, key): + setattr(widget, key, value) + + +if __name__ == "__main__": + # 测试样式配置 + root = tk.Tk() + root.title("样式测试") + root.geometry("400x300") + + # 应用TTK样式 + apply_ttk_styles() + + # 创建测试框架 + main_frame = ttk.Frame(root, style='Rounded.TFrame') + main_frame.pack(fill='both', expand=True, padx=20, pady=20) + + # 创建测试按钮 + test_button = ttk.Button(main_frame, text="测试按钮", style='Accent.TButton') + test_button.pack(pady=10) + + # 创建测试标签框架 + test_frame = ttk.LabelFrame(main_frame, text="测试框架", style='Rounded.TLabelFrame') + test_frame.pack(fill='both', expand=True, pady=10) + + test_label = ttk.Label(test_frame, text="这是一个测试标签") + test_label.pack(pady=20) + + root.mainloop() diff --git a/llm_integration/qwen_client.py b/llm_integration/qwen_client.py new file mode 100644 index 0000000..b3dce1e --- /dev/null +++ b/llm_integration/qwen_client.py @@ -0,0 +1,599 @@ +""" +千问大模型集成模块 +支持千问API的智能分析功能 +""" + +import requests +import json +import os +from typing import Dict, List, Optional, Any +from dataclasses import dataclass +import logging +from datetime import datetime + +logger = logging.getLogger(__name__) + + +@dataclass +class LLMConfig: + """大模型配置""" + provider: str + api_key: str + base_url: str + model: str + temperature: float = 0.7 + max_tokens: int = 2000 + + +class QwenLLMClient: + """千问大模型客户端""" + + def __init__(self, config: LLMConfig): + self.config = config + self.session = requests.Session() + self.session.headers.update({ + 'Authorization': f'Bearer {config.api_key}', + 'Content-Type': 'application/json' + }) + + def chat_completion(self, messages: List[Dict[str, str]], **kwargs) -> Optional[Dict]: + """聊天完成""" + try: + # 构建请求数据 + data = { + 'model': self.config.model, + 'messages': messages, + 'temperature': kwargs.get('temperature', self.config.temperature), + 'max_tokens': kwargs.get('max_tokens', self.config.max_tokens), + 'stream': False + } + + # 发送请求 + response = self.session.post( + f"{self.config.base_url}/chat/completions", + json=data, + timeout=30 + ) + + if response.status_code == 200: + return response.json() + else: + logger.error(f"千问API请求失败: {response.status_code} - {response.text}") + return None + + except Exception as e: + logger.error(f"千问API调用失败: {e}") + return None + + def analyze_user_intent(self, user_input: str, user_context: Dict) -> Dict[str, Any]: + """分析用户意图""" + system_prompt = """ +你是一个专业的营养师和心理学专家,擅长分析用户的饮食需求和心理状态。 + +你的任务是: +1. 深度理解用户的真实需求,不仅仅是表面的话语 +2. 考虑用户的生理状态、情绪状态、历史偏好等多维度因素 +3. 提供个性化的饮食建议 +4. 特别关注女性用户的生理周期对饮食需求的影响 + +分析时要: +- 透过现象看本质,理解用户的真实意图 +- 综合考虑生理、心理、社会等多重因素 +- 提供科学、实用、个性化的建议 +- 保持专业性和同理心 + +请以JSON格式返回分析结果,包含以下字段: +- user_intent: 用户真实意图 +- emotional_state: 情绪状态 +- nutritional_needs: 营养需求列表 +- recommended_foods: 推荐食物列表 +- reasoning: 推荐理由 +- confidence: 置信度(0-1) +""" + + user_prompt = f""" +请分析以下用户输入的真实需求和意图: + +用户输入: "{user_input}" + +用户背景信息: +- 姓名: {user_context.get('name', '未知')} +- 年龄: {user_context.get('age', '未知')} +- 性别: {user_context.get('gender', '未知')} +- 身高体重: {user_context.get('height', '未知')}cm, {user_context.get('weight', '未知')}kg +- 活动水平: {user_context.get('activity_level', '未知')} + +口味偏好: {json.dumps(user_context.get('taste_preferences', {}), ensure_ascii=False, indent=2)} + +饮食限制: +- 过敏: {', '.join(user_context.get('allergies', []))} +- 不喜欢: {', '.join(user_context.get('dislikes', []))} +- 饮食偏好: {', '.join(user_context.get('dietary_preferences', []))} + +最近3天饮食记录: {self._format_meal_history(user_context.get('recent_meals', []))} + +用户反馈历史: {self._format_feedback_history(user_context.get('feedback_history', []))} + +当前情况: +- 日期: {datetime.now().strftime('%Y-%m-%d')} +- 生理状态: {json.dumps(user_context.get('physiological_state', {}), ensure_ascii=False)} + +请从以下维度分析用户需求: + +1. **真实意图分析**: 用户真正想要什么?是饿了、馋了、还是需要特定营养? + +2. **情绪状态**: 用户当前的情绪如何?压力大、开心、疲惫、焦虑等? + +3. **生理需求**: 基于用户的身体状况、生理周期等,需要什么营养? + +4. **口味偏好**: 基于历史数据和当前状态,推测用户可能的口味偏好 + +5. **饮食限制**: 考虑过敏、不喜欢、饮食偏好等限制 + +6. **推荐食物**: 基于以上分析,推荐3-5种合适的食物 + +7. **推荐理由**: 解释为什么推荐这些食物 + +8. **置信度**: 对分析的信心程度 (0-1) + +请以JSON格式返回分析结果。 +""" + + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt} + ] + + response = self.chat_completion(messages, temperature=0.3) + + if response and 'choices' in response: + content = response['choices'][0]['message']['content'] + return self._parse_analysis_result(content) + else: + return self._get_fallback_analysis(user_input, user_context) + + def analyze_nutrition(self, meal_data: Dict, user_context: Dict) -> Dict[str, Any]: + """分析营养状况""" + system_prompt = """ +你是一个专业的营养师,擅长分析餐食的营养价值和健康建议。 + +你的任务是: +1. 分析餐食的营养均衡性 +2. 评估热量是否合适 +3. 识别缺少的营养素 +4. 提供改进建议 +5. 考虑用户的个人情况 + +分析时要: +- 基于科学的营养学知识 +- 考虑用户的年龄、性别、体重、活动水平等因素 +- 提供具体可行的建议 +- 保持客观和专业 + +请以JSON格式返回分析结果,包含以下字段: +- nutrition_balance: 营养均衡性评估 +- calorie_assessment: 热量评估 +- missing_nutrients: 缺少的营养素列表 +- improvements: 改进建议列表 +- recommendations: 个性化建议列表 +- confidence: 置信度(0-1) +""" + + user_prompt = f""" +请分析以下餐食的营养状况: + +餐食信息: +- 食物: {', '.join(meal_data.get('foods', []))} +- 分量: {', '.join(meal_data.get('quantities', []))} +- 热量: {meal_data.get('calories', '未知')}卡路里 + +用户信息: +- 年龄: {user_context.get('age', '未知')} +- 性别: {user_context.get('gender', '未知')} +- 身高体重: {user_context.get('height', '未知')}cm, {user_context.get('weight', '未知')}kg +- 活动水平: {user_context.get('activity_level', '未知')} +- 健康目标: {', '.join(user_context.get('health_goals', []))} + +请分析: +1. 营养均衡性 +2. 热量是否合适 +3. 缺少的营养素 +4. 建议改进的地方 +5. 个性化建议 + +请以JSON格式返回分析结果。 +""" + + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt} + ] + + response = self.chat_completion(messages, temperature=0.2) + + if response and 'choices' in response: + content = response['choices'][0]['message']['content'] + return self._parse_nutrition_analysis(content) + else: + return self._get_fallback_nutrition_analysis(meal_data, user_context) + + def analyze_physiological_state(self, profile: Dict, cycle_info: Dict) -> Dict[str, Any]: + """分析生理状态""" + system_prompt = """ +你是专业的女性健康专家,了解生理周期对营养需求的影响。 + +你的任务是: +1. 分析女性用户的生理周期状态 +2. 评估当前阶段的营养需求 +3. 提供针对性的饮食建议 +4. 考虑情绪和食欲的变化 +5. 提供个性化建议 + +分析时要: +- 基于科学的生理学知识 +- 考虑个体差异 +- 提供温和、实用的建议 +- 保持专业和同理心 + +请以JSON格式返回分析结果,包含以下字段: +- physiological_state: 生理状态描述 +- nutritional_needs: 营养需求列表 +- foods_to_avoid: 需要避免的食物列表 +- emotional_changes: 情绪变化描述 +- appetite_changes: 食欲变化描述 +- recommendations: 个性化建议列表 +- confidence: 置信度(0-1) +""" + + user_prompt = f""" +作为专业的女性健康专家,请分析以下用户的生理状态和营养需求: + +用户信息: +- 年龄: {profile.get('age', '未知')} +- 身高体重: {profile.get('height', '未知')}cm, {profile.get('weight', '未知')}kg +- 月经周期长度: {profile.get('menstrual_cycle_length', '未知')}天 +- 上次月经: {profile.get('last_period_date', '未知')} + +当前生理周期状态: +- 周期阶段: {cycle_info.get('phase', '未知')} +- 距离下次月经: {cycle_info.get('days_to_next_period', '未知')}天 + +请分析: +1. 当前生理状态对营养需求的影响 +2. 建议补充的营养素 +3. 需要避免的食物 +4. 情绪和食欲的变化 +5. 个性化建议 + +请以JSON格式返回分析结果。 +""" + + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt} + ] + + response = self.chat_completion(messages, temperature=0.2) + + if response and 'choices' in response: + content = response['choices'][0]['message']['content'] + return self._parse_physiological_analysis(content, cycle_info) + else: + return self._get_fallback_physiological_analysis(cycle_info) + + def generate_meal_suggestion(self, meal_type: str, preferences: Dict, user_context: Dict) -> Dict[str, Any]: + """生成餐食建议""" + system_prompt = """ +你是一个专业的营养师和厨师,擅长根据用户需求推荐合适的餐食。 + +你的任务是: +1. 根据用户的口味偏好推荐食物 +2. 考虑饮食限制和过敏情况 +3. 提供营养均衡的建议 +4. 考虑用户的健康目标 +5. 提供实用的制作建议 + +推荐时要: +- 基于营养学原理 +- 考虑用户的个人喜好 +- 提供多样化的选择 +- 保持实用性和可操作性 + +请以JSON格式返回建议,包含以下字段: +- recommended_foods: 推荐食物列表 +- reasoning: 推荐理由 +- nutrition_tips: 营养搭配建议列表 +- cooking_suggestions: 制作建议列表 +- confidence: 置信度(0-1) +""" + + user_prompt = f""" +请为以下用户推荐{meal_type}: + +用户信息: +- 姓名: {user_context.get('name', '未知')} +- 年龄: {user_context.get('age', '未知')} +- 性别: {user_context.get('gender', '未知')} +- 身高体重: {user_context.get('height', '未知')}cm, {user_context.get('weight', '未知')}kg + +口味偏好: {json.dumps(user_context.get('taste_preferences', {}), ensure_ascii=False)} +饮食限制: 过敏({', '.join(user_context.get('allergies', []))}), 不喜欢({', '.join(user_context.get('dislikes', []))}) +健康目标: {', '.join(user_context.get('health_goals', []))} + +特殊偏好: {json.dumps(preferences, ensure_ascii=False)} + +请推荐: +1. 3-5种适合的食物 +2. 推荐理由 +3. 营养搭配建议 +4. 制作建议 + +请以JSON格式返回建议。 +""" + + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt} + ] + + response = self.chat_completion(messages, temperature=0.4) + + if response and 'choices' in response: + content = response['choices'][0]['message']['content'] + return self._parse_meal_suggestion(content) + else: + return self._get_fallback_meal_suggestion(meal_type, user_context) + + def _format_meal_history(self, meals: List[Dict]) -> str: + """格式化餐食历史""" + if not meals: + return "暂无饮食记录" + + formatted = [] + for meal in meals: + foods = ', '.join(meal.get('foods', [])) + satisfaction = meal.get('satisfaction_score', '未知') + formatted.append(f"- {meal.get('date', '')} {meal.get('meal_type', '')}: {foods} (满意度: {satisfaction})") + + return '\n'.join(formatted) + + def _format_feedback_history(self, feedbacks: List[Dict]) -> str: + """格式化反馈历史""" + if not feedbacks: + return "暂无反馈记录" + + formatted = [] + for feedback in feedbacks: + recommended = ', '.join(feedback.get('recommended_foods', [])) + choice = feedback.get('user_choice', '未知') + feedback_type = feedback.get('feedback_type', '未知') + formatted.append(f"- 推荐: {recommended} | 选择: {choice} | 反馈: {feedback_type}") + + return '\n'.join(formatted) + + def _parse_analysis_result(self, analysis_text: str) -> Dict[str, Any]: + """解析分析结果""" + try: + # 尝试提取JSON部分 + start_idx = analysis_text.find('{') + end_idx = analysis_text.rfind('}') + 1 + + if start_idx != -1 and end_idx != -1: + json_str = analysis_text[start_idx:end_idx] + result_dict = json.loads(json_str) + + return { + 'success': True, + 'user_intent': result_dict.get('user_intent', ''), + 'emotional_state': result_dict.get('emotional_state', ''), + 'nutritional_needs': result_dict.get('nutritional_needs', []), + 'recommended_foods': result_dict.get('recommended_foods', []), + 'reasoning': result_dict.get('reasoning', ''), + 'confidence': result_dict.get('confidence', 0.5) + } + except Exception as e: + logger.error(f"解析分析结果失败: {e}") + + return self._get_fallback_analysis("", {}) + + def _parse_nutrition_analysis(self, analysis_text: str) -> Dict[str, Any]: + """解析营养分析结果""" + try: + start_idx = analysis_text.find('{') + end_idx = analysis_text.rfind('}') + 1 + + if start_idx != -1 and end_idx != -1: + json_str = analysis_text[start_idx:end_idx] + result_dict = json.loads(json_str) + + return { + 'success': True, + 'nutrition_balance': result_dict.get('nutrition_balance', ''), + 'calorie_assessment': result_dict.get('calorie_assessment', ''), + 'missing_nutrients': result_dict.get('missing_nutrients', []), + 'improvements': result_dict.get('improvements', []), + 'recommendations': result_dict.get('recommendations', []), + 'confidence': result_dict.get('confidence', 0.5) + } + except Exception as e: + logger.error(f"解析营养分析结果失败: {e}") + + return self._get_fallback_nutrition_analysis({}, {}) + + def _parse_physiological_analysis(self, analysis_text: str, cycle_info: Dict) -> Dict[str, Any]: + """解析生理状态分析结果""" + try: + start_idx = analysis_text.find('{') + end_idx = analysis_text.rfind('}') + 1 + + if start_idx != -1 and end_idx != -1: + json_str = analysis_text[start_idx:end_idx] + result_dict = json.loads(json_str) + + return { + 'success': True, + 'physiological_state': result_dict.get('physiological_state', cycle_info.get('phase', '')), + 'nutritional_needs': result_dict.get('nutritional_needs', []), + 'foods_to_avoid': result_dict.get('foods_to_avoid', []), + 'emotional_changes': result_dict.get('emotional_changes', ''), + 'appetite_changes': result_dict.get('appetite_changes', ''), + 'recommendations': result_dict.get('recommendations', []), + 'cycle_info': cycle_info, + 'confidence': result_dict.get('confidence', 0.5) + } + except Exception as e: + logger.error(f"解析生理分析结果失败: {e}") + + return self._get_fallback_physiological_analysis(cycle_info) + + def _parse_meal_suggestion(self, suggestion_text: str) -> Dict[str, Any]: + """解析餐食建议结果""" + try: + start_idx = suggestion_text.find('{') + end_idx = suggestion_text.rfind('}') + 1 + + if start_idx != -1 and end_idx != -1: + json_str = suggestion_text[start_idx:end_idx] + result_dict = json.loads(json_str) + + return { + 'success': True, + 'recommended_foods': result_dict.get('recommended_foods', []), + 'reasoning': result_dict.get('reasoning', ''), + 'nutrition_tips': result_dict.get('nutrition_tips', []), + 'cooking_suggestions': result_dict.get('cooking_suggestions', []), + 'confidence': result_dict.get('confidence', 0.5) + } + except Exception as e: + logger.error(f"解析餐食建议结果失败: {e}") + + return self._get_fallback_meal_suggestion("lunch", {}) + + def _get_fallback_analysis(self, user_input: str, user_context: Dict) -> Dict[str, Any]: + """获取备用分析结果""" + return { + 'success': True, + 'user_intent': '需要饮食建议', + 'emotional_state': '正常', + 'nutritional_needs': ['均衡营养'], + 'recommended_foods': ['米饭', '蔬菜', '蛋白质'], + 'reasoning': '基于基础营养需求', + 'confidence': 0.3 + } + + def _get_fallback_nutrition_analysis(self, meal_data: Dict, user_context: Dict) -> Dict[str, Any]: + """获取备用营养分析结果""" + return { + 'success': True, + 'nutrition_balance': '基本均衡', + 'calorie_assessment': '适中', + 'missing_nutrients': [], + 'improvements': ['增加蔬菜摄入'], + 'recommendations': ['保持均衡饮食'], + 'confidence': 0.3 + } + + def _get_fallback_physiological_analysis(self, cycle_info: Dict) -> Dict[str, Any]: + """获取备用生理状态分析结果""" + return { + 'success': True, + 'physiological_state': cycle_info.get('phase', '正常'), + 'nutritional_needs': ['均衡营养'], + 'foods_to_avoid': [], + 'emotional_changes': '正常', + 'appetite_changes': '正常', + 'recommendations': ['保持规律饮食'], + 'cycle_info': cycle_info, + 'confidence': 0.3 + } + + def _get_fallback_meal_suggestion(self, meal_type: str, user_context: Dict) -> Dict[str, Any]: + """获取备用餐食建议结果""" + return { + 'success': True, + 'recommended_foods': ['米饭', '蔬菜', '蛋白质'], + 'reasoning': '营养均衡的基础搭配', + 'nutrition_tips': ['注意营养搭配'], + 'cooking_suggestions': ['简单烹饪'], + 'confidence': 0.3 + } + + +# 千问配置 - 从环境变量获取 +def get_qwen_config() -> LLMConfig: + """获取千问配置""" + api_key = os.getenv('QWEN_API_KEY', 'sk-c0dbefa1718d46eaa897199135066f00') + base_url = os.getenv('QWEN_BASE_URL', 'https://dashscope.aliyuncs.com/compatible-mode/v1') + model = os.getenv('QWEN_MODEL', 'qwen-plus-latest') + + return LLMConfig( + provider="qwen", + api_key=api_key, + base_url=base_url, + model=model, + temperature=0.7, + max_tokens=2000 + ) + + +# 全局千问客户端实例 +qwen_client: Optional[QwenLLMClient] = None + + +def get_qwen_client() -> QwenLLMClient: + """获取千问客户端实例""" + global qwen_client + if qwen_client is None: + config = get_qwen_config() + qwen_client = QwenLLMClient(config) + return qwen_client + + +# 便捷函数 +def analyze_user_intent_with_qwen(user_input: str, user_context: Dict) -> Dict[str, Any]: + """使用千问分析用户意图""" + client = get_qwen_client() + return client.analyze_user_intent(user_input, user_context) + + +def analyze_nutrition_with_qwen(meal_data: Dict, user_context: Dict) -> Dict[str, Any]: + """使用千问分析营养状况""" + client = get_qwen_client() + return client.analyze_nutrition(meal_data, user_context) + + +def analyze_physiological_state_with_qwen(profile: Dict, cycle_info: Dict) -> Dict[str, Any]: + """使用千问分析生理状态""" + client = get_qwen_client() + return client.analyze_physiological_state(profile, cycle_info) + + +def generate_meal_suggestion_with_qwen(meal_type: str, preferences: Dict, user_context: Dict) -> Dict[str, Any]: + """使用千问生成餐食建议""" + client = get_qwen_client() + return client.generate_meal_suggestion(meal_type, preferences, user_context) + + +if __name__ == "__main__": + # 测试千问大模型集成 + print("测试千问大模型集成...") + + # 测试用户意图分析 + user_input = "我今天有点累,想吃点甜的,但是又怕胖" + user_context = { + 'name': '小美', + 'age': 25, + 'gender': '女', + 'height': 165, + 'weight': 55, + 'taste_preferences': {'sweet': 4, 'salty': 3, 'spicy': 2}, + 'allergies': ['花生'], + 'dislikes': ['内脏'], + 'recent_meals': [], + 'feedback_history': [] + } + + result = analyze_user_intent_with_qwen(user_input, user_context) + print(f"用户意图分析结果: {result}") + + print("千问大模型集成测试完成!") diff --git a/main.py b/main.py new file mode 100644 index 0000000..51485b2 --- /dev/null +++ b/main.py @@ -0,0 +1,249 @@ +""" +主应用入口 - 个性化饮食推荐助手 +基于基座架构的完整应用 +""" + +import sys +import os +from pathlib import Path +from typing import Optional +import logging + +# 添加项目根目录到Python路径 +project_root = Path(__file__).parent +sys.path.insert(0, str(project_root)) + +from core.base import BaseConfig, AppCore, ModuleManager, ModuleType, initialize_app, cleanup_app +from modules.data_collection import DataCollectionModule +from modules.ai_analysis import AIAnalysisModule +from modules.recommendation_engine import RecommendationEngine +from modules.ocr_calorie_recognition import OCRCalorieRecognitionModule +from gui.main_window import MainWindow +import tkinter as tk +from tkinter import messagebox + +# 配置日志 +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler('logs/app.log', encoding='utf-8'), + logging.StreamHandler() + ] +) + +logger = logging.getLogger(__name__) + + +class DietRecommendationApp: + """饮食推荐应用主类""" + + def __init__(self): + self.config = self._load_config() + self.app_core: Optional[AppCore] = None + self.main_window: Optional[MainWindow] = None + self.is_running = False + + def _load_config(self) -> BaseConfig: + """加载配置""" + config = BaseConfig() + + # 从环境变量加载API密钥 + config.qwen_api_key = os.getenv('QWEN_API_KEY') + + # 从.env文件加载配置 + env_file = Path('.env') + if env_file.exists(): + try: + from dotenv import load_dotenv + load_dotenv() + config.qwen_api_key = os.getenv('QWEN_API_KEY') + except Exception: + # 如果.env文件有编码问题,跳过加载 + pass + + return config + + def initialize(self) -> bool: + """初始化应用""" + try: + logger.info("正在初始化饮食推荐应用...") + + # 创建必要的目录 + self._create_directories() + + # 初始化应用核心 + if not initialize_app(self.config): + logger.error("应用核心初始化失败") + return False + + self.app_core = AppCore(self.config) + + # 注册所有模块 + if not self._register_modules(): + logger.error("模块注册失败") + return False + + # 启动应用核心 + if not self.app_core.start(): + logger.error("应用核心启动失败") + return False + + self.is_running = True + logger.info("饮食推荐应用初始化成功") + return True + + except Exception as e: + logger.error(f"应用初始化失败: {e}") + return False + + def _create_directories(self): + """创建必要的目录""" + directories = [ + 'data', + 'data/users', + 'data/training', + 'models', + 'logs', + 'gui' + ] + + for directory in directories: + Path(directory).mkdir(parents=True, exist_ok=True) + + def _register_modules(self) -> bool: + """注册所有模块""" + try: + module_manager = ModuleManager(self.config) + + # 注册数据采集模块 + data_collection_module = DataCollectionModule(self.config) + if not module_manager.register_module(data_collection_module): + logger.error("数据采集模块注册失败") + return False + + # 注册AI分析模块 + ai_analysis_module = AIAnalysisModule(self.config) + if not module_manager.register_module(ai_analysis_module): + logger.error("AI分析模块注册失败") + return False + + # 注册推荐引擎模块 + recommendation_module = RecommendationEngine(self.config) + if not module_manager.register_module(recommendation_module): + logger.error("推荐引擎模块注册失败") + return False + + # 注册OCR热量识别模块 + ocr_module = OCRCalorieRecognitionModule(self.config) + if not module_manager.register_module(ocr_module): + logger.error("OCR热量识别模块注册失败") + return False + + # 初始化模块管理器 + if not module_manager.initialize_all(): + logger.error("模块管理器初始化失败") + return False + + # 将模块管理器设置到应用核心 + self.app_core.module_manager = module_manager + logger.info("所有模块注册成功") + return True + + except Exception as e: + logger.error(f"模块注册失败: {e}") + return False + + def run_gui(self): + """运行GUI界面""" + try: + logger.info("启动移动端GUI界面...") + + # 使用移动端界面,传递应用核心 + from gui.mobile_main_window import MobileMainWindow + self.main_window = MobileMainWindow(self.app_core) + + # 启动GUI主循环 + self.main_window.run() + + except Exception as e: + logger.error(f"GUI启动失败: {e}") + messagebox.showerror("错误", f"GUI启动失败: {str(e)}") + + def _on_closing(self): + """窗口关闭事件处理""" + try: + if messagebox.askokcancel("退出", "确定要退出应用吗?"): + self.shutdown() + except Exception as e: + logger.error(f"关闭应用失败: {e}") + sys.exit(1) + + def shutdown(self): + """关闭应用""" + try: + logger.info("正在关闭应用...") + + # 关闭GUI + if self.main_window: + self.main_window.destroy() + + # 关闭应用核心 + if self.app_core: + self.app_core.stop() + + # 清理资源 + cleanup_app() + + self.is_running = False + logger.info("应用关闭完成") + + except Exception as e: + logger.error(f"应用关闭失败: {e}") + finally: + sys.exit(0) + + def get_app_status(self) -> dict: + """获取应用状态""" + if not self.app_core: + return {"status": "not_initialized"} + + module_status = self.app_core.module_manager.get_module_status() + + return { + "status": "running" if self.is_running else "stopped", + "modules": module_status, + "config": { + "app_name": self.config.app_name, + "version": self.config.version, + "debug": self.config.debug + } + } + + +def main(): + """主函数""" + try: + # 创建应用实例 + app = DietRecommendationApp() + + # 初始化应用 + if not app.initialize(): + logger.error("应用初始化失败,退出") + sys.exit(1) + + # 运行GUI + app.run_gui() + + except KeyboardInterrupt: + logger.info("用户中断,正在退出...") + sys.exit(0) + except Exception as e: + logger.error(f"应用运行失败: {e}") + import traceback + logger.error(f"详细错误信息: {traceback.format_exc()}") + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/modules/ai_analysis.py b/modules/ai_analysis.py new file mode 100644 index 0000000..6111414 --- /dev/null +++ b/modules/ai_analysis.py @@ -0,0 +1,778 @@ +""" +AI分析模块 - 基于基座架构 +集成大模型进行用户需求分析和营养建议 +""" + +from typing import Dict, List, Optional, Any +import json +import requests +from datetime import datetime, date +from core.base import BaseModule, ModuleType, UserData, AnalysisResult, BaseConfig +import os +try: + from dotenv import load_dotenv + load_dotenv() +except Exception: + # 如果没有.env文件或加载失败,使用默认配置 + pass + +# 导入千问客户端 +import sys +from pathlib import Path +sys.path.append(str(Path(__file__).parent.parent)) +from llm_integration.qwen_client import get_qwen_client, analyze_user_intent_with_qwen, analyze_nutrition_with_qwen + + +class AIAnalysisModule(BaseModule): + """AI分析模块""" + + def __init__(self, config: BaseConfig): + super().__init__(config, ModuleType.USER_ANALYSIS) + self.qwen_client = None + self.analysis_templates = self._load_analysis_templates() + + def initialize(self) -> bool: + """初始化模块""" + try: + self.logger.info("AI分析模块初始化中...") + + # 初始化千问客户端 + self.qwen_client = get_qwen_client() + self.logger.info("千问客户端初始化成功") + + self.is_initialized = True + self.logger.info("AI分析模块初始化完成") + return True + except Exception as e: + self.logger.error(f"AI分析模块初始化失败: {e}") + return False + + def process(self, input_data: Any, user_data: UserData) -> AnalysisResult: + """处理AI分析请求""" + try: + analysis_type = input_data.get('type', 'user_intent') + + if analysis_type == 'user_intent': + result = self._analyze_user_intent(input_data, user_data) + elif analysis_type == 'nutrition_analysis': + result = self._analyze_nutrition(input_data, user_data) + elif analysis_type == 'calorie_estimation': + result = self._estimate_calories(input_data, user_data) + elif analysis_type == 'physiological_state': + result = self._analyze_physiological_state(input_data, user_data) + elif analysis_type == 'meal_suggestion': + result = self._generate_meal_suggestion(input_data, user_data) + else: + result = self._create_error_result("未知的分析类型") + + return AnalysisResult( + module_type=self.module_type, + user_id=user_data.user_id, + input_data=input_data, + result=result, + confidence=result.get('confidence', 0.5) + ) + except Exception as e: + self.logger.error(f"处理AI分析请求失败: {e}") + return self._create_error_result(str(e)) + + def _analyze_user_intent(self, input_data: Dict, user_data: UserData) -> Dict[str, Any]: + """分析用户意图""" + user_input = input_data.get('user_input', '') + + if not self.qwen_client: + return self._get_fallback_intent_analysis(user_input, user_data) + + try: + # 构建用户上下文 + user_context = { + 'name': user_data.profile.get('name', '未知'), + 'age': user_data.profile.get('age', '未知'), + 'gender': user_data.profile.get('gender', '未知'), + 'height': user_data.profile.get('height', '未知'), + 'weight': user_data.profile.get('weight', '未知'), + 'activity_level': user_data.profile.get('activity_level', '未知'), + 'taste_preferences': user_data.profile.get('taste_preferences', {}), + 'allergies': user_data.profile.get('allergies', []), + 'dislikes': user_data.profile.get('dislikes', []), + 'dietary_preferences': user_data.profile.get('dietary_preferences', []), + 'recent_meals': user_data.meals[-3:] if user_data.meals else [], + 'feedback_history': user_data.feedback[-5:] if user_data.feedback else [] + } + + # 使用千问分析用户意图 + result = analyze_user_intent_with_qwen(user_input, user_context) + return result + + except Exception as e: + self.logger.error(f"用户意图分析失败: {e}") + return self._get_fallback_intent_analysis(user_input, user_data) + + def _analyze_nutrition(self, input_data: Dict, user_data: UserData) -> Dict[str, Any]: + """分析营养状况""" + meal_data = input_data.get('meal_data', {}) + + if not self.qwen_client: + return self._get_fallback_nutrition_analysis(meal_data, user_data) + + try: + # 构建用户上下文 + user_context = { + 'age': user_data.profile.get('age', '未知'), + 'gender': user_data.profile.get('gender', '未知'), + 'height': user_data.profile.get('height', '未知'), + 'weight': user_data.profile.get('weight', '未知'), + 'activity_level': user_data.profile.get('activity_level', '未知'), + 'health_goals': user_data.profile.get('health_goals', []) + } + + # 使用千问分析营养状况 + result = analyze_nutrition_with_qwen(meal_data, user_context) + return result + + except Exception as e: + self.logger.error(f"营养分析失败: {e}") + return self._get_fallback_nutrition_analysis(meal_data, user_data) + + def _estimate_calories(self, input_data: Dict, user_data: UserData) -> Dict[str, Any]: + """估算食物热量""" + food_data = input_data.get('food_data', {}) + food_name = food_data.get('food_name', '') + quantity = food_data.get('quantity', '') + + if not food_name or not quantity: + return self._create_error_result("缺少食物名称或分量信息") + + try: + # 基础热量数据库 + calorie_db = { + "米饭": 130, "面条": 110, "包子": 200, "饺子": 250, "馒头": 220, "面包": 250, + "鸡蛋": 150, "牛奶": 60, "豆浆": 30, "酸奶": 80, "苹果": 50, "香蕉": 90, + "鸡肉": 165, "牛肉": 250, "猪肉": 300, "鱼肉": 120, "豆腐": 80, "青菜": 20, + "西红柿": 20, "黄瓜": 15, "胡萝卜": 40, "土豆": 80, "红薯": 100, "玉米": 90 + } + + # 获取基础热量 + base_calories = calorie_db.get(food_name, 100) # 默认100卡路里 + + # 简单的分量解析 + quantity_lower = quantity.lower() + if '碗' in quantity_lower: + multiplier = 1.0 + elif 'g' in quantity_lower or '克' in quantity_lower: + # 假设一碗米饭约200g + multiplier = 0.5 + elif '个' in quantity_lower: + multiplier = 1.0 + else: + multiplier = 1.0 + + # 计算总热量 + total_calories = base_calories * multiplier + + return { + 'success': True, + 'calories': total_calories, + 'food_name': food_name, + 'quantity': quantity, + 'base_calories': base_calories, + 'multiplier': multiplier, + 'confidence': 0.8 + } + + except Exception as e: + self.logger.error(f"热量估算失败: {e}") + return self._create_error_result(f"热量估算失败: {str(e)}") + + def _analyze_physiological_state(self, input_data: Dict, user_data: UserData) -> Dict[str, Any]: + """分析生理状态""" + current_date = input_data.get('current_date', datetime.now().strftime('%Y-%m-%d')) + + if not user_data.profile.get('is_female', False): + return { + 'success': True, + 'physiological_state': 'normal', + 'needs': [], + 'recommendations': [], + 'confidence': 0.8 + } + + try: + cycle_info = self._calculate_menstrual_cycle(user_data.profile, current_date) + + if not self.qwen_client: + return self._get_fallback_physiological_analysis(cycle_info) + + prompt = self._build_physiological_analysis_prompt(user_data.profile, cycle_info) + + messages = [ + {"role": "system", "content": self._get_physiological_analysis_system_prompt()}, + {"role": "user", "content": prompt} + ] + + response = self.qwen_client.chat_completion(messages, temperature=0.2, max_tokens=800) + + if response and 'choices' in response: + analysis_text = response['choices'][0]['message']['content'] + else: + return self._get_fallback_physiological_analysis(cycle_info) + return self._parse_physiological_analysis(analysis_text, cycle_info) + + except Exception as e: + self.logger.error(f"生理状态分析失败: {e}") + return self._get_fallback_physiological_analysis({}) + + def _generate_meal_suggestion(self, input_data: Dict, user_data: UserData) -> Dict[str, Any]: + """生成餐食建议""" + meal_type = input_data.get('meal_type', 'lunch') + preferences = input_data.get('preferences', {}) + + if not self.qwen_client: + return self._get_fallback_meal_suggestion(meal_type, user_data) + + try: + prompt = self._build_meal_suggestion_prompt(meal_type, preferences, user_data) + + messages = [ + {"role": "system", "content": self._get_meal_suggestion_system_prompt()}, + {"role": "user", "content": prompt} + ] + + response = self.qwen_client.chat_completion(messages, temperature=0.4, max_tokens=1000) + + if response and 'choices' in response: + suggestion_text = response['choices'][0]['message']['content'] + else: + return self._get_fallback_meal_suggestion(meal_type, user_data) + return self._parse_meal_suggestion(suggestion_text) + + except Exception as e: + self.logger.error(f"餐食建议生成失败: {e}") + return self._get_fallback_meal_suggestion(meal_type, user_data) + + def _build_intent_analysis_prompt(self, user_input: str, user_data: UserData) -> str: + """构建意图分析提示词""" + return f""" +请分析以下用户输入的真实意图和需求: + +用户输入: "{user_input}" + +用户背景: +- 姓名: {user_data.profile.get('name', '未知')} +- 年龄: {user_data.profile.get('age', '未知')} +- 性别: {user_data.profile.get('gender', '未知')} +- 身高体重: {user_data.profile.get('height', '未知')}cm, {user_data.profile.get('weight', '未知')}kg + +口味偏好: {json.dumps(user_data.profile.get('taste_preferences', {}), ensure_ascii=False)} +饮食限制: {', '.join(user_data.profile.get('allergies', []) + user_data.profile.get('dislikes', []))} + +最近饮食记录: {self._format_recent_meals(user_data.meals[-3:])} + +请分析: +1. 用户的真实意图(饿了、馋了、需要特定营养等) +2. 情绪状态(压力、开心、疲惫等) +3. 营养需求 +4. 推荐的食物类型 +5. 推荐理由 + +请以JSON格式返回分析结果。 +""" + + def _build_nutrition_analysis_prompt(self, meal_data: Dict, user_data: UserData) -> str: + """构建营养分析提示词""" + return f""" +请分析以下餐食的营养状况: + +餐食信息: +- 食物: {', '.join(meal_data.get('foods', []))} +- 分量: {', '.join(meal_data.get('quantities', []))} +- 热量: {meal_data.get('calories', '未知')}卡路里 + +用户信息: +- 年龄: {user_data.profile.get('age', '未知')} +- 性别: {user_data.profile.get('gender', '未知')} +- 身高体重: {user_data.profile.get('height', '未知')}cm, {user_data.profile.get('weight', '未知')}kg +- 活动水平: {user_data.profile.get('activity_level', '未知')} +- 健康目标: {', '.join(user_data.profile.get('health_goals', []))} + +请分析: +1. 营养均衡性 +2. 热量是否合适 +3. 缺少的营养素 +4. 建议改进的地方 +5. 个性化建议 + +请以JSON格式返回分析结果。 +""" + + def _build_physiological_analysis_prompt(self, profile: Dict, cycle_info: Dict) -> str: + """构建生理状态分析提示词""" + return f""" +作为专业的女性健康专家,请分析以下用户的生理状态: + +用户信息: +- 年龄: {profile.get('age', '未知')} +- 身高体重: {profile.get('height', '未知')}cm, {profile.get('weight', '未知')}kg +- 月经周期长度: {profile.get('menstrual_cycle_length', '未知')}天 +- 上次月经: {profile.get('last_period_date', '未知')} + +当前生理周期状态: +- 周期阶段: {cycle_info.get('phase', '未知')} +- 距离下次月经: {cycle_info.get('days_to_next_period', '未知')}天 + +请分析: +1. 当前生理状态对营养需求的影响 +2. 建议补充的营养素 +3. 需要避免的食物 +4. 情绪和食欲的变化 +5. 个性化建议 + +请以JSON格式返回分析结果。 +""" + + def _build_meal_suggestion_prompt(self, meal_type: str, preferences: Dict, user_data: UserData) -> str: + """构建餐食建议提示词""" + return f""" +请为以下用户推荐{meal_type}: + +用户信息: +- 姓名: {user_data.profile.get('name', '未知')} +- 年龄: {user_data.profile.get('age', '未知')} +- 性别: {user_data.profile.get('gender', '未知')} +- 身高体重: {user_data.profile.get('height', '未知')}cm, {user_data.profile.get('weight', '未知')}kg + +口味偏好: {json.dumps(user_data.profile.get('taste_preferences', {}), ensure_ascii=False)} +饮食限制: 过敏({', '.join(user_data.profile.get('allergies', []))}), 不喜欢({', '.join(user_data.profile.get('dislikes', []))}) +健康目标: {', '.join(user_data.profile.get('health_goals', []))} + +特殊偏好: {json.dumps(preferences, ensure_ascii=False)} + +请推荐: +1. 3-5种适合的食物 +2. 推荐理由 +3. 营养搭配建议 +4. 制作建议 + +请以JSON格式返回建议。 +""" + + def _get_intent_analysis_system_prompt(self) -> str: + """获取意图分析系统提示词""" + return """ +你是一个专业的营养师和心理学专家,擅长分析用户的饮食需求和心理状态。 + +你的任务是: +1. 深度理解用户的真实需求,不仅仅是表面的话语 +2. 考虑用户的生理状态、情绪状态、历史偏好等多维度因素 +3. 提供个性化的饮食建议 +4. 特别关注女性用户的生理周期对饮食需求的影响 + +分析时要: +- 透过现象看本质,理解用户的真实意图 +- 综合考虑生理、心理、社会等多重因素 +- 提供科学、实用、个性化的建议 +- 保持专业性和同理心 + +返回格式必须是有效的JSON,包含所有必需字段。 +""" + + def _get_nutrition_analysis_system_prompt(self) -> str: + """获取营养分析系统提示词""" + return """ +你是一个专业的营养师,擅长分析餐食的营养价值和健康建议。 + +你的任务是: +1. 分析餐食的营养均衡性 +2. 评估热量是否合适 +3. 识别缺少的营养素 +4. 提供改进建议 +5. 考虑用户的个人情况 + +分析时要: +- 基于科学的营养学知识 +- 考虑用户的年龄、性别、体重、活动水平等因素 +- 提供具体可行的建议 +- 保持客观和专业 + +返回格式必须是有效的JSON,包含所有必需字段。 +""" + + def _get_physiological_analysis_system_prompt(self) -> str: + """获取生理状态分析系统提示词""" + return """ +你是专业的女性健康专家,了解生理周期对营养需求的影响。 + +你的任务是: +1. 分析女性用户的生理周期状态 +2. 评估当前阶段的营养需求 +3. 提供针对性的饮食建议 +4. 考虑情绪和食欲的变化 +5. 提供个性化建议 + +分析时要: +- 基于科学的生理学知识 +- 考虑个体差异 +- 提供温和、实用的建议 +- 保持专业和同理心 + +返回格式必须是有效的JSON,包含所有必需字段。 +""" + + def _get_meal_suggestion_system_prompt(self) -> str: + """获取餐食建议系统提示词""" + return """ +你是一个专业的营养师和厨师,擅长根据用户需求推荐合适的餐食。 + +你的任务是: +1. 根据用户的口味偏好推荐食物 +2. 考虑饮食限制和过敏情况 +3. 提供营养均衡的建议 +4. 考虑用户的健康目标 +5. 提供实用的制作建议 + +推荐时要: +- 基于营养学原理 +- 考虑用户的个人喜好 +- 提供多样化的选择 +- 保持实用性和可操作性 + +返回格式必须是有效的JSON,包含所有必需字段。 +""" + + def _calculate_menstrual_cycle(self, profile: Dict, current_date: str) -> Dict[str, Any]: + """计算月经周期状态""" + try: + last_period = datetime.strptime(profile.get('last_period_date', ''), '%Y-%m-%d') + current = datetime.strptime(current_date, '%Y-%m-%d') + cycle_length = profile.get('menstrual_cycle_length', 28) + + days_since_period = (current - last_period).days + days_to_next_period = cycle_length - (days_since_period % cycle_length) + + # 判断周期阶段 + if days_since_period % cycle_length < 5: + phase = "月经期" + elif days_since_period % cycle_length < 14: + phase = "卵泡期" + elif days_since_period % cycle_length < 18: + phase = "排卵期" + else: + phase = "黄体期" + + return { + "phase": phase, + "days_since_period": days_since_period % cycle_length, + "days_to_next_period": days_to_next_period, + "is_ovulation": phase == "排卵期", + "cycle_length": cycle_length + } + except Exception: + return { + "phase": "未知", + "days_since_period": 0, + "days_to_next_period": 0, + "is_ovulation": False, + "cycle_length": 28 + } + + def _format_recent_meals(self, meals: List[Dict]) -> str: + """格式化最近餐食""" + if not meals: + return "暂无饮食记录" + + formatted = [] + for meal in meals: + foods = ', '.join(meal.get('foods', [])) + satisfaction = meal.get('satisfaction_score', '未知') + formatted.append(f"- {meal.get('date', '')} {meal.get('meal_type', '')}: {foods} (满意度: {satisfaction})") + + return '\n'.join(formatted) + + def _parse_intent_analysis(self, analysis_text: str) -> Dict[str, Any]: + """解析意图分析结果""" + try: + start_idx = analysis_text.find('{') + end_idx = analysis_text.rfind('}') + 1 + + if start_idx != -1 and end_idx != -1: + json_str = analysis_text[start_idx:end_idx] + result_dict = json.loads(json_str) + + return { + 'success': True, + 'user_intent': result_dict.get('user_intent', ''), + 'emotional_state': result_dict.get('emotional_state', ''), + 'nutritional_needs': result_dict.get('nutritional_needs', []), + 'recommended_foods': result_dict.get('recommended_foods', []), + 'reasoning': result_dict.get('reasoning', ''), + 'confidence': result_dict.get('confidence', 0.5) + } + except Exception as e: + self.logger.error(f"解析意图分析结果失败: {e}") + + return self._get_fallback_intent_analysis("", None) + + def _parse_nutrition_analysis(self, analysis_text: str) -> Dict[str, Any]: + """解析营养分析结果""" + try: + start_idx = analysis_text.find('{') + end_idx = analysis_text.rfind('}') + 1 + + if start_idx != -1 and end_idx != -1: + json_str = analysis_text[start_idx:end_idx] + result_dict = json.loads(json_str) + + return { + 'success': True, + 'nutrition_balance': result_dict.get('nutrition_balance', ''), + 'calorie_assessment': result_dict.get('calorie_assessment', ''), + 'missing_nutrients': result_dict.get('missing_nutrients', []), + 'improvements': result_dict.get('improvements', []), + 'recommendations': result_dict.get('recommendations', []), + 'confidence': result_dict.get('confidence', 0.5) + } + except Exception as e: + self.logger.error(f"解析营养分析结果失败: {e}") + + return self._get_fallback_nutrition_analysis({}, None) + + def _parse_physiological_analysis(self, analysis_text: str, cycle_info: Dict) -> Dict[str, Any]: + """解析生理状态分析结果""" + try: + start_idx = analysis_text.find('{') + end_idx = analysis_text.rfind('}') + 1 + + if start_idx != -1 and end_idx != -1: + json_str = analysis_text[start_idx:end_idx] + result_dict = json.loads(json_str) + + return { + 'success': True, + 'physiological_state': result_dict.get('physiological_state', cycle_info.get('phase', '')), + 'nutritional_needs': result_dict.get('nutritional_needs', []), + 'foods_to_avoid': result_dict.get('foods_to_avoid', []), + 'emotional_changes': result_dict.get('emotional_changes', ''), + 'appetite_changes': result_dict.get('appetite_changes', ''), + 'recommendations': result_dict.get('recommendations', []), + 'cycle_info': cycle_info, + 'confidence': result_dict.get('confidence', 0.5) + } + except Exception as e: + self.logger.error(f"解析生理分析结果失败: {e}") + + return self._get_fallback_physiological_analysis(cycle_info) + + def _parse_meal_suggestion(self, suggestion_text: str) -> Dict[str, Any]: + """解析餐食建议结果""" + try: + start_idx = suggestion_text.find('{') + end_idx = suggestion_text.rfind('}') + 1 + + if start_idx != -1 and end_idx != -1: + json_str = suggestion_text[start_idx:end_idx] + result_dict = json.loads(json_str) + + return { + 'success': True, + 'recommended_foods': result_dict.get('recommended_foods', []), + 'reasoning': result_dict.get('reasoning', ''), + 'nutrition_tips': result_dict.get('nutrition_tips', []), + 'cooking_suggestions': result_dict.get('cooking_suggestions', []), + 'confidence': result_dict.get('confidence', 0.5) + } + except Exception as e: + self.logger.error(f"解析餐食建议结果失败: {e}") + + return self._get_fallback_meal_suggestion("lunch", None) + + def _get_fallback_intent_analysis(self, user_input: str, user_data: UserData) -> Dict[str, Any]: + """获取备用意图分析结果""" + return { + 'success': True, + 'user_intent': '需要饮食建议', + 'emotional_state': '正常', + 'nutritional_needs': ['均衡营养'], + 'recommended_foods': ['米饭', '蔬菜', '蛋白质'], + 'reasoning': '基于基础营养需求', + 'confidence': 0.3 + } + + def _get_fallback_nutrition_analysis(self, meal_data: Dict, user_data: UserData) -> Dict[str, Any]: + """获取备用营养分析结果""" + return { + 'success': True, + 'nutrition_balance': '基本均衡', + 'calorie_assessment': '适中', + 'missing_nutrients': [], + 'improvements': ['增加蔬菜摄入'], + 'recommendations': ['保持均衡饮食'], + 'confidence': 0.3 + } + + def _get_fallback_physiological_analysis(self, cycle_info: Dict) -> Dict[str, Any]: + """获取备用生理状态分析结果""" + return { + 'success': True, + 'physiological_state': cycle_info.get('phase', '正常'), + 'nutritional_needs': ['均衡营养'], + 'foods_to_avoid': [], + 'emotional_changes': '正常', + 'appetite_changes': '正常', + 'recommendations': ['保持规律饮食'], + 'cycle_info': cycle_info, + 'confidence': 0.3 + } + + def _get_fallback_meal_suggestion(self, meal_type: str, user_data: UserData) -> Dict[str, Any]: + """获取备用餐食建议结果""" + return { + 'success': True, + 'recommended_foods': ['米饭', '蔬菜', '蛋白质'], + 'reasoning': '营养均衡的基础搭配', + 'nutrition_tips': ['注意营养搭配'], + 'cooking_suggestions': ['简单烹饪'], + 'confidence': 0.3 + } + + def _load_analysis_templates(self) -> Dict[str, Dict]: + """加载分析模板""" + return { + 'intent_analysis': { + 'description': '用户意图分析', + 'required_fields': ['user_input'] + }, + 'nutrition_analysis': { + 'description': '营养状况分析', + 'required_fields': ['meal_data'] + }, + 'physiological_state': { + 'description': '生理状态分析', + 'required_fields': ['current_date'] + }, + 'meal_suggestion': { + 'description': '餐食建议生成', + 'required_fields': ['meal_type'] + } + } + + def _create_error_result(self, error_message: str) -> Dict[str, Any]: + """创建错误结果""" + return { + 'success': False, + 'error': error_message, + 'message': f'AI分析失败: {error_message}', + 'confidence': 0.0 + } + + def cleanup(self) -> bool: + """清理资源""" + try: + self.logger.info("AI分析模块清理完成") + return True + except Exception as e: + self.logger.error(f"AI分析模块清理失败: {e}") + return False + + +# 便捷函数 +def analyze_user_intent(user_id: str, user_input: str) -> Optional[Dict]: + """分析用户意图""" + from core.base import get_app_core + + app = get_app_core() + input_data = { + 'type': 'user_intent', + 'user_input': user_input + } + + result = app.process_user_request(ModuleType.USER_ANALYSIS, input_data, user_id) + return result.result if result else None + + +def analyze_nutrition(user_id: str, meal_data: Dict) -> Optional[Dict]: + """分析营养状况""" + from core.base import get_app_core + + app = get_app_core() + input_data = { + 'type': 'nutrition_analysis', + 'meal_data': meal_data + } + + result = app.process_user_request(ModuleType.USER_ANALYSIS, input_data, user_id) + return result.result if result else None + + +def analyze_physiological_state(user_id: str, current_date: str = None) -> Optional[Dict]: + """分析生理状态""" + from core.base import get_app_core + from datetime import datetime + + if current_date is None: + current_date = datetime.now().strftime('%Y-%m-%d') + + app = get_app_core() + input_data = { + 'type': 'physiological_state', + 'current_date': current_date + } + + result = app.process_user_request(ModuleType.USER_ANALYSIS, input_data, user_id) + return result.result if result else None + + +def generate_meal_suggestion(user_id: str, meal_type: str, preferences: Dict = None) -> Optional[Dict]: + """生成餐食建议""" + from core.base import get_app_core + + if preferences is None: + preferences = {} + + app = get_app_core() + input_data = { + 'type': 'meal_suggestion', + 'meal_type': meal_type, + 'preferences': preferences + } + + result = app.process_user_request(ModuleType.USER_ANALYSIS, input_data, user_id) + return result.result if result else None + + +if __name__ == "__main__": + # 测试AI分析模块 + from core.base import BaseConfig, initialize_app, cleanup_app + + print("测试AI分析模块...") + + # 初始化应用 + config = BaseConfig() + if initialize_app(config): + print("✅ 应用初始化成功") + + # 测试用户意图分析 + test_user_id = "test_user_001" + user_input = "我今天有点累,想吃点甜的,但是又怕胖" + + result = analyze_user_intent(test_user_id, user_input) + if result: + print(f"✅ 用户意图分析成功: {result.get('user_intent', '')}") + + # 测试营养分析 + meal_data = { + 'foods': ['燕麦粥', '香蕉', '牛奶'], + 'quantities': ['1碗', '1根', '200ml'], + 'calories': 350.0 + } + + result = analyze_nutrition(test_user_id, meal_data) + if result: + print(f"✅ 营养分析成功: {result.get('nutrition_balance', '')}") + + # 清理应用 + cleanup_app() + print("✅ 应用清理完成") + else: + print("❌ 应用初始化失败") + + print("AI分析模块测试完成!") diff --git a/modules/data_collection.py b/modules/data_collection.py new file mode 100644 index 0000000..cede8de --- /dev/null +++ b/modules/data_collection.py @@ -0,0 +1,367 @@ +""" +数据采集模块 - 基于基座架构 +负责收集用户数据、问卷和餐食记录 +""" + +from typing import Dict, List, Optional, Any +import json +from datetime import datetime, date +from core.base import BaseModule, ModuleType, UserData, AnalysisResult, BaseConfig + + +class DataCollectionModule(BaseModule): + """数据采集模块""" + + def __init__(self, config: BaseConfig): + super().__init__(config, ModuleType.DATA_COLLECTION) + self.questionnaire_templates = self._load_questionnaire_templates() + + def initialize(self) -> bool: + """初始化模块""" + try: + self.logger.info("数据采集模块初始化中...") + self.is_initialized = True + self.logger.info("数据采集模块初始化完成") + return True + except Exception as e: + self.logger.error(f"数据采集模块初始化失败: {e}") + return False + + def process(self, input_data: Any, user_data: UserData) -> AnalysisResult: + """处理数据采集请求""" + try: + request_type = input_data.get('type', 'unknown') + + if request_type == 'questionnaire': + result = self._process_questionnaire(input_data, user_data) + elif request_type == 'meal_record': + result = self._process_meal_record(input_data, user_data) + elif request_type == 'feedback': + result = self._process_feedback(input_data, user_data) + else: + result = self._create_error_result("未知的请求类型") + + return AnalysisResult( + module_type=self.module_type, + user_id=user_data.user_id, + input_data=input_data, + result=result, + confidence=0.9 if result.get('success', False) else 0.1 + ) + except Exception as e: + self.logger.error(f"处理数据采集请求失败: {e}") + return self._create_error_result(str(e)) + + def _process_questionnaire(self, input_data: Dict, user_data: UserData) -> Dict[str, Any]: + """处理问卷数据""" + questionnaire_type = input_data.get('questionnaire_type', 'basic') + answers = input_data.get('answers', {}) + + # 根据问卷类型处理答案 + if questionnaire_type == 'basic': + processed_data = self._process_basic_questionnaire(answers) + elif questionnaire_type == 'taste': + processed_data = self._process_taste_questionnaire(answers) + elif questionnaire_type == 'physiological': + processed_data = self._process_physiological_questionnaire(answers) + else: + processed_data = answers + + # 更新用户数据 + user_data.profile.update(processed_data) + user_data.updated_at = datetime.now().isoformat() + + return { + 'success': True, + 'processed_data': processed_data, + 'message': f'{questionnaire_type}问卷处理完成' + } + + def _process_meal_record(self, input_data: Dict, user_data: UserData) -> Dict[str, Any]: + """处理餐食记录""" + meal_data = { + 'date': input_data.get('date', datetime.now().strftime('%Y-%m-%d')), + 'meal_type': input_data.get('meal_type', 'unknown'), + 'foods': input_data.get('foods', []), + 'quantities': input_data.get('quantities', []), + 'calories': input_data.get('calories'), + 'satisfaction_score': input_data.get('satisfaction_score'), + 'notes': input_data.get('notes', ''), + 'timestamp': datetime.now().isoformat() + } + + # 添加到用户餐食记录 + user_data.meals.append(meal_data) + user_data.updated_at = datetime.now().isoformat() + + return { + 'success': True, + 'meal_data': meal_data, + 'message': '餐食记录保存成功' + } + + def _process_feedback(self, input_data: Dict, user_data: UserData) -> Dict[str, Any]: + """处理用户反馈""" + feedback_data = { + 'date': input_data.get('date', datetime.now().strftime('%Y-%m-%d')), + 'recommended_foods': input_data.get('recommended_foods', []), + 'user_choice': input_data.get('user_choice', ''), + 'feedback_type': input_data.get('feedback_type', 'unknown'), + 'satisfaction_score': input_data.get('satisfaction_score'), + 'notes': input_data.get('notes', ''), + 'timestamp': datetime.now().isoformat() + } + + # 添加到用户反馈记录 + user_data.feedback.append(feedback_data) + user_data.updated_at = datetime.now().isoformat() + + return { + 'success': True, + 'feedback_data': feedback_data, + 'message': '反馈记录保存成功' + } + + def _process_basic_questionnaire(self, answers: Dict) -> Dict[str, Any]: + """处理基础信息问卷""" + return { + 'name': answers.get('name', ''), + 'age': int(answers.get('age', 0)), + 'gender': answers.get('gender', ''), + 'height': float(answers.get('height', 0)), + 'weight': float(answers.get('weight', 0)), + 'activity_level': answers.get('activity_level', ''), + 'health_goals': answers.get('health_goals', []) + } + + def _process_taste_questionnaire(self, answers: Dict) -> Dict[str, Any]: + """处理口味偏好问卷""" + return { + 'taste_preferences': { + 'sweet': int(answers.get('sweet', 3)), + 'salty': int(answers.get('salty', 3)), + 'spicy': int(answers.get('spicy', 3)), + 'sour': int(answers.get('sour', 3)), + 'bitter': int(answers.get('bitter', 3)), + 'umami': int(answers.get('umami', 3)) + }, + 'dietary_preferences': answers.get('dietary_preferences', []), + 'allergies': answers.get('allergies', []), + 'dislikes': answers.get('dislikes', []) + } + + def _process_physiological_questionnaire(self, answers: Dict) -> Dict[str, Any]: + """处理生理信息问卷""" + return { + 'is_female': answers.get('gender') == '女', + 'menstrual_cycle_length': int(answers.get('menstrual_cycle_length', 28)), + 'last_period_date': answers.get('last_period_date', ''), + 'ovulation_symptoms': answers.get('ovulation_symptoms', []), + 'zodiac_sign': answers.get('zodiac_sign', ''), + 'personality_traits': answers.get('personality_traits', []) + } + + def _load_questionnaire_templates(self) -> Dict[str, Dict]: + """加载问卷模板""" + return { + 'basic': { + 'title': '基本信息问卷', + 'questions': { + 'name': {'question': '您的姓名', 'type': 'text'}, + 'age': {'question': '您的年龄', 'type': 'number', 'min': 1, 'max': 120}, + 'gender': {'question': '性别', 'type': 'select', 'options': ['男', '女']}, + 'height': {'question': '身高 (cm)', 'type': 'number', 'min': 100, 'max': 250}, + 'weight': {'question': '体重 (kg)', 'type': 'number', 'min': 30, 'max': 200}, + 'activity_level': { + 'question': '日常活动水平', + 'type': 'select', + 'options': ['久坐', '轻度活动', '中度活动', '高度活动', '极高活动'] + }, + 'health_goals': { + 'question': '健康目标 (可多选)', + 'type': 'checkbox', + 'options': ['减肥', '增肌', '维持体重', '提高免疫力', '改善消化'] + } + } + }, + 'taste': { + 'title': '口味偏好问卷', + 'questions': { + 'sweet': {'question': '甜味偏好 (1-5分)', 'type': 'scale', 'min': 1, 'max': 5}, + 'salty': {'question': '咸味偏好 (1-5分)', 'type': 'scale', 'min': 1, 'max': 5}, + 'spicy': {'question': '辣味偏好 (1-5分)', 'type': 'scale', 'min': 1, 'max': 5}, + 'sour': {'question': '酸味偏好 (1-5分)', 'type': 'scale', 'min': 1, 'max': 5}, + 'bitter': {'question': '苦味偏好 (1-5分)', 'type': 'scale', 'min': 1, 'max': 5}, + 'umami': {'question': '鲜味偏好 (1-5分)', 'type': 'scale', 'min': 1, 'max': 5}, + 'dietary_preferences': { + 'question': '饮食限制 (可多选)', + 'type': 'checkbox', + 'options': ['素食', '纯素食', '无麸质', '无乳制品', '无坚果', '低钠', '低碳水', '无糖'] + }, + 'allergies': { + 'question': '过敏食物 (可多选)', + 'type': 'checkbox', + 'options': ['花生', '坚果', '海鲜', '鸡蛋', '牛奶', '大豆', '小麦', '无过敏'] + }, + 'dislikes': { + 'question': '不喜欢的食物类型', + 'type': 'checkbox', + 'options': ['内脏', '海鲜', '蘑菇', '香菜', '洋葱', '大蒜', '辛辣食物', '甜食'] + } + } + }, + 'physiological': { + 'title': '生理信息问卷', + 'questions': { + 'menstrual_cycle_length': { + 'question': '月经周期长度 (天)', + 'type': 'number', + 'min': 20, + 'max': 40, + 'optional': True + }, + 'last_period_date': { + 'question': '上次月经日期', + 'type': 'date', + 'optional': True + }, + 'ovulation_symptoms': { + 'question': '排卵期症状 (可多选)', + 'type': 'checkbox', + 'options': ['乳房胀痛', '情绪波动', '食欲变化', '疲劳', '无特殊症状'], + 'optional': True + }, + 'zodiac_sign': { + 'question': '星座', + 'type': 'select', + 'options': ['白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', + '天秤座', '天蝎座', '射手座', '摩羯座', '水瓶座', '双鱼座'], + 'optional': True + }, + 'personality_traits': { + 'question': '性格特征 (可多选)', + 'type': 'checkbox', + 'options': ['外向', '内向', '理性', '感性', '冒险', '保守', '创新', '传统'], + 'optional': True + } + } + } + } + + def get_questionnaire_template(self, questionnaire_type: str) -> Optional[Dict]: + """获取问卷模板""" + return self.questionnaire_templates.get(questionnaire_type) + + def get_all_questionnaire_types(self) -> List[str]: + """获取所有问卷类型""" + return list(self.questionnaire_templates.keys()) + + def _create_error_result(self, error_message: str) -> Dict[str, Any]: + """创建错误结果""" + return { + 'success': False, + 'error': error_message, + 'message': f'数据采集失败: {error_message}' + } + + def cleanup(self) -> bool: + """清理资源""" + try: + self.logger.info("数据采集模块清理完成") + return True + except Exception as e: + self.logger.error(f"数据采集模块清理失败: {e}") + return False + + +# 便捷函数 +def collect_questionnaire_data(user_id: str, questionnaire_type: str, answers: Dict) -> bool: + """收集问卷数据""" + from core.base import get_app_core + + app = get_app_core() + input_data = { + 'type': 'questionnaire', + 'questionnaire_type': questionnaire_type, + 'answers': answers + } + + result = app.process_user_request(ModuleType.DATA_COLLECTION, input_data, user_id) + return result and result.result.get('success', False) + + +def record_meal(user_id: str, meal_data: Dict) -> bool: + """记录餐食""" + from core.base import get_app_core + + app = get_app_core() + input_data = { + 'type': 'meal_record', + **meal_data + } + + result = app.process_user_request(ModuleType.DATA_COLLECTION, input_data, user_id) + return result and result.result.get('success', False) + + +def record_feedback(user_id: str, feedback_data: Dict) -> bool: + """记录反馈""" + from core.base import get_app_core + + app = get_app_core() + input_data = { + 'type': 'feedback', + **feedback_data + } + + result = app.process_user_request(ModuleType.DATA_COLLECTION, input_data, user_id) + return result and result.result.get('success', False) + + +if __name__ == "__main__": + # 测试数据采集模块 + from core.base import BaseConfig, initialize_app, cleanup_app + + print("测试数据采集模块...") + + # 初始化应用 + config = BaseConfig() + if initialize_app(config): + print("✅ 应用初始化成功") + + # 测试问卷数据收集 + test_user_id = "test_user_001" + questionnaire_answers = { + 'name': '小美', + 'age': 25, + 'gender': '女', + 'height': 165, + 'weight': 55, + 'activity_level': '中度活动', + 'health_goals': ['维持体重', '提高免疫力'] + } + + if collect_questionnaire_data(test_user_id, 'basic', questionnaire_answers): + print("✅ 基础问卷数据收集成功") + + # 测试餐食记录 + meal_data = { + 'date': '2024-01-15', + 'meal_type': 'breakfast', + 'foods': ['燕麦粥', '香蕉', '牛奶'], + 'quantities': ['1碗', '1根', '200ml'], + 'calories': 350.0, + 'satisfaction_score': 4, + 'notes': '很满意,营养均衡' + } + + if record_meal(test_user_id, meal_data): + print("✅ 餐食记录成功") + + # 清理应用 + cleanup_app() + print("✅ 应用清理完成") + else: + print("❌ 应用初始化失败") + + print("数据采集模块测试完成!") diff --git a/modules/efficient_data_processing.py b/modules/efficient_data_processing.py new file mode 100644 index 0000000..67931e1 --- /dev/null +++ b/modules/efficient_data_processing.py @@ -0,0 +1,634 @@ +""" +高效数据处理和训练模块 +优化数据处理流程,提高训练效率 +""" + +import pandas as pd +import numpy as np +from typing import Dict, List, Optional, Tuple, Any +import json +import pickle +from pathlib import Path +from datetime import datetime, timedelta +import logging +from concurrent.futures import ThreadPoolExecutor, as_completed +import threading +from collections import defaultdict, Counter + +logger = logging.getLogger(__name__) + + +class EfficientDataProcessor: + """高效数据处理器""" + + def __init__(self, data_dir: str = "data"): + self.data_dir = Path(data_dir) + self.data_dir.mkdir(exist_ok=True) + + # 数据缓存 + self.user_data_cache = {} + self.meal_data_cache = {} + self.feedback_data_cache = {} + + # 预计算数据 + self.food_frequency = {} + self.user_preferences = {} + self.nutrition_patterns = {} + + # 线程锁 + self.cache_lock = threading.Lock() + + # 加载预计算数据 + self._load_precomputed_data() + + def _load_precomputed_data(self): + """加载预计算数据""" + try: + # 加载食物频率 + freq_file = self.data_dir / "food_frequency.pkl" + if freq_file.exists(): + with open(freq_file, 'rb') as f: + self.food_frequency = pickle.load(f) + + # 加载用户偏好 + pref_file = self.data_dir / "user_preferences.pkl" + if pref_file.exists(): + with open(pref_file, 'rb') as f: + self.user_preferences = pickle.load(f) + + # 加载营养模式 + pattern_file = self.data_dir / "nutrition_patterns.pkl" + if pattern_file.exists(): + with open(pattern_file, 'rb') as f: + self.nutrition_patterns = pickle.load(f) + + except Exception as e: + logger.warning(f"加载预计算数据失败: {e}") + + def _save_precomputed_data(self): + """保存预计算数据""" + try: + # 保存食物频率 + freq_file = self.data_dir / "food_frequency.pkl" + with open(freq_file, 'wb') as f: + pickle.dump(self.food_frequency, f) + + # 保存用户偏好 + pref_file = self.data_dir / "user_preferences.pkl" + with open(pref_file, 'wb') as f: + pickle.dump(self.user_preferences, f) + + # 保存营养模式 + pattern_file = self.data_dir / "nutrition_patterns.pkl" + with open(pattern_file, 'wb') as f: + pickle.dump(self.nutrition_patterns, f) + + except Exception as e: + logger.error(f"保存预计算数据失败: {e}") + + def batch_process_user_data(self, user_ids: List[str]) -> Dict[str, Any]: + """批量处理用户数据""" + logger.info(f"开始批量处理 {len(user_ids)} 个用户的数据") + + results = {} + + # 使用线程池并行处理 + with ThreadPoolExecutor(max_workers=4) as executor: + # 提交任务 + future_to_user = { + executor.submit(self._process_single_user, user_id): user_id + for user_id in user_ids + } + + # 收集结果 + for future in as_completed(future_to_user): + user_id = future_to_user[future] + try: + result = future.result() + results[user_id] = result + except Exception as e: + logger.error(f"处理用户 {user_id} 数据失败: {e}") + results[user_id] = {'error': str(e)} + + # 更新预计算数据 + self._update_precomputed_data(results) + + logger.info(f"批量处理完成,成功处理 {len(results)} 个用户") + return results + + def _process_single_user(self, user_id: str) -> Dict[str, Any]: + """处理单个用户数据""" + try: + from core.base import AppCore + + app_core = AppCore() + user_data = app_core.get_user_data(user_id) + + if not user_data: + return {'error': '用户数据不存在'} + + # 处理餐食数据 + meal_analysis = self._analyze_meal_patterns(user_data.meals) + + # 处理反馈数据 + feedback_analysis = self._analyze_feedback_patterns(user_data.feedback) + + # 处理用户偏好 + preference_analysis = self._analyze_user_preferences(user_data) + + # 生成个性化建议 + recommendations = self._generate_personalized_recommendations( + user_data, meal_analysis, feedback_analysis, preference_analysis + ) + + return { + 'user_id': user_id, + 'meal_analysis': meal_analysis, + 'feedback_analysis': feedback_analysis, + 'preference_analysis': preference_analysis, + 'recommendations': recommendations, + 'processed_at': datetime.now().isoformat() + } + + except Exception as e: + logger.error(f"处理用户 {user_id} 数据失败: {e}") + return {'error': str(e)} + + def _analyze_meal_patterns(self, meals: List[Dict]) -> Dict[str, Any]: + """分析餐食模式""" + if not meals: + return {'total_meals': 0, 'patterns': {}} + + # 统计食物频率 + food_counter = Counter() + meal_type_counter = Counter() + satisfaction_scores = [] + calorie_totals = [] + + for meal in meals: + # 统计食物 + for food in meal.get('foods', []): + food_counter[food] += 1 + + # 统计餐次 + meal_type_counter[meal.get('meal_type', 'unknown')] += 1 + + # 收集满意度 + if 'satisfaction_score' in meal: + satisfaction_scores.append(meal['satisfaction_score']) + + # 收集热量 + if 'calories' in meal and meal['calories']: + calorie_totals.append(meal['calories']) + + # 计算统计信息 + avg_satisfaction = np.mean(satisfaction_scores) if satisfaction_scores else 0 + avg_calories = np.mean(calorie_totals) if calorie_totals else 0 + + # 识别模式 + patterns = { + 'favorite_foods': [food for food, count in food_counter.most_common(5)], + 'meal_type_preference': dict(meal_type_counter.most_common()), + 'avg_satisfaction': round(avg_satisfaction, 2), + 'avg_calories': round(avg_calories, 2), + 'total_meals': len(meals), + 'food_diversity': len(food_counter) + } + + return patterns + + def _analyze_feedback_patterns(self, feedbacks: List[Dict]) -> Dict[str, Any]: + """分析反馈模式""" + if not feedbacks: + return {'total_feedback': 0, 'patterns': {}} + + feedback_types = Counter() + user_choices = [] + + for feedback in feedbacks: + feedback_types[feedback.get('feedback_type', 'unknown')] += 1 + if 'user_choice' in feedback: + user_choices.append(feedback['user_choice']) + + patterns = { + 'feedback_distribution': dict(feedback_types.most_common()), + 'total_feedback': len(feedbacks), + 'common_choices': Counter(user_choices).most_common(5) + } + + return patterns + + def _analyze_user_preferences(self, user_data) -> Dict[str, Any]: + """分析用户偏好""" + profile = user_data.profile + + preferences = { + 'basic_info': { + 'age': profile.get('age', 'unknown'), + 'gender': profile.get('gender', 'unknown'), + 'activity_level': profile.get('activity_level', 'unknown') + }, + 'taste_preferences': profile.get('taste_preferences', {}), + 'dietary_restrictions': { + 'allergies': profile.get('allergies', []), + 'dislikes': profile.get('dislikes', []), + 'dietary_preferences': profile.get('dietary_preferences', []) + }, + 'health_goals': profile.get('health_goals', []) + } + + return preferences + + def _generate_personalized_recommendations(self, user_data, meal_analysis, + feedback_analysis, preference_analysis) -> Dict[str, Any]: + """生成个性化建议""" + recommendations = { + 'food_recommendations': [], + 'meal_suggestions': [], + 'health_tips': [], + 'improvement_suggestions': [] + } + + # 基于食物频率推荐 + favorite_foods = meal_analysis.get('favorite_foods', []) + if favorite_foods: + recommendations['food_recommendations'].extend(favorite_foods[:3]) + + # 基于反馈推荐 + feedback_patterns = feedback_analysis.get('feedback_distribution', {}) + if feedback_patterns.get('like', 0) > feedback_patterns.get('dislike', 0): + recommendations['meal_suggestions'].append("继续选择您喜欢的食物") + + # 基于健康目标推荐 + health_goals = preference_analysis.get('health_goals', []) + if '减重' in health_goals: + recommendations['health_tips'].append("建议增加蔬菜摄入,减少高热量食物") + elif '增重' in health_goals: + recommendations['health_tips'].append("建议增加蛋白质和健康脂肪摄入") + + # 基于满意度推荐 + avg_satisfaction = meal_analysis.get('avg_satisfaction', 0) + if avg_satisfaction < 3: + recommendations['improvement_suggestions'].append("尝试新的食物组合以提高满意度") + + return recommendations + + def _update_precomputed_data(self, results: Dict[str, Any]): + """更新预计算数据""" + with self.cache_lock: + # 更新食物频率 + for user_id, result in results.items(): + if 'error' in result: + continue + + meal_analysis = result.get('meal_analysis', {}) + favorite_foods = meal_analysis.get('favorite_foods', []) + + for food in favorite_foods: + self.food_frequency[food] = self.food_frequency.get(food, 0) + 1 + + # 更新用户偏好 + for user_id, result in results.items(): + if 'error' in result: + continue + + preference_analysis = result.get('preference_analysis', {}) + self.user_preferences[user_id] = preference_analysis + + # 更新营养模式 + for user_id, result in results.items(): + if 'error' in result: + continue + + meal_analysis = result.get('meal_analysis', {}) + self.nutrition_patterns[user_id] = { + 'avg_calories': meal_analysis.get('avg_calories', 0), + 'avg_satisfaction': meal_analysis.get('avg_satisfaction', 0), + 'food_diversity': meal_analysis.get('food_diversity', 0) + } + + # 保存预计算数据 + self._save_precomputed_data() + + def get_popular_foods(self, limit: int = 10) -> List[Tuple[str, int]]: + """获取热门食物""" + return sorted(self.food_frequency.items(), key=lambda x: x[1], reverse=True)[:limit] + + def get_user_similarity(self, user_id: str) -> List[Tuple[str, float]]: + """获取相似用户""" + if user_id not in self.user_preferences: + return [] + + target_prefs = self.user_preferences[user_id] + similarities = [] + + for other_user_id, other_prefs in self.user_preferences.items(): + if other_user_id == user_id: + continue + + # 计算相似度(简化版本) + similarity = self._calculate_preference_similarity(target_prefs, other_prefs) + similarities.append((other_user_id, similarity)) + + return sorted(similarities, key=lambda x: x[1], reverse=True)[:5] + + def _calculate_preference_similarity(self, prefs1: Dict, prefs2: Dict) -> float: + """计算偏好相似度""" + # 简化的相似度计算 + score = 0.0 + total = 0.0 + + # 比较基本特征 + basic1 = prefs1.get('basic_info', {}) + basic2 = prefs2.get('basic_info', {}) + + if basic1.get('gender') == basic2.get('gender'): + score += 0.3 + total += 0.3 + + if basic1.get('activity_level') == basic2.get('activity_level'): + score += 0.2 + total += 0.2 + + # 比较口味偏好 + taste1 = prefs1.get('taste_preferences', {}) + taste2 = prefs2.get('taste_preferences', {}) + + for key in taste1: + if key in taste2 and taste1[key] == taste2[key]: + score += 0.1 + total += 0.1 + + return score / total if total > 0 else 0.0 + + def export_analysis_report(self, user_id: str, output_file: str = None) -> str: + """导出分析报告""" + if not output_file: + output_file = self.data_dir / f"analysis_report_{user_id}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json" + + try: + # 获取用户数据 + from core.base import AppCore + app_core = AppCore() + user_data = app_core.get_user_data(user_id) + + if not user_data: + raise ValueError("用户数据不存在") + + # 生成分析报告 + report = { + 'user_id': user_id, + 'generated_at': datetime.now().isoformat(), + 'user_profile': user_data.profile, + 'meal_statistics': self._analyze_meal_patterns(user_data.meals), + 'feedback_statistics': self._analyze_feedback_patterns(user_data.feedback), + 'recommendations': self._generate_personalized_recommendations( + user_data, + self._analyze_meal_patterns(user_data.meals), + self._analyze_feedback_patterns(user_data.feedback), + self._analyze_user_preferences(user_data) + ), + 'similar_users': self.get_user_similarity(user_id), + 'popular_foods': self.get_popular_foods(10) + } + + # 保存报告 + with open(output_file, 'w', encoding='utf-8') as f: + json.dump(report, f, ensure_ascii=False, indent=2) + + logger.info(f"分析报告已导出到: {output_file}") + return str(output_file) + + except Exception as e: + logger.error(f"导出分析报告失败: {e}") + raise + + +class FastTrainingPipeline: + """快速训练管道""" + + def __init__(self, data_processor: EfficientDataProcessor): + self.data_processor = data_processor + self.models = {} + self.training_cache = {} + self._background_thread: threading.Thread | None = None + self._stop_event = threading.Event() + + def train_recommendation_model(self, user_ids: List[str]) -> Dict[str, Any]: + """训练推荐模型""" + logger.info(f"开始训练推荐模型,用户数量: {len(user_ids)}") + + # 批量处理用户数据 + processed_data = self.data_processor.batch_process_user_data(user_ids) + + # 提取特征 + features = self._extract_features(processed_data) + + # 训练模型(简化版本) + model_results = self._train_simple_recommendation_model(features) + + # 缓存模型 + self.models['recommendation'] = model_results + + logger.info("推荐模型训练完成") + return model_results + + def start_background_training(self, user_ids_provider=None, interval_minutes: int = 60) -> None: + """后台周期训练。 + user_ids_provider: 可选的函数,返回需要训练的user_id列表;若为空则从预计算偏好中取键。 + """ + if self._background_thread and self._background_thread.is_alive(): + return + + self._stop_event.clear() + + def _loop(): + while not self._stop_event.is_set(): + try: + if user_ids_provider is not None: + user_ids = list(user_ids_provider()) or list(self.data_processor.user_preferences.keys()) + else: + user_ids = list(self.data_processor.user_preferences.keys()) + if user_ids: + self.train_recommendation_model(user_ids) + except Exception as e: + logger.warning(f"后台训练失败: {e}") + finally: + self._stop_event.wait(interval_minutes * 60) + + self._background_thread = threading.Thread(target=_loop, daemon=True) + self._background_thread.start() + + def stop_background_training(self) -> None: + """停止后台训练""" + self._stop_event.set() + if self._background_thread and self._background_thread.is_alive(): + self._background_thread.join(timeout=1.0) + + def _extract_features(self, processed_data: Dict[str, Any]) -> Dict[str, Any]: + """提取特征""" + features = { + 'user_features': {}, + 'food_features': {}, + 'interaction_features': {} + } + + for user_id, data in processed_data.items(): + if 'error' in data: + continue + + # 用户特征 + preference_analysis = data.get('preference_analysis', {}) + features['user_features'][user_id] = { + 'age': preference_analysis.get('basic_info', {}).get('age', 25), + 'gender': preference_analysis.get('basic_info', {}).get('gender', 'unknown'), + 'activity_level': preference_analysis.get('basic_info', {}).get('activity_level', 'moderate') + } + + # 食物特征 + meal_analysis = data.get('meal_analysis', {}) + favorite_foods = meal_analysis.get('favorite_foods', []) + for food in favorite_foods: + if food not in features['food_features']: + features['food_features'][food] = 0 + features['food_features'][food] += 1 + + # 交互特征 + features['interaction_features'][user_id] = { + 'avg_satisfaction': meal_analysis.get('avg_satisfaction', 0), + 'avg_calories': meal_analysis.get('avg_calories', 0), + 'food_diversity': meal_analysis.get('food_diversity', 0) + } + + return features + + def _train_simple_recommendation_model(self, features: Dict[str, Any]) -> Dict[str, Any]: + """训练简单推荐模型""" + # 这里是一个简化的推荐模型 + # 在实际应用中,可以使用更复杂的机器学习算法 + + model_results = { + 'model_type': 'simple_collaborative_filtering', + 'trained_at': datetime.now().isoformat(), + 'user_count': len(features['user_features']), + 'food_count': len(features['food_features']), + 'recommendation_rules': self._generate_recommendation_rules(features), + 'performance_metrics': { + 'accuracy': 0.75, # 模拟指标 + 'precision': 0.72, + 'recall': 0.68, + 'f1_score': 0.70 + } + } + + return model_results + + def _generate_recommendation_rules(self, features: Dict[str, Any]) -> List[Dict[str, Any]]: + """生成推荐规则""" + rules = [] + + # 基于食物频率的规则 + food_features = features['food_features'] + popular_foods = sorted(food_features.items(), key=lambda x: x[1], reverse=True)[:10] + + for food, count in popular_foods: + rules.append({ + 'type': 'popular_food', + 'condition': f"food_popularity >= {count}", + 'recommendation': f"推荐 {food}", + 'confidence': min(count / 10.0, 1.0) + }) + + # 基于用户特征的规则 + user_features = features['user_features'] + for user_id, user_feat in user_features.items(): + if user_feat['gender'] == '女': + rules.append({ + 'type': 'gender_based', + 'condition': f"gender == '女'", + 'recommendation': "推荐富含铁质的食物", + 'confidence': 0.8 + }) + + return rules + + def predict_recommendations(self, user_id: str, meal_type: str = "lunch") -> List[Dict[str, Any]]: + """预测推荐""" + if 'recommendation' not in self.models: + return [] + + # 获取用户数据 + from core.base import AppCore + app_core = AppCore() + user_data = app_core.get_user_data(user_id) + + if not user_data: + return [] + + # 基于规则生成推荐 + recommendations = [] + rules = self.models['recommendation'].get('recommendation_rules', []) + + for rule in rules: + if self._evaluate_rule(rule, user_data): + recommendations.append({ + 'food': rule['recommendation'], + 'confidence': rule['confidence'], + 'reason': rule['type'] + }) + + return recommendations[:5] # 返回前5个推荐 + + def _evaluate_rule(self, rule: Dict[str, Any], user_data) -> bool: + """评估规则""" + # 简化的规则评估 + rule_type = rule.get('type', '') + + if rule_type == 'popular_food': + return True # 总是推荐热门食物 + elif rule_type == 'gender_based': + return user_data.profile.get('gender') == '女' + + return False + + +# 全局实例 +data_processor = EfficientDataProcessor() +training_pipeline = FastTrainingPipeline(data_processor) + + +# 便捷函数 +def batch_process_users(user_ids: List[str]) -> Dict[str, Any]: + """批量处理用户数据""" + return data_processor.batch_process_user_data(user_ids) + + +def train_recommendation_model(user_ids: List[str]) -> Dict[str, Any]: + """训练推荐模型""" + return training_pipeline.train_recommendation_model(user_ids) + + +def get_user_recommendations(user_id: str, meal_type: str = "lunch") -> List[Dict[str, Any]]: + """获取用户推荐""" + return training_pipeline.predict_recommendations(user_id, meal_type) + + +def export_user_report(user_id: str, output_file: str = None) -> str: + """导出用户报告""" + return data_processor.export_analysis_report(user_id, output_file) + + +if __name__ == "__main__": + # 测试数据处理 + print("测试高效数据处理...") + + # 测试批量处理 + test_users = ["user1", "user2", "user3"] + results = batch_process_users(test_users) + print(f"批量处理结果: {len(results)} 个用户") + + # 测试训练 + model_results = train_recommendation_model(test_users) + print(f"模型训练完成: {model_results['model_type']}") + + print("测试完成!") diff --git a/modules/ocr_calorie_recognition.py b/modules/ocr_calorie_recognition.py new file mode 100644 index 0000000..55aeae0 --- /dev/null +++ b/modules/ocr_calorie_recognition.py @@ -0,0 +1,786 @@ +""" +图片OCR热量识别模块 - 基于基座架构 +支持多种OCR技术识别食物热量信息,包含智能验证和修正机制 +""" + +import cv2 +import numpy as np +import re +import json +import logging +from typing import Dict, List, Optional, Any, Tuple +from dataclasses import dataclass +from datetime import datetime +from pathlib import Path +import requests +import base64 +from PIL import Image, ImageEnhance, ImageFilter +import pytesseract +from core.base import BaseModule, ModuleType, UserData, AnalysisResult, BaseConfig + +logger = logging.getLogger(__name__) + + +@dataclass +class OCRResult: + """OCR识别结果""" + text: str + confidence: float + bounding_boxes: List[Dict[str, Any]] + processing_time: float + method: str + + +@dataclass +class CalorieInfo: + """热量信息""" + food_name: str + calories: Optional[float] + serving_size: Optional[str] + confidence: float + source: str # 'ocr', 'database', 'user_confirmed' + raw_text: str + validation_status: str # 'pending', 'validated', 'corrected' + + +@dataclass +class FoodRecognitionResult: + """食物识别结果""" + image_path: str + ocr_results: List[OCRResult] + calorie_infos: List[CalorieInfo] + overall_confidence: float + processing_time: float + suggestions: List[str] + + +class OCRCalorieRecognitionModule(BaseModule): + """OCR热量识别模块""" + + def __init__(self, config: BaseConfig): + super().__init__(config, ModuleType.DATA_COLLECTION) + + # OCR配置 + self.ocr_methods = ['tesseract', 'paddleocr', 'easyocr'] + self.min_confidence = 0.6 + self.max_processing_time = 30.0 + + # 热量识别模式 + self.calorie_patterns = [ + r'(\d+(?:\.\d+)?)\s*[kK]?[cC][aA][lL](?:ories?)?', + r'(\d+(?:\.\d+)?)\s*[kK][cC][aA][lL]', + r'(\d+(?:\.\d+)?)\s*卡路里', + r'(\d+(?:\.\d+)?)\s*千卡', + r'(\d+(?:\.\d+)?)\s*大卡', + r'(\d+(?:\.\d+)?)\s*[kK][jJ]', # 千焦 + ] + + # 食物名称模式 + self.food_patterns = [ + r'([a-zA-Z\u4e00-\u9fff]+)\s*(?:\d+(?:\.\d+)?)', + r'(\d+(?:\.\d+)?)\s*([a-zA-Z\u4e00-\u9fff]+)', + ] + + # 食物数据库 + self.food_database = self._load_food_database() + + # 用户学习数据 + self.user_corrections = {} + + # 初始化OCR引擎 + self.ocr_engines = {} + self._initialize_ocr_engines() + + def initialize(self) -> bool: + """初始化模块""" + try: + self.logger.info("OCR热量识别模块初始化中...") + + # 创建必要的目录 + self._create_directories() + + # 加载用户学习数据 + self._load_user_corrections() + + self.is_initialized = True + self.logger.info("OCR热量识别模块初始化完成") + return True + except Exception as e: + self.logger.error(f"OCR热量识别模块初始化失败: {e}") + return False + + def process(self, input_data: Any, user_data: UserData) -> AnalysisResult: + """处理OCR识别请求""" + try: + request_type = input_data.get('type', 'unknown') + + if request_type == 'recognize_image': + result = self._recognize_image_calories(input_data, user_data) + elif request_type == 'validate_result': + result = self._validate_recognition_result(input_data, user_data) + elif request_type == 'learn_correction': + result = self._learn_from_correction(input_data, user_data) + else: + result = self._create_error_result("未知的请求类型") + + return AnalysisResult( + module_type=self.module_type, + user_id=user_data.user_id, + input_data=input_data, + result=result, + confidence=result.get('confidence', 0.5) + ) + except Exception as e: + self.logger.error(f"OCR识别处理失败: {e}") + return self._create_error_result(f"处理失败: {str(e)}") + + def _recognize_image_calories(self, input_data: Dict[str, Any], user_data: UserData) -> Dict[str, Any]: + """识别图片中的热量信息""" + start_time = datetime.now() + + try: + image_path = input_data.get('image_path') + if not image_path or not Path(image_path).exists(): + return self._create_error_result("图片文件不存在") + + # 预处理图片 + processed_image = self._preprocess_image(image_path) + + # 多OCR引擎识别 + ocr_results = [] + for method in self.ocr_methods: + try: + result = self._ocr_recognize(processed_image, method) + if result: + ocr_results.append(result) + except Exception as e: + self.logger.warning(f"OCR方法 {method} 失败: {e}") + + # 合并和去重OCR结果 + merged_text = self._merge_ocr_results(ocr_results) + + # 提取热量信息 + calorie_infos = self._extract_calorie_info(merged_text, user_data) + + # 数据库匹配和验证 + validated_infos = self._validate_with_database(calorie_infos, user_data) + + # 生成建议 + suggestions = self._generate_suggestions(validated_infos, user_data) + + processing_time = (datetime.now() - start_time).total_seconds() + + result = FoodRecognitionResult( + image_path=image_path, + ocr_results=ocr_results, + calorie_infos=validated_infos, + overall_confidence=self._calculate_overall_confidence(ocr_results, validated_infos), + processing_time=processing_time, + suggestions=suggestions + ) + + return { + 'success': True, + 'result': result, + 'confidence': result.overall_confidence, + 'message': f"识别完成,处理时间: {processing_time:.2f}秒" + } + + except Exception as e: + self.logger.error(f"图片热量识别失败: {e}") + return self._create_error_result(f"识别失败: {str(e)}") + + def _preprocess_image(self, image_path: str) -> np.ndarray: + """预处理图片以提高OCR准确性""" + try: + # 读取图片 + image = cv2.imread(image_path) + if image is None: + raise ValueError("无法读取图片") + + # 转换为灰度图 + gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + + # 降噪 + denoised = cv2.medianBlur(gray, 3) + + # 增强对比度 + clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) + enhanced = clahe.apply(denoised) + + # 二值化 + _, binary = cv2.threshold(enhanced, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) + + # 形态学操作 + kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) + cleaned = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) + + return cleaned + + except Exception as e: + self.logger.error(f"图片预处理失败: {e}") + return cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) + + def _ocr_recognize(self, image: np.ndarray, method: str) -> Optional[OCRResult]: + """使用指定方法进行OCR识别""" + start_time = datetime.now() + + try: + if method == 'tesseract': + return self._tesseract_ocr(image) + elif method == 'paddleocr': + return self._paddleocr_recognize(image) + elif method == 'easyocr': + return self._easyocr_recognize(image) + else: + return None + + except Exception as e: + self.logger.error(f"OCR方法 {method} 失败: {e}") + return None + + def _tesseract_ocr(self, image: np.ndarray) -> OCRResult: + """使用Tesseract进行OCR识别""" + try: + # 配置Tesseract + config = '--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\u4e00-\u9fff' + + # OCR识别 + text = pytesseract.image_to_string(image, config=config, lang='chi_sim+eng') + + # 获取置信度 + data = pytesseract.image_to_data(image, output_type=pytesseract.Output.DICT, config=config, lang='chi_sim+eng') + confidences = [int(conf) for conf in data['conf'] if int(conf) > 0] + avg_confidence = sum(confidences) / len(confidences) / 100.0 if confidences else 0.0 + + # 获取边界框 + bounding_boxes = [] + for i in range(len(data['text'])): + if int(data['conf'][i]) > 0: + bounding_boxes.append({ + 'text': data['text'][i], + 'confidence': int(data['conf'][i]) / 100.0, + 'bbox': [data['left'][i], data['top'][i], data['width'][i], data['height'][i]] + }) + + processing_time = (datetime.now() - datetime.now()).total_seconds() + + return OCRResult( + text=text.strip(), + confidence=avg_confidence, + bounding_boxes=bounding_boxes, + processing_time=processing_time, + method='tesseract' + ) + + except Exception as e: + self.logger.error(f"Tesseract OCR失败: {e}") + return None + + def _paddleocr_recognize(self, image: np.ndarray) -> Optional[OCRResult]: + """使用PaddleOCR进行识别""" + try: + # 这里需要安装paddleocr: pip install paddleocr + from paddleocr import PaddleOCR + + if 'paddleocr' not in self.ocr_engines: + self.ocr_engines['paddleocr'] = PaddleOCR(use_angle_cls=True, lang='ch') + + ocr = self.ocr_engines['paddleocr'] + result = ocr.ocr(image, cls=True) + + if not result or not result[0]: + return None + + # 提取文本和置信度 + texts = [] + confidences = [] + bounding_boxes = [] + + for line in result[0]: + if line: + bbox, (text, confidence) = line + texts.append(text) + confidences.append(confidence) + bounding_boxes.append({ + 'text': text, + 'confidence': confidence, + 'bbox': bbox + }) + + merged_text = ' '.join(texts) + avg_confidence = sum(confidences) / len(confidences) if confidences else 0.0 + + return OCRResult( + text=merged_text, + confidence=avg_confidence, + bounding_boxes=bounding_boxes, + processing_time=0.0, + method='paddleocr' + ) + + except ImportError: + self.logger.warning("PaddleOCR未安装,跳过此方法") + return None + except Exception as e: + self.logger.error(f"PaddleOCR识别失败: {e}") + return None + + def _easyocr_recognize(self, image: np.ndarray) -> Optional[OCRResult]: + """使用EasyOCR进行识别""" + try: + # 这里需要安装easyocr: pip install easyocr + import easyocr + + if 'easyocr' not in self.ocr_engines: + self.ocr_engines['easyocr'] = easyocr.Reader(['ch_sim', 'en']) + + reader = self.ocr_engines['easyocr'] + result = reader.readtext(image) + + if not result: + return None + + # 提取文本和置信度 + texts = [] + confidences = [] + bounding_boxes = [] + + for bbox, text, confidence in result: + texts.append(text) + confidences.append(confidence) + bounding_boxes.append({ + 'text': text, + 'confidence': confidence, + 'bbox': bbox + }) + + merged_text = ' '.join(texts) + avg_confidence = sum(confidences) / len(confidences) if confidences else 0.0 + + return OCRResult( + text=merged_text, + confidence=avg_confidence, + bounding_boxes=bounding_boxes, + processing_time=0.0, + method='easyocr' + ) + + except ImportError: + self.logger.warning("EasyOCR未安装,跳过此方法") + return None + except Exception as e: + self.logger.error(f"EasyOCR识别失败: {e}") + return None + + def _merge_ocr_results(self, ocr_results: List[OCRResult]) -> str: + """合并多个OCR结果""" + if not ocr_results: + return "" + + # 按置信度排序 + sorted_results = sorted(ocr_results, key=lambda x: x.confidence, reverse=True) + + # 使用最高置信度的结果作为主要结果 + primary_result = sorted_results[0] + + # 如果有多个高置信度结果,尝试合并 + if len(sorted_results) > 1 and sorted_results[1].confidence > 0.7: + # 简单的文本合并策略 + merged_text = self._smart_text_merge([r.text for r in sorted_results[:3]]) + return merged_text + + return primary_result.text + + def _smart_text_merge(self, texts: List[str]) -> str: + """智能文本合并""" + if not texts: + return "" + + if len(texts) == 1: + return texts[0] + + # 简单的合并策略:选择最长的文本 + return max(texts, key=len) + + def _extract_calorie_info(self, text: str, user_data: UserData) -> List[CalorieInfo]: + """从文本中提取热量信息""" + calorie_infos = [] + + try: + # 查找热量数值 + for pattern in self.calorie_patterns: + matches = re.finditer(pattern, text, re.IGNORECASE) + for match in matches: + calories = float(match.group(1)) + + # 查找对应的食物名称 + food_name = self._extract_food_name(text, match.start()) + + calorie_info = CalorieInfo( + food_name=food_name, + calories=calories, + serving_size=None, + confidence=0.8, # OCR基础置信度 + source='ocr', + raw_text=match.group(0), + validation_status='pending' + ) + + calorie_infos.append(calorie_info) + + # 如果没有找到热量信息,尝试查找食物名称 + if not calorie_infos: + food_names = self._extract_all_food_names(text) + for food_name in food_names: + calorie_info = CalorieInfo( + food_name=food_name, + calories=None, + serving_size=None, + confidence=0.6, + source='ocr', + raw_text=food_name, + validation_status='pending' + ) + calorie_infos.append(calorie_info) + + return calorie_infos + + except Exception as e: + self.logger.error(f"热量信息提取失败: {e}") + return [] + + def _extract_food_name(self, text: str, calorie_position: int) -> str: + """提取食物名称""" + try: + # 在热量数值前后查找食物名称 + context_start = max(0, calorie_position - 50) + context_end = min(len(text), calorie_position + 50) + context = text[context_start:context_end] + + # 查找中文和英文食物名称 + food_pattern = r'([a-zA-Z\u4e00-\u9fff]{2,20})' + matches = re.findall(food_pattern, context) + + if matches: + # 选择最可能的食物名称 + return matches[0] + + return "未知食物" + + except Exception as e: + self.logger.error(f"食物名称提取失败: {e}") + return "未知食物" + + def _extract_all_food_names(self, text: str) -> List[str]: + """提取所有可能的食物名称""" + try: + food_pattern = r'([a-zA-Z\u4e00-\u9fff]{2,20})' + matches = re.findall(food_pattern, text) + + # 去重并过滤 + unique_foods = list(set(matches)) + return unique_foods[:5] # 最多返回5个 + + except Exception as e: + self.logger.error(f"食物名称提取失败: {e}") + return [] + + def _validate_with_database(self, calorie_infos: List[CalorieInfo], user_data: UserData) -> List[CalorieInfo]: + """使用数据库验证热量信息""" + validated_infos = [] + + for info in calorie_infos: + try: + # 在食物数据库中查找匹配 + db_match = self._find_database_match(info.food_name) + + if db_match: + # 使用数据库信息更新 + info.calories = db_match.get('calories', info.calories) + info.serving_size = db_match.get('serving_size', info.serving_size) + info.confidence = max(info.confidence, 0.9) + info.source = 'database' + + # 应用用户学习数据 + user_correction = self._get_user_correction(user_data.user_id, info.food_name) + if user_correction: + info.calories = user_correction.get('calories', info.calories) + info.confidence = max(info.confidence, 0.95) + info.source = 'user_confirmed' + + validated_infos.append(info) + + except Exception as e: + self.logger.error(f"数据库验证失败: {e}") + validated_infos.append(info) + + return validated_infos + + def _find_database_match(self, food_name: str) -> Optional[Dict[str, Any]]: + """在数据库中查找食物匹配""" + try: + # 精确匹配 + if food_name in self.food_database: + return self.food_database[food_name] + + # 模糊匹配 + for db_food, info in self.food_database.items(): + if food_name in db_food or db_food in food_name: + return info + + return None + + except Exception as e: + self.logger.error(f"数据库匹配失败: {e}") + return None + + def _get_user_correction(self, user_id: str, food_name: str) -> Optional[Dict[str, Any]]: + """获取用户修正数据""" + try: + user_data = self.user_corrections.get(user_id, {}) + return user_data.get(food_name) + except Exception as e: + self.logger.error(f"获取用户修正数据失败: {e}") + return None + + def _generate_suggestions(self, calorie_infos: List[CalorieInfo], user_data: UserData) -> List[str]: + """生成建议""" + suggestions = [] + + try: + for info in calorie_infos: + if info.calories is None: + suggestions.append(f"未识别到 {info.food_name} 的热量信息,请手动输入") + elif info.confidence < 0.8: + suggestions.append(f"{info.food_name} 的热量 {info.calories} 可能不准确,请确认") + else: + suggestions.append(f"{info.food_name}: {info.calories} 卡路里") + + if not calorie_infos: + suggestions.append("未识别到任何食物信息,请检查图片质量或手动输入") + + return suggestions + + except Exception as e: + self.logger.error(f"生成建议失败: {e}") + return ["识别过程中出现错误"] + + def _calculate_overall_confidence(self, ocr_results: List[OCRResult], calorie_infos: List[CalorieInfo]) -> float: + """计算整体置信度""" + try: + if not ocr_results and not calorie_infos: + return 0.0 + + # OCR置信度 + ocr_confidence = sum(r.confidence for r in ocr_results) / len(ocr_results) if ocr_results else 0.0 + + # 热量信息置信度 + calorie_confidence = sum(info.confidence for info in calorie_infos) / len(calorie_infos) if calorie_infos else 0.0 + + # 综合置信度 + overall_confidence = (ocr_confidence * 0.4 + calorie_confidence * 0.6) + + return min(overall_confidence, 1.0) + + except Exception as e: + self.logger.error(f"计算置信度失败: {e}") + return 0.0 + + def _validate_recognition_result(self, input_data: Dict[str, Any], user_data: UserData) -> Dict[str, Any]: + """验证识别结果""" + try: + food_name = input_data.get('food_name') + calories = input_data.get('calories') + is_correct = input_data.get('is_correct', True) + + if not is_correct: + # 用户修正 + corrected_calories = input_data.get('corrected_calories') + self._save_user_correction(user_data.user_id, food_name, corrected_calories) + + return { + 'success': True, + 'message': '验证结果已保存', + 'confidence': 1.0 + } + + except Exception as e: + self.logger.error(f"验证识别结果失败: {e}") + return self._create_error_result(f"验证失败: {str(e)}") + + def _learn_from_correction(self, input_data: Dict[str, Any], user_data: UserData) -> Dict[str, Any]: + """从用户修正中学习""" + try: + food_name = input_data.get('food_name') + corrected_calories = input_data.get('corrected_calories') + + self._save_user_correction(user_data.user_id, food_name, corrected_calories) + + return { + 'success': True, + 'message': '学习数据已保存', + 'confidence': 1.0 + } + + except Exception as e: + self.logger.error(f"学习修正数据失败: {e}") + return self._create_error_result(f"学习失败: {str(e)}") + + def _save_user_correction(self, user_id: str, food_name: str, calories: float): + """保存用户修正数据""" + try: + if user_id not in self.user_corrections: + self.user_corrections[user_id] = {} + + self.user_corrections[user_id][food_name] = { + 'calories': calories, + 'timestamp': datetime.now().isoformat(), + 'correction_count': self.user_corrections[user_id].get(food_name, {}).get('correction_count', 0) + 1 + } + + # 保存到文件 + self._save_user_corrections_to_file() + + except Exception as e: + self.logger.error(f"保存用户修正数据失败: {e}") + + def _load_food_database(self) -> Dict[str, Dict[str, Any]]: + """加载食物数据库""" + try: + # 基础食物数据库 + food_db = { + "米饭": {"calories": 130, "serving_size": "100g"}, + "面条": {"calories": 110, "serving_size": "100g"}, + "馒头": {"calories": 221, "serving_size": "100g"}, + "包子": {"calories": 250, "serving_size": "100g"}, + "饺子": {"calories": 250, "serving_size": "100g"}, + "鸡蛋": {"calories": 155, "serving_size": "100g"}, + "豆腐": {"calories": 76, "serving_size": "100g"}, + "鱼肉": {"calories": 206, "serving_size": "100g"}, + "鸡肉": {"calories": 165, "serving_size": "100g"}, + "瘦肉": {"calories": 250, "serving_size": "100g"}, + "青菜": {"calories": 25, "serving_size": "100g"}, + "西红柿": {"calories": 18, "serving_size": "100g"}, + "胡萝卜": {"calories": 41, "serving_size": "100g"}, + "土豆": {"calories": 77, "serving_size": "100g"}, + "西兰花": {"calories": 34, "serving_size": "100g"}, + "苹果": {"calories": 52, "serving_size": "100g"}, + "香蕉": {"calories": 89, "serving_size": "100g"}, + "橙子": {"calories": 47, "serving_size": "100g"}, + "葡萄": {"calories": 67, "serving_size": "100g"}, + "草莓": {"calories": 32, "serving_size": "100g"}, + "牛奶": {"calories": 42, "serving_size": "100ml"}, + "酸奶": {"calories": 59, "serving_size": "100g"}, + "豆浆": {"calories": 31, "serving_size": "100ml"}, + "坚果": {"calories": 607, "serving_size": "100g"}, + "红枣": {"calories": 264, "serving_size": "100g"}, + } + + # 尝试从文件加载扩展数据库 + db_file = Path("data/food_database.json") + if db_file.exists(): + with open(db_file, 'r', encoding='utf-8') as f: + extended_db = json.load(f) + food_db.update(extended_db) + + return food_db + + except Exception as e: + self.logger.error(f"加载食物数据库失败: {e}") + return {} + + def _create_directories(self): + """创建必要的目录""" + directories = [ + 'data/ocr_cache', + 'data/user_corrections', + 'data/food_images' + ] + + for directory in directories: + Path(directory).mkdir(parents=True, exist_ok=True) + + def _load_user_corrections(self): + """加载用户修正数据""" + try: + corrections_file = Path("data/user_corrections.json") + if corrections_file.exists(): + with open(corrections_file, 'r', encoding='utf-8') as f: + self.user_corrections = json.load(f) + else: + self.user_corrections = {} + except Exception as e: + self.logger.error(f"加载用户修正数据失败: {e}") + self.user_corrections = {} + + def _save_user_corrections_to_file(self): + """保存用户修正数据到文件""" + try: + corrections_file = Path("data/user_corrections.json") + with open(corrections_file, 'w', encoding='utf-8') as f: + json.dump(self.user_corrections, f, ensure_ascii=False, indent=2) + except Exception as e: + self.logger.error(f"保存用户修正数据失败: {e}") + + def _initialize_ocr_engines(self): + """初始化OCR引擎""" + try: + # 检查Tesseract是否可用 + try: + pytesseract.get_tesseract_version() + self.logger.info("Tesseract OCR引擎可用") + except Exception: + self.logger.warning("Tesseract OCR引擎不可用") + + # 其他OCR引擎将在需要时初始化 + self.logger.info("OCR引擎初始化完成") + + except Exception as e: + self.logger.error(f"OCR引擎初始化失败: {e}") + + def _create_error_result(self, message: str) -> Dict[str, Any]: + """创建错误结果""" + return { + 'success': False, + 'error': message, + 'confidence': 0.0 + } + + def cleanup(self) -> bool: + """清理资源""" + try: + # 保存用户修正数据 + self._save_user_corrections_to_file() + + # 清理OCR引擎 + self.ocr_engines.clear() + + self.is_initialized = False + self.logger.info("OCR热量识别模块清理完成") + return True + except Exception as e: + self.logger.error(f"OCR热量识别模块清理失败: {e}") + return False + + +if __name__ == "__main__": + # 测试OCR模块 + from core.base import BaseConfig + + config = BaseConfig() + ocr_module = OCRCalorieRecognitionModule(config) + + if ocr_module.initialize(): + print("OCR模块初始化成功") + + # 测试图片识别 + test_data = { + 'type': 'recognize_image', + 'image_path': 'test_image.jpg' # 需要提供测试图片 + } + + # 这里需要用户数据,暂时跳过实际测试 + print("OCR模块测试完成") + else: + print("OCR模块初始化失败") diff --git a/modules/recommendation_engine.py b/modules/recommendation_engine.py new file mode 100644 index 0000000..0a93151 --- /dev/null +++ b/modules/recommendation_engine.py @@ -0,0 +1,1016 @@ +""" +推荐引擎模块 - 基于基座架构 +结合机器学习和AI分析的混合推荐系统 +""" + +from typing import Dict, List, Optional, Any, Tuple +import json +import numpy as np +from sklearn.feature_extraction.text import TfidfVectorizer +from sklearn.metrics.pairwise import cosine_similarity +from sklearn.cluster import KMeans +from sklearn.preprocessing import StandardScaler +import joblib +from datetime import datetime, timedelta +from core.base import BaseModule, ModuleType, UserData, AnalysisResult, BaseConfig +from pathlib import Path +import logging + +logger = logging.getLogger(__name__) + + +class RecommendationEngine(BaseModule): + """推荐引擎模块""" + + def __init__(self, config: BaseConfig): + super().__init__(config, ModuleType.RECOMMENDATION) + self.model_path = Path(config.model_path) + self.model_path.mkdir(parents=True, exist_ok=True) + + # 推荐模型组件 + self.tfidf_vectorizer = None + self.user_clustering_model = None + self.food_similarity_matrix = None + self.user_preference_model = None + + # 食物数据库 + self.food_database = self._load_food_database() + + # 餐食搭配模板 + self.meal_templates = self._load_meal_templates() + + # 推荐配置 + self.max_recommendations = config.max_recommendations + self.min_training_samples = config.min_training_samples + self.model_update_threshold = config.model_update_threshold + + def initialize(self) -> bool: + """初始化推荐引擎""" + try: + self.logger.info("推荐引擎初始化中...") + + # 加载或训练模型 + self._load_or_train_models() + + self.is_initialized = True + self.logger.info("推荐引擎初始化完成") + return True + except Exception as e: + self.logger.error(f"推荐引擎初始化失败: {e}") + return False + + def process(self, input_data: Any, user_data: UserData) -> AnalysisResult: + """处理推荐请求""" + try: + recommendation_type = input_data.get('type', 'meal_recommendation') + + if recommendation_type == 'meal_recommendation': + result = self._generate_meal_recommendations(input_data, user_data) + elif recommendation_type == 'food_similarity': + result = self._find_similar_foods(input_data, user_data) + elif recommendation_type == 'preference_update': + result = self._update_user_preferences(input_data, user_data) + elif recommendation_type == 'model_retrain': + result = self._retrain_models(input_data, user_data) + else: + result = self._create_error_result("未知的推荐类型") + + return AnalysisResult( + module_type=self.module_type, + user_id=user_data.user_id, + input_data=input_data, + result=result, + confidence=result.get('confidence', 0.5) + ) + except Exception as e: + self.logger.error(f"处理推荐请求失败: {e}") + return self._create_error_result(str(e)) + + def _generate_meal_recommendations(self, input_data: Dict, user_data: UserData) -> Dict[str, Any]: + """生成餐食推荐""" + meal_type = input_data.get('meal_type', 'lunch') + preferences = input_data.get('preferences', {}) + context = input_data.get('context', {}) + + try: + # 生成完整餐食搭配推荐 + meal_combinations = self._generate_meal_combinations(user_data, meal_type, preferences, context) + + return { + 'success': True, + 'recommendations': meal_combinations, + 'reasoning': self._generate_meal_reasoning(meal_combinations, user_data, meal_type), + 'confidence': self._calculate_recommendation_confidence(user_data), + 'metadata': { + 'meal_type': meal_type, + 'combination_count': len(meal_combinations) + } + } + + except Exception as e: + self.logger.error(f"生成餐食推荐失败: {e}") + return self._create_error_result(f"推荐生成失败: {str(e)}") + + def _generate_meal_combinations(self, user_data: UserData, meal_type: str, + preferences: Dict, context: Dict) -> List[Dict[str, Any]]: + """生成基于用户数据的动态餐食搭配组合""" + combinations = [] + + try: + # 1. 基于用户历史数据生成搭配 + historical_combinations = self._generate_historical_combinations(user_data, meal_type) + combinations.extend(historical_combinations) + + # 2. 基于用户偏好生成个性化搭配 + personalized_combinations = self._generate_personalized_combinations(user_data, meal_type, preferences) + combinations.extend(personalized_combinations) + + # 3. 基于相似用户生成搭配 + similar_user_combinations = self._generate_similar_user_combinations(user_data, meal_type) + combinations.extend(similar_user_combinations) + + # 4. 如果没有足够数据,使用模板生成 + if len(combinations) < 3: + template_combinations = self._generate_template_combinations(user_data, meal_type) + combinations.extend(template_combinations) + + # 5. 去重和排序 + combinations = self._deduplicate_and_rank_combinations(combinations, user_data) + + # 6. 确保至少有一些推荐 + if not combinations: + combinations = self._generate_fallback_combinations(meal_type) + + return combinations[:5] # 返回前5个最佳搭配 + + except Exception as e: + self.logger.error(f"生成餐食搭配失败: {e}") + # 返回基础推荐 + return self._generate_fallback_combinations(meal_type) + + def _generate_historical_combinations(self, user_data: UserData, meal_type: str) -> List[Dict[str, Any]]: + """基于用户历史数据生成搭配""" + combinations = [] + + # 获取该餐次的所有历史记录 + meal_records = [meal for meal in user_data.meals if meal.get('meal_type') == meal_type] + + if not meal_records: + return combinations + + # 分析高频搭配 + food_combinations = {} + for meal in meal_records: + foods = meal.get('foods', []) + if len(foods) >= 2 and meal.get('satisfaction_score', 0) >= 4: + # 生成2-3食物组合 + for i in range(len(foods)): + for j in range(i+1, min(i+3, len(foods))): + combo = tuple(sorted(foods[i:j+1])) + food_combinations[combo] = food_combinations.get(combo, 0) + 1 + + # 选择出现频率最高的搭配 + sorted_combinations = sorted(food_combinations.items(), key=lambda x: x[1], reverse=True) + + for combo, count in sorted_combinations[:2]: # 取前2个高频搭配 + if count >= 2: # 至少出现2次 + combination = { + "name": f"历史搭配{len(combinations)+1}", + "description": f"基于您{meal_type}的历史偏好", + "foods": [], + "total_calories": 0, + "nutrition_score": 0, + "personalization_score": 1.0, + "categories": ["历史数据"], + "source": "historical" + } + + for food_name in combo: + food_info = self._get_food_info(food_name) + if food_info: + combination["foods"].append(food_info) + combination["total_calories"] += food_info.get("calories", 0) + + if len(combination["foods"]) >= 2: + combination["nutrition_score"] = self._calculate_nutrition_score(combination["foods"]) + combinations.append(combination) + + return combinations + + def _generate_personalized_combinations(self, user_data: UserData, meal_type: str, preferences: Dict) -> List[Dict[str, Any]]: + """基于用户偏好生成个性化搭配""" + combinations = [] + + # 获取用户喜爱的食物 + favorite_foods = self._get_user_favorite_foods(user_data, meal_type) + + if len(favorite_foods) >= 2: + combination = { + "name": "个性化搭配", + "description": f"基于您的{meal_type}偏好定制", + "foods": [], + "total_calories": 0, + "nutrition_score": 0, + "personalization_score": 0.9, + "categories": ["个性化"], + "source": "personalized" + } + + # 选择2-4种用户喜爱的食物 + selected_foods = favorite_foods[:min(4, len(favorite_foods))] + for food in selected_foods: + food_info = self._get_food_info(food) + if food_info: + combination["foods"].append(food_info) + combination["total_calories"] += food_info.get("calories", 0) + + if len(combination["foods"]) >= 2: + combination["nutrition_score"] = self._calculate_nutrition_score(combination["foods"]) + combinations.append(combination) + + return combinations + + def _generate_similar_user_combinations(self, user_data: UserData, meal_type: str) -> List[Dict[str, Any]]: + """基于相似用户生成搭配""" + return [] # 暂时返回空列表 + + def _generate_template_combinations(self, user_data: UserData, meal_type: str) -> List[Dict[str, Any]]: + """基于模板生成搭配(当历史数据不足时)""" + combinations = [] + + templates = self.meal_templates.get(meal_type, []) + + for template in templates[:2]: # 只使用前2个模板 + combination = { + "name": template["name"], + "description": f"营养均衡的{meal_type}搭配", + "foods": [], + "total_calories": 0, + "nutrition_score": 0, + "personalization_score": 0.3, + "categories": template["categories"], + "source": "template" + } + + # 为每个类别选择常见食物 + for category in template["categories"]: + food = self._select_common_food_for_category(category, meal_type) + if food: + combination["foods"].append(food) + combination["total_calories"] += food.get("calories", 0) + + if len(combination["foods"]) >= 2: + combination["nutrition_score"] = self._calculate_nutrition_score(combination["foods"]) + combinations.append(combination) + + return combinations + + def _select_common_food_for_category(self, category: str, meal_type: str) -> Dict[str, Any]: + """为特定类别选择常见食物""" + common_foods = { + "主食": ["米饭", "面条", "面包", "粥"], + "蛋白质": ["鸡蛋", "鸡肉", "牛肉", "豆腐"], + "蔬菜": ["青菜", "白菜", "西红柿"], + "饮品": ["牛奶", "酸奶", "汤"], + "水果": ["苹果", "香蕉"], + "坚果": ["坚果"], + "小食": ["饼干"] + } + + foods = common_foods.get(category, []) + if foods: + # 根据餐次选择合适的主食 + if category == "主食" and meal_type == "breakfast": + food_name = "面包" if "面包" in foods else foods[0] + elif category == "主食" and meal_type == "lunch": + food_name = "米饭" if "米饭" in foods else foods[0] + elif category == "主食" and meal_type == "dinner": + food_name = "粥" if "粥" in foods else foods[0] + else: + food_name = foods[0] + + return self._get_food_info(food_name) + + return None + + def _deduplicate_and_rank_combinations(self, combinations: List[Dict], user_data: UserData) -> List[Dict]: + """去重和排序搭配组合""" + # 去重:基于食物组合去重 + unique_combinations = [] + seen_combinations = set() + + for combo in combinations: + food_names = tuple(sorted([f["name"] for f in combo["foods"]])) + if food_names not in seen_combinations: + seen_combinations.add(food_names) + unique_combinations.append(combo) + + # 排序:综合得分 + def score_combination(combo): + personal_score = combo.get("personalization_score", 0) * 0.4 + nutrition_score = combo.get("nutrition_score", 0) * 0.3 + satisfaction_score = sum(f.get("satisfaction_score", 4) for f in combo["foods"]) / len(combo["foods"]) * 0.3 + return personal_score + nutrition_score + satisfaction_score + + return sorted(unique_combinations, key=score_combination, reverse=True) + + def _generate_meal_reasoning(self, combinations: List[Dict], user_data: UserData, meal_type: str) -> str: + """生成动态餐食推荐理由""" + if not combinations: + return "暂无推荐" + + top_combination = combinations[0] + foods = top_combination["foods"] + + reasoning_parts = [] + + # 基于数据来源生成理由 + source = top_combination.get("source", "unknown") + if source == "historical": + reasoning_parts.append("基于您的历史用餐偏好") + elif source == "personalized": + reasoning_parts.append("基于您的个人喜好") + elif source == "template": + reasoning_parts.append("营养均衡搭配") + + # 满意度理由 + avg_satisfaction = sum(f.get("satisfaction_score", 4) for f in foods) / len(foods) + if avg_satisfaction > 4.0: + reasoning_parts.append(f"历史满意度: {avg_satisfaction:.1f}分") + + # 食物搭配理由 + food_names = [f["name"] for f in foods] + reasoning_parts.append(f"推荐搭配: {', '.join(food_names)}") + + return ",".join(reasoning_parts) if reasoning_parts else "营养搭配推荐" + + def _get_user_favorite_foods(self, user_data: UserData, meal_type: str) -> List[str]: + """获取用户喜爱的食物""" + favorite_foods = [] + + # 从历史餐食记录中提取 + for meal in user_data.meals: + if meal.get('meal_type') == meal_type and meal.get('satisfaction_score', 0) >= 4: + favorite_foods.extend(meal.get('foods', [])) + + # 统计频率 + food_counts = {} + for food in favorite_foods: + food_counts[food] = food_counts.get(food, 0) + 1 + + # 按频率排序 + sorted_foods = sorted(food_counts.items(), key=lambda x: x[1], reverse=True) + return [food for food, count in sorted_foods[:10]] + + def _get_food_info(self, food_name: str) -> Dict[str, Any]: + """获取食物信息""" + # 从食物数据库获取信息 + food_info = self.food_database.get(food_name, {}) + return { + "name": food_name, + "calories": food_info.get("calories", 100), + "category": food_info.get("category", "其他"), + "nutrition": food_info.get("nutrition", {}), + "satisfaction_score": food_info.get("avg_satisfaction", 4.0) + } + + def _calculate_nutrition_score(self, foods: List[Dict]) -> float: + """计算营养得分""" + if not foods: + return 0.0 + + # 简单的营养评分逻辑 + score = 0.0 + categories = set() + + for food in foods: + category = food.get("category", "其他") + categories.add(category) + score += food.get("satisfaction_score", 4.0) + + # 多样性加分 + diversity_bonus = min(len(categories) * 0.1, 0.3) + + return (score / len(foods)) + diversity_bonus + + def _generate_fallback_combinations(self, meal_type: str) -> List[Dict[str, Any]]: + """生成备选推荐(当其他方法都失败时)""" + combinations = [] + + # 基础推荐搭配 + fallback_combinations = { + "breakfast": [ + {"name": "营养早餐", "foods": ["面包", "鸡蛋", "牛奶"]}, + {"name": "健康早餐", "foods": ["燕麦粥", "香蕉", "酸奶"]} + ], + "lunch": [ + {"name": "均衡午餐", "foods": ["米饭", "鸡肉", "青菜"]}, + {"name": "轻食午餐", "foods": ["面条", "牛肉", "西红柿"]} + ], + "dinner": [ + {"name": "清淡晚餐", "foods": ["粥", "豆腐", "白菜"]}, + {"name": "温馨晚餐", "foods": ["饺子", "汤"]} + ], + "snack": [ + {"name": "健康小食", "foods": ["苹果", "坚果"]}, + {"name": "休闲小食", "foods": ["酸奶", "饼干"]} + ] + } + + templates = fallback_combinations.get(meal_type, []) + + for template in templates: + combination = { + "name": template["name"], + "description": f"营养均衡的{meal_type}搭配", + "foods": [], + "total_calories": 0, + "nutrition_score": 4.0, + "personalization_score": 0.2, + "categories": ["基础推荐"], + "source": "fallback" + } + + for food_name in template["foods"]: + food_info = self._get_food_info(food_name) + if food_info: + combination["foods"].append(food_info) + combination["total_calories"] += food_info.get("calories", 0) + + if len(combination["foods"]) >= 2: + combinations.append(combination) + + return combinations + + def _get_historical_recommendations(self, user_data: UserData, meal_type: str) -> List[Dict[str, Any]]: + """基于历史数据的推荐""" + recommendations = [] + + # 分析用户历史餐食 + historical_meals = [meal for meal in user_data.meals if meal.get('meal_type') == meal_type] + + if not historical_meals: + return recommendations + + # 统计用户喜欢的食物 + food_scores = {} + for meal in historical_meals: + satisfaction = meal.get('satisfaction_score', 3) # 默认3分 + for food in meal.get('foods', []): + if food not in food_scores: + food_scores[food] = [] + food_scores[food].append(satisfaction) + + # 计算平均满意度 + for food, scores in food_scores.items(): + avg_score = np.mean(scores) + if avg_score >= 3: # 只推荐满意度>=3的食物 + recommendations.append({ + 'food': food, + 'score': avg_score, + 'type': 'historical', + 'reason': f'历史满意度: {avg_score:.1f}分' + }) + + return sorted(recommendations, key=lambda x: x['score'], reverse=True) + + def _get_similar_user_recommendations(self, user_data: UserData, meal_type: str) -> List[Dict[str, Any]]: + """基于相似用户的推荐""" + recommendations = [] + + if not self.user_clustering_model: + return recommendations + + try: + # 获取用户特征向量 + user_features = self._extract_user_features(user_data) + + # 找到相似用户 + similar_users = self._find_similar_users(user_features) + + # 基于相似用户的偏好推荐 + for similar_user_id in similar_users: + similar_user_data = self._get_user_data_by_id(similar_user_id) + if similar_user_data: + user_recommendations = self._get_historical_recommendations(similar_user_data, meal_type) + for rec in user_recommendations: + rec['type'] = 'similar_user' + rec['reason'] = f'相似用户推荐' + recommendations.append(rec) + + except Exception as e: + self.logger.error(f"相似用户推荐失败: {e}") + + return recommendations + + def _get_content_based_recommendations(self, user_data: UserData, meal_type: str) -> List[Dict[str, Any]]: + """基于内容相似性的推荐""" + recommendations = [] + + if not self.food_similarity_matrix: + return recommendations + + try: + # 获取用户喜欢的食物 + liked_foods = [] + for meal in user_data.meals: + if meal.get('satisfaction_score', 0) >= 4: # 满意度>=4的食物 + liked_foods.extend(meal.get('foods', [])) + + if not liked_foods: + return recommendations + + # 基于食物相似性推荐 + for liked_food in liked_foods: + if liked_food in self.food_similarity_matrix: + similar_foods = self.food_similarity_matrix[liked_food] + for food, similarity in similar_foods.items(): + if food not in liked_foods: # 避免重复推荐 + recommendations.append({ + 'food': food, + 'score': similarity, + 'type': 'content_based', + 'reason': f'与{liked_food}相似' + }) + + except Exception as e: + self.logger.error(f"内容推荐失败: {e}") + + return recommendations + + def _get_physiological_recommendations(self, user_data: UserData, context: Dict) -> List[Dict[str, Any]]: + """基于生理状态的推荐""" + recommendations = [] + + # 获取生理状态信息 + physiological_state = context.get('physiological_state', {}) + needs = physiological_state.get('needs', []) + + if not needs: + return recommendations + + # 根据营养需求推荐食物 + nutrition_food_mapping = { + '铁质': ['菠菜', '瘦肉', '红枣', '黑芝麻', '猪肝'], + '蛋白质': ['鸡蛋', '豆腐', '鱼肉', '鸡肉', '牛奶'], + '维生素C': ['橙子', '柠檬', '西红柿', '西兰花', '草莓'], + '叶酸': ['绿叶蔬菜', '豆类', '坚果', '菠菜', '芦笋'], + '维生素B': ['全谷物', '瘦肉', '蛋类', '香蕉', '土豆'], + '锌': ['牡蛎', '瘦肉', '坚果', '豆类', '南瓜子'], + '维生素E': ['坚果', '植物油', '鳄梨', '葵花籽', '杏仁'], + '镁': ['坚果', '绿叶蔬菜', '全谷物', '黑巧克力', '香蕉'], + '维生素B6': ['香蕉', '土豆', '鸡肉', '三文鱼', '鹰嘴豆'], + '钙质': ['牛奶', '豆腐', '绿叶蔬菜', '奶酪', '酸奶'] + } + + for need in needs: + foods = nutrition_food_mapping.get(need, []) + for food in foods: + recommendations.append({ + 'food': food, + 'score': 0.8, # 生理需求推荐分数较高 + 'type': 'physiological', + 'reason': f'补充{need}' + }) + + return recommendations + + def _fuse_recommendations(self, recommendation_lists: List[List[Dict]], user_data: UserData) -> List[Dict[str, Any]]: + """融合多种推荐结果""" + food_scores = {} + + # 权重配置 + weights = { + 'historical': 0.4, + 'similar_user': 0.2, + 'content_based': 0.2, + 'physiological': 0.2 + } + + for rec_list in recommendation_lists: + for rec in rec_list: + food = rec['food'] + score = rec['score'] + rec_type = rec['type'] + + if food not in food_scores: + food_scores[food] = { + 'total_score': 0, + 'count': 0, + 'reasons': [], + 'types': [] + } + + weight = weights.get(rec_type, 0.1) + food_scores[food]['total_score'] += score * weight + food_scores[food]['count'] += 1 + food_scores[food]['reasons'].append(rec['reason']) + food_scores[food]['types'].append(rec_type) + + # 转换为推荐列表 + recommendations = [] + for food, data in food_scores.items(): + recommendations.append({ + 'food': food, + 'score': data['total_score'], + 'count': data['count'], + 'reasons': data['reasons'], + 'types': data['types'] + }) + + return sorted(recommendations, key=lambda x: x['score'], reverse=True) + + def _filter_and_rank_recommendations(self, recommendations: List[Dict], + user_data: UserData, preferences: Dict) -> List[Dict[str, Any]]: + """过滤和排序推荐""" + filtered = [] + + # 获取用户不喜欢的食物 + dislikes = user_data.profile.get('dislikes', []) + allergies = user_data.profile.get('allergies', []) + + for rec in recommendations: + food = rec['food'] + + # 过滤不喜欢的食物 + if any(dislike in food for dislike in dislikes): + continue + + # 过滤过敏食物 + if any(allergy in food for allergy in allergies): + continue + + # 应用用户偏好 + if preferences: + if 'taste' in preferences: + taste = preferences['taste'] + if taste == 'sweet' and not self._is_sweet_food(food): + rec['score'] *= 0.8 + elif taste == 'spicy' and not self._is_spicy_food(food): + rec['score'] *= 0.8 + + filtered.append(rec) + + return sorted(filtered, key=lambda x: x['score'], reverse=True) + + def _generate_recommendation_reasoning(self, recommendations: List[Dict], user_data: UserData) -> str: + """生成推荐理由""" + if not recommendations: + return "暂无推荐" + + top_rec = recommendations[0] + reasons = top_rec.get('reasons', []) + + if reasons: + return f"推荐{top_rec['food']},理由:{'; '.join(reasons[:2])}" + else: + return f"推荐{top_rec['food']},基于您的个人偏好" + + def _calculate_recommendation_confidence(self, user_data: UserData) -> float: + """计算推荐置信度""" + meal_count = len(user_data.meals) + feedback_count = len(user_data.feedback) + + # 基于数据量计算置信度 + if meal_count >= 15 and feedback_count >= 5: + return 0.9 + elif meal_count >= 10 and feedback_count >= 3: + return 0.7 + elif meal_count >= 5: + return 0.5 + else: + return 0.3 + + def _extract_user_features(self, user_data: UserData) -> np.ndarray: + """提取用户特征向量""" + features = [] + + # 基础特征 + profile = user_data.profile + features.extend([ + profile.get('age', 25), + profile.get('height', 165), + profile.get('weight', 60), + len(profile.get('allergies', [])), + len(profile.get('dislikes', [])) + ]) + + # 口味偏好特征 + taste_prefs = profile.get('taste_preferences', {}) + features.extend([ + taste_prefs.get('sweet', 3), + taste_prefs.get('salty', 3), + taste_prefs.get('spicy', 3), + taste_prefs.get('sour', 3), + taste_prefs.get('bitter', 3), + taste_prefs.get('umami', 3) + ]) + + # 餐食特征 + features.extend([ + len(user_data.meals), + np.mean([meal.get('satisfaction_score', 3) for meal in user_data.meals]) if user_data.meals else 3, + len(user_data.feedback) + ]) + + return np.array(features) + + def _find_similar_users(self, user_features: np.ndarray) -> List[str]: + """找到相似用户""" + # 这里简化实现,实际应该基于用户聚类模型 + return [] + + def _get_user_data_by_id(self, user_id: str) -> Optional[UserData]: + """根据ID获取用户数据""" + # 这里需要从数据管理器获取,简化实现 + return None + + def _is_sweet_food(self, food: str) -> bool: + """判断是否为甜食""" + sweet_keywords = ['甜', '糖', '蜂蜜', '果', '蛋糕', '巧克力', '冰淇淋'] + return any(keyword in food for keyword in sweet_keywords) + + def _is_spicy_food(self, food: str) -> bool: + """判断是否为辣食""" + spicy_keywords = ['辣', '椒', '麻', '辛', '咖喱', '辣椒'] + return any(keyword in food for keyword in spicy_keywords) + + def _load_meal_templates(self) -> Dict[str, List[Dict]]: + """加载基础餐食搭配模板(作为备选方案)""" + return { + "breakfast": [ + {"name": "经典早餐", "categories": ["主食", "蛋白质", "饮品"]}, + {"name": "健康早餐", "categories": ["谷物", "水果", "蛋白质"]}, + {"name": "中式早餐", "categories": ["主食", "蛋白质", "蔬菜"]} + ], + "lunch": [ + {"name": "均衡午餐", "categories": ["主食", "蛋白质", "蔬菜"]}, + {"name": "轻食午餐", "categories": ["主食", "蛋白质", "蔬菜"]}, + {"name": "丰盛午餐", "categories": ["主食", "蛋白质", "蔬菜", "汤品"]} + ], + "dinner": [ + {"name": "清淡晚餐", "categories": ["主食", "蛋白质", "蔬菜"]}, + {"name": "温馨晚餐", "categories": ["主食", "蛋白质", "蔬菜"]} + ], + "snack": [ + {"name": "健康小食", "categories": ["水果", "坚果"]}, + {"name": "休闲小食", "categories": ["饮品", "小食"]} + ] + } + + def _load_food_database(self) -> Dict[str, Dict]: + """加载食物数据库""" + return { + '米饭': {'calories': 130, 'protein': 2.7, 'carbs': 28, 'fat': 0.3, 'category': '主食'}, + '面条': {'calories': 131, 'protein': 5, 'carbs': 25, 'fat': 1.1, 'category': '主食'}, + '鸡蛋': {'calories': 155, 'protein': 13, 'carbs': 1.1, 'fat': 11, 'category': '蛋白质'}, + '鸡肉': {'calories': 165, 'protein': 31, 'carbs': 0, 'fat': 3.6, 'category': '蛋白质'}, + '鱼肉': {'calories': 206, 'protein': 22, 'carbs': 0, 'fat': 12, 'category': '蛋白质'}, + '豆腐': {'calories': 76, 'protein': 8, 'carbs': 2, 'fat': 4.8, 'category': '蛋白质'}, + '菠菜': {'calories': 23, 'protein': 2.9, 'carbs': 3.6, 'fat': 0.4, 'category': '蔬菜'}, + '西兰花': {'calories': 34, 'protein': 2.8, 'carbs': 7, 'fat': 0.4, 'category': '蔬菜'}, + '苹果': {'calories': 52, 'protein': 0.3, 'carbs': 14, 'fat': 0.2, 'category': '水果'}, + '香蕉': {'calories': 89, 'protein': 1.1, 'carbs': 23, 'fat': 0.3, 'category': '水果'}, + '牛奶': {'calories': 42, 'protein': 3.4, 'carbs': 5, 'fat': 1, 'category': '乳制品'}, + '燕麦': {'calories': 389, 'protein': 17, 'carbs': 66, 'fat': 7, 'category': '主食'} + } + + def _load_or_train_models(self): + """加载或训练模型""" + try: + # 尝试加载现有模型 + tfidf_path = self.model_path / 'tfidf_vectorizer.pkl' + if tfidf_path.exists(): + self.tfidf_vectorizer = joblib.load(tfidf_path) + self.logger.info("TF-IDF向量化器加载成功") + + # 构建食物相似性矩阵 + self._build_food_similarity_matrix() + + except Exception as e: + self.logger.error(f"模型加载失败: {e}") + # 如果加载失败,使用默认配置 + self._initialize_default_models() + + def _build_food_similarity_matrix(self): + """构建食物相似性矩阵""" + try: + if not self.tfidf_vectorizer: + self._initialize_default_models() + + # 获取所有食物名称 + food_names = list(self.food_database.keys()) + + # 使用TF-IDF计算相似性 + food_features = self.tfidf_vectorizer.transform(food_names) + similarity_matrix = cosine_similarity(food_features) + + # 构建相似性字典 + self.food_similarity_matrix = {} + for i, food1 in enumerate(food_names): + similarities = {} + for j, food2 in enumerate(food_names): + if i != j: + similarities[food2] = similarity_matrix[i][j] + + # 按相似性排序 + sorted_similarities = sorted(similarities.items(), key=lambda x: x[1], reverse=True) + self.food_similarity_matrix[food1] = dict(sorted_similarities[:5]) # 只保留前5个相似食物 + + self.logger.info("食物相似性矩阵构建完成") + + except Exception as e: + self.logger.error(f"构建食物相似性矩阵失败: {e}") + self.food_similarity_matrix = {} + + def _initialize_default_models(self): + """初始化默认模型""" + try: + # 初始化TF-IDF向量化器 + self.tfidf_vectorizer = TfidfVectorizer( + max_features=1000, + stop_words=None, # 中文不需要英文停用词 + ngram_range=(1, 2) + ) + + # 使用食物名称训练 + food_names = list(self.food_database.keys()) + self.tfidf_vectorizer.fit(food_names) + + # 保存模型 + tfidf_path = self.model_path / 'tfidf_vectorizer.pkl' + joblib.dump(self.tfidf_vectorizer, tfidf_path) + + self.logger.info("默认模型初始化完成") + + except Exception as e: + self.logger.error(f"默认模型初始化失败: {e}") + + def _find_similar_foods(self, input_data: Dict, user_data: UserData) -> Dict[str, Any]: + """查找相似食物""" + target_food = input_data.get('food', '') + + if not target_food or not self.food_similarity_matrix: + return self._create_error_result("无法找到相似食物") + + similar_foods = self.food_similarity_matrix.get(target_food, {}) + + return { + 'success': True, + 'target_food': target_food, + 'similar_foods': list(similar_foods.items()), + 'confidence': 0.8 + } + + def _update_user_preferences(self, input_data: Dict, user_data: UserData) -> Dict[str, Any]: + """更新用户偏好""" + feedback_data = input_data.get('feedback', {}) + + # 更新用户偏好模型 + # 这里可以实现更复杂的偏好学习算法 + + return { + 'success': True, + 'message': '用户偏好更新成功', + 'confidence': 0.7 + } + + def _retrain_models(self, input_data: Dict, user_data: UserData) -> Dict[str, Any]: + """重新训练模型""" + try: + # 检查是否有足够的数据进行重训练 + total_samples = len(user_data.meals) + len(user_data.feedback) + + if total_samples < self.model_update_threshold: + return { + 'success': False, + 'message': f'数据不足,需要至少{self.model_update_threshold}个样本', + 'current_samples': total_samples + } + + # 重新训练模型 + self._load_or_train_models() + + return { + 'success': True, + 'message': '模型重训练完成', + 'confidence': 0.9 + } + + except Exception as e: + return self._create_error_result(f"模型重训练失败: {str(e)}") + + def _create_error_result(self, error_message: str) -> Dict[str, Any]: + """创建错误结果""" + return { + 'success': False, + 'error': error_message, + 'message': f'推荐失败: {error_message}', + 'confidence': 0.0 + } + + def cleanup(self) -> bool: + """清理资源""" + try: + self.logger.info("推荐引擎清理完成") + return True + except Exception as e: + self.logger.error(f"推荐引擎清理失败: {e}") + return False + + +# 便捷函数 +def generate_meal_recommendations(user_id: str, meal_type: str, preferences: Dict = None, context: Dict = None) -> Optional[Dict]: + """生成餐食推荐""" + from core.base import get_app_core + + if preferences is None: + preferences = {} + if context is None: + context = {} + + app = get_app_core() + input_data = { + 'type': 'meal_recommendation', + 'meal_type': meal_type, + 'preferences': preferences, + 'context': context + } + + result = app.process_user_request(ModuleType.RECOMMENDATION, input_data, user_id) + return result.result if result else None + + +def find_similar_foods(user_id: str, food: str) -> Optional[Dict]: + """查找相似食物""" + from core.base import get_app_core + + app = get_app_core() + input_data = { + 'type': 'food_similarity', + 'food': food + } + + result = app.process_user_request(ModuleType.RECOMMENDATION, input_data, user_id) + return result.result if result else None + + +def update_user_preferences(user_id: str, feedback: Dict) -> Optional[Dict]: + """更新用户偏好""" + from core.base import get_app_core + + app = get_app_core() + input_data = { + 'type': 'preference_update', + 'feedback': feedback + } + + result = app.process_user_request(ModuleType.RECOMMENDATION, input_data, user_id) + return result.result if result else None + + +def retrain_recommendation_model(user_id: str) -> Optional[Dict]: + """重新训练推荐模型""" + from core.base import get_app_core + + app = get_app_core() + input_data = { + 'type': 'model_retrain' + } + + result = app.process_user_request(ModuleType.RECOMMENDATION, input_data, user_id) + return result.result if result else None + + +if __name__ == "__main__": + # 测试推荐引擎 + from core.base import BaseConfig, initialize_app, cleanup_app + + print("测试推荐引擎...") + + # 初始化应用 + config = BaseConfig() + if initialize_app(config): + print("✅ 应用初始化成功") + + # 测试餐食推荐 + test_user_id = "test_user_001" + + result = generate_meal_recommendations(test_user_id, "lunch", {"taste": "sweet"}) + if result and result.get('success'): + recommendations = result.get('recommendations', []) + print(f"✅ 餐食推荐成功,推荐了{len(recommendations)}种食物") + for rec in recommendations[:3]: + print(f" - {rec['food']}: {rec.get('score', 0):.2f}") + + # 测试相似食物查找 + result = find_similar_foods(test_user_id, "米饭") + if result and result.get('success'): + similar_foods = result.get('similar_foods', []) + print(f"✅ 相似食物查找成功,找到{len(similar_foods)}种相似食物") + + # 清理应用 + cleanup_app() + print("✅ 应用清理完成") + else: + print("❌ 应用初始化失败") diff --git a/package.json b/package.json new file mode 100644 index 0000000..0843456 --- /dev/null +++ b/package.json @@ -0,0 +1,34 @@ +{ + "name": "diet-recommendation-app", + "version": "1.0.0", + "description": "智能饮食推荐应用", + "main": "index.js", + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "next": "14.0.3", + "react": "18.2.0", + "react-dom": "18.2.0", + "axios": "1.6.2", + "tailwindcss": "3.3.6", + "autoprefixer": "10.4.16", + "postcss": "8.4.32", + "@headlessui/react": "1.7.17", + "@heroicons/react": "2.0.18", + "recharts": "2.8.0", + "react-hook-form": "7.48.2", + "zustand": "4.4.7" + }, + "devDependencies": { + "@types/node": "20.10.0", + "@types/react": "18.2.38", + "@types/react-dom": "18.2.17", + "eslint": "8.54.0", + "eslint-config-next": "14.0.3", + "typescript": "5.3.2" + } +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9e99d50 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,30 @@ +# 个性化饮食推荐APP - 依赖包 + +# 核心依赖 +customtkinter>=5.2.0 +scikit-learn>=1.3.0 +pandas>=2.0.0 +numpy>=1.24.0 +joblib>=1.3.0 + +# 大模型集成 (千问API) +requests>=2.31.0 + +# 配置管理 +python-dotenv>=1.0.0 + +# 数据处理 +python-dateutil>=2.8.0 + +# 图像处理 (GUI需要) +Pillow>=10.0.0 + +# OCR识别依赖 +pytesseract>=0.3.10 +opencv-python>=4.8.0 +paddleocr>=2.7.0 +easyocr>=1.7.0 + +# 移动端支持 (可选) +kivy>=2.1.0 +kivymd>=1.1.1 \ No newline at end of file diff --git a/smart_food/smart_database.py b/smart_food/smart_database.py new file mode 100644 index 0000000..96cd4b7 --- /dev/null +++ b/smart_food/smart_database.py @@ -0,0 +1,728 @@ +""" +智能食物数据库和热量估算模块 +简化用户数据录入过程 +""" + +from typing import Dict, List, Optional, Tuple +import json +from pathlib import Path + + +class SmartFoodDatabase: + """智能食物数据库""" + + def __init__(self): + self.food_database = self._load_food_database() + self.portion_sizes = self._load_portion_sizes() + self.calorie_estimates = self._load_calorie_estimates() + + # 添加缓存 + self.ai_cache = {} # AI分析结果缓存 + self.calorie_cache = {} # 热量估算缓存 + self.search_cache = {} # 搜索结果缓存 + + # 预计算常用食物 + self._precompute_common_foods() + + def _load_food_database(self) -> Dict[str, Dict]: + """加载食物数据库""" + return { + # 主食类 + "米饭": {"category": "主食", "calories_per_100g": 130, "protein": 2.7, "carbs": 28, "fat": 0.3}, + "面条": {"category": "主食", "calories_per_100g": 131, "protein": 5, "carbs": 25, "fat": 1.1}, + "馒头": {"category": "主食", "calories_per_100g": 221, "protein": 7, "carbs": 47, "fat": 1.1}, + "包子": {"category": "主食", "calories_per_100g": 227, "protein": 7.3, "carbs": 45, "fat": 2.6}, + "饺子": {"category": "主食", "calories_per_100g": 250, "protein": 11, "carbs": 35, "fat": 8}, + "粥": {"category": "主食", "calories_per_100g": 50, "protein": 1.1, "carbs": 10, "fat": 0.3}, + "燕麦": {"category": "主食", "calories_per_100g": 389, "protein": 17, "carbs": 66, "fat": 7}, + "面包": {"category": "主食", "calories_per_100g": 265, "protein": 9, "carbs": 49, "fat": 3.2}, + "饼干": {"category": "主食", "calories_per_100g": 433, "protein": 9, "carbs": 71, "fat": 12}, + "薯条": {"category": "主食", "calories_per_100g": 319, "protein": 4, "carbs": 41, "fat": 15}, + "玉米": {"category": "主食", "calories_per_100g": 86, "protein": 3.4, "carbs": 19, "fat": 1.2}, + "红薯": {"category": "主食", "calories_per_100g": 86, "protein": 1.6, "carbs": 20, "fat": 0.1}, + + # 蛋白质类 + "鸡蛋": {"category": "蛋白质", "calories_per_100g": 155, "protein": 13, "carbs": 1.1, "fat": 11}, + "鸡肉": {"category": "蛋白质", "calories_per_100g": 165, "protein": 31, "carbs": 0, "fat": 3.6}, + "猪肉": {"category": "蛋白质", "calories_per_100g": 143, "protein": 20, "carbs": 0, "fat": 6.2}, + "牛肉": {"category": "蛋白质", "calories_per_100g": 250, "protein": 26, "carbs": 0, "fat": 15}, + "鱼肉": {"category": "蛋白质", "calories_per_100g": 206, "protein": 22, "carbs": 0, "fat": 12}, + "豆腐": {"category": "蛋白质", "calories_per_100g": 76, "protein": 8, "carbs": 2, "fat": 4.8}, + "牛奶": {"category": "蛋白质", "calories_per_100g": 42, "protein": 3.4, "carbs": 5, "fat": 1}, + "酸奶": {"category": "蛋白质", "calories_per_100g": 59, "protein": 3.3, "carbs": 4.7, "fat": 3.2}, + "虾": {"category": "蛋白质", "calories_per_100g": 99, "protein": 24, "carbs": 0, "fat": 0.2}, + "蟹": {"category": "蛋白质", "calories_per_100g": 97, "protein": 20, "carbs": 0, "fat": 1.5}, + "鸭肉": {"category": "蛋白质", "calories_per_100g": 183, "protein": 25, "carbs": 0, "fat": 9}, + "羊肉": {"category": "蛋白质", "calories_per_100g": 203, "protein": 25, "carbs": 0, "fat": 11}, + "火腿": {"category": "蛋白质", "calories_per_100g": 145, "protein": 18, "carbs": 1.5, "fat": 7.5}, + "香肠": {"category": "蛋白质", "calories_per_100g": 301, "protein": 13, "carbs": 2, "fat": 25}, + + # 蔬菜类 + "白菜": {"category": "蔬菜", "calories_per_100g": 17, "protein": 1.5, "carbs": 3.2, "fat": 0.1}, + "菠菜": {"category": "蔬菜", "calories_per_100g": 23, "protein": 2.9, "carbs": 3.6, "fat": 0.4}, + "西兰花": {"category": "蔬菜", "calories_per_100g": 34, "protein": 2.8, "carbs": 7, "fat": 0.4}, + "胡萝卜": {"category": "蔬菜", "calories_per_100g": 41, "protein": 0.9, "carbs": 10, "fat": 0.2}, + "土豆": {"category": "蔬菜", "calories_per_100g": 77, "protein": 2, "carbs": 17, "fat": 0.1}, + "西红柿": {"category": "蔬菜", "calories_per_100g": 18, "protein": 0.9, "carbs": 3.9, "fat": 0.2}, + "黄瓜": {"category": "蔬菜", "calories_per_100g": 16, "protein": 0.7, "carbs": 4, "fat": 0.1}, + "茄子": {"category": "蔬菜", "calories_per_100g": 25, "protein": 1.1, "carbs": 6, "fat": 0.2}, + "豆角": {"category": "蔬菜", "calories_per_100g": 31, "protein": 2.1, "carbs": 7, "fat": 0.2}, + "韭菜": {"category": "蔬菜", "calories_per_100g": 25, "protein": 2.4, "carbs": 4, "fat": 0.4}, + "芹菜": {"category": "蔬菜", "calories_per_100g": 16, "protein": 0.7, "carbs": 4, "fat": 0.1}, + "洋葱": {"category": "蔬菜", "calories_per_100g": 40, "protein": 1.1, "carbs": 9, "fat": 0.1}, + "大蒜": {"category": "蔬菜", "calories_per_100g": 149, "protein": 6.4, "carbs": 33, "fat": 0.5}, + "生姜": {"category": "蔬菜", "calories_per_100g": 80, "protein": 1.8, "carbs": 18, "fat": 0.8}, + + # 水果类 + "苹果": {"category": "水果", "calories_per_100g": 52, "protein": 0.3, "carbs": 14, "fat": 0.2}, + "香蕉": {"category": "水果", "calories_per_100g": 89, "protein": 1.1, "carbs": 23, "fat": 0.3}, + "橙子": {"category": "水果", "calories_per_100g": 47, "protein": 0.9, "carbs": 12, "fat": 0.1}, + "葡萄": {"category": "水果", "calories_per_100g": 44, "protein": 0.2, "carbs": 11, "fat": 0.2}, + "草莓": {"category": "水果", "calories_per_100g": 32, "protein": 0.7, "carbs": 8, "fat": 0.3}, + "西瓜": {"category": "水果", "calories_per_100g": 30, "protein": 0.6, "carbs": 8, "fat": 0.1}, + "梨": {"category": "水果", "calories_per_100g": 57, "protein": 0.4, "carbs": 15, "fat": 0.1}, + "桃子": {"category": "水果", "calories_per_100g": 39, "protein": 0.9, "carbs": 10, "fat": 0.3}, + "樱桃": {"category": "水果", "calories_per_100g": 63, "protein": 1.1, "carbs": 16, "fat": 0.2}, + "柠檬": {"category": "水果", "calories_per_100g": 29, "protein": 1.1, "carbs": 9, "fat": 0.3}, + "芒果": {"category": "水果", "calories_per_100g": 60, "protein": 0.8, "carbs": 15, "fat": 0.4}, + "菠萝": {"category": "水果", "calories_per_100g": 50, "protein": 0.5, "carbs": 13, "fat": 0.1}, + "猕猴桃": {"category": "水果", "calories_per_100g": 61, "protein": 1.1, "carbs": 15, "fat": 0.5}, + + # 坚果类 + "花生": {"category": "坚果", "calories_per_100g": 567, "protein": 25, "carbs": 16, "fat": 49}, + "核桃": {"category": "坚果", "calories_per_100g": 654, "protein": 15, "carbs": 14, "fat": 65}, + "杏仁": {"category": "坚果", "calories_per_100g": 579, "protein": 21, "carbs": 22, "fat": 50}, + "腰果": {"category": "坚果", "calories_per_100g": 553, "protein": 18, "carbs": 30, "fat": 44}, + "开心果": {"category": "坚果", "calories_per_100g": 560, "protein": 20, "carbs": 28, "fat": 45}, + "瓜子": {"category": "坚果", "calories_per_100g": 606, "protein": 19, "carbs": 20, "fat": 53}, + + # 饮料类 + "水": {"category": "饮料", "calories_per_100g": 0, "protein": 0, "carbs": 0, "fat": 0}, + "茶": {"category": "饮料", "calories_per_100g": 1, "protein": 0.1, "carbs": 0.3, "fat": 0}, + "咖啡": {"category": "饮料", "calories_per_100g": 2, "protein": 0.1, "carbs": 0.3, "fat": 0}, + "果汁": {"category": "饮料", "calories_per_100g": 45, "protein": 0.3, "carbs": 11, "fat": 0.1}, + "可乐": {"category": "饮料", "calories_per_100g": 42, "protein": 0, "carbs": 10.6, "fat": 0}, + "雪碧": {"category": "饮料", "calories_per_100g": 40, "protein": 0, "carbs": 10, "fat": 0}, + "啤酒": {"category": "饮料", "calories_per_100g": 43, "protein": 0.5, "carbs": 3.6, "fat": 0}, + "红酒": {"category": "饮料", "calories_per_100g": 83, "protein": 0.1, "carbs": 2.6, "fat": 0}, + "白酒": {"category": "饮料", "calories_per_100g": 298, "protein": 0, "carbs": 0, "fat": 0}, + + # 调料类 + "盐": {"category": "调料", "calories_per_100g": 0, "protein": 0, "carbs": 0, "fat": 0}, + "糖": {"category": "调料", "calories_per_100g": 387, "protein": 0, "carbs": 100, "fat": 0}, + "酱油": {"category": "调料", "calories_per_100g": 63, "protein": 7, "carbs": 7, "fat": 0}, + "醋": {"category": "调料", "calories_per_100g": 31, "protein": 0.1, "carbs": 7, "fat": 0}, + "油": {"category": "调料", "calories_per_100g": 884, "protein": 0, "carbs": 0, "fat": 100}, + "辣椒": {"category": "调料", "calories_per_100g": 40, "protein": 1.9, "carbs": 9, "fat": 0.4}, + "胡椒": {"category": "调料", "calories_per_100g": 251, "protein": 10, "carbs": 64, "fat": 3.3}, + "花椒": {"category": "调料", "calories_per_100g": 258, "protein": 6, "carbs": 37, "fat": 8.9}, + } + + def _load_portion_sizes(self) -> Dict[str, List[str]]: + """加载分量选项""" + return { + "主食": ["1小碗", "1中碗", "1大碗", "1个", "2个", "3个", "半份", "1份", "2份"], + "蛋白质": ["1个", "2个", "3个", "1小块", "2小块", "1片", "2片", "1杯", "2杯", "适量"], + "蔬菜": ["1小份", "1中份", "1大份", "1把", "2把", "1根", "2根", "适量", "很多"], + "水果": ["1个", "2个", "3个", "1小个", "1大个", "1片", "2片", "适量"], + "坚果": ["1小把", "1把", "2把", "1颗", "2颗", "3颗", "适量"], + "饮料": ["1杯", "2杯", "3杯", "1小杯", "1大杯", "1瓶", "2瓶", "适量"], + "调料": ["1小勺", "1勺", "2勺", "1小匙", "1匙", "2匙", "适量", "少许"] + } + + def _load_calorie_estimates(self) -> Dict[str, Dict]: + """加载热量估算""" + return { + "1小碗": {"米饭": 130, "面条": 131, "粥": 50}, + "1中碗": {"米饭": 195, "面条": 196, "粥": 75}, + "1大碗": {"米饭": 260, "面条": 262, "粥": 100}, + "1个": {"鸡蛋": 77, "苹果": 52, "香蕉": 89, "馒头": 221, "包子": 227}, + "2个": {"鸡蛋": 154, "苹果": 104, "香蕉": 178, "馒头": 442, "包子": 454}, + "1小块": {"鸡肉": 50, "猪肉": 50, "牛肉": 50, "豆腐": 50}, + "2小块": {"鸡肉": 100, "猪肉": 100, "牛肉": 100, "豆腐": 100}, + "1杯": {"牛奶": 150, "酸奶": 150, "水": 0, "茶": 0, "咖啡": 0}, + "2杯": {"牛奶": 300, "酸奶": 300, "水": 0, "茶": 0, "咖啡": 0}, + "1小份": {"白菜": 50, "菠菜": 50, "西兰花": 50, "胡萝卜": 50}, + "1中份": {"白菜": 100, "菠菜": 100, "西兰花": 100, "胡萝卜": 100}, + "1大份": {"白菜": 150, "菠菜": 150, "西兰花": 150, "胡萝卜": 150}, + "1小把": {"花生": 30, "核桃": 30, "杏仁": 30}, + "1把": {"花生": 60, "核桃": 60, "杏仁": 60}, + "适量": {"default": 50}, # 默认适量为50卡路里 + "很多": {"default": 150}, # 默认很多为150卡路里 + "1小勺": {"盐": 0, "糖": 16, "酱油": 3, "醋": 2, "油": 44, "辣椒": 2, "胡椒": 13, "花椒": 13}, + "1勺": {"盐": 0, "糖": 32, "酱油": 6, "醋": 4, "油": 88, "辣椒": 4, "胡椒": 25, "花椒": 26}, + "2勺": {"盐": 0, "糖": 64, "酱油": 12, "醋": 8, "油": 176, "辣椒": 8, "胡椒": 50, "花椒": 52}, + "1小匙": {"盐": 0, "糖": 8, "酱油": 1.5, "醋": 1, "油": 22, "辣椒": 1, "胡椒": 6, "花椒": 6}, + "1匙": {"盐": 0, "糖": 16, "酱油": 3, "醋": 2, "油": 44, "辣椒": 2, "胡椒": 13, "花椒": 13}, + "2匙": {"盐": 0, "糖": 32, "酱油": 6, "醋": 4, "油": 88, "辣椒": 4, "胡椒": 25, "花椒": 26}, + "少许": {"default": 5}, # 默认少许为5卡路里 + } + + def search_foods(self, query: str) -> List[Dict]: + """搜索食物(优化版本)""" + query = query.lower().strip() + + # 检查缓存 + if query in self.search_cache: + return self.search_cache[query] + + results = [] + + # 精确匹配优先 + for food_name, food_info in self.food_database.items(): + if query == food_name.lower(): + results.insert(0, { + "name": food_name, + "category": food_info["category"], + "calories_per_100g": food_info["calories_per_100g"], + "match_type": "exact" + }) + + # 包含匹配 + for food_name, food_info in self.food_database.items(): + if query in food_name.lower() and query != food_name.lower(): + results.append({ + "name": food_name, + "category": food_info["category"], + "calories_per_100g": food_info["calories_per_100g"], + "match_type": "contains" + }) + + # 关键词匹配 + if len(results) < 5: + keywords = query.split() + for food_name, food_info in self.food_database.items(): + if any(keyword in food_name.lower() for keyword in keywords): + if not any(r["name"] == food_name for r in results): + results.append({ + "name": food_name, + "category": food_info["category"], + "calories_per_100g": food_info["calories_per_100g"], + "match_type": "keyword" + }) + + # 限制结果数量并缓存 + results = results[:10] + self.search_cache[query] = results + + return results + + def get_food_info(self, food_name: str) -> Optional[Dict]: + """获取食物信息""" + return self.food_database.get(food_name) + + def get_portion_options(self, food_name: str) -> List[str]: + """获取分量选项""" + food_info = self.get_food_info(food_name) + if not food_info: + return ["适量"] + + category = food_info["category"] + return self.portion_sizes.get(category, ["适量"]) + + def estimate_calories(self, food_name: str, portion: str) -> int: + """估算热量(优化版本)""" + # 检查缓存 + cache_key = f"{food_name}_{portion}" + if cache_key in self.calorie_cache: + return self.calorie_cache[cache_key] + + # 首先尝试精确匹配 + if portion in self.calorie_estimates: + portion_data = self.calorie_estimates[portion] + if food_name in portion_data: + calories = portion_data[food_name] + self.calorie_cache[cache_key] = calories + return calories + elif "default" in portion_data: + calories = portion_data["default"] + self.calorie_cache[cache_key] = calories + return calories + + # 使用快速估算 + calories = self._calculate_calories_fast(food_name, portion) + self.calorie_cache[cache_key] = calories + return calories + + def _estimate_weight(self, portion: str, category: str) -> int: + """估算重量(克)""" + weight_estimates = { + "1小碗": 100, "1中碗": 150, "1大碗": 200, + "1个": 50, "2个": 100, "3个": 150, + "1小块": 30, "2小块": 60, + "1片": 20, "2片": 40, + "1杯": 150, "2杯": 300, + "1小份": 50, "1中份": 100, "1大份": 150, + "1把": 30, "2把": 60, + "1根": 100, "2根": 200, + "1小把": 15, "1把": 30, "2把": 60, + "1颗": 10, "2颗": 20, "3颗": 30, + "1小勺": 5, "1勺": 10, "2勺": 20, + "1小匙": 3, "1匙": 5, "2匙": 10, + "适量": 50, "很多": 150, "少许": 2 + } + + return weight_estimates.get(portion, 50) + + def _precompute_common_foods(self): + """预计算常用食物的热量""" + common_foods = [ + "米饭", "面条", "馒头", "包子", "饺子", "粥", "面包", + "鸡蛋", "鸡肉", "猪肉", "牛肉", "鱼肉", "豆腐", "牛奶", "酸奶", + "白菜", "菠菜", "西兰花", "胡萝卜", "土豆", "西红柿", "黄瓜", + "苹果", "香蕉", "橙子", "葡萄", "草莓", "西瓜" + ] + + common_portions = ["1小碗", "1中碗", "1大碗", "1个", "2个", "1小块", "2小块", "1杯", "2杯"] + + for food in common_foods: + for portion in common_portions: + cache_key = f"{food}_{portion}" + if cache_key not in self.calorie_cache: + calories = self._calculate_calories_fast(food, portion) + self.calorie_cache[cache_key] = calories + + def _calculate_calories_fast(self, food_name: str, portion: str) -> int: + """快速计算热量(不使用AI)""" + # 首先尝试精确匹配 + if portion in self.calorie_estimates: + portion_data = self.calorie_estimates[portion] + if food_name in portion_data: + return portion_data[food_name] + elif "default" in portion_data: + return portion_data["default"] + + # 使用食物数据库估算 + food_info = self.get_food_info(food_name) + if food_info: + weight_estimate = self._estimate_weight(portion, food_info["category"]) + calories = int(food_info["calories_per_100g"] * weight_estimate / 100) + return max(calories, 10) + + # 基于食物名称的快速估算 + return self._quick_estimate_by_name(food_name, portion) + + def _quick_estimate_by_name(self, food_name: str, portion: str) -> int: + """基于食物名称的快速估算""" + # 食物类型快速估算 + if any(keyword in food_name for keyword in ["米饭", "面条", "馒头", "包子", "饺子", "粥", "面包"]): + base_calories = 200 # 主食基础热量 + elif any(keyword in food_name for keyword in ["鸡蛋", "鸡肉", "猪肉", "牛肉", "鱼肉", "豆腐", "牛奶", "酸奶"]): + base_calories = 150 # 蛋白质基础热量 + elif any(keyword in food_name for keyword in ["白菜", "菠菜", "西兰花", "胡萝卜", "土豆", "西红柿", "黄瓜"]): + base_calories = 50 # 蔬菜基础热量 + elif any(keyword in food_name for keyword in ["苹果", "香蕉", "橙子", "葡萄", "草莓", "西瓜"]): + base_calories = 80 # 水果基础热量 + else: + base_calories = 100 # 默认基础热量 + + # 根据分量调整 + portion_multiplier = { + "1小碗": 0.8, "1中碗": 1.0, "1大碗": 1.5, + "1个": 0.6, "2个": 1.2, "3个": 1.8, + "1小块": 0.4, "2小块": 0.8, + "1杯": 1.0, "2杯": 2.0, + "适量": 0.8, "很多": 1.5 + } + + multiplier = portion_multiplier.get(portion, 1.0) + return int(base_calories * multiplier) + + def _estimate_calories_with_ai(self, food_name: str, portion: str) -> int: + """使用AI估算食物热量""" + try: + from llm_integration.qwen_client import get_qwen_client + + client = get_qwen_client() + + # 构建AI提示词 + system_prompt = """ +你是一个专业的营养师,擅长估算食物的热量和营养成分。 + +你的任务是: +1. 根据食物名称和分量估算热量 +2. 提供准确的营养信息 +3. 考虑食物的常见制作方式 + +请以JSON格式返回结果,包含以下字段: +- calories: 估算的热量值(整数) +- category: 食物分类 +- confidence: 置信度(0-1) +- reasoning: 估算理由 + +注意: +- 热量值应该是整数 +- 考虑食物的常见分量 +- 基于科学的营养学知识 +- 如果不确定,给出保守估算 +""" + + user_prompt = f""" +请估算以下食物的热量: + +食物名称: {food_name} +分量: {portion} + +请提供: +1. 估算的热量值(卡路里) +2. 食物分类 +3. 估算理由 +4. 置信度 + +请以JSON格式返回结果。 +""" + + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt} + ] + + response = client.chat_completion(messages, temperature=0.2, max_tokens=500) + + if response and 'choices' in response: + content = response['choices'][0]['message']['content'] + result = self._parse_ai_calorie_result(content) + + if result.get('success'): + calories = result.get('calories', 50) + # 将AI估算的食物添加到缓存 + self._cache_ai_food_info(food_name, result) + return max(calories, 10) + else: + print(f"AI解析失败: {result}") + return 50 + + except Exception as e: + print(f"AI热量估算失败: {e}") + + # 如果AI估算失败,返回默认值 + return 50 + + def _parse_ai_calorie_result(self, content: str) -> Dict: + """解析AI热量估算结果""" + try: + import json + + # 尝试提取JSON部分 + start_idx = content.find('{') + end_idx = content.rfind('}') + 1 + + if start_idx != -1 and end_idx != -1: + json_str = content[start_idx:end_idx] + result_dict = json.loads(json_str) + + return { + 'success': True, + 'calories': int(result_dict.get('calories', 50)), + 'category': result_dict.get('category', '其他'), + 'confidence': float(result_dict.get('confidence', 0.5)), + 'reasoning': result_dict.get('reasoning', 'AI估算') + } + except Exception as e: + print(f"解析AI结果失败: {e}") + + return {'success': False, 'calories': 50} + + def _cache_ai_food_info(self, food_name: str, ai_result: Dict): + """缓存AI估算的食物信息""" + try: + # 将AI估算的食物添加到内存数据库 + self.food_database[food_name] = { + "category": ai_result.get('category', '其他'), + "calories_per_100g": ai_result.get('calories', 50), + "protein": 0, # AI暂时不提供详细营养成分 + "carbs": 0, + "fat": 0, + "ai_estimated": True, # 标记为AI估算 + "confidence": ai_result.get('confidence', 0.5) + } + except Exception as e: + print(f"缓存AI食物信息失败: {e}") + + def get_food_categories(self) -> List[str]: + """获取食物分类""" + return ["主食", "蛋白质", "蔬菜", "水果", "坚果", "饮料", "调料"] + + def get_foods_by_category(self, category: str) -> List[str]: + """根据分类获取食物列表""" + foods = [] + for food_name, food_info in self.food_database.items(): + if food_info["category"] == category: + foods.append(food_name) + return foods + + def analyze_food_with_ai(self, food_name: str, portion: str) -> Dict: + """使用AI分析食物详细信息""" + try: + from llm_integration.qwen_client import get_qwen_client + + client = get_qwen_client() + + # 构建AI提示词 + system_prompt = """ +你是一个专业的营养师和食物分析专家,擅长分析食物的营养成分和健康价值。 + +你的任务是: +1. 分析食物的详细营养成分 +2. 估算热量和主要营养素含量 +3. 提供健康建议 +4. 考虑食物的制作方式 + +请以JSON格式返回结果,包含以下字段: +- calories: 热量值(整数) +- protein: 蛋白质含量(克) +- carbs: 碳水化合物含量(克) +- fat: 脂肪含量(克) +- fiber: 纤维含量(克) +- category: 食物分类 +- health_tips: 健康建议列表 +- cooking_suggestions: 制作建议列表 +- confidence: 置信度(0-1) +- reasoning: 分析理由 + +注意: +- 所有数值应该是数字 +- 基于科学的营养学知识 +- 考虑食物的常见制作方式 +- 提供实用的健康建议 +""" + + user_prompt = f""" +请详细分析以下食物: + +食物名称: {food_name} +分量: {portion} + +请提供: +1. 详细的营养成分分析 +2. 热量和主要营养素含量 +3. 食物分类 +4. 健康建议 +5. 制作建议 +6. 分析理由 + +请以JSON格式返回结果。 +""" + + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt} + ] + + response = client.chat_completion(messages, temperature=0.2, max_tokens=800) + + if response and 'choices' in response: + content = response['choices'][0]['message']['content'] + result = self._parse_ai_food_analysis(content) + + if result.get('success'): + # 缓存AI分析结果 + self._cache_ai_food_analysis(food_name, result) + return result + else: + print(f"AI食物分析解析失败: {result}") + return self._get_fallback_food_analysis(food_name, portion) + + except Exception as e: + print(f"AI食物分析失败: {e}") + + # 如果AI分析失败,返回基础估算 + return self._get_fallback_food_analysis(food_name, portion) + + def _get_fallback_food_analysis(self, food_name: str, portion: str) -> Dict: + """获取备用食物分析结果""" + return { + 'success': False, + 'calories': self.estimate_calories(food_name, portion), + 'protein': 0, + 'carbs': 0, + 'fat': 0, + 'fiber': 0, + 'category': '其他', + 'health_tips': ['保持均衡饮食'], + 'cooking_suggestions': ['简单烹饪'], + 'confidence': 0.3, + 'reasoning': '基础估算' + } + + def _parse_ai_food_analysis(self, content: str) -> Dict: + """解析AI食物分析结果""" + try: + import json + + # 尝试提取JSON部分 + start_idx = content.find('{') + end_idx = content.rfind('}') + 1 + + if start_idx != -1 and end_idx != -1: + json_str = content[start_idx:end_idx] + result_dict = json.loads(json_str) + + return { + 'success': True, + 'calories': int(result_dict.get('calories', 50)), + 'protein': float(result_dict.get('protein', 0)), + 'carbs': float(result_dict.get('carbs', 0)), + 'fat': float(result_dict.get('fat', 0)), + 'fiber': float(result_dict.get('fiber', 0)), + 'category': result_dict.get('category', '其他'), + 'health_tips': result_dict.get('health_tips', ['保持均衡饮食']), + 'cooking_suggestions': result_dict.get('cooking_suggestions', ['简单烹饪']), + 'confidence': float(result_dict.get('confidence', 0.5)), + 'reasoning': result_dict.get('reasoning', 'AI分析') + } + except Exception as e: + print(f"解析AI食物分析结果失败: {e}") + + return {'success': False} + + def _cache_ai_food_analysis(self, food_name: str, analysis_result: Dict): + """缓存AI食物分析结果""" + try: + # 将AI分析的食物添加到内存数据库 + self.food_database[food_name] = { + "category": analysis_result.get('category', '其他'), + "calories_per_100g": analysis_result.get('calories', 50), + "protein": analysis_result.get('protein', 0), + "carbs": analysis_result.get('carbs', 0), + "fat": analysis_result.get('fat', 0), + "fiber": analysis_result.get('fiber', 0), + "ai_estimated": True, + "confidence": analysis_result.get('confidence', 0.5), + "health_tips": analysis_result.get('health_tips', []), + "cooking_suggestions": analysis_result.get('cooking_suggestions', []) + } + except Exception as e: + print(f"缓存AI食物分析结果失败: {e}") + + +class SmartMealRecorder: + """智能餐食记录器""" + + def __init__(self): + self.food_db = SmartFoodDatabase() + + def record_meal_smart(self, user_id: str, meal_data: Dict) -> bool: + """智能记录餐食""" + try: + # 自动估算热量 + total_calories = 0 + for food_item in meal_data.get("foods", []): + food_name = food_item.get("name", "") + portion = food_item.get("portion", "适量") + calories = self.food_db.estimate_calories(food_name, portion) + total_calories += calories + food_item["estimated_calories"] = calories + + # 更新总热量 + meal_data["total_calories"] = total_calories + + # 保存到数据库 + from modules.data_collection import record_meal + return record_meal(user_id, meal_data) + + except Exception as e: + print(f"智能记录餐食失败: {e}") + return False + + def suggest_foods(self, category: str = None) -> List[str]: + """建议食物""" + if category: + return self.food_db.get_foods_by_category(category) + else: + # 返回所有食物 + return list(self.food_db.food_database.keys()) + + def search_foods(self, query: str) -> List[Dict]: + """搜索食物""" + return self.food_db.search_foods(query) + + +# 全局实例 +smart_meal_recorder = SmartMealRecorder() + + +# 便捷函数 +def search_foods(query: str) -> List[Dict]: + """搜索食物""" + return smart_meal_recorder.search_foods(query) + + +def get_food_categories() -> List[str]: + """获取食物分类""" + return smart_meal_recorder.food_db.get_food_categories() + + +def get_foods_by_category(category: str) -> List[str]: + """根据分类获取食物""" + return smart_meal_recorder.food_db.get_foods_by_category(category) + + +def get_portion_options(food_name: str) -> List[str]: + """获取分量选项""" + return smart_meal_recorder.food_db.get_portion_options(food_name) + + +def estimate_calories(food_name: str, portion: str) -> int: + """估算热量""" + return smart_meal_recorder.food_db.estimate_calories(food_name, portion) + + +def record_meal_smart(user_id: str, meal_data: Dict) -> bool: + """智能记录餐食""" + return smart_meal_recorder.record_meal_smart(user_id, meal_data) + + +def analyze_food_with_ai(food_name: str, portion: str) -> Dict: + """使用AI分析食物详细信息""" + return smart_meal_recorder.food_db.analyze_food_with_ai(food_name, portion) + + +def get_food_ai_suggestions(food_name: str) -> Dict: + """获取食物的AI建议""" + try: + food_info = smart_meal_recorder.food_db.get_food_info(food_name) + if food_info and food_info.get('ai_estimated'): + return { + 'health_tips': food_info.get('health_tips', ['保持均衡饮食']), + 'cooking_suggestions': food_info.get('cooking_suggestions', ['简单烹饪']), + 'confidence': food_info.get('confidence', 0.5) + } + else: + # 如果数据库中没有AI分析结果,进行AI分析 + analysis = analyze_food_with_ai(food_name, "适量") + return { + 'health_tips': analysis.get('health_tips', ['保持均衡饮食']), + 'cooking_suggestions': analysis.get('cooking_suggestions', ['简单烹饪']), + 'confidence': analysis.get('confidence', 0.5) + } + except Exception as e: + print(f"获取AI建议失败: {e}") + return { + 'health_tips': ['保持均衡饮食'], + 'cooking_suggestions': ['简单烹饪'], + 'confidence': 0.3 + } + + +if __name__ == "__main__": + # 测试智能食物数据库 + print("测试智能食物数据库...") + + # 测试搜索 + results = search_foods("鸡") + print(f"搜索'鸡'的结果: {results}") + + # 测试分类 + categories = get_food_categories() + print(f"食物分类: {categories}") + + # 测试分量选项 + portions = get_portion_options("鸡肉") + print(f"鸡肉的分量选项: {portions}") + + # 测试热量估算 + calories = estimate_calories("鸡肉", "1小块") + print(f"1小块鸡肉的热量: {calories}卡路里") + + print("智能食物数据库测试完成!") diff --git a/start.py b/start.py new file mode 100644 index 0000000..334fe78 --- /dev/null +++ b/start.py @@ -0,0 +1,145 @@ +""" +启动脚本 - 个性化饮食推荐助手 +""" + +import sys +import os +from pathlib import Path + +# 添加项目根目录到Python路径 +project_root = Path(__file__).parent +sys.path.insert(0, str(project_root)) + +def check_dependencies(): + """检查依赖包""" + required_packages = [ + ('customtkinter', 'customtkinter'), + ('openai', 'openai'), + ('anthropic', 'anthropic'), + ('sklearn', 'scikit-learn'), + ('pandas', 'pandas'), + ('numpy', 'numpy'), + ('dotenv', 'python-dotenv') + ] + + missing_packages = [] + + for import_name, package_name in required_packages: + try: + __import__(import_name) + except ImportError: + missing_packages.append(package_name) + + if missing_packages: + print("❌ 缺少以下依赖包:") + for package in missing_packages: + print(f" - {package}") + print("\n请运行以下命令安装:") + print(f"pip install {' '.join(missing_packages)}") + return False + + print("✅ 所有依赖包已安装") + return True + +def check_config(): + """检查配置文件""" + env_file = Path('.env') + if not env_file.exists(): + print("⚠️ 配置文件 .env 不存在") + print("正在创建示例配置文件...") + + env_content = """# 个性化饮食推荐助手配置文件 + +# 数据库配置 +DATABASE_URL=sqlite:///./data/app.db + +# 大模型API配置 (可选,不配置将使用备用方案) +OPENAI_API_KEY=your-openai-api-key-here +ANTHROPIC_API_KEY=your-anthropic-api-key-here + +# 模型配置 +MODEL_SAVE_PATH=./models/ +TRAINING_DATA_PATH=./data/training/ +USER_DATA_PATH=./data/users/ + +# 推荐系统配置 +RECOMMENDATION_TOP_K=5 +MIN_TRAINING_SAMPLES=10 +MODEL_RETRAIN_THRESHOLD=50 + +# 用户画像配置 +ENABLE_PHYSIOLOGICAL_TRACKING=true +ENABLE_ASTROLOGY_FACTORS=true +ENABLE_TASTE_PREFERENCES=true + +# GUI配置 +APP_TITLE=个性化饮食推荐助手 +WINDOW_SIZE=1200x800 +THEME=dark + +# 开发配置 +DEBUG=true +LOG_LEVEL=INFO +""" + + with open('.env', 'w', encoding='utf-8') as f: + f.write(env_content) + + print("✅ 示例配置文件已创建: .env") + print("💡 提示: 如需使用大模型功能,请在 .env 文件中配置API密钥") + else: + print("✅ 配置文件存在") + + return True + +def create_directories(): + """创建必要的目录""" + directories = [ + 'data', + 'data/users', + 'data/training', + 'models', + 'logs', + 'gui' + ] + + for directory in directories: + Path(directory).mkdir(parents=True, exist_ok=True) + + print("✅ 目录结构创建完成") + +def main(): + """主函数""" + print("🍎 个性化饮食推荐助手 - 启动检查") + print("=" * 50) + + # 检查依赖 + if not check_dependencies(): + return False + + # 检查配置 + if not check_config(): + return False + + # 创建目录 + create_directories() + + print("\n🚀 启动应用...") + print("=" * 50) + + try: + # 导入并运行主应用 + from main import main as run_app + run_app() + except KeyboardInterrupt: + print("\n👋 用户中断,应用退出") + except Exception as e: + print(f"\n❌ 应用启动失败: {e}") + return False + + return True + +if __name__ == "__main__": + success = main() + if not success: + sys.exit(1)