summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorRobert Richter <robert.richter@amd.com>2012-02-23 17:07:06 +0100
committerRobert Richter <robert.richter@amd.com>2012-06-22 16:31:20 +0200
commitf8bbfd7d28303967ca4e8597de9bdc9bf8b197e7 (patch)
tree4adbc6e80a52d85b96509bee1778349c71e3c8a6 /drivers
parente734568b675c985db2026848fefaac01c22977a5 (diff)
downloadlinux-f8bbfd7d28303967ca4e8597de9bdc9bf8b197e7.tar.gz
linux-f8bbfd7d28303967ca4e8597de9bdc9bf8b197e7.tar.bz2
linux-f8bbfd7d28303967ca4e8597de9bdc9bf8b197e7.zip
oprofile, perf: Use per-cpu framework
This changes oprofile_perf.c to use the per-cpu framework. Using the per-cpu framework should avoid error like the following: arch/arm/oprofile/../../../drivers/oprofile/oprofile_perf.c:28:28: error: variably modified 'perf_events' at file scope Reported-by: William Cohen <wcohen@redhat.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Robert Richter <robert.richter@amd.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/oprofile/oprofile_perf.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/drivers/oprofile/oprofile_perf.c b/drivers/oprofile/oprofile_perf.c
index efc4b7f308cf..f3cfa0b9adfa 100644
--- a/drivers/oprofile/oprofile_perf.c
+++ b/drivers/oprofile/oprofile_perf.c
@@ -1,5 +1,6 @@
/*
* Copyright 2010 ARM Ltd.
+ * Copyright 2012 Advanced Micro Devices, Inc., Robert Richter
*
* Perf-events backend for OProfile.
*/
@@ -25,7 +26,7 @@ static int oprofile_perf_enabled;
static DEFINE_MUTEX(oprofile_perf_mutex);
static struct op_counter_config *counter_config;
-static struct perf_event **perf_events[NR_CPUS];
+static DEFINE_PER_CPU(struct perf_event **, perf_events);
static int num_counters;
/*
@@ -38,7 +39,7 @@ static void op_overflow_handler(struct perf_event *event,
u32 cpu = smp_processor_id();
for (id = 0; id < num_counters; ++id)
- if (perf_events[cpu][id] == event)
+ if (per_cpu(perf_events, cpu)[id] == event)
break;
if (id != num_counters)
@@ -74,7 +75,7 @@ static int op_create_counter(int cpu, int event)
{
struct perf_event *pevent;
- if (!counter_config[event].enabled || perf_events[cpu][event])
+ if (!counter_config[event].enabled || per_cpu(perf_events, cpu)[event])
return 0;
pevent = perf_event_create_kernel_counter(&counter_config[event].attr,
@@ -91,18 +92,18 @@ static int op_create_counter(int cpu, int event)
return -EBUSY;
}
- perf_events[cpu][event] = pevent;
+ per_cpu(perf_events, cpu)[event] = pevent;
return 0;
}
static void op_destroy_counter(int cpu, int event)
{
- struct perf_event *pevent = perf_events[cpu][event];
+ struct perf_event *pevent = per_cpu(perf_events, cpu)[event];
if (pevent) {
perf_event_release_kernel(pevent);
- perf_events[cpu][event] = NULL;
+ per_cpu(perf_events, cpu)[event] = NULL;
}
}
@@ -257,12 +258,12 @@ void oprofile_perf_exit(void)
for_each_possible_cpu(cpu) {
for (id = 0; id < num_counters; ++id) {
- event = perf_events[cpu][id];
+ event = per_cpu(perf_events, cpu)[id];
if (event)
perf_event_release_kernel(event);
}
- kfree(perf_events[cpu]);
+ kfree(per_cpu(perf_events, cpu));
}
kfree(counter_config);
@@ -277,8 +278,6 @@ int __init oprofile_perf_init(struct oprofile_operations *ops)
if (ret)
return ret;
- memset(&perf_events, 0, sizeof(perf_events));
-
num_counters = perf_num_counters();
if (num_counters <= 0) {
pr_info("oprofile: no performance counters\n");
@@ -298,9 +297,9 @@ int __init oprofile_perf_init(struct oprofile_operations *ops)
}
for_each_possible_cpu(cpu) {
- perf_events[cpu] = kcalloc(num_counters,
+ per_cpu(perf_events, cpu) = kcalloc(num_counters,
sizeof(struct perf_event *), GFP_KERNEL);
- if (!perf_events[cpu]) {
+ if (!per_cpu(perf_events, cpu)) {
pr_info("oprofile: failed to allocate %d perf events "
"for cpu %d\n", num_counters, cpu);
ret = -ENOMEM;
.:'ߖ>G+|m܎o]%GqJx,ǥU޹b풟>]_'E9^-aMǔ䍶[q*-U?sZ=xK T1P_;5:AZNQG~]oCa*3NQ/m3}Ve*ܰM?rO˗/'me?*P%ӫ-~˻[†ΏL@ؐs_p1dC{`Hi_@@=۽v,*> г%sm$c"? ,2aВ>Gj,2>c$>4Xbą8ÉQBd { x BƆ?^)aihhhU1Wmn뛛cH1VX#yr8U1VFHbcV]8VH UxR_BFK"(Yl(vmUUmj96c ))h8'{6];րNM:c/Wl<wRg).e$YB[f栤Qovo+[d )%le+VS \0ѷZI_@ys|ަ͒@I7KlT>UUZ*S%*rv]_L1/:p1Ir*^LJF'xJb@ie4#9tqsmyk .iP"9F7`)E0CDF@J D P( TXEDbJ'7:@$A= |r'Yg. 1UQEi.Y$4 G1hvDZ:f zߖnUDOߍUz"~O/b}lӎxEK5h8^-\o -"( 08^&UaNG̤'\a ߯hd( oG٦-ɀ m\$(@>Mfl102AcW)/.jv_FƢ?OVmtOf F!OXƂҾORq>F57d"s\@<)2IxC)0DI!!5EAev@4IʘKXFBK* ^+0=^c\f6 pV'SPHz]!!E{N?Vq΁v4'ϱ%&rrgEL T<(o2K_`Oe,?ocw ]gOikur6* }9 yy6qp v_oR~.N{7G>_w0cuZ6] ȖBQOW˫+[{nr@0_*t}l[xC1^Y?|)?[ֱqd"Yx0NyF2G?*ںwS{T.EJDD q0A:ov D}Wߦ' Qj 5 DZkiYh=#r`yqEW >nYk]l~wNg)E爷IToשӧv#Aۚ=<LCП>E"4zXZ1)8ߡ;|Xnb&W^F5<\>:֤&2c51aW iJ+-O<_ϹN0vn:O^XrV#8 ԄE2 9A }# {Bo>/Z{u2}9A]]mhڛmxGx܈lƱ`Z[x~ fnB**j xp.l%T*> _1?>=Yzc}=Hz}5~=1[k 񟯓ToN7_kYp,<+- Ia$8G:Yʉ/;wsOƜA K5#ǏF3Q۔^`3z}~~Æc*ݏE*o0%ڨܝ05J`8/M?4oCڃttu{;p"f:M@t6}+BS.`a#|!qwv[û]`Hk<σ-_O!wxy"jj9g'4!TpFpXÊ +i}fӝHn˺t+Yն,3!oӴ2*|#2 HC.AiTp-Q5 bBj[%mpFZie:2 E)AW4$ vHdC3(3&.gR)iJ3JTR)h]@f`s.y AQG: ܨsQß;K0Ig 䞣:М[bXĚ `r=(h~vĹ ɸfy!xG;b (vhIt}T`+<цdEcG W5 2rO;KsB#y$O(J=!.Vr ؽW`ޢ%R5-<|#+xZ(Q0靰Q`3<:]n1ĬagR¹֒ˡE,㏷{zH\GK@ H?@wq Y.n_ O"Fovǵh;׳ylӎr㰻>B79ۛ ܴ(.2]~=7קN=3A]!J KD* kZ~;Ke4rAm\H!gx"A>K[%<$P9BO7D1׶"ߜ-ko(wOGMLɶ<.T2ϮXpvNw]ź`S4k|sYRW᳔v yA=@1׻^˔q@xx<9WS}G$7CG;0/׮vlt?;go6%6N^:tV fu4թ:) |Y''yDL6Gt#7no j ;.8]y{'#.ovZh-mj@r6 ]$ ?q{pv'NUtFM5/C;-DZ9WOE6Nk\έ[sfBI`u-H _qggC<.rG;sj >RCՍNa?Z8ad.f^~ns::xADz`Ts]kn[,TKZkr:ߥmQqkzklߺ8ҫ)]6G"n֬I dfHMuېܔſ{ځt5m8[*Z۷߰qGwWA} +>]M}/lPwdo &lOY>08^ Az  df)]ϝY9uQ. ܈,FJwn1n0:A-(#HAv%- mAj1Dh(0B5#P'#H$RE|~8큇 ] q:!W3eTݍ6*+UѬlĠ@ [2.'ܓT -u[0N$*[nT؎ TSF`$)I&a  {۝nH9⨁܈{T 0uAmtP^/ #Aޏ0v\¼D0Fw0ft hA|A$D79õ*hu$z>ZvԸam`8L#ǽΣV_T "e|nT^Bz)gl@zݞH*lj Uw" TZ<{ Gaïp;8[nTUE">1澻@XJ4ښ S H#/3gZ7t/W_\g5& |A&9fˆJݒ`# tBNeJn "q ;mf>3mX.'QЎpb2be9q}?8Jw3YcDHX/DCx@4HlTUb#:7Nq9.*b/2IcP0j0>AP?3xGQ`,Hٻg9钷b8EZXjT;*k@q /|4kz+>w=-9P{pFi٩o=wc~~2ك[EQd"qspaSnNY&iݔ:N@7Sy}D1ui}I| bw][+ 6"`zаfk}RmLFPI 3E{C?3xgwzɛ8 O$NNshSc!kz^gܣ' L0Fk Q . Ọ5RS6=P.ApßɄkjW=-pD ᩹\ ;u6Շ5yҰYኍؽbME%) ǟ;F D8 篅63⩟L}鼢JJo{ C*Dd٣&pcݍMpy5zTQյSY$Z2~l@k(`n Ƌ)X,`?}\B߇ںfB|ug@[(:Xmp_?ų:*-(`WoH*ہ1 %G?~.G$4Ch}ö(_%uj3^K6(@FXe'pߞ$#=P+wV_JJwˤCihrC6z*TTFaUvä ۔&MK␾a)PMUQ8-*'6VIT2c!h@ozH y(s^9spN N+sS g3;!XgchkkWEi|^-7R*0F((EN (ݝcDU_`6= pMTT}aB~o(2r6s.vg1d Oz{RRaS[yJm#VsHui ʰJCb AYGQ:ڂkh ܳ ^./;#bF*Iqǘٰ%5nY|p6n E,~_5W.'c}wU"lrAÆv0_'K7?ֿ+qt}3+eDqh- G;լ%Z3X!@D,d۲y,`$*wcfh?$iDA l5o T({l8l B8,YNn'CMOv@zB ~+B:J}6@1O?xxs`\as唅j+kQ[ǖZXwq={57vA>mrE^@k<4p/e>jքpTGt}>99qA(k|0zWm?(}-Ԛ_UXr ? [?ׯԝ:Ci|7߼)Ab ;O~G~~|Tl܁x*ius;:+? Y Ĺe@vUIoyU. e"*1p%η7GV)%CKaNO{,p %^OmL \ˏXG0#^JP׶Ԁhs-oqR'>[\kjG σv w2 =n)څ{7(DA OS@^yf 7blۏ;n۞[>)Xme0na*6, Z[=dWҐ U Sa Н{p zmWyW%/ِ̨&0l9 A=[^e.k-aRevz @-'uc0hu`BʨJGq !ynp0</ܱ[:X6*<L(pPKt텚V68Qe/| 7Ѓ,'!Pdp1n.a=Uj#Մ,I՘{5]nhh-~,k՛L+BFOjt"BATLDv=.e^*cl<?2(c:>ղ֋p ^@"?/@@C6g{_^G,H%r2y6 j2VK 9[(T|w0" z`\t<[ER"DcȞّAd=dLp^yÿyjq=Y5\9*/M{n.C ]I''D` 6nOtq " c")Jn΋d@u}kĆJ rmn _a)/!N ~S+qjNe倴WKͻzr݉YׯI3mbX F5я7) \ BA .C.p0ޘUp HskNX6_۪E@3*}k*Ux.֩rU꯿m!xPC;,l] }?]QL[D94d =Qi[3Yp9ӗ`fwXL۶:s6/|˓L"}n`VĎMR ~+2X0fqTN7R HKr%w`ŅPl 1@6 lF!A?b@yn5ju!2|̂4b\Sr/Pn$YHxԇ)f Ԫ8892QY}E_a4E4/`ep' z5:;O2a_AN;@; ^\ge$"ZO:j9男7)@ۻM/] DeQ2H|g#bA@l5&{d 0_Z4O:Ǽ뫻&x8e Y"fh'(OS}W; FHGP7x5fH~(H ,rb r-Gy~f_}.Xf|Deq2Ay4`|ҜYmc6i>9ZyfMIӞ5ʐĀ2B"(<:礃Ze@bقPX=V+A4VF;%<`,OH# %A4>N 5\\>Q[6B'k-q/Zw?Y?«pT[/a(g UtyL{B#WKq}e!p E%/Y)\2f jgSB|{c7mpO*R 8WgJ6"y'>K٦cAz`y[vƯ9Oϰ~n {{V_zࣗ=~?аvWLWfs! 7Ly&kCS|!IH,dޣHCVڏ%n-vw1v@df;hrYUɛ2ϝ1*.Q/eyv9ϬQ "{'j!JLb\G Q-rkP(׏->=>u5L`G(ȐhjPflTX-M<$ 6Mt;@?f`|q=~~{bVzȮ:˩$5[@yWyPEQ/F)q8`YonTxL}6Z!qbP Gg,OƷ]`b%Wjr,>6hwuCz{?U}%e0ʶq"/ ?x4xїI8 n;@%41FWCgqE8?z5nhlN'kk4`*0Z X& r4M|~K<놷.5jl?d;bIeezbYg ;4Y_񿡣&;O'² F.)l#Ep-q$IᴼKn&wy' C^.htV('w5 -YH˘ಬ O>ߢŬz/`zG8Cn"Cl{ش s0}E0$mA/(St&zd0s@*c\Dĉ yOZNytHLfy!CPdQLvk MC>?E'>%ى1"}/ B[&x"5O QoYrAfJBTD,o8.$iΔKcD\!2mIMTLh8b_|'p:IcX{fB/w10fpjhQD3.Dv͚~ﱶlKCbCT'*:/۵o#l,OzrCXH <7Q.vCoZASAX80 P )k򲸗yiώ݃2D@)53iQUWwd X^!W6kلc`N*u}Cqbrf{0pVE!hիlXذ/2á׍?qA B(ħMop83Y52qJd͵x.X.kFɘsS  3X̗2kS˧3{ۻJmNR8hXjJF0KiN&psF#VQc,.-1F6oFfż%eۅh7=tT H%ܺۥ6 H JcZw&Ia9rϰCnjn;w41DTb V".e0YfɸԽS5F0?gIj${͛l *PeAPZFnh j-2lH­()g`ۑ98*i.\޸O˫]\»(Z2Q\,m'8z;e( Tl\]Λ mA?222I"z\/9t<$2iqL{*_`ć{IF2 K_]ʸꀥr@|zWw@ic\^~=ɕ )>[Ccs>yk &z6J WRiljCuX`DJ-;$9v'Vs%}KLeN8gMJF@fQ16_=C}&hP6 PN ƥ\d7 nRb@MU@ :kf*ֱ?w J|5zPվ(=}#n +atG5g$9^zBorS_kpn/D]?a+ {dA)W"No;a,LAeA<#u|BEcP32WJ wHk^!yNEuB7(5)OsA[)pt 8϶VjUՎ@kVVt#{}ha暇ukG9kIHa_Nˊ F VӸrX?O\Rȶ b^]<7f#!ע:>>6_"3jGGMSzeBWo~藟̵_>VJXsA[s"NW8>BZ.1p(?5BxlOCyǝ_b0a&%.D,Nsx"ɮA8ꞻ*?Tnre1K?Fܦaj(s0u.`ZpD'N%0~_۔i=xnJ9Mc3!+#(2߂|"O` ߮1g%~bLJ`Bzq[ Mc:m"N1 j hdGv`qgfYɁG6sY\҂z=k/OȌ8YO-,_1ksӯSƠ{ӂIf?wTvV@IA6mala@Ebn}>@$|RR{*%3f`,2Qc&t‚Dļh*,P/fl~gRd2J bbnaU EC*l2w?g {͛~E}jdO^ 0D?AZ7*>-UA",TBGawLxrb\1D.LD$G8:\ sΞ۟P:Qt+iǘ9 3ƙ^D=<}ÙڵOޙA=! 9H`*n!j w YpXiFw0eк$[JB̺=LI<@6{߈Zl_;#$'o(G"ڡw}fi)2Aʐ\K:  5adcϵ6T Q#惑!+NqY5R b=ŋ缌tp#`7c8C%I z.GI# ɑP  pso3c8g.ʽ]4"0߾SŚ7렆r"ϸ=lɀ]ο v3DRu,򝚟5McPزpNSЮYmkSJ*.U%1){8p46tob.HCpB-s ZYy|#P oE^ۧ^]}nQ0+ >@ѱLW"ƻ!lPN̕=w|v'Ce mJؼ"R8r󋕣@cޓƸ n f0 hJ4hl,uC0>i>&@vxA >"8}p:ϧ+;]N,Şkk3ra3X7T(kuЩlX2&cTpOjRQ +FQd>z:t"&Ǟ/dHXLG@~y- x=m99VQ&<]p\) "XhݮҴ1Q١XnFmKql_=7.VɣF-sSrS [G]f@y̚+CˈQ{H1i^"7Dv0$@J?\ $ A Q:ܸA 6⎛4U &ѫa #-=_ MVN䤞ɨEROVDèjQOd{}Yrvm=f\ӭGSsV+e+<+=W.-:v])+f>.Hu4i-47 䳃B?9Vn4:|[^^g/䬃X5׽7< bMP†ntOdb³An;e\Ln@5#R ͭWl@HJLˑRgzsU_ׇWPy4uep=nPQ@}:>G}PxlU4N|b^튤Jq/jߗ<W H^̏>-2o e} ~AÒ`>DAc`d70G UN4WC{&ҹ檨n5d7PP~6\`EҀ̨e Q7.y<((Q?s^[R{{܉5.Y']s1Bn0ۍ'7֣"E|^/y3>AUHp-moє ˭gKNXI KwZi';s9lh ! DL yXG+q!}5U>KuH4h2A7:Zq&PABxCqOt>Zb΃$aEiSYiUTM>xA?aV>u]ް4md%οUK$Bx=;0<6CѾV+暇F:Em *J? C-@)!,2ۆBs:- m&>^ϓ`թUuٴmYp3u)hq'˂ ;<-oM6o ^YЫC8PƿaFG=vj v/XP;Hu k7^UGp'}}>O{9njA`<\wמw9 &ό%~4|=YT7v*ƚڐ (ܴfT;n>72hݝwm9jW[$A/ΈsDRČ'J5J{ǪQ&qoHʷT_bP tf!Dg-n Dx(B]Sxx-b֖PT6ej E3kd@0͐@jNumm*-fS4/Ηx7D @xjt`]0Ӊ_L( /7ɺ3PLI52YL=u1mT./:jtq'krSA`$>?t}xq'ncɧ7=Q0p ?)a濗M,GZ<7s4D{Jn jNuc˒Tw܁y!ޞͨF<_1UdƝ>{x@zua*\m[ky6nɻH,ex9OK>Ric+(qi]㪜R?TM}d3#$ F(ѽ.Z O,a/3ͩ7tӁ0aL+" ӻS7>Qu[~qz?,-JebE?6ܿWQ(yoo>-vvwef2)69c(2b]n׊ AD)ξ>TeN wGKRGU/}l饲B(Ev׋b. jb F~="b$6>Z^tfT9hRBJ0^ ۼ:kRf:\8s\!HKy+ La'1 aMuycYǯcd+*ϋ<{ d&!$AYj\jU, ;`,'EGb`Yj@;U۪)c>J{K@CA{&7tD> \uExj-K^^̏zk]Sn,`f.aL !Dqf;BrH|zVqy&v D!|?s N6ְDW\zAKQq?6G%aOk^J^)fVJ$wЙV΂#~}|cSƟPM<^KFXc wYeq\{2=- 7 uhx~oEcWQnA`PD`&Y\ |(P655x`h\]7 T`H'`q*+/Ȟ~t!0O1pE6]T0}G?ܖplBDvp[Q<\}b˾ >]j 2kfLL9${q7O!L5M{~=e픋'ZќvդEԫ:d &Glפ5ܐAN`?MY8!g8_HHf<҆zg7L;[0 J#d} ٖqiNl`ٺ*uv iݺl'шǭu[^xg\,2ۤG۹.(rπ9T)f#Pd0мP6!ߕ$7psaILU'G OQF05\Fs3."FEPjue! "aD^9ר,70`[UE0~aQk2a0 C.hs.1YAm}Y;~J 0Z8 gn3\n4p,B Yr舠HQg8k?}?3@aQP *zլq U+| 2uCτ !PSp6@"ftQy*op= g3^|tTrQQ2J>ٙc3<5ؖ@8* %heyHO(_;~ Jïn;VE=͸lðM>pC5R.+%y#jϪbYaA}/fE52Z`5G!@5 opbS|^58s㝂g`A|*%~~Ԅu*?l- m_'t0v{z,  sJ,\y5]6xs,-0D 8z42 ~n8\Tt AOE_>: HDt(VWjz#R((>_8XӚחsd8n|c(qOr#_X r]6IbZW/?0^?Î(S f{2G[S&KD0;h=W=l&t_VOcH1ni{7fP2iڙLjXk0x1+Q?2lz:p 7יK؍7d7\-M(Y)z pP/oGra[y\n {/ hU(k1+g4, ^wc6 *q͗,< ! D.OD@Az8==I%75qM2S)}P{a?سAB QBvvhw3YVum˩sӒig,,G5z͋>nˍgeH}<ٔ^drtJFA cIzhi0*EMb*U%q*%Uڑ e3ČOQ_8q;>O=;Oՠ*}ʾj4{8Їl/ə{-C wh#llKX) Tb׏o.USc{k1myؑ#Kl53ԔD}~_Fy6krvX7eq[0; ?cG責}LJVWQpy( 3gTc&fsT%8rR:1T"9twZ2눏+ QE$}Xc0o!47 պp\岹0 vh׉6 x5˄)!"@qKP#d}G\5 Sn0)ZY >+Q eAT[MTcllxHPOڧ(|p-bGaa aOCvG破>NPLHPrɈ܁M͸{:g/-[(h;EĈ<";Īb,z*2s+*SS O U/8.,HOGios 0 "dJJ(_&Qae,k"e~d"Tv'w`2h"A"n*[pdb#:/]}ٻaI=9j"|8{ p6ChO 3\*29Ǧ`[79AE퀒I79vy@qN?|=C *}oiKQ7s7Ꟛ*rĪ00"RLՙ>'Xw%s}i7·3 >m7s2$3t޽嘣Y>Ob?V\M]LZ ME,<}=FYDg N3An @wQreD1/⣤ױ.ʱ3n8oC;Ztm&VjW[Eg@`o@/Vm^};wŕ8:0p5x*;nQóק/q+b-d ^S9w፜vw-Ҵ/ePMv/ʑ,l nrCa)ISE ud$G8?tHӌ< a"8YC\5[o5,=Ns'JgӰDtY}1DGxU&& /h A 0_ 4ViMog, 4xBfTAB"D]<]Hm75=C*ʬH7Yc7K&B.˽!ϵb>ScT+$IZ+aodssr({;*!7L\1!%"ͩI`JԤ@-f )qk`)ڀ)ʵ\4;%\h-;uL7xѩXr=x./[=FNxع84:#ܡ /%QMIE$?v…1w3”$sac4e~})^ &_ W?-$I@eܑ߄F &! _G?U?ji5бJQ69}c6Q.ጄ5ɀ!ɼ]uyA4L37 ~Pł"qq.RuTLac]L>>Jk2hzvaW7>փלV6 fiE{V] #o8hptqNj&Yݟ~^I 6(}>eqS=MVL3xhuǢ3 6e}yxip*9ŠZNoޗMǝ00] "> "@A?;>; tBH4߀0$>:kK)=Y~#wW?#iGboR;5PetSHOݣ Dpԓ1Q8ME 3wh.5WCm.w i\֗9{#;e7ɹht7!BTJ]9|1IxPJ>@S +27I.^;5A1w71K4XG|@Z#DxqAkЊ> ^~oӍ:;]s><; 8z!BP:uK~:UhC~f)qv5mkGȫpFNM=k]yu?0Z1&/<7`3?Ya"r'x KKQ1wt4Ht.(B D> <<'˃W3S|T:L~߰#ƛ`BA+sqV)"5  Ճ)VNWUQM:h:pdawt7/" hl"4M~w;[УG{4,&^B9"-WCyߎj@_71@ҢZ!}jL|t~90-KPBgо@my!}р7gN DdlM0." >%w#-|=+'ifL#{DGPf^Qf[5j]C*_;2g7>6IW쑑3c8؍ت= 6_4yU-oE68=AƇ֚OPMGK>Z]/TWPZ/45:A=9k6lݏB=p3r@g .uD|v5^ED0Sz{M͠ssX\^< ) 6s~3u/3Kkp;8 vR(AxpHRvs닿*@J hP} ,Kj-Dv~rPn5e=좶do2ڎ䶐 \IZL*63'ok; ի캏$7rAJ[`tgox 8 GτYX9T7htI$Y8ZlsۭoxmYM:݀,ha|/.H %J`` MWԆ}gĂ$g(w|`(5a5i=r(Zw &':*r(*ê/w1񷨒%>p(L q2 @/Dk،2lOʀF<% 2t8pWA0 M_ˌM_^P]OT''KWt wPHk(|v聶*]ؾ8صkϦG dj~rkj2t؇35ޝku-FĩwF8=_ن C¥Uy CPWCm⾍3sG6Z-2Y΀VC-J搙;<4'7odu/sЗ3]>/xޡ^ , 1)-#\'m:fMEw\YјaOzHI %lHzOBRp>BB[| VDC6@0~ߚ㹞}l&$5  <h~/5&4"[ H}vu$wUP*"\"3wgg"jQ^pq0,҈MZv/pA9ڨP`L]6  ,=Oowc}q(l.AVpҢ6=NNX☐2XH7?A]Wmq75@I0x"C%!HD67;ݦ-'u (CA"4fS$O4:8GN*Gkܱ8[u~ ժD U ;_{o:1pƊQG Z[SY 6,t7JU\邆A9&'H7,eD&,6)]\|.vAݾU^j6aZWp^ ˠ=p,6HH,$p:4dn/]8 "(:¥TRK1NkEOn$`*II%S~v 7b X=kqX_䪞cӵrQiB3E"V!@'5|a|C(X6°5%K " &v6Lw13|CW~a`9Y0mpɠx|³Qn boޫBނPt2 ߻TSJRWKo3G R6i fɦj\oۯoHkguD5 ⠾uaNe8PrIź@bq{2"o1>?"+;K TBCpP~#6˷0 U*>7cBcFZg1 .Xg֘t>Xuvqpzx u$g ( l6LڶE;~%AY~׵$W7n#'hbC\XzْI)Y8Oa$@@ߥ|; [Ͼ;AXk,MucOۖ\lS}- Ӡߤ59 Ok>\ Ba-]N2 3dm: YA#lxZU>R9]*1 v!_Y㴄AMaDJ:j!n'!9u6hpͶal}_1-1P=FtJ_=Bl[X"i7'8ӭa+su;"0~O ~R sYL|s , ޯ{ Oo>pf+8Db<nO˙|bM Lk2L6CY_ DP`)`694`2ԕ?ۏ>_: mHdۚHǜPnr]ۈ 7=z𨉲d<߷wu;F5̈PR>p[0emNc3Bv}k*/U:ō޳ߌ13zƃ~чwNrB98rW7TP;& 6&(`n\{t'?YNMso$x9P?Hn`3R%Ȁ T`4z*c"j̶%XA#.7(#o_[X{s40 kȺ8X Oae-MÄ+>-WqFژA8'53rVkEWi MC gFSXE6 7IX*v3RQ[ }<Ō䪮}X8Ieg𾞐z/p 3ݛƯ,y&*㊍6N)xiK8g_و8ןlN-C܇MB@skeecAhUC:P60QG<Շs&(dl)S` %04uqo $U>s-0<c"bC۰q8N.qL]j[BHlDXۛI_Թs=Y}y8,0xh9Gj` RQpCO k?_GA!$($$9.oO¦Jྉ } kIFd1d7̈,; /Ul?IHpA#v#פv2n3p0_A@Z\W;&$uQ^樚(Y>b_ Hd= 1z3Ij/;9n"̦8_ϗ6-_ q &0d+B0x55K\S8ABz:lMO3q4q“\@Ԃ,l sS/NFnE ,DeuoI47U\CL@cd].*OvxbB 9cc0¬Ġ\VEg/kQX6^ɨd z|'!sufꮜJR!9Pyu4vPJdjgAihάf `F]`ss<{W^PH" "xx)#d4"]v3zֹ{ٜV $8=II"5ڃds溛> wQ;V ܮ\t3i#+8 ~F(_.W;#988q:t(bD _9%Z -XIDȰ!!8r4GRy Z+hYTy"q>9=fv獏^u*_b03^yU||]/E7c4!2@@ɚ \k?=B4a>#.*\ID.8!ý#:+8%wc {]OY7:txMnw w6YCǞ>MI/\:vgpV4akP!.S{? 3WH_doj *i pœM,TOz<#} XHxc=Ӧt)xaأ@i$Q#-v Ab¤II$ſKo͠4(X=_ٟK+FMwG#Lçx #X?TDu^&8@r,|YŁѳoO+3qL]}? K1ng.r\a%etYE_K0|Rx@'09&3ef=|ID<0;Ks|m$-(D>ꂮrbkNj6e>СAy1KNj2PZ B+V(W^ 8d0uZgmOxBbÇEz. P-ӡ&/f~;LtUK(FIAiUʐ}sw򯥟Ҳ9Av2P=ɺ(% +V% w4:>)ƶ9Su7ALQ/8.x4:CGHqsMJPp`=,5*WD;?`>y l+|S&׹V} HƊ41QP6nb/2+6l@^@kÙ-3A#;N0HJehixOphm|TZ#\-x=?⹑QdDB sqzܱZeak(PzhjB^ 󺯤K5Z۬nKem5pV8ݭ7aEH y2d4PJ-SF$ "ȄbSCTY+[.(&=+R묮6(=ҝ{`_8n5(P|UaPN #Spf,ȯC@-j<2sg^&x  ɂ$O 56 I'Gp^܌6%F/AaNfЋ=0,"\0"`2@`(Ql~x{_-??yO;+G(O| ?:Jm"^i䐈p]tGEYA ;nZOlfF 1E+v Qz6wߘyERݹW2I}U~WGKջbXV|Vyb֡j;\65W&r`@+ xt(I^H첑<:PazB,ȎJ R0ݤH΍r-v-2; 8m]]%|rJo1s̡}. eB)ǹx*X/t73b w*OjB:K+c 5J(>nxϧ} 0a*s!kЈI ?Yn,2r~ppTs8|#J>PQB cr#&?w rI P/AۥdݚD>Uh`51%6Hyb<~tD6LJ!&h;$jѵĮHEF^QLDfQZ9=\ԠRmf'vkM.[}0 mA8E M"mR]6t\]'o^h5)>1nSk*2D9eAd tEd\5 b,*f&$~c 'Jw꾈a[r;pkBduTY`T==.f7l-٩6F v͸KJ '%CGC6FqG44!+II3\&3a:/ovu %a|qamXeAQS)kDjE7 G8׫ZMdFVbIK3;QXVSJ,,K 0{7>k_Zr#>ҽ-ݲ!ُw0qC7q$D|)Ǝ8;0y}˞Fq@82֣TPx BrS~Ob.EC%ެs?t!OpTXhI  '(߾P hD}a{7#ix8 ;rAKY*v4kg_GTeCjul*p>=i?T:ףf8׳ݑ}qzٔhgZSs'ûU(}pRGTH{=(ϰyRxATv?&=H* Gpl1];p =Z.s}:mպȂn&ǪO VkWK#= }9G1 &Y/ʪ_[oc|v4[/ _A6Rv s-+X`(DЄC@S4rC8TĔ75HT@W%9Th(ZsX ?k1/rʟ}mD2OqO{n;;;{B'9G\+O6m1O &8cֵ.U3(=o9E㑾vs~q HhM|osqJP^{YH'gxt('F!߸MJ!%&s.>q䐾 Pj=+>ROI0z|fo;'>4Ä >+G< AoB4[_Q;_"~FGʡ@~]rGꍣy:B4+†B&]C}1zvKBO&hqO厧ņd NF/Ba(gi{~@l8Ek/7r60OSX-Q80밴56ԋGl/t/6*åY$}71@ŐR$StG劢zL!@$l Qbč+͡JDH @) KGJNtPPCIAJaSO5P|C*T?DS|# ODiqZγ_/wo" l;^ 0:9ӿrZ0?b{ξtj.G |k4vl3uaXߴ runU~?Ǐ;w'A,|Trcc8v+L/G7[(pU|D 9rqk?oM\ ͘KdrsX8Wmќ].e| ֻV{GouxjmLO[}y;_;E%ԙx|9^5=2}X;;sZWޝ]9_-#φn{}h1kb$WtsU #a"*w2X.pOap.KL ]9#^9| B^*~K!3wuHZu*H-Yh6N9 8c5QYFZQ]j ?zc-q":9h!"|}"9u9>8sN@BwɇDdt h5>s// \\y_9׷7X[}}ߌ;40`+0nkCáG݌h9^nytǻX`dnXek.s:NXPErH^t g=na-z ɢUS,K[F"⶙I"fO#*ԸԆa}c/m212AC?3F#T>ŢC{ 6 10LQ#r?{ȐAMh nU}@?3`*,BWiW+~tw:YL+%U9Hbsn~ަxyOоG{njvbSv3nAAu(~>Cx:=Fz%Oo{ɷ`ϯ]BDg.506 H?Pt}flUC7-a̿3@ }0{qy~_n3yI`뷂 'C]=e4&!G57a~˫>c<@KPC["A`xt~Z5ymGw؛kȂZ=>P ;)ÇK [5 B'rj[§$ 5#P$L7!u| @[`<Qɬc\(w^8"ߍ%]N@&S<K!7='TGx8 "6""{J8flS^`Epj7z@'A!C! n]:S(p 2ׯkm@t,7)-H806yA*4gRІo1뵯OVоf̴Rt DH sX]$a"\XYm| [ 1`ë۳1PS1k@ͬg.F'w  } ~ IE5viIuCݺk33 ckߠU}܁P\>r_D׈ HRաrwO2d-mYsReH6M[^D5.x.!o*7h.9!žl+?oc7A=Zxv̤ !(S(6m%S +A#'m uܗ}itKji 5F+t8'd/rˈBV!]xt*8@H&O!je(;XvHfN`@]HP*`[O5!X .{%7VًGO9m12h3Ŀ\]'$L*/Cn!V]dJBo|~mwFJb+ Z=W"=e4qs޲{64 ,MS5I]'~ݮ]CC.A".3GT82VҎk]b @ bL5It̐h#m\olRPq!:oڄliѾ Q ROLjؿi^\>KcAZtVO͙%ֽ *ׅ֮!e:  #ӱPh 0x:%m9 Z z!N*NFT1.Wu%@,+KK:#n(/ccuZ:~[87]oPwHa u,"SR"R 2wڝ^b@M ǡC,#󑋄=uZҁ $Q:p;,)e(8C^Ϳ#?~$OAC\ݷ&Gn^ wZߪvq'c$#v ##fC2(h=MLCxjVF0|p5Mx.q ֫oϭ2f 3J}υ41/vwkpibճ&v E9(T4N98Gg>X3b;-ְW4^518(= "D~ё+3?Hg$h8"}:uEhID8|O6:;52ⲱ( pCTC]g!e;~(Kߟi)/{g h_'I<!=g$6k&8 8JK{`enq]v?Erb.\虽{?:oUH`m ŕweS $o(n ;l,V4Uq4Ra!,JZۀC\D/ĉPLs;5*Ms:Vi*HZ@ٵg/}s;\*:N*)|䱄a aN)&,זsDѫ s[ i˹k I"rn\' /Ք-U|UB[*r)pjl*FK%fő>Ic`ew>U.DC*T?aA2 ?̢oG:.zO?A_!Gܒe=䀖x\]tZ`u_fG Q,-_Zʶy5UC)☉2hmxhFnd^ MtzlY?@ @WyչmhGL1,\ a~Q Gc[UkxU=%#" +Ow"ՠk^͝ф5`.ܯl[a} Ow{?[)_l%(Ƶ1>}b~wKak{f} QY3uY1Bu^`"싈o : &svQTPpO-v9-M;V׏%u˟UhjFt:Y3%%HzWa|ȗ څ0fGD00@vKFc֊o;y;}tLˤkSb`dW>7T }vn.hIq\[8Rz`q!ƈ%Wrzzy3luLD1"c%/V 5,*1(q1zvwJVaanyHd:ቁt /'A@oTc(i(s1{WX-~vq+ŽC;Y<UIf J; G;%}[݈t;%2Դ=j{⶗}oӾy&uJ/sqDe' PrMC2 YI(zx+kBόF1Ek|P sVb.uSF=nfW95K9H,Ttof?@YXy+3}m&N~ŅK~!מ60|[9>4}C>Rϗra71$>",̆\ۈ!ԓCרΫ|G 0tw,pu Gc&Dڌg &^mB e+ gbFtaln9|s\*;sKS#=H{s80GAfzY!ix)5O(BlXkq/-kǵ_7ـ@IFK0h/6u^M_FGV|0[+e:ˏy#pe w;ݜjfDn5>RX~Gˌ#L ?2뭆e$Fa|b3F78͈ʀ'ώy=W:4o,bMv:ZAUf7w8q>24LH*%+󞾲UBL7d [Zj+10ڕM:ܚTIoP'txci/Px:78J*)plaw1DA j@ r;s7>vz( imD ںArD 4 w"55X:e0r٢kks'Hp~Z? nyex2ed)% @l幩0~ w!] m )0l"Bu<5S&D N>ٽ L+MWj @;g8z.O^z>x]GGGÎ!&d5Z<1t(f> CKnd}yln(e8Mn uj$F6#_DQ5 TO' 8pb&)@ihh"( & 9:`W\]w@6WNrb+hɧeZ^8L9yϊ垻D8ex]>U_ZxˁN玷bZ@<qVſ4ZC&Voz3HCwi&1$OwfflՖδn `H@<7 Mè7l)vM&/~@YҊe`67d¤':ΏzM& @A~U\ ARO%bI%Gv BP\yA`85$!w)9 $@Nz:s?T׾rXG (zz(>LUQu;ow3py"GwUSIgM,P(r* /gnvCL4OhcB[P>SdR&סNt_ ABC$ y@wx>XrXw 7-@b)˶3'RUvM,mY3ңxz`0g4?JT@!%34D!uY4q2 Dߗal@5:$AJ}-Jlb7{2ߪ^'f="h\fWq~gݞVY+>PXn֚.A =%UHImݶӢo^Ŋ)6o Ι B$nyFsޛh }3(}S?Ø#zB=0ͽdM 4<Pb}1+"=}EX n M HֈPR<̄==Qd4:4uقUerμ̏O|cՕ6=+/ H Z HHwx(cBiRM @!G "p$S" +3vZL8kn@7 _`͢vf#paC!$0(05۬[Kc^o]BRo6ثhܜuĘC,S k2,(-(>8-hÙxȨ0UQE*)((( FY`")SܹvimqW)vrKmu8 wIIveH\e-MoG[iðX]}|vE֐0W FZq!=omI|Ȧ IɷBـ>0 v$VލpngLH͉ONd$&pR\'] ӎ r4gI~̦fQQ"GܰT4UJ03IPUUAB4EH#L@Д (=ڝ\ 5!L2LL44401E+K+D-"pD!@R1%% UHR!HR-D4L PDE oLunS2Hٰãw&B?˻Ȩ&/\l =Lѡכjӑ[fYԄ)){iPa~Hu9LQN2yQõBocn @['`0L7og%77e,w-^c~Z1}H*`wr (cBDE^pP"!zhspDDIDpDN-0m;6m~4dGX0Tz`)n[$MXLP.|B V6kF㰩 ,8hBwhj0m0aTOhB[ѻvʀшi}UH!5[r Xb􈠧~,d`5/G N(/ [e&'Мa; v/t:cv3,\dY F&Rt_̸c L|LlX绲 HcT}R mڜlNJG!gi6B x 7( HKSţ ;wnir0^̂C2 g/%'h@sseq9Nr3}t$-I.!O Ò"D7]|8,K].tUޔG~MڀB{,.w]b#c06l.!%;^^o<8>@X` J%\@&D@Hh()Q&@L iB*T&/bEA@xD@P) h""P`kQW6_Ht @I`B|5)B,@@H|ݦBH8vT7z༪Я~bLRҔ ".沈799 7w nt 6MyyHZCc1 g`Oo~R-9D,w4.w @T(Yw잼X-3$fa$I<q7 dtKPl~Мlos& RY`6"E nnb"4MfNl ! l{ȘS$Q;cr=Aꓝe+Q1{6 %vLK_~oH%vѩ5׮#í]Ʊw$/~$?*n> G ~X7XY$OA`/6$ X95E.q<6? le@(pt!DZ?\L6ySmڍqp}hp!IȾ`Q> P8) t/vԌ\Z+׈vv|ptg( a% Y]cY2&E>Q?(KXγoyBv̬́t!C!{yVT0o^@6z}.(OY!?sukɢL>ЁJ`0d3T? (^aQJ"?E["],7Jj;\IiHx s("&{ nSkO[7}2*DB; Ty ਲ9&ͰG+@`snHjț볨m՜c}Z(vr;岌ݳ_SQ_)?_J07{ۚ#(-+C2;H^&aB@W}@oKSu~ q.o߸^S C,NF f򾌉t|G-q0k9VN7m Yd~Me?s;""1b~SG/U}UFo?Ke~?f7?<'MGd}G<,%k W3.MyNZYKPϻv߿X#a+w]Gۜ+v^̷kݎ=]w|sY_Ґ8z w#p#}=ǟ絿c?xsgtDeP%Q '_ߛl$GdHہ$*pA [žS$$\4qv: HKӏT#<}Z2L ܐF9P04rY~0$(ui{Wl /he4 ϑ c7aQ2 2,9P.<{?z4"̊)i=B2`@uELu2n(:,^.XEv|]lM/NtzVO?K(0YS-k%ϧ=mHI$0]zqF7Pf[4M*]n)}R RpXlz)yJc1tA#viRRyle }oV)(F̦q; ب16|!g^:˨|p68/ӃnՏ_ ؽֽp^_۩i@[κ|5Mi2D#_q4o6[MXYyTLZPS Hg3k Ʀ{4_=Lb!``5tfxڡ"49\&*T6c˔& .Fdo(0?:cɈAd+5@Am>ߧv'YңHnz<%.G+-W}?b݃p. 9Fips!g0_QLQX᭓WDj%5p-l֟;V"}8=>? ',w]6ĥ" ]JoD&fgcBJ`(v<ZCԯMɒYe[Ǎs!RB⩽6vm=_>pZ8́~iŒV{2~=ٲfa[dr LgdPVNG;#F9-:w|">zກÂ"P_^.< i?mq8'rUnjxa*F{9.D 6]]OzێIsg@Qg|__75s29!BJDBM(wEyc?@h^T:K.95 ?}\ ĊA ^7x 29 Qk{<xnXZuk R'-QdPɁYxŠc˻rӺ8fH1m860؉SgθN:ѷ[]?#r]w%@ U?cy:p : ;0mZTE$PX+=,]pKKuG+EOnyABCqʋ`Ȫ(~fHJ!ꮷ*J!!HIbGBo1e=K%Q /}%%=z,vnw߂{¾=b #P~FZr@5~cPí|8؝6fTxuTʅaȈeu[wG?pl9Ia`9PLR`s,b @t& v"<~S"H`|(6g1߇kxzω9oN^|;";e>w d+cgG2Rvu{兇n6٬n{.j ~0eO@^]__nH{uikhuȠ#fmK ;~Alʂggeӂ] A]×wOIݳhע@ ʠ:礎;m3Pgz-ذu27s`aB :MhFͱ+c1T4 KAa,=FIT)\NY/pDĀqz7@Ѽ%mLEwv쿭= @8R@וX Z8J*yQ4"X$̀HE }1x@pqG~![Alpj`)_ҁޅ)xˌ:>,.GchFL142 ki a  gxKnH[4?pxeXs؈ %H\!#wEP5rk(k+뇴y>N*آ`@^SSkC܊L?