From 3f8820dd60112f007877c068c637cc114287f98c Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sat, 8 Nov 2025 15:07:30 +0100 Subject: [PATCH] Extend Hugging Face support and fix/update examples --- README.md | 8 - examples/huggingface/README.md | 128 ++++++++++++ examples/huggingface/_model-listing.php | 48 ----- examples/huggingface/_model.php | 27 +++ examples/huggingface/object-detection.php | 2 +- .../huggingface/table-question-answering.php | 4 +- examples/huggingface/text-generation.php | 2 +- fixtures/README.md | 8 + fixtures/accordion.jpg | Bin 0 -> 139216 bytes .../src/Bridge/HuggingFace/ApiClient.php | 66 +++++- .../HuggingFace/Command/ModelInfoCommand.php | 69 ++++++ .../HuggingFace/Command/ModelListCommand.php | 60 ++++++ .../src/Bridge/HuggingFace/ModelClient.php | 10 +- .../Output/TableQuestionAnsweringResult.php | 18 +- .../src/Bridge/HuggingFace/Provider.php | 12 +- src/platform/src/Bridge/HuggingFace/README.md | 196 ++++++++++++++++++ .../Bridge/HuggingFace/ResultConverter.php | 2 +- src/platform/src/Bridge/HuggingFace/Task.php | 73 +++++-- .../Bridge/HuggingFace/ApiClientTest.php | 10 +- .../TableQuestionAnsweringResultTest.php | 39 ++-- .../HuggingFace/PlatformFactoryTest.php | 9 +- 21 files changed, 684 insertions(+), 107 deletions(-) create mode 100644 examples/huggingface/README.md delete mode 100644 examples/huggingface/_model-listing.php create mode 100644 examples/huggingface/_model.php create mode 100644 fixtures/README.md create mode 100644 fixtures/accordion.jpg create mode 100644 src/platform/src/Bridge/HuggingFace/Command/ModelInfoCommand.php create mode 100644 src/platform/src/Bridge/HuggingFace/Command/ModelListCommand.php create mode 100644 src/platform/src/Bridge/HuggingFace/README.md diff --git a/README.md b/README.md index e23bd2618..ebc69ce13 100644 --- a/README.md +++ b/README.md @@ -34,11 +34,3 @@ Help Symfony by [sponsoring](https://symfony.com/sponsor) its development! ## Contributing Thank you for considering contributing to Symfony AI! You can find the [contribution guide here](CONTRIBUTING.md). - -## Fixture Licenses - -For testing multi-modal features, the repository contains binary media content, with the following owners and licenses: - -* `tests/Fixture/image.jpg`: Chris F., Creative Commons, see [pexels.com](https://www.pexels.com/photo/blauer-und-gruner-elefant-mit-licht-1680755/) -* `tests/Fixture/audio.mp3`: davidbain, Creative Commons, see [freesound.org](https://freesound.org/people/davidbain/sounds/136777/) -* `tests/Fixture/document.pdf`: Chem8240ja, Public Domain, see [Wikipedia](https://en.m.wikipedia.org/wiki/File:Re_example.pdf) diff --git a/examples/huggingface/README.md b/examples/huggingface/README.md new file mode 100644 index 000000000..c9baeed7a --- /dev/null +++ b/examples/huggingface/README.md @@ -0,0 +1,128 @@ +# Symfony Hugging Face Examples + +This directory contains various examples of how to use the Symfony AI with [Hugging Face](https://huggingface.co/) +and sits on top of the [Hugging Face Inference API](https://huggingface.co/inference-api). + +The Hugging Face Hub provides access to a wide range of pre-trained open source models for various AI tasks, which you +can directly use via Symfony AI's Hugging Face Platform Bridge. + +## Getting Started + +Hugging Face offers a free tier for their Inference API, which you can use to get started. Therefore, you need to create +an account on [Hugging Face](https://huggingface.co/join), generate an +[access token](https://huggingface.co/settings/tokens), and add it to your `.env.local` file in the root of the +examples' directory as `HUGGINGFACE_KEY`. + +```bash +echo 'HUGGINGFACE_KEY=hf_your_access_key' >> .env.local +``` + +Different to other platforms, Hugging Face provides close to 50.000 models for various AI tasks, which enables you to +easily try out different, specialized models for your use case. Common use cases can be found in this example directory. + +## Running the Examples + +You can run an example by executing the following command: + +```bash +# Run all example with runner: +./runner huggingface + +# Or run a specific example standalone, e.g., object detection: +php huggingface/object-detection.php +``` + +## Available Models + +When running the examples, you might experience that some models are not available, and you encounter an error like: + +``` +Model, provider or task not found (404). +``` + +This can happen due to pre-selected models in the examples not being available anymore or not being "warmed up" on +Hugging Face's side. You can change the model used in the examples by updating the model name in the example script. + +To find available models for a specific task, you can check out the [Hugging Face Model Hub](https://huggingface.co/models) +and filter by the desired task, or you can use the `huggingface/_model-listing.php` script. + +### Listing Available Models + +List _all_ models: + +```bash +php huggingface/_model.php ai:huggingface:model-list +``` +(This is limited to 1000 results by default.) + +Limit models to a specific _task_, e.g., object-detection: + +```bash +php huggingface/_model.php ai:huggingface:model-list --task=object-detection +``` + +Limit models to a specific _provider_, e.g., "hf-inference": + +```bash +# Single provider: +php huggingface/_model.php ai:huggingface:model-list --provider=hf-inference + +# Multiple providers: +php huggingface/_model.php ai:huggingface:model-list --provider=sambanova,novita +``` + +Search for models matching a specific term, e.g., "gpt": + +```bash +php huggingface/_model.php ai:huggingface:model-list --search=gpt +``` + +Limit models to currently warm models: + +```bash +php huggingface/_model.php ai:huggingface:model-list --warm +``` + +You can combine task and provider filters, task and warm filters, but not provider and warm filters. + +```bash +# Combine provider and task: +php huggingface/_model.php ai:huggingface:model-list --provider=hf-inference --task=object-detection + +# Combine task and warm: +php huggingface/_model.php ai:huggingface:model-list --task=object-detection --warm + +# Search for warm gpt model for text-generation: +php huggingface/_model.php ai:huggingface:model-list --warm --task=text-generation --search=gpt +``` + +### Model Information + +To get detailed information about a specific model, you can use the `huggingface/_model-info.php` script: + +```bash +php huggingface/_model.php ai:huggingface:model-info google/vit-base-patch16-224 + +Hugging Face Model Information +============================== + + Model: google/vit-base-patch16-224 + ----------- ----------------------------- + ID google/vit-base-patch16-224 + Downloads 2985836 + Likes 889 + Task image-classification + Warm yes + ----------- ----------------------------- + + Inference Provider: + ----------------- ----------------------------- + Provider hf-inference + Status live + Provider ID google/vit-base-patch16-224 + Task image-classification + Is Model Author no + ----------------- ----------------------------- +``` + +Important to understand is what you can use a model for and its availability on different providers. diff --git a/examples/huggingface/_model-listing.php b/examples/huggingface/_model-listing.php deleted file mode 100644 index e9b314026..000000000 --- a/examples/huggingface/_model-listing.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use Symfony\AI\Platform\Bridge\HuggingFace\ApiClient; -use Symfony\AI\Platform\Model; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\SingleCommandApplication; -use Symfony\Component\Console\Style\SymfonyStyle; - -require_once dirname(__DIR__).'/bootstrap.php'; - -$app = (new SingleCommandApplication('HuggingFace Model Listing')) - ->setDescription('Lists all available models on HuggingFace') - ->addOption('provider', 'p', InputOption::VALUE_REQUIRED, 'Name of the inference provider to filter models by') - ->addOption('task', 't', InputOption::VALUE_REQUIRED, 'Name of the task to filter models by') - ->setCode(function (InputInterface $input, OutputInterface $output) { - $io = new SymfonyStyle($input, $output); - $io->title('HuggingFace Model Listing'); - - $provider = $input->getOption('provider'); - $task = $input->getOption('task'); - - $models = (new ApiClient())->models($provider, $task); - - if (0 === count($models)) { - $io->error('No models found for the given provider and task.'); - - return Command::FAILURE; - } - - $io->listing( - array_map(fn (Model $model) => $model->getName(), $models) - ); - - return Command::SUCCESS; - }) - ->run(); diff --git a/examples/huggingface/_model.php b/examples/huggingface/_model.php new file mode 100644 index 000000000..b1639fd81 --- /dev/null +++ b/examples/huggingface/_model.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\AI\Platform\Bridge\HuggingFace\ApiClient; +use Symfony\AI\Platform\Bridge\HuggingFace\Command\ModelInfoCommand; +use Symfony\AI\Platform\Bridge\HuggingFace\Command\ModelListCommand; +use Symfony\Component\Console\Application; + +require_once dirname(__DIR__).'/bootstrap.php'; + +$apiClient = new ApiClient(http_client()); + +$app = new Application('Hugging Face Model Commands'); +$app->addCommands([ + new ModelListCommand($apiClient), + new ModelInfoCommand($apiClient), +]); + +$app->run(); diff --git a/examples/huggingface/object-detection.php b/examples/huggingface/object-detection.php index 86512ef32..b9242c6d9 100644 --- a/examples/huggingface/object-detection.php +++ b/examples/huggingface/object-detection.php @@ -17,7 +17,7 @@ $platform = PlatformFactory::create(env('HUGGINGFACE_KEY'), httpClient: http_client()); -$image = Image::fromFile(dirname(__DIR__, 2).'/fixtures/image.jpg'); +$image = Image::fromFile(dirname(__DIR__, 2).'/fixtures/accordion.jpg'); $result = $platform->invoke('facebook/detr-resnet-50', $image, [ 'task' => Task::OBJECT_DETECTION, ]); diff --git a/examples/huggingface/table-question-answering.php b/examples/huggingface/table-question-answering.php index bd9e1c9e8..56a12736b 100644 --- a/examples/huggingface/table-question-answering.php +++ b/examples/huggingface/table-question-answering.php @@ -19,12 +19,12 @@ $input = [ 'query' => 'select year where city = beijing', 'table' => [ - 'year' => [1896, 1900, 1904, 2004, 2008, 2012], + 'year' => ['1896', '1900', '1904', '2004', '2008', '2012'], 'city' => ['athens', 'paris', 'st. louis', 'athens', 'beijing', 'london'], ], ]; -$result = $platform->invoke('microsoft/tapex-base', $input, [ +$result = $platform->invoke('google/tapas-base-finetuned-wtq', $input, [ 'task' => Task::TABLE_QUESTION_ANSWERING, ]); diff --git a/examples/huggingface/text-generation.php b/examples/huggingface/text-generation.php index 1eb8343dc..4d218bb1e 100644 --- a/examples/huggingface/text-generation.php +++ b/examples/huggingface/text-generation.php @@ -16,7 +16,7 @@ $platform = PlatformFactory::create(env('HUGGINGFACE_KEY'), httpClient: http_client()); -$result = $platform->invoke('gpt2', 'The quick brown fox jumps over the lazy', [ +$result = $platform->invoke('katanemo/Arch-Router-1.5B', 'The quick brown fox jumps over the lazy', [ 'task' => Task::TEXT_GENERATION, ]); diff --git a/fixtures/README.md b/fixtures/README.md new file mode 100644 index 000000000..c0089ccc2 --- /dev/null +++ b/fixtures/README.md @@ -0,0 +1,8 @@ +# Fixture Licenses + +For testing multi-modal features, the repository contains binary media content, with the following owners and licenses: + +* `tests/Fixture/accordion.jpg`: Jefferson Lucena, Creative Commons, see [pexels.com](https://www.pexels.com/photo/man-playing-accordion-10153219/) +* `tests/Fixture/audio.mp3`: davidbain, Creative Commons, see [freesound.org](https://freesound.org/people/davidbain/sounds/136777/) +* `tests/Fixture/document.pdf`: Chem8240ja, Public Domain, see [Wikipedia](https://en.m.wikipedia.org/wiki/File:Re_example.pdf) +* `tests/Fixture/image.jpg`: Chris F., Creative Commons, see [pexels.com](https://www.pexels.com/photo/blauer-und-gruner-elefant-mit-licht-1680755/) diff --git a/fixtures/accordion.jpg b/fixtures/accordion.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bd1ba6800d512a802a71964ac561f79ecabd2adb GIT binary patch literal 139216 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%0Dt%WX~8y^t>&B&lTatUP^89^S0#j%A$we@Ye z!P6TPkZNf9%%1#Kb0xv6?zH-^7!|h(Y-Pl#0*j@?sZCed*%>*i(+qDO=dmux$stw3 zV^@Fe_L^ZKhfUUm_Z@@2#xLu*)0O05XHzVpf${?CKt?JYTv` z+#PI0m-i68hH=(b4Yn&&j2f%*ZC7OJ-lhGXr?)`lIF{NgdLOIfD)mij{DrLJX{xfp zrM3H2uPa~?N=F&tkd;Q8C%3iJwhkp{G)W9;My2|m*d&&`MT6f`7Ut`w)-q? zd20(2!p4ujq3)OK#+Vt2%J1w^3 z5`K!Uys?Ltfw^b$wxzJx5HhvBf)I$iF5N|=_dJD5m&i4N|+AHmX+kCYhYZ>>IU_2gjlg z=1wpz$38ukV`SDJB|BGjU$oc^DB&@xO0F$qQBO=-?c5%Xuibimxhl*vvzDsud-3n8 z+L)f9Je8X3p@`x;9A+TRkU39xvB*(L#>F0V~qF)7bH;u7J|@3u(O^HT@#(n#3z<59Br=uvIOu%V4GJW^=54{Y^D} z`4p8=l|ogB_4qd|Z3G`|U*-CT3&EY&?WE7asZo-|>pB2GNuxEVk4Z|~iEkmyILLEiHH9Hku!XC zEzi1@Ht6N0%-zV{zBJasHfdWP%DVIcvQKiXCSQH<1#B4=5pAH#>GDgNym&5-_n_-Q z0cu*SA(clX%|hpRnfFm=8_3g@RjszD?zv~F`jZpQf()p8Wc5d7ITiO!8Tw+-wka(+ zE=HU>ax!eb;>Ig(Py)0oY*=kVhCoa0Byp@(SWV=IT z`s%Bk^(r#kD_B3&f5yT80O(P*eUbQ#zQ5a#TxDfyK7}W+%6`^b8*LkN?)fYPw25#a zQ;-8&`hg{U)4l%y@&F!3kV~z{%1YBGkgU~bEs_p>=(yEpxJ)ia#+;^ilEh_rEa@z3 zEP8DEYHrDUV=iQ&wvbh4GHwsE^$YRd8$ zat##MW{ouneBcs)MtQd+gb12D=x<$7dQc>d5oZ zwAR%ls@=<3red^=oSuzNV+OyJQC?nU_O|DtKQf!`rSLgL$~3%Ijrgrq(<=+<@)00S z%F{@Dc4ZRdurl~!doB6Q<3EPQ+{b~K`ZZNaAN@VMM+Ta+Z_s3nL+u^rx(! z)46pk)InFAb^Jwm1cKGOR{T#UxdE7?_S(I|rRM2;jC$<%Tg0umW`uhdaQ!OCYx8Y- z>Y?njEF3JZSN{Me+dymblr@GRCNonEGK>+WP*?EMeCwx)PczJI}-fWZ+uLIJa8x zxQmL}$2gbQ_xNC}_8@$5=dFJ930BzcY>QE8(dk!&ogvfs)(4>~}Aa z9=dH@$`+gxPl;)$S7KZ;x|+^-A6Lg;i%mG0kCRUv7rqmPnlj5$yt=Nvug^<-mEGO{ z0E=48sJB(+1+BNlp%d|DyqNiQu;t2kD$Fsd$2ivZYq-9wE!|aTE|ZWYF#|2_$MEZs zdRJX&CZ>NCkCHhKHr#jY%La`6N^N9(9M7xArHBA|2m!0B^r{he>71mLalDH*Hv>wJ zUk~W{D$5PFAaa}m%gqUA8K2AGcx~VGH~842_tAdKN7!51{{TBb16txcc&8u^v2oP3wv~=U zH^cgbZhA5HC63br3cD_RL#&K!qUm2ss<{~`Oda-C+ zyn}5#&6Z>FHhFO?3bMNxz!=8sHl%*8!!L_&Ma-M|{{UV4*r=tK6|y>%Um=-O99 z^TnwY%*xn|e$8#hksqgJ_9sY0Dm3~hW@8~+vlW8Vb1j*9cBRYAqRvOg^NPF0l~um3 z$|}pwc-c9OVwQ7Qt1|LVZc5@>@8fibeLOymD$rH!Ydt@0RgoIIDBd<3y#%v|#;F?o zTrSx;)QYlr{z}U3$IYtQc4aiMY>P5+vC37-S+}(0H@eITp;i zwx*{AkNvZp6Og$n#(cW%$hQj7O4oRp-)#Wy z8MqGP7E|XE%IJB>aP(U;@GhY8h%F7VIP4Xoz8{dOTEeC<>5=YrCIH26$FACKp{jp@ z6vg|iKXo|-2FTK1lD%(Xrr-|L&6RU}YvSZ# zHecWAiEu>LY|>A2=&c`oqYZ{ab; zc$ef?MOn2jT*09_qbo$RwVq%b%1WcAtFcJ3p3G^;797_&x1TLT@W2JM(zS49*+ooe zH(y(*R>(DRmI$F3RfJIT%SvS>wfOmJ%S>fYCS_Ke_{>%MyrKU9k&A=rXd(3HY9;u)353)&RAS+`C7o_l@Em%CM)#7IHCXT22__ARmy=F7{Yg%; z7-;;XY3TIT?dbmIC7*sZp289v12HYdKbv3GPuUAV(#)DJuAFOYMay7n%dOv;&-F5wx+!k4Ld2w^Y3SO`s!c6;3g{cB1F0E+0r4@r|#vRs;9{_@~C6#EcW>&Mr zb`#%S4yRYtOvTOd*~#Bk*z1|qYa_E{>lj$mi$Ao=2nqx`gB*7O!Q?UOYTW{1VAKV6 z+=#W*Nb!K#9Hy?O)tS7pMZn4O)-2G?pybTo+Qhzut*|g@Tpy>j9xpLg;-JjDA!WGu z>su{MtyP`Pj7S(>D!CM?ciZ z`3p^yDvD@8(YK`$)?sFksP(J<>atn9Ty`5|RQydR4+j}4uMsP#FT)>ZWi+j!Ut|F` z1ZqJ6>{;frc`ky+n~feTj>=YJXJZ@kl&M3oz?eS=+~u)8n~?btJ)!%t>~q%rSAI(M zy1}O7a-NKnil)qfO<5G#ZydIqyc}G7o|fE}CH0ho`zU& z`Ak|zBbksW;(0p0ml)G^XC|twyr-Kp6p);i^yJ%@xlU2?i$haxT3s@;eC2Dh#-oj~ z@+{*qafW^$l`gvNS4EFF%3X0>ff2f&%n*&r*G8-@XY~PxR~*I@vR9XpjBzh(1JuE& zygbIu0?+p3d}V$>fC9QPH57H0RvIE`mG$ZqI+HCL7@2|dd0hOXcN@oIaiRQnRe=7T zy34sdr@eDCt3Rr7yW?5;`9{;z>FE4uzAK+5Exy3~@p+znAi%HG^~>S@#$lK;E4>r| zw?Ih0SB@DhvmhnkPjiaV7Q5-OzgF?SJL$Qqv%1Xs1&H6{V*dbr35wCzW%byfSnOvG zF2576z3vnfPz@bTPsBRk$c6+Etn0b2 zSyeF<(CWsf?Ng`=$t91ThO4qUE3BgC@HZQq&}Gq%R|M5{nKS~K^moY3zS=SP{FckL zup8@gs>iJ?;}uFj-NxTgvdX)QoGp0)lw#&7d~5bHM#W>WU&p8qvoyi|8ELIXMZKV{ zJh?Rxk99!)($twCU6lU-vyGkw0lj2@Abqd$b)9{a=r*T9VwlMms4LXXup}7NGbVL) zVc_w38SjOYjbdyrR#E9yG(B|VathX1sNw5n{*UzJ#%{J(_T*#wv#+B+Ox_Dtvps(7 zqu}InUf><<@;!C6toPJF$7=bTEUKI=%{EPR=VIhg^xcP$5v#P*XCaOi{{Y3u{_Sm| z%l8sPI{W;@UwldZp#(Db>V%!{Y;FY*_JDkAbFAsP<05p3JrUX>LFxtfphx0+n}Qkn zokz##=TlJ6!O)I23dO8O$JA;*>^v&6C0O>n$HcoX{x^=N7L1!dqExlwl+6~_$ycBG z;n#Ym4H?(EW8fR?G?lX@Xj*6`UyriZw~?&1S60Oyzq-u3X`VvW)lRONFXLQrR-3sz zTA44d&>4|z%v-I>t0K#KvhtQ+XI?`+g4b~sr3I_Gm}52Wryn(F7qBd!m_4Xpgb;d~ zEJ6VdiXpahHQQz`W>!W$36De7m6esBk;UV2{CLZ(bU(X|QT?heHRR?Z@AWnqr#Xg? zz>E9`-9r*;wY6?S^t#2<@!1|6q^$LJ+_tvJmL)?sojOyn{#F|qvp zGHK>+y+4a{Syd55#N*bMS#5N^w&U>w9j~NAkcm&Xg&yV02siR3p z;{&CF9J@LY0sjDeb-p~yFqq4zb1?W|0?@U#O~G;>k+xZqUU@rC)))($F;RNqC*3n> zKT&-k!(YBXJmZsVYqNLASLg+XX7WF`knH6-4$G1)@!&YPXI9LO-rE;5_Y=lN=SMps z44_%t6&BlHT~D$EtMRY9@E*w4ZVL1=`C{#d!;aaRxY*U#kwezBty%nn49px`k?BRt z54m%V9XUHWSp%Q1NBag|2rBa8I;aQqL!KCL>iX)-Z>+j?lv(%0_5KI^Iq zxsBq?v67{>%B_wp$A0yB@=b2nRQK6e6^o|hSyW?kAo+5uiQds>J&1YnWw<}#;qU4T z$7%1gH`=h1;^Cb11|L(Y-cH2oCjCL~3eRnU3(W#G>>q3K{Om_3;kxvuKA znD`y9a20E&)yTfLP^(Xi&ej_%wE&{kM#ieKkC95uy0RLl7h7GpN|EVAPL{Pf*oL`* zmtAv*%BHNUoxGm*pqX0gH$Yy=)!JKqIH=!O$Qp6+u`18~QS9B3eVDk}6j4bV;g?*6 zR)?IPRh1qeiA*NFOV^EKJxQ%H`z4J1Q;W25@8Et`54w-#MUSS;9c{UE{B}vl%1ZXA zy`}W|uz1_fRthdJQ{?dFW-~vUE&lQIJ)Ff+UngL7&a0De7hAs0>gQYOsUi)X*~P;c&r6X+0Uy|2I%P=WG3Oh1qHH8tzu zkFCv!U>^Q8=)w8;FituAxO&{!12NXdOn-IL>5_PTlwAe_b^#UoM#@5jF@QF%>nO0% zk!to!UaFIv%1;gpqu~8PjwzeW#s*P)!uc)dVp3QZt(yEP<$kL9c!IM(e zj?H2sz{(=pBd{zg_m#+s+aHQ7{FgC{hP;OWGfOjY*6e0dJ`c?-1+{v5!D_#|hW`L{VsLqnW)@E+ zMQp!ck#`qsoR+)}8Tkao@(0&akvh0MPnb+g-@V}GtVE&y$ z55eES_&S6g@6;cVJ{R!>%HlGpV$BEOet%Ed-vI>5?c%eswyi*QE2xlv1p`B0-k!%m zMc$1Dr(4mM##qb*!oSHzelWV4_?8vfP^^qUzb~@gUFYe;_e&W>7g`OuM(6P|K1E6; zO09P#k4U!?l7`CNZ&XkvnJK#(0JVFI+0I=VmF%pAJSvWvk2MN@KO;6wP51J*8Q?gOXtrlLeb23R7imGO?># zsJ8E@=K8!N-}pEOSxs0XhA@pf9nBg40OO2p)II{N%InpaZ|Dt(AQ5yYuZ{bM@FMI$ z!2Ivlq4?Az=TlLjfczhgdj9}g_#Y!?XJh%Q%cZKwPvbvMQ(^Y6$`)^HNR=5odG)2ylS!z|mYg<~Ms3`MbaojdeQN-i%FskJL0867l4!_6wkSX!kfCyL_={}Fz{$nF;d;|$O~a!r;ASLM%n|Lr3x?_& zELTG^z=H5*UE<8Uhu!`T7QUrfg>-IPT&&M_M%G(^JQ=7AZ4e zfi?0}50A*y)FN;C1ZWTRAA#wJ+yZOk-^RWikpBRvlnzNh6NDgL=~anyQF9S@@Wcg# zoxAE+=q=Ut?*o|EH$=_Y%WXdem)f$^mdLiezB4bza>}kp{GBY;@|E)53GP=>Jt(jTnONqV{&x|y z>Gs`H?Nj%#?E9%x@AURxd?bH$9ZoTtj!PrGZIOwPp>nKLUPZM|e&OV*FyvH0%cTvu ztiY?@m+F+Iwr^kXvCgio$Bw?BI)G6+&s#r^Fzp~d?m}hdn7VphPOxZAjRu5_V=lj&Jo3_cyID6~(;Tu`DDww^dGc^AIOhoQw zw`o$wA^!lAI1;n>A^QjgZDG7(dgd&~b5yF(>H3P5X>K*iZe3QDw}`nhX|Fr3c018& zvHWJnn9F_UyxXf`fX^&nzPfuq9-T2@X?Nzyg>eV3!#BUxJbkXbXX%KD0Lsh8#7M^zu_)E4H$*>9FTwE{{WT#?3{7af&NnY-&t?Moduuxbd#&emsE74fdvcZ&U` zmK7CtXf_-YCARj9XjZR#_DeX@Hs_nGJBFASn(=upWMhBkWoFkwIjVJKms5{lBGg@4 zD^@IW;}?y-J*Nxfxh%MkSYGV#>eexl025xNqZr#6SeeJ6w)F z>v+@rb@C-qe(Fn}nY!(intUsoy90&@qpn>Q-H*dNTZLWiQ`g4Vk}@jI$X-I)x>Lor zHJKb=Yk52~hV1BJw8!@`0quYB{{ROc`_!-P6FWsGymk9HYI=e2+L>ZAeapDaK&^oQ z4Gr!Y>ThsO#Xr(Mea_-*f6_ig-1P_Jw&DB;@lT=ZP>$Dg>Hh$ZhfMzf$s0{c+_?6L zflDxpN(t4vtw*(0BTEz$WeP`tZ>iQbg{!fXRUh4TGYyd!2PZR%PUi zu`ut*emC^}IP;R`v9RWEA(NK%;9l7HR-9b+L2VQ-duZe=`j^7TwKF-ZO`I++T@>VW zRse{S2>I^cJ6J`Om<5~8< zh{IDO+S(v#uEYYc4M6j8PT?Xee1?p66v6#FnuB^@P(ulT{2$NsXht5l=>8YfI*3TO zmaWbt-^L4f!yqs^4P9ZNsOqHBTA^Q4Mg#|`Sx+t!<6?4T;bP}yn|hetb(@Ffe5^VWj2af4e}W^4V2$<`(42lornm6!1mt*x z&7E-YvH4Hbw%aM9%WUI6P9jg#MH7z6P1V9>`SBn2IV_a6zEoY)k~ZP-Nya}dm6K&6 z%J7-IWNo$xW%c^25ZQ{~nWzjC^INyPW7j7^Ze{Ap>wIV6?EfK>J zk@?o50XmcLG-B7O*FY}f=zMng(b^;*Ctm_~_#X%GciVr_q3}K%+|+NM8S9dz@x&j2 zI7aP&Si?~wuu>`ND?3~LuwA?QwY^3J5n&L9*b&D5!tqE{^}Wp`OjUPYFl`5^CY zHd@v3c}!b|$y)flX0n%cNuA7Y*5qzuUA85_>*1Y5`s`xem7@*I#M$qOm}|)l2-`GN z0zQD|FUYqyjo|V!W*;Aoi(4OD*E@}62lprGtdAZ1&0VoKUA6Kx*qO^t9#OlT%*wM7 zFBqzPSyMo>INn7`eOA)dzw{^auibsmk2Ym5ygQn^Dsg>zIn?7P{I*U*@wM8xX;vcS zGFr3h5$U5Is+P{BHPwGs;eOo$R^PjfnxChbCKZp~&+rucr0$)1U2G`s$M5$zxAncj z_`QOLuoSm@+*l!5{*;3~!}2}C0h;&|bF}=;z(>dX6LF0H0A_3B*8X)hKi~TI2I2f$ zNet_!U%;QGj@60Y7hacAODzB*E{BG~McoS5E@gp>9=~Zp9-_yo63U58nniWkfDWD8 zCnwe-`CgoNu3vYE<8s+K0}GV8yLp_N?3I5I=e-x(ZT|r4D={dl{Oj@>&eFa|BN_P4 zX1uwP{4#x!LF>g?<*pZOW3BnmnXx0F0PGB96U#R zxa>+ixYlRlaaC}aa(3IDSu(pjSI}?JQpSF!#_{E_(fC>ZgKE?od~xN){#f<5R^Z;}Q9V-Ca}As~sdJsGL)b}+&xskykL;FG<Jg3oNSCjt$HJ_Dh?W)9YOX#QEEu8it z$-pOT@IN9CXw5OtOrpIq8G5(r%zIfo?z1tE0y*WGb3TsPVeNmwFWM{3%=a{N*H z%s=6X#I@{te}hQfi|GN}-k@de>L@$one`gw2PB5G@~vA4p|#ghb|R^rNu5mgAf1Hl zVwQl#fsEYWxxZT29;UsBHfE-w^*v2|h(1Vy7!Scg>AN; zKNQ(!GS{&cL5H+IXv@SRVJ@n$13A_|RZAIP;SjtP>R2+2#eb9rd!O(~E z*HCD}2Gnk5su_RnU5a;g{{WBhYX0Uv$N~~NDEruKF4l3czl?{i9>&`P80gusRe@cA zM)bwBmK}|6bJW}oJ#TQtj{)Dq69>T1gX8l*GuOwsOb`#~-=JZi>lZ4@E^;28cA}X> z^Dx*g&PbN7?Z$4fJMOa5$FMytS^&u@V-?kxBC9k}gc{RgI7hwcH|KR;D;(EF{?8># zbj8SYt2y#%zXOm{A4EH?6(XN85xqva6yJZ_%zL#p5RGHI7GF@6nb^wmmdfs#S&18! zv8E<9*$rDIXahXV$g39{lIC)A4ki`(5618mW6n>XqaIzAlapr?#?gf7`Kf$X^3;r+ zEKH8|;NfENxcD62US4iut5c76lBKU?g0X$i)wsWFkGT8^{*|=#55E)lF^}Jljn%ju zp7^DrC$(wYw9>3i?bUX{R0HbJty5-WQrMXG_P_D}0J!|G^24)mkGXv#FcbYbB5|tS z7H5BXf|8)iNP&HU1zz@678*TF9)W-uK{N0Gj0rAv7w`|p{y#Hc3-C9$+>Z7l6LwnGwc_06=xmRp$I0>zzP|#~Y+Cv*NVdtz zRD4_efikNZV)70r)_Y44r3?XF-414?35k#{T519bok!GTasL3OZm_q};N$XtsBg%W z(Pgj3a3dVv#MI3>5!LXj6lP?4%gW-c%g(!-#l&1v_haM!-KfjdF)%jHWebx_qXF_D z{yn8F2oeak6FJ`~ls z_A6Y7PmVe_RZ?1;MTd4}3L@u9;R+u8CK zRRL}LCVec}znG0Htd*@1hE-y_YP6xRAObTY<;pUWk&lv&ilv|)xvp6-YRk>Y$+L~% za&l%a4mKibrfyQ0pg+KRT*&^CJ>D0+qJ3;{$s43>_+tueb$ zh-^7auke@iibw^w6zmUhdLHK;?zxlIgICsjhHFF^7)E2g6AI3@1KDD@*b5bgy1AQK zp#tu85Q(X&{1N|gH@O8gmA~A}6mYC#IZO`U@P%B_Y0MPNDc`ZHKtaP{>{ z%uw1C77W!E6$Tr+wsCE}mp>HKWn%SK+h>XoR>Ke5} z=n`k@4k@y6_}|l%Q9k1{GqEtMUXFTejp?Ibu~TDe*${>8l8mPCIh*#JI;u*i_*EDlZa^*nY}1F zKc=iFAHaoq41B9IuE$G8%A2j(!@kJ>09CjGn=GIi^r^O4U^1m9!C40lZPnOnZmaA@ zUed8`hd&MID|gaxvH)?b`78Nye1FbJhL62Na zjEd(V#~@XZksyrFq~(88S6sT=ZnKa5J9V>?<1yEau}u9lk<$J{X1tu5?0hqkg@w!4 zlYTuE@w{DpXDME7L>lr`gLZw61wet*{eFWHpq5NC23S&h=b1&u~U43?q9QImC* z57gV$fG@xJF8KLR)Av9&*TE=%^SFm_x!2)7c^ zZCjmw>l099AUARXTgtJQXEQ;V(uZcVovZ%sDtiITp2o1Q){{a2| zOC@PeTxI2DRJ>;vxY-qD(~R9%mM|!SuxBTQ^%$%VS^k6rb=G>lTh$%TGvV1%W^w66 z{WqGnP}gajDv~le0W8a79@9G+qGDGum)|qT-F{O75BMqkgG$>$I!7872)frF{C5np z&fu{SuqViNt_;|k_*Od)Jx}$i?gIo9b5KqE6E{C6@$hG9xw+Uz_XIx&^SRsJ{t1-+ zp38Ax>8mun4IuJVeLhGhbB}(xo-e(qrsby!&lWcmb6bl-pc{al-AXi5)b}UEe6vp1bV0Gw}S=dIgcbUgyWK4`J@tHBp zs<%R!Is-0!Nb8O$74i1g)h~96pavih)Gc}Bc;D0c7tCB7Y+8?EId9Y$%Uv#{aCtvZ z$T!@r#xinM+W!FZ*Ie~raojg$5#uYcJ>U{-2Q1_)-L|SUO;t zhsSF(1EXPEmtIE+mzr*`gvm7K*=dgBu9Qck*H5$w)&VMsshM9)ukcg((Dlbs8(M|e zrb{pa&)VaN=rm)gBFY&}o}*~P=x%kJ^b8O%Gjp^a=i+EV=#A(fV8UVCB+VJvPxct^ zv7NpKgeT{7xihpgbJXnv`zO^~HG%fzQDo;A{{SFC0nwo=)zpMIc355eu&&@$PRHH1 zBdBF*Px7^b8+^)bZ518Cui0*;>sFuY#{@B{YqsS2g~~PAiE7(SECP)f#R9)2_feC5 zqr%4Qyu?N0+qx84Y9kA{gd+Odwk0R~O1Cb@Aby@o*#zwZ%WyHQytlmWM;8ooeAZTB z!sGHXTan`I!!2p;hi`Ps%BvPO4fOJOS@wNyby=C&`2PU$Tx`92(Te?%K+|h(^YunQ zml5VJ4o*SG{W_*oU1G~R41CT_tQTbU%UAK_Bk2q5(8B5sW&lJgbZguyBBUxMaU2PK zzDvKsU*(Hl-@&B>7=TM_?KA+!v=pk%w&qb_uerU$0QKrOsrOIzu7|sW9ZrGPr}x9v%WIk^bzaHV;|JYJ_qE^Cy*w#+uwD{ zmCY4D#jj` zR1};XlUq{k8#%11@2NG{Qz1&LP(N@t{{WhNSnO0h<6Zo=AML`B4P zo({u>b4~S@bOTYDL?NDYKd7Fo39{Qb-_uOfBPS06o=cj$Ez*~;@oakM-HnjLI=Th8 zx7W$?nU+zB#_&6cKHAh(k@+1#UWcWWc`3uDy7S0I861^eGIQSPZc%8~Li*#K8)G?K(-4rw$go(J%2@~@)Nc9~+ioSyGRiI79 zt&8k8>Lm?OgYsq-p>V2JRlP$>m=>Wc4{mySDy7)bQUt!*(tTEztE*CT zDN8D{nQgA^ZOv87oYKscV~3b5Oq|nhPDLt@)!n{}swZzg6R;VM6>yLrgT!5uPy`sgMd;j^V2|6Be)uoR;M+E4!g zKa*N2EeGu~K+X6LA3`DGE3Sb&Zz?-~Lz)F7FWVpUfs&gAAyOgr))jr~1N zJmh(dTrro+n;Ivg_rUudYlCj5U1% z-`7q>h$b#$IwKPk(YorZmvgx5FXpo>j7dM@C-TGoe}_9Ie~+@MOQBU^C||ez<)5|x z01cxYXdiGq2if@TJrU9KW?_4OeUajbF^lQ*=KIhdY^HMNPw6OKIZ-vr)l1H zFdfZ^Ob5{-dl6gi+%ZAzQmRixupNM9iW^_=zM@<2aIl@FK3eUkG#9tEE{=NYAI#%z z>5}!@v^|8`yL{THCS^9W(r=}kAxea}&k+UJ?&_^PVWC4>R#>yH<)dKtt=h3_r6y#N z^t4}Xm9hh776pMd@P2jjVcxqeKhR?=ycHNXEtD1lbtmJRl{Xh~*6G=0iP?=yvgge(Ai!p=g~xcJP~Vs}vu ztu{AOIC1)uB~4v0IQq5N#@EK{gVI)&K5sjba=!yegFvLH}> zA3%4E;sgeEJ;qMqvl#l5n`b;paHW34> z4SX4JoKvtspnUVZb7f+2zozM?4ViuT__gw%sV~Ts(QS{#{+mUX(t*4+0mtAiSoy7^ z?8E76(PrN31f0tXC0#5o14FU$m9rF8Syvxx#m2`;j*`0KR{~Cuq~~~}kypL^Zg1mX z8vg*?qwcPt6-TY^56L8qrY9qaWMCtSVGy^coA!S`=b;IMWObf|{KfSE(b?Z=?razg z1_K1#1Ww{u!ftz%C#S4=18CTN_9b6ib|ijhO@^?n4&7-QM(QPO4Ej1)*H|rONqd}P ztH~((xZ5ypVb%Wtk5V(MXf2&shV+;9Z$>HF@2J<^*U?>qErRp2V{7|~k63A9s~;+( znmqFl6=g+Z zBO+trVqw#p`ke%;KJTnP<~i8PaBQ;I>PxK0tF0kKU`$|>>8PJ-u2B8Rl}f00m5QpJ z?XqKIN@)TjK(Gm^s8)Wc!%FY?(4M|GH~#>=Kb9!j@aaez8q&9`ojmwdH^jB zEY`}+&fAJTii80~I-2&smSF_k?KXZ3!0f$pn zoxz(BshWjl*ddSpWm3G#+GSR*yk0=N9(yxFeyYgIs}~asBPICX)6~&99%~m2XL4Ct zkAcTzV`EN5tF5tasqyV|+^_=@hQ7uFWawPVCHK~@`3oB$OKj|FsF;WZPVW;K z2~IYan&nHl5^MSl=P>@O4*Xl`I{vLqO-+C6PvukYAq7h4A@}57jn~V?_A`F%G4^Gi zhufgDP>7p>h=WtFwppk_n}hM|b5rmKqqtgcQHg<|(FJsR?CVn;j~G6H+0UdX7; zYHl-b1?xPm*=^WsH#<(|7BQI3&A}8+7z+rQ*+~a6ktya>Mdh&?CA63|u%}j#0(k*r zqyC?=n))HVA9-%ByE>kc8%BA*+;WUnZs{$nfM;EXsdQ zti$RpNW6qx@>-vJC4Z2wrXl>Yv*6lsiQP!S+D3r_fo`H)QaqAjrV`1EMJUbDkfTB zCRhrgS?+h8hU@LV-yY!xA5p!{PjD=6kGdT|eR((Wzd=cW5Kf>1SGIJhh~J8)fSQG2 z4=i4+N7(h~A0$;BtN~!$?Kd|J)YK7wqf=8*M98@!^BG!BX-KP-#IW~b$*9Q94l*k} zUEv42)Q(UEUBF=YC=9y+S|`*~8ydTlFA=LDTU6v*S+ug`_U}zLm6}JEV#_gzhRf@T z%d*P3N^GCB^4xnwe7_b#TBUyGfj|sr>VF~RINlQ{E?{w3xQW=bZ`-zKI?2ES=o+GQmbaQ)Z6AJ7CVBnWfe?H0gk~%HJcqVNr_f~#U?E(CWpr6 z{(m#9{X>kl@#SY(*XLqy;DI&pJ~#b3i|Mh6@s>R-Cv*eYkGP+^i|SFeA6g0~QC)V0 z{u|t^Y^)xqf~)>S0we@zJHcYBalr27NCfOkP(m zxZI{atHWHER}1?IGPvwp?DVqduC(PpRJ+8g+ic^1ONmVgg43gIni*WWt+a9%T$k8o z`NsNz6I+Ur1gMf}uc}vsq#_~)y+k~%X&alE8Le{uW}{8OU@&TC<}C@xWRb?svqo+Z zCqq1DbZOP5zBFd0zo&5z-9-n-Y3Ue~DI^=4_Y3Ut3_3I?(Qz`6GJR_#3>tLxuXU$b z3>{$ueP?fe$=9xsDBCa-U8a~ugl-xRtE<}9C6xm&sMjd_*bPthQV!{U&dQA!T!~H#goz{64d1si*9I5g&>|y?tKYvH;{{WQKvn^Izl5ASr?Nb4d z_$DC+TZ|>R#spwgu!(UKFOS2^3x$(`cKTm`_gisnVJpjtdYRl!jh#nY%*dk@juP=k zQZv|~05=ZI<+<#9DVv{_muDOLeQ2uvs6`~LuE^Hx(E zN4V<>oxtK5@2qJ*8mituvRD0JC zqg#R+y~`<{I4UMBI-M1lGXt$Qxa{pakvx!Js57VhfQOR;Tgq-*nC&UGtGgP&^=<(S z=eT?Be63wmkLYmw-xj0GubvMC@VsSMMK&`kiKMuDdNLF#&%o&@dqou>CRXOB>~z5M(5*Z#dt ze?jeKNyD`fZiRQ9KC+ zBSxj3F+5;G1QnU%5Q)%3O!3Z>q-y>8F_1+&Efag=i4_JrRVH+RdgRaV;<}JWuH$Q< zb+~^!D+3L7SQKi&uvAh8-17SteaQ&i)}h=0#Rh-9&&=*r?OkZrF2{{Y11iC+_t@pw{SFN#WN`Qml;tEPp$t-FruM_>;9QD%>5q%zcd zq4f+)A~Yg0!XScvqH7Y(<}~nS8T5Hm>2hGg$uQvDqw1=UluX7X41t!4v3b(ipggE*izc0(~UjnQ#?bL3YQZilV7* zLp0Hdkx~laivfVmz+#aZ6>Pb~T1@veOchNL7u@l|S%$GZFj8Sj(s*Zs*VCABp~n#8 zLylp^jgLA`x}II2Q!oM0-pSO|XFAA!_t8&hb?FEV8x^|wHWkU8NtM&G^nodJ~ub;em->Yv90yz_F;fF3jBAz^!LgC0P}qDpZ%&zn>1jwsB7P`ZA7=RB=%O=s?M%G7hd6~ zX|QtN#F0e{~qEad|#`e!x#MnRE4zk|s`9Xy(m; zAQMmn2KN9EC@?JR3c`YAU|Er$QdNyxZHP#sD2faMEpu>9&d|5*u1j{wyt1`G&kPj7 zNS!qbMXDmsv!R_QQw>w8-%|)MK&E)%rhPm(z{8Cn4{^Bd&-m*BIJPXr)NjkLSkJiL zz@UkXSO`^MqQ2UVLKxKj&GTJ&?ctfkM1Cz;xia^59Olj z7}1P8eiBNtYDmOaE3ta=fBew=aeFxR=rJMydp}kO)Mn``xMs};Ky^kjhQ;65_{a5c z>M{GX^yXs<&QGf{CQew2FSKK0=;fW{s(J%Zh#**|1)39jf_`BGR#*UM_uf>D#b|<< zwN9$Bt%)@ZchtW9RHt*)(wWkGpXdqJ1oRekoo7j@?sPN8V6F4vbQ7Y_7@Zax z#J{a_?q@Q+Unci=3m^T5N)c*i!82s$RKiA*` z1AAx)oxT{s7)p+#x3JiqG{+1t(ANxUIP-7mYM&k%qY^ruhnPmMe zKNx@gJrt5up2RJ;?i>E&c<8oSwxxi_}Hyy+9xm z+dbOwD;Y)`O6pJsr>NHIHH5|7tWCy_XHP*Vj87Keq|XVS8P!2O1XS4ZPLP$JYT&k* zZO4Z%6=P@OfSj%_&ohg&&7?fjL&{o5{Ek5bkjM~c-J_S5(#))lWo6xvZN}QK)KU{S zF1N+Y&$us?GZtc%pq}6+ZWulQI-8nqC+1UZqR@k<<$v+0WB0l489nI=;80NQ91nzZV zw9M>_i+of3`SY_E`BvM-rB7YU6o?i4nKhQVaL}N}&{|A1h-qUh#jwMNX2vCu(Uh|m z;c8@D7CY_*_NgnfcAeu}3lkMLD@mwh{s-Lu0P<7`{{SgeZd$QF<)xglQ~v-jX20b( z24zeY_ZuqJBQGJL%Dx-yEXrCc_n%K=4+mjg3L_<8@7mVwEU!|!9Ibe^f%Ie#8mPAF zl3$l)?M-4Rma6Df9_r98Ka<5V-E2`5?rs)>789_YgkQ(|*oRu!gLAa)?iGN0^)>K+ z3AkOLwr(%t6X+e1BD6a(eM>(GCZHaS3?Qp)8Fy)!N3{_AaXQf+ij9(lAqe4uhOt0f zMDN(-FYUweSNB;)`!F_deY9WPUWO98uduM|YGxz#d0T1&v0_F^txD}XOE(|X`*&ic ziDLM&Iwxxft8vMKf4aYyIn>-%FY?AJ_|@-9beW9mD9!B0kn5R`%GPXDsITpaUZ^gn zd1^E2sNI<~0rgnmS&>~?HZWWZFOpfN(h;VU3{ap1^jOIPi8n^1wn&V<22&4%P|oX9S3)yu&#!c zQ#wX4nZ3kViarU7C;PZGsjd)DXr{KXSfsM`;nn7@&^p$ybbz&-Vh06O;H2xj3rouP~F z073G=<`V4*0lS8sm#ao#1Tbo2+$%p^45ux2brk)eF`hyfw_~`+?1$ifKxP`B?1S0& z6Yv;_&OvANPg#$5VTAtx3UpPc@&#cNQC=f_S_3XdDX%3gaJ4%mt@#g5MR(*GdJC+sxJ0)RYYy#Fn^LhQD1jnIwxVZ?xpPSC7doqm%vojOv19ayD4M z7*?{CI{};#bqcrTS<=2j)R(8Cd; zv>-5LF_wNJykBwWCyI%98;ic9;CvIfzno9(HpDB~8q9snv8Tw{mk$yj?KGdL?JTcw)MD0R)fF}JOkc_TS-E|OyYFJ9BHe>uR*Pz-X8yxl zaKsBaYWGG>k20{;qEIz`Dl6Cm9hs@GitQ-}AmToKhJ8cEcWKgBL}IHQT6o~cV?1o9 z99Pvmibd=uK2<`ms;95lRW=A3gL6YbdN6y1m>(|TJA}Xt0Ezhc9-)JK{L2AWR|R`c z@J2CSY;2!_xMyj&VEcej0MQQpODXtbBWe+#qtX1Ig+^#pkLeE3T+uTaMa+ltK5O>7 z5c&#CZB0$UzQ(t>&F>lXaV_kV{emK~hfNq5$qvM>-lc8^XVu=5$o`yH_Z;m()`a>+k zpvS=w;#(TGUw{dMs|@;UXVaMI2f_TO@e3IGp2P-vY2T?vR+^1iEV~nq$U9RvxQ2F$ z(12lBR7-L96B*R3%*SeN_Cbap!2XT=4~@2D>R5YM-iAv*PMSO4Grpj5hVzwXDEjNt7kJYSEsz$IC3YRFKr9HaUid zjX?txfqAlHJZ1!3=3zJPdDI&$0e-Tx7V#G$9gN)Wq6?AiZ%bJ8br+;|NY;P`T5a;{ zK)EW=UYolru?^*q)P2@prSgqelh!lXOI?3jZY>igq8B9k}kA44ZaFg9hMIyMixn&3%f_-q0|Odl_A;+9!Y`j4Zbt?v2HKMa%y2em)pSix4TzsW98$kw_p6WnpagYFBSLOpeX z%;K)vPjOpNGzZ{-!IX$p&m0a6&!mvw$_dMF>EQh1x9l(HsF@F;{1)xSvrscA-F72X zq96nX5tMJoFl!39;P~mhG`gR-uGd;^?jn0d5T8tCAeQFx{8;@x1%|oTP)@PL5T@Wl zLf1TdmMKF{iK#0wM~!^7dqA;}C1lRWAoW0NSxshR#1oqIe}{~yQaKKC*ATXUal zE^`+)oBL+7&7EAP%q@3P$^9C+7ISIlHWRUsR!T0#q+FAtA|y$ri_+!$^ZV!geIDoY zIiJh>{d&EgOSgA}e>V}I{7Fvi_&^H9JKTs2JWlG;ae5Ss%}WAWKmY5P*|_48acIeJ z&hGNGskxlu0c=)G>?5d>wAq|5p1j(<_vG;t*JM8J;f1n@Ke& z$=@yS3RUQ-ex(#&b6Q^apH%$)KcCaX|2Rf?iLM&`w*4)=y{wU?9I7JB@m z`uuZu`%6*+p4A;YcRHlGt;)T#>vY5+)n{8&V0y&4_DWK=!QhP{M6aK{Q<1>s{{S`` znL@r#rm?tf{spcZC2+qQ!;ht{ehIxbMK{jmHJtz^eeQ|ke4)Ixb@G5#aO(IEA*(FW zr_q?P;S*xp{4WfD@NTt9zH&*I%=qbC|rq~+K@Q~kH|3(w{@SK69+thjfqWbY@p zo^-zYi1McQieTfBT(Yb3q1&OKsiBe(pJD2w!rTk7!SHP9k|VATHiY%G`IN2mdqbqZ zoaPLk^+m@!ZYKLuL#dqXH^1WIj&BduC8OqGAfQWuqELcIGob~K_%Q0@XK)8Rs#vPu z3+60H-4Sv_Iw|#RO*gWckDLx76mDKWpBMLnYcSeqw)gD|v&tUVlz?P1lJ$?hwg}V-(+s`Z-T{U)>j^&M*@O4Xn zF?^OvQzPQ^?kt5rJidRghrDs+zTBIRi>-hQiYoe?(Xka8CMtS%m~u~v62wE49ivC> zOQnF?jwaeba0qjggt&m{>M610pNrty+X>dY--0PYB{=YfUHSpMT!Fr_d~D|hp;mJ2 z!nK>hs*uJLSDS!0gaPJ)&lhPrD~HjK#*8180Uk_L1zV0$`PUED7J!KnjmDhiLQ7PZ zP#d(4m>ovBx%4oRTP5iT2et~V`?(B~9df(>>DVRX&Sa$CAn>y2jZ9Og+KZ3jKaC~+ zO+=3#Y4+Y+aImV&|FXxMQTyxKL;M+6ooKp&jF8gEpBkCzY}tOroOefAcIs!lg+b}| zrLFyf;i>1RPb#{5HeY9UB0s-S2_doOF{q@!mH@*P!`O$94$O3BLcaDGN{MCW=`NE4QH?jZDo663P%`7i`7hP))Zq**$ zyClbJ>=2P$xG;kJ?JS_&VK%Eu$V(mDuB1Joi3ta?!jmk2zv;e^lbem}?+3tth0+^6 z(w^L;Q;y1!JK+w-f6GFjJq-WgAZEE2k!E~-!B*+bwVh+b#?S6Q^EwcHc>Ew38!T7y z%l2t{{;*Gt%^KfB%^%ovBFS?6|7w?gPDb7|`;?xWCojNutcD+q`A)kJSKk_h{4_vW zUGe1J0d7P{{t=y)?2t{JxH&SW|Dh)Gxq{vFDREj?NFqQl=(60DBx1&9T<(%v=jU0e z<7=1tC#}AJDY&1Eb`HDmh!b?tHKA)*83?fWzT6Mur`rJ(AH<1Wx8l{BS?P)Krul^y zZrmhP;CFyY0`t^`v%j)~hW|gNl$HNKczGxpcG++7Es!L^Pt;8A{{R7yjPr)Gr$2}t zm`DKKRK$agXS3hb_`Su&B_g1T!7EGD3%1I^=CxP-DmrZc8v`If01hrrZf-7KZXPaf zP7WRb2Y^#d*^mn)4p+ei$3cuTxxoe=QZP9rNpN#1<3Zs_%edfRz6DC# z!1*Sk#c;G;|ATP89lDBcHpvZYy}`Z3?3UNq{j_QvuomJZj*^nTBa&kA7Y}TWl&5o8 zl$b<71ZA{2R^`yn#7&a=5Yf~g}oq zSM;h!ch76Uoq+h@e@)Qx$>3lXX~2uZ50a7}h48+QvuYckS?gT&s5vmtF!ha$X!6eD z^6fu%HPiLa&2d)^Dc1YFW7<*TJkL6L>E!PoKgtkB=kG|uF$}? zxf&-VT(}b77e2GCwY(<>0XyN#(RO)7xx|(tc~$xaDe9SNMMIw8`vf}-_YbUdHKKJ1 zS-P{s=IolU@vM4o##RhzWe|#w2_Z7eprzqq*EJMpd~0`#Zy}?ocCoA+3GReyq$VkB zd_Iuv0G~@S$kcfyhKnfxYEh55L)k;x<08FqdoOQYBcYR<*EBar_W3uA?c zIs4q;3};So*Y1a7_Bs)MzpRFuxv%|O9ruZ%ea^%F)4iJv)9 zRR}$KI^1OUnhAEIqCUN_j6-AF;!X~tdKKIJxC=(D;@xcDuJb{$IwvDUuRJR-s)(0_ zgJJki#ys6k<;5>FB5I#qZpuGU+wltg!rn>G+s$B3#a+#JUVNE3Ds1=wX77DuUga<* zjv_jk$Dqs|Dp)9&Wd{Zh%^}ckF+mVxdwD+s42qROB(EKmzL%wgKEm0haT*s(=9PIlFiKO-`Ga`S$) zU3nqZ6$YH(Yc|HM_5(n>W&SD=t~U2fAFrFr{W9trUN zKR_7bvMViI(%*T(?K>*x7d{DAHg7aY0un*;_lfNZhdKmpFG?K18Hr710tS7=ofBM| zG9qq-es{Qbbvx5wtBi%>WYUMq6~Qd?i$>c2#4OBITK&R;3T$d)h|lEDQbQ2>g(6ap zx#<(Uv!3sCBotYSpcFONDvP0VY#XD1^$otBX`)n6LtD|AjmWxDuieIuY50MVgsv|1 zXP0d=>^!t3K2>_Z)`>~3dZS?HTYoAUBWwV=>a6aPa<@ECLSYxNc8qA*F^O|tJz}`> z8>DT7_q-TeO-e*4FC|3Ob5xr6rn$9W#Lb<+lG!%fLyt)FxjForMW#4*vGB9vJ3kO+ zECqIn27Mspq>fV@dB_4X_eyHvt2*y7jp`i7DzMhi#I2fF#gZ9c(4O^v8umf)?i~00 zsGlPzmdR=!pX(n2IX^ft^qbVfRRW|paw7$baZDpA%@g*&%CXkUu+qtUypMGBo;4ft zj}b!tk;9;SN!`XB{F+IS=6gg%1;sPNa=4ZvOF9Om-rFfy1W)p7^m0nZ!T8$=n&KGM zOXzv+(8ReE;BTghvQkL63-`jfvMDNvr+^LT@Z65(NsROD%R0SXJly$XqfR~C^m#i> zrt-T3l?oS&?`M@%t@F$-!h5%hFRSrOUb;aP@n%9M{*l7C;@;$dG~*eio`|b>lR(nC zkg~d5P8uYI2zI~foY=xjP-st z$^3|3eQPI|T*U}LOZX$gg~bC1vq>}+Zibr#?*lonn8K$T!7Db!KV#N=eU+krtEiIR z8acV0Tm2Q4rS|LEA*0rixc99AN%`hBN?vcFfy5oynp3Q(1avT02WB4Ya_);hA5HmL zEpVc2f9IZsrt`&Ro`OHoji6M{E}7FoYq^}dPd$eeF=YaUOu&u6GL zRPRV)0ehXG+PhRU4DZT(K@EFy*T%11IFq(e@8<(7gX~@6cPMsdo&QxO-;Q$@aG0$9 zTm#MTSQKm|PR@^dutwyrCKWm@>=OpMYTOha<8YkN6dggJ2$03U(Cbi^gkV(bb%6_` z;^0WI!>#XA&OBYwrztFMIX&M2rplBN?*`IFW} zL)zX-K!~*E0*^7sxmDe~n}~WSiLW!oWZrGF9PWTD!oS8NFS;1t&4F{VjDonAL@C>^ zicE7^h1aiRFV+HtROU3yh@V;2_DSK68YNBq2w|K!{I`kZtAR6wmuWkp8$6k<7g(C8s zOrLa0k$kOmO?h8Q;`GEr3eamIc5700HP_}`Ab)C;q?b*r!ZQZS?UrW0n5fbQ< zTq)=6DJ9$4tCar!c_r_)Ffh|L%vHWEQ!Zp;&Q!d(?KNYM!vD>IEC~8et5o5+dM8%l zStZLP0FGEfC)4M`V41Kc^h!)0oO8{LxQ>ZY>kt7>H^JO#r|pWb-B;U|kpJpHCcH=T z978#uAdC#nYDDyYnEF+1RE_7>q0zt;g9)g6=1{pbp{!{*;(j7dWHk{epH&jZ1r&q; z6=%CKZIch75*z;_i?%&M)>U0Q*in=#HxGGVmQhIKXwSq& ziya^b!2YNFNC?&t8t*4jh%w{rp{xV9ulLG)wf!2_F61+-17Ekg^G8?Vlq;$Uy=tg< zC3~wdw_rAJA1$P7&L><#s=eE8^~&M}qdw3o`Dm)61_I~;dfD~~tU0Ykkgzf#szIST zh99cOaR*PaTq=$W3_8WA8+X?(Dh3*LsM+`Mh%IJp8`^_vZ zppcokiAH-G{cg^w>@bd*J&!(VaXVy5x%J4yxFOqGD`uMq2ql>(Z+t(i$silshGlT= zU514VFpZg2uzdugJc`kBw94q$x?=4V%Me=rm#BO&Ia8L}J|cp$HXRY&)|3Xx*lu;! z!AxX^xpr%83gk%L9-YJIJjVpYP(D58*3xO|QeD!#XX>3+%jE-|vMikl9vCjfjGbw? z(T;p)nM7tiOom=AZ{o8kjr8+=SH-yQ=2X$sxAvsT4(#hNhpqIu6s_H-rkrQrqG>xz zUL5NcT5{7(9pvxc5)%;MWb;hV7HjSlP>!R3JOXK&oQ#*U{#KecA;jZm@NWZ~{O4=B zDTjLK2e#ghKact->h7n{{ByE+^)v?K=*czqoxe*z;aq>n@4F6ziMEfgSzkrzVCw2i z-Nfvxwjcrw>Sgf^D7|#52_Y=W%WeWhwT0k|G`7ug55&)C6SV2i85&PvAn{89FxJ-l z-Y}r4F2$k>xT3+163V)Vyu{|1l{TD>1T4ffZk24;6^YFFwtg&J=EBSKv^L+~D7;1l zUI{Qdm1%C|XxA?83vY?X1R2bwPi_d9WB{@oXFIGP9|RU@>ZJ^-lAy{~&S0#-!d8P_ zbH_Y1qaL+$iLwJ7JZc9!B*}VDo7UjUtvV3E(xSSiGiD26Q0S^fzk->d*z?PAo7!nA zLOv1l?G@aEqZhp7CqMmpzix`q%_;-!)@O|-{!DWSz~vgy*ib4pSKUGa(=AnZJax_6 z(;wubJo3wBhf2%b$;24ZJEK}*Wd$Z1b!An`AjLAHjOPpstT@soxtK$Te{%-5plS52 zx>$v>-K&!1xSgFTV!(RMTzL51yJTLIB7+)}@O|e2Iq;5_F5l@jpaF6VKJ?Sg#4?=9 z5OG$`l1L6ZO@C{*=4T;LiH_DL(ioa)Buy30($h)CZiDMB9fT)crLHbqcJn81vvh|J}H{{RhlFS_V`1`S~g`7R1^tx6aziA(xkMru+xXho6& zjQyf^p={T1;)0}gdFvv$?L(8lYsM_s*~!sF5U@)ujKegh)#3?DMSHO72GTEQd%-#W zTrs?JLl%P{b-s*fy#Qz*`u?jjn3yPzD2?^XN{@K8f6?zYjzhP(d(T-q}> zvDW5Qz3etdVbt|?Ljr%ceASN2s$&YB~$u#s8e_1UyqxtPI9 zSBs8S`K%T#t(&BH$VOP)!|o#C*%sYX&u$X)>0W5umUhp>x|wg6r~%G}7(*%gDsuA7 zb{QhjAied~^91$f#s1rg zPdP$GBqFuHg0wVKZdzqA9*- zq7>zNy-jbW9Ou)F`O&4WxhI4k(qG~q^mBl7wZ|UHKe|4cR z(ztViuqp)M%9><01NXSnJKD19QKnxiQmC(gB)w!)xC=hHG?bSZS1pO5l5NPQpz)bu;>BInUiVd-n)z5Y(-03JQDzj;{=Q zOskt$R#ArKCZ(w;64s{4QvS0$g*!RRmil!a=*qfEzpvcGDFhVb1GB3Yz&!vigdzLB zXxutq1l(9Z`w;bdo|-)QMRF3y`QIS=6vNNM~8FT8YKpj1>KPZ{Z6Lj zH+yEmvSI5jd|M_ESf&+~Z7+OU{;ZCmHZ%zl$~AGlg2G=T4ey1l$}Z3J_rxK^W`ir#4}%U# z+TmDkH;s}fzW!#*Flm0ME@XJIj+}-vKSu zTO{yzHzoO2aeL>gIrD$~dhKfPs*;{+C85$*g#G&Q7mk(GU|~-TWIn1CQ|bhKX$ahK zJI%n7i4qQlqwZo7SQlpecl@M5G%Ih}U7fU}Opt0$LU6`P7I(nAqD4NG96&vPxf7KH zXbP)py1E7!S|tBqXo@?PI7O4NXNW8FKIb`vBFi$-`tofu9mkMM24evyDB-KKp&Mc> z^2>xt;i=N_~2&bAXh&uHCyY#E#Zy3=p-8oZ7!iH^S{cyEH5^HC2X;1uPjkkk|U` z9XP^e2y}hlw`hAXWnwX0V_BfPV|*4BA+OI65K9acO==?Y-Xg6M=fjK&7pPUrF3cL@ z^R9~&kRgs0_wV}Kit0oHn$u+CvU;R)geWV#%74yN2h5Avqg8fipA6XqDzKWX%tBG=>kNfv8?*JagnhBx$apl0&kh?ihiqRv$Vr z0g3=mQq09|c=l;sn*z(R7P0wC3?X-Q1rE93yZRd0bL?ifDBR`ErN$y7ykKVwe4pd8Ip$PX-m6+edZB(?Y$ z-yQCiZtxJ!5m>R~T&48d_!<}00mWleY^T0)+kEZ4IH{uH6J+24$4-u>RZz_zO*_>> z^GcFzkV~V(T5wJ44CgjJ$%`0Ki6_~2vGh#;w6_;^9QI@uOSa?{>qB19?CsOIgO0EB z1Hg)2f|1OHn9SLo4DtGqvz?N5!9M(tLIb1bS$eTqLdP~!`<5;1!u0L3>Yh?+>7E0@ zmKLgJRbmqk4n>UufVTLO5t=?t)T=d+wZxUwr=|OO&eRgz(`HUt`PH=j-Vyoe+7$++T-tKM{LMP!O z3oLg-QA%GZ;1;n%k8z9iF$pj4fQ{*UDn#QzNOea%Ox(K>UB0cgdX}`BKIM`S2Zt<2 zjQ&$i-vL7QZTM8FW3!Qb)mWZG)@DT2isvu1;!Kl@Bg`DpZ=t1pj$9NetduDePWP@r zvP&bpl8*u;buN++Vo~%wg4t*8HK5QM*rv#0uf0o5zL*MMwyI^yO8V2Ae0=cG`b)3F z1W0ZS(4w#w`eIQOdwyAuTFk0@%=PD=%739ZLUxISl#`sBM>>E~o-Cva7jZ@bBJ0(cLL zJ)?FObQ`^ZGdOdf!F`70CaX{x6QDJGFCaD}0d6(daU+K6{5alXxC5T`o6&CaOj$u8 zMkC!T_m6FORJ=~HOq!m}(;U}<1Ujcog2tZpB*vIImU^a|*g=h{xADyU)2&GgdcbFN zDFB2xRX2WKV`oQz2Z)H&TA3{ilLWL!-cXCUj8fPafO|PGl!-WJPg+B{x)_V4%$CYg z=A~oT>5)|(L<`TEeDze^0sE}-p(@lx1}%}qk9zp`tg5sZbCH~Qbl-LS#7{ZJBcL0e z`Bg)d5wR$>YSCOhYYK2^>=ZBOF!fWhbIh@m-pMPDFzPGfUFlZ+<>mt5*)BMQ*75AL zC(a!=@k_)MRq^*<={T{_*QJ@{rx79w>#zyGuIG2FSa}xiZ(b_+*PZ!Q#)A@{ko~YX za61<8afVv$NgiTO-L|L_jV zZlx7IHA+QEFiba*{H$oqC@sT|_Iw;`e2#l&D#xiOaF6V>eF>$D)mtxf+jEIpp+`Go z=2LHbSJVIEvs;H(EjF;vp#==)398OAa)ypLKS$RxL;4ZRy6^@K9ODtZ6E$M2p#sd- z5gs{9x0YLCOFpYv`N|c#sTZoN_Alt%WMiw4zuw&mE0U6h!~*!mQikJdwvLmQ3G7gZ8 zmLhmo3DoyXCMEIy0y05j)u0ZN*14Y|4m}x?8x&K&5e4?zpR(qqS@NG5Jn(cpHl8{# z)xE~MW6H}pZy-OWY<_z&$0h`+Q7Ly;WmSQ+Y~~tD_C^0{hw<;^)U<-laV=0n5<$ej zOpadX7n8%fqib5!kYYt${^pyuz>r&wu&$Q$Lw)iK441T+x-7nCj@?c zRY)IPZVI+O+t;nC8C3i#;^Gyh$-kxn@qksAoRH`@Fcbx~n6O)Pq6%DAB)kCW%MSp( zC91nIsFL&};%lxLkvQO$Yo$T9fD_<2B&2X+)+d6&)liPp4hz6jpvpLpyQ6N4*rE&N zQMa@^-P-*gLmS5NaNy&y!kv0w=ZMjyVoJk!idT<6uahMFiQ#omOU-z#QdqIFB$)6A z=fk{e`JLbpFJAO4t)obJVm6JclD$X$dZ?@Yd^I9^t8+>#M~w7huYM*{Kn-Ys&lF$6 zN!6)3$v$3=&6V&vxdZnQ`VKU|Lz@cTuj* zf&D5g%ky;LtRS=}ABi~?|LR5p~eUC88D^sIiZcR?ix`R=2nmMDrqx9Y~KvCL(y#_cOb zJ9G>uT)PdkXGbG7;(x5&?J^dqZ^HU; z@;LeWYX>kzHlhaU$xu@O*ej~b(NDh!q6`ZR<%yFeNMZok4b0SX?91r+3x(RP=9#hG17h=p0qe%aHa&ML;V<&vh1^^5bXs7?mNwxY^wq=@X!#Z}|g zn~!ZW0qYKRIx{pm#lVPDH%WG82>8}zf{ARd3LDa0j?y5MyRmi)trrn;AtAYOvdU5m zgSXu`Hwrx&#z;pKdIcER!=m1%JA6ZlS-bU40GfAlsQeswEpize!O-|14|*xYv4hX} zI?zS@=W8V)@_{Lyqq<%U{Mt*hL{kH=AA z-sh(9&!1=IC+?b+j+=>wfW|g($`9ZQPKvX2YynM@ooCfQJBCC=4xIp7<*ivV+J zq7yNo`l{IKu~{rmgpKUN4b2QKFv8?>xc?HgztS{!`^saBect^A7rxdadbo#iv(=Tt zA9O$+Xy-I-zlPkwP5!JgPpjD(-lArSs{Xn8Z?4!S7LF5Jlr&Tl=A-Cwli}qgV!UX? zx~E5BHtAGBoVKR0FYY)f4;*q8YS=d?fo;pO>hgnp4inb@X7^$5hGv+5laFnMp2ETz zR)`7#vitD73aNm&DImGk(&p+`*Nl86Cx=KtI{9nU$=N4o$+?SZ+CKM!r@=lI`0nM7 zEo>A#RCBwY-0_s|JIW}g+^Z>T%WiXTdZ^kL4Z&>44&rm7(5vK$0M%_U!n=Z_XZjy*Q6-^MNqjex2H z?Q*nRG@e>d-OBNAOM%Z5wB!hT1$L<-{yt!4WL?yyuUN4RZR%fKRI^kzX;m3`Ubf10 zyErGJeb&x~^yWplnPdGzlX_1iuw?!3vkG_~{_m`Q=P!*fN*aq+#N1Y7lftud7RQp^ zF`_G=)hmrk)TQt-%9Z1qyisN(@F1-Z7+kLD`Ti*->JkMK5EBtQakNx+VUueE=TZ`! zlnS&{wdxanUyvtlUpN&uTcuiLCVjH#97YYcw%%W;KWbS1xMWFKyPAHDEmPyD=C(Qn(!=8CC`bc(Pc!*|F;W+HE@xuJao}2tXe*+xvl33`-um08c8gVSJG{C6zuZ)L5Q2`x!AKV-NLbJV>YqRJFj z&Ci;n%d+u@8oi}O8vM+-=b)LhT`FS_2-HzYbcPz`8)n0$P@E_0NUizEmKCeS@f&6gxE=Q27Hy^`!U8lCaEzuOu< z;2XQv-2ThoUDHZmMgA!C3FYz0TcDKu-Jjs~5AkZ8+c!(rh0|)wUstR$k$jQos<2pu z^(NVhF2J3zkbgI^qM=pswz7})tR^LAT|b4$QsLGVvJpqjDUP!`D3Aqj0b??DL_-=i z0?klZIEL!PVc#M$p6`{`>9kE}4G^NA83%AVOKdkTiM7r%=Xh&g)@=1Lr^Q||dp0=e z%Sc&;XOIi-`tKjF=xP(@tiBRWxk1IZWpE0ZWwZJYuCvv27VnPG`;G{1(+~cEnN}X- z&$xFjG#dP5Xbb%6PwcN>sQ#d}$c!RT705~Qn$C>4Vywnh6KOGrIn%&GrXEQ!pC-a9 zz|7jyL>y$keyMYK3kA@2IT4_f3qb1@NJ&)58*BBzm}Yhlo6RiDWCYCNpVkC$D?Jmt z9RriE=DxU^4Zk}v4A3V8`!#O5Ud}H54|_jP&_B3Ewqt|MU~J2<{EB>Ura|YZ*SpViM5XZQJ5)VnxRd;Ws@B<+})= z_RwdkFL5oB1NuE2?u_zHK}f$rd+7Z%?U7>4?Rf}%!y|hsj<~+$>KQk{5%%UD#6$9 z4o#{&P*tm>8BleqkEZ&S>yXNsJV4iLIMN5s9@Fkn^r|E#Bfqn04%@?p%=#{mswZeWkSuAG9|V zz{bmjvXPCMTdfsrlRs*6}x6A)Y~S>IvYrT{#?&zjPUw$R0s?I z%g!6%><*AL%BuUQE8To#*n0bUzm^U5qHzj+s>T*Rom#8rUZf{Y&QC^0PX>No{6WMh zENJ0m0T%S3pswiNUd-|6n0^8AW=Cn5vw$g&UsTJ=CRD0nCL!0Q3eqk+5JUFvnhWc3 zs#+6w2J%*zm~Gc~?fcsqE{2>~3|GVMd#92drCT(AUxCH_^{nh)==)p=%C)LmG5ysm zbo?}6^yMKg|%j+4UiZluDcTm|O1bq(L5_1;_ch;aSjLEkO^^IfY7{-;mIkOymW z%>7)(g^lx;Vv~G}zgs_e~{@T?d^XGRE<;y0qo^{>Axqg@>VY&SrJD70R#?9%sxZ@4gG)ubxQ#+DT$TFn+1UZD*ygaP z;maw|{1etuS{fSC&n2RCY9B4Qq!sx2q{ux1EiPTpi%u31N&e@XYXc9Ym{I+1)Ic|R z5pqrHv&0JmV?R!p6jc6ji(CQ5iEw}I<*?XoK*#F;Tlj$V;Hy?)4g@~M!*tPr+hw94C z6*@LKg>he z!N*8GVkUw@T(KFPp9x@vDqdXdudA}(UYbKKy0dhNsc`@W+ckwL#SrC?;5+*iE#PJt zDr<}1vTIraAEet*aeL zOCGUD{!8kizODnuTxa2v6rbE9L*b2`!Nd`L&MtAV!OFTxOtFHtt;}$nG(pT>%cv;p z8rf}%yW#u(Pq+%PLS$yK_ z3RZ3JvqtKLT|}O5wyC)+ksK}%GOtt|HNhH+%;UmFluh}Pvb()Q^9Q|0rHhWmGuDre zL#gCxcvO^GJF&Pp@6^BvFR`oOk+iCxQi6W>4X>d(BQ@6sOZ09frd-zzKr5)`{9uh0 z&fiG<^l|X6?x~?gk;DWJMa`T{OcO!Z4B+a&zm9(2;~uMkxvhaW=owF}C{Azn%(Zfu zytR=FidvOn6tu8KQm$5ELfDYc_P3|hm0RVCdzl6nDXGw>{m|F(AwxhxsIrv3!UDjZ+N5pe*s zfJKm2Gg?_Lx_-R`yS&@`#reo}KOx`T%WTcn?t847Ys?rI5`TU!ApQpT3Ux)(72vC4 zhwQx-eLqofEW#8x`u^7)iNxFA_e*12KoBp=Sjyvf=9dXac_hRL`P{v&)FcFeBSx8} z{#01(KLDq$Vpc^zpSuBd#-hnwkdw0KS}4<}XXxbX*Na{Ni@e>*qnOZ!t{j)qJILcy z6GlcAe;8+yvqz7iER#F7>W`9pZ2p2GFdiQI|^Dit0cMRAzL+2i)p>&ziGKV z5t}6MNEPWLuF-FOzW&!F$2-E$D+ud%@9s+o=Ck*XS|&NZFZh5W+y6AIW@aNq^1**GVcSrvNxQaKoyN};woyli(qvcg$1S8IY zL@#zxE=Ju;@QpHWBrEF_xaq`Tj{kdTglgd16Fvessh&8A6K@Ms{hCe_0X|4rT~x+A zv4oLfLgY-wB;CUC?-{uHka;_%S%8|rPqCme35%gpBhB21<9dns3d>`&4f7{{=X-#A zvZ>{crJbJ2MiWI}z4tEi7b#8g3`T!7?cQjd9|2@;cf7M@=$oO{hFJ^mh%2{wa(tgJ zhNOQ8Xxd-D+nWkse2y5?KhnK2G7xVhetAV#$K>~g7AD-E9eMZHk#a>!M`&M_{*Ov22TWoULF=E@DB)p;DgGV#;O6d`MmyM!4*hgNEw6Jf|?!CyRw74iqwdE+;F9E zjkj>LB8%$d3?u`gjXQkmNS!fL2Y`{81GGjh`!>?;i@rSKs`Ij)3Fasw0XcW<&rv7T zN% zv6p(szVg6cU#1-dItDwa0J}n8&vklpjNQ-w)23igFK=lYBZT@nA5t|+qTLB!d$hB* z*CLHx(-@%eU^Con60(91Hrc8z5EPxZk4a1?YLz>4SaEE*HelYDjLplvZ1Jxyjon`5 zBojaJx82Y_XeyKUs1aVjXW8%6v^7|VIVbTnGPJ+<4JTk9WQ%gy$NZ=dc`n?}D0i=A zR3rN0X^bIoP0GrFtW{u8zHEir6pPAsT$a*KkE->x%J|3Tluz*Oly%fwka#9d zpsncIy@~Y8@&3_(ZjDK6)+?0SyQQ1tdyynGTE{w=KK5`FCMcpkwPsKPDN8%OGQ;aKq>)kb>8he1_VOU7 zgi9h#XHyVD*KHFqj2+CXM_G-np(G|K93-Xi@#r739f2G>9xexwI9qZ!|9*aiU0M53rHT(x4{fJro+tIz5D8QYTA}A;^ zC>(U*>`}(ZH+yVWv&z!VpOsuSIrsx(Y_hO18 zaZIPJ(@Pmeg@F%MoTc4IMwEh;*=={aRP<|Jr^?71Vs$Zm zeYd8P@-qzHlnH&C>@LieL!8jP1}iC#8kZEgm7SuoQxXp=tBrR>B=~YH-d8WqFCg`~ zIxmMv-zq&bE5OY~ZtT7&GUX}CuhA4PCH2jIkJ0!fNj9*v`vZt$Y*ud%WKEC%z4hon z02`7VpMLBywAX;0fPRP>PAE7y^X$2yeNqra4;|X@*YASYO|a4jDc>}!FeA#=7t@)` zLja56zvVKir8A<{3Yu$6>CP;tY?5aE@$<6}iZAX3zJGY_>V36c&3!D&^pC@_i-5_$ zmGKu+!z_-9&9zUGJW)-=lUfv77-5lc+FdxEPY~Z6TMwI>uFNDWN~zv$y5bRLvL0Cp zNVLziDO?+MxH?a_i)^-DjaTr8o8jc#a$BNo*yT?b?TZ#38?C{1dh2%$JK9eFK$q{W ze>uBTGO--O%ThOxMtR8(`;uFlZISXtegK^Bfp3P?r9y$T`jQ2sW|!(!-rxEvS&{~G zBs{SDyxbTDUx`a=u8|dD9Vr-HSWRCPh8_)($GE0U&|}xMers_rx>SYt_PotqL4Tk6 zcc!k6O~2?eGA=ERPTi+a(}VqMwraX7(kw8_$;$t3d?Cr19YdAmy*5_fZH#6_Qjj6W z-!WHr63#b=wf;;buWOPtaeqJGZ(YMOnktX9ZHuO7^D_~R`85j%>V16k3?D*hE)BfNE-F#*chNg}B z3;J<6d_4RDBV66d2uPbtCb*CM@P~Y~Nf{jGt57=HHp#yzr1UA#7xKw6CyE-=0qGr& zt=iYB7xO??w|>A^meO?1(t}6NU82mGqeU4%ZiK-OyeV~mZ!qFcSGBLbHJjNxvPtrh zmm?C8rfu4_t)KToD*&oZ!%ZKB6^=LGq5fFWST|#TV#<_!75t~zuoSk_DpWrdpBq(T z1Y_?sf^7@8TdF(wD1%YiDi$}AZum%Vo&Xz69sxX~l+Hi95`t;_l6GC!AnK!vnWNZm z(;fLu$!ZkfOHT%fbK}=#t8QzHP;Z+7Z%mBl=Q_ml>xxIhdU6e|cWR`49n^;`S2k~S^=4)1XS;>TUz%X2g~=Duq8zJvK~Bb8hh;*iM)0)-8VLOw?nksMQ}sGW zGG0-YO7whEqsnf6-aUa+@8n^6aH{!$D8pv4*%PX?+ejTb`1kBDd!? z*;n+%UKgb23beh~B-{x5QTXPe(g*Op$#$Wbp4Flka>*x0O%`cda3!aM&vG4~UD{H9#-2C% z*qU5y7gr|j>Zn}@((r9=C;yx0vk_am*QRfxa(-LI&GJ1kzJ-jFdGq2)8O{0` zMmoV!^oVKs>?3T*1#}+#rZ3gdCr|yU*!RGvm)MGyfuct{rfAmMPnZj! zk%O*-!TW|CyHZ`_gi@zu_w&8;TacMFUF&n^1%Kz`9Is0D?==tmv70WE-D2;A_k2NJ zk`Q@VaNTTIF>u`Jgr{2Z_4BrmC(c>r<`=0JX74oQZAIgmkKRqwTD*+0L@;^0>GL&x=-9BlV z+WgtDQA6z1K=_s6uZRQlIQj$KErEp3`FF@KqK2N7CE;SPLDu*BhL8UR$4;tj-mMJq zZh1HX<1mQHUM*C0LkvkZNN#1;7}VJk6=UjcVeEzVbDDst!d}Ndjmmye8q_}0Z6?=J5Tnz0^sgIxGh%c0=7j;TDSBRKYnm^V4(sgr~~##k5~ ziK)v62#OLurT(^!DSnmrg|j!HK%^oyU081#By>AM`GtwwSGWUk;bU?jd;8C*pjaz7 zH~){D*M(nA9|NBsW;6Kzx`>E~kbC)e{q3$;n1Npf-!AE`(GlbWK9Lu4x4CF{P3cse zC{ncP+ZPlCI5T9OWEzYv|uV4hv;-@w(*)hcanK+vasX+5tQM; z*WWzx?>yCRFmNxdIjN=KqTU0HFAmA-1)~#=dU|&2*fQ2zAm_c#~3cW zfrz+dz{oitc|~E9&mjT*kQs&;Rvat|;+{>(c9+fNh` zH2BAM&B5gL>lE4^f1WR`4NIrj%fdVVWG2Q`bF^aNOS~p)ogNqM)px@G0k#4Lqi4#< z2C12)-;*e2rWLFxukBKf@wf&0(MnF@!F~zGlXGKRUfgu3G1si)m(9X+Z^Vw^vw4w$KHcqESBFk z04gR@(=N#~B7(HLS(Kt0;Erbb#?XO@)>fne{LL7n?mW#d9t3@9q4E1gtc7d8X7c#` z9`Ccg=);>UGU0L3L(TV6j&a~JxS>Ij2Px^ih3b?gO$2Pkg0&~N6+-V48{GP;NoQJx zXU@8uB<0*TC!lO77QZxOg|1uL*`s`EC3>3n?G3N^z#!d`5RWKz$G@dSq%_R9SIKut zzEe-K9G?*^XCJ!|E+to~eVI$+bVJcuMH-5GYV)EuOd50_|CTa9x zgNFMpi0VYNOhTn|LLBK+nZ4>mSgkX7QL+L3XKMAfRd*<1@|SwujqTI>QQ{<}C-cfl zQw@@+Qrj|*sLD%-p1u2ncd?x2s1U0E06o!)Oim8BJW&sN#y4~6)oFaICto_)aO5NfHb+9qvo^S4zNBz=*L13(8f0#Cv zM)=t3$5TH}C_^wm4^xMis1{Ps%ykswa7{xc(Q!@DHF0go%3>;99W7B{P~v2Klg|<;w9^XflEX;8gDiM;17=3@Gd$TiKz$ zdZrlW;QITz{{*97mqAuPhNWQu4-21SE2MrWC%2kDcgDge+N9WR@-y z7O8h?4{Ad&^!ix?)0cWRvtZn;ym(Jjv*@>m;H$rylH-GUvKKA}4t2vkJ?>p8@*UL% zq7&5|ldkbAuI~(a*B@e{^{E8yrP;1-J8$AW38f$fIK={w=|`y=Ruv|{*@4XSpkBd+ zdN+;sFVQlOh41n!epYp}eyCH=NC}KRUt7(AY|UVYQ%01lKL)pGzs*~}AlVx3ZZeys zUiLQ}5-ko33nO}!N|d}}mZ(nCYY|r%&G3!55%2ny&1q!pa)W}+Y3PTn4tLe7xqDf& zb6z*;RpNnN*{J+ZskAYHhAQnI6eHRxtcA``A8OX)M`~L#3{2O|<#qL6ePt5Nu`uqP zj>ljg^2PDUkKs`MGmn8~)hZq36I`UNLyC8~#+b3KH7aGxf&3gj!8<--UEV2aj2ZVO z=3MiH0eEE&E9IPgFOt>DyZ!?xyLFLCBcH)cyuIe)Jxl?2A2bJ*;{JC>G51U-A$h@& z_*d~e_tsTXJOMrJp6W@bU10<#U%u8o`WtD!6Ah5aNyAFnDV3%4KRYS^S+jgb9+`lf z1Mh+polU1=K6l5+YE*Vy$M&35ZB1(5f9mSiUp0;U{JyN=OeI#)recu=Q@b28(pWxAjdHpi9W2^q`bk zL)eMa0TZ^4X`*)yr>=KP{g?!Vm{;DGab>o}u^USug%znuRjIb1L!-<@#&$Mw8NgC& zD=@JsK~(*&FIrhb+Ed^&O&Ff@SwbAD#{FH0ynU@rf3<;RIVCLUtjm8m!}X1ntt1}h z*1?ym6~du=_uzh{a(t0p`kldD{rF(ES1#|^mxm|YZ)--ZZ^0yDGlq`5y6S zi^+9X%In_fF;jggB0QKuKLgDJrzK}5y|*gekcvaTT5B_rjV)k*eW7&*CX@Ff`(u`K zc9G|G*IzpkaAe(7Am}#Cp7LB`uipsOvlpe^YHxG8KQuKPP!FKw)sp$SG>3Q=M^?QO zaay!!(m)ZV+jf@$aN>Y?2l41o4*U=?x6v?yGWbiV* z9#>Vm$_9JH)^osq*~}|47@FO(D~OHblAx&?x3K;L+__&uMgZJ;os7S4YG!($r>B29 z99&GnXr3MIs$nPK!DKIkK@GHt>!!j5&I?mD+_KNah2Dgh2t^Bbzs$CD`+8EFlb2y! zrS?)2#_vI`Ys7#mx3&Gr%;vP|b!i~ zAAr5?AG|sA^OFS5iHc)I*c9JcuR9gNtj7_6vN^CeZK}}T7xyokm0Tr<+@k#_&~$M} zAKipLda;i&Vhb4T@YL?9>b%SUU5Rn|-m4#Jwzr*vflSgK4UAP6H^KX4L%}qBsXkCs zqT(K;WxFkk#;uoZ`(rsBzEX#rZw|dyr0;B^SJ;WOpX+pw1oG1l#F`qs;|o-$N?_$J zeSJe1n|4XgB1?@+)fi?U^w5%sFGJz9eVfQ^HXn+9#ZfRml0IC!PdZGyKV1%9E1Zfy zw%KC0{~(F(-W)tO!Z0lA4*Gv3=>((cAXM^KyRPj9bE*i|38e_#~6nJP9>g=UwIt z{|qr^>H{Bdjc_`g9_|xu#;R7Q)}NODgYvmfWZ9}=&W>xE48@r}CIb^Yy2Z@oE3_~F zwO}LI3RE6{>nYoPN3V(mvsx5b4V;>V&w4syTZ%Q=PK;lU>I_OH+7A+bM^(}x>VPw- zVhdg^7-`BpRQSRG)(1POk%y+}iW>&4D;xa?Y|Q=ihhjGMpH(%Wsql>at#-8*YQ?zK zsD+`iK&}@i9wiZ(mh3wCX(}x>W;PAX>}gVt8$7^XEbLT-s)R<2 zc~RUCYyOs(;bd310o-~Y{*{ntHNLZ2Yu>4(DbL}scS_IP6gT&X);aya8vvntUuJ;* zMEVC4zZA_L-weSm;%15%?Oi8nS+b6;hkI#}?YYdq6<5co1s7-ODNeE?p5&b-UPIL2 ziy>*DH+}=2S?Sk78|`l=7gV0eizrf6q(0ni=i{QZ&kEX@T#j9coJ?2vlpwXB@qOFT z;oTRKKkfw+x#DW^-ObzOTSSWtX4kCNh=Ovp#Tmvh)<>h}(-VH(2RzVcky5!g_?04p zFo+}yol(7vY9ROFqw&WYz7P(xpH>wrS;NF@=~l3qs{(Wp^U%D(7;p#$ndxI*LVImS zE7AU(@I{Wrtqmc?$d=zUF#|NMe`d?~%7PsApFci(R7y>We2Ll5z8;qT4?u3r=J>6L zdMaIY|E}S#ek*I8TF)t4T#?@P)5#9)we$uuK5#Ic*F8D*hsz}GxN45hs>dN-D?Lr& z;xNvpne*y@Opv6vHts>h*VI?Ar7|}lh*&89gv*;lKMbVy+|4nqFQ{`tBE;v zXk&lligC?)D#i?`m0JF?Ljh6ha^(IqjL|_PX|$B(_@(U_+Qxl8ADb$#e0Je{xK^Qc zT|a!>H6_+ehjZb;cPk{4@KiUc`^RGwV-e-Kd1M?*7<8TV?y+bY?vfL5!F1C%4+Br= zIlhXeBxTj?EbwiL;~!|w&tkhyf0LGcGLXn;3Q3g3M7Ih11Z+i@y2jIil(~FzIG1^K zH(k`4-sYNmZ@E7|+ZFdJ)Gsy1D1VjBytyY7`X~r<%+=-04FUbVle?!{TQ3aVM= z6dgMOBuP@yN!jOj<`^>X9sAv(68eYq@?hl?14r=Y{nh^2@ZbF zOF}RA+Od8==t11UY)fhB^3|6s=)nu;}tl@vQuh<9Ir* zJqzZ&lH_gr+!{AasP??2sdYWJ#O3{;BB`!*&aC*$AoGdoh|^6GQurU-+d;xA9H!3> zasyRnlTZm#$NUF4xDGcBpT0DIJgHpSmvtNOLCsg4CjCm0auGa9+-mW-IV6JC0uOit zTF9bFKAj1~%}kMu@m0>J$9-Ql|JBv_S$@*nuM-c;QN5kaR-Bkxym)@aQzl`OBO`KQ zCiyb^kiZjWK4$feIx$zX?H@MRww?I+AMJ7ip_gTY3I40^UFBx9Ak3NX@4&K_KyZA;wR%Vr_{VwK|iAB^1t7@Rj$2A|cDvo{Zk=2SqZAB`#w`dOEAWI}a0dp?;$^Bys- ztf(p6g|*D9<;{Jr?eqJg8v#3pakx4X$t0?Z;=d#u0WZN1sdhg)>0oxXjU2x>BB>yB z45Hdmq%EML{|hUuq;)EOdC<`URZb!E=9OQIvkL5Pd5I3_+^*b`k#(=B{7i~A2Htjz|gM}W(^9KOA;b55}z6$ z?dpNn1`LVbh3@20^n-{b{_=yAxMy|z=^+?>`o?8VJ;@1`9J!j-F9cl-j=F|hPgZ~? zBjjIvc0%-UlOfQDYNh!tXs=O;!AsYaH-$J4o&G-n9qPs6&;k>FqIGh~_p29yUA7`> zO7T4ZK355SlO=!)S`W0{!v53n3zdCA;g#(iADJ(-oU{>F8Ik4b@QKD-Zy z3l+X?<`DX!Qt{-O(9W{*nk6-cBH#(nZfsn&70aB+SQ~EGzKwQK-#o4pqwM8xNIRgiSi< zBT$s9Fp?A$8z09K*?PLC1S2*>A(i1RJ$uF{`v@$8U`%1J!2}Cr(Oepaa%YHkF&@|Q z9BT&_I9>Csesy1b68GcJ`)1E5R5Q7D4N4}zZd{qTHN(R7R-c7~_^l^F`Xh{C%VCKS z4cFrWP;5iuu*iUA=uS8CB{1;xKfr~EbdF>MPnzTdCZ4lImo%Qc*QTYV!rmew2jR3PghPTc&}VDaADi;fA^D@ z>CN0YQT+Vbt%nsi`Y1S-mR-#p#VcoC#Z1gR-l1#sMp)@ey;`__E_ggeJMap4e`BDO~~UF#%e4Ga5FEm9h2 z0VLCs3f*e_78qE_HuQYOl^9D@P*o_BOwRuEQd~qk^`3=>K@=|*G z+~$RSAm-7)N#pdQCY>skFEu;s7k84EB|>B`Q(~?DUazl8Z>`r%vp(gozo_Ei3+o-z z?EPPSjl*Yb>j zOut$jp{ZlEY*z-D7LhlAvZxt=J?Y){T7_05=A(q`pd~&aKZZY3JF_9D)vIRh`@R< z468mW^D5Y<>l>WvpS6J1zTPkOX&ApX60w&!>Bm$?wr;TMv07Q#RMJ=AA!zkZzco#C zo=LrNXbHhdcv@9A`cMPj009M}v!A-e%+p_huavSUp8O!cDto{kbfE?Cz*t{fVJlB2 z-gbbm7B2Jdw097P_e{-$!Ydyfg}1ucQI;Zg%5ha{0^dp2z^q(Zky-M!GW=~bUO!bPH?V51-qTBPp znZKe{-%d?WQW%AmveVp43{)fA+OK{otbq4NoC~}4n|{lURK3D&Yt!7TnvlAcwkBda zRy+kg`(WJsBJoYT=}<*ZW<#x?pwfdzmP6pR%Jv^Em3C}$ZYzc^7S=adx)6i>9L6xy z56Wqlclz9Jm|!6U82!Ek!smtb_4{uQb zz7ngk2zhUucV$40+4*%nEP|_tI`d~$MTn@f*?ufN=RWOb8~N}8Xh`yVEV{C~A ziX%s@^4=gVm@zEc30xraibKwEA|m204Qo3%@!=l$oxc&X2$K^968BXa_#B|v`!(SYG;mB&LV{O^>wsCmv*TxvN+yNrO zXMAE4@N2Dwox2;U{or+A*{SzIay9b_($x}fYBWfQ_-6v>vh;EN-`&aRk-tNl!7QqW zwBa>kSKqHb{|B&osH;&``qp1!Mu@)dgN&z}Dvgn^VFCnKM!eqeM>mlwKy>#Vn-xat zmx{2!{A8F%Or!795&bjma&zf_$T#MmUu$uz=T&#(2hB62DtqQ;A6ch&2Q89Y zRIit};W*j!G`H5Y=$t#Sih3?yFEv+Onz$2pQ%o-WR9s8a>0hIW4y_;Df2n%TwGjHI zB1D(7e$_hu)D0d^ z!_h78l2`D9((lFcSXbeM$5Oiv+SEEVcxB(XpGiYG< z{nV%ndYMw8?BoB1GQaZNJ{c+U&f*d}OaFzQL7c<|5-!kPd&@|PR~M6W+q~@}=jKDG zbpPnmvB@Bm?U&eW%(c~T+Wwa78LqZjP~m3uDf^Mt6TS9w!(i6NH8A@ zUeV&K@LV?_A&x!nQ~VoEKbb`T14xQ2tNyAw`?p9F#dv)GdtuJTV%+Du7&qp(0jo#X zUoXiY>;I~Mw^B~LUXkyMV=cICqwh;jJNaO5S|e9;D~3e7!d`vAklD`fXZ%_{)fwD1 zO-RH?DVl=WJOM4`mMC}7NgV_p~szj-it&m|zZ$Rj3%sja@ zZyEtT+AqC#CWOm}Xe7|~9s26ide<+G=Ur<3wm}<%fL*+dAI~i_G8<`X>=vU(#L~PL z3FfII(tJ7elln|A^QuD|`E7SJ?H@eGMF;!W3^2dbM(67WZgw#iyd~y$VDN zP?48Z4m0|?{q>v8cG!pD+=rv)PcvTgbx{hvBgVpAGg8b@Y!SNWXQW zSyQ|e`DB7n^2k=vCOMpcE&P0+J9KS*$9vVfKr0#CwPo~zcEFLu)D1#BA{x@4Q2b)3 zpr`azK}mrG)os&^q<}73#W7T6M@fE25+U|c_7zf|U6O^gxpcXr{z55pFU$EFU_nEO zsx|58EN;{UE=>sH>z6Zq1)&yVm;TjaHeU3l9$r`)S6y=LA%1xyu1QYPkluIg%NvjVCbP;l74jC1E_Ad$J0P`#?_P@Fo9h@3(ekR%}%b zrU3;6{0t!I`nWHn9!ziPmrVSe&)lT7xJOAsEi&mX$@X+8S!Sv(@yrO?inl8(*VEF~ z&gS$r`W>4WUA>nWZZHY3WwO_s!L{mg86t&-~@i7Jf5Q}U0g?;sNYhz?Zs?|`K6yf%&IfhxQWxAckHJ5K|+BTB1_UKziR!kH)^spIFb z4X*XB@+5;c5r-eRxbG)*?Aa8>Sj+qiiI%F*7UfR3n0w?8*zTk->()Z-l@b!}qiY3~ z+-FrMnM@|r_{4&oTlkkxtu8e8tzXLG@Q1}eG=>({e(l5wTtBRLU0b+8@vV{(g5*pL zlAKS!V5J;{4@3s03GXeE*rph(vBbSJxYx5H|C7=FDp9p<@j@y-U#NNii| ztN&d6bG3a5_x@2;SYUDhK_bDhAihf+_M8vxs$yQTMeppmMz6L^&Nw3aUP&pR>PTtR zze(40rMcpXUjm;2%qR@RLEz$~obcg?BeJ92MxPSt$)YCJHPTW*Z`kR`1M!cCMC1z^Yux04nK8UrYCA*w5R`r2r?LDFq z#${{{5<`g~Y_pj&Ij2W?z{KBpL2#7wMedIT=2`?aJn=osP~coMm29vgUE^V~+A>IW zJJ@0eRrlLrXGsbA4r;AO){{o$aPad%+iD<+F9n}woIgXux8JsY-QGK3J5p01WsOlz zwkPd11pa0)ly&!p2Y-=%MW&ldCbP%`F(z+a@ZJv3Eh9kWhF>8=zZ(C?yk-7+6aLPD zqa@spF2ZE(P3WdIaBMeFf7mngt+x$p1$xJunzb9sc3W z58C#c^N%K?cxv7vmUWbc_xbm={?)M}x_ zH>N+sbjgzOA$c%zp|hy}J9n7AO*z!&7Bm&$_2CnJ*Vmw{1R(%f6Xpq-oBCN}b=l7lZ+Kxlrk2 z$3kTxk8odKr%YY=r(n9|-*vyZuTsas^US+Sa{fl*qg84e@n!!3QX6w5gVuO(UBqPR$oL$->@?*O)P)?rn3#rud?1JH=hu&}_}NvIYf@kb#mzV(g?0QDI4QW?d_ z=?aECH-yUj^IOBDa*LNNvqtqPa~P^JonSU(47aEZUbCtLzhtdX+y0eyCI2AaH}?bu zM+3R8ki)c-7(uJm(MR>-UcaTI$f;O z$-jAM5*wU?MLt~!c@cu553y_|uTO>ayPB&t&OW!1X$eT0v(C7D-r9dBH8WWZY9K`Ktj}rE@550HtL}6B;Fp`}MLYcBHxIcMq&>rVC@WHlTAW0AjBdsTt@Q zmX$?V5LVB48%I7u-LT3H^Z1Xo)3%^`4D$@0D-gfB*9NASFhUeG3R|FSvbn}xZp=w#}N`5t7u3IF#LBs#wM9Po5E8115 zl(H2WXV^NJh5E$f4E1lnwe*y-2t_(YS=Z`qy2GG$jqQY{(3 zR)WCVf$!jZ5v2L{z8^tNXBFdY1Loh$zPj>kvU#6b41)zP zqL5rRmgC=xL+WO8>H<{^_`1ssn9GP95o98-*&6ceJE{~2?T*i;V!r-wONpT2JS1Yedlm~qV?)b(*u=qr7n@M7Y2e)=IC z$i^^W;TzH92!*Hx1C?y+^`{H$rAgeo?|5`m`FRVh%CYsb$d3VuF+aEKQDwlykSpn` z4(#>Dx6`3KC|)urGZ*V0P{-0%AdU9h0;}MzO=@7Z2qhjsflCray1XL61xI_5g3re@ zAsOGRiy4_&#O4?&B-z?z4ho2=-I{E8FQI5hvuXkp3;~*t%KvPPJBXrPDWT*E z+Pj+M^p#5K%{zGdaK>P7Gn#tw&Z5>05N-8YEr+LL1E>`w4{a5bgvU_^19%{LS@DTu zyY!LoO99r;W1sVVLc)c&VS&g<1A3CoH@%!tz53nulcc~O#ld}0M{0qvM-yY}W4u$s z6}}w@IkFofjG$hVI3boG&qgh-jA7PoxsV?53xC@4${P{94ixOtmyQmi<%k!?1X1kQwi;+sIGCqR>#P;d~ceTwkj zSv_AwQ|T*uI!^KDw0nG6t}tjq7-4ZSID zWjtqMC*=6an+O9%i2#iX8HmF8C*}-nQ&qs z6Z%|3p*dU^6r%NZ<$Dp)dz(p-bN9sGkG^fFbR6}0TYTR>XltnO<27lo0(tgxk$ZSL zoYD_}V__4(vVL$fPadq!8%spTk#Z~%>^cg{r(9D!ds>WJdk~p=)Q;!vPh<=3isS_9o zM$7bcj^s^R#5et_Z=!{{aG`zzsYL#eef(_5MWOuT#$*4J%mKur=6QT_Sc?4vUW?qD z2mJS0|AhZB-%AiO>!|H7xU*YhN-ugxspgx?K~AmjD`cQ z97~e0%{$#M3V)Uid#hBRkv~I0VoVLE%Qb=jb53P=a09&*tS!`wnGimmKt}ji8Pk;_ zvDTRA7*!O0n|b|m;0(vdWNRK-6e9~G%h!4Yd4?T6eu^%S_C$>{1uoFuqYh1mO%C#j zGF!zB7!@zH0QK&PmYi11Y(6sInnlKc`MTl~@0%akFQZN$q~U{Vor1|j5KFuLKsmgY zS$*!7%{y(_=i1I)iDG;}uRXl7^>GxlCrrAuh{wSMt3d|6!in<#0nDP26yATFp}NlB z$6qIoKee+GTMcaWfZ?BXM@LG<4}d|B;WVVx`3jJRQT}b^p|O2Z5lv54xA-SILh&K- zuvELc_g5j-u(xnxFG*xc9!#}4#y-Xx*T=0Fo(vel*x4B(Qut?pMETmoNqxlx=&8a zye%jFfa8#WOCp>=w|<=X#8h%zN{J zY=AparRA`lsIha=;%6ds{ekE+?fiu{X1Y3PaH&R?Nj0xs;81F-o%-^Ey!jB-QH$Q{ zwK`N1j#p!(NKWt1O@Pbh+VBVh>VKdP2Dem^8Wfr*hr6XBMI5DJjeBBySL3ehM{8*&YXLZ}y` zvMcs+ObWgC12!TU2#O5!cxV`3&FTsyZwdt@#a~=;Z`puaz5~gQ+a2pvUnkaX(kA9Z z5_7TkG{PQ+vLX!HOQ(LQtcP{ZN7watV^oeJRnztE;Ilr|k+_D7%#PKO@?b#8N;V`yhBXU2)HoESUvV>U(JlWHjpBWO|Vo;d!=#Qo1@Hm&q z742_iBV;9rZQqJ)#3tp6OQiue*TQP(#P}IeZ8}7G!YnV<=oIAP?#pNRZnK9}iT6~j zb_m`TTT%+Z>nZy6Q-e$>B)~emtx6%qY$tkTEepYr&fBt=>l?Bv>clK~P~>Xtu{`g$Nfo8Gdd4{&LAC*RMzI{j>rmbRCdQ=5XD#)SJ*x?rgOjt?JD;;zwoKMLB) zugghf=vJ>t-f=|x+XRRzZoFk+eyCGV_&OD6VNo7p^Oeuulht5fx6EFT*!7`J>V(C; zgz^KmTs=w;ZOW%atN=mO6 z26goTy>cvu$ST)d4@P&ah774ce3hz3C@8G)%2!E(?UF%TmwqZXp2 zAB}!xUdEHEjX-(&p;GEdQT&3|D25MCjKC%j+2uXqF@5X{(I-t%jFWceOtC8J!LHvM zer8={ihnyU|E8?^?(q{n+#sI+x*xsw-{|7KV`Uy4b z>M$zo&tCN2L+)FJK`F-Ai-_{$+FC)zK0{rvzOVmCsWXHobnXnwIm5ueH#S61ABmop zRKFAI4vKrf^&xJ4gQsiyPwEmM!%1)|531OlOl=tnG8iH4ZO-|_ITU)jq}o#9#S7&N z6DzlYqOn*Gq)fqJhBn+u3~hu&GpLfUz!s3(t)XT==7He)dqI2^_OZscEgyjt!evCv zYz7%nD;MkdtA4M}iJq6fm48%kU&}wGB3Ks-q5$zv!fXt6d5Pg^Fv5fsawNVHit*IR z@s6DXrG1VnOb4D3-rp04|6Xwrd;GO|tiG5?y^_A=ZSMb0yIfNQt)P3{1nWt|JQ{_O zAyav6wwVV<-P}wvn*%6|wL75JHo)x^eh{#I1xLR!ozapl(iMf&GtL*khiv;bVJ8P* zmiWRDh-;V?X{E3==R8xX{HRW)9vJ4+$-{-3O+8cgY+Q@jveVPCkOhgqAme1Tw<)l` zD-~R!8|rFGsVk~8sTW3l`usaY>rHeE>I_M#FVfapfI_7P5aFK{fj@A*kJ5fU5|If1 zN|)KZjjk`yYoJSsa_TprrU4&zb4)pZ#9aqR(L7VRx!@NIT^Ig*>zPa#=m@6xvlyl( z)n3Y3Wf8(b9{lP`1jSs`%AnIV>T`zt)Rw4^ZDKy@fE5?BF(x&@QrchkG^#O1)YE97 zUKpi56ZIDm6+^eZ5MkcZCJ$R=A#D{C;bV}b_YBOVOR-K4GtskeN!0_@NSh}HBUiwc zFaH>9-$b&XidKh&C@)9yPx6AH&Oes}&r}P{+$WTrqBZ^2iFQJvgYr<=2WVao1JZhi z`8qGHd^(wwb_IMRx}=9!2YAum(-#J}Ypb)}_d~YBJdHrL#N~y(i~tr$zmsD< zJTXf9ELEEq`n;GpmVr?R6c#Cx6}xtV!f%I++>ZT`2M|9y{XF@DeMB+Q(bp2fF!HlTrJPsg?)LcOCeyNsabfa*-dx?@R_qoy!Qq1XlMX!4@nga3ZdF%cXl=wS1Lob^et{MQyCmpPLu{mk;5H$gamm1I{-MU z91bc6#sTFLX$tDPc}5pcccgx6{U1CIPm>04oJ@`r@!))tQ@af1NZo<3@<^e`a*7ih zQ@0(W&={?UGUrSi4Cxs+;0ZvMZw9PZ>&uP+)7}eGt)zY)R`I&80>K@VhZg)mBo$?M znGE+F9tTL?_#wkq2+pcHPbaG)TX4wll2#a>1IB|Yx zz)`Y3)j;rk)#4Zda+U=|FL&#-0yh}})>z&$7&{mVGkdbSl6~NXL!V0+{|DHf{sHlf zmHj*1^e*!*>&8vfXs){zZvyZxOaz6cb%{(HQXeHZ&Z=u~CILB`;2ADQP>D~}>Fvsi zRn6M?Dd+mx`Zyvk=R{myMtroO;v7is+w0k9&8kQl#OPpc`%(+k{Cd7s!tWbZh<;I6 zez9}cvnR3Od`UxHR@Fs8nrQgc*Pj;fo$QTOA)q(yI_(3MP6*zuV6sCo)S<%-u*+8X zMq6lT6A_#(sMpUbqbMzs`ePG}C|o?#;O{rhSb+1Idl-L-LK3m@ijaeScJzWy#PN~x4Ng63{vg`+JIYl2zC&!jC$x#}f_R2O$EGng%>cBKk`s;b^yOMGBc16avw^ zG?T7S-S5z+wmhD3!TIU*$3mx1M@199?1L-2-H8hm`aE$H3W{V8#EEmheb}E|=xE^k zv=|k}P?z5cmddkB&_}!-E$nDHXB!O^PEkAt9k0^USxLIWpt3fZuBrl$@ZWhNIaYVQ zO5q|8BCB5O6us4_Z3pJ*y7YDiFR&3z-vThqf5{Kp6la{KrSX?{HdVlNG%l|*m`Vlo z&#*T6S#N|ni;jEqdwQz*2UaF&;8N@Qt|{3O+x=yhY*1Pa%1IaTla}$#Z0Rm1{^!@$ zbT`%XTKd9|`A)f9jq)LA{a#{*Pbw!$x<{mqg?Eg9y=2QD>EO2U)Yyl^I#o_r9-uc;8iaB^8iQ}EnS9} zbwLF#?I&@6&mTZW7!Yb?!RLynGB|=KR5259N<0j z|A+PzvDnFedU47_|G*T#6HIGbr}u(2WjoWu(hf_@hX+J3mrnSkLQ0VZ?7)G{68A2_ z&0>2s_3IRA|I;yI(Bf)EO36lbduu9yINAJSQv3bxDLQ7vtK#fj;_(~CFnHRbaoj>Z z6WHzwM|OT&^Nou+J>x53A%*Dsa|!z(Ts(fy>h~&M3}+h%)R3(AQh73*s%bBwdoU-d z;^l*KCr7-9m~pbpz=HuFMH3_SkOwHz7Du{lh@)ccsQlB7h{f$R2V59Y=Gut4!SC%9 z9KU7#`9p}sNVj~>&N*pEvZj8Z+LOf`|B@XiDJz(nP63bRJqwwpUrf z86zznhyuAdQY^ttkjQITpH!;JO=Y_$?HC*3CNG>RYK}Y|P;I(>tn#etaLAw?Vb`?t zAW#LqJ%rFH$apsmj7%*t`iI8zKCnsF{U{})H_Y(66A3P71lST|+}vz3y<{Ha@frxk z>X3Id=^2%C@iIf?b4nV}z8FnFh5V;*i~I->Ptvg=eFE zz$WIlN=?&gOnw@6S(Z^>I_5%pkwx@D_r!{fCJdYu^1>^8(xdy^+)Uv9dxPLp&ns2W zk*px^_#a|tb`gVcgwVkn|Eyn#PhZa=4+VwOCB+_IbTQ{HwQ9Xjcv;Ipd`v|Zq_JmvcAyIOy9;Vlw!+d zia=Th@*VD!PonNdSA_zetRhM9o?4MvB)ey&WKceCT?Aa{9jY1A6u>`oMP<&NT1zn`w{fjQYasOd5yv=Q_ z4&{|3?+YYAGDD24AEsAb()m>;(DooAm#>JS=3~L|TG$ z7^fJN4&keN)#36ts`Hj=FI9d*Ys$B%>(yIb8}A>ujM$6KZngRG@ra%}pJX>?I{oem z->9FQ+S&G4GL*I2NP^;P2q?>5O{c80&_hnHD}p&{mwQvf^4m~K=xaN^MDK)(?pj$r z0we>MjSc=^dF#g<;Bqa`5G0;lcY)1H6r9$6H>g;V^6dpRohlQV~!jBtp)-wfP0tl3ZG9YW}euZ!^6QCp*kOI`PFumVk9 z);qgGoCMox5hBu&6R__jNOL{$z8OibzVN)dM?FyWM&TjL7# zDaAjlB5BDbuJ};a*@>qRe@ja&@pIvJ!UNK}^B{B0cCp}6Y~7Zv?|0x^bY`-|Ku)U* zLBv5|vIJhEgA;DcfEanR((b1X-~y)rpTFwhp;A04zypFsE=Vx7O%F@T@2rLvy@J4< zDL#I8$DPdC(~OroJXIsXJWjtoRE~f3`AFw2mU1_9f8;iQG){*DdudL+D=UjjKRvwa zdTDKxAXvKlh-P8{&+pwz<%CFBHQM3n%lDNLRDf$N)UeRQK|HmjpQNWaY_1;P)*UIK z4xW?-0Zo0&K4*W)<-@js2GsI%Xh(z3k`|F^46Gh{Q$?-HNzwT56G(5-3nnAb5topK zvR_HsgE$^S-rI4g-VC+eUr>=rSUC6bnwMaLj-+4ayt z#4GdZUuN1@xr|K$@9ot`Acl{aj#6SNmVEE^e{$p$O}Ta0Y*a;1F!C36*r(Eox=uo$ zp_eE_@J%|DCP`aZDhMwjx8Yt{MS|h0L4t-(^IC}U^dN}L(}_B<;z~QilzS5z9bUD- z+w9jO^y|ZP38ao&$_GM_&5Z)w+Y#WOx3lhliu5|n(TIH}VZL|nyrH|}*3 zxYhIBA+m!!r6D!zV+Nzfio&3pwn9T`VFN;#pomZFW$6Qp)f=K3-_FDM$$RCS&A9Z%o6R3T zTo7UfQVKxn_102rx<7>jIILR`2q?&1csd`qA0scB)i71R{2YaN`es4y!#bq%w5 z)D@FfK`Ko7s49+Kv1%1-rXiu0hzN?eMy6$`{1FHlK!P$g60F$A^3%POAQ{61U@hA? z0a=4Jou4xF7nazRTDa;O6&BlycfkbTsC%YW0m*9T64kj2>LG*^UYJCi+Y*X5-!M=X zBV0t(7?#)wE#+c+6d`C7H7U);<`4MRmyni#lbjW9AY42>cAG zmMPDV6EVjHKp@Jq2oNofGbw7-lVql`R_4B<0$UB_k)%73zNMX;JX68y6n9rd#o#Dm z;0GqQ!@31kmP?UU9U@dU{^MS4wLq9hFE<<-r!nSa;#}&S*{Od~;`i_3U1Aq_$=n$u zP|#N}mWru=$WLgXx_gKzK{8Vn(SS3Y8=81RFS7F&g>ik~xnLn|e*~bsSR1zZ9wSf! z(-MtE0r3@3bhgu9XfI}W#<-gaF1LLM{{SXZaJr1hjZ?M=Lei$^7i?s;kuy}zA~Jb+ zms@np=A{TNkNA|~SaOqKO{L}3Yn+-58ip*>+F>-Q3h`Y=Fi`_``GHnjpfGkJXG2h{ zKT&NJZ|wn>PTZ>+4(hJ~e@uS_FH*jxeHAPC-|^%4^ZZ|{^!5BX`dq1xtwjQ27%F2n z>zKu?)kLPV0kevhv~QMcwi~Odi3MR_>KZ_Mm8@wA0?B=}svaROsA4LU#wG)^4`d9X z&H0#lIXd?^5g8?#2tLuIEu=V?*^VF&1av~VY20F2PB8=kurTR}3l~vk9x88$k~6##4>a z31NO?yy7sC6bPFL)oyN6WXCXAI&RPIX#zETGVMbB%pDV|iv^i)W{n}j0Ow5 zrS4=iN`v}~1*$RIh_#Im)U@bN1y#!6r4_uj4AD~@t(97ZfkLpmqx*}$lT>EehOudB z{{XcHvz1@mAz;`$grztK%oKD#qqwzUbb#SK%Zo+KS<@3z2Amg#Lst8bR@poN$M+02 zD#wTz&9-LX*@=OLO|eCfXD|}9-q_m~vS)}ZLqS>m684uv4k500_b2*9hqxjr&{CWO3`d8Mae+Pd<`Qz)K zrXQz2TukH~#sR_F4;J~G(%or>mCGmvg2grFP+=Ij!mBS47IZ+mb1RzSD0P{xZVl46 zuMy1(U_ZF!Ln@d~9V(Nk0c@e8rX{q>(c)gtSt7ADSiWWAz~3T5!v6pUGi?NM3SXq4 z+#^>R8YOF~c*SmJFAozaEFvrbuEcSsD$YoeD|`*X+b3NyK`N<;rP#>^u;49Jy4OJv zRE+{1`>M>Zs!Y1I1)$=?LGUmZqeJm-fLb&OHYW?snzF9}LY?;!G zdtxGseplSawAn+8b$$rp8G}71H5+;RO6mlZj{%jHT2}7YM8b=9uRE8b6aa9f<4|e6 zkfjuG1(ahw+;Ct8Aix6qR}&vMm~eW6QA@k86Jgq{7Do;Xxtwzz2>^ILC7=?`m7KsW zT%vUf#%Cp2{Xu=Ym^@2hYOx()w$00uB|ZWRw9QdQIEJYXSN4`OIXD3*dG{Q|Fghjx zKs?=BN$OF%Edo;zjnHudEIpmUWN0?y%tq2u^fB%Rxkx5j@Tk|S*tbzS=~NE$_0Q72 zokWy>9)6ttZ~p*_lA${K*Yn5IpXQD8NCu{AB8F|$E?8fu3hN!k}??F*(}<%TsP%a;-2hc$937j-nAm4us38R}V)~8`bF@s`fA?!>>#+do(ho zj_O~F(pHrkfut7nMWEePOS%!14<9n$zY!%GA}BFRV9KnxMmwTzTY_w>+)Wr3;I2W_ z3}sIccMm|bS1J__5h0jK&UpXe&r%Xm-Ll#P%T4z zS)TE_hdB-F%w&e!SIYI^fNTjxt=6t!tbjfymeI>CKxnGat2$$xH{Pn_Et|=Tg}cA} zgck~DjPdo<U}eRUMCWSb;=iKoij#hxJXuppa87Y zxdg~IR1MOZ1U8n8U|UBMfG!}jVAD*&NzHW3aJrUGmzZ$fLIni4eM+0+OUyF@5;mZP zilt^bX_ZOUfISBCuLHxqRDd z4si`s99lf4p^2R58a&EZ0H}}=sH~xTpuIg$J)ysGJd~>2x3(dYz+mu&E?0sO;>(G> z(S0)=%XC9-1w)p(g>6*Z)<}MJluPJ9lv^RkqBA#bEu%;KFQ}buo6P4$L~VNa0aps8 zEaC>`V^t4Xc747jP$Jv51SkrGxlrBFn8{U=>Y#9|bEPGCaf3XOB;#J!nRN-+h(e83tMs!Nn*hpwV6X2`=TfSrg4 zF>U#P^}qJxAaq2fRB7`AL?}FGsZ3rV3|r-b1ynx-dRJJZKQ#~n&dg9YvnzuNpa+>! zq*z-#be5AtNFR%iO{F&f02qNpQMG6B040h)^dm(`r4tcMP^`cn%O$EZ${gSEujOCP zzK8JUA4X>7{{ZmM*5UjsKSpyZTpbWmf+|t0!L*)8K-N-GP`PCG&-LPqB1W><;+`We zx|oX^>zF;lbSt^0S*YVGh0_#*t-st-)(1XF>dJBR7uxbd!t`@1CMQVCXxwlE7ZwA8 zREi;InOjleiNd8~8iI%`4-ulCNDT#ZP~m4Y;wj@%(iA)(-FOU2K@GBxPaQ|11*eIL z6>g;^(<3rqZ{?1Fil;O`Y$bOvw)U@bq%5}v9{fz=0#d9?wphBiAUlKv zmYef123xbm%9}H?3k2a=N;Skfi3l2mYzW_za7l8Yl~GlQ%0{a9nC>dsZ!4&W-8kTj zrq=K!R3J{p^8rXz;t*74P(Tly@;b}n7ZGJNxsgZoWtagY$pYhj--%M#7jn!93vno3 z$ElGNy=<4-P-j)mM_6xz-C7d6B`|+ke1=)5L-A0zkaaAH#4TguHOWopU0JxJXT$|F z#$s(zh;l`x!$G9|tS)DLO2+7DfUI$t&=j(sAh9BJ@fC}NB|*LpBA?n)il;KlM1};k z8X%7$nGV}+BVesDHwbQ_(vNIPy=E##^%080h$=N38^SRb!IYFr03T+PZ+xy`tnVzD<^JMJ+6(9;6v@fpY+ zVR{$8WgRVz%jHOmzk^vKE6)kPKM4UJOUf z7zXyn-s30^R`*htM=6MVC2&HTIbbRrtz0m?GXhGF5Uq|Q*gmSNiqDf1{!kNYyLEk0u?QwL>WmF9tO&r*~@Zwz%FGSio+L00S!aFvZV3*~(- z4B`yT5f}@yL2+^ZsD7%A= z1!0L;N5K2Bu>rIMOA7FSf>|9I!3L)+1S~X(`h=%}X(HGgej(cd7I=U%;SM-*LDP^( zZk2CLXMou?83qkXkU(w%woH=Z)*NCO!-H|i;8=`pxi1iIS!EyycK|3busa?+LWd$N zk~cb)06il{NNE<hLmjLD^MnVE{ zacN?OtUP=~QAX8htxV5o;wyEmz(N#3Zm(<4L`YT)%lTz)0*G8PuRxG+E=UCcRX201 zd_*GbE>5Khp_7ub{iT++o%@A=OS7+XhDmRB>bsTN0i$SnWfM#GV=+>Ra$HTcg&uE+ zz_97f_X@S<)Rl;ecz|pF0AUmb2T)F^flXSjV_7XV^9N=dZ}BKVEc!W&h@F@#97H4> z3;3TUx5O7#DzA{2I6+ReaTA3$RTR`zhK!ng%MvV8py>B2A#oE<<~v}xN^`A4Jt>$j zN^2Q_YPJTe^BSCD_Y2szZNkvb%isEQ1vA#6;SC>E z78tnp+LN`*^u#61%c*k}AE(TJg?(S4^soNSO@9sjZ|Fj2=zVeYPpwPH8AT)yb1W>D zWtKaqJDde!ncBAQP_#HrvaY3XQjJ2K+_c(q)Ul%&oQ*qS>tw>r!+@gFp#s@OaTthu zme2@zjvPEO-lDsMgXeJ9B6BkDXPJqJJjBg1VT@o#ej`QgvbO}KSi3ufayWd(XaKOd zBC`xEF<7n%0OA*=66lYG_A_$8O zK=S}Lbr7&_@!0MAlk2P<*x;11!%eBJ7OVr-)~cK zw8`@U5zKV+6!ihTVaF3#qYp${JE~@tb1ZBk(&pnW%W+L8i_Vu3YIjb5jWXS^(kl>nwuUA>&!|OsdspftG7$yWMH%}VayPN3cr{2^k39q z%a`;e%a8KU(!Q6E+r!o2(;?x8p(yY8hM+Hg_X#VB_ z;vn!C%sNWaYLQ{A$5GJ6bO&z`0d-Xz+o%<)m!QT&xT@7E!|K=R@RU=6}328U!CVA!#4w%ksO3uub$Hv#V&ua(FJCsWF3qZi^@?j zc4}m`3xEqdc2R86W1q5QHEcX@<|MPEsk;)IF_eYGnH)0supa1!102EpwaiLv~j3Fcb1 zL28&Sk@|1w{a@jK#~;GJrTr>*8@Kr%N9l=Q{BiVaJOpnF)kM?G0D~57w97!_*HK#J zxKBrsm@!R5P_Kkysw=YEhY&z48^pARoO$yvxZ1j9b-rA~?AVF{O^iY|WbrEm4;{-v za$FLMl@_Xml7vT%wWMwXIEZ5?8i%P-LVRI_ zj9$DWbry?GnC>>HiEGqiUzq7AKbXo@3_j%uR<0Zp$?YofjFC|TcvNi`>3)lefEZev zxLwke^D1i;c&%vwpEooEe8egX(J*hEv6CvgUlC;#9It-hDLKs7h#C=*nykg-)=`Ug zz9G~bs|7liYJdUJ5S9Y&QJp|Wu-_0QD;Z{qWP0%zCMethfF;+6Wa(hrD*KN>axcxw zgBNMz)UJeD;=(rw?9RlEO>XW%^$7&#)&rtr(#!hch3@;p8RV>jhKzf;LR*W@)~q!Lu2FsABUQR@f^% zdYm&YYz-xJ2XoBw#xS*SmUUprz*IDm0`})K0uEc^P%ja}7fhXzz%VyQOa($Yu41@t z)OeL%rEatwMO-zp3Y9ocE^KMoeXcy`(@)eSD{vqSb1p`61m6irn-NQ!3cD%qw zjmF&qV)bw|)-r0|p=7J|Jxzck#1qbkXPE50#Y6^y%vE@pYV%7`LLpUcW}uTQgU2iciZTWP(E;5| z-m*$&CYJamfKf_pwk*3@Y5-~jj%M>LovIy$g}p3ND>h;zrHVgjQ(PRX*ZCZ*s;fe{ zmt-&t!=uz*2%wzl$_*ee`OPF9i^g%f+hcGZh0-hj(?jVYw?q@8+0ILb$!EqGN5pRh`cM#R3 z4^hv3MTO@Rj1FRo2-_N!e$aCQBCZS=j?_?;6?t5-?P)lTl=3>1bxqV1R2jX-Wv+5U zsAi*)SnA*~id;Y)Hu{zd8fspLm3W=vvwTHRS5Od(gdQyWqMT@Cse{4#mDRIOA)3Pc z!9xTpKe5Q8xFQzS9-zQhDpMFOjJOKfd_nHkQsoRzGghJ((UM-y$adrxo+S{#rDZNI zWmZn}$pW|uA4W9>-jsNjyUUchSOrC|3^_150jNh%c|*ekH57$PeWKEbmhYd5R$AfA z5R@TsP}Q=g{OF7^L>uzv6arJ}%*;5p+s$zZAQxa?C>kRC(Zw!&gUF3(1S`8YPP4=clCBQnMLlPcRO~ z%sx7q#Xtv8RDh9bG)4l4zy{&w1(R2Z^}&BB6QHK(d136`#%ADJ$^c!Zz{Q(FQ&Avj zf|s}wqbyo$CSE1Jl`~NK)TvCSXa4|#&+(=o#D9f-S!?>R{xuJy^goULR(n9D=GI=b zm6XnMLEA(Yp!uk8<*4j*IlnWJ%wj$zzGNc01_sJ4uHu<4qR_#AX>T)3!)D$iSayL( z^o-7K994sGz__ZZX5{_K$!;!LRv+^kq@tjts=dmbxzw$TGfdSyuDgIL60^W@QMA)L zW5goF!u^o$)Jn;AGY1P`iLS#09pHH&ZP~-oDiVjuQzSXu%!*3m|E&xY*-fj}hE|hd*3QK)C^qz#o~JPP>s^sUV)yPD-7x?So2F3`sIM0gsIzqHB7&q^C?L;-HJmfjU=c81 z7c>dN0dsQ9Q%{Ne#6rBwp&ag3s^tiCExxcBD_esEHEbXIE_oJV(V4jEU3PhhJaa88 z1urndvW3yiO*hfw{{Ug#tIKm-*jLE{%Wl=wpvv1~Ng6d7f`ky~Fl-Az63BKlcpZCV zt3g52ag;Qz%Vr^Pk`%+5CL~tSW}U{{X#9DAW+c7?sGtbQJ3C;kS!sPFa~V^fqE3pc zysqLK!TW|!VF%@YVnG9C-0Z$e{6Z`X00;);2P#Q%VQR|TIe;S_=Jf(ng>VxOUJ;c* zf#X2=nvei|DDxg!zuw(UT;#5%C2R-g8ag=t04DcAaL~Vqs;aBCcCo+Va7;#6Y8wOQ z3D!zJSzT~c%6vHU7X=av0bU@mt?;cxOot|-nFvE?7DN+YO??mkDrH7-{DLvx^1r4g zAsxr~-|+=p7>WuxIh1WdbhlWJ2Yf`nKx53n+W8>?Xx2%TYc(GHkqW6R#$r~?qe$$b zJi;Cr@D}>wW?CuuLaRj;iG)Oea(IVI+ryZ#Y`ws26~fK52VBi!ElRMoU?4#|%t4CY zT$Y(;a8YvHMmkH+fQ{CiZu)^rql$&bw$yYuFhG&N;7TCa9E`}9_BSiDPVNhQYL61?BEq@xy0IgkXtvsJby5$9zg)KRwL9E6wn~A548O=x!V$*ddI} zK(%>{qAXTAxy^&OWoAETybOKy5oxYXvVm>Vh(Bluf^gfe2Bi#bP_z&u8aMM6SeeJT zDG(ME`X5vO0GTQJbM$vF6L9(;L+WNb`X9=r{Q{&89mEVRW7NoR66!qa<4hIF61HNW zQFRcUF0LkK#ualAfwKV!^tgg>W@iPIW%dl$GUs6fGbuHRV`lF>%K$jsps4hX0?_Y? z*+}^qGi%Nz!w_O*b6WlX^W**5Y# z#RyF%GBK+KhGE9Gal!q|K!_N#%)6tEyXqz&0qC_VksA9pp; zZdJ{Ud*zCxm8#wX2Ddn&u3li3)h8wXh^sIOEIc@zs8oL_tF21V!X2_zw-7L~%2RJ7 z3$&vvm4HeqsD225_b$mCuoWMJ$u!?l4D7EsGcKjsMsfW`LdLauxlG3e(0)YPF2Q@gMyXsfy<)r^`5 zou|5&49+x-Tv|1b6iWy=nz-Bz8Wr;u@SA1IBPzLhmg&3HcdRj0WJVb*?Tmb`v8eJE z4wLvdf5!g+fPFRmSnuh?ezo;r%*&6|*VX!gz)+?C08x27u3eWQ`GPFWHN*W70{f9U zAe6Q(ZcrlyP?k7_lBUhX_QYIsj$mCaZ&6h>i-mP@n3%=fs7hh$`S1r z2CCBn42~jWT$V)&##F2$d4Z}8#b`qrBcNACBW>aXg?X6+w-J|ttTLo5%;MJSWCZw@ z!BLK1m;r8#gtR6+poEBE1MjIyOQDCa_?Ur$50P<=Xw+*w)NJjS;D8{beP#n&EDr}W z0_e8ZSDAF8*h_>96~q3 zH(bZL8d=fH0S0#0nP^51JjK8uXl+;zGO#VMbar17tk^-uGxy?MZy(ta_$o-RZRV3 z0prX|KtQJ^DqXLahP*&aDGfmt8#Ben9aYiE{V^5@3B@I&V~aBg1@x!pE>OM+PYGEp zb3eEmU4qeavX)TzjK&-n`j2&2cgzsI@0B+({7>S;kLAqfG5#;|ui?MrUqA-;Cx0Rj zm@UouoDN)J>=+%w&~h+NR0?@xK)Oj3d_>Y{i-FDh+!kR3#!ge>IrA}db*WB}y{WxIq%P+tDH5X>r53Xh zd{ZbZD(~DFOInF9u$9=VG{j^afm!ng0Sf>ZfS3DWa=Xe#nPp47EAudHs>RNKxn4ji z%@y1L0xFk4ZVtvLR=D9+Md!Id!tIs3MT`cQ)CIN48Y;BEQ7D*8xFDQEnZQxPH>mb15nX?j*K9%9e#3j6gxq9%h1@{pMv#>xd~X>pAlU zo~Vaa2EkR#2C1}xnx%2#CEMFI_L>!XIT}FHa>dG^W5nhTy1}L^yhbVuYvoylyS$~p z5x@e<;kJ%8*#t`3r^@d?GrbC;Rg!kNB%1+*NL&DC7zP;)sqoaQ zhfLUThFFD;VYDX$lk)`9(z+03Pb+o$lu<(8n551%eabSU}HdfABT* zeuzr~w;Oe5Rm36zcr^ejGg^$@z_Fb%%(l^o2iyTQkPw|YW};Y^QqJ;LV!{nJ-sP)u zGH_}$Y62o`wy=R>3%((SkCF|m-DQhI9YKUM+7XslMFw1>jb z1?hSCmm)7DwQJ1J+UNrdf!SCcJg|I$Tc~lE$5xd808uy~5vqP7B+%%1nijqe-~dG! z<`}DfRyfw&F^QjS$j#5a0&mPOY?=`JL?9kN$%Hs*(NJOz#m}M}4HPeMoT3&rx|YKn zmD~xGC#%IlW~s^#Xwx4Oyp?jM%ZxnDVlExi<`7jYQAx1b!d_~Nb5Z6}w<;A^T#@OW z7pQ`zHbZ$dS?!lqw`6Wfr?fhehW`Mh#p6JI@2T{}exdZgrA|Ja{TY%mn@&EJ^ylcm zQ2tn%{w0N*r4r4IEm09i3-Ku{E;Plmu2chtV3Tg5wvnu%1}eCgtPn2}`+!ig%!7xe zo2=H7Gz^u937bR-DAR%vQk%#Az~FLuhvKy@9PqGj)NVNwOmeLrkk2tgF5aMFV)Zl5Qd53hnh0niz{h)}dX* zlJ{IgvQzUfQkL7n%9)omrR^w(dNwz<5myUS2HQsA;Hdn>R?-YQ4BK%Or7dOX zW#|Cp;wAyQWAcDw3VvW^j1?SsfI24$N*$)no5#ec0;}K)-QRLtO(U{ zUZ4pUr52Ur)aO)VBD+?Ck9f+Kgvsp=wKGCXj{w2kxA;ME8`(NtrvO=UzPw9?5O6Oc6z0_)6ByVwTv<_n6wQNfO} zHlC}P0#?`U0+G%ZG~m-sUGC!mpp`O*P!!X-CR>$J8k(hZEMZz!x|iC=W#i0HFPh0$ z(E}$!oZaX?(uM^AcIt0*gnOxVTQa%|;yo4>jy+2(+OJqG@4T3S z1L*$%4E+z|UrpisPv8+gyiENrW9w43T?&^CD0~rwOa(+gM6<4GfJsjNA_ZwXy~}|@ zKm0--h%OkY8H+uuh;8h<%YI=~&}SUSP&LFDy1UdZF}?@`T^okOG!&FQB{P%*n1BT` zOLQKhC<6JJR8yCz=?4a0xGu4;GXasGGbl54GO$;7D3-ItGC`0S z=iD=ZlrDo3+Jk~=pj```!3#7v>c|R`;CagF4j=r63#b;F$8ksjO8oOGsH+OG%T)Dh|rG*uTr6CqScEtE5GCp zKTyV$a~AFMD}V+oaM+z6yll-*Y^iL<4SIOZp(aNvNY zpc}kQ%%!%x!=h*c>~(OIW>ifpz)F;<%JKgI2~R4qi*2|QvU7?ylwx3A@0J)RM zz^jt3weu-$WPjpTPM@Ox0I7zc^jG^4jgeZwJjZMo1l7Ofs<^xFxQr#q;`Q?$AYKaK zhd|XYxWhq%(H4ZgYU~+NRbpFfag$5h4S4k$wJe4g62h6Ou9%h)dTok`0x8E6G*gzN zW^ zMr{3E&OV%dOaB1jQ;FBsv)Ouy)mY5g1yQJeVJuGW7MfmW2CqMf$%cd_1^dd((m*4s zl?rx?K}3}eg0m6T(+~;<4>HN(s1`s4ZoOFl;#DD^CzrcV5UdEzK%0m?ng9gqcl?1hplip3k13pCK!?qUIoR(}zK*A6NI)T(M( zZSd=e0tzr3Hvz7zs$Cu>v7t^?8%BlSxj{i@;$*SPHO#6kC|J+7B}EDc_Y@m9xkkXE z83rdrskkyNNnAout(4L`W!T*e-Bw!gK|tBV)j|N*4>K$VM|kF5Vu2TH%&}I3C2OeS zbQXMfD9V-={{XPpz+J;!e8QA)>F~>NBEDi`%gQUoy>Sg{@s8teoboU@w{EzMiBqzk z<*QVy3Sm{4JaGU_GoVJk2uvIPY}xY=K}gbcpGy8rsb9wsl{ot1Gk>OjmpPt4g?~KC zmGvWM5~#XyC<_rpF?f{~oWvH6Me{YNDxI-BC?Q}?PS96i1*<6FBq_7GSVEMP;?sx` z$;_g)s!AY(p>LVRriuyixMDUkfPay zDugg|Kiqa#s0nGP(_NU3EkMRtg}E6}x>}5xhG1s~(9Hd+cfCt9P1CcOSy8?wD>$iq zE2^5rEwQtnFNjoB@8(rN-C51T3qn(zH3NVcaRclI;kwZ-HeWcYSr9G7xCrv%fFM~w zG~O}HUZr5IAL?OcVJy%)nxKesi@JvGvPS*<;tY#7p&+CRHm?5w6173ug9P1{r%9+V z7TlD$ge00#t9S7hrFs|3FzN?MwKPhg)=TPI!Lx5Mv?*e)CDCM}JVa@_D*pgc1mq#T z{6aLmaFhb1dEjE364XM0hgLkya4Fw#8Jl4tDQ+(kgqrZUS75WC#1gG`)THu;xdYPHp|(5+=z zYh1Bh3vE`uWji{&uzQw{FKeh2a&^>bS)iv$%*t6vdOMZ%8mk5M{mSQ(&gsGUAqhw~ zqRv!v5*Ta|J{eIZ68`{~6TkjU+xQ=krNY0Te^dC2Bm`Qck5B}4s5jO@p;~b*Nqx3DON-@Tzwo%mQbkuKp9ix7(l}*!+MQiPCjE= zwKEPbZfz9|4T$8I#MTZWBI+r-QJCfxYYwKPEhS0X5KpK}Mzj zB9-NfzPOjAtuviO3Y2YXvWNgGXW|eP4i|G&)u24GlB5og2o_!d+VFfwXk?bu#y(=N z_5<{M#8<+xr`DbqAHLeRTr}vCX$0# zAQx{m`|2A6xu)v>0Jt5aE44PU0TgIW{^E!WSaESwHZtonz}a7lmEbvBEh;TySSh@* z!*Z(_#CQXWA8?JT482YfU@6DiGQ3uUkc(2}>RCyEbGnCZU@!wP6Vg*R0kTtXDffIjkq(YOh^UEfpU+DG4CTKZShm`;C z+(QN2dBhG$Vxri+olA@@>(>OZwMe(BmI*8Q<%3+fR`^xAhgQuNb$r6QW>CwUsB2ct zj>2U5gc(r9dV^)l*-qk_7gps)X1H3@%}SUq9N!+Hr)n5$%ZQo1wHa*Y69T&X%Dy1I zI0dKw0H{;#QwqFZrCoL+X*cRxOtkqrsIMaKcwY6o%(}-*Ucxw5+ZDTvi9-D)MS_9x zDJ&Bh-OTtO!78+DbuR)Q5A_2;-O^{grXvnkn(k3;MYVo8fY1@Uxppm;gLN+#gC66J z$4WBea1zPpq5}*-2z8N{jGe%sELa>46OoBLi1eBi)%8-cPhMLRspp3z|6)m4pl$MhlcgyBenQBmP8Dd zugntI9hmd}r9NhB_%-}rsr9M6ude?9m3<18FZjPg9lbU|)`e^}#Vk%%3Wnm@iCu|S zMpOe4I2{Gc4N6oSj$DWL0`iaC8M5liCE3rfFa)$}t~-Z4Aqt|3U==HZRn?>}<*>2T zNclX%A!=$J4uHFudQ7An;~-tWVOwJ6FLI6XE{AYp0TKt_xSbJJd5Wgq9!T6Al~M5l zF*0gb_f4Ej1q2^^iP?mz+$&{QF_`q;Wo=s-NI8RnLFQ;9CHjLJ1>y%Dwa55V*x;R_nbulHM+TMI_-U`0wCEk)U{EK=PBml(Uy$La{NLW!}CXQ zK!zBEQYoa!>RnBpn$wTmxZ4BBN|K6Xm`OZ}q+h|r-Db&oBa}UJ4VJ*jA|_i(77YrS*P?k)V|_h;=-)$-Q_vefG=qTc+%tI*RqSUw_*xN6EejYwX@O)SHRS_~L)IlM&8 z6$5x;5g;1m1Plyw6HjCZT`c8wDKA5lcJpy4TK1oC)GskI1~CHnFC#3>>{1>~%xe~t zVZ^I6vexwurwS!G#Xy!02*p5zDroZ`fCOt1jMNucgxEns@tww-WMdaZ6hVbwGR3W1 z<%prS(z}W=p=;XMT2;M&$xayH<|Y&VZZzOhpVYeLV%Ir2mUJbvY31mMgUz4V)GAc5 zXnBK!cdlh9BAnzF{e;75CRH->0DQG;3>0)1?Mt~gK56mO58OrCPpey5L|_@_&OaP zSosaNSATxrEYmSwBe14c29FsZzP@0Z8K-yU*Tf`7&Rh9%v0>OS{{UEiYf6vB%0CB$ z*Q2D&1qIo^0eWMJav_m8{u%xwGQaq9{7?P~Dr*nSA~8$5mZ3jkCJf#&G6=|u42;ug zRw8STHx2ITB_ip7mh9A2Rd|=xcd}A-ju;Q`5!nX8q|!_9DpC8EleO2l(nsEnZ+! z;uk{TL2kLN5ZFL~)>`(!Tu>-DtNTrZ490Em%N>B%XH}w9DzMv#Bo~0sm(;)ts5|c-B?&~E-W#R!6Lvtc z>Q~F04}?TV1$j>3Oq<1W_>_j|JP3d?5E`w*Svio? zk?L_UWE$Ncqs)InvFY;L<&Tyx0UdiC^Do*c)tMhBh_-6(_m`u#5_LMLK3yK5DJtYz zeVJwPSBj(XK+r(FR{hFK1n~gL4h6^9jp&Wc7cv5?o+c^ni=Mxvsb5}ZevIG$0ENr` z75w}91)fy<%yRA^e+9+>yTrR)VqyxW7j&7xj6hJz5Vx4crML-Z;OAEjD)%W6vZqLU zSg0+JQx`|L7#oGy1ysG7uAl|coACohr$fUL!yLh=-f@MEP_8Dlmb^xlqOcOY9h!5v z2u(FEH*A?k9Fai{)H>@6eN50|LCNMNTr0RnF=g1TFPL$p;CPrW4AMCw*;(Qs1zILxki5?p9IlroB{TnMD03ar6c@NhWy7W&BO$`CU{ z0CPimfJ*>zR+(^CX37A4$oZ!WXs~U`jNT>4GPW7LeqrHE zwP-gQR5?vF=iSO)gyVW&%&c*1>WCI%d1U9}8yKCMa+NHw6_b6%BDlJ6yk=aW%Krc} zLB!i$$TwqcU;T5=hL%HqrU_N2v$j7E_keJDmH`8i-!UQ_ZF#6^mXEm90$Sy|cq3Xm zH_vevmLpys<-mt;saerVGR2M-++kROgF7K8-F^1})6BZT=i&>yT6^vVu}YGTAy@;> zv)KctFe{MiB<4-^0%B}OWEBRALU$&Ph|~mL&CAh%H?#2@ENnZBGTQSTjKj$moErP) z0kN|l;MIhGeqw3U+zg`_d-V>^^87Jry-LnC4_0sW3qUDXmBf9fe*KcP7#b7g;5m*N zzAc(@;5dWQ+8O|~Kufr zlgv7URWRH>>}dA}#kLLusH}}d3YI3}p#ql9d;M z9R;TubM9nEfxPz-)3|p68iii>aITxM8_ma*9z$_*;aj~q^&N=cMLQxGJB?eBd4*wK zqU~~eAWYCvc6yXFM)9ROiu4Qr0McRsvlpE}XGn8zQmIR{4F@*E3=a;*Wf7&N;oe|V zN*QM^f&jauybn^;1r@@NGXy!5WqOHPfsbbrf<-Vcu3;Ex8zX=dw-EyOM5Odn{lyAd ze3Jp-Z>hkY&Yi$yVFRemoKut{`w>c_wG>npV`G9GA_}72_Yo>LZR4oBBv|6Qh_Z?U zR}c$rgL{Bx>l=ezA#i~>NUK3o^$H8;{&N{+Z@5a<@_n@a;UI21U+0)2bC`aFLInee zb#~hIrVu>Evr_@*n1qK}#o0NCIrRrK#JuIAFLdT?2*#`d-}rYDnUG`%a90FlY6Kg` zD*@^$BS@e-ctfdE^HJc?{6{2~JeWt`P>m}UeC0P28ZA|TTJS$`T|tftAUa5mRVwWx z5sCu6cPQvJ&1yIU?Z?Xk4K0Ti5E#bm&aoAG8r%a_K$n5$DZ-2g4iWvpPE$2o7wr0< zz~}2#;$ji{SMc}r1`6ci7l&9mmr)Ecxps&pT@wMv6Ov z0PL(>2q8tr##M}BJhMv!XPHGyy`*Fcw5}P9DGIo0Roms_Tp# zcQwF6(`W;mo1CEowkOJRxma{7V-6~!wQB4*9}%L93jtQ zU@s-XVYL9uQam_-N|e)MrUJAQ*h;>9`j`MNwEIf^-a)1?_Om}qERLM9vIGGUTBC#n8xV6v1#Q1s9HG1<6tG@^QErv-BgY%A`T#j^#0#p$Og%2SUTgdn$o$h=M* zq_%ru^8?dGZAU6%os=9eB>9U#NL*ge{FjCz&F$JAW%?UEI3E(#6qH{)OmYy7slhFk zh1JBmKx(E9+4nO!U_6H;yd^dtVM0cEM&CA@4X6QC#gvy#TVH!yRxgt62PS| z!p>LwAt#mvpdd%Bg|$10+kgohSL={2+6P-v&$Wt#&uvO zer6e*jjxCrprWy66=I3?x-ZJc1`WJ?B~TYQk~jCnsY`>mvCH_E1)Gpt8SW;5xHdAN zFnGg{^f;ETE*V6#a`Dm~u zR@#D{N z4cw%ZinWHN0_qqrn5Li@R-qG0-($SW$!2%}xv6qCE>6e<4uvUd7FBC3IFG~=e-(Yk zv0!j=M7Nj}&8GfifKUfFHxS)j<;*L9mDSLpp~9u{%qAMtuA6BCoJ3azRHO>QFD(l> zu}-{_r*9TyFa`>11CCwIfpjN%naY<-Nzd7W-~m?)c=HzA;al8O0|JXy4d!yVt~Ho# zAg-+GU@aEQ;j7$pdCz1FZAn>-6>BzMP-86xJx5r@EqjZu4b zpCD@8r#~>hJjIke{L7yvIX)*yINLgzJ0V80<&~;3vEk2%xT=($4IYkWgv<&cu^#0w zF}+|o1Liojd?p`#FvM);{9(;e33NC^nwz&APrNKxfAgS}eTnfvthTxocUF;msi5m_-5#XnpYr30YG~ z+Ww&z_1o(I02}`R;%n%AZVw2xUTBM8jbaPStV5n$6C0zRB_tFUO3jhsWKQR+8nT@^KogX7ugCU zp61pix7J&9VTKM6mm~iGW@&IT&?>r_7>-ql4HB>fF#!#p>QpSA27xmpEZI|ZO9a^2 zisL`18rm@JIoF8k#7iK+E`s@}7jEKrZ4AAA`lXo<)H5or7`+39xm~uiF zy0Ly;#DHF18nV32FI7=c8q8>7x>PN-_=%aY&8G*Lrq~zDxIO@&3IOUUaQ7D6LBSj7 zG9{4)MEpH5_=v2mBnFn4f7mW}jz{5fFJi3OuT*gbx6I9Zd6x2n+&TG|ildvjjs;uq zDHiCuKGKTJg(EADnuZ9@13r7oIRZmR)8%~Z&xM~LJG;3J4GZXp%E$z*kjML<9R$+$*nbDh-4GgJg( z#Sd{78%xc;V({e-^(m>ZGK$)*K};3HAiO^@k2y_4fi8$t$QB2l<;f$3BBF)7Cz4n` zg0Pd4@=BG}SmHlm9zkPBBMM6^FoXe%=2|cvFjW|++r3@!D7E8oej_|x|ZFj{{UsRvfPJIz>iY`8$CqYmxFIFFmj0ZMVKH`+G`B3!NO!#yz(W%U)W+3 zV5a;DeTLNq+gORSXio8*!la1jN_h2BgmDybM~0;v!BNTycwA8o30Y^L!Sbn4a90+& zsydI=dukv?^uLYE!gCM#h*KHvIj{CIHJEC!e^S7@z_<~WS~2#9Us{3XiFM(0ta)Cg z7K&b0nVD)8732j6ieJGq_MscP4g5fKux-VejXS+2s~j?vGJ`kD6co?^2XzTF29;I6 ziC$t=OoOX}Kjk;lZz!wA z8sUu!A=o$STnvIEPbbe6+!LCh&krYZlsOr#W&%_NIKY~NY^|(EIicLh5IWpygmEu- zHx2{HbN0-8`Tm%iK3~*I7tZG4qtD4*^nTp39 zO0-ZZhQDcLIBGRbKBE3jTz0&Yf+`2}V4jFuFY}2_<{SF){{Y36{5kqp@fJOpgt}tL zvGaYxTk!$C6<-hlTQf50&Qkibl&uGsOCABsvv7H_#I`ctRs#WvYpVH~EMrEdnt?_= z%e58j2F=BWnll!*4YHma08wH$K47y@H>Bos4+D^VLjm(Cd_@}Ps%RD@zQFM=%ok)VD&Wha z92}A3ihf`$Aa42fEdsK*;tj$a@g`hD2mzC&in7&IRy|IN)GJ(qC@2f$kd-a6KFL5nNSe27bS8)FOA-N)d(^ygo=xl2OJKuX zF>PSCwYz>J>4jVaqw^eKu%;ctGNAD2t9mXc3ob(#a5v)O4cV3ZL8Z>On(kJp$O+?6 zvh9R(nEi_fx6j%rw`U-}A=>fBmQf0p!Qv)(6pNK82orX)%Pr?J+UE&`b@Lpi;2EPQ z#I1mKanOUXsZHfAYs^Co16yF?CGPDW^L;Q7LCzU#-1{((4kimS(sc{W)%~D@PURyn zm{#)*)S-`{#kfo%6Czv~I-jHO<~GeiD0Oa0(!@FsBe*1$dY{;0nP5oh1(*}BFaY1_ zfFp|W`k0F;BN|{}Xgsu8hteplhbL((+ztCBan8O>kZ$~!{=O&ILQ-j3Ve!bJ z&y&=|;%zyENpnBVAEiwH01C&}!8*+CXs9$2tkeZwoJ#}Lt!cy}{18rT?1H>(%)F9L zF{t1inCUWV=QB&R^${6)h3GG+o;SoPq{+B4ETy5ERz9N_g&e@6e=+XwAcVEbt%q^w zseclK>9$h^TP`#!UL$0=NbL;QI*0`U&37@dTEOOVH@3N$S)QO!y5i!^P~Q8DB32@@ zndS_%w~2a{butjeYEqGu0L(EQ%SD0`y17!s>Ps<+NOK6E3bOLL>=Pc4HN`PNv@Y)v z8ZhCHXu)3uG;G{sl&e9ZzTp|h*5)qTXy+Mg#86cZg74xp@EGQs%tSVb8-Z3}8_QCy z7C1S#b9N3+1S;FHvlmd(-(WAF#9DDPZaAh~sJ=V-fNn{n1#->g4Jro;U{+Kw`-58r zvp1yVsE9D$WAjBFh0m#^D2u8^WXTc&Dy%mzE>=2>fM7d&hvb%7#l^>21-|2WNkgj5 zT&NbR>e|es@C$C8Kyar8Gl(ngX|3?6p;c!2VYh;o&KH=hDr@rrMQRGcfivP^ooZoD zaz{4q0aqEOAqdBAAaFt)7~+&i1vpX_Kmd4C5#5!umr#PuClFF9-w!cL8|EF9DBfdL zifIvl?oE8ga_iuT>z#a>i&;3s)46zjexaA)zrGkmcSZZ#?*bE!zW)I6E^RVAng0N1 zSvfsv{6Nj)@=ag6A|8VIX##ou!z2n7#tzu~yqKk5v42s$SFlyf$#m6wi3_1lU+xCN z7A+#_%+C=T;Gh@XGV&bW2Wfk$WVeM^S2y;JqymO5T0Uii3KsVeYFX$v_nA!No5%Dq z2`dD8f3h`Ym2V^_{{X`h=02DFulRHHzootmya~aW7%+huWb;rh7U~jS+K7g*s)~)b zZQQb$3{>DSajYeHiX5zLlyoi&dF2Wyr}~2(#=4I7;&3LEndTNi@Jbp~;X@jk=b2@( zy=EnXl*BGk_fC9c1)*}xdD!8J4LXWzc+nF$Wr-82g zM1PTR2Bggzea4~`i%9Sy_)&mUAaV3wTyq17C~=8Ueq${->QM4oj#>Wzh|#@sFsUs$+qRb21Aa;X^TM=Bip0F|QM1u(ZX8)KCuFg625Urc~tN znBDKx$z8J(pyVZtRy&6#eMXx3iV2X7hE!kGa>*R`I-T;2fVw0jibZQQ5Y0u zU`-b|+#1W$#(R|QYy^1)4^WPUg?=5TP%u-rxAsIO&@#F!5!Qn5Zkc2VZtJRnzo~y2 zFT@$3P{p@B5WRR-0+p#`u((YkXpaO-cn$o<_0mekV%8q`0^qFsEmR>G2zOMlodX@&!)4Fk2xz-l6wh#`53 zPt3g?1GRA+S4jy$_IO|}xk1!JO~+tN8DhoCO0}e$Zb)8lf8-1W&3B-R0ZL(dnC0;k zUt}AjS2I5mYaC63GJ&{OPZ;wZ_~r+UFe>H(9!RT<#^MN$M<~k%RUbm%m=b_T`!x-ZWiXP{kI{pV1o<+4CDk}n*@yaO3bQ<`XZAqqOZ*?X4~}QqxGtBc{uyfH zJMcevTKO|^7{GlH#tLw|bvMP`MGR}-W-%&2jt15){N^TyDOqk^Md%d^D*mN`Umd+4 z>H*~nw*0GbCC#Ml`s!(lx~tV+fp+%+r)9%Z({20J$| zRv0Rs^$O+OJ2NlBJVay41CDAga&MS{2m_KdQ05jZ5p9jYpm2;$u&yRT_cFZh6)HMe z2K+>8vI1b#2GM{PVa1HEMy@H1#;;IqJAy$#@ex=ZL$#E16BnN911Suc$=Kz0XC9o& zkfp{cuWO1I09OFvQrs+VT9Y{Fl`3MhR2jsrVga@Ij!j%w8RiiNz#b~=+y;QnmbhW+ z<=7e`7B_Q(ac(s&IMwCU>ZOpXdDljc!;l`zSr4PeT<~()%Ge0lvoB1q*Ywmw? z!?K28LvSyre~Gi`e#7_u%D1FZ>yNVrH6^n3X=Ms=CVsHUe+<8$=l}oZ_kfT`BPq^VU#bFK? zp`?^VSbF~eVyD66;D2(uxJ}_)dSzQKurD86fAJZ!{{W7cjBq8?ELS&pf+%VjE>WAA ziN+9UtPY|OViGJvRt-ctE$%3Mb13p=64>UBPT*D}+(0iiDCS_t!VJ9J2wYs?Y1|zy zWtNmWfq{NtrEUn3W30?q@ECy5=ZGOdzYHe?{Ne+H6rqkW3LDfC@iMniRWXN2J2b#^ zF0I56t-`)#i#eTU(ylmBB`Y1YPg3DE`zUa|^%-F;jRNAWp|7^uV2g?%dt%tyH0J4f zf_#9tMgIV(k$ZjRIz7c5s4d#zA4GH_fVEo5%~i^?mqyy4se-gG0?CeS7JLuX#(?a6 z^93RWK0MA`;ce1tEeKxT>%?>@s#X9^rjV=kGXRDNIRJ-+n~0CdCzw#!`<55bJk1JO zx0WQ{XRJ(>8&&X-=3B{kT46{~rDopzMp96|HvtfFQ?t)8;Xn&5%oql!!%lp{<7k(# z4sHbrvjIls{;Pu~3`&uT2XS9RfSOs)Q#2FknV?w#Ti8(xe*a#}7F_+x)R*)FxiXQn!Qe^DJqrIb*Eo{SZkSnG10ZvvNWjY#V0=c+L9>Y*n~Yj#Rpp zC4Z410NMKb-ae=BXoyw50==X$t1v)D7H|>_ZdV>5 zy+>h~uSl!JT@?IJ5{a2qbtt&uiAB?WOu^g-QvJ#U@f67g?GoZpP9iEWULivyHNrua zV5hh&LY!x4@YF@xirx+^f*Qq}tUv&=!8++s`9#VXKkP}6HEPzk4Oh)mfL2M08&(u0 zTk0k&1R1n|L8cUT96(k%R|+^|Qxvg{OGq1`sZdqJEzt$$)t@V&`K&vTkGFP}l6r+}QdzELI zOi|I|7a6B#T4k~*b$~Z?>br_pU>WFFa+W2c+>M&|8PHg@QC+WbEH;ZeM(bIwvf>Iw zQ}DdAF14V&7z3ZFtm>{302Y;-%|^`SoYI%~9>I#aCIw2I>I1kx8iC;V>)c={hMED< z3Tt+A+zcWLP)ftTV#Nu-EztXeC|x0T_P?SkrA$+1N5#|%Luj!+Bk}Gt!w?AAqSOBX zPPrwEf`tzXC*}{e2I?+C?7@AoyxaL#Z@DYmkk8Ne4G)9#!xelq%g0!M?^23rKXyn? zAT{s*01*@Co}c|EVhZ{H0BU(9Q}0j(r%6xDR*%q93qi9+-!KZ!hljagK;-@3+8cJ* zEN#rRrfGC}4|1J01m#0DUBkD=fKqUMp(JFsYL!>>7Ujq%E6~6IfM8Z9aVrYzBBUb8sPO~jU zpx*>2&ZXHgA;#lc+F#QSptQ3U3M#h4`x2OM9ZOaTtUSOpn2y-yAyp_$?p1Y|ZpJx; z@({D!O70fZ6B3VxIp2tb65gWQr~$tcmxwIJ?$Z*l5TaLbEyk;HVp@@Gl<@@enI%M0 zB+Ly|Ygg3E3_Xi+h?bY;0Vr)&&HT3sGz%B!AKV8>Hz20vIugLx99Kl6r0^@mNYqPI zz`6xdvzbLKieElrLunXkS<1@}?wGhtw0DR_6x9tM^8l^`OUm&X2LNR`@eN`GR94@H zEFdcIdzAq?4f=-m2ph+<)T``YN?@U&x{iF`sP+bLcEYO9ZX#XUwwXRB`siiGy1rfxN`Bw^&830_X%at=N52%pado{&B3**GZc7YGX>L!DK7EBOaCjS6(Eiqd~ ze-iO=-Cx=x$n}EW}OZu?-KSsW{^**;29_biB0aFF;gK;h{Izm=7!$sXU zGmV!KR)Jjkgp5>A2}ptZ92@fjl*k5Oeb7V&9unnC1ljv$If)1I!V zffZeN;nW-k*N%v^jEA$%zE+|D(lQ40R#3-8R9=1fE4BsS-VrCsHD&c2I+)I zL{lrW_?N)qz9E1hlyT*oCk1n5WQc7GI(Px|F_N_f+d}zfU&=*an2kz6VI-KsCj%YRheQN)lNQ0n*W^b9HdfvI++zD9GLTiEf}8SAu8|M#|P@=$dM&01=_4 z4j=H#%Tq(dQn4J#3I#OGdubrr8vdnmYkd4hJ9dZsJjUPx*_OFXHpFC09}n%763g2E z0OT46Qz|b9#1=qqo=cf3n#}l1M7SnfSU%Z;T#B3x0qy0EvSV~MHnN!30{;$xxyG*&#RmW!`-}*;ho?6EN^$^z@_;NbnLc9h)WXE(Kw*1Eg z<+J06<2rx0_CY_e_}Tbn)9nJy1?`>oyM&0g!uR%yakPKeEI>B-6R$8|xIxK``;d16 z>pE_(Jbt0Ut*3I=8s&pCg?^(Vx!A)3bIPzVS5#y$0mCLuR2oB9FEH_Zcz9tVK2SNF z3ydlOsG-0A0F4P+0dPS|NW^Lo#pG;?uCHj?Ch3m=>NPyT`wkLI2wNfx56nSL zEK?BH^LHPKf|$%o?7FmZ{{WCpFbUl$tnvAl`i-ZUz)@`$@qw--_ECK*s=0p%mYeAI z%*6ty4b2f0=~wj)$siVd2%6b%$D`D-%z$Oa2x-WwtpYS0O`I0hXs^Ubd?!~#qDl(3 zEL}uwunWnUURY+h*AdVOu(8^^ic5eW1YUIm;R?Bn*Cpa`Tuu?8m^`l#H!3#x`DR9w zy7$o=wXLJ(dwj4UcNQN`e^Kf~SGfCSwAav~q2}fd0Bqtm;BSO4lDcIIpj6_5Hy5$W zC>O!p9K|`9uDFjZEATPC82ijb8ins<1+&#kgJLh3WYY@1<*if?10(l=wHS};V_s|F z$rHX@J)4d$xXI~*kvM z2`Q>m#u#gFR_5ZLD6TzTZA5gcgO~P96D-j}y-l7O8&R9>5^|s9)s9wfp8lo(03trW zhCZJ%{*<34HLrpoEbW9@Yp7ryF*Ro5)dN)&(Ps10`l?Utl|GXoMn zT419171SXBC~v8p4+501{g~Ddr~3TM zRrUV>=!Fl19}MpG_teO}Ke*}!P+!Rc1BSl;0Pz*cgGZA!`-1+huS~U#{{UoUCaMOY zoiWs^EPSupWn)l)=*;ZGwf_K{hvFA635TyFr)zrv;!-TItHz>-PJ4(>5WwUMVF)Y@ zmR+oR6&ZBNgi=8o0BL~=<<(U8iK8$xmm0ruVu~k*1e7DDzLoqBr&F27(xLoWGAEYC z0bH7v?qB2phccHuTuTmctY8~L<^4utvoCiDE;-BrCeid^l}9*@UedsvL%pQn{nF{W zy+lOjAmrvLc6zCmGLQj_%mA0E&U%gU8nM*2gcca8P?(xQqElPA)3&FyUvN0gd#SPR zB{s9PThwc7fJPFrsF#RPM%9D~x=^v??gVB0HJtwdb4Sc~1VyuEsMj)oarLNNBW(kDPj!wi1Y@TMa}804><_0mSX|D}b3Wk;j6}JJqFOc`J;yMz+2->Tq7s+!+Z^8t!B=h>hCJAGTij5JCki!C(_$VAd5zld_Q9$EYEQAYPH~i^I_5EGMq%NW`){AMY`stp&J9fnZeEFY<-)9Z%5qX{%i1(gCFp9 z4VTUzaa)ti=O4Luzu*`u9R4PEk`M6!d3in@pN2iBIsTZ=U?08**@$#DM+2zJl>Oxl zyTi!^>L|F)`6@RstGETue8WzM0=pq$PBOU1t#I&l1YM zVTVfO!xjfHC|Z_aHkDeJc7m)-$7Qn$rN9EYiNIpk*qWDpLcmkpy1V2dtrM{;>gJ0aYfZ19&z93LiFm+WPc2g!sG4Vx!*IJDh(WIlrhf`pS zHNgY~%C_z@kVRtLuvk|8!L?!~j~I_Ca&L;5iySXU7c!Mn)}u65G}Y=DfD3M)?qLba zuk8k`R2r~0E-}eXtrf~2Fa-ekAKF#=1Qdqv;w;^!pkB#9{LD?28iit+nkXBsz^-_S!eQ$T zaK-Bl<_BY(%L8uVRiU0|L*fH$%TtKn&T|01Nm|Cam3B&v+b+Qv?j_9#vE`K$V3mmF zgw^nnvGPlxrtYTxCl{8TaHOYoicdh z5o+N(4V4Dqu%|FVfH8<-=7j6SGN1vax-%d`U7em~sti~}qPE5nWAZiVmbjH+fID0gquXAVxc>lSDq@4o zO_#M@2N8-SLEW23loY`7n6I=m6$n{RM=NV6c6%x}cf$Qb%W!Mdu@kes!T^C`k?v?2 zZyK5)#Cs392?It?P;v47leK@%%7MoI8CJ)P{{T!t`WMNlCgUsg%y;+$KkTxO1H%zb z>Gn&BxPQkd>NawiW${mk%+C#)Yl**xCsuGB+p&ly0;=(^w7@7O_a;(0EtK~tsb>0n zCL3(&UwM~(SP23bY)G|1%N81!wiv@}D+#nOJHc~T+Wq|*e@4Ifk@{i_KM0HqpqB*O zM0n5)bUPs-eh^7whNBYXcDYf>n6fJ?xFh1&P@wpLG*is11Ag&9ZT+^>}H5qLr6?{MI}$A+jx}oH*brK!ewKfKw8rl zgSHM;TJk0GT5hR|XjOjv!bt%aiePEJo_xhx0=kOsj!)btm2xpFa`~BXaOzVlet+4J z^$;3d&ATl}V*0s%$P$GeMt7eE<2l67{+WQP$D8rD)M&@x9s`5HD$?_khrsCfF)&+3 zzEieesb&=k$Un9&h^PlC-{y1#+Hh+8F~3&>u(E3-F6`|1v^*gKsZchxgURKUHT6xb z@mXJpi)HBF?lEi5J#h?6*YyI0a_6Z@c-hEbFm`*PpWZ8><%e;DyV!oT*in z62P5YW-tvz_LjRTU$YrSZ}v*h(}|Db{{RYw$JB4=Uyl$Uq!No%;wh@*M0&pymidiP z=AFt`mO9kEK^alxmS9|b28fHYc#Cu2iHPB-0Lg_097$;EE)nH65i&u404XgkGy>50l$4wb!R>+2 zwHDGnK}6b*4-u=j*LdO>8RR-yH@i`~oUc#_2Lx3Ry~^CeaRSr0HSp$B3uAbLJX^rH z3gR(q_TZGuZ*0}QfqTup9ZOgZweLon7b7Q!_Xb0U4X-PLWGprq^&R<(()&`DfPZs7 zz)m%%!hHyoMhRA-ZX!ZJ42;JCvO@I_p;U zzzWM!_lwLk$QX*d#Y@AL-Srr=6<6jsfLEg{{l#nJ`y!WoZ{gf**LeQ`BeOkzqAlvr z$NoefaXy*UqhI&h1N+1G{vqrzeSi5rL?`@#kKoKu3iH&p7)3j^GA)jSs-%NU$8YRa=Ht};R!|Ds7p&gc7 zA>ycbq7(3KhHDqWcl;~(bM>fwDIcaKg1F)!Lx3AMRb4%60K%R zg2bf=Qjpwybb>dP%`m}ta4eL*#Qb4^ZL?&`4PE!@962?JWZeG%P|EU*$Em{Em;*c# zp|o`Xa=CG#d~Ptb@2E=HxJIIbLtV-ZYBY5zRxF-wUOW-I$Cyzt1mN+Qjg;EzUX*a9 zZF3560lVRkO1=k%AZ1n+x5`?u&4AvSz(EbJNL1_tXmjJ#B|3&~YtsJ28gzm)lXVR_ zrQ}yEGxV^7QGx0gC|dF2T72q0DxDknmdgYFW>rc66wusy=o1C4i#K0vFZ)?Sw3m-h zPs|L@x@FHR{j!3Jll~Tl6GoU9f7B7NcWawBG`hg`FV5q;$AB0|$xP0W%@zX;T?kjk z3Yy&PSX-|HxDOhsJRsZdF)$r?XDvS>CqQPU;Dx*}S}pa|VV}{@!425q_G91A-*Hu3 z>*Uk{vy#v5a`4BpHluA{jwN8zN5g-K+M>FqPt+R>6g~0#jIV_uYD@XWc}t9Q=?t-@ zkPvCGTWk+`N+bjU>B!5&ZC=5}SK<-y&w5>fDF};h#J0R*J=+b&++p~SV@w0dQEElP z&O9==SAf#V@Z7i!MjCpla<&@yz`zRA=5S&SU@-eP{A=ocIr^VUevj=X^e&(CD0DqV zvxVjsO|E5yj&~ZWULe>dm3+(tFe6xy)*4{U$-rd1#h?n3?Kxeh)0IJ;07-j-5QG(#EMxk3~1}ZJ{27E%+st!`EiC%FA z0ls6pSW#D)Ez_s~qBK;s8;Y^5L4qP>hDw(37hXw9bzAinpAyfaVHCSm`!i?mELChC ze9DAS&&(LCSdTGiHD)U^!Epd95Dm7*xWuyRvcet{BSBcf28`BXn4{p$NfjRy&AOKgc+pYYq}5gkawCRH5Wca1%-gZXf|cq*{qB52$0<%gmk1LgZrI zGK4E3?g_Rk=B7NK^#f?jwaWWqLZBOAiUv$@==IE83gG((_R3s&GM%q8C0Y!w8vcl3 zD4Ni2`yqiEtOT8<}^1$a3Hh90PIS<**74v@YVkSajn)j{WB-CA10%V zP8&Tk=pMiC)Mr%J_DeCB@HZ866F#;5N?EYe`G4{q9SZw@$qjW7a3PI170fM(xp}iFQt0;&F~u5EzVHCHQN%e$ zGq$6Rp=owtDMJZ})DpT`{{Zc@NXo?kD54*re9$art#Oh;VnUocm} z`bDU~MVvB<-eyu#$h^m4rB+y)>oXwvAq>^=3N6CTVqQr{bso1g3>RP2poSM$3mGaI zW9>3#DswZ0c}=W}uc?s;!c>?F{6(iy^csir1S?_z0@5JF0A}Dfm?(|}VZ;SR+|?4W zPW{DI?l4zm0L%=3$C+AsN|d=!3ZJ`=ylsG@^B&W$8kQJrmc>uO4LpIDHy>PB4zH-J z8bKfGC@FWZFs;-KIQJNZmA`V3R*R{4xHNPO*carC0ioQozt{jIG?2W3by(_Da}9%B zlb%^n-pIX$UG*FvtJ1UJ z2NN>`E4M(00WD;BnB-)bEWrSPS$5F4{KcY;xmIAFWH6^>!xMHh?=f{7Qm_eGzGduP zl=0lLpc{Xn{^F%zdv^zAE4aru`5*EDsQ|NP8vg)nu^hoy`(t)Ch0EWMM8$D}Fm!Nv zVTSJmgsRKj1u_plVrB-vFT)bHSKk|WvdCOns_04|nwV3P4+rKAeNUcAt_}Q>H!a zmP3{JkA}y?f83&6Po6(8s3>ZC-}f(076c6xFaH4CEQn}V0W;#^6&&tf7Ozz-)fLTR zCFC?}jxXGILBdl?F|FAW0NJ-Whz2Rh+;SGBRKO)IYH5bQa8(MdS5U=j*L*mcaa1^P zzkk7p@XUAo2+MwiH%X1-0-|K&8I-|*{LE)H8akqas7bKnqF3rQ0ZW|m{Go)RF=AqD z5-llf`hu%$dd}ei$n&_e@Xn@XQreVIfuV5(_>Q2tX|XKa(PFVu)tQ7KmcS8976QaY zA22l#R*3K=tsbLtgG*r3+yFeo2BX7>xQkI&)Jv!_1_lMQiKa*97`}BJ1UGvD`KR?A zS>jn1-V3L~P5>icGJ#Az0f_Lq7|tbdVpa1Jm2ThE13p?|qwIy~W8hh3VHoxb4JJXA z?4xgFWeP04%!CA>`Hi)|!PHJ*V!!rU=6iJnh=d_vUo{zkfE?igaa2(horPbMZ5xJ1 zH;nEMVRVO}G&)ci-HgHLZd4RTjTR(EsDy*jjiYPyRALIs6r3^z1qo3Q@%{Gw3w!o^ z?&m(Q^E!^YFHv{u?kc@^)LZ8K*kQ}{#53mO0c}^kNMn0$&9Qma*+ne3P};;|q3rGO z?1`xx?KH*DP>Fs!$@o{_$PgFSJK?3g0d=gK_C&H?75#yqZk&qrs~WmMTpvid`_~|h zUVH>|Mxhjj-*_p6mB}H#yagPis)y6n+U5j$d+r%cjfQrLa-*4SQXYhxM-4hx!mLz| zM|RBvdJwg=deQ@Pkt60ZKoL3cvCVBABWm1T5#we3E!qcuZ2qaIV8c^(zZNget*1;0 zvU94uF81%!siqHHX_`wVt$R4SIt-KXgnx5@XPjgwMt z%zfQ8l#__NH^Xv-dq+*#SnJ_rwY*XFR~AQpH*VKb@!A&0Vx#=bz1@6RN_u=Q$^v<8 ze4uwL-;<)C3dvaDuen>ns7Qq(L?ZEW*7%^xvr2!MYG19wpo8lHlb%p|8NQ39>LKOZ z4(0*T%Iqtks_c&C6;5N&WI#Fl#sw&UDdFlGNNBdzTTwJ=IgqL`WTzCuWWd|1W<|u8 z8HPCS=U#bEiVri(0$!4Hl6(JXR6q221-xb8c1XXo_uS*7H20)gs6c|TfgS-^ijL=z zcg&tR06{d|NQ^5zn4}ZIDfQ6?B10)hYGsO zMg?7r`{wacAVT;nG?rznZRZCDaU8s~o%4Gm?8;MBlIJ%eo4Z?tJ}2^*jp!dSeKc(P z_X;RzO-C{1AO@h$h~xCp7WO#)OR_XiL8Wb2h&~T{qTXkMraQnWXvk=XG5BI(6jf!S(9yB_J zHXY7se}2I6Z*rOX=^DT?_vvp8t-g3x=QK4UU}4?1531`wKJ=A6>e{*;C_`XzHB1|C zrt9$O|S7T(@3J;U4m&5f3Q(5rW9^71v2wH$IEW&y85W(dj@D~J)<&J`@ z^h1s6(qc6%$+No!5i8G(KST|h?eRTKR?=`XPPTYgOOBCNO0MD)w0QZD2oJ=$I{EOQ z=aj?l+Ef01%_Em|TJzUglew zHidfqdq`svJMP-?4qtHVS*5IVN4J+_(`%7_8g@4$V|e4N+a2UU+AZHe9A<2SEnD(; zVaEJUNM7G>t`@-!wOdITd~cU;V#twbTU5lwc%_La0?Tq~=Ff~I=NnKN)A^D?6BU~| zp`<+zKo68CJb?CodaSY~Rkg$m$5=o7VVV)Y3a(R4vS?jNk)box)= zYVXpY08Gj_=GaH?et^ls(`;5(vDfz`{9(O6Z1?DN{{z%s$#py<8T>S&G-g)=ZKfU* zWMNNqdG%iHK|cSmi|^0#sV91_{1Y4`wr1(oT5&#z^Qn_ zcti14B;CbG!jw28gT@*M&LsVwnL=0;X$66$6W)R2Q)k^Zfg`a%HzMP~CrhN@lYmH# zmy21XEHo9io&9QhyLD)Ea%r@t0uC=3)d1V9%7yd&G;Nqw)}y zgHq`;{9v+rKydjO*yVDnVDToqcrv=vxsFtCe2Xm+Sgno>dG3z%XG|ySv1}pvD_o+q z%x-ob%gaZ-iutS5RzuC;G?Y&L|CnwkJb?~N`~w?MVI zgOLL*mhMM{NsLmZ*#gjFSP-EftNw+ZKPNs^QybXz;gbxgU%qz?zHZSmCuLTzour(; zrs&lX(5)v2ZU6RxYo&jyeMY8gPY`XK{2dGo?(i69wf=sr|&NDiqpJ zVKG4f4l+K`&N+V1?H@gCnfjv5vNHW|M&{$+>ldoJ-l1;~?vyexm=pIt_MceAsyU0UomoP5jDbB2GvQpbNrW-`=k@NzPC zG%3|IiH4&=!G_(S)XnJ|o*0ETzI~&CH~&P_9Ksy@>adgITj)zsrZmUsq)Q8S9x`U$ z7D-gAOD+%s?ke68R5wv*U|wuVlg)uy>noRQ^z0NKmb_(tQM@uKU@sy&my>6Hh{LWS z4Wf#}Gzshih7%YboRB!ek&nHek%cFDve`rG?;?FS6`e;~yNUa>fr$?i*xzQ3MgN+a zaa5`8Y)%&}8!m_Uuoh`DM9)>;g$wtn(b`Dsk@UJ--I`!8Z?Zy459F%ymf$Y~Q-A)o zs+=c59`y&$eshXTS-r+eO#9z9J`T7WUi8g-Ivo5n>tR3u;pJnMOA(~uHjq>JcmFjw~BCho8@2Ibu1?0d(G4@KD~i97*09v zy{AGNCFL6Sb5tt5Ywe&SJ5_#@;%(*e&_^nMq|F;uhBuQ)M()gnQX%2_?0pl>1E;>lo4 zeM5C&8|6v(fZ+6Bp)2X4e~atKU8y5O|-g zeMDKzHd0%Re>(O_mIB?^$lIOkz5e~cx3l{KFR3A$tnr}OCV}fZWO8YqLrD6ona=Y* zaJX%3%!izswnFkv$Aif5ULBK%5jBg+UR>!=U69Gphfq#WLTy~x@5coid#Ds$N33DcTa`LzER8dlH`5H z>`@8pBkT)S23?rfFrNY((lutxhhWI7?PlusZp&c#k)_@&384z_+9RQ;iKMg^%*uG* zG=D6VID^J1P5uTpyA8-5vDTGSzhAT#d65N4uEJt#!mw$*oYJ*8jpV|;Z&Ul~YU)CF zSd^k{Dy85&T3>1Yq5R=A)#DnTR(wWh*%mf+OQ%~Xpy=&ST@DFU9`x)wAS}PaUxUhMNegB=kxyn zl1@L%p7^q0qu%&_9i-hjgI3Z%6b61iEAt%2H)b(tivdN+?3tFszVQ{xvWVFq>VFEU zJDy)W46K1RXKMO@fx5i3@x1l z;7{!(*6QMwA$5^R!*7L3me+i1HSyraiF#-{nYn#0Sk7nL*>%7@H9X+);`^ti*u{Dc zW~knQVE{DM3;b~CPU=ViSvW+h>{L^mQ5+?(VKcC#gk@H!@UAmO@Fu4#yOo}oo~U9x z?jkB4aGhdYpCj4D~)qsCLr{ENtvu#m}kf^U>pJW916JwJx?yAkP#(YFhK=o9ZO`_qs);PWo{^+-d>)hc76+zQOWf1p zv_UQGiQVw`Qc#Y~-|~jRHu$Up&^F#2tS#tVU+$JSuWiLOMOfNSKL6&aUTTGR*dH0M ztYZmb(_HM2yV(!$ht~p?4UcllB@_%~5pqPZ#d8fi0=70j6OIm6#EPj7Zm!!ulW>bt zYmgXq0Uq$SsXnTh1g)gYcG4g~1BNQL5ls0#A9QDyc2a}n!<_Qn*qm|aT2EzoBtFfP zseYiIuzZhTO05Dv_?FWqb;u@@aNl(KkXtgr=}w^+*39M?Tl=?Xz@>J=yqS?xAO zg2oKJLK#=3jCAgKWYtiv0dH;RHf5|+KK&?x+Xmd1I<$OX6LGuktZ;O}`;iZF?&||K zwZAggkDcrH(BPA|=dvpWe@o6oMQY3?K9(!F;nB5MDe+EX-dqf3IpP;Cyk465UbHB0 zQa*&*u+@t}491->7lRJmYtpE{eZS(Ar1nS4mT_B!QYUCrL36`zh@a&sDnL+9 z1K#OeIU{pvS8!~4$ZqqmQ*U$}c(MYff4f|on7WrI?fJW>7OTqiF5i4lu=I}_OF|;` z_Q#~^s|T(YY7@RR^;{RC`3MYYPR-u4ZyAmzLEHzY16oOdCOb#P1Hp|_?}l~lP-!+#8R#gys7gistNtMt+2~S)qlor{9 zD)8)1ZDoUgzSkWPQk`avlHci)E00lJ8s35-^=`+%SzFd$A%EV2=94Ll5MvPr2}Oqz z)WE!npkI@>sHszH{7w}8Fdx6lN_z7^52OAroqbD=U3?H0QtbcbL0C}0N5fmE9;xQ> zS6HqSd)9w<+@A*0vHHL|_jPAfU$0_nQ$|#5Ju1%U5$~K<)-?*Un3ZeRGU~gd6m|zw zc+}rvt8Jc0()Ed5EtQvi8Z}L2b0#Q0vJBeZ)%%BrU)$=DrBpFCWtDdqE*FdR@99BX z>wFqOcQ&75|2|v?nIq)@XJj99#UkB|LxD?Yn{fVrSrH28FU{LwMXrx1&Q3k=n;9Pa zuQoCFNk_9}ljk3l%KzR1-AGKfo|vnA6djU$RoHT^3kI(S zms_KZXp`BJr1X7BZe+LD>Q-@GlEZh?-c7i(!$ob>%2>J9)Z~$l{RP%s+h4rM9!W+x zKdw6e_TN_tW?@u>H@sC$moq8-R0 ze@xEQESee{zeJaU0m}QR6NTBl%N(rQ+hJ4U#QTU74ec!9N#IN6fL;_`<_V9lBYw7x zmXQ<}eM0*Yla?n+5UgJk&Y%uM0=QoRb(Hd-^=Gi?;$3Au2Le>k2T@n9K?m`4h=WTU z-wkK1Y@z-34>?B>8cE^{W(+C3WtyP^7wrb}=1Scqsl5ngFGLp@;ewpyI1HDxorp|M zux(cR^k1C0=Dnk1o6FVCSrH;jki%O^g0-p$CmUyAb6B~2aZJb<#>EvkH?yN zg@w-($jg)XK%>leP>o_?hDtsjc3JArx%II>s_1KKg2gg8w2#LLVWi_JoV{QEbRF;N z7JKdbu~Idk;G*l9E6dNiK&l{PrhsO|_`Ez*dCB<$!oo95T=%04sUYtpZfPptN4(~Y z4OcY2z7RRja^#_|?)ihar%OWioy7t}F_m+d3qW3bp=6!>MylyJy@7t*+;&)vyzaAD zMo<~ofy*|rsV`ZNXPqPjW}nphw-C9tnVVve@u6%lV0BSth@@`c`P4pB@TWC(-FkFD zhUm70$cg6thxKLw^!+D*QNU^NQ#99jW{SYWKk8Zk%9d6QO-fqv#;i_aBtT0nNj+QT z8p5-E^CoLM9RcbXYjWT<7Th|mzRV+xn1O9H?m?72Dl~>aVf({6ByDy`0ldsFcn3Gu z6mOm97ODi;pYlte@Y_~CQma|plj4bOlv%Q&>OapcC4=mYa3djJDYq7LyUIqED$+1~ zd@m@kcSj5VzcW7Hdk8UGD}?FsCz>cP+P+KY?A`UwH_`%I%5!wDlm>@ri|n3;J?TUgPc$~WzvfIA30 zRUTr;$Pb17%@KC}yY6-%Q4E^4F>n{GSZN<^*0MOV?OH{}In|rA9|B!-;M8 zL087OM773=a_elx3ia;i+QMBRNYF5n8UDF6;!Uys)o2aY(jdf&%@Nm+MBe7C7iv@y z=m>2hr~>&p8O#hx}Jcc&r8mHTpUZsXB~)duCR%O`XL>4x$mlYjWU*pNVqAq zn}fjAU0EFgKWjg!NIOyP7p?(DDvbXD5K>Ze7kD*!KVy#<63Wy(dPBZ^-lT2`NosoQ zX))mV@{!_e#?@n(L;0)FUzHGc~9z=+v_dAb!Z(ZxRKvuVk--O%XQVCJCi0Z75y znIqx-?%KE`MduyF7GGWl>}7+iHmf|j{>1+6%_m*7$2*fo^W@`y}<;%cR zh5s=d19&~n!d<)rWxnbBCTQP$w)W|=w+HQB+4EW&{`(*DUZEXcgyuJk<0O2lJ<2J6t%g8jj*d#~k+#af%|D?00PXr3aln`&*rt zYMa?sX-H$dr03p&{pje;A75<3-VS~xqd_}>afqYQBmw*O83iwe`Qd}yAWA%lgnZVi zi>Ptu=W^WWIkXISi~`En>%IvndoOP4vd;O3INmb%z~s+;sUQ=_)%Kx#z~MgT zDt1c$k|5I7kBll|*GF1uz2vBktH!l*F4&`?EZw7EUfVu`B5}~ErSirXjJ^mt+AerW zi^%+17eo{+)vu_MXu6uCYETYDtE#abu+Ae(M+T+0aXqrr=0nM;Q>l5e?jONz4^R!!i%X3x`u_pmS~XkT zfyl47&6(le83FjjDBD2WWp($m-vMZhHy5^|v+9VDX=Q+w;nSe3#wht`Cguvf-Hnpw zWnLS)v{4d$m!3l=;fb&l_Ghi*2SI9!(elD&MOqN3Fe#rCo6^D2lRbmcdGhkt4mzjuTiyOZ@r ztj-1^c4Pmny!DTKki;uH!~4GAQddp$MLaKyo~!pB`lh!N@M>M{&+ww~H`TuX0p2u- zV=i#mASchbg|J0mw~!Izc2A{|r@*Q19`fDd>a2P+xB1+Ge}7Y9L(%P>R`DR0N!ec{ zS1m%4_v0CGZszr%0Y*GY*IVjFO+3Bdb8Y%{eVG3Rnlm0`WKG+0675FKNkL+?#y$v} z5&IPS+9H}zXB{g~6K3xE1;4z4c?{Vt3bs(oYUm}os{46XXNTup^hD|`*0)c~3cbom zja~Ztxswy4Gt6CtTH@gr2{5=ZnGscR=BKnn(siy>rPHx6aVPYeM74Mm*9*jYHL1~c z&hW}0P~AE%RPuj{_=*TfC*lKtIz=xRnKuX#>G!mQla*Lx1#v3oTzaRtJO@oGaC6^THwW0Ux6~J_ALZ>B3Ye&(GJpKw z#}>*d8M7o(%i6FxLeEkG@_G{aCv!@>b5_5ph{uH*xcI@ow_*X8A@0lJ4aX#HI}Q2= z90!KD;cFB>$f~E`wTqO=oe^uRbnId|0_`z4lxqLyl%r4MqBrd=aGDZY1dWc!8Tf+)vAeR+yX%I~Hc+f$k)_D8Yh|ExkZu`)48qb#5d7hRQTv|Z>1ME`ReR~ z#mCZGk39jJFBqzYOOrlAoP~{vjRJ49sBS5nojyrp45}O~i#B;qSVC@ua@vVkKJg1s z<0(|bA)PqM>{j|}k6s6zUb2Tg|aIc$J-eQn+8QwYR| zJLQhM26|=0IQ?pcY9`gNcRbIMR0O^E#5M6+K1uihC{&>odHwN}7C&+2NRv+;s zV6&q^pwR5r_@Ld?&(8u9bSeoix2as|#480iEwu{ete@8 zUt=2S9Jv|A%74J`lI4B>`0p%lt~s{YkGJ3m@^w~bnyj0plrnw93gYPlJt|Vuc(1Yz{o!e zrMNN>@9DL&({VKZGD;Pt&?4a4nRLDHxm7?w!a66dLuI+k0aoF!(k9}xLAAblKbOd`77l^xeZliu$@rh^3lJR z`F$z65IV!2G#9$OB_7cC1EaibNDx`75N2F)&+@}2RHe&RSR_c|ru79az(qagWPlM( zHsGgBLUs5SwPRkFc=*wGxxoYz#!F%u?>G0@({UZsPCfU$4m9&bU09|((%5*|zqcel zsAz2CgxxUV)x>ddTGYL661|&AfUQS$*YUO!=wslAWJafQ_5&5&TzXp+cBSvtu87kM z_oXQU*PLx-s+&kcfe?2jM%0=}v-Q zztOq*Uy}#P*u}59V)?t5xcWMJ+#Y?$U)cgp$xe?VBCGXb%F?f?$19u16j&kfxfR33 z0i%+NxNoNiBH6U`N;(CFV@GKh`GyslRo!2fZ1`O0a$6JN_|7rBDNMVoDSEF8Khquj z!`x0isr5ci-JJ8!o2-1t*6-YuyB5d%ZP*<#b)IlPi3pm|75d6wK7BCprgM4ORBMvV z5M~`|Z72N(oWT~kt7psl@%mze;x6P`xs7A94;X$OjMoa}xmeN{bHTo%G<(Tc^xr`T zg`mbe6@zJPFqKG297Rkd#3r1EK6A8I-V~nOKu8g#TdE`Zg}~x{%u0Rw&x*QU3e8M2 zANd37<~W7YJ=B8nclm+5h0;*al@v1;6Z+?;3U*CM>>kL2mtCCD4P-cMMDW( zn3$-{H~u<~EfrqsSGid6X%-$hCAzF@Tz}R1Xrz&K0Uqn9wuVPp>~fBk(8(Fk+jOmw zPo$&z8Y(b9n5Fa@McE&@eIc=$zG(ZQm;UpU1L~nv93H2iLmd(bPa(ElPmO=Pg1621jS{qtv*S)oHW(1*miSd1ssz- zr*mB06J~UK?eZr^z0Ra-_%dJN<#UP~y)G5aL^_Z=$=!dh@QS&pJE+p)q1I8Elb_S= z%hVPqKtjguWBLj6J@z9dfLY)qR?aThauOtTJwAlgzU-WC|O4dWdMOLPN zvr$^Z>5gd*(9IH|S&4R>*Q^}$?phN%XmP)6~e_D$=dnILJc4lTIXLLr?Yi{1bIC49;t>NJmQJ5u%OnXsuazX&5DH6=; zquzcdE0(A_6EhY!ZA|_;GtiyXr!jDr%PL~(X*!lBkocZQA94oxsNigI>967!?-;w9NaTZ_)?nN6I@wbRG zL?YIK53=i;uP}B8q4;pyF2^<5OyKyujJeG$y_}hsl$Hu~<&)~OcQj#35%EXQ-b{t1 z-HyL5gHFruPQMxWW)RgKc-@mIhh9tr`5wsae?p}Xdq6{kh|X-2gXy0j+l@7&Q=W8f zx~w)%;L)9u53-iuN3A(NvaqrSY0{;FW9eKg_AOm&bJ(R=oIIiZcIUWi z>0A~_1zre~n-%KCW=QU$m`45B_C&AtCa=~j8Fi+i0$yJ1&p*ftk$A1 za`~YLy^{Quq>8U<%h@efpL6#N`Rw{KsAwsZe&dnr!8shm>ZfOUzhc?hlJ3tc1`N`1 zWC6jR9p;2aN$@p#`2dg~!@UVsYlRgHZopB@$>X1H)jlVx6UjU;K3>l4P8T$lO@&T< zV4#dJ%5mO(*S~G2R*5`rN}FVn;L^2t_4mMeBdYO=Z5Sp~zqH4v@}|L*3~) zkb@ADL{=M|ygmK{9Q*MXnez{c=lE!V1TFPC{#XY9#Y84%v$2`XKbn)$klv|#biu

Mw9q8EAEE?dQc6A@=>k`}401DrkBge9W&d@cRllLb)@+Z3?XXv6XZJ znKb06nwj}E&7u*uzB2Tlx>{Cbm|8=uY92OEXDe*n+&)3@ZkXSV>T+6%%lgChy}X3%*e0BBuQXx^@dj&XxVVOyQ}GEBOZ=Q==eja5eBh}jsxDfSp62)cikBupTLjT) z$C&9_oXV?gG)05<&VSADk=CA zcP7pHlj(9c$3M)(ZN{cy{qPREo4Zry*Q2!)y0Pzgu?N32v#N!~ucZJJ01c57oT6#` zE=8()>=y18M2D^BAo|R3C(&g;tOfNu-``)6)2yN}wh))ce@*YbyCkJ*18Pi1O6Ow)xketDa(?IrDSFmzip|%tV zS#Rq7i<~jB(Lf5rPHjF@fOezXnBAiM%BWikp*T$3d3;($6l4- z$Cy2?)k}X*mK(gq4>M85ZOgVZm$>rqV{T{2Zzrm#jN=4-QLN5n4qiF~B3l3}!Mbw5 zz3~ZLF!TYop=*gNEuO%`Pu&tgSBKRRJ>nA5^5C>vY^fX2ie*$y$VQS*(CXpjM+p|in1Ls`aUe2#jABw~Du zY9(D(oV4F6A5d*_Z;DX=ooyYUDUY59y|);{5vGEu-{(PuNblN|kqWr02BqyK$Hn@!gQhukp9^TPy1&v{7_MAv@H(rT!&`H38t^IvPnk7y zrwcUX58)tQGCokf`7)Z;xz~xS2P`zSV``?nc&yoy&D_LwF-YFl8fR23r0wHtI z{KLs_hGQ;9d-{h~U%g%*@UHga>)5>PM%~N$Tl0s&wOz~1VSk)Qp`)1Yj>gLm)YN%V zzZzDM;8is5xG^o|>B}*Z;1V;LlWt#!2;ej9PSslfz{T>es??4>XPE1(M=r#wtV3*` zV84y;R!Wb4qaH$G*jY^~v6icN`4L!Rkvlo&Y@ac`tiEeP{lEmoXOw&2p+!7D;fALv zOd8A4qg|uoM?bO^3p&BmYAPsZs6&+E%p>!-?S@hnbIVykuPRfQhOjR4+0rg-$+Nfq zZoijoCBJ)3z?FlZGZhVV&sv@)RTpcAkHKm<+nA6o?lIBx8BsI&sbIP?j>2}HX zOx_)$i3y0I>9SHpHz#kn1Ueh`o7bJNAV}|9Sj#R2PE_rf&nn#6W9!v}28!6!lyMi8 zK5Ls8yxrnIGZ$rr&(UZ^zQyzk>mF!NjWqQymA|}JrjQ%i%ZvoU-y35`!l5|I$pfLM zff`yT+sOO5H$OmA+rMCNL-`&$-{6~_cGCJJKw*PI<=HIuYScwp*55MA3pQRB zvk@HlriEN(e=8-@WgGyPUvk-3ZCum3vOq66?0&9gW=t)yNO~}V9ja0(;G_JyHlq@4 z(ci9*E^>`2dE0I(oL-H2+{SQ6POj=N&f^L%29y^6L2AEzn6jwvyi}9$r%+n=Zc5Lu z=t?`>5(wQ693Y=+_UCVXP4yw7zQpQy;_?I?Yhyw30Q~J<_%bd5rlsbDY>A~!RA~$j zeTLWAb&VPA>V8;y#)T$XXlXw7e`$51z)RETxF>f|-?8UTG`9ZuQ_5=AVAcNNFZNYz zxJOwRjh)?aNI=veymZDNY2q7`1y~;Qt%V?!b`SJN|M@M~Rq!s{$-^=6sJwDVwk`e6 zuQ0>1rSoH#x7$XhT7wdmSxm@!t^%nk_)JeFDJn8;EiJVS!F>NQej#CY5@C1w5D&C; zD>XEwZ7V^)bw`feTVgd2PD%^uXJm>9aSl~e%SA_X-ml+ivuF6=b`R&dMc8KHTmPcG zs<864z$rNFUEY2kNvs1N5aPi_jVO-akC1XOdMWK=_I2beYx==1vwXa3VGyL3Xi+j7 zny9O@cxsQ`Xda(tFQOPBm8&yqkc?|erp(x6+QXT`j_9qV>Xc%~d3$|sd_-iJ1M>0ZJLRQ2WgVrno;K2kxq*lO zHttE>F4wO3XRKNT$;$eGO-)!485BKy(9Kn`_Uf^wqD;5x63M`(km}};!2-T1 zCvA-nOg25K&BcQ5MRMQ#Z9wm3AbIfl2H?&aYW2Wi0|y;3v}7EJvx=#^p<&d;!ims{ zgm}Z=<>zZH)o=nO47;^~4<7=enY%ITj$HyYnmUZ|1K&x73{C7iwxBrQLekbRsL89C zd=-*BZn?-*S5u`7cN2V$LZSXBs;I6F+Vtt*i4BA1(R_fU2+241^dueK&q;o0qi6On zJNMZOHKd0mnDPVMh0~%9fyR=>ImKqTCT~_l?ig#w{09)sE3%_WorsU94^`rjN$%0K zeRsu$cT*&0W?bVTYb}Q=r^qM3duL6d%hr8#HjdS?Um`u8a!vwjnM@*qj-Zfx*|B2T z`nhqNOLx+uEOI0ar1JGtulL=gu-Ap%&eA_7W*#rK8`g^v1wrnZo1$#*5Y*)qgM|JzK%1+{pz^ajCNog z*K_5Dz~5@D=;5*gx$h`b{kO^r)2bP;%qIayJnKJLSZQK*l|Pm)xnNQyK37{@iK4TS zi8Fm&sjl$M6*u~?NexfNmH~9gT1JZnE^40|$uv>&cnqZ*;hV@CeZ&s4-~3g8dIt>l zw656mdI~PZ!R0>g0^;|Shssh_>p!73d*LYKc_pb5{8eu!7pk1+w;Q z3jL89dhpDD<9idq@j5Wmj`4#$seW0cGS(jH+J8}5IIm=*>i-fIA}i&O9CV-@C-k}y zUl%r)D5^!zCpnpGfd_Q`PedFp=XI(K6JI`f*5L5}mX*3Fl8e9mQ;W+V2s`Bh3p1*A zY|8SrVP~~>T7QaUepPlE{}a~ncEO{`pwc-g9}{;VAN~p-Z5%Vl+@cNvN8KnF@5ug9{TJD}loenn4z$vlXl}rGnK?3GJuM4< z!b&HzB8?S~^w>Xm5XoVmGoFN{xlw)x4T7L&?O z$cWYNx!k4w1{GvIFUxudJN9`u>K7#&>uRQdJccfixFT!?o??n&W{T+)|lb%oyIliDx8;6K@tg4 zSz-3Pc#4djQ#oAdkjPllEeg|}-ly+&<3JWG6o7Aq%)DV_u+Ifr=<$XTK>BL`0lMaF zra2c-=4wIncLD;q88<4pNcuRw6Wpm7qiP@I&Y17&)D_M$KmSIU6q_;`N`Y9@82yFW z=h*lh{VbT@`oo#hpj+lYFUausl=EE&+VW>G(O=i4_(;W7YZw6>7}EKJ;!U}Vrw92C zrM)nY#hgpr=4tVZ=fS4`6y}CP4X(mXZqKeQX)xo9qmihx9&38ofJ9I_HzQSQoK!Mn zl!|Tde*kD7jCE55B|iAZZ}0_mk0zb<4D?S0tfAv3m_~HE!pB^*HRp|7AgaGIw3^y! zlAqa1PqxvPYd(MD7kH(M9ey~u!|M@a~+C$YEvmB;+Y@P5jCL(8jIeyrWP0+6?)jskl0GPc(!t56<0)y$Tv0j zb^Bp_m!(=S(l-?6r0#r?+M-SaX_E!yLG8&@Z|U=ez8Z{h%}JG@h+{e&D}U_&W%@jQ zZy8!Q_bR6x!cB-adu$Rhqi*=HR_u;Mrb|-l=UwjzQBgf&b7Tx{JiVxYTPy+XsQ zQhR=2*X{LfGT@YH$UL0QJE5_($hJi2MW*Ibcu8=4bV|6oH6YD~M zZO{xve=F?-_o~%5#RVwaG1~J{F3c$ue?u{7E=o<)KJ%qmt>1DQZw27hTlt+ajl~KE zTv(;@tC6{|M=V2=V)hr_(r>K~73ZQ}Y@=JNj|5~_?3diQG7s1_smVG)$O9ohV5d1o z9Y}7JIOp7^{!OMvFV(xXa)M{3X1HaDA>8d|!3sWR94J*?mmxXX)VS(YoX6#)>oiZG zx-~+d&+PWLq7+Tzl|q)*EBTIYxIR0R_mpgxOs{4_V3(EiB*l`i`JX#@_aN%f@QgM( z9ZN}ihd~#Fxd?e@sz6Q*&gf;rXvM3@A~^<&P$aXNSa?R!x@PvPhx{SQ^VbCMGiU4U zu--mtPL~1TAQ+Fq{-K;CMCRNyHA!(!WI9AHCR&4NHYF|QtB>UB<08IpCa~t=2D+Q@kR zHK5Xi`mp+n`(l16zD-z<4!i{(2U?&~nzELX)3zAG-o)M%BP(jRTZK8!JUcw__jko- zCIVkZSN#W&2+AezV0kd#yr!}z%n}(S9)uZKQaHkvN|S4!_heE<3jUOT65JFo_lW`i zdq2HohE}%WOw?^Oa5gvst&UpLN%FxirxOSqj821?wwrW|9cbNLgx8*zn~731Zwpza zv;!Sdw^FXlQDz0&()gkVQhVsS&rkhnVSEJN*VXEF%HHS^^$I4qkwS__oahE!&4U)P zdeB$5aGRVe2~!(R@c)j2zCF>klzg03w(M7cUdqfK_M4`D+MZEE zA&KuwZsrh!wB63LmeGq;o~{6Qx>4I0->`~04;H3lVZ94u>SF|>Pk{UU3bV#{F>UOpFZ7E}~1Ogyo?4)ozUD5`NRqh){<78VrjXN*Z-P`zT;pNHp zU~1iD{!`7MU~MK&?QM;r$5;`QoI9d#`IT+yf8a5r9@pfc5eM9=$b-L=s`a@0xW-;) z3Xt~22>6Hn_q@R4$PjxmfWiWkMu`Bs!N9NV)LyL}^VSL#rv zQ}WgPQeLPJ3zLO{w*!4$l<*PL0q&qaeasgcnv;WQg)~9#JKyys-}LKme))u z++TT(jH93LzYm`sEZ=2(VWX`YJw-|cwhqF!sr>8Gze=|8l(`iGt7iUWx;i|frLJ;r zj|cj3XMIX4@D~f{CbNiS3>6l36x&G9{q_h^R((VY?F8uky^Ge zSYjWKOm~cr5IFBX*djF8@76@92Jh#TH!`{r+iZr-1NO#1XYd27s;stNr*L`aAgIOk$QxyGOZhD zMjK-VQ5h{>>2*Y1jfrTUm|#Q6V%^hYquB;4!dh3Ag>ciATe#6Xa?~fWbPn{oJOIEq&!-w563D?K@!82L)U0IdjnWGQjB$t<*Ximcl8b0z#WIl{_QIOTR9RJdMY@WM6nCc7xc54 z$eEuIU-EK(mNVBId9lHwDXdDJP&D8ab?+gZ!JCub<1iJn`9cT(Zccg05GD-RIk-<3 zX?MUZ4-n*-(3s88wP`MU)JOO6_J{3~)2x2w z5GI$>!TwrNoWtt)V6cN|KRX?~K`&L0e@J!`wb4;a-=NU%F>(MH2vV1KJqvIu_V(4+ zb{9^E4|S0gK17o2loT+|C+-qD4L5TFMmGfWQbsnhyCTZ27(G&B?p?E$#*eSVku`Og z?b7V9F%t&Wb2=_UhustNcR3m%puiu>@lm(!XBp(s@zZj9^)KH#5w5>wX*owMj!r9? z(GBi$vY{emt?>+OwL%=$|gg+pRiD0YRC~n%pZS zN2Lj3wA~iT^-v&p8}9d(?kTX;6#De1x&(R7EuD`8OZ~3A{J>widd^PPB4;fx0W84M zy8w76F$Q+*Pz~g2Pf9*f3ZvhyKbSAv9vHa?zU?4WL^3Jia5?Xj=-%lZ{6 z^dE4w<8O@(2NJ<49rLX#p;xxbXx1Z`A&YX|i4{>*r>d4u<&b^0=iP%gv^JI|Cf`7H z@3}LcDHoxLX(erQOE=kCJEP}x`p(nxOn*n849C5n@{Cr_t&U24)+Ut3Xvvr|qf$SN zV1#+8z*m!`MZ=TIzi*!`?zCEde)YkATPH#*th$ph#ck5rcavIKQS;qP1}`%Y2gznz zp^gT2xkEp7c~#G1kFfW8@SkEE`~1!wKwvDM=H*3Y=U%XU{KRClW09v*7N{wzXkxS`|TPF4nSo^Wb#yFFiwZ?3YLmDfZ#h4(+n)|=L z&OM$9|NG;cOYUrQ9df6c``k4dCNaupbHB`;p(f;#%H8Hx$z92%G?%a3&86H%Vk((Z zpCwjStthEf)aU2>c>MnP{quYOef~Y?@qV1g>pY*%(vspQ-+?C;NZZydxFhksSIi9AKEd#2XRXUc$@>&MWRxE5{iguUPmm!Z`hP_r>@D3n^u9t8D_ zf6e;}v>?W%RmL)Wtmyk%hf0J@jR=A%d`WtV(74-#i($trOoP-x{v#|C%bJ~p?aS&l zey=@?-W5RJM9oA{VkO4GkEQixQw~4LZaN=^B~4rsR;Xx_Y&r2^>rRfb8X}AHFT2ziq zZFW;m`G!0E1AbH)b>-z{?}ANLr;heywoii4e@>I?HHf=*9i(ko;N!W9zEuVBakbuS z9B}p{L;rpY+hnYa;0x&OIB7;QtWqjp_oUK}QEO>G3^Iv3zJWBhE1J>B_<8OD#V1kLv#A{v zUa`ml)OG!tM*FWwM!M3Syn?(BJ4mWojg*LU-c|wu-5xB1o$x7*@IZ(4D&vA68>u`G3MF%W;kh#f~7c@MPy6zh1F86hzcevP$qHc2uOW z+2JEtF58=-V^GZtK;Z`dYFKovvE=0xWHm;69kI-HsfH3=;Nw-z(E8)biJ77TUlzuX z_JDIYJtvK)k{ApvETokXRoepwDQS)gS4OO~6;MhGeR$X^FOuVdTc#lw3T zxqYXu6CJ+;wyj@HE{16N#M-3-zLrgj;djqY_Ovrb;|BG;U$H&$YG}3d6n-n_8N9^C z9~AuH@A%Bz85UQ z-_Y+vSygju7y70(Lny0R2hTkxM+uD6M)*AbQQ!n(jKX^>2BNZR7{$Hyjjn!H9A&Cp zPOLT$>KaVGzif*c$S&$Uv03J~iQf3!p0DW)GOy@@4XZ`?vRdp%O2tTm7McaSmPeS7 z`V`Pn+>$hGKRc;Qs3qBYvwhLb3*3wJhW_#a=iJNDRwFCrV zm`*Xvk=ESk8Zof;GUh|UIy{E4TFE}KWV9q0@tdak!z0;;0%+kb%l&u95Mzs}bw5J+ zzC3_27-V|K=_JVRByrE476^^p>CD1)I!#*TJ zT6@`oi=A8v32Ds~#Hca~?#YMMb6!;ZGyx!t|EwC+C;lpmf0UUYF+q-zRx8#pi^i{v zCn+l2#znTty0QpO{apR0H+mJb56#`!*oFTT%J#=dk)5SpUX0y6bf3CS z-7OWBOv`ys?sxPrV2Xsif6TQ1_C(BFWLwB;j~HpmT>2@Xd_@8C_tFc-~#c}vtV zlsiKECeXDvt@q>-n6Q7%oV@K@)DGnZ^;7u!7OkL))$xVy2VQVvTl_HpJ4*94&ugI3 z^^g8~u1j)Icopvm8Jhjm$MDaCtaI)u^hUwLWb^7&bJ(`BE2O_Qoa3ucuZISs1P_4L zc;F|h-zSco!M3i7yMv|R5e+9FfgZE(@}^5ndw|5bd*GGTdHvf3=o64H-lls`ZJ&L} z%!#+bciGYA@Ha5H2gEJ^wqK!5f(%%vdbI0zi5hatENERuxV!v6mOOQB{7^$r<16|P z1(t<9;u%Fv-FZt)%@Z;P*mv}dn8Gb2s%UoSM!4K&c6Far(-`4;b={7qm~6}Wmh8`e zgJ#9JpEN%>{+VC^*K5xEm0L)lF;ot&rOGp`loTRY&)I}rpV7XtXh`U0@{e*oM%ql3 z!Q7g_N>&>;jS3FeheVxS(?oZh6~M(iHTswkuCK#x{h&m!tZaz3T*DhD($cWB>CO zQroa`Ea%#mWyywPVzxZr+8$)dVpoY+&x=`lQg>T+&SL&z=49h+2FFh^FCO+D`ntN* zNbr$$IA@rp-bB#$cOMNjtQEnbI^TL!-f_qV^1YLT+5@a#St&Q#aQB zr%>Q%YPO#cO>gk!k*gO#PUh!Mm8&}bC^@bNXjfShU}l6ZSskT4h{&=xY0n0U-$jf!cAhvau4|D0X!}i3ZIzb} z+rir)W{hFg3w-@5dqrp{v8Kq#Ws8O;UY&g&jhcR4y;l0gA+9cgA;(g}xU;Y#=m`$WdPfR(Y3k`J|HbpzgPhS4eVAtx}Jo_5< zL*_F;+#PO|;BRgGonlOp(~dFp@Rp3BM0Zf4LXSxc^2JvtLa49l#aX!OXoS;gLjWj7$rw?P!0yL)QTl$sykOl0r@~jw2IN+R(Ui}V7AHZ)%mOqZcuMRKD3X7 zWqC|_Y%7VW*Am*Y;nI&J#CBi(py=uae4>rD- zObIsrtcRfWDSL=_F`ooxICx>d!$@T>xmZH|uWHe^iGsg$%7o11Ok|E^QCqL6v7zUc z&lN?hs000ip6h2Q9N>gGPw9EB{WtgX<~t>3@(Q0tcD{ecg@ZeC1r*1<=hrsp|f65sVMeKPC`O#cl+EOCM_5Bv4;Wcm+V`5%KOIVaTc zD<(PTzM&@)uF3QQx(0{0~#FDX`Znx^I0rGEZ9e2{U1mb@*EA9;d#MzNsp zp)<8!C-lkr_qK*$GP)Mz{V6BF?p1t7F%IcXR&AboX?0LE!m47|h2k1zs@-1W8m~{z zuc4vFhGgu?6JZSHc3BOe{a8Yr@cgg>Jn?Nwh2JI$?~vsoUYx2M0loBdySf1Kj8~d<8+-iO zt3*+lq=Aann*npXash<-OsL?w^^uyNH?RS-2w7nCg%eh1AQ z@$@`&c}l*i^r@9--hGd0yR-d4f8A0*ElsR;F1{i_0O(v;`Nol>0E05RV>2G$aS(x^ zjTDEP;>E&!2631ZFSIC6xJC!yFv;W0v2sHAq7P|fEK(?pt;+AtT zq-8zXv#zH;nAjn-=Fy=O>Fq(ytnug7d3+6|UqhVhY>TyI{o~yru**Ym+()v3T;+$t zqm~-UVz4FfIW!s-46+o|2|NP%95*gwal9`SaR$j~_U4_{+?YU4@x`0FVxspLG1|3$ zC*=5_t(gYrw^TSjkk&S5-zy?!7ti$<34_=50OGRUP!_4#-iF*i5{Kx?HC+qG<1=Eg>)s5Q4`;I2qv#ae57k?}oEi7{#L zaX;44e3%4f)l|>kULUTaPYHg^oHPz#9fEgi7+WG7qXT)6=#G|d0jOOe)wMSB8*xYc ztbr|Nv!drTT<*I(Ankq&pCLWFHMtpA4BzGJQ#3Jv@%2)O_PhmD{4~mghD%X$o2rQz zHVl0fORqO)39$TPPMuYM)GIZy#4rpjWlM@tY@!AK zl|nr07drKe_36?i{+{jRh)gt3UdHP^3y<2U*NG~8JBpZ_bv%d^p7{U?(>Q_l2 z6o_WlbW?DQk!cUK6YBNf(M8(lMF{UL*3B=w0PTNu==D( z-qhK$-YF%kDtl6IjCw*?fwKWS``s4q56bm&PdfelQDXg-hafg4mW zf&Ve!>X@OQJ;eeg(R7gu&iI#RD>_+>NJR$(m}Dkb!Mwlq%v3jb=4z#R;8%x^o1i|% z*>>{k=|RiK%y1xvrx|KQyI@mD6aEe<$Hpmm5V-!~X7Fe4kU}OWOds;=<&c-K=b1BU zJYR*j!|dUviuTj9@}(IJZ$n7yr)+$OD$EYGrP13WKE{xsE+)!aVJY?}lTCe1m6}ax zoe_t2({r>WHHU7aZ9i|}dvQEYcw%Y9QewwY&8e3yA;r6VM9e$c(Tr&+tggF>@yLmd z0r}^~C!YE+%c_ub*maYc7RAaJ6u#418IDf3*Na;%nbu|8;ZXj+3Tie{o7M$VWQP*I zpV|Jp6yYGzdEpjs*5IhpTBfV^K9h3f=Ssl!XtmTFGO*1sVY;kxw`DCXjByk6E!^DLLZQZcB91y{#< zgA@ug=ER5`nU0z22$w`litw>azm5TK3W1P^$h@dsssT(Z=|@cC`&nbc7G$c_g?TZ@ z^om>UKAqmOdm?w1wr{d5NV;w!$v~``ts%kZyZ$Xkuj>{ec$F{dg2W?beA1leNQBc4 zU}zWgOV|qWV@p~a>C{t)oOiaV$MoDTOpotN4aZ;4w`;jy2e~!zG zM1M|5u%Jy0J*;&qt3gid_~{~zLu6DJY4V6&OtBAs;4#N%86)Vh+4Oc-0E3y_I`*F1 zfRBBf2N6kc{rQ$8J+Q++oM7_iv>`;+n=E}acZu=nvZb*1aMoqxT>Xw|ks?|I&BZqr zjpaq@#RsVI?`EQQRE(|^WZmEhH_d%vnTCo?a7F$}{-#D~R!~cl)G({mBDXGN%L->P za5taw-{@xbis_WK75fx_6@I}b*c-`jrl12)z57z3|Qw@Lli`v8CGGTEx>_G|1tnF eU?AZCzVUxw0)&BlK%gB!Na+8m;Q!x>7ykpRx)|30 literal 0 HcmV?d00001 diff --git a/src/platform/src/Bridge/HuggingFace/ApiClient.php b/src/platform/src/Bridge/HuggingFace/ApiClient.php index 97f0f384d..e683ce892 100644 --- a/src/platform/src/Bridge/HuggingFace/ApiClient.php +++ b/src/platform/src/Bridge/HuggingFace/ApiClient.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\HuggingFace; +use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\Component\HttpClient\HttpClient; use Symfony\Contracts\HttpClient\HttpClientInterface; @@ -27,17 +28,78 @@ public function __construct( } /** + * @return array{ + * id: string, + * downloads: int, + * likes: int, + * pipeline_tag: string|null, + * inference: string|null, + * inferenceProviderMapping: array|null, + * } + */ + public function getModel(string $modelId): array + { + $result = $this->httpClient->request('GET', 'https://huggingface.co/api/models/'.$modelId, [ + 'query' => [ + 'expand' => ['downloads', 'likes', 'pipeline_tag', 'inference', 'inferenceProviderMapping'], + ], + ]); + + $data = $result->toArray(false); + + if (isset($data['error'])) { + throw new RuntimeException(\sprintf('Error fetching model info for "%s": "%s"', $modelId, $data['error'])); + } + + return $data; + } + + /** + * @param ?string $provider Filter by inference provider (see Provider::*) + * @param ?string $task Filter by task (see Task::*) + * @param ?string $search Search term to filter models by + * @param bool $warm Filter for models with warm inference available + * * @return Model[] */ - public function models(?string $provider, ?string $task): array + public function getModels(?string $provider = null, ?string $task = null, ?string $search = null, bool $warm = false): array { $result = $this->httpClient->request('GET', 'https://huggingface.co/api/models', [ 'query' => [ 'inference_provider' => $provider, 'pipeline_tag' => $task, + 'search' => $search, + ...$warm ? ['inference' => 'warm'] : [], ], ]); - return array_map(fn (array $model) => new Model($model['id']), $result->toArray()); + $data = $result->toArray(false); + + if (isset($data['error'])) { + throw new RuntimeException(\sprintf('Error fetching models: "%s"', $data['error'])); + } + + return array_map($this->convertToModel(...), $data); + } + + /** + * @param array{ + * id: string, + * pipeline_tag?: string, + * } $data + */ + private function convertToModel(array $data): Model + { + return new Model( + $data['id'], + options: [ + 'tags' => isset($data['pipeline_tag']) ? [$data['pipeline_tag']] : [], + ], + ); } } diff --git a/src/platform/src/Bridge/HuggingFace/Command/ModelInfoCommand.php b/src/platform/src/Bridge/HuggingFace/Command/ModelInfoCommand.php new file mode 100644 index 000000000..56f36b5f0 --- /dev/null +++ b/src/platform/src/Bridge/HuggingFace/Command/ModelInfoCommand.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\AI\Platform\Bridge\HuggingFace\Command; + +use Symfony\AI\Platform\Bridge\HuggingFace\ApiClient; +use Symfony\Component\Console\Attribute\Argument; +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Style\SymfonyStyle; + +#[AsCommand('ai:huggingface:model-info', 'Retrieves inference information about a model on Hugging Face')] +final class ModelInfoCommand +{ + public function __construct( + private readonly ApiClient $apiClient, + ) { + } + + public function __invoke( + SymfonyStyle $io, + #[Argument('Name of the model to get information about')] + string $model, + ): int { + $io->title('Hugging Face Model Information'); + + $info = $this->apiClient->getModel($model); + + $io->text(\sprintf('Model: %s', $model)); + + $io->horizontalTable( + ['ID', 'Downloads', 'Likes', 'Task', 'Warm'], + [[ + $info['id'], + $info['downloads'], + $info['likes'], + $info['pipeline_tag'], + ('warm' === ($info['inference'] ?? null)) ? 'yes' : 'no', + ]] + ); + + $io->text('Inference Provider:'); + if (!isset($info['inferenceProviderMapping']) || [] === $info['inferenceProviderMapping']) { + $io->text('No inference provider information available for this model.'); + $io->newLine(); + } else { + $io->horizontalTable( + ['Provider', 'Status', 'Provider ID', 'Task', 'Is Model Author'], + array_map(fn (string $provider, array $data) => [ + $provider, + $data['status'], + $data['providerId'], + $data['task'], + $data['isModelAuthor'] ? 'yes' : 'no', + ], array_keys($info['inferenceProviderMapping']), $info['inferenceProviderMapping']) + ); + } + + return Command::SUCCESS; + } +} diff --git a/src/platform/src/Bridge/HuggingFace/Command/ModelListCommand.php b/src/platform/src/Bridge/HuggingFace/Command/ModelListCommand.php new file mode 100644 index 000000000..d1030f678 --- /dev/null +++ b/src/platform/src/Bridge/HuggingFace/Command/ModelListCommand.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\AI\Platform\Bridge\HuggingFace\Command; + +use Symfony\AI\Platform\Bridge\HuggingFace\ApiClient; +use Symfony\AI\Platform\Model; +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\Console\Attribute\Option; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Style\SymfonyStyle; + +#[AsCommand('ai:huggingface:model-list', 'Lists all available models on Hugging Face')] +final class ModelListCommand +{ + public function __construct( + private readonly ApiClient $apiClient, + ) { + } + + public function __invoke( + SymfonyStyle $io, + #[Option('Name of the inference provider to filter models by', 'provider', 'p')] + ?string $provider = null, + #[Option('Name of the task to filter models by', 'task', 't')] + ?string $task = null, + #[Option('Search term to filter models by', 'search', 's')] + ?string $search = null, + #[Option('Only list models that are "warm" (i.e. ready for inference without cold start)', 'warm', 'w')] + bool $warm = false, + ): int { + $io->title('Hugging Face Model Listing'); + + $models = $this->apiClient->getModels($provider, $task, $search, $warm); + + if (0 === \count($models)) { + $io->error('No models found for the given filters.'); + + return Command::FAILURE; + } + + $formatModel = function (Model $model) { + return \sprintf('%s [%s]', $model->getName(), implode(', ', $model->getOptions()['tags'] ?? [])); + }; + + $io->listing(array_map($formatModel, $models)); + + $io->success(\sprintf('Found %d model(s).', \count($models))); + + return Command::SUCCESS; + } +} diff --git a/src/platform/src/Bridge/HuggingFace/ModelClient.php b/src/platform/src/Bridge/HuggingFace/ModelClient.php index 10b2240fb..cb38a4cf6 100644 --- a/src/platform/src/Bridge/HuggingFace/ModelClient.php +++ b/src/platform/src/Bridge/HuggingFace/ModelClient.php @@ -42,20 +42,20 @@ public function supports(Model $model): bool */ public function request(Model $model, array|string $payload, array $options = []): RawHttpResult { - // Extract task from options if provided + $provider = $options['provider'] ?? $this->provider; $task = $options['task'] ?? null; - unset($options['task']); + unset($options['task'], $options['provider']); - return new RawHttpResult($this->httpClient->request('POST', $this->getUrl($model, $task), [ + return new RawHttpResult($this->httpClient->request('POST', $this->getUrl($model, $provider, $task), [ 'auth_bearer' => $this->apiKey, ...$this->getPayload($payload, $options), ])); } - private function getUrl(Model $model, ?string $task): string + private function getUrl(Model $model, string $provider, ?string $task): string { $endpoint = Task::FEATURE_EXTRACTION === $task ? 'pipeline/feature-extraction' : 'models'; - $url = \sprintf('https://router.huggingface.co/%s/%s/%s', $this->provider, $endpoint, $model->getName()); + $url = \sprintf('https://router.huggingface.co/%s/%s/%s', $provider, $endpoint, $model->getName()); if (Task::CHAT_COMPLETION === $task) { $url .= '/v1/chat/completions'; diff --git a/src/platform/src/Bridge/HuggingFace/Output/TableQuestionAnsweringResult.php b/src/platform/src/Bridge/HuggingFace/Output/TableQuestionAnsweringResult.php index e6d024d75..ec7a6687e 100644 --- a/src/platform/src/Bridge/HuggingFace/Output/TableQuestionAnsweringResult.php +++ b/src/platform/src/Bridge/HuggingFace/Output/TableQuestionAnsweringResult.php @@ -17,25 +17,33 @@ final class TableQuestionAnsweringResult { /** - * @param array $cells - * @param array $aggregator + * @param array{0: int, 1: int}[] $coordinates + * @param array $cells + * @param array|string|null $aggregator */ public function __construct( public readonly string $answer, + public readonly array $coordinates = [], public readonly array $cells = [], - public readonly array $aggregator = [], + public readonly array|string|null $aggregator = null, ) { } /** - * @param array{answer: string, cells?: array, aggregator?: array} $data + * @param array{ + * answer: string, + * coordinates?: array{0: int, 1: int}[], + * cells?: array, + * aggregator?: array + * } $data */ public static function fromArray(array $data): self { return new self( $data['answer'], + $data['coordinates'] ?? [], $data['cells'] ?? [], - $data['aggregator'] ?? [], + $data['aggregator'] ?? null, ); } } diff --git a/src/platform/src/Bridge/HuggingFace/Provider.php b/src/platform/src/Bridge/HuggingFace/Provider.php index 2a24ea9fd..2538b4926 100644 --- a/src/platform/src/Bridge/HuggingFace/Provider.php +++ b/src/platform/src/Bridge/HuggingFace/Provider.php @@ -12,6 +12,9 @@ namespace Symfony\AI\Platform\Bridge\HuggingFace; /** + * Based on the list of supported providers at + * https://huggingface.co/docs/inference-providers/index. + * * @author Christopher Hertel */ interface Provider @@ -19,12 +22,19 @@ interface Provider public const CEREBRAS = 'cerebras'; public const COHERE = 'cohere'; public const FAL_AI = 'fal-ai'; + public const FEATHERLESS_AI = 'featherless-ai'; public const FIREWORKS = 'fireworks-ai'; - public const HYPERBOLIC = 'hyperbolic'; + public const GROQ = 'groq'; public const HF_INFERENCE = 'hf-inference'; + public const HYPERBOLIC = 'hyperbolic'; public const NEBIUS = 'nebius'; public const NOVITA = 'novita'; + public const NSCALE = 'nscale'; + public const PUBLIC_AI = 'publicai'; public const REPLICATE = 'replicate'; public const SAMBA_NOVA = 'sambanova'; + public const SCALEWAY = 'scaleway'; public const TOGETHER = 'together'; + public const WAVE_SPEED_AI = 'wavespeed'; + public const Z_AI = 'zai-org'; } diff --git a/src/platform/src/Bridge/HuggingFace/README.md b/src/platform/src/Bridge/HuggingFace/README.md new file mode 100644 index 000000000..20270a484 --- /dev/null +++ b/src/platform/src/Bridge/HuggingFace/README.md @@ -0,0 +1,196 @@ +# HuggingFace Bridge + +The HuggingFace bridge provides integration with the [HuggingFace Inference API](https://huggingface.co/docs/inference-api/index), +enabling access to thousands of pre-trained models for various AI tasks including natural language processing, computer +vision, audio processing, and more. + +## Features + +- **Multi-Provider Support**: Access models through multiple inference providers (HuggingFace Inference, Cerebras, Cohere, Groq, Together, and others) +- **Comprehensive Task Support**: Support for 40+ different AI tasks including: + - Chat completion and text generation + - Image classification, object detection, and segmentation + - Automatic speech recognition and audio classification + - Text classification, translation, summarization + - Feature extraction and embeddings + - And many more... +- **Model Discovery**: Built-in API client to discover and query available models +- **Flexible Input/Output**: Support for text, images, audio, and binary data +- **Type-Safe Results**: Structured result objects for each task type + +## Installation + +The bridge is included in the `symfony/ai-platform` package. Ensure you have the required dependencies: + +```bash +composer require symfony/ai-platform +``` + +## Quick Start + +### Initialize the Platform + +```php +use Symfony\AI\Platform\Bridge\HuggingFace\PlatformFactory; +use Symfony\AI\Platform\Bridge\HuggingFace\Provider; + +$platform = PlatformFactory::create( + apiKey: 'hf_your_api_key_here', + provider: Provider::CEREBRAS, // or other providers + httpClient: $httpClient // optional, uses default if not provided +); +``` + +### Chat Completion Example + +```php +use Symfony\AI\Platform\Bridge\HuggingFace\Task; +use Symfony\AI\Platform\Message\Message; +use Symfony\AI\Platform\Message\MessageBag; + +$messages = new MessageBag( + Message::ofUser('Hello, how are you doing today?') +); + +$result = $platform->invoke('HuggingFaceH4/zephyr-7b-beta', $messages, [ + 'task' => Task::CHAT_COMPLETION, +]); + +echo $result->asText(); +``` + +### Image Classification Example + +```php +use Symfony\AI\Platform\Bridge\HuggingFace\Task; +use Symfony\AI\Platform\Message\Content\Image; + +$image = Image::fromFile('/path/to/image.jpg'); + +$result = $platform->invoke('google/vit-base-patch16-224', $image, [ + 'task' => Task::IMAGE_CLASSIFICATION, +]); + +$classifications = $result->asObject(); +foreach ($classifications as $classification) { + echo $classification->label . ': ' . $classification->score . PHP_EOL; +} +``` + +### Feature Extraction (Embeddings) + +```php +$result = $platform->invoke('sentence-transformers/all-MiniLM-L6-v2', 'Hello world', [ + 'task' => Task::FEATURE_EXTRACTION, +]); + +$vector = $result->asVector(); +``` + +## Providers + +The bridge supports multiple inference providers. For a complete list of available providers and their constants, see +the [`Provider` interface](./Provider.php). + +Specify a provider when creating the platform: + +```php +use Symfony\AI\Platform\Bridge\HuggingFace\Provider; + +$platform = PlatformFactory::create( + apiKey: 'your_api_key', + provider: Provider::GROQ, +); +``` + +## Supported Tasks + +The bridge supports 40+ AI tasks across multiple categories including: + +- **Natural Language Processing**: Chat completion, text generation, classification, translation, summarization, embeddings, and more +- **Computer Vision**: Image classification, object detection, segmentation, depth estimation, and more +- **Audio**: Speech recognition, audio classification, text-to-speech, and more +- **Multimodal**: Visual question answering, document understanding, and more + +For the complete list of supported tasks and their constants, see the [`Task` interface](./Task.php). + +## Model Discovery + +The bridge includes commands to discover available models without using inference credits. They help to research and use +models, and can be registered in a Symfony Console application. + +### Command-Line Interface + +The HuggingFace bridge provides two console commands for model discovery: + +#### List Models + +List available models with optional filtering: + +```bash +ai:huggingface:model-list [options] +``` + +Options: +- `--provider, -p`: Filter by inference provider (e.g., `inference`) +- `--task, -t`: Filter by task type (e.g., `text-generation`) +- `--search, -s`: Search term to filter models +- `--warm, -w`: Only list models with warm inference (ready without cold start) + +Examples: +```bash +# List all text generation models +ai:huggingface:model-list --task=text-generation + +# List warm models for a specific provider +ai:huggingface:model-list --provider=hf-inference --warm + +# Search for specific models +ai:huggingface:model-list --search=llama +``` + +#### Get Model Information + +Retrieve detailed information about a specific model: + +```bash +ai:huggingface:model-info +``` + +Examples: +```bash +# Get information about a specific model +ai:huggingface:model-info meta-llama/Llama-2-7b-chat +ai:huggingface:model-info gpt2 +``` + +Output includes: +- Model ID, downloads, and community likes +- Task type (pipeline tag) +- Inference status (warm/cold) +- Inference provider mappings and availability + +## Options and Configuration + +When invoking the platform, you can pass task-specific options: + +```php +$result = $platform->invoke('model/id', $input, [ + 'task' => Task::TEXT_GENERATION, + 'temperature' => 0.7, + 'top_p' => 0.9, + 'top_k' => 50, + 'max_new_tokens' => 256, + 'repetition_penalty' => 1.2, + // ... other provider-specific parameters +]); +``` + +You can also override the provider per request: + +```php +$result = $platform->invoke('model/id', $input, [ + 'task' => Task::CHAT_COMPLETION, + 'provider' => Provider::GROQ, // Override default provider +]); +``` diff --git a/src/platform/src/Bridge/HuggingFace/ResultConverter.php b/src/platform/src/Bridge/HuggingFace/ResultConverter.php index ac63843ea..0af31d68e 100644 --- a/src/platform/src/Bridge/HuggingFace/ResultConverter.php +++ b/src/platform/src/Bridge/HuggingFace/ResultConverter.php @@ -56,7 +56,7 @@ public function convert(RawResultInterface|RawHttpResult $result, array $options $headers = $httpResponse->getHeaders(false); $contentType = $headers['content-type'][0] ?? null; - $content = 'application/json' === $contentType ? $httpResponse->toArray(false) : $httpResponse->getContent(false); + $content = str_contains($contentType, 'application/json') ? $httpResponse->toArray(false) : $httpResponse->getContent(false); if (str_starts_with((string) $httpResponse->getStatusCode(), '4')) { $message = match (true) { diff --git a/src/platform/src/Bridge/HuggingFace/Task.php b/src/platform/src/Bridge/HuggingFace/Task.php index e2be0049c..ef6ad42a5 100644 --- a/src/platform/src/Bridge/HuggingFace/Task.php +++ b/src/platform/src/Bridge/HuggingFace/Task.php @@ -12,27 +12,74 @@ namespace Symfony\AI\Platform\Bridge\HuggingFace; /** + * Based on the facets listed at https://huggingface.co/models. + * * @author Christopher Hertel */ interface Task { - public const AUDIO_CLASSIFICATION = 'audio-classification'; - public const AUTOMATIC_SPEECH_RECOGNITION = 'automatic-speech-recognition'; - public const CHAT_COMPLETION = 'chat-completion'; - public const FEATURE_EXTRACTION = 'feature-extraction'; - public const FILL_MASK = 'fill-mask'; + // Multimodal + public const AUDIO_TEXT_TO_TEXT = 'audio-text-to-text'; + public const IMAGE_TEXT_TO_TEXT = 'image-text-to-text'; + public const VISUAL_QUESTION_ANSWERING = 'visual-question-answering'; + public const DOCUMENT_QUESTION_ANSWERING = 'document-question-answering'; + public const VIDEO_TEXT_TO_TEXT = 'video-text-to-text'; + public const VISUAL_DOCUMENT_RETRIEVAL = 'visual-document-retrieval'; + public const ANY_TO_ANY = 'any-to-any'; + + // Computer Vision + public const DEPTH_ESTIMATION = 'depth-estimation'; public const IMAGE_CLASSIFICATION = 'image-classification'; + public const OBJECT_DETECTION = 'object-detection'; public const IMAGE_SEGMENTATION = 'image-segmentation'; + public const TEXT_TO_IMAGE = 'text-to-image'; public const IMAGE_TO_TEXT = 'image-to-text'; - public const OBJECT_DETECTION = 'object-detection'; - public const QUESTION_ANSWERING = 'question-answering'; - public const SENTENCE_SIMILARITY = 'sentence-similarity'; - public const SUMMARIZATION = 'summarization'; - public const TABLE_QUESTION_ANSWERING = 'table-question-answering'; + public const IMAGE_TO_IMAGE = 'image-to-image'; + public const IMAGE_TO_VIDEO = 'image-to-video'; + public const UNCONDITIONAL_IMAGE_GENERATION = 'unconditional-image-generation'; + public const VIDEO_CLASSIFICATION = 'video-classification'; + public const TEXT_TO_VIDEO = 'text-to-video'; + public const ZERO_SHOT_IMAGE_CLASSIFICATION = 'zero-shot-image-classification'; + public const MASK_GENERATION = 'mask-generation'; + public const ZERO_SHOT_OBJECT_DETECTION = 'zero-shot-object-detection'; + public const TEXT_TO_3D = 'text-to-3d'; + public const IMAGE_TO_3D = 'image-to-3d'; + public const IMAGE_FEATURE_EXTRACTION = 'image-feature-extraction'; + public const KEYPOINT_DETECTION = 'keypoint-detection'; + public const VIDEO_TO_VIDEO = 'video-to-video'; + + // Natural Language Processing public const TEXT_CLASSIFICATION = 'text-classification'; - public const TEXT_GENERATION = 'text-generation'; - public const TEXT_TO_IMAGE = 'text-to-image'; public const TOKEN_CLASSIFICATION = 'token-classification'; - public const TRANSLATION = 'translation'; + public const TABLE_QUESTION_ANSWERING = 'table-question-answering'; + public const QUESTION_ANSWERING = 'question-answering'; public const ZERO_SHOT_CLASSIFICATION = 'zero-shot-classification'; + public const TRANSLATION = 'translation'; + public const SUMMARIZATION = 'summarization'; + public const FEATURE_EXTRACTION = 'feature-extraction'; + public const TEXT_GENERATION = 'text-generation'; + public const FILL_MASK = 'fill-mask'; + public const SENTENCE_SIMILARITY = 'sentence-similarity'; + public const TEXT_RANKING = 'text-ranking'; + + // Audio + public const TEXT_TO_SPEECH = 'text-to-speech'; + public const TEXT_TO_AUDIO = 'text-to-audio'; + public const AUTOMATIC_SPEECH_RECOGNITION = 'automatic-speech-recognition'; + public const AUDIO_TO_AUDIO = 'audio-to-audio'; + public const AUDIO_CLASSIFICATION = 'audio-classification'; + public const VOICE_ACTIVITY_DETECTION = 'voice-activity-detection'; + + // Tabular + public const TABULAR_CLASSIFICATION = 'tabular-classification'; + public const TABULAR_REGRESSION = 'tabular-regression'; + public const TIME_SERIES_FORECASTING = 'time-series-forecasting'; + + // Reinforcement Learning + public const REINFORCEMENT_LEARNING = 'reinforcement-learning'; + public const ROBOTICS = 'robotics'; + + // Other + public const GRAPH_MACHINE_LEARNING = 'graph-machine-learning'; + public const CHAT_COMPLETION = 'chat-completion'; } diff --git a/src/platform/tests/Bridge/HuggingFace/ApiClientTest.php b/src/platform/tests/Bridge/HuggingFace/ApiClientTest.php index 9a58cccba..4ef902cfa 100644 --- a/src/platform/tests/Bridge/HuggingFace/ApiClientTest.php +++ b/src/platform/tests/Bridge/HuggingFace/ApiClientTest.php @@ -35,7 +35,7 @@ public function testModelsWithProviderAndTask() $httpClient = new MockHttpClient(new JsonMockResponse($responseData)); $apiClient = new ApiClient($httpClient); - $models = $apiClient->models('test-provider', 'text-generation'); + $models = $apiClient->getModels('test-provider', 'text-generation'); $this->assertCount(3, $models); $this->assertInstanceOf(Model::class, $models[0]); @@ -55,7 +55,7 @@ public function testModelsWithNullProviderAndTask() $httpClient = new MockHttpClient(new JsonMockResponse($responseData)); $apiClient = new ApiClient($httpClient); - $models = $apiClient->models(null, null); + $models = $apiClient->getModels(); $this->assertCount(2, $models); $this->assertInstanceOf(Model::class, $models[0]); @@ -71,7 +71,7 @@ public function testModelsWithEmptyResponse() $httpClient = new MockHttpClient(new JsonMockResponse($responseData)); $apiClient = new ApiClient($httpClient); - $models = $apiClient->models('test-provider', 'text-generation'); + $models = $apiClient->getModels('test-provider', 'text-generation'); $this->assertCount(0, $models); } @@ -90,7 +90,7 @@ public function testModelsRequestParameters() }); $apiClient = new ApiClient($httpClient); - $apiClient->models('test-provider', 'text-generation'); + $apiClient->getModels('test-provider', 'text-generation'); } #[TestDox('Sends correct HTTP request with null provider and task parameters')] @@ -107,6 +107,6 @@ public function testModelsRequestParametersWithNullValues() }); $apiClient = new ApiClient($httpClient); - $apiClient->models(null, null); + $apiClient->getModels(); } } diff --git a/src/platform/tests/Bridge/HuggingFace/Output/TableQuestionAnsweringResultTest.php b/src/platform/tests/Bridge/HuggingFace/Output/TableQuestionAnsweringResultTest.php index 84c2d2236..5f0d3e92c 100644 --- a/src/platform/tests/Bridge/HuggingFace/Output/TableQuestionAnsweringResultTest.php +++ b/src/platform/tests/Bridge/HuggingFace/Output/TableQuestionAnsweringResultTest.php @@ -27,34 +27,38 @@ public function testConstruction() $result = new TableQuestionAnsweringResult('Paris'); $this->assertSame('Paris', $result->answer); + $this->assertSame([], $result->coordinates); $this->assertSame([], $result->cells); - $this->assertSame([], $result->aggregator); + $this->assertNull($result->aggregator); } #[TestDox('Construction with all parameters creates valid instance')] public function testConstructionWithAllParameters() { + $coordinates = [[0, 1]]; $cells = ['cell1', 'cell2', 42]; $aggregator = ['SUM', 'AVERAGE']; - $result = new TableQuestionAnsweringResult('Total is 100', $cells, $aggregator); + $result = new TableQuestionAnsweringResult('Total is 100', $coordinates, $cells, $aggregator); $this->assertSame('Total is 100', $result->answer); + $this->assertSame($coordinates, $result->coordinates); $this->assertSame($cells, $result->cells); $this->assertSame($aggregator, $result->aggregator); } #[TestDox('Constructor accepts various parameter combinations')] - #[TestWith(['Yes', [], []])] - #[TestWith(['No', ['A1'], ['COUNT']])] - #[TestWith(['42.5', ['A1', 'B1', 42], ['SUM', 'AVERAGE']])] - #[TestWith(['', [], []])] - #[TestWith(['Complex answer with multiple words', [1, 2, 3], ['NONE']])] - public function testConstructorWithDifferentValues(string $answer, array $cells, array $aggregator) + #[TestWith(['Yes', [], [], []])] + #[TestWith(['No', [[0, 1]], ['A1'], ['COUNT']])] + #[TestWith(['42.5', [[0, 1]], ['A1', 'B1', 42], ['SUM', 'AVERAGE']])] + #[TestWith(['', [[0, 1]], [], []])] + #[TestWith(['Complex answer with multiple words', [[0, 1]], [1, 2, 3], ['NONE']])] + public function testConstructorWithDifferentValues(string $answer, array $coordinates, array $cells, array $aggregator) { - $result = new TableQuestionAnsweringResult($answer, $cells, $aggregator); + $result = new TableQuestionAnsweringResult($answer, $coordinates, $cells, $aggregator); $this->assertSame($answer, $result->answer); + $this->assertSame($coordinates, $result->coordinates); $this->assertSame($cells, $result->cells); $this->assertSame($aggregator, $result->aggregator); } @@ -67,8 +71,9 @@ public function testFromArrayWithRequiredField() $result = TableQuestionAnsweringResult::fromArray($data); $this->assertSame('Berlin', $result->answer); + $this->assertSame([], $result->coordinates); $this->assertSame([], $result->cells); - $this->assertSame([], $result->aggregator); + $this->assertNull($result->aggregator); } #[TestDox('fromArray creates instance with all fields')] @@ -76,6 +81,7 @@ public function testFromArrayWithAllFields() { $data = [ 'answer' => 'The result is 150', + 'coordinates' => [[0, 0], [1, 1]], 'cells' => ['A1', 'B2', 100, 50], 'aggregator' => ['SUM'], ]; @@ -83,11 +89,13 @@ public function testFromArrayWithAllFields() $result = TableQuestionAnsweringResult::fromArray($data); $this->assertSame('The result is 150', $result->answer); + $this->assertSame([[0, 0], [1, 1]], $result->coordinates); $this->assertSame(['A1', 'B2', 100, 50], $result->cells); $this->assertSame(['SUM'], $result->aggregator); } #[TestDox('fromArray handles optional fields with default values')] + #[TestWith([['answer' => 'Test', 'coordinates' => [[0, 0], [1, 1]]]])] #[TestWith([['answer' => 'Test', 'cells' => ['A1', 'B1']]])] #[TestWith([['answer' => 'Test', 'aggregator' => ['COUNT']]])] #[TestWith([['answer' => 'Test', 'cells' => [1, 2], 'aggregator' => ['SUM', 'AVG']]])] @@ -96,8 +104,9 @@ public function testFromArrayWithOptionalFields(array $data) $result = TableQuestionAnsweringResult::fromArray($data); $this->assertSame($data['answer'], $result->answer); + $this->assertSame($data['coordinates'] ?? [], $result->coordinates); $this->assertSame($data['cells'] ?? [], $result->cells); - $this->assertSame($data['aggregator'] ?? [], $result->aggregator); + $this->assertSame($data['aggregator'] ?? null, $result->aggregator); } #[TestDox('fromArray handles various cell data types')] @@ -137,13 +146,15 @@ public function testFromArrayWithVariousAggregatorFormats(array $data) #[TestDox('Empty arrays are handled correctly')] public function testEmptyArrays() { - $result1 = new TableQuestionAnsweringResult('answer', [], []); + $result1 = new TableQuestionAnsweringResult('answer', [], [], []); $result2 = TableQuestionAnsweringResult::fromArray(['answer' => 'test']); + $this->assertSame([], $result1->coordinates); $this->assertSame([], $result1->cells); $this->assertSame([], $result1->aggregator); + $this->assertSame([], $result2->coordinates); $this->assertSame([], $result2->cells); - $this->assertSame([], $result2->aggregator); + $this->assertNull($result2->aggregator); } #[TestDox('Large cell arrays are handled correctly')] @@ -155,7 +166,7 @@ public function testLargeCellArrays() $largeCells[] = $i; } - $result = new TableQuestionAnsweringResult('Large table result', $largeCells, ['COUNT']); + $result = new TableQuestionAnsweringResult('Large table result', [], $largeCells, ['COUNT']); $this->assertCount(200, $result->cells); $this->assertSame('cell_0', $result->cells[0]); diff --git a/src/platform/tests/Bridge/HuggingFace/PlatformFactoryTest.php b/src/platform/tests/Bridge/HuggingFace/PlatformFactoryTest.php index d797b66eb..559681211 100644 --- a/src/platform/tests/Bridge/HuggingFace/PlatformFactoryTest.php +++ b/src/platform/tests/Bridge/HuggingFace/PlatformFactoryTest.php @@ -54,14 +54,21 @@ public function testCreateWithEventSourceHttpClient() #[TestWith([Provider::CEREBRAS])] #[TestWith([Provider::COHERE])] #[TestWith([Provider::FAL_AI])] + #[TestWith([Provider::FEATHERLESS_AI])] #[TestWith([Provider::FIREWORKS])] - #[TestWith([Provider::HYPERBOLIC])] + #[TestWith([Provider::GROQ])] #[TestWith([Provider::HF_INFERENCE])] + #[TestWith([Provider::HYPERBOLIC])] #[TestWith([Provider::NEBIUS])] #[TestWith([Provider::NOVITA])] + #[TestWith([Provider::NSCALE])] + #[TestWith([Provider::PUBLIC_AI])] #[TestWith([Provider::REPLICATE])] #[TestWith([Provider::SAMBA_NOVA])] + #[TestWith([Provider::SCALEWAY])] #[TestWith([Provider::TOGETHER])] + #[TestWith([Provider::WAVE_SPEED_AI])] + #[TestWith([Provider::Z_AI])] public function testCreateWithDifferentProviders(string $provider) { $platform = PlatformFactory::create('test-api-key', $provider);