summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/bpf/prog_tests/get_func_args_test.c
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@redhat.com>2021-12-08 20:32:45 +0100
committerAlexei Starovoitov <ast@kernel.org>2021-12-13 09:25:59 -0800
commit006004b715569f742535f70f3f06b41d8135486c (patch)
tree7ade7429fb7c8cbbc59ee6a8b5b347e8bd099e95 /tools/testing/selftests/bpf/prog_tests/get_func_args_test.c
parentf92c1e183604c20ce00eb889315fdaa8f2d9e509 (diff)
downloadlinux-006004b715569f742535f70f3f06b41d8135486c.tar.gz
linux-006004b715569f742535f70f3f06b41d8135486c.tar.bz2
linux-006004b715569f742535f70f3f06b41d8135486c.zip
selftests/bpf: Add tests for get_func_[arg|ret|arg_cnt] helpers
Adding tests for get_func_[arg|ret|arg_cnt] helpers. Using these helpers in fentry/fexit/fmod_ret programs. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20211208193245.172141-6-jolsa@kernel.org
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests/get_func_args_test.c')
-rw-r--r--tools/testing/selftests/bpf/prog_tests/get_func_args_test.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/prog_tests/get_func_args_test.c b/tools/testing/selftests/bpf/prog_tests/get_func_args_test.c
new file mode 100644
index 000000000000..85c427119fe9
--- /dev/null
+++ b/tools/testing/selftests/bpf/prog_tests/get_func_args_test.c
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <test_progs.h>
+#include "get_func_args_test.skel.h"
+
+void test_get_func_args_test(void)
+{
+ struct get_func_args_test *skel = NULL;
+ __u32 duration = 0, retval;
+ int err, prog_fd;
+
+ skel = get_func_args_test__open_and_load();
+ if (!ASSERT_OK_PTR(skel, "get_func_args_test__open_and_load"))
+ return;
+
+ err = get_func_args_test__attach(skel);
+ if (!ASSERT_OK(err, "get_func_args_test__attach"))
+ goto cleanup;
+
+ /* This runs bpf_fentry_test* functions and triggers
+ * fentry/fexit programs.
+ */
+ prog_fd = bpf_program__fd(skel->progs.test1);
+ err = bpf_prog_test_run(prog_fd, 1, NULL, 0,
+ NULL, NULL, &retval, &duration);
+ ASSERT_OK(err, "test_run");
+ ASSERT_EQ(retval, 0, "test_run");
+
+ /* This runs bpf_modify_return_test function and triggers
+ * fmod_ret_test and fexit_test programs.
+ */
+ prog_fd = bpf_program__fd(skel->progs.fmod_ret_test);
+ err = bpf_prog_test_run(prog_fd, 1, NULL, 0,
+ NULL, NULL, &retval, &duration);
+ ASSERT_OK(err, "test_run");
+ ASSERT_EQ(retval, 1234, "test_run");
+
+ ASSERT_EQ(skel->bss->test1_result, 1, "test1_result");
+ ASSERT_EQ(skel->bss->test2_result, 1, "test2_result");
+ ASSERT_EQ(skel->bss->test3_result, 1, "test3_result");
+ ASSERT_EQ(skel->bss->test4_result, 1, "test4_result");
+
+cleanup:
+ get_func_args_test__destroy(skel);
+}
]5 5Fی1|)G}"R jΙ'$f1W ;~ٯdY&~ #GfvlLVFͩHfkHG, }A GCmDhL"S=2ѳd ovv|]!&i2ZvY|ݕ^DcN}qby?LDON(ak}{3b$ HpE 4`D< ohb>}9z;,*$G~S#s Su~\#f,˔ωlz漰@p@X]r9՛nk0M&c5QU5{Ujwx$n6PԤM5bT薟{]u`oUFFHyWee?Sm)Q荆W%uNU;F-/aI_qփ/JtUWqWmuTm8jzYgԤ9^ZS:Ukv1Q8C3L7599QFѪȜFN7HFYͣ7CdnUn7F铟bA0as2c;+87ee>(#~{"ia!.H)ȸ*d{TsU໺"Mޣq{0/G>y!yʯtz٩vSm! >RtpTmI+@Hƙ+}8= BjP9{L$6WVKND^4`d4HP-An?,QjŒ|GڮDb2ъUV˿[a#)oa.^-)~<̘dߨ@nhlZcSFT5H^بi$4mk:C"F6Ԡ:5խi 5)=ClUbKj̀zABzb)$fʝ0e; /CHC*= ݮ{ B~N?9Ʌ#oy5T:1'-N&۽ okG>h^Cfˑ%R^sc>7{5ɗ4L(& 8 "ibD7c2.ۜ0Bln=!'>]d5J3M EF z3):Zh&ӊ'" l;*RQ1kKE!lFTB8`@2D gU.!ll4*Vq1z8lGNx$fuq^nT>y4+_ʓy aO~&tJjqSw}#ډE%m-6۽W]̽ZU4Jj1ZJJ޴#D>Mz[R+~j&<09Q;8ZtE~PԷh1l,&< |1&P6L5rhaJ%8B.*? Qɦ53ݣ_> !Yk11n۪*^%#;ӷd/YluZ c%ͻ[sg]oy K*04wjnLN1 Ē;I̲3lTG55^Gm&jЁF|$Hulx:L[ Lr$C;$iSu(s5$%dn=B2aM} eUJ7|ֳ꣚G⠽=L"eBjzFV-3F`,lCҒE¾Ucobh(_\Jg?YaWK!l0A`a(itf2}p1XӵhNyU&+ΞAfAeYlzuWӗE `so(t!^2@~/|v⅜wRצ$YϬCNnEmʅ&D|b{kjt: %^޿ m0S( 62<2:N{iy7~%‹ǘ٢$UlT$p 2Y$8g XZ.4(PLjhj EMJKFr%&q Pb5 *pV69HZ H&8]s7| *K ز||^ DS`a-d/JrG"w􎪶jL E֋w٠{=<ʯ|[ew$H@t+V< &f5ܙU%bL6 _u2qAO$Bs/_ߐm+M(ӨUћ[zOFv6 @jAӰo"F)T294:Z/s_H埕=Kgvjthd |nQ'f0 9r*4<FiZKA'_Pb!uXtXI=wvSf?|7)t%a{Z %IgL0?7C8ɒ%mV{Jg8U{=9PͪU 7Ju[XLӆ4p #qdXFj^o(0P=ҋ.'y޹F7k2ޡ?ѵu΋ wxIaVw6̫4yf8P8Nff~O*EvLF ,R6⏴29_jԕ!&_TRVZ/)(8L4Tz=5F 9 ;4TC"d>BCϳQZWysw~nAw止P˽oIMQ.#%j$ɆCpC)/m>C)lwTŜY.:G ۘ0N7 8$j&ҍ_L8wC#S6H)=7}1nW5VzuL[Ռ_WԈ [_ '\3&cx q8iTG+|vl~GBS'-zj0zPvEĜ)=!ܔpX>H8?vuaόc)ժee}IAv-豮=Rry,CρQPmk[bEW#XqCud1+%ծI"=#ZBfs }Z$U.y@ fO|D7I#ѓ(n_&y.,AN?2=ɑiW@I  8fS뭿 RqUI0RS_ay岎]?=Zс%@y8Q>{GXj]]҈Od#ɚf@ 9^׻+$(=Hg3p`< .}m:VӐ8[@˿_IbCl uqhd?M#b&+n: ةOZSl֚>I+ (ZLY]W8C^wDfNE' Co3=̣p鐆bv}s)5ݥl,ߑbFcBМå/1fVW?۞#ַDILFh"d #X2lth0u$}UcA"zL}LCKB5Z* l wdux|.'r^NE'-Sl ldQ9uw;))|!ٷu}YP[<+Z3|c<:k:݁qZRh]|VX$?js\}##E٧UHEJZ <իI˘Ꭾzj,[NO,o1n|1N TZAr~ysBoXp7֭zQ7@2^EI=>}Ol#."2֏';6: %+ken}nph3dRD>u;T~5db9LJTRĦ3d{թΨh oL:8h7NTR6vg T*p#l4a'׈<ɂl݌f` `X} Ճ'"d/'ѩM31<sĪˤͻZtHE`2!1g! zF6Q&Cw;赦4^)dD:t7P8E#G B{mQ:.- T"q`8=C\/׏=i>nV:Ҟj:H$C. @&w>\k]ZDK6'U4ΓIQcIn4ߦU>3VNX?8N݃F(T+i9  L#I|FJhK6sԟY"&xmIJQGЉ_nWn67/ױLt-Rt9]+ trItw<1AΠ&k${P><@˳\ٓyB5ȻKxԫ1~i}o~ #D-&,Iбyi[uQ~L3,^D)I58挻0t6u'H2x FG$ȌcPRK-?E$ZG'nvݎZOmAV Q 4ښKz&ÒM0Ўyj$$ORl]v9GŬ/* vԛ^ƌuZ9yثt1BznmmG4;a;)Y/AS\@ʙQ^R_0t v 8ƚ Vwmm!$_ICkmġm;xc 1_S xI41:6!۞TL.U5e4L`;Lyѱ$$ؐBtw#PЦǢқ0m[W4>ר~KV9I=,a-|ҡQ>yQ=q2є~>FZcӭ$B ;+,8_씈%7[՞=O+O5rt"ƵӜ<Œg)JwbS1 s4Go3ӫ;iti] rp{vUܚN{ .IKkնj 3NaS=qloKT[>gݑd2zgON!>b@|D"= %+CYbp?*4[,A t"r.M2-sXN ըŗmS,#l0,ސuү`T̗fp0 ӠqɌ_( ]齯 wR#DŽ}_iW?}1d0`3d,y%+:m0H [%6*!|0YE,^xXSԍZZ, 钣,4W-UVC_]$0Wv`,pj4W-ދ5Lx詹0ېݧQr6":-(,ɶycDA F>9>JxgI ȡ& iѯ*"j*YԇR)޶QkwG*2jYEd)}O!*K=Q{I5ZLrPPJ%m<6v lbhN K1hmD_$1tc;}ҒWu0VMx[]"t3+zSX O\KDZ bNQ1 ~ {!7^RߥkKHoLWg?>UKeo3Tͅ.p*cݨ HVI >LsC|B~o4HT,n@ 2#_: ^o%0ЍiSܹ5ZBO MHUl<7gHu*9KAml)pxLJ~!3}{ jb[j*-蠪=Qh_Ns 1"AR.L$# ReW*M"ՊP6b\~x Dn-Ft'Hy_3XǾa]1e!b<쩋 p ƀvB/ڹ&ݣ2/&hTشZ?=ld, :Fcr*!z{Ko j}tSj/'&1^*]@R&r!N`EӨ5d3xO'j> ?0 T}pG#?9DpQsv;ݕ_ݩQq U&`jQmRM5iiWzߵ/[rKm2ԅMrv&Hи蝖D jBfJ3C]<ܼF8;+t$PtHAT [JV4{HSfSXTY RJ~ v k>Y[Ʌ_һEM~itg44*|J>U"7p)-y$R"(]@{N`êVUPC'c@W8\>Ѭ6;6j /oӴxg0Um/?;V,tGJr sYwٙa@Bb;GMLx++U&(ye>=:䢭=!I/~cu0To\IuƊED1;Fk&D Lh\KylKlnhqLl!"z_U90=!F3G$ؗ^`g\B4:-/BZǶ3JU$D) (_kK %w'NlPn7Em1~}` Av [ yϦiN[Uf%LPȭ$"yH>Pt3 6ۊZBNB!D]\:bxߗC3:%lIiPZvV0NrP4ƨެU+o1}mtIH[`Uѱ$CF@D}x kf|PϘ7U{j(ǀ?~378ЀuLܾtdc,%rJ+m{}Ƨi$5-PrX6Wbd8Ep DVtycCs2B PnV`aVt[-]eTamtgNicQŠ%ҁG% #iFʐ8k8 :ܻ66G`-w)NWje+t~}X :4S d* 6Sx?޹$AAp߲06䉙ʯ|gt~#ZKa9=/$S#0J`r@g`v;)FИOK{dxTv8a5u?9[ʋ󎏬GkVJh)-rFSyԟin8d,/tՍ.׫=2Ghqk\RzL(鲝q-%q"u a< w CJ lDQA8)Bgֵ]/X̥ f].Ϸ`|>' ͡EKj4h^z7KLvM t/.I䏙I/a}yXt//Grͤ-`ƊMHG;ӧ,I *1ʧu$^^q!):`5t0` n[|ݸBfw?j 11Y4:-,@fx<ǗWOW8 wdj!@k'利X n4Zef |VI&cx/[2AMnޣ}2GSW@A %/LzwAͪ<7mX;"hCEE-+XI;Kby΁Pnh?12נ m$a|/ Z׫GOH]Z_+`2,d[&і#kToFl$W=wv8x |-6ŽC;M&Ț0 6Pkmd:$#H&0JCL`Ԑ?'Ho*u_^Ivira8.7@2 3x_vTݓs[~-tgNv!?\)`\l%eF|&d1l0 !Wl-ʵZSupS歹{3,\j2 `rG>[r.gUDxIWYzH\$/MZe@AǶk[墒_ͼ/ikrU.|.ĞOF(3e [~1Wކe2t`_|TRd`@VH[$dHP]߮b \"n $lJ~h&cj)9JfjDMm FH4&DT`԰eK3Σ6` fpoӚMr}_{' tW(//|М+2ێᖾ=xkctbyloK nSXkW_upgg5]eĒ-;qE˒^%F;Q@[ᰥ# ohNզvL{`.M/3ؐjz23/X1]ZM?h ppd!)=[1;u!\O%Ԝ9^_M%?Δgt#;'#2/-^R-1S9oZ:ZQ9])Vz'BOuP<H3 ޳6d zSTS~kG zy}sv(Na5>A BZzkB*(H ~Y-q 4lE%".olSt> 5F9Ҡ)JjE*wi᠇DB4~hX`J|حMIM5kjAo/Ҹmsܲ ՛y8z{!|aƑENKZAWI,2VfMqSX9\g0SH]Z$ʯW+֐EͻeR¤{-օ/-\ ʵVbyamcSV5)h"'j5ZEV;oCJ$_@N"H:<톲Gs9A b@ڦՑ,}}<2` En7Ihhh%DV,fZk>k|;ikG^<ICu rb8ا鮌0J3S9E쎫8MN@&=.AUy}˖LqZ0`>nOd}㽢K)BZj5Lqg79f(RJ "! 8z-RZ]sBWؙLvMkL.TEIL;j`Z$FY׼d^GGR>$aK[~QG@ I Ga]ίXa0ȉa15>z:oID:|d%)8,?9=u薏:r+XԮ"e ;y|gA5he]Ϊl̽*E IQjmGroP1=0uJ)n۟3\t04G bag\oL&;,M8o]ʹ쥹\ Vע|E23ô7c~:> ̍IGMܖݣYR^U˗vC-@i~ipӉHVW3,0tb[K͢nw@.1ǚ;pI\Li1-c?T T5K3xq8usI|ijK655oꃴТlb% \b!vsh jl< AH^U'U&)tԶR  d'//UiD1 -@D]ZTA P)ɢB)ԪtDKټMo2NNR[VBQ-e-ۓ6viu] IR$$I0vg@3x AӾZYL7~ƛjgA=S[ЇmMj1lUǪ1MɰwTu%$6: Ǫ5ΨS8%tmYͣհiSo njͩʓM 8Y q67#oM>=. 3h"O/l{o$$g(Hm$`[:((o3o+yłĔ&qfF^*1Hй(z8U0Դqg0!`]RnD숐4(x&@ʬ4">3=ф^E{Y FҔ|Fj]VPD~b3ҞM:CͦcA E uɣ6U;K'#_|; ,u|"#i0Yq&@f×M4~CR.qEg)IRwcpg]"Vv!: ړ۱Kce4;2a"d6xH$ϘB'd6jƴиiR-!pX锊@qI0ȂmmCH"u lm|=p(.ɷՄXnԇN8:0't$=)nIC񘼢Wnx<#ݘ *-eI jvEh']ӎd.$o M2$"|Q$FMZsE|k??5|A%an9^dSևZK /vb(:jCO&.RJgG]; ])&kFAG?.nQ0~l 3Oa_wIsnaZbR<ߣ":Y4>z0ᯏ9l+J[*`NATűE&KGYā !za8XcN*ڲB%w9nB$`AÝ<:Xy2CC9>| jrrp禫I(kmtz1&[O:)HD'UzH5I1ԑ(D{ #+%FY>{ SNGPqRW:V͖jtT3-]w$ :j~{Bӌ9ڑd7ϔOycTleydq@&q<# V`P1ǭC.E6\3Bb@t,6\2kX3)S;_Y4^E;[|Xe }"OwW~]V&:K"uzWVdp+1-zXGacڽM3RtQJXk``ƪguTsśOI NU]CT9 ]fc]80aPy4%{]t%gCS26&de>%cu,{ZFJ(ǫ*m oUToGf)=Qm4 hYJm_f҄ :RZA*@ \2B2(ҽ3V. Ir %h5/:j䚒gAkb|CIjcOh\\]9>1id{3ܓ֫6vE2T4 Y6.Nֈ](f+UC3cojWhn9]]^Y$]"M|8JXfO#ܷFe+ܣŁk _{Ԅ'mMg5qv#rAyƁ7}wGdcqA F*EŁc ¬u:xfͮWx՟莏VI-~M]nos!gg0 SN>r[(|N;_\u—)IyyJ aɮ)t7όZjz֪@ХZەFC=U]v $sXɮX;cr2m> >RE1q\`VX,IMP.3ڗ mqzgZH+ դ&)7*5=YdT{팛QoH.jzUd`'jԪZA)R p3]'jFo8.Ž'sNy(/o?t RgJIG}E-!d^}rxokR/`H¬U) ӚNI=>|ocOdkHH_GÚ9 h+)z+3 vi,)W41KXi˧uSCPD&[Iv79B\h{_M2kDJ#ޥmf˵ٔ|TMz z1٠oSrQ$.R=f :4ь"d|``4ggvGY}̈qvep3f줹ITlO\@yR,"@O܀$_ $Z/HƯհ:OfryT X<P0WL1xu@] j*4c ; ]_Y6g'yxuy->ٝ!ϵj(Ξ.nZB+|?g lGW}6B{,b/QaHͿه[3ؼn Zc[羧InV̻r= ,r(Щ'ڞLH:Oѩ[e\{mJk/ɴ(6Df#WxuǔB>*mh_v\j"^L g\uc35ȁ[5[&ڭN]:]I;0>YʈD+Nz yhƩ"u+3o%6DG w9#WSal k `oZ5ڜ ۅ:3^,ָppU8CVgiBo}-Qib(|ɳE97:oexW"m? ADtf&whֳcˠ #H"ug>%!2lWVH&&Sz+ŵM<,lY=]kBᗱfF T<;"rw!؞ QM߻Lgsg'&زVmiV;*/v d-yV"Cr3._8enװ8R̎M`4)ȺnqݜY74NJdBR\I]<=e>.Kݛ{3)q\njʞyc˛ X6:5:vJI:ldēБ'b*XgSO[+0~J$.UNX}uQ7[gl>r@y~%mدydۖ qWm HyWQ[؇k-d/ͬE <=:]92U>4J"h [,1$hmIU'd4&iO.9U6G/'sV_%&B^]V nos0+q`IIKY%Uɝh- jOoBP?ٜjB@nGz`W9ZcpAUg'Q+85e9],nǀ$3Ic`$Z:cY$=}FB< um?Bߑ qkP :^|æM"gL[̯y&@w`۾^2Ip3VNC> ADFqv6ffCDB4`c 9!Psd7!G:zBm6-x6VR_\J@L)̊NY1Hwtss:atv@݉m0ЏI9lobRi6QTWR,HbRdÿgȃ~i/X"{L_ +׬;Ӯ7F-j^ e U6꽎RUxivP_]U|tR=뻒[y?C}{{zmN!As2MgkJys!kCCfkשK出h%gy{&# .b|ܟe,4,jXj2BGjcJ.Zv8uəѹ]S@;V8?=WWZR}O'[rF.%H*Ǟ)`6WaLNXU#3UӪ5nXϫR"]kIp$;xـ:gۚAOu?s~"G&N }oG;_// IF2*wR} :3h*wr㍁VKd%iRqǍaMud?vFjM j<ԕ'j0Ŋ3NxIhZ@Kᶊ}G9u]Jd9x# `5_/I^`l]Wz[9h&g. KI-dsHÓFP^خCzTBDr@V:x{inZI5CBA 7lKh{EW(u`;O<Wx#yЄPT!NIHBV#9a P8E>ꉼzI}s&v晖FdmOoP`F2-VgK֒a4n4{nG A:Fmn(=h)F` @&ѶA*҃xԴzY"F`Hqw\SH09;IѶ4v ų%tZZ}>_A<>@4v5ӽ"5sw|1}L7higq0g)&:+ueǮI54'Z ?,n F{p@.獨vEӍ4*ɑ#|+'%tjZ'>=MTN$D')$Gpuov2-AI E%}OXyiL+Hj $/94Ȗ]?!9;s~BL\X$'OmֶH7 L"9 u7Y$}BH?O:7@IMDK<چI& ?X*Rd53%eQ-öɆp)\q-KEF72! @քD݃zKScۤq;$c $(+#|Zɲn uBLsEh&JT#ɸ4J xG~R c[1 ,fG'bi?ްuro`z_Tʓ= kwHwa&]<m'<7l* ]ڂoVVU bU n,8gOh 9U>Hu9˚ZҺOݻ+BKY=Ê*~OҬlAaIE%e"E)߭XL j^3gRڨVV3ƾ̥P]?XnIQ\^B"{Ӫ6x!]SG?QwZtj-* GqR{\*U5)2UMCbTu8bJ2B7&۩]ȟ9%*aj7cu_.'d(]]ImWBn@0h3xD:~n\9(e=|CQxɉgQ/D*wnxHc].&SBU>KV\[t7'k d$ +^v%}۞@ww4H],oKjS+w 5y>@MԼ; #UjQ\l6Vu @I-3 ޘ21iM"^yG:ڈ|m~8;?߉ûy7Ib2#6L!TB2RuJAr S 7ô"EڞF*Z~AgF%+dg[J0u+* )sJ3NE f4jq3sVOO[4T\>ޘ)&Q'ş:z?1/E-=aHolunܓ[$bZ.|c>;{sfHN;9Gw_b]O!oQǽtc%՞/50b~hUI^5H&.ՈLhт9A^'bnat);|fq#mq$UI?BGR6_Pǧ 8DPd^%IsK)G\/'J: wWB;YoWJo7, A`P۽rr@CC yt5' euai`B ܛC<#x.j=A[w6>D7CצHi+"\f#Fs{]nkmu9W?+2 M蜗1`+6%%V..@>> d/t"06LowvYMfx;`md T㤪~ lBIu>|x>9ܮ|%)f'NJ5clV-ť~E )ߵ5}W ~JZbD3&%vWvG˂4-+[ Y77ygF[+'q4a5ﻇp;nOwgAθ9&]SHLƌ6QjU:hbhGszC4Xz'đLj+հr}P־^m+kLd"ؓFZڅoX6Y:Vpn}]uQLnIG9EW7Y ]{[B}|ZBRS Q' C ݑdGm܎[QZ<աw( 9[MŜslK 4Q֛s }\GXgZ٭v ib}J3壇B?[Ln>Xn$^nYVYo~؛gtg?>!SG yր[ug6. ON,)8$AoAĒQӀ\HxY{#qeC_a}/̑T Y_uƏhv?"5da, Mhu]=9/M2 +HJ88_jtjХM!%O1v5쌻pZEN1HNSV+0K >k<7 k z z%5ml*c!IƦJ$ 9&(,o Ȭ fVO@x.c\qcFrWKg}D$/mػE0J`:+*6ZBA %) }8tl8|{29_Y3+fGYi8] ǴJFiO:]U#p?`ַVAőǠ} E|Fb"CCM N ܓh5͛ $=M=D=& H.y4[%WPgD+2zW~$'EiO|O&^C\6޽ţ]lGR֑d rgTU.h5慨z)yJLHgWn{[V%{gdϥhD+܉s@tײ×?2w6X۴a@ 紘Rّ?zKm wcHBl%%&ώ'PsUfha=Y?}A0HϛKrM^&IaK@x'`,eg^&aV}튖mP𣅰d:Hj/QҿQE&\]*K};`^U:41BV>GkzqĒuD8!q%Wo6[ $5!ct׿VZS%-Wl׬4UĨD u)w &7uvEV`arITO щ.ՇbE;zI2*LLBuUHZt>!bLHD-5}'͘i M鱚ߋ&sQi]s.\בK`goP\?OhKX7(657w7&u@xXֵɑL䢿. NB]kr|e>NͧhQ@Qkϔ,}3MjI]M?4ow8::tHzTcMijo~?vNhqc!2}Vz N}gg@V-MN黱3rM%{9Ȅ< YWBI|!3Q Y++AjW$?Dnhl_ 5 $Fϓ4h{<MTmv4 MTՅxZl؟R[?b_XW!=hW;Vu}QLR'W$ EڏJ$ÝU.n/(AAG@4))Yw&%9*7Uc5hHVQҮ)T諌s յ(ࢽnh̞ɤMJ^%'e:TAK5&4q> zR+hvF`H JZӈg%6s _bv,@DոE0v_l0ڨvo]rtf|-JbR` %Ӄm&_ogz/2Vcy}~ 3iX8,TSjCD^qԅBAp|z|XK1uw8e;\ v7d 0ۑ /2z!- z:{H~UCq\ )N,`GaUl"%GƖCik.>XRVHj<(CX{r/d_Jk}e]ֽr~/#69 =ML5?5ݟ\@oDIvdOh)В sHcF4n֑mJ. ,Qk"ekl־%cW!c[y@]1WJhuIH =U j0$WMSiԦ g(N,V~É|7ωeRLRF(Il{hvﵓ ;ra\ }٧};rilS2Ӣn@6#B$@) $J>-@{T9'cQgܐvɎF]o}*p<|s?3c ! wT߂ `A:ԉfZkkXN޵ aFt&Y_6yY&1fTM>vQiМloy8X_+hZn,16)&Mu WFZѪ6 bߛ/1wjq ٜ Qrz09|Ʌθ]`q3t  QrZn_ ͝Iv}I/@n4CjZ>JU:=*5iel&3v3r\>WtEDTZ O,ĜIO%Bߔ<풃uwIO:բ,AGKvvR2KM_&iSR{߇˃- cȬVC#TpgaL\@񣖆^4}r)9:} κ%7{ K0o|H Ǧsړ+6p<kG,en|&~cHBdJ*Ty|Z(j_鐒DW@ )OjF_"ޑ~bO4X7m/?¸H}{pu%\E(Fgsl[ߌARsG.l>}J-}hv }=8Fc%U1eiǁ.+N[05=<(b_C4C`iMQXIJcILˣ4,Oq@3! H$>o ǟ=$O܋ׯVǍqPt:CZ'C0K;mz^0R~o1~t26ȖF/YEgE=|+u>vm>`Z]Bapo)88xBN>Ƚ\8=cH-L+U~qr''yc fD ^X0D_N_Oo' +\F5^sџEL&6B4mfdur+/LujLt[c) j 3Û 5tVMO1Q㓶qɶr%b\A R>#Ae2d/<'@5+ A _b]۩5 yg$ 瑎ʃ$Jݕ3X_DȦ^߿nL"9Y`9tDNx9jtt/cѥAvjcgP_ġJij k U6;wz,I&5w~6UUPHnB}4w"]Ā_e-5oi`ǁ?&uH6i=In1hq_cL0d*3ضK -W e30'4h Jvz]'0OD: ]L #^j2DH@+Cv]h6G \!!i9CB lOʵVUYso␮;C3P*i[iK[},7?K;*߿Hqk5 5aL_bwZUCKB^^-7ZU0P1E&7`'Ysh6~ rU0U7򂷀?9ðto#, qx& /^ 9J3oRg 6yR .jƤJ i)̷F{q5zØs$E2d }iu"G@XHg4ZE!44u2׺.AW~*Cp;a*FJ ,:=VY5L{%Azz}XL ;ӥsAFG^mݩ}.Xy@Դ[\3:I=و,ڰg7$!SQNF-)kR^o]"o}',ߣ{ɽ%繦6<\kt{WK ~5 MH]kAOtd괪Y6{g̻@,LǑ<;Gq%>b >9lwzcD72JOȻKr:Ͳ 'P4t{3Okr@&yB#ExA%\t|ҥf]s:YJvI/%$35,U^ޑ|D\,,6ؚ^XN@Cd[ApWh\i񑆃,W_ڊ{|InC6sK2zAJM ~O>:d;8"a5U}UR,v0S|jCRz%M_oH7ɺ'N ssh TiA2a1e:YM'ɮ]Y0{u$ A_==Qj 4 = i6Nf*Ň2%eΐ/Q.فY13ب=*Ϗ6Ll[aGdW5Kf0b/j0z@L=/M&}bn_{toEx esKl{} Ix2ȳTi|a~iLgSHގhYF/;h8$ Q<n6KzΆKs/+_ݎڐ_А!nKɛMY  0 5SpVLۦs!^ ZaV[>D_pw0h5@BzY-7f9{ɢ "$zx;GaaY^Aضp㺚LZ8|JY*߿pqISL~ֿvOCN-}m!ALq%c|ٲ=2a1{YmsdVE .v310'`{ĽDf42o%Ci g&7YGO>ޕ55gTeq(PTjf!ݖbN(Jy|'1ܧٗ}*lNZ_P ~%磲VΗPlYAve?lj-+-XU-@pK^-}lЅ:#n)$*~q3=p'$$&y2=>\ *FCkY_"1>:bOJ}9/T_ {n?OjbL> ]1o%} ^#Z [1B!ж" :i b`.r KӀ ewH&W:%{P>#t]rvL_Pctz^W38Fs'o4.K Tbg‡&P:G|3!$wM J\W-P E6&ED%h R߅x)4:}\"Q D*b8T"̨~QƻǕgCf7Hj l;^.|?yc$=}PhzTa4Mv_}wGC5䢌,J?܎ED+Jjn h ̮C؏L̵OS*#paC,,+1V1eX |zhXc$je5 l2Ď>pD'.KaDɦ}d$80}a7oϥS 8&"t2eaكG0eϓt,@HʴݥLB/pm1HI #=.MsىD[.u87C)iD7+O'ӕ Bj~3V 9Y1')r=g#Aʝ@H/+rTpk;zBeoYk[^F3&{^gM}ZmU[T9 ΃L$^?yB^8. W4p.4QBU[+vC{(#'$ h,J2`VM_ժ- ?i9LmK-`"[x2s=?mCҒ+KRls{GzGr=Wr|fMCH햓c",GO؏"`÷96 37F́<8[l9-:1P9 s_5O^h1Q%Im#S;D1(6(MpXɶ% uJ,*w< a,gt:ת>oXfY]Hol 5PY8)riajv[iihXF~ݽX$?xE+l0dCҋl#f2LX\F)xjմNaRc} J x%pIkÄ|67wOsR-i5|n[U ohܯdp 8W_Nȏ=z̸6ÖT€)"R#BєQt!>+s18lR\f!mWFO j@w _6q#X'6A n$\=YJ۪v+ӇU+uQ>,٩jUo!V%zƽ֐vlhR id8 o[?~t!*E\SIqd@D]VrBqSS,IL՟ݗ>*f|C&ي~ ~xrJmTB s0SI[`')%9Z[Bsp ~ }s<.@8%W)0Y^{Gio|]rH\1O&HoO/°,֪YH7-zf*D<:=,Nړx(=S3ï}{Nӓ=^ )+)`]]a;Uimn`+݊ī7Q RK.2~_Όl~O7X ![֖# M%iYi:bu3{[1z!@܁%_ ̀LW~ڰu3F/D_9"˯ =ͨ"T[IEٮɁ'bt}9uH: |+J{_uդb@N9< osKQ7&c?<YY`4zz#լV|҄QLr2Q?E @}ʁ&:ѢRu5CcX 2GrOMl,JbwO}"ۈ|y}l{EβVƴ-kj<+f.h{bBu1,M7x\ei=ҭtp<3]8J,T$?Itlah]"A[hT ~>n"o# eا9X,Ԛۛk3`v=M՛G |=-êu5mˇ3N)DrHf@Ng#r=F,+br&AJ~b&N~{W>x+x\oO6sMTL+|h+Q#vدxհV13]ZцH'L*H{~O;$bB\9+g/aLG*ioհy ލ1z46tRqzW0fE2ԁJVb2IE%Í ,Y'@GɆ~KL|30|LS"^!7yV^jht6d M-^& ;t8,K#r*(/hF*N|1(7H)E]W"G>4ƴ-h ^;;dp_ޘtt촺kuTsH21 $gqxp):.0yQ mT@*X{[ 2-\| (hP/?[a럲: 8]m9[P\~OV۾NoAƖ4?GC=Gz<)gl{X|g *TG 7kt mSz r=RB;f.ƳӜRReE*ʦD 1qEo+= Pt6CkMr;m9_цK4 jmfKR\cVmh-fWdr:J|7T0[BmuYb@I/& ҢU "ak+X(9.d32P\o}_k L(#{D]y$n:lW)iU_J:-QEi,RҊ4;B*fާM`G =(Kcqx& (#5lRKv9zLSMlbUJYlqM7v^I4 }ﺭF1)Zۺ;3 *ΠY jRu9h)T&c5q]:U2&/pi5j\GM ls/$XWV$ 51Ng\V-/jt[ڴdT <&$aAnPիm,";5Öuhu֌Xo[q% ܹ5|?CMR3H05U^vE K)lDYS9p۶󵚍[D>@ŎO>pPt3Ls-rImHmXMA>81&0x{9]:MT["!K>oc.ɬQπaa2PF{;J| 3뇙R:LƭjkB&7 zz IwTA-4f$IiT.[\Gͅ|" ez\nԢN 'X9:@^,&GZ;|HFUoV|}U+:l&?.K}VPS\[DX~,ghH3D.i>dvu[mQcjM&!`cZMhBTIR5եzPxP8#}ەH|T]km"&Qv|+3?O/~<6X,=xMeF&8C0 H8QjjhfOU.Ml=٥.XdJ %xfZ-&$H Bk+5GyС$?rqG|:Ev⛖p oѦ2#MZ?LgLHDҙZhdq-f4vfoh ^W8ە:[*쭈L89Ba>b4_$%.(||KwF5fԫ2Ԣ65>|m~5qI1!7ͅlgsh$"'a%!NߦC)>,!QiQ2ђdh#"AQJc hO:F:6?КxLBWWYxnT aeܛ2^4̞/v(')<0tS?"L~W}En[ffĚ WؙA7ZX}00.6kOfÁըk#05ƺjtZ4)kV| } dDOfKj$gOy1$ <¥9V%|IbO7nC)m`JZFP\7(CjUڡOfOj@|R^g?*9|&y6%AFI^odا\[3+7Ÿ;5A EѬ몏dD[wvhGzڝk/g;1`K(,BN=KfZ=ٗd#WnL%Oc;[jKԳЯho=o> O/Mڝ}<AKQ'mwzk?Yb`H*![_}xB۸~TsTO8)!88v؂Wetj1Ox"!2@]<:znFMOXii18:Y{uX郳'79uK`#怦. cq&s,e1Z{dxz'!8DME~.]=y"{Rlwh\b֥Fǣ'tj^dnYFGg,25;hS2;NSM{ꁻSMȢPZsɶ f޲W~kY${뚦SkrF?-RcƕFuS5%7h5Tc6^Uƃɡ Ƌ!>uE0'9MO/pqtSZܱ.Kj2-1ur5Rێ^Ljwn"@~N\V6hl<#vs ֳHOU~MN.'y(T[D]vBݩ}-!]3VZ^5\ .Y8K;-V~zC~^>A{ DY0|BEo%t rHsڂЖ㭌`oY)Y@~4h 7\$ȲgkR' |x\I^pG#G$qE"m I$ 'f@oH߰:MJye{N{8T4N1r|3JI~+穮\ɆRag-&熺Oi()Z~ q7郻!1<}k{<sl3PJN+ IA\\1i穻hdRš.90͜M YۯOǧ$1.UB0k,;vK;H`yzr`'!i CG,[ _nFaݙq2FB"BH(_b?\ l p|ZvN݆6<ii~3ĚgxVR iTPy+~^2tJ8XhaF 0WS{;\IȆ7K4II{$F#)2u+"kWhr5U{PP&HUHϴ'֮hmꖌ$WG-|![CfBjg%nO^e@9t_Iz4(l{Eʿy(WXB +Bx>\&J7$%VwKa 0ވ$'J8#)d}96p\o49|ċj*Pyȡd_C'i ![V VB: iBZ;.(o#pJ[ \>1^E]{_@V=3ixR#iMKEǥ&?czu+IV#D:Ϗ6XZ_;;Qϝ\oݬj{m=&l%1hoc>DX}7y*bq7{_k-IO2C)$[~~ a~P ?гWGŔjO3JoB 8xtF[j&W6.FKuC<Zp׎I@]w=lPW2$PDQa?O4I#LxA̹ZVMِ$=.}u~qh׭}ul:_kOft! 0AAl{I_!Ӯ!2u8Y4A_'B@;*U+w50ĴnW5afc.L5%`|7EDfץiU5+CVK.ImjT5j"9|LjMPI@-&OÖ̸#Zf{%ӳ'&qQ- o9ix3/Ҭ?;+;r*``⪎3¾Jr ~ͪelgWGKZ#o0*O6 hF#_o2K_[Ι/;VON<[Q.Cz)M̸itu5I~F}@.~v{O$Z aIF!%IT$GJJ=[C/w@xt"q0=9C ={J+`O9{aZ6^A0ænfF#ʐ +gl1{,.SZEq:tG9QfY}eTVeVÎ=~Ҡ 0蟸7 O$#i,@FTqҟ63A{T_u$^N%:p#}q(XDKQ$$l[Rxr0Ui}RfXSΚve@pA/ZRrNN KMG(Z޾_?̎tkuQmֵNױZV\;5h++omsfvRk'FU $"w?}cC3}xov77?Rs`/˳z/Q-G`OhU?/Z/!_?_F{s61#2Bl4e^5Y M]NN5 By Q΁Ƕ.{NJ=!dHv啃2!2 Kr79[cw-QQp}b7ȝ@5liLGC~O0r{G^L2Nw}ae77ֿtP`H{R/ 3V6pKũ_@4k?x]g]&xؚ7߭Μ}@w.ah% ʷ|DcjjzMM83|4AHAv!nAݨ0~%pRWuLq=_|Q\\AzaV"Yۼh17YH{!ElIN]q#MζhY"&7yV Ju'oK'Ŭ0@OHzG'.oK8mb\ηf5(N/#f6jr^OyrW|tOGKvCj{I37tz='TL䉸jG#=2Q0G?7;7ƞͧ,%XJ}!y~TT!qF.F.1KnHnea'#Tm̓S"il;/&߷㯈5[?j8,7fύUsVQ9fPak*g^Hknz-3. {&ؚ 4g*08;Whbq-?$L:ԅ-N"4GP@ߛqO:x6b 7H?ɧ8<ުD.̤ BYg4*9 ]>/,GvfJz!$r.;Śqs1p"f ]$u I<b4J&e!V^GәKed-аi4HV1]Lロ] :s_B.:w%'<ĽDMv<<)߳U*72xJT>cgڭ V MW1K٬NNg_/XCpP`J Dt0CNJBT,wD}6J6j-pÓh}LU$!D#@ڄ|Pa A!(>ܒĴ8 uد?īAǏ+jC!_[ѡ,(Hn>$&r?Mv"Y ɓEެaD OJT)dtR)zՐ8&o.wzdn.vw3͒ҜUߗfDF\=OC %/5d^C+t>F ʅ-ɥu`c%;=|1l^B5_rAԠ<4\d/}y?c2ph)zdf$1eWpfn)~g;t#RPr[_5F "qxNcjȏwBa|{qy+GH]@ECR!3&|Փpɲ\zCsh^Cyӈl0q"kM_سOӅO1`SMտxss4Y!YWq%$  /j_%wSM_GYqނg)aSrtJ/X:9QpXeBd y=*FIHLN:z}s^ʝ{O>5Br$i1rgLYDg2 Q -."Μg˶Wbq$w Çf7O_U ha`ZJL<4g z2SrhOo>*oӘ* /E=t~߿pPȷ‡;CBB5pLxFh^X[G=oL=jHmIH @q历'e]엲X 2F_Uw^4_2W%Iqf@}iscNV̋Ɛl*Mא L/Rk2QVA'7dRUxh2/֓~NEW>=>mo->g/'J>QƱΉؐĎIH KOt:=Zosi,vlܳW1/ ~1ݍjDƶu}'˦sEwHd_Ԕ5hTf |\1Vc_켊:vW;{)F)Ҭ76|=o 6̇=k?Upf'Zɖ.pچjtb\,chcWNI)T*3šh_ž=1""#S Dk,#eqĈq|Rˠk䖽a8y8ʒk]BWhb1I3::PE11߈h\1y$Зw6gM"@JADo_=\%Fq]*۸\ NgEA |Ek\cm]B+~FD@0)Έڤ qӿ xfXr$9PD GQᬏ LBcYQulR[qbГXksٍ`M0x }"[n:EGXI$]Ai{Ϟ_L ^& mz?(=chv_?O)QX!y;[*@B.0Ifg%SWn#my R"ZԽ4V\3®b+kyeSYIFX3#k,Ayί;7wa\isyKPGR$bVHm(Lz_>|vq ^Q<ټpo8 anGl4^⿞?(!5ʚΚ:iFqJ|~+s'd5tI cns[" V ot:[CcU.{u3Q}jBgj(E~9^E#]:FjrzC_tPOQMQQB!(Q^#u*4*[e.?24v.SBL*]Q&0W\ 76GpKAzu찙r9c(/[Q6~fIf8Dq߈:$xS@JguX1*4hPF1]CMH!,@`S=o#F`*7;]UgI@ԸTKA GΩ sR“ ln6hI"I.4p vIqyYEV Ci Hq5qka@ cVT '|(%w-Iɪ-B#flo7-}~.nEi:fUp!qW~"RL9aQ`$:Gjěⰵv[ruM _AX0zoy,(9M7"m:7!Oك116ۑ${"qErq J3g)ZM]ݪ❠[ l؞ :N5+xe?1UxBіp[r{ %iv8٦<|/+$34aEG[/r } ~x![_u1;n% (F_i4?-ia[xbindAimг JiOH0ƈfK]`_Hqza] ϿE#afzhKw#;y1o8%Y}hK tSӴryEFqq[޵ڪ׵L@;ۿ={k]ɬY 7LF9iT#p|S6`0є-Д[_ļ296Pr8tNwM>8KsaKA/"\@4vwwmNFXx=B8 !:}r3#\b Q>fl͝KwahK8E R\x@`HLikZ ZO3"=}!#3(VdHvi9[ֺ-6d|.1ҹKj鸤G$w]^_ bpU}1A3-eQO J)5ua3SZhQ sAW~I(VUrp{͆.@սa`HYBn";PDo5о]u6ؾtiٺR|gOHWp<g #N3To:{[ f^(s@<2%mmJ #iuȃڥMUK)Bdbq '4O]-M 5I\T+/brtS78ll}LRDTbL}:2 /K_œJTdMO|~91syk"IwbWml1QZt1}zj~QW$̧+e'}H(2:4x R6^zsIϭd!3?;c͝:he\~gᮛ*šk#Jjt"'Vz\~ qjÜ_$x3mگTZ } | ]얹GۯgoS)x߿>Mߥ3x K+oӶQF`y9N_q*:)x)tk]/cl싫~ے*[U<>}8+tDͭI[//eYwApBcHx 8J7/8_G$D :CIͪ:v_\ $wbMB8L`(2x 3=sZ0vOŚB"J;mPƷ"ZjTp&pr[&s<&iΏ@/ Lv>r3_g;㜜}We^!_3HWXc/LJ}92|$o+-u.^m;'^Xv&gK'K}\Gȿg/y v_EK7+eD8醏FFΙ.Z$~/u2rnEb/5M=3o1Yܒ!hK s$G74h-8l':S .It+6,,zsΣ"["H"L]w>|9TGnr&5{ئ?Dj)@a:&RULa \ jC]1wꊲje5 -n4?3l招ں6^ߛ`ٽ=ܗ)^+5^C=N>{ |3 @{ z W{AO3L˖;3fo/DG&Xl&6ɨS9dH5[35M#5=K73r[c}E|i&^H/>hlShKSs ?d՟_کҝ;pl"j Y;d~S¿II $F7}8--C"@f qFYbp}r "qD: 0\} d~hKo=:Ōɏ/42FH I/_KW8>1CDoAk=+SX~J/ʦ)/4_gb #wlk}I*wo۫n`n0\wƙf^X 8i2%Q͏EH jvc˲xm<<=Q{q0ϱtk#*qXOYbvs_<+$!1@M!znhHt+W+>< .v P7*lwcK,dcc5^]+! 7׳D% $f=ǟ_t!DV7!AIND9' "D: ⮿}dlq#?Rr>fllw^?Ж>ɥc/g37m&8MVyj|+@@LMi8\g`)]_΅[.VJ7SπWrؿiK v[oq޾%**|[nʓ, dBzpHu}{XQxu.X|