summaryrefslogtreecommitdiff
path: root/tools/perf/scripts/python/stackcollapse.py
blob: b1c4def1410a8aea617b0843b681eb7435a892dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# stackcollapse.py - format perf samples with one line per distinct call stack
# SPDX-License-Identifier: GPL-2.0
#
# This script's output has two space-separated fields.  The first is a semicolon
# separated stack including the program name (from the "comm" field) and the
# function names from the call stack.  The second is a count:
#
#  swapper;start_kernel;rest_init;cpu_idle;default_idle;native_safe_halt 2
#
# The file is sorted according to the first field.
#
# Input may be created and processed using:
#
#  perf record -a -g -F 99 sleep 60
#  perf script report stackcollapse > out.stacks-folded
#
# (perf script record stackcollapse works too).
#
# Written by Paolo Bonzini <pbonzini@redhat.com>
# Based on Brendan Gregg's stackcollapse-perf.pl script.

from __future__ import print_function

import os
import sys
from collections import defaultdict
from optparse import OptionParser, make_option

sys.path.append(os.environ['PERF_EXEC_PATH'] + \
    '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')

from perf_trace_context import *
from Core import *
from EventClass import *

# command line parsing

option_list = [
    # formatting options for the bottom entry of the stack
    make_option("--include-tid", dest="include_tid",
                 action="store_true", default=False,
                 help="include thread id in stack"),
    make_option("--include-pid", dest="include_pid",
                 action="store_true", default=False,
                 help="include process id in stack"),
    make_option("--no-comm", dest="include_comm",
                 action="store_false", default=True,
                 help="do not separate stacks according to comm"),
    make_option("--tidy-java", dest="tidy_java",
                 action="store_true", default=False,
                 help="beautify Java signatures"),
    make_option("--kernel", dest="annotate_kernel",
                 action="store_true", default=False,
                 help="annotate kernel functions with _[k]")
]

parser = OptionParser(option_list=option_list)
(opts, args) = parser.parse_args()

if len(args) != 0:
    parser.error("unexpected command line argument")
if opts.include_tid and not opts.include_comm:
    parser.error("requesting tid but not comm is invalid")
if opts.include_pid and not opts.include_comm:
    parser.error("requesting pid but not comm is invalid")

# event handlers

lines = defaultdict(lambda: 0)

def process_event(param_dict):
    def tidy_function_name(sym, dso):
        if sym is None:
            sym = '[unknown]'

        sym = sym.replace(';', ':')
        if opts.tidy_java:
            # the original stackcollapse-perf.pl script gives the
            # example of converting this:
            #    Lorg/mozilla/javascript/MemberBox;.<init>(Ljava/lang/reflect/Method;)V
            # to this:
            #    org/mozilla/javascript/MemberBox:.init
            sym = sym.replace('<', '')
            sym = sym.replace('>', '')
            if sym[0] == 'L' and sym.find('/'):
                sym = sym[1:]
            try:
                sym = sym[:sym.index('(')]
            except ValueError:
                pass

        if opts.annotate_kernel and dso == '[kernel.kallsyms]':
            return sym + '_[k]'
        else:
            return sym

    stack = list()
    if 'callchain' in param_dict:
        for entry in param_dict['callchain']:
            entry.setdefault('sym', dict())
            entry['sym'].setdefault('name', None)
            entry.setdefault('dso', None)
            stack.append(tidy_function_name(entry['sym']['name'],
                                            entry['dso']))
    else:
        param_dict.setdefault('symbol', None)
        param_dict.setdefault('dso', None)
        stack.append(tidy_function_name(param_dict['symbol'],
                                        param_dict['dso']))

    if opts.include_comm:
        comm = param_dict["comm"].replace(' ', '_')
        sep = "-"
        if opts.include_pid:
            comm = comm + sep + str(param_dict['sample']['pid'])
            sep = "/"
        if opts.include_tid:
            comm = comm + sep + str(param_dict['sample']['tid'])
        stack.append(comm)

    stack_string = ';'.join(reversed(stack))
    lines[stack_string] = lines[stack_string] + 1

def trace_end():
    list = sorted(lines)
    for stack in list:
        print("%s %d" % (stack, lines[stack]))
Gt\'w? 1+㵅;Q+!tMv#k֑:YGï'Xan51¢x#JOսr:,1Gfj>zvYldMe'qJ~uEzn[]NXr=z9^-^g\T.S1{?mWvFo 5Y'8$']h OvKci=t#Kyz;ku ljTnVQϥݳ/iViQgIY=[ ufaA6!_],a$iB/MLH\z&wACxN\yFkTOnf߳؊'ܜeU".."E}"qh3zY&p$31SGYE wf:cwd5JXAe}]ʖ^\Y;2W ʬ̬̪̪m@TVfVFYUAUTQFf =Yv'w)InQ)@vYp+J=T:_ddoHEX>hVH e^ )3еEIBB" U] I2iЛ $3rI$I$P8aݮ|M~ӯFۡh5*o_>UG6(ry{4?fL|`07/-o6ZݶT"_ܐmA181`l0p "E?inD0CC:"/ai|Sd4A3v7Ryd!!*I$oo4r8ɗ( X4|!i=vPE|uA5kF eh %k-_ 4/)fYe8/),YlBCycnI@E>~?%r~ޤE|0HZz&?FY=L-g%eN@D@sC9AL!?i B!߽0!|2i?_ U @bgvӂݓB6K &z'khDm ^瑤$y[tAk,V[>l}_ 26VԷ)ϫ6*AdsVm]9d}qOg&vU3pq4q)ꡗJ)0 % L&j$I01 eaC] CLb5(| & 2 w?jg^OY:E`1wƚKt v?Mr$!l&[0Zv5t.NV ߮7\:f6Kd3'eЖ|pvAKo '>Qy|ﳛۨzWw4DZCOc%7GR%n%ΪHqf8E?:aA\"'N)|kf/dKU ?:f\?MWo8Cັkm.L4}~)|C%b/ db #QRO#M t^lޮŸួ\SGBH̅ipOB˯S.7w8 [J$>RZrtd`MaQz,1t}(;[G6n`>)޿<>X6FTMD+U$9!:0auy,=],{ Q}`=~L^UKixބIgC1=?ҺΣVO7wQ'60⃢,{0˖rG)497-aPQ[H!,uswfP^ŊGZJ=ϣѾ2ӯ-bB^*S ˢswdSMe@W C޾S71pQG;k1Hc`cmrZh#xD:}}`r]B͞ mGFQ{hR]1=CGO DڕlՂs.(IGXl3?S-3-Fe&vr,qίc8=M [{}>~vrޥQ?˴0)IWJɯP܆Y; r "0*t6qƶ $t̡* H  #g]#mO6큂yi`w%HIP8hDΉIf Q50% }9N{:dztf #9b/9nu|yɧ KnNۍʅ6cpZtvk8DyQdn{]Qsj#gl.snRt>aPan ng{isAnB äxQsvoٸA6Ivv׷?^x.(:MTvDp텝fXҷN7n˲ܩqNuu]ݑ%[-;axwhϛaD@CHR\c~_YҞ1)ƻ'IɄi5Sɍ7=l_I*&E+o98pϐY {Ud"2~o b|/Dy3䶎 $Vsm qon_?o3r_[{qm0^c0e,Bc5d)m',@dd\dd;b!"qRM*h1X.k3#TcUV%(2&nr=Ɔ*pU!ـ\Q;sXM9s!i$fb:IO\#b LgbVڜJ *A:7l1ipֆ fF0LDb=Ma9H=^$C)ݞ'0< Ptd8qsz* Ӽp )!otTik!1e H $P8mh=J2fQeIյQI$-2xp |~%yE19ZkQt$ !*:tZd>ʤS&ޕ.uX;g׶yxDP.rOrM+Dv޲~4[,A)dL{͠MRરّZhAԎD L>u=٨9ra^ȡ8 b|:d< ODG.8gN M._-CզO6A|i3ίr0_4nT2Cޑ^o.k"߆[avejG7O /zھ,!҃Wawڿ)m_?-+>2s p q}yG}9~>~_nx{ P-d% Y9atP/捵S@H!<`GQx}7>>DBee@s(Oq+0rTB҄T y]pu¡DQ0iS@|K2h NʮezS gz.o/>ql1j"V=>?% NǦg#]Y$րcuyT ]YY;XR%GP44Z G#>Z7pQc*Kg9GyQ2Z)$r Odͷ|IoWY{qc@wgs4rU_tq3a:ڹk@{P]^&@RdHS\Q1 H"q\ )mW^9pX+c.0k}Ш ,Blo+0#emc,$;ӕR6YcxrhyƱ=}M=X[Z2#pï/yKZz/@@ce5vO +hryPQ(*FBA!z6ۿq®G&?YyH ď,/HWfv}0Fyx C, G  8Hj( e!ˋPAx@7N2n|^]K Ku~h( <)`Ա]֨"Njw;}n23yY  w3UEG6ͱIm$*33HtL>&l^Wg\fPQ}~;UBho:~9T!Y–OCAh5c\V7[lp˔0*z-he` ]xߪvYH8zE'w~%㲣@q`A9+F]xI.]WDm:7 ڹ˷7٨u d@ĥivq6,jCdRlt'w :s̏OvI5SSa":@JEZaO}+c'[, Fz?ïe@kaeA],`각SWƲs=r*Vy/\a + n)Sy@ϲKޞ2:tZY-}+ilпh[FC/|N-V"mF=n~8G?:D:!tB;cRAx0ŒTV].u\i21~% 粬5gV :LG2^>{@(DhC?.KڨwO䱴`=/n ny*̀O!>c)[A]1bdb{|/ jmܺRmSjt1Vc̷m Gu҆=/=ޗzG)'-{:)Q&є^];S>?|h@:)ي|OnXSTN"wyJ|鲢vF~h~ǺoVӥ)Hhwts]Wi _Mj73Jh@Y )Eng)m=%jCr% v9onJs}'UawA_swG`ͼZbQeѡ7(4UPLuh鋻B瞂|-+ hjvu;] 6۸dl^#(_m8}YtS] a:wsX開7.y2rl>.vX|INaax{{\8a;|kWЩbkCL]=7|&7!}B*5hjP|. f/2 $TI4Ɵ&0yv~ﭼ\œ$16_O OJiٍK|q4nFRgr6g=9D>cvGOu%ƼLb 7F{Û!߈|F1QYKGPǔmf}rVۯ|]@h ׎, .kHx\<|ײ$U2A;i}ZCt$ PM#^R5[um9B" n|2eRaB $ :Ke6_a _~= z;źu[dܾ NOO2thv,:oP稀0w q0fU(lqh^iY%ܐy4l|FQY 2i1l:fκ"$@߂[1{+ wj5I݁pl%m=tޫ[bQz~<ftno!bSOeY*$6i}rvkl+J v-~hDg  @4Bbc E8|ڣ!6ukFnff؄ƚ;11_0<˚胘c_ !Z1\^\[d0#m,:JǼʺբTuWfu9`>0Ԭv0ibC*h Gom?o f3(46EN B.E/:s_0;gy1.Үj@XP6L_K)z fu0:%ÝD}ʼnwV_P~^WKgJ.!]V wIU]_}nq- #w8#K$URKC({í_d;s%-l1Qԡlڄ;(o4 25q»e{'j %G'F2)uϴ :1u7cd~0~,oGGDDzdKӲ?6K,pVA߀q3(lh^z&T |(N_<ZһڞR&x1 "0^C&RAz V} E@+ X㞍VF/ SЫt 6e6?=qDAU٨֕Ի^+_g-5uˉ9-ˠx!T;纼z,V{5a }vE,H)C>v`maAUVx{W>Ao2tw(DO߆>,$"{4|O ^5?R]&rjC#Q"7VԪ\ "io#L>;ua돝 9dg <KB"y<6sG:1X ّ<8t?+ 2|[?R=̥gO 퉞$eABordO_EZF3Z~ _1RhЉ8?<;i@dF|.j>:ѥպvm/vGs_A*5+bR[DE.ŚXQBX{F$t"*͟ fgc),=&8>OWu[NSW92"ǑQ0 )1xϔ=_;_F 1DRI -7Es}ѥfT_>$6bX4 ~n[kMjZ&?Þ1e'Gl>׈^98oIϨ>Ay".ǺaL?U\"ugR c|vu_)fHY!>]2TnOKK4XY(@XZ9~ϟFg~mSpGaݍaX\PVv3\~~pMpO|EqӖ3+ab DAV6xp_g Cӯ]ID0RPXAH?Q|8|3VX鬽>ʪ l$HH[Y>sQ*ڐ$wh/r 3<`JVb:a U͡m!JgozCᬞDc\Lz $\<ޭ?LV=6ۿD)-~<| Dm9`6-0Foe[l| Mڐ.panAbo6nO:ؖƬ&P?J /2arSljAӐ shh am`+G,{{;|wuҝkZ,0Yޑ0nւ66fyу빴,dcU[ÓjHi<#Ysev׶_ Q^exdNOztt=0QG\y iR lue7ReLMW=Ӓt`8 Cy&S/T#V۵)T vehΟT~Bm[ώI4T>ݳcr䔹(Pٙ[`mv,1F ?RB9!Mm%6i;-a*!ȷEpռ4쁉XC0:cMi2]#xsdƲ!J{< 9߻kl1a +fF }bv'6bSNFb  FQQGۡ!4ޯ ;8Ļj:}J k͛I~ZV "L" ~~ 7>x`W@q !%e8k4@FP/+%{tuf*4u]>n?-xo Hۻ[STd@xpO_{q}NoNO]d:urj'~7@f-묓+WM]A3wD5[Poy{M!F#7U~rɶ9myµTts7M{mj]v2&,V'ܩ!uW g&99{,v5„3Xrocs3 eWwQ1ȍ@n P24qNATbݸ&M˜g$zpYTp fQVcUx/- T10C+oLm0V3 ~7 iB 6d\;ٟMCODԁ༨Er\F}Y}aPvcUcm5;+W+ʝ3^^lT }G_)ձ,ߓV)W2'Ts;Nj򃎘,0+Mn d]'8ړ fع=Pmf*ȮhAA3qİ"_fWS%#+jS|VQ;ݳ7{>ƭKzb71eL DdX1'6$o .1fr>djT3!%A4U@xB1nTܚG=\ # 7t|Kn˛ͅ:A#IE 9CQ듧$V{G)㋁nB9IE<~j2qd}WtߔlzTlYUvktwQg -]?{[{|;\ SLA])3ߍ>Ύ8~>L?M/ |E:[Ο2} 'lO h~xh\vFX߲C9n~oGoҀ6 dWw7m 0|7wlդEjd~LGEek)G],fo~צտh|DEa *#R'_sR"nپH4xqP೸";uZLĕ(r*pqU-!",EMЫmd:,B+mQSPQ$ZcC5K쾺"#_^cV r*ZI;{6+3"K# ~0̊eK۱L uƯgM +"]e[JQ})J \q{$DdD}-z\[*/CD(݀&Mk=^RA%X`>QA^oz:9p2xTRlHgN*~9e /WT,0~UuBPAy2Ӓ缾b;,ƹOcnoՏLMiK6Ԇ4VLFъ-0Cu1igέ []0;Fo;x6g-)( eV[c\1#{aF:*J( IHM묘SJͯnW7Z#-0x+f{0 |'C?A͟ wҤ˾l`$(1>q )z3>$vwHUɗW@=85v8zep6c{y̤LR $$5..{.8owRW u !-(.zF -IYGZ@b+,bV? 0F[jk1'K!~4< )#2>ا53F(X606e|Ndx:i6 fc74ޜ ŞÅ! =Y1BX\?.eL6^a4Z;j)Ry\a ޘsczpI}R4}]Y+\M|f 5,R,͚&&KMQv4almR6ZcQWyD(FCQ!%G@ZǩÛ<=)<-^^.RGI`Fhy˗T-Ho2uįiS,XNPj+sdtI Yg8ri Xl/S͇~iKY.?+ʿsb%߰:y{^3tRjƔh#JiK' lCi9+Ͻd]mtu#: "% ;K>ZX~g8LMwQjv8ZC[cfA,?VgN5Ir.蝚>,D8r68S5o+w% 6P0 *p5'e ^q 8E=uMum5P}Sp=f Hqqv8 ڹiEbȍ7xU vrֶ2(w0貲> |(ݾPaГ[8J-?un@Lۜ[#-G k# zzsUVʍ$8y8w,~ / y9{u;~jp޹-ɥ\ $AU\,)ly0*T!{%m% uZ"P;iBsYxo|vۑboXYd+ Yn|ZTEz q0h8@T^m ]7(|oi| cgRcL5٫a8mQX5lAq2R )2kw,Z<ڇ,>8HCC!28I 4_M;NL.|gXŷpGͽLj{j }}5u}/ GƝE}n(2!4z{7|^5kЖVtY'98_X3hȆbd/Km$ur^#;2c5ϕ<(/vSUsVnاqj (5s+K^b(bSkR&RbR\3wm),X5+l*G&Ӥ#)kb A| H*uiLJ2|DG +aL7N̽sk}w@:yR %ճ_9[$ei툗7@}=2'wKA ,B 2xh,6Mm欯zXSxSу۹^X3T" _r= J8zUVb=J$>:($-0/aCW%|Qd>}F/ z菭LwqЌ8+ XOnOt}M[DGɲkmzP>F&~s##*dG[! "0uC !ƚ0}n·tt#5|VP*>_Jɼ$ (Jޚ5HljSq,NmS,S }d{0a˪C̣oiXk.sdvPV|+\g㩎itVwu+fsƦM;]Vmt_etɡDh>xMx'%˾㡣N0uNcP(.!B1g:ay+^﷧ҵ} urGG님 t/ߠq :yY26p/.iY%\m|AںqgY-ItGwVpqj9b8HvM'b#͛"xN1ng(0dJ@ ax'r|Y8?f4hgU>@.S: xr;-K?Ύ!QQ˧Г/ͯ\xrs&ڶexn}@Lpac"gL]Qzi:HQpi7K ?Icb_3$ <\! mfq;%W@s-.I6gǎfkY`W98Bp=#.$X1%2P'ꢒ*>ߖǻ}:B}^Jy}7jm* KD >v,Z/"ބ @E~h|461}IRS.`~h֪ɇMVnNc:-?Bb3~ 3bHͨ¨L" +ꦵGHY5l_sC|{mŮ͔7hn[}Ȏ#vgX5kjt`3qY} gH_Nz \|8(zn^i3ztѷt84kj_DZm`#c%^˜K a#h.yկ凳#e>F_Lڦ= <+s,DBXI)K`CÂ&(,y$!PPlԢXlsаl 08.;TA9ZLAED1Ɇ+l܂G L%K kg-uh!*J6ƃv?a )%_07]؉i|qǤQ^ہdп,fde %~[ɱ;~ÉհoUU^44.orZ@*8/> | (ŀVc(g;v楖=s,.-=C5B]Sxx-b֖P c__7Zp]Ia< zEq8K P'z mBeբB +fد"0'jce}9{Ն<6MS}_/W[wgmeCO障")!Z0R@EC]gD{0iM c&m:DW"uG?2];؞BMI\dʢC*&$7dWD}h&6jP@*R=^RF) ¼Y=1U|aKZ^jߐ4;YڟK>YTz@D _sL%(IQ]B!EpowG4V>u}~q90/.j<&ݡnt^qa~ǎ>a]6hjrA4@ba,mufʘGaTd\fs@:ƛ2$e6_> =u^{)R_&FwBp[nYG&1k$̨Ľ &B 4.9r%h=Kjazz"5_zHIڲ@Q y#e:$XZ𨀙.mIb85P>"j/F}\AU⏑Kgŏf$>B'BP'd}.ks9˽ٽ`}S;{V7`@%`ʌ~œMò]ٿL&p1(90]|RTRУ,ܟ`f)ĩ3D.!ߒqfh\ ЍQQ+P[S0B%'pi:t0CAJy<΢kF іD7=.mĎy:9~ѿ~י,U!Ro/nWa*l1xnX`BwMRHďƅUk 9e`,,$3l׳ BINPJpsR jt"Zy 9s|<"h'r7g{;WϿ3>eNUœU#dbS<=y'4?׈M0]jnNzh2CSq>֓Qst}Ov6xXd_!hn\⍣~dviI[QS'BļL5_Qg{Berg1OkdDeƺmu bO(_މq!WSd@i^GR1oo]+X"|&BC1W!k9Υm(3D-vqX!˦6u?ޘ))T)X Dwp93ampw9GBwqqG5rhHuS>o yQR3`M].v4i fKd 7|{i[g^ q^ MIkS!RWoKO{>VpSvo|!P\@ ^5퍿, C\#"1>eU-ȳ#*%RXcFQ.u$>ogEx3:V8X1C!YKҾS_aœ)7ǔ")D9 E(i`bsn앞]XE&(RBaRYY1:BA \XC"0YpKE] .Fk_a ;5jib֯Ib0ͿS]GBbb.=;0p>{aDF;`?HĜj\V]l,Ud&e)!LTLM͜E!*.(lm3G"u5DDs[lI ~شbNr,1,9b@_폏6Js]'bbS\f9CPf#P 8/ǝ)$ %!fS̍6&h9U~zF0鸎=xxG<{=Vm\Y\Cu)ytU{/5j|84$S@|?_f(Ug_ Z)lgz4f OBNRkk [ƅcYRe>/L(=Wr-3 1}!Wѵ*D *BUuTVӅvy=}VS դSwd@E>ޯ#*UGSH,\z_ڐ/JXCWH08v71F0˗=B46HdT#zyDuóOXݰs?M]GȓqcxQWG`wyK$O}aR\,Z1o~h󅷔 >P.Tw;&*D6t  o6 I?>@hÁor9׿e6LJ^$3 8Zcdx;J5!X^hl:OeOd!{`ѷ;GƁBp[>wwgD51l B'2$&tz jTnK>ݏ~GzĿ]{k[N.$&qqNM1">XA߰Kl1٤eg<:әWav(~dl48;gɇU$RzYHb5k>Dukw(>|i\]CF:vB//<X0A"^^ȾpfK$û,:;Dx]!xУ^l 8w͟&Eج7`G `#J-/TY!$‘p ;1QnoGs!K<<S-:W?d_0LAցXod,{m[͐!C Ni|EӕxS2-`ϔr4={pt~HV u,b^gJ}_4jGF.qpMϬK-UN DҗRuB84`l]ĎH7D66oFO8 Ft=V[-@N^m"bZ zf?7d[`|_߲9qZ_C!  (C2U_8%NyHAa++ƨXqccMwƥ}_W(*:۬H#߮;zoFy|,ڨLsmVN_[oiپ_oa!'uJ/iD_>6QNA0x~]c4.7gC.5:tA0r-=FQzMVml3Bmw5XPj4bXygmsf[(L'xYMemL[JIhm+QJ4bĺH-'|=NӦ a7&2sW (N4ȂķL?6!ӵ?fـe tehuЇf "}˄ػ\wFqDc̶L>kn8W5fD72jq9sN@6<߻d Ƙ#"v!$HW+Jt#LЁ4DZP,6& JzTDgq}uONLfeX(0D]NlU0KIlZs)ATqN\Pӝ1D{ZU[S8ޚe:}Gi|zOès.ϕ氋m}:w1D$pȢ)Je<4 IKϐb{Q2C 4g15jO\@[/ԝ|s+(cWC0={!v^P"U!4)Ý `=ßqQ!x4Exw- *2${YTB%<B)B0P8HpBqb0e~5\'K?XTs>l-S.i!~꥜D:Lb8<_a}JzqtExCSVcHjHչTVv(Q߷W\]zqsce4[8xï5kT$%[W9;Fv3?^>G3 c)ꚪ`+WB\"`\a3dH}TE|p'\1Ұʝ;48ot(F&6q/ c J|U'ꟛ.å+xN1_mTƃjJw //5 :x\dx2s}Z&CFkM@l亢>ƕ\x *䖝LB&L]@,*$Dg^-l{zDyϋ2|S> C΃ I(6Mx"0P# C:._ (?V"ڠ sY=g4(]&twvt`H[9|Ţ[Sޞng/蒏 Wg6>W!b :;dzS&mˤ,r"I{#E͒8uNɵe2i.Y=lP46 쳦I/VT(h !!]qWGLڵtr{L"{ lPe ͻj. zA]u>0s eBAE#EO0_「Bl:gm%UOkăFpQ v}K_2&h]AG }WI.ct.U,1WAؼx6J^\C"Rj_"9xsȇxxr#ALaL"(".`N+Up,7؃DžJtgߘh0,2b7+L0~{[;1Dha GDiqE0uAQ-I|2n|G$eyo-'N{QEHX,?I_zv^=^*h4*{}mS-'1 HRL ӵwpQ05/cf ȑQβ >gI%Ti?yً: dͣvlO :I!MTZ. /<<HEG^JQe |>[&̸8p2C4rMgHGH14c\#+^;&/uUlG4ꏿʵGxI֌&~+aH=YZ?l'-rkI`F {C%)L/?H@x2V>0a0hByPHKj51?XNs?IPkwXZH|d+*2{JDۨ䬕=hgպi3֬l|y`s=o<'p&d.$B\ 'Y΂!h& tZZT>y_.jdž9r'Fb 3aM\F,`BoT8}g4u|r~BpA65-[\:aSd0^_7hO-zu5UC1m=GSB_\ڵ!\e'l9^ƥMttd#iY:xK ^wO*,c|B; Uzƍ\!Iu8ti/ZVaB "V !oow8*-\,ф %="w(v$+#HċÂuEBMRSŊS s5}g{I! _,w4j_z<./YQSW#O^Lmps $6PQG2#bt20ɠv2+.FBFSs %Kd[>5,H`JכӲ\o:MطLnAKS~)e FN35_iY*PC5-lyt2dKTOyBos|cf>ȗc}9M2Mo - [p+ !P/twAz}צ}0].x4qDSTdPvM>*POo_0 N !d0[u>sAcW v3=Ed%2<"5CʢHRbE"" %a]amheî+%ӢNWC3/uP^r_و?7c.!¼7ڱz=}T'_00Ȇ ;;La+sN?ozjzۙA't]$$c߉e?a}92͵ƛ1k`5hyanY>K~}7|}<>gQa9=d#\1a˰ԅ>Tn-ki`+.ڒAקH;DFׅ X.3uH㕚eWB>@wX˸H49J9~(r//8GŨpߨy5b\QWš;?hU% FĆxu6=᳏~;.!Q5(<,0N;7f$7Q$ _i Z [YA1ig=?ɞ3f;a?SCX q> y@dK@3OB< mQ .'VI%ϷBɩcPn 8<$dF3pP!l 5Q~9\>3ULS\5/+\-Lwssq^pLO ֻubk ޳sx5>s4{&Ln+\Iiksu:wWXy<>LucݼSudrG3j9smR_L8q[CLhvAIj[G\Duվ YSh|*^#Ч8b5{Yfq(ˏi탒W2Ԧ0# x&JzeMa'=~C@MٸԚO~Rh3 Ӓxνw~.W8E mTvUl{bKU pt1}2)Bl$+].,D-BMa!`zp)9͟ ~juKrܥ/ޢ1\C= )K6nF0SDr%y˃6@D8J%$NUV)kj<)ڞsg Vy'A]鈾+=T?z#N G1M?QunI ]G9 tQy̯\Syt rk+t.TVH3͹M$lGe0IZg%} ɹ}#g]>w=#t3"G$eitVuqf9=xyCIuWmWz3YfַZq\tB#}_K?gndg1᭩;WOd8[ˉe! pl܅"TD^\cD~*[ss'|=EN]C9u7fĜ4[1f溎ٴB`syD:Squ%f0wDvD On|g[YZ]htϲ 1զA?ۚ:۹d·w4AQpkaa.ק=i:PS*\?lEsQOq/L|.3i7" + &=p! a[jkTo#~&QAl_>Miy:sDn~rLjk~/cw5PRL[0TZk0.7x0!0ׇS6nP<< `Xg 4TY F HƞsYmb$f3x!3a?eƣZ&6L5pɝq > }gÝSDNkS2lQ}Gn8--v5y0FTRW8ި\YSPXo 0\qwkV bRJ<'a=͔`V3:jWrfz6au3:sPܒT'R99dH#H7iψtD%I sSf*D*TpMOg5u[f\4l>aR3œjv7Aj ,,3pcKgMIPߌY֛_vﶋ:ٞX~07~$<^p?骒&FFTG0U:,߷.1rؙ˽1ҶޮJ iWCuhӶ p_/vkW:crAdAe><}CP0 +e9o:LeJ:`W6~ӊ qݝdړ'/jFH4D0JdsQQ+l6Qǰ I_b͛l$/e\m]#R&/x-SW v A<_"o80M|Zch&p-s7PpN-WXE_\Æ$=Η{E]c1ps$X%aMs迣yw'de<8鬘xʮRʖr_ʇ+a5k+uIJ< Z"M3UɈwV骉"b`0$ϴ}$/2'+3c#CZϗ|ֵ/XN;2?ݺlc8_=Gt∎g;4dyZl0Wb鷑04r\sK۵b*=] WFA}=ts}(x9.d0xdk՞ jv~}'g`F~xrY|四uRwwK&}3XHeNمLZU|!Ls8o a54{Xnr`.DMP˼vq /(H\B;j(:UZœ@w1Hz @<_V2Z Ye`IBz1,5Kjl j$i,KZNP4Hhc8CE7$wjA tje}aQ苖lp(G.u#R:!tsSFDͣIĥ#v)Gΰ"o7;Ji ۢg,&MovhlAX*# wVcz-0@B [q~2]WޕV ˆ UKpʁDL-i|HWpx$Ws(a/xݵ!jw~&TȨkk }WKz>vWBOZztM#]|p]~>c,A̎ϘHt@TCF1.4sU5wOpw]u֒"IqTGBőMTdZyպc "EA[:v@r̾I軪+Q p׍aG|ULZ2]tvхZp{zZf#R$SvQfתtyCqX6ʇ"5+i{YyÞpqJ6!i{(1;xfo cvQ~,ur6|d2([z;*?UJPZj(IDH8+[{o['bgїƷR9_F.icX)!KݘZvRl@>u5`X i7Y-cDg 020rڷ01ͮJŬ,rx |~}ßgZ{*_)ÀH!(]!ߎ/[d$6(7 Tvw4w i[1=~};jw5}_doj;Msf:#1γݰ"S7ve0?n?[eķ!Cܗ?iJ7x!/?o=] baC1{jެ0Έ8:͚g>tNY WHLF11NHs\&ފQW.zjr_X#} rYۅF_F>[)s@FKVL'K-K]n1&/WZe|S qM(\'25p >mVMe+vq'c@佖&=1%>k]Wbb.Q9EG4;8n:ר*z?0%Np?xb_:m`ZMoDn61'FѤO,2Ûy &9--hIBH~o ֤gDbOx?ÛNŋӎqt 3sgե#հ:،JN`碈 u xH;pԍ+ѢP9 m>Nrw_0оS{hgQ\6orH)D҉m`1SI@|xos3L@d8ILJu 6Ml)CBDR تRCџTi P@C_瘈cv3BOݑu CCHH_‘Lb_h}jh_>Wȝ+|:AUmoqIWk&,=|]AYs,}1k- pWh?@~!JPAQt* k9UfU2%}N w¿Ҟ$1>G|\QAhD"X E!_ P$?r)˃ & H݊dO`91 e-%6;d4J/g`Y KIԫJ x7Gzة_xGA6 lƎʑ䔋GwB?kL ]p[쎟:CūSSu_Ջޜߧ *~O_G^?Wӝ*[P[1kU_ccd{>tk9/FK{goz>]GatXxǭS$ھ,;F~A?&aو /C (w5yj6u ~nˈ^P Ezб \~bCG E`sl"78dr `*^l?-~_OANghr׻;aO`Ֆ?Gk`Ϝ)f7MLWms +]XYjrzWe? INN1rGrMss\&<9gIfx8gkOvNr9? ̃(13%s1[/m[ w  8'WT3Tu{<˒n 囻a&][aNbzzM U /Ug[[H&gƽq}VN.󙞍~L_#]d3 spL&;з--?JN zl/|7/^G:`=(i ΣW$!Z5FeZQP`V ͟Fs$i6uoRKB Q;S\^7g_Crcze!hD|~6)p\ia>܃d;*Lz8PDdSζ)h82oVNU~9 dDNM%T D2oKcnǟ Pt[^3̃=ťyY{1ڕ_Wt þ~I^Yb,W~ȫ*5/O´v8 C\ jɗ\T@4k*%7;vx+JT ^kZiulxO4rִ=їﺂxLvIǿcG}Mԓs\Yb( )wZW벸somݘ}Kd|%Xšǻ>CuǰG-?N|5tb"_|feӄ.ג:y[m@*wdI7jydb8WerTjY6;4)kOlGSiwU]~ZwnyN;#]Xw{!Qh\̓@8E|m\:)J lguK"%.]:1aЃ׻ x A=~ob4Nf*~kPk~&=TxY;`}z0F'WGۭX`LqF߷_ 8}lͻʡ4tpN[zRUqQ@eoB'io;+ *\؋K^@nPҰH =~a}2Ľ@//wmv }Лlڬq?˃ΠDKxvu=W~$-JB(hM~)hM]^QUrnVGɄLg8nW Ӧ#g@ndNd\jLp=͕uMXiA5[RɽnF-lZ#\FC5W;ir%xD-e<:@U,p>(i_M -"ZI1jQdU+RqA#ZK4S^ 5pǑ=yaB-3+M1Ieи0'VYt4E'.^!H,Pu7=몕39cRg^zsjkH1TMԅ9B mjh*"*Ar{)lP<*ؿ>b#c%$״Wߘꭡn\ry/M˰u.pgeZ=#@[ @xڣYGXbGWHD i44 P'F;Ņ6]VFN~TXHtۧİ~+xmWj\锫uVz7yW_zovm~3m0\nd1~ (T'Ks?V?cz~uzK1FPS-a_B顶Ϭ\[ =H3wnm]]]Z8;&mAi Wم p"=#>Rq*\|ُj;ߓ`򖗺{‚)cwgg¬QA} ([nj-\O}ӹmz -eJA p|sJIs dck3 >N;F^%'w#_^mֱGygTёH,kkM`}g_P;o`3tYpvF XA0FQ[2.;tFRuG#f/7SZ z}_ua9?c< X6mtQ}.Q!I: :Q}bY畟j ਭa!(&̑\/7x\$5>6P8~fqv~ٺՃ-RÙXA_',2J|a|fpZJ-v5$Ԛzc92Tyylס=}!qu^It-ͨVƝdoayڐwE*/zʛZH$.nkB-00[]#K"a7bک1֭>{z;u˂*!vv1+d^YIVE˘ ڹR ^TI:s:bLQskэl_߭k+2shnZ5m3ssbU-g_)9~SӌQBKH:TO(h0Rr^}&vq>#ugAκ]Jq"/(cnoM_k<ͭRoul??C" Dd\+zZBHì,}~_Mvy׬zʙvNUbݰ"繲eq] a%-m ڢU, gl^颸u^cj{E,Y=OV^ KJ.J"aͰUK~P%)5(ÎCobh;ojv}d̋4Ƙؓbh9sh5g6q۴o-_"p]@@T*UmXNvt=QWn\.Klۄ۳*r۰ ;.pPiU qRI"4pGxMcBd޸H$Ul3M lFrKv7=w-x|_wqP8,8#.f5㜮Tc^){d7L]kʭ%O\,;cd)u,덏S)'@ɼ(|aY0p~(pCB:ױSF]kS P'3f6!z'M<<d~Ɉ+™G{!Y(UeB>Vb^mgCGWe^sdZDJzYRZpc\ƏDw)&Yw|Cy$CC7mn-O|9a T+PϵWtK!AHȦBGN_3uٿ [,4ٱ]^ 71-BBkS8vGO":]X:38^-ض>!:hacVppq:Q,'I4zka"i!CU3Y9\{ܴb릷^}J] bҡ9ykBEMȯb -0,PP\ .-&ڠ?o1;4;K.P-P i~Qİ ﺢtfEd َ8۸taln/G#R[Kϒ?u8V47 O2>)Ӓza~9EiQh" ++Q.WR?bE76yV {2K0.ߙ4ty$uf?w z.v`2H ~m*G͡x0eWgq):_gqݙ?hlL-D?n@dh>|NW׏$(8+yH2j)k lb!Ȁ>ql9:tC"+3hO|Ǝ9hIgt[!g$ON6p204D" pX44aVl`4$5: EDh"a]w&L@L8B4BFrZSQ1u4 Ma'J Aj=҇P|ެ[q̕ =9~/F v ;Lx0Ja;]~ď7 ٬f!X_8mHH$i䅸{Q̰*bڕET"5JB6Jbδ SICzRAyq31Zp4 ?]L4v`a0hG~}"5^ujuLE*:FR~1_(Z0^LRC[^d)QvKn,u(.mw{Wz}Vt%ס1f f21BA ׆{h$m&Sns(DS֌suaB"{>;SA}Fs =w6ej4I.U \(IV Kv9\^k+\ Jk^Q:;wM_nOtjYeƋ Os}-hil"2Xޭv@  Be ]PkkӲh2F2O|U38c`["^#к[9 k5puU4ۙrU#ydA4#8W-m/1rH:^c 0l.f8l$o3H(N#VvM@4+ݚߜ. e%\\v48 =#/鶟?h£^Q}{ha+y_akbr/|־ |%d`7eC"+|tج, : M%( VVlR"]nw}Nϑ,H$}bኴR,sY4`VLВW+#+lT5TMԜFˆp19o:1oiԈ&8}/.K\ 1sNZttXn}a]ݩdή&;-Y!j]'ѐ۔"mHhj$K p0 SN$qH<15qv=AOߵd= uWj*ؒgcC-M:n4<&%Ǝwi׮c1h ;^7_ g{ 7X4=ʖ[dFE$"jz-vmbWBEfF~.jҶ>@Բ+aER;οJTK@' 7ꌦ jd{F% ܨr%u_A؄ rNGͬWwP~eY0_gߍet\C蘏k%۩=CMfOǑĪ!+fgNMWeB5 ;/oqw{qf=V9?_Ncx'02Tg_G,t%\g!Q٫ږ4N~|f2Q@*!6Mڡ'OZ _";Aڂሃ+$h_hPVpale-64##2yfK:#+$E r[jxݿzbZin 'w2Z &0Aف<|X]DG>_ntfuT!*RWOGp>XJ\u\Qcu uc۩rP'&+I$@Ԙ+Vi%a6Kid̨7h]=*Tޡv܄1gb!VFUao$ +,jdq/#.S%K=yA\pK;>Dޖu_87jsb/[V 30ng#+yT(Ӊy<=fQj«0kIvx (!ICTLie-x,ļِ{ڎp@7s oy?+`ofMIڬE53L[V]dg7HUqnbvE!J, dYj3~tkY/c È/z D5irv@YzjPO[:h`cUoRgo$^+Gg16/"Sne5Ks  @:4$ UGi!+/ISH5 Tʄ(tVft = е%REJL-~HXW\=45%c"$rGh\D1b %d/Tp`SRA'U^r*K%۲A%,-KIJi$sJ՘&crc?=egirxd k+')H`էUlӌWv6T \uB]eL%1l gº`JDQ t(z״@ ( R"DH$a-P?DMRQ-%T$A1 H i Dcp9 R/%X$KbQنjbT]L`(ҥ LTQTIEU@P ,PIAQ'3o1F϶7B3Em$8啎ntKSʁ[ ;U}ߝEilpZQΑQܗ& Za$s۩w׍i-@`-3P uOвT 0+dߏ0Yh-n8{}mJ^iezO}&^'pJr+BF$D^nVi6VN".pi!b u48QJCC{zŊ=ќ iw{.i'ItH@Ts"UeURʵ/uo.3zfi9?!4P`@ j9~}IG[SRe H-M /$HPCP4oBVLM-vrfוq҂qRFkm,'p&:$IG;sj0+zs-t)BC?P x85*0ĨK\svĩNxl}D~ٿϚʾHQiuҋPRPa['~93m4356=1}ѩ  ^?yHrwfݾ6W $όd-H_Y]ȻIFn`5#*];.,vyQs-0? ϳۗwV{)?ݎ:aWd \4_i` 5;pVCk3tqMd6UV֏l2>\CF?p߃;Lz{gf5͟]OrCA4, ྚ bTIJi@`\ X~ &L>t,Y0lJ,9D`@4Qs q⋧pq͕9A ȽepY"ٍi$UaFa 8.X[@z1(mmFZԥ'_L3|ڹ% U!o#'ۻt86n v[AUԇ2t0Sٱ0:)[i8aVJsg'ySg9W+B1ЉFw!!>!9R5!|Vh!g}@ljF""w4S٪ `t*ȶ;%-B).ExVGR$\ʍctHIe/H\z4~od'Jq7|<=A!a_cWw/YQ}Σ| l|E5bNcǤG>le]cME)Izw#ԘIeɉMK! nonEcdO>>1qz.{#>eMei!wOHz= cJ}2{ec?Wn>Uh0hqSGuEߋDh!CB>P f2W-2">4BL&ml]seϩ`o03ja~YJM12fG"Q~Pʛ]~>X5VY Q@Ea+B4ȋK.x^qi\Ht((SEq >yt;yj&q&%:%3Y@$ߩ}BtVL c3%6bCB)"!˫-䁻:HVٗ0 U+rwa,CǛN=jJ8=u]Ә1F8@YwW/BC_[Դ kJāĚh2%c?o"/pEGQ k*O#YR6X~enq%: (?Jb-U[Fu7n6 61 `dBefɑ!Nf f5qo_]HuU؛3w"wgK:|40La86r8?$t l#]Ҁe7Wh$.~>qt:쐓aǫq"YVj4`ĘL?;$4+'9I+u{?3bE}zڱzh"j" tă<Is@ [,u>5{QptKJL_DH$ѢX/w_į7+X,yd[N~6>V: D@&$Qd2a*{\jmHSK_ =*:c5c2 Ģ BN'~O >5=2ve}}Y2 >NScsY< 璑Y~s(*