From 0485a26b3d1f52e86749713f15b4525a89cce06f Mon Sep 17 00:00:00 2001 From: Adelina Date: Tue, 23 Apr 2024 16:53:08 +0200 Subject: [PATCH] add: Cheshire Cat AI app (#3073) * add: Cheshire Cat AI app meow * fix(cheshire-cat-ai): fix some small config options --------- Co-authored-by: Stavros --- apps/cheshire-cat-ai/config.json | 23 ++++++ apps/cheshire-cat-ai/docker-compose.yml | 45 +++++++++++ apps/cheshire-cat-ai/metadata/description.md | 78 +++++++++++++++++++ apps/cheshire-cat-ai/metadata/logo.jpg | Bin 0 -> 18860 bytes 4 files changed, 146 insertions(+) create mode 100644 apps/cheshire-cat-ai/config.json create mode 100644 apps/cheshire-cat-ai/docker-compose.yml create mode 100644 apps/cheshire-cat-ai/metadata/description.md create mode 100644 apps/cheshire-cat-ai/metadata/logo.jpg diff --git a/apps/cheshire-cat-ai/config.json b/apps/cheshire-cat-ai/config.json new file mode 100644 index 00000000..e829f767 --- /dev/null +++ b/apps/cheshire-cat-ai/config.json @@ -0,0 +1,23 @@ +{ + "name": "Cheshire Cat AI", + "available": true, + "port": 1865, + "exposable": true, + "id": "cheshire-cat-ai", + "description": "The Cheshire Cat is an open-source, hackable and production-ready framework that allows developing intelligent personal AI assistant agents on top of Large Language Models (LLM).", + "tipi_version": 1, + "version": "1.5.3", + "categories": [ + "ai" + ], + "short_desc": "A production-ready AI framework to develop AI agents.", + "author": "pieroit", + "source": "https://github.com/cheshire-cat-ai/core", + "website": "https://cheshirecat.ai", + "form_fields": [], + "url_suffix": "/admin", + "supported_architectures": [ + "amd64", + "arm64" + ] + } \ No newline at end of file diff --git a/apps/cheshire-cat-ai/docker-compose.yml b/apps/cheshire-cat-ai/docker-compose.yml new file mode 100644 index 00000000..488b0d82 --- /dev/null +++ b/apps/cheshire-cat-ai/docker-compose.yml @@ -0,0 +1,45 @@ +version: '3.7' + +services: + cheshire-cat-ai: + networks: + - tipi_main_network + image: ghcr.io/cheshire-cat-ai/core:1.5.3 + container_name: cheshire-cat-ai + ports: + - ${APP_PORT}:80 + environment: + - PYTHONUNBUFFERED=1 + - WATCHFILES_FORCE_POLLING=true + volumes: + - ${APP_DATA_DIR}/data/static:/app/cat/static + - ${APP_DATA_DIR}/data/plugins:/app/cat/plugins + - ${APP_DATA_DIR}/data/data:/app/cat/data + labels: + # Main + traefik.enable: true + traefik.http.middlewares.cheshire-web-redirect.redirectscheme.scheme: https + traefik.http.services.cheshire.loadbalancer.server.port: 1865 + # Web + traefik.http.routers.cheshire-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.cheshire-insecure.entrypoints: web + traefik.http.routers.cheshire-insecure.service: cheshire-cat-ai + traefik.http.routers.cheshire-insecure.middlewares: cheshire-cat-ai-web-redirect + # Websecure + traefik.http.routers.cheshire.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.cheshire.entrypoints: websecure + traefik.http.routers.cheshire.service: cheshire-cat-ai + traefik.http.routers.cheshire.tls.certresolver: myresolver + # Local domain + traefik.http.routers.cheshire-local-insecure.rule: Host(`cheshire-cat-ai.${LOCAL_DOMAIN}`) + traefik.http.routers.cheshire-local-insecure.entrypoints: web + traefik.http.routers.cheshire-local-insecure.service: cheshire-cat-ai + traefik.http.routers.cheshire-local-insecure.middlewares: cheshire-cat-ai-web-redirect + # Local domain secure + traefik.http.routers.cheshire-local.rule: Host(`cheshire-cat-ai.${LOCAL_DOMAIN}`) + traefik.http.routers.cheshire-local.entrypoints: websecure + traefik.http.routers.cheshire-local.service: cheshire-cat-ai + traefik.http.routers.cheshire-local.tls: true +networks: + tipi-main-network: + driver: bridge \ No newline at end of file diff --git a/apps/cheshire-cat-ai/metadata/description.md b/apps/cheshire-cat-ai/metadata/description.md new file mode 100644 index 00000000..319f1c24 --- /dev/null +++ b/apps/cheshire-cat-ai/metadata/description.md @@ -0,0 +1,78 @@ + + +
+
+

Cheshire-Cat (Stregatto)

+
+ + GitHub Repo stars + + + chat on Discord + + GitHub issues + + + GitHub tag (with filter) + + GitHub top language + +

+ Wikipedia picture of the Cheshire Cat +

+ +
+ +## Production-ready AI assistant framework + +The Cheshire Cat is a framework to build custom AIs on top of any language model. +If you have ever used systems like WordPress or Django to build web apps, imagine the Cat as a similar tool, but specific for AI. + +## Docs and Resources + +- [Official Documentation](https://cheshire-cat-ai.github.io/docs/) +- [Discord Server](https://discord.gg/bHX5sNFCYU) +- [Website](https://cheshirecat.ai/) +- [YouTube tutorial - How to install](https://youtu.be/Rvx19TZBCrw) +- [Tutorial - Write your first plugin](https://cheshirecat.ai/write-your-first-plugin/) + +## Why using the Cat + +- โšก๏ธ API first, so you get a microservice to easily add a conversational layer to your app +- ๐Ÿ˜ Remembers conversations and documents and uses them in conversation +- ๐Ÿš€ Extensible via plugins (public plugin registry + private plugins allowed) +- ๐ŸŽš Event callbacks, function calling (tools), conversational forms +- ๐Ÿ› Easy to use admin panel (chat, visualize memory and plugins, adjust settings) +- ๐ŸŒ Supports any language model (works with OpenAI, Google, Ollama, HuggingFace, custom services) +- ๐Ÿ‹ Production-ready - 100% [dockerized](https://docs.docker.com/get-docker/) +- ๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ Active [Discord community](https://discord.gg/bHX5sNFCYU) and easy to understand [docs](https://cheshire-cat-ai.github.io/docs/) + +We are committed to openness, privacy and creativity, we want to bring AI to the long tail. To learn more about our vision and values, read the [Code of Ethics](https://cheshirecat.ai/code-of-ethics/). + + +## Roadmap & Contributing + +The Detailed roadmap is [here](https://github.com/cheshire-cat-ai/core/blob/main/readme/ROADMAP.md). +Send your pull request to the `develop` branch. Here is a [full guide to contributing](https://github.com/cheshire-cat-ai/core/blob/main/readme/CONTRIBUTING.md). + +Join our [community on Discord](https://discord.gg/bHX5sNFCYU) and give the project a star โญ! +Thanks again!๐Ÿ™ + +## Which way to go? + +

(back to top)

+ +

+ Wikipedia picture of the Cheshire Cat +

+ +``` +"Would you tell me, please, which way I ought to go from here?" +"That depends a good deal on where you want to get to," said the Cat. +"I don't much care where--" said Alice. +"Then it doesn't matter which way you go," said the Cat. + +(Alice's Adventures in Wonderland - Lewis Carroll) + +``` diff --git a/apps/cheshire-cat-ai/metadata/logo.jpg b/apps/cheshire-cat-ai/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de860cb83edaaadffdd282c11f0e99e05e9ade51 GIT binary patch literal 18860 zcmeIZXH=6**DxGJEFdZ%f)on~NDz<`kZOT|)EGzz9S=nyp(wrM!2?2Q0tN*Hluja{ zh8Bv28k&^Q1JWTh=^fs9&hgymJoo*4@AtlIeQSL`o}IO__gu4Q_MSa+U9)Fq&r$!; zH^6yKH4QZY9o;d20PP1j8Um;Q=#Tw?AOG|;IDX>z4>)z=1jC8brx+PepE`Y-@yxk1 zj7(>lPM>CGVLp5A{CSr1jAvNcSkJT3=<`1+q5Dyi{`e_c!ShU~nP^Y{58>z|faTON zz%c+l9Sh(X3mrWR-BBIjGJp<1Q;Uv{4)7CBoj!5$I0GX+-7#9e{&@gR^0DLe4D=@$ zPcSgknCOntA7?mmlI0ZZHHp(~_b%{3e|gF-`Rhgg`+70&IixJDT!Lcb(mqM6=%*Kc zz7ESM{=#_)VeR_-w^x|VqPlKcr59=9{w42sxxWkJVEMNUI+lA!gMc&iG%Z=^Spatc zgj+xL{2%=PYYQB^LcN0)XCCxTApcUJZ#@7UnsHY$``o5QKX-{AVav~Zv(?B02BYMX zh`#uz(i*%#vLBmq0ao;GchaP%mXfCwbe3!#qd5|dR#U)TCNG7rfOR^d1`$>NSIzGB zdxS*KZZYq)+e7px5vBdROs+9QazHBlYFOJg&P?b|CtCBy)u!Un6ANhj5AvyD%?edm z`4*c7PK*zKmi0>0BqZvqYWOx+P$T;PMuTI8ex`(8^q5K1_k&;X4*8``uZLFE7Q5u$ z);r!58(NQvjs+ukl?4RYtE_cvPeoKR=@KXVBejQ9UvW-k{K_5}k(lB&9J#yWj0wbM z1`Yps6=`rn2!kAX^^Fiw_INirY=Z3K*v!zop`*cHwpeWA3%}bey2b537{Zi{txPG6 z$_%^CeqpurL8j%Vt0@`gB3^&t?A_n%`EUMsP#DtaMWFX2Y)V-w~M3Bv9oRc%2b}Xa<}`; ziEg9FSu<0)D5wZ8o7hdugM_M&!3A|4(Wknz{%V2jcZZeN|&TeY}fxyH_#0UjLjiiA!q1(fo zz+G3mKw|{eZl!SaT&c;?oNvQs6xg~Rj0qs7i}ZBH0Qc|*|&;;x|7+(BkR zCzRYPI{8S<>dSLM|xfNRDdcdlw;{iAO{bh0oa*-#zFP|Ud>765Z z>F%E*nVA|!sz=J*zA9w7hJRtoCu1HOJGyAs`8|QiN`Am2*FE_!@yBqaRd81VoqkJu zQxw3ru_l?Dm@U}r&|YEdQqifr@vvV%V75PT(n^1_H|_i*kUIvmR*9{|A`?=#GBDIF zaWW$JWF1YQqd(oaE8@0et%g^(@2X^MZWCb>-SD9VMD$qWr^vW?s23Wq>n1H=!@*&5 z>fs(ylQH+eIL_pWb9j%oSbR*a-NXH1Y@J3@Z2&BC&kt59u#_~f_6m8xhAZiK=#aq1 zZ>elJiyfRBLv9*fGs}qHZMz@w6#$SwvnSWE-py1sGvM!Qx3CG+5J66v??*x^dk%yu zJWwVS(@9n8yN6;mC^fD8-CWl!6~-0aa}D~%26BgZ~KCmZh|yasEJWAtrMuvhxcF99d~ z-y7G*&dTH(67F#LRHk*y`+_BFF_>5QIq7pdO6c60mZH@Pc><&O8l?DxtA0U}*gH#j z7~HNF+GwIBWXo@wY&^N{i}0wZi9%+-fB*7N-RSaeqrX=9hF0Go+6RCU0!%14=7M{t z#N}Q2oIbB9HEf!k0-=o}i+Y=sh6OTcAzz2oUPyG>p*p^KbqP}{0CzOFBd^0(*6m}v z+SXQRrT#;~~%HOx;ytO9BAkspt;YE(;f+ zIZvTN$mYCAdVbR=TcwU+ZX2^C*3-ce<{MY0FjUiWDGBUFbF?-xaM*X)kVa9tL6OqK8j=3_dXxD0|;M#u%09=$CyHgiE(5Jb? zy_$HCi)Rw;=5mXgZSIuA3hM`|gA{wS9S6j5FAI!z-u+bR1T%J*KhtOQmjI>QezVFg zNYnHe>B7~XZs6f7DOuaPS{bbKe5Kp5{I>ULE#3=2Dp+G)#&^zaoB z-Xn^49eI$8U`K0K+EvGQYw;ZcGKa5&A6N}lX3ge%P@oY$yNow3ANUieI9ft90`ucb zXWX&zrA1kA%9;*8ro;F3I3BJ~Pctz*$jepwuCqA!L|H5Q6WDbN=zezTI%`@VjQX4a}Cfc)v!r-VW z)-}dL^@U9-8EF~X&uC>9B^(mBf+tI>h}?L8_TDxlc6W9ag+^&-b%{~soMZ*@M@sZ| zmkW&CCp0A5phYffL-l;3a0RohNrw#yS`?`RbAwmmS zvRWoDD@tPt#;QELmAwM$%vMqit?stxqHHdaT|D3yyuZ7eHi}#(qY{ZgphHeAJ^gnk zrSGI~<4r>hS6FrvY|*8a1nRy)NS3nQTp9|aL})W#m20XopIaixb-TO5D_g5Zj_Y}_e zD1{Z@PHP3k!rLC1p|R;twTPY#ct{Uu9r8C4xD;pp7M<5;*V z+4ss!m@_mWDf+hEjWK7tZ(*SgAmvEpwZeXyG-ic*e5L;PmG|Cf-%CC? z>^1BfwGP`8PkNHT&No}@%^5mpnvxe;m-bvl1h@op9TuTl=j7(bbn8e*A(SObaK0G;LGdHDh=Pm)BZNwC3JGvR@kCWcc3tX`Nx7@wc%v^@Ln{mh`wKb_pa z8vBy~MYG8#@1M03bj~Ske@Pz9lgwno_!_j7NFM=~Gorr_LucCBU5E31G3_o(SX?D` zU;Et0AB9iaL{7>^s9!6!F+4!ciN*Ugp=POQ3e!64o(|y?su~I>qLD2sR=-MrjGl!YNG;F7C5&Y&*4!!KH#Wn zngB;-_-l5-lyYal3RYm(JGY};O>;>(>#Am*P^m|)`_f+OJ%%95R8x2EbLEB(<%^1= z){U-NZfpjXoa%t0X+xmlIVHs2RG(1Iu#48B z6?F-LtU#fJeD=E9M99lN`!ol5U;FHzm7crDBZ|E89rvYyE?MJFvc83N5U^QxG!cK? z5XiCDpCNmq`=8=}rWmBQvu8#zRZvLempdTkE4JySE@?}n@~XxOyc>fapuqQK?-Q?$ z{lQKz*_lWCv~OZ9ca!X9+_pDJz(zIlz~f*J`?S$-+vEj{xL4_4Dd-Ky=9}^R=oZ*u zl7Ck`a8M&@(9p(GDGCxxXsQi+-%hKIm*EKT@RlMJUZLyws93}YYby4zd-0&`DksBe z_z1@bCj$g(GgS7Z$CgV+Ui?=6+C}PI+-4(VB(HVK^(xLn z52pg9BS2>(K6OT0I`FC2%kRI4HSbHh0C(?PsT5k?bPS1_ejaUpe#yjFx!fqB_P{bF z>)c*bqV(g7PB(5pX_C|H#&7dNV2lE$Fg(!1!#(BFEm@dyqvBZVChG+-8aU z&4g3}I_IP!tpx}~_(*;wCBoA9nq%%%{EAfmmKwps!Zyr6-b1_|A7kU$dmtC*>G?(owYUDAiEMOy~?kb?Jh?#Yq<&dZ7TTH*|xnz*(_1pLCEa$}7Y(2gv+}Nm(wg-DY0_bzSZIJm;i;tNl zPPoKs&t*5t(Zc`MKmLZP`ck3V- zao1zBzpdJJ8JSnk>$+?aZ;>M^m-@D%@N3ZPcB#iLi5RxY(0k9ZIE?8Ooc3|7c^B}z z?#k=#2d;HER16l6gg@%+Hhf|7W_QfR8fU(DrNy;%&GRej*u!H)%Bf{^uSe5t#tO-+`w)d$y_)5m9< zc{h+izXo)`M5CT{&k|57DGBH|C<1cszwjWOXu{6ttvhA$Jkufnu;NDaEu6>oM&sMuY5WTwXI09S)D4e zB5d3e+Y9i&8u%(ToSeIjR$SrySx&hv?}H8h;vz0V*xE;Pn-#n|ybe}%DJ#PAVV&3L z$A9wuj_EhrUEkteuvk15M}hq@E6_5op9Acm3YJ9IsTDSp=$bKsELHgIIyU41SNMT9 zXYQKnO^y<~e^m4{0gh(7nZIiLn`uf+tcy5tR$oYj{yMH9*y7qGSnje+5zc+vaRjhG4c1HePeuOzjQ;E9uajEwvrZ|K%W)}M zS>h-x#*^aLsMnAW-bpW0u~Paw_fMJ*9w1@FMMfH=jGOLdmNvqlPHp?@sK2f~h}*i9 zR&(kn-+zZ0=Dhr@@4WK6YColw+9tp&3a_4{j`HE{5>xw894nyXVgJ#w(icZ3uPr)> zVD03#_BgJTJzU(aYTDU60tD8MKMwV~``?NC`CLrlv(Lt6Hk0dDku4K7sD*mjCte=5 zzzN|TLHqwy_*hu^K~>&X_<_a;gwxAm;n}#UNj;Ubqf4!wS04PV^zWE;;>+`pg>#`g z(AqotqWKm565%FD-n((lOi1A4xL7eywVWk2LJ`p#Mu8HSlG6Gm@Ji*5#ZQLvgl)g1 zCn_SYy?5;DzEC6&&fI$2Y`-&%omrJ5rs3yX_*vj^cDSm;)xX3sJi{gfx{Kf2=O7eEkFe4RG1`&8g#}1PjhZgzWa;sUj*F@ z2UJYNv*%380)EvIO)yJP)bfvd-i-+=uwe2IZi}ZpSNjKiP#VE<5 zb{?Z*uqip%9`OBe-4*$6%`-E>Eu~ruj1V~q0=E?_A!E)8NdNjqKKSmQmdp`A@{@Gcy<2jwhip=bnwswM_%;apCUcxS zQjatsV6nt%y{`r4xb(9M03h}9In1GX$#ieK^Lm7t(9pyb`Sa+$-akD4zqskX=V5Kw zc{Yj;NM6YzHIZQW5#ZTnR2F8fb!WlF5Bqp;fQeA^3yJSUW zMU`@N_o(nW4es{ z0B+JbRrwbWw|=mu9I8CA>y0HCAuCzjN(}hm{HOm^Lj=uuuO8Z$k> zd_p+P2)Wc3{tta^SnGVO9y#xJOqqLKz9V}>JjA4@-M@WD zQHyvTkKt~Qv@j^lv$m_ryRznPw-4KfoCu7N@-jC6(J+)_)ZxqP3K_3+kNon~Zu>&6nks1|B?2nRS_D7p- z?~r}tj+>Jt6w^;t_gERlE4UO=a@kpZM1pB6FFt+1Pw7Srv&5TT^_{b|nno9(Gmk$0 z#d7?^_qJ|y)jT?heP&>IFW`!nz7H;7geu2x_+IBw+2MnWkh_|~H=?0f)z|0dg8RZ| z1Xs4SUQuO&a+y%w90l?u{nxkM2oq1lQk^c|PYfZ)l?=}h7{Y=s8Uh8NP!Ij9zssT{ zdfgjqehZ=Q`?$knMWaFzM?r&?S+`>~l8-|o!+CVzsxz*cNT+HRS+m!U@!@a2;yK-H zUzq59ox=-VU@vNjAycSip>nv;>NISY(jB12Z&V9Ia(yB^1JM8KU)#Up`{U&ksOmJ% zd!=oJM2Xls-1=O1AXH6_MEb)RVJmFC2XcM>zAyN?ffzhtVBw|FRQZk;w}@?&{iJJu zl&VW1s{w&0CutQwvP7y#6F>i_jWlb|*jM3iJ@s(jcW3BK-IU`!0ti1M(%=0v|L^Fd z*ROHSU(GaLZ%8nGskOO~7OklES3WmC*vpf=bk#Y`x|`=dcD!jM0$ctd1l03**3ouSivRQn52~ z9@A4=g3PNAk13!y098`+I-jw7zMm(H%;$OXQ)Yfi?VpO7rz}O=-roXlAml+V`R;;@ z+Y<_3#+5G>VEwi0rKsTtu_muPcIHIvhS+t)-}K?GuW>FJaTDbb6w5T6?-Eh#mdgDf zO`uD(KaoFUd@1=WRV;aU0POi5H35;i9xt5cv;%qTm zIOBU4!n)h=jVN|>DsOJ~XyEe8N+H4E6@d&>aQ{@*T!{8yg*{6R#VN-&&O{BrI9*p0 zUbL`@dxJ%XPQmnM2fm^50(jUE>K;0((>6MqwvmVKmj!G7QCf}wj}r4=vc&F7DOCb6ykUC|^M<>DQ2%FwKX z^;G~}-Ucz$QE+Vjvi1x8)zBQpNzcNsbt#TEs3c0k=VUVqiz!ipm@O6e1n3+QptR~F zG@Jfup?pH36&PDch{%qG$P|?t@FzC5u5THKM!_EpRr2K{6s(72Lf_r}L(h&95hKY+ z1~QXimL-Ap`eyUcBCP4qz@SS`zdbv!KHq6>)f^#YkoL-lu|ZNq*CKMTsD)V*W+D!I zXnJEBvhh;0&X;$a(3BPY)T?0{6egHtzb{o$f*ste*Y;ia3!AEED%~brbUUn!Mfdz% zjS4+ZnspRoAA66j%zf3h1KR0c?D~pJS}sB-PSD$Lj^g~9llk@srt-~$zXe&dqP`&C z7d%aPMi`wpa*qy79l&TEf`h*6{AuaGBYHM6$=R{%ZCAA8{=Uz|#UbZfkaXCgWwiW> zzt}EazLd)qoDHhA`zBYv#hU|Hm)ElSY-|&_UcnPOxg$1vynbw`UdrIs{1oqNGeM_c zB1oI{O1}09?4+=8+JRm}q(f6OIbYXi-N(ZuZNLH1qNZc>u4!d2f_<|kQ`-HN`$L69 zxv`j>X(b#LO$JNLM{0G5%G1u@E~Z&P%~Ya>kYZ92xZ=#!e*A->{cIq={`4e$#|WO< zZl71N(G7KNNuL+<6owm**sSLM0yclZhdgNN4=)lTBi!NerZ0avz-Fl-Ap!d{zwHM^ zWu>=c>ruc3DLDjIMmD2RXza`iNLdGTTx;b8`0!!@h~lxI{Mz~mFmA4SmF^E)(A#{U zNPC@fmGI(9H#a1K2fnsb#+4;_*sOA;TCtY7vzogW?E5Aq^P<)GukOY6wWlxoOE})Ki;-vh9c({sO6I0^dtuRr!MD=x8v1TZqod6>Xj``&2rZX)zoe zwA%KU`Ts@GM?ZZZG~=9G+LQI2{CWF2B;1q?J|LY;LSoRTN)!g95<| zE`;VisP@^vtxn1yr}NCPt#0NUSsccMMBIsdWS1+^Q-A>>)jv|*SyU95CYRf74LZ@Z zB3#+w@NF4nqd<F(pq=-;NILHe`U8yQkpf9k|^{kuoc4a;)mSqz!Xr=ia- zx*H;3zK<^G0R}oHZE`*5SP9O{j5B=V>neckxfiKy&lyhs;13HWTVM-E3trv*V}#Rh zy)*GiOT$Tj@JE%?DYa(}8Od>O3OhcoL-QJq^B zF(&TVWo57+>Sy#OYN(|`nd`2u;Be!Ne4JXoYVHSD539KG7!~fgDd8K>GFaC>lRoY> zUNqPXw?qg;H9pOES=?f2byPkAl)h(Mxyhky_p?!d$2X)RhPiYU$HVm`X24VR0;{NG zc|M0Q=EvllsyqCT)ecXny}nAf*K`Pu!+1kI5RTn}FP7+ky0fQK$H2(}+A9)b!qP+c zUK?U(`|HhO$mdskXpXD3zRNSOXL6GS>dG@0mE=4Q^1E zU(IvH?)m*q->JfOcO}?^K8GkUDsj4kJs%YVXUBuVVCpj$kP2Li^0*bbMtRUAP-Twe zY8qAOZyIdsPm+kRV&QB^^8vBQ!p*7J5=-mfo5&F9_2j#fQg11xPC4HwnYSjP6( z!U7Knd6AOmOJ>Zo?KLIpW4$}e=HC`~OB?}w+2+KmZ}{Vxsc`Zk?sa^d+s`2pLpHR zL5kW$+QbF}lLj-&%s&vAAo@&|SqFog;&T#hFjv!LS_kM(a(??m=`%Ab?t+e2de5ln z^P@G4qRrmna?p2bMdcOj)1BKoD;6O+7s2C7b-mG#c_j44x6k@NZbB7v?Fx@)zr$G< zebQp9n$eJA@lG3PwURTB^pwKLY?+njU{$UH06gLT4DjBX!~qp9<*cH|_n6?bJ+32@ zDE$OdXfj+Ln?`r%3FKs(dS#~yBFCrDsxd1jXG?D==X!aKQuk6tyPxQ^ZVL$y3Cex) zbYuDRcxSqgMl3Q?xuPV5Y2_bP?ipn$=*COa(T{`OW3ga@=t)!KUzoo zKO74|h9y8CY*X5Lrh98;Bw#mzFrJb{em>r1c8=hX!#k%B-r;QR|Y&b547 z4w$xeXPXBc*dxG)0T#p3dygZm_^qrWBds_?dkMKkd_vZ$($_k|Hmi!Y)`bT>ZS&MD zHW)g}RtY2f2E7Xe$gUjw%Z;VjTIWhl;esYQuK?ae<3;f?D^ATyn~(|2%>)5UpaX7^ zr$)WwfcIs9LSm5ig}+q(gP{9TWwz*bkX3r%iw{9loU&u__$*tO#xoKG)2#}B7A`cl z_NwCk3d@JGYR}%A(Rxl8g5*6j6Mn}hqzwz}_b80;7}CS3bpYX5=2Af+Ylr{(eZ6N0 zpZlaRe7K0Iq)enb(Kt!eQMCinG!+D1^(On^Vo!dl%!e;kw;YeTL6`2;)hRpQckYr5 zw{xb(vfIN8`Z)0c(%O}+dtGSx+rutV-89|wK>B1^h@>dn~n zAMdGHqB0zslK3jP@&err^8GcXJ+JV1bgeM|4gy(r`@B1biyCdi z0y+xyH98-a)#0X=Qlflt87@BZVBMw=wWO;9`_i*h9#!*BqFJvxAC#0aHng~6h}m)X zIBFjr9B{;7BeyHsAbQbv*I&Krxlr)6^B&KI^_9{aX^~ZVR$NJ-oUj2F7B(vt>fem~ zgFN-TK|NF;J47+*~&o4jb9 zC{OpChb_Zre5_0h!YNT!zgHiGa2#dpWH+fyb1h3q!V1ai8_T=|2%FS-zEGcyFNfL4 z0NJD2+ebya!VE{-x_d>+u-V&!9WD=g79ue$%G883!Iyy2D~uxoe63IHw*yHcW!083 zm06@Y-euSj&$7?;QQ~{w(xHvZb*cksB=cIm=ZQhrdiLk7<%RL4H6a2v#aDx_yG80^ zU$&2=xGCh@mBt(MY+()e7|pDI*z`ZC`F}C!~Au$I`tAmm^av!kLVV$vfxS@hGOK*(%f6|S(uK1Fg6#-O#u|`}qYm1Y!7L`5W_!wo z#KN|1pDbpw>Qh#cj1jvVXWQ479i0mc=cpvLy(GU3BjwCbH|=wCbLPe~(zByZU9(ib z0F~fs0I^x4pz?ftKG)QH0PMx%G4&Y_yEVQj)4NP3T8KFmVL1*O-2B{bvnn`}mGs+Va+Z_$!}OQAg1r9i z+}KgtzZ2Vs@wyEmvQCHIlu6Z9%uV$hsZn# zonuR0j4=((gNW4Z=NO9Se5J$QPX4OE!OErL*&U9pXK)Bx^zfM}3$)C)6vqfPVmu9$ z*sz65s`Ev$Xtvg;XTkv_e7U)aL;R>$5m`gsNQcioN=>Y#uPALxU5Mtr>2yA9n)^tS z{-P(D%-8WDF*?Lx4>VE_8+^k<#9i0z2%Amr-xPT>xq*7cwDQ%=p{_irn_D+?Y>n@p zX@?j-rUM)wl9!X>sF+GZ=7R_167yW#T)25R-_12JW6SFexO2SfnKwHOQr~7_quo%Y zF!jRb;&dM;q7pU=0=_FE9(IM%p^+mtTWD;0Oi&9s&;J3`Rrs3GZMj5GtTj2eFKxB9 zh)>BU;nT6@cC;D9e|vh+0FY{mShs&Unb~;(Y}a|6HKne38tJB;Jfk zI|8WX7K@EuhwV6MbEU0(8x7OlFbyXLx-NxCI&*|9nQ@Zt|w(y{cSLI#c})GnxB;p4z$=8yss^ zQ1PhBWLj-+!8Wmp%3T`(4_k7{wlVC-4amIGt7m36YcEZq+|%8mVl%DJtJYDv9!#mC zph|E!^i25V7$W!sM@XJ>*`Q-QT5c7a_*j0=$FQ@zrw7Pa9qF^-AZi|I>5wEiPsG68 zuZ}R#lz2YE@5fndShzJWlW1(9J=h2#e2zNdyM-1MN)sAMk>0DpKVG2b)CmN=e@jN< zOws7@qO{#hSDrmEKjT$c^MsfaW~9H!-tV~B8g$@jxm1-yl*zhop5ow}uiK8Sz?IHU z_luuoCp}#lmVWaTL!>#eMLSRVHE>QeO$TAqLqC%jzK#n|{J**f~ zZYA@a9rBs9EaJ*8w8CXWrm>ewB6M~aq6Yk-cY_jZ$By-BfLc^Q0-R(@E5SMfKGgS^ ze1BvlG%9?ISgjGnOI1I?qcdlc834_YZO$2ok5u-tnhNg(8d>P(PeSHa^PApCR~58C zM82g6HC{*N`CcZggJ>rN;x<YKOYa;H?tD7} zghlGQ>DEg-^Sdh!xsdz1eHkRP=dTkO8!GOkVNF?ynpIa_MZ(kYy=EF^1G!{qM_GTG zG4_Ql87CduKjGQN&3A?^9DG}GZ0p`dU@IGaR_qEZpFhFX0)>YkJZ?ISai+$ALTitG zqX_&QC^URb_Gx%S0QcuZ$vuDmx%^90BnEeETL*A&?NZ?s@Zgq5f-M%C?1@k);^T8e8HYxqpe$U!k4tN}t2RC+S(oAqXAJTb zJ}yG=L`v3!31^tKwr+mBdcbcEPD`%UEJ_ILV_Vx##*P3iV?=GyUGH#^P(tl`QeJ)Q zRP31Xq^e*0wvZ~yq;i#zr$hFH_YYqEo9=&*C(T|?Y&sNud0M}!;0E8s5pI^iONz1< z5>IpG`EpF=!F8XhiHd*k8SB>E;EU7Ci)vaT%T&JlQ2NzO#4}(wPkW6t-L|a}6n?d*GXxQfOUKR*R&@-(-a)LZ9R*^6YGi= zY!w@CNG`~4X?PZ!UDKEo5w@O*G7$gd&(7fnGsDmp11!*oUl%_D=s8=Yzv#I37|d|_ zM^18Qi*0Ga*tN=f)v)il@GBoZPnGq3z*O>Dg&_{JMZtUlP1crdC$&4yDxa~6Yjui{ zKzy4&=xpA*nElIh{^BS1K05|C?ea1<*cfa;9K$xk_JmwJ)tKK$*pH-+iK_kbM&`~V zq>xx|i}i)vvM+0n_alD$hrN&UO>ozFUg+G$x$UVTbBYv)MuO5Ru(4kUc?UdUbJESb zVM~O7-6eE=JQ_oCc^fX%gj%gCT|;^3+yYte_O{Zg;%E@gO2+#SBqo909d&)|o$!=WrNrjl>n&-YQmA0*my z{gt|9s#WW&&5TFg!zjX!D6$WXtNYTbn_Gzvy=8ijVr>4Q`acp3-YZ|m8ZX;`z97m2 zN>w0!afw-rk#(U>^At+A-lm#%HRXz0Ez!eMy@kQV07@RhPQNSHYtw=2@V`$y{pLfg z5W$0XV}?qm`4eC&+S>2#sGrD6c&@3K#p?y5i)(0vW^~2Gh9nluw+@cya9@2qATzBB zGmGJg8jz_J)4I1E*@fqqaBG$xy=tTSl29}1kTWPhcoOSBkT#m;T**H~ z`+D%tCOq;X;(ZYB4Rn3*_~u(dMGmK?pAn_3iaRwIIagwZ9s+C8fvkBC zdLJ8%RT`5%h@VYL6uxeqWV*zX?-s9y|5~VD^)%nHv%^KK!A<2D;1WK@Zs|QL-d-cf zzBy?R8Lh~1+%kddt&*M2l56Nxm zb_P21Q~O72l4Gtz{Bz4jR3`<3-fhIGxGUUqsgPjSX|OGY`?hB#EA1ltI|CzvU|ZJC zP85Crw~=OFpC7xr{M}(os#`HJPU54B<~;9o@X!~8h7f-z2hlY7EqNi&MFcJn1k%~O z1#Ra|c;?tknDg7QwmsD~Oo|!$hUjdsuE-81R&t2r-b7hqu?ux7#zLD)F%vtEDM{Dr z^W8Xn%}}hGJ|wOX$eFxt!U7z8kjeY=r1#GTaxEKp1$QQ&eQ!*G^f18_!L|wP+!<>q zLCEyn#0WwtYnBp6e#m&xS9@_dWNz`|<;yG9#rk3kS{qcE7FaC_oxpAtJy~=!DQyD< zYY$~gc)Szxev~TtVP2qo)QPNBMZj#FO$0+|OCtZ?tOKqjJ|R`r`)6MQSP{Vi3?M|9 zX1RE*ilEeQpd&y^P48V|4~PS2&u#6J589CtTF-I!Z;W(Kl&y;1VY{@bdiLAmTy~(oI_Cujs0OcHz&I6<1i6*ToMLAWn~T%N~w- z9SB07tX|7c^L`s92Rf@|%~I;sh0=aCQq=TaG1}^w(8&fyYypc~1w+g#DPM2b@ zR!JQRHS1c*+#$C&Y$;s87l~^}8*@X3_)1BQ5yI_+5{jYOcM8 z+sj`(yGYCR@FM?9v$TB_Eic^InvoIPEnfYiUIVStUTQ*hY*}E?JxLjLhiX|`lv_)> z!_TJDf}d?uSH$0OSxgtplZPz_plA2jQ%0Jxan93x)35jWRZV(oIYc=dW05+NU&MFZ z^<~vyu+^a)%6FJ+OjmxVrE}kyvxJ`%|Pvo7Elu-y^UBTI?U{PQH5_sy9>4=0GYw_1n@W!kuIN_=S}}K z`PLUFj={E}>B>`^AqlvFHSNU&wg4v=KQ{McZRIxK37?*v?6MhLL1?|Pu$qcjP`t5R zlxsne+lk@T%iYgFDWnxrF7%!rf8$_0`2*ZhtT-x0%8hBKzQ=#us!q!=X0%PNP424a>bY4G zpLh~fBHigsv^0cc2cT@$hzC&!pM*|l9^kxyd5xW*5SByJ&VC6Y@BK?Tn9-pQ8)W;1 zKQSfJHGM{v;-SvxM7+pc^zdK3@Lwrpo5NTf*z0-Oo>qyh8-;heUxa!nRIH zw~g?0t-xweIlv#(PFSf$1Wb%Kf1YCFp&FkV|CT#YviZgscQCoYbt|bOLihE(wjHI6 zOFGWfJx3cQT8xZ2`1LR8CX+Q135yWGAUDfop9W&Nr*{TWXa+;6a=0`R~Cz zG1=d~f__|jkTH*WGMZO8XE^9D**%}xn{3f6@Tqf0`c{6vl4_C~Iu+N7H>>1(1vxnN zJ*IwP9^yAnf75+4lc?n2fv91Wwjjs9hYG|fYd_eu=z@uzo)3A{?~!aMyyC!iskGlw zI(Mg1lhNY~mpBf?m9qAl+)|0%fa^v5euhNHybmR$ghRZ1UqkHXjfbZFACfr7QPrCd z>!zFah1L;v<2ySoWj2FQoe*%Hm(JwZk=u_y6nZxm_e&a++@k~Xq726q@Vg=zF?X<8 z?-KtX{14h2bk^qAG5IjtfIBIc9&dw&4{9h@1i(XY9agmy{IvAx3r-HFH7r0Ko z$pZ%@kBA$B+>&tD&=9BhsMix0aMPaa8c?>*(?M6Mh~QKvp5h$zR0o! zKhTl+9)$b0}!#~ZpV&YE+S-?p2=F%EgD{)g89B61jAVDt8>FN@rAswHUVcBE1T}lu6T;{PHGzP2 z$#CoQg>Y}fBHHeJ@Z>J^l zeErMt|B=`xcXlDVHPp?tm~|A}recNPL|b)#%QHtmL!Rk=9>w9h;k&AHzCm$7z6RwF z9GY_3H_(Jfl4?PEkGi~_f7?3qdc<3TI!xq>@hL2MEeK)tH-T~w=N`Cmf|OOh(axLQ z-egs^T%mq>Qow%%aENJ7rR}WHdwvh-<75x`+*8FxU@IfY;}Z~jx0;UttdHt(RX1*D zWmvRAf_sku3u3E62a}?l@&kUNUWDi+Lx};O#ifz)gK7`XJLOe3y^3P|_mrhLoNIk- zclaWB+fM$L%|`b1)mfuU8?8-s&-ECkbl-l|dh_t?;QKq`Qzr^6drS_Nttu-UU6*E*FgpYS!`6%yQ1^9Cu} z)u}nN6Z=pkN$EnAIhE=S?Odv^sPL|_VS61i%KrBGwbndN-Kq%#yBql8M%9*s-2CSQ znLg=;yP+vFAVWNC+LgU3w-4hX7B2F);DP@*4*u<7Ae#!awxoWKYO^H<+sy9^ZS#f8 zz+mQRbjmX|f9Us_F)RIKC95ai5?T>dym6~bptUOe@E7P;&uz8vH9^MBapD&uwA`~4 zW^35ivHFGSSI-Zoq!^F8GBf~ltM>dspTzo3V4do-Gr-Ahfve^p90L39F>L(jD--`a z4d~UL-urwu;VA@Frv6690$F8L(KYH(hGVtsKfrV<<%1n!uxVl~MQNKb%2126`>@y( z{mkK;H4~l