summaryrefslogtreecommitdiff
path: root/kernel/tsacct.c
blob: 370724b4539185c9cc9b6323feab36b414836903 (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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/*
 * tsacct.c - System accounting over taskstats interface
 *
 * Copyright (C) Jay Lan,	<jlan@sgi.com>
 *
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

#include <linux/kernel.h>
#include <linux/sched/signal.h>
#include <linux/sched/mm.h>
#include <linux/sched/cputime.h>
#include <linux/tsacct_kern.h>
#include <linux/acct.h>
#include <linux/jiffies.h>
#include <linux/mm.h>

/*
 * fill in basic accounting fields
 */
void bacct_add_tsk(struct user_namespace *user_ns,
		   struct pid_namespace *pid_ns,
		   struct taskstats *stats, struct task_struct *tsk)
{
	const struct cred *tcred;
	u64 utime, stime, utimescaled, stimescaled;
	u64 delta;

	BUILD_BUG_ON(TS_COMM_LEN < TASK_COMM_LEN);

	/* calculate task elapsed time in nsec */
	delta = ktime_get_ns() - tsk->start_time;
	/* Convert to micro seconds */
	do_div(delta, NSEC_PER_USEC);
	stats->ac_etime = delta;
	/* Convert to seconds for btime */
	do_div(delta, USEC_PER_SEC);
	stats->ac_btime = get_seconds() - delta;
	if (thread_group_leader(tsk)) {
		stats->ac_exitcode = tsk->exit_code;
		if (tsk->flags & PF_FORKNOEXEC)
			stats->ac_flag |= AFORK;
	}
	if (tsk->flags & PF_SUPERPRIV)
		stats->ac_flag |= ASU;
	if (tsk->flags & PF_DUMPCORE)
		stats->ac_flag |= ACORE;
	if (tsk->flags & PF_SIGNALED)
		stats->ac_flag |= AXSIG;
	stats->ac_nice	 = task_nice(tsk);
	stats->ac_sched	 = tsk->policy;
	stats->ac_pid	 = task_pid_nr_ns(tsk, pid_ns);
	rcu_read_lock();
	tcred = __task_cred(tsk);
	stats->ac_uid	 = from_kuid_munged(user_ns, tcred->uid);
	stats->ac_gid	 = from_kgid_munged(user_ns, tcred->gid);
	stats->ac_ppid	 = pid_alive(tsk) ?
		task_tgid_nr_ns(rcu_dereference(tsk->real_parent), pid_ns) : 0;
	rcu_read_unlock();

	task_cputime(tsk, &utime, &stime);
	stats->ac_utime = div_u64(utime, NSEC_PER_USEC);
	stats->ac_stime = div_u64(stime, NSEC_PER_USEC);

	task_cputime_scaled(tsk, &utimescaled, &stimescaled);
	stats->ac_utimescaled = div_u64(utimescaled, NSEC_PER_USEC);
	stats->ac_stimescaled = div_u64(stimescaled, NSEC_PER_USEC);

	stats->ac_minflt = tsk->min_flt;
	stats->ac_majflt = tsk->maj_flt;

	strncpy(stats->ac_comm, tsk->comm, sizeof(stats->ac_comm));
}


#ifdef CONFIG_TASK_XACCT

#define KB 1024
#define MB (1024*KB)
#define KB_MASK (~(KB-1))
/*
 * fill in extended accounting fields
 */
void xacct_add_tsk(struct taskstats *stats, struct task_struct *p)
{
	struct mm_struct *mm;

	/* convert pages-nsec/1024 to Mbyte-usec, see __acct_update_integrals */
	stats->coremem = p->acct_rss_mem1 * PAGE_SIZE;
	do_div(stats->coremem, 1000 * KB);
	stats->virtmem = p->acct_vm_mem1 * PAGE_SIZE;
	do_div(stats->virtmem, 1000 * KB);
	mm = get_task_mm(p);
	if (mm) {
		/* adjust to KB unit */
		stats->hiwater_rss   = get_mm_hiwater_rss(mm) * PAGE_SIZE / KB;
		stats->hiwater_vm    = get_mm_hiwater_vm(mm)  * PAGE_SIZE / KB;
		mmput(mm);
	}
	stats->read_char	= p->ioac.rchar & KB_MASK;
	stats->write_char	= p->ioac.wchar & KB_MASK;
	stats->read_syscalls	= p->ioac.syscr & KB_MASK;
	stats->write_syscalls	= p->ioac.syscw & KB_MASK;
#ifdef CONFIG_TASK_IO_ACCOUNTING
	stats->read_bytes	= p->ioac.read_bytes & KB_MASK;
	stats->write_bytes	= p->ioac.write_bytes & KB_MASK;
	stats->cancelled_write_bytes = p->ioac.cancelled_write_bytes & KB_MASK;
#else
	stats->read_bytes	= 0;
	stats->write_bytes	= 0;
	stats->cancelled_write_bytes = 0;
#endif
}
#undef KB
#undef MB

static void __acct_update_integrals(struct task_struct *tsk,
				    u64 utime, u64 stime)
{
	u64 time, delta;

	if (!likely(tsk->mm))
		return;

	time = stime + utime;
	delta = time - tsk->acct_timexpd;

	if (delta < TICK_NSEC)
		return;

	tsk->acct_timexpd = time;
	/*
	 * Divide by 1024 to avoid overflow, and to avoid division.
	 * The final unit reported to userspace is Mbyte-usecs,
	 * the rest of the math is done in xacct_add_tsk.
	 */
	tsk->acct_rss_mem1 += delta * get_mm_rss(tsk->mm) >> 10;
	tsk->acct_vm_mem1 += delta * tsk->mm->total_vm >> 10;
}

/**
 * acct_update_integrals - update mm integral fields in task_struct
 * @tsk: task_struct for accounting
 */
void acct_update_integrals(struct task_struct *tsk)
{
	u64 utime, stime;
	unsigned long flags;

	local_irq_save(flags);
	task_cputime(tsk, &utime, &stime);
	__acct_update_integrals(tsk, utime, stime);
	local_irq_restore(flags);
}

/**
 * acct_account_cputime - update mm integral after cputime update
 * @tsk: task_struct for accounting
 */
void acct_account_cputime(struct task_struct *tsk)
{
	__acct_update_integrals(tsk, tsk->utime, tsk->stime);
}

/**
 * acct_clear_integrals - clear the mm integral fields in task_struct
 * @tsk: task_struct whose accounting fields are cleared
 */
void acct_clear_integrals(struct task_struct *tsk)
{
	tsk->acct_timexpd = 0;
	tsk->acct_rss_mem1 = 0;
	tsk->acct_vm_mem1 = 0;
}
#endif
=F2$?j )QUi\tFvSpm;O8:]NJH/Qêc]N7>:oy9 6⿎BH # t5(Iۘ3XvJ'f F硠,,GXx tC "Acք<"I C}/Y dlڲ> Q` 1"NEuAA6vYE9%bɉM! (c`=Θ?eIs\$ԃ:Hi~@)Qæ@^o~M1cUN8"մI9UCiIHPMVVztŦh8bJ"V[dT`Ad%{lHggK=O6-6d=ԅ> &u8$ڡx<jl@ hGըXܾYwoNr<(R1S:!mH0r!powɖ42/; m*aUx2Dt]E'm3OC3܂1[+QՐT~ޟp""PhB[EmbQFƒiNHE1=Yt~Yg} "4Q A,J2!"PDPPJ@pU qcI%444-%1P#4R%SQUUt@=ܹsbm?UlD8jT=l,Wnr#G73N F oZs@Gt=,' uB5f B)pvA$JSu 9zeJLk-҅BPTo_7/Ǫy!u>i,_"Ht4'~ʔ>TA{g']QJ2$Swˈd>b"T%Y0,!Y 6a &SvK[ܩ8Q ّI!T&ukd 00FYBqSujr=n8YjR]nXi/DV$3 &B݆+S (+3ˁFΒ1P佊wBA.LǏzӅK={m`c[~-GY[RݨxT]@}MͺC^qtiRCY~|#޾YQ9e ǐՅncwPV;f6>n!Cѯ_RlePҀ(]陙J+8(jsAײ;qL?Lnxz`}HWrlyǹnh &G~蛪aTJ>L^&km*ߒ)(Z.ya0X1r']~{͂] ͒K\rϽTBdzEzH.h FsBTP@Jn ^cXHs6vڕ"t)Bᚎ\W }+}D( JD e$jIIqZhi.j^O,Ñ<qq(;vondxڙ[tWw12pQeײ Cݧ7 aPQċkWJ)/ @k5TuJ/~pV~oOyJ:y5bJ:||Xcq]%~{`5'])ީ wOoi9\mnm~8Yca,\xN|lc} %%a_;}n]HEî@FBsXm$x+Z1%K;.ILTfKK/QCx&é*%:4bDT"e(S\ǢT Q0@PQF%7JucK˔ݬF#Hb icÃtCw LȈbO i٨* \!*3wsQJKOeJTտ 6 1<| `.N?{1';/ ϒsFM-Ȣ^ĒBG)5j3MmÆ2^M᳝6̀onq=+Q]m(DEd 2.Q-3f;5t-Le!Yf2`DaDaWYY޷S׬uΠp:8Q`pp5AP*"çmZ7N+% _2:<ŭmC)S:IB+8.BUDa=&RdpM S)2ƨT-b9>p .divȓo{qqfK;A.O䈰lCKG )BKA;-pARE A6 !M+*Vmn^#Dt*yI/H Driq}tk'E^:"vĚڶ)1"?(Ly|bT64'9 U LC ɳ!,U)Ë4o呯%f__ß(m3ۉפaau4iT fԲ\.ń<pi*JReL}@UǁXvlIM4v!q4nM=()Q hNC)U!QAU[:=$jE.ѻbDLeSh3.lTCCJJ@Ll 0ӑF9m"Sq^JT'X֪Q@_\eIL瞮hv)E;3V2=4EUT)%!2e!%X*N)c!0ي#*j$Dǒ^r}8o_ttRa~yMww珙1M&[kaW f }oma@3N%1Bb"Ƭb2(]wڕGJi;˵͆S=-ʁoDݺ˒0fb +pJ:IGPƥ5R⦐Doz鱺{$w_ow%k ɼ8'oݟJ+9xO}̹l`2F$ !<1ǎr/9/;.W7ۮ8?+ nߖGygcyun:W ~{X 6E0Gcig*4YB,hCmL` *"2(fq[-v#C_L36Z<2ERllG-1r;G"c]3kgb.d$U ][+D,@e]ޒF|y]rBb3۾3:Ӌ덅(ׯ+X "^ͼ))661OL"2A Idӌ$n'1j9l6,ynJ$YCk4t9'5Hm K.$m4a872ApU >`?"jmsc&jcw9r ,B1$ &CoYv;Gt^*eɢ V|a"r0E$ڽ+}ϰO<|UH$۠)lLퟑ-p>o_efW;˫~wT8pߟ~;sٮ0gZԧF\XgL ]R`QiC*$b5ۚUpMP'E2q ".lL!nR;G&ƙ(JKbXuU"J/{_ |^X+oס4ߙ,&]mƱYmg\$3[gG\~ CrbJ+ҚUbI2`6wPQ%9 K̬qG+ >Ϡ[Cm $#꺾N%æ_f.aM΂Sh^)?BV۾UʛF}Vþ6^l|~CM4|:t,m!L6sPO,-~[" |V i6> Js.11l`&ɡf5fB7a5b/m֋뢬wMNZq;)9ty.=͑_ IP6VOՃ.0&;K_24دz8In u"F+R P^ΒȬСԆ8N$~ّ a#xΣ}yiҘT.]=XtӏgutWk_ĠVp*R#UOP1 -_~G'Se\ cL6i.wF]3XEy">ވ;|_/?'Z'=zxs\=+A|Od=W;TxMwLPۗO̯KtiȓJ TۧMk8^^3Sx{/Тr1ri;2m{Z3ǎT;%g>3jK q mT=jj $@3 [Y9">ĆR"1Lي>Ywl9mr~hZ=mUu{wYe]y?ow,l'yƬ9-H./NY;ldz<nي|zgCw"`SuBm 9ZyvNz~Ŕ_TK绰2;p5i3oC5|y6t5L6]/ W#[bG7䪳GC=y.ΤDS-4TK:&F0(9E<`&hr%Jr}t)pZʄdڠ.ّ5y" a|TE1KViH%VZ*Ԧx~Ud,C+x.a=uڱ܃[a ܟ#-lݺYG-t' &÷KMM*ʢr'`XKop` ?DmdkWw[(xTɈjQ[z&Mܨp4*ORo )qw!)DbSqOD:iAw+péo6@:  <~vf~-֜^q9An=_}Z-EyG ;~8zC Fa9$52"Lld_J~gOcgv跕s'T}}GXxDIWc{2z;MS?vy;Or= u_nnc69'W K"«pZyn__%Ϸ^fGqݾ Y흤Vrpf52F(" {IBRUڳ{g1^:}q7"zi klq0{aǻ5]m^LMR:q]wx*Zf8QgXq l}VQ3)AV`"FyK:9mDhLoGUl<|3IHódfqp`ƇU`c1Id|0_V_&غF{ 5PT)\KnP-ΞmYg|#.ꑦHxũa-YZءHJDjX @DeL*xK6Bl9at:oe>NOޖP@l:T gډ{=2Qh1jI,6LIAM&ʳeT(u”g&Jͻ[q|A/^96EQ!3ɹaUf񑄉w X2=d#@5CKi(wfe3Mp $)mU8ډLuN (@ƿiN]{&^r?/[O:cߪ5 5io"ݴ89q4FaQy ^>DS^'ǿ/Cӟ.T/ݵ`Tx6%hYHa4p&3I}T6 V̓L! {C^}t5Yw;i3RLՇm"cL!_R['c}j|1,|S{qbW1.zaeAO8P/2留;mUy>'޴V?4vR+ETc"0ww]obXOp`Ju}[0Z'$t25mڰ;mkk(gw5{uǞg^ ;Ү;a L.N4#QX<\)vI;Z=/X֟h`Oj_/&1n{YM`Ef2٘⚮f9 G r$,8 7*l&/#RPn0km:Sȼ|RO"",mz%FL'I@Ed5stf\7V uϓ4o@Рcٞ*x_Z C4NlͫipU^D^HŶY`s+fIV}{ZԺ~bV߱\z>|!V1ڠ"0HYΛkciD!Xː  R⹒?(˺3KݓG%0l)Sԣ!DUbō X耫I1Aڜ0:wAZFnyJ]2NjNs 0qfPתtF6&-\g[=Mk׎w8 4|}+1 O$7s1#Ny+jWg@?`|'Ýq~fg:hY`e0.DjT ]7>;MJͅ0hZGᄏu垥'M]T07P҆]CzOʯúL ѦU~uk8~-y`1Q]l 8agN~v4ql}[oU{A* JBB 5PRrܱ Vp"~#n2FӼttwz5,s hUq/RX[x1Ih[k;ϖaH [2=QpY+ko-r6c緣OeK: ;5Pnie4ӼhzVݽ㽝=~o+A3)+~r~xSM=ܫ{N?]n㍼̧/8&c9*lvy4nV朊%GjO1v[ rb+武CN(LlXa=1Z$%զ, 6an%N t*]l3wvYjENgi;j/ӿW sWFi̞4Zxr0k:$fe~U (@iߑb/bCHpYd&B)Plىv;g mFEx?* PB v81r$eЈF7ަvMHq'Ȍ') ] O\B !UxNF*¥*+%#%S6]޿1e*]›!?'UD##6ҾQǁA%!.1*^Cͦn_Ӂv8ۺi&yE]u`+Cm_8-$R6l`$&[I`B ws.ed܎"RJUK^vv{B>C݌۾ &s忯<dޏw4濅>Rb0'? '\ϻ=ik%z350yD=2jXS/2sF>VoFzL~\eT4:E"Dd52s0g)b9N[)V_Ee1Wfx# f/mmd^s45k}w]ah_jy<Ў6L ƺDlp߷W@ /6<Pת D#wN (Ոsk}q\Ǣ\ѻH#015n12 ;ב%@ -@`ڐX|[A.dXaSTu ._*j A罌 M!n>DAJl z,K!0K`D3a4;ZB!-=R%gMwH"rakW7j#1f\# mM耆3H8m<./H%6 Dgʢ\KjAM@& Ji&BQ>=.sukrn{GsG_Q@CApӗff]a৕A~x{NG:Sخs}ˎn|XN͂-`Yj żَ_Vְ8VY^`)r3J  >u hXU,2,Uޣvi)Ìjיr9{ڨ"Zӻ0BQ|{ hn+ z4'mZ^K{YL~Zyʔ7Im*; ˴o3 %sچ|DX./!vZwu@^Đ/&`!n"+ > 4<3iBA )#6R&SpD&L9kKծ/llzb`d9|/}aH褝 Z7Cw"0T vf|E$K}聛\k XL,pRyߐ-iކ<"MCBWX%̿hӟpDB0RDTOUJ$c m ^ӹN/O5X&%=\]|o0f6|[͹-t>^p>mqV*Rl* V`#x +w!ʹhׇK6(Q!t 67jVoĤZ2!兌^xI:K"pX9rd[b-m}X˿vFcZ3e R8o[; #I&$nnW[=H=#@fxHAp0 fD5#3lcsn[D@I-k#x{=>NP@nɐF\Z<Xb!d#gfx] c8W_sDeǞ@e^4?ѡ8uwb<3w?gtc,G&N7%Jhyޱde|7o f+:}=\Gx ؎5LY,Ajnט gI^}I|ZnA%XS{F|R BZH\p-ZDdj+M}' @[d"ՉBm^]n]nmXJI#w {RF).mEXIC а˭*{;X",#H8tU!;TK^oG>[ G1qBuA{ /ɍK>I"GZ3BaHu[R%I/!GK+M#%e..$HhSr/FTZkol%b~ W;f6/ ЏY4>[œE󉧘J"^^q5@^MGgv7=WH2ЭdK[&@"ItM"**ù8 Bigkt'2,mȼC@E9@5-IֶedL92NsXRqKNhR!V"ayp] ,u:Um?-dBҸva]6S[' c /T8D: M4qiÂ%61xaPEУmoW\l~|:x÷Zj a[j4DTuW }Epm~hB;q?yd|abD;`%؏^&?mcru:W^_=70ֆq:(z{c30rbMW o~VI=YqzjFJp$UF=-1<!fO$op/$MӾhI7S I1+QKw_<n#Y$@*ga?`@xy 2e-sYB~Xï~rލݪHi=@y|^O!Ow|^,ZGZIfm^ʙx[~ao:[о=]Ԉ6Se3{.46WY,!rἃ {k{7]%xVǛ[Ϭu?s9#2E>ofNnqʙ:wnZ>&:l_%c Iڥ􂔂w!a=/( (LdɆ,$+ǜڜOq{z#$ U3FeܯL쐩}6ݙ}C:w+gw XGYϭmI tCǭāZuAdB@6hPďzЌB[BFW_<;eGU|g|y{ݨX :U?5&^2$@W>jAzp٬Q{ji+0ka0G T3'FNxl Z#VzxSK.6Kެ_w͸[7{"w1rnw871{л`v*3dXeͺ5p:^P {K[X"{-".i-oql"ܡ A{_}BP< ǵYuM'6kݻH{^K)O/iU}k=oNLZ>0= <'=K˸T>Ss@ f+(z~Ξ<4Qrf/=B=I|/#f@@Ʈ__^dr8d<ϝF6i>@yW6z`A7n]=2D$G;%~#pG׬kOOn w`yx|[#Kn'NN-7;#Nbax )8RF!&Ez3FLL Yxpqt1S,}8}&מ>%tӳӝgSF ݡHCJQyUPD; 'Q8"i1J`һ}lms{|fr|h~^4YMBy8w"XG^(:"s=uG'!$[AoŖ/y`m|WR:ϻ,ݪCp1[!8ŽIGR9uDgUZ{l{?n`׻umm|^BvM%7XT!Cք#ŒuS.3RmL[x{|U4/Ͻ>3U-N[ŋZ5v# ;n #J'yŴܠf kT8xZ_o]uWiba%R>? y϶[lMgaڣ 2vXqڇ"tG)x<߯Tfx ݠ#/"/t3Q&Qƶ>l-UsM\Yc䧩߄S|kxC6v_ws8 ^y(tOOY^QY;>^g|~L6ӣ4)9t+Zw3a+p][mƵGg.=jtƜe(XZlP{b?&fg9vpy>Nӵ{?r^=kCkZ`TA 2Yj& @#_n~"g#}kl!-ɨAlޛv] cm.gg{vc:M(nҒ#eqH~>i^|$8>-`A8ҩ8m;FXô'H#dc/Cxv_|bmm2~B.X8m3%6{~#OeûGϞ=U׷KOt 6z39-|娾a{meئBb};waӇ| V/qMcm!((ڵ@{r<'?V:uSc̫rn0[ >?7傇 67zO,<7]O>Fxۇl7ݛLn2_7\ߕa30lvٴl;K-Wh8WފpƔrM0P&(w3'ӫ1jz=e<2: }- E/Knۈu{|0?7 |o{Q_]S lF85t@νՑt'TL(-'؉Q{_4I@8L8P75$ge'0qM)<`X!3ub۷Ӹޫ 8m6~*N/iGC aG½ܞI"*ėD 2) A<ϻ 69,a䜷~z/eQ  w/*=c7W񽈱$ C9һ(hlGInGիdA5#-g{A&lJLט?ɍWT]Þ:hk^Ѭcq53b6+Cˢʏb[\O.S2l1r,5kD٤sz?9~blHsf>7Mӎq5]z2M (]E{H*/u?#{ x0ς^V~_(0>j-I#S~ 6o;ۣO>vI[mǞ?M>4{b4Ű96)=*YeuN'J]/tt(ǥD_️dU{^Dh' |K; ϗOVOaY7MƤ^ˏdl_%t2\; ?*C10/당z< xL7RV{fV%P@2?.DظH15n_>X\T#8mf7FOR f*ѯt-&36ZlʶpkJWkԐWeSjTeyWSMIex|OnޙvVrw8z:9˸B=à!gSx:. NFNYQD8(;KY&-݃ dvnz4$ vT7Ԧ:_1{*_i냹3m @B]064\g鐯 F!IF#gVMYpw.Lnz`zM`m- : aO{she?d6q=ҡI$]>n]!O~L]dlNF*8Ǎ@Qb4f6/RSއ N {ZTm wt.Hgq]4#Y!_}{S_Kf>sϐ1Q)kbWD#HSQ}"9rYjG*QX/mKl^Wm}_ Ƈǭۃ}T|1c7Ƿ$8/;^gcjP&BE%xro|lY@Poec  D$4[}DĢ3i!b_HLy-[]oF(?Uu1Olc7%YQ_x|SOk_Lm/F{yϏVUl$xW~ģǭmghӯ{=l[(o:^^&M孱LF&N)#-tߖ˜KowiN({H\Ͽ,!C@ѩ*jFߦ58࢈ZЩ ڦXC٠:Jmk~!bP}~ޜp%|{Q1AjKkyd~ͯVhƈӮo{xA n. 7w_$$Wts}yszCq|6uD:듃}穀`2<{pa5^s|\nLoNq |XIp##} H7'UÎnm#>]fϘoO}\PGoI[,tۀ}.G Ni`t:݇6@`o|Eacv^II}? jυ~6]w`{3~?W~'Ł,+| /ZMJh/VbJKb\nRFzݿnzϦU_$Ir'7>ҬVv`sVkv*|Ђ,iawFR _;LEU7G<%T'<Ǹ,>}|..ڗ=$iX+|~jΜd}vx!] fZ*YyOXs^FPƑq9<M 6}>N'%Vi<ګ"֮?| '^YŻsp|5PU C O]sXq1wa>'_z,(3gGI$ B^P>4w$uj~UUҢ mַn[(耖?3ׁXHƏˢ_Mr54Gj,V{'ip>*Q=-a&jZFhu2 oS$$EObfuL8XށqN7A =DpoWZH0@zf|0aOj|>s{ -T/CvݑʳWد}XDZ>]yu^ jzOt8 oj&&0+f~P]\eOXa~w}ƴ x3.v#jBxZKp+eԾ+ Un׷ϣe =K650pF3}4Oۿa M&vЦʧYޡ)r,8{/8yțv\\h?ݽ"{ gEѼz&$`䁴48(7y>v9}.93:jzڮ^"/v &aoԓ9ofǝUe^䒠=X^{(Le&Q[^O͡ }XB*1>Fzfmrgpw;PIIq\O-QsWqo9#X(ӈ0[3Dl|}BƮdn_s}._C7 r@y-pGKGmӥ'mV^>[|zS n>L=</(sym̝Xm=ǫx'lmi^ |-r ]$"m'v,~ lT8I mX <,/k`&–_V2m>/KHlmtWNqlxw_푯^\|z|#L;﷙hO867oH#5}|N߿{zz$+qt|7gj}V=D|g*Cv`Ab]h|$KKOMȳкHRddԡ n#}<9/#)GtA#xDwAP: Í:1#gӇ>TTu" MxMrC LVg$̏i~5:p7qC޸Zbwq~_ FTg>?)= 8_BM~e. od{-nv1YX#eLeAw߷{ʛVP| d]ؖY;9G1T}9A},^\>7ty~ai`G)Be5`@">mĀ1Xǭsź܉ N^~<`K!:G#/' nu9#gkt>Fଢ଼zX𼅳|_W><`tҬ+e7^ת@=@engXd~cB;|Wۊ𧓷|${υ+]M~_AAZ#`ETzb=9DoVgקVP8e]Zt%dhfZDN,T"JB ص ھ~}Ut;\N w#T$P;Bt]E*$X~.7oz]OGK{%9g $`*{@ˢkz -8;8if;2j|ZܴB0Q61i]<[~8NXGڅSBK+md;衝!wT+<5l,$-JhKCU@D[H0TÍ֠IJm!H}/S`ʢ1U[aY)ǂGFOͩ7O.۵7w~c͹S_xb)W!װ}WgON㣭/ |[77x`,j,"x},1gÌƨoWI{9 qӡ( uż'h s-)d D>-}/l=ӯVv+1܆[2@VXQR؟axv|c,Y l >״rn T>0㥠8ۤc#}kW؈hnC5|?~p揇u6SqM_xӰ"I Ņu"$G;a:Z`iYx5kMf؎r"[ mXxmB[~>2z|lCHF2s e8#%4it }G>ʦD.Uq2z?JAz@pJrEK|I!#lF{?hKz5e+q,;}+o@| B$\ى-wSD͓K;H7ͭ䜻G㶛n^wcQ:ۅ$"H,OGGKpl4q ۛԮsJ^Wm[S~j>h%~^uaŗ>kkK޺=+T;NIw54A$$=8=4±胻Ӡ>rk?;}">7ĺr,>haw\fl%a^ .1>X|dlÕ'O>e>ˎTߔjx<7Bi撸tuEP=+1PQ2Zy"yI#zi~Pآ/8N:B̘jfI'SXӮky/fAϾ1a!N=ݩHox $=i^iH̛8iǣ~] ol̪b@pA\QCa?O#K{%ǰycr?Sis(@pbK_{#hBw6φ6nʛq>\q74ԍ/yn941DViǐ͋H,@$,\3TR輣C$PdiHRIH 91ە{GKfg 19`BNșބg2ϳw7cwx\{PϺO1+H;w5a944l{8*ݺqaYtE ;wiѪ[#˶!vݳoMN]e$Q-&(zDz ]{{@׾YQd@ǿ `ɗclIА+:wς1o=OkyY囪G|r mI<, %}*)t7Wt9}s/E.y܌3ԡ^?|/m/˟C`Ul%վ[k>kPm8!F\'0–[2$&Ǫcfû})R䏋"z cs~1'ՎVq6/]޸xD9˰tinbGU>9%"m<![yζRFzcuH\m*6"t^-VmwX|Saf<.S{j׶q6ED&ӷ}wL#îp@swȱ&e4Ժ>DQZ˜oϣ;yzZEEc$ͨM qjok#S7W,xǺ.YêELcgBm|fR=M[Xj౾UNNOSR6w ߯9/1ׯlmiV9,>R jr&?{KD#AhU8UE|r7~$븽BZ.=vP"C} b,|# }Yy-L1pl``dNfKUkRht9~ﳷl|>mmۿNG lYF($D *gZCڴBuN^|r0;rDόF)[r/:?ޞ߈/ujL ~>Y\^^D{~8\ri+wt"i`D֧Y g%[I_KC;X|~\05K:Ku~cXË:{n&>@fևr,"B"#'O$oHÁ:ͱc2#]鴒0dqoF۷Q/Zg`͵lDdK u~PuV_\ǟ,+ƭ6:z }v|+kν|<&ɸ'EBz= 3>_cDA O5_wǮ|[Oǟ]Hϥλb{+[.6\7Lw~xXm_.3z>߽xf>֊.0Tgqv4mU|V_Z iwP=K >x"3kƟ@yV6?iѶ\ȾGK {zM?=VzPŹ1Pkx3E(bD:QEș.`hN:;x's"3>g27MN>ڧ"=o¬3%\[<{+&yg/).o6opǧ^н_g$r-aٱ$?DrfCGѕ@`g~{aVDЬ,1+C qd:؍(j2Tk S5m_l {.cM=ӻN-8u~2LV}Huq*}7?'>Q/q3}砀]^ӫ"GOLvtwTɯ\ϪϞ%l;',"1b"fİ,հvak=եidV8>F E\Cpt[Ox;*5Օ%[3ȏL MPiEsA ZV;}@t-7jՏw]kjOt7 '}=|=7qyw9궼:h|^#վ|Ҫ_L8#&Z[; oRe!H| ljq?D#g  y>hl&y#2gcѭMB(\nj`njX6!u2pd  +='@au%_~4O'f@\ nZwt@[jD-qk:#~)'XDzãS`Xbj 0^V6"۵-|8C9eaϭ8Z#E c5se jMbw=K41s|'`\n% H@QwEr=&h^L!C `-Dg~kk}pz)"]Y=&1?4mŏݞCĀA ßJ,@-r??h=&;7aM݊nrKҾw_ ~K'9Yg ,DUk<|˹kUVS9H" #I0."J}9Zfqs{A ?`}H 2i>tXNM՗˥ +{'RMEb"آsk8}P,Fc&diD0H!9S ?L1BTXg@;>-B-<3!F\Dɽ)Ij}9J=`!U^w: Ix};˄\d!WO˜I$+y'$QVl7`ceQrVm&4h#a@b,]DJH4i( /TgpQX$l{D/gqFp*!MRjޭj DDp4I 2/a&Mk'w 1"!Y"v3Eމw@)Sk쨄;/cDGn3ZZ ^Y1 rY?~F)$BRhg"r@r@>ff(K3>rwidBW| E.0w ţ)y$j6 år~à|P,o|:{D kNʶ9M78kp\(.>+rO$px‚XV).\>=A ˱&S t`Daa/jJY :HAF - SBiT؋k }[#YU(4T,-<̑&}gWWBHO8WcLu֜LZثW4}}ٛi:]#])9վ\?z#U(^xqΗgNiΓն­aSg(GӾfIƄOnv‡d)z2ٍ-2Yvy,?e_Oш˧FDv_8 5j4v'ؗLc׫.٦Dx+5e_e '6E>H ixMMۚa;Z aְ/O$nFߐMkc}EF/k+^y_f S.皨}S> ˄  @3ĵOw 3uh({l_hC~, +$&=d^S;vJ+F6Q|6b؆%. իl$al85McY +lBfC -@zW8kn3}^3n(zT>xʦ^~a3:".S2]b:#+kbĈh"1㶠S ENߎuW< 9(N/f_ϟyKV-=n6iCMH፿ F,$9u# {;Y= Ğ矣/IE庸Ӣ \-=Reuf ?Lr /#m,*1~:Ќ̏0vw.Ζ3jكFs%nM$GS~;veu6| ٿ;%tOp+:֯MX֯" Y] Sh/:OOc#̉E.ɭ nG [kl+yy$ఠMf!3y q":77W8Ӿ of7l@q [f@ t,*#g7g} 0EۣYM)sfN9`0:Եg ǹ0ŎQKY(eĆ \*e$Ol;{ll&׹1 L[ S[rv|}3}#|^m_]bɇۜibjrX{~f6#dnL)̾ZND1[Bf&%QE?3Q#zwDך &%3mA݆Aޞ9]qq/w˛Q<D35e?ш]cr6chks/@tiFJ9HH=xMl]m+{2=_:I>[ ߨot]~1?]$%ה\uBjM]$=ӉۮOLn6C-O>M~W`KkC[VݳmOCr2,NFKWjf?z{t F~C/"wf,:m֌fnM_;iօT|.AX e!OMea5)6qDW=%3ͪZ[6UJ]N݈gąSc!7:.CG# |KXgN%t?smDyYz!G)3 P[VTbԈ֮y.66#v@$7vJ(+n9oy#!N@4Bt"k c媦J&>A\sۘRAӯq#uzb5q-/bzS'|PornzA#ZѲ I_{Dn*u肜(EuӦbbr; 7T?񊺍?k朞º!,vLل>kmkQof ׭Ls!|s*qIa$vL{fHӄ苯a3;8XI)޶M/Ez2(Nmhq#ơZjӌ8YpWq7ƄYckh/di*'4,qڼ;33<չ&v-_ЊjTٲ,1[j"98Pˊx|Еa+^gK.],߻%7W3oi׹" ώ_7~ffo.1X`WN@ZP=ՈGx7ln|uDҜ?86Ž:X Jʍ KE 1 슧ڂ$xdp"DATe$[FcgԵf[  jǙ [cxݞߥ>>4vz_SŽjYsdX@vb$o T'GEG0{yԒ@:zqæ,` |ŧyФ/` ߰z{sn^/XqZjY$?Vc,60މ7|ְΣqj u>-qnac:۟Q>tϡr<eԕz*`=/[Ƅ _Zc@z$gVQFMw{[_Nk\F|?(x [5C׾60Dgڟkz;.FM}|u]u>!jqz&؛r:ظՉ pwn+|0n6C.%,OHRyf $<{Oo NwJn1SkWb #I}Qv_[n碑;U0+kxc~{ ns#-t MgT1 9 `?gmXFPؔ) lڭQ>Dzd7&`}kn![&A@Ĺf [aROg6!ϝ~;0d|M6 NE|ivqC/.tAnH%| (k t5S N6]FbwG?w~3jp|tmyHEI#Jo)Ⱦ;F#qׅ{shAp7n<`O)L.BqC0X 命,~8(=yC H U 8xyfY8okgon(n#KX6}q?i[y wtV}1|d' l Ni+u6krDI0˪vuu#T6ki3'ˈ"|7M[Wv]78ӺןϻMEp*1f#j_g@=m~(GA KDz9K,+=f/R0Ls }cfSVٮNr<7ƾE[/y SE!>vvG {z-t/NC{C_ zZ_/P ^H78^e$oHmXSnzO[.z,o6uQjAPJyQnTqɌ;D[7t'{n, |*m0'p(o3ݛm|Q<#"f"E*ǘfBɋdq>n*38jypj<_? q+{L_ߞ} V߹G]JLO\0HdzlI 1A ׶/n>賘>EZd <'J#a:*Ʋ?˵gqvgUxu`B =,4o9~s~C_w Ω~3%}Q]ȹ`^7=@^o=:Nظ˦yۀ͜1.[9S/Qnmma ;fC<\9ȵ2F- lj&7Iӛy|,;bx~ F2.5wO,DiZU_`:é/fP_4ٙ/w?E)ۅ/h X{v}} zYGWx >f< Ry\A[FI2H)BծLd~Y:Xikr=bU^r/Sl4ćsO3 7-g :j$"=o|Zn}*S?e~ƬբelFTNau RPĦmPb]k2񍚦~pj-g#/֗gUg鰍JDwM F":dfv=vyar3':Z{>Om{N[jrt8F!iNitO~G-8pQk>Itm@-]O~NN&'}~I]l_]PCdx-~_`}2W/>w{t9B~6OoPjoyǩS|qm`^MuZ$XL1"(IM#~mnp Gыڑ"w.ΘAz!4 9a׸{c1ށm7i[OPPEȁSSo\dWwDGf9(_`sTÐj @\#IWXO $,10`"CSB(1ΚV$yVGw.f폦orK|m/ׇ_t:VlDxULJysBΝ/br{Ŗ+3{#گ_Wk@8n,, X+C@S\?]y49fk*+Slt; @bxV.P%`9CZ{xwGj/(`!،tHT@"Wxc55Рoh'yX \]XW8ÑP$5`wk"$jOĞu P_ 8<`L߁WP!Ec`=ˌoͭogMoQ1=v:%DXtjόvXA>ic[a" ° oy;k)l3aF-!\ReQiˏ\ Eٚ%]EAˋ9$4os㸾u,/;ۋbO/SLmvΌR6(`sdRs"XqXf1a&;"o/C:v㌶9mU4 .czѝ'E|WӸ..*M7z՜՟"NEaY S7ˋte>Y^.$_4c};q&m ãĽ,׿^,29y‚7HHPfuCv]0J4 s]Dư4Dvj/|9F,ZDp.cbYߡ[jƯaQ3@ڭ9 '@5}OAם/7=:,ln5`BN-\P~,9gl\meoqm\YnDumPp Jz.Ґ;" MMu KoYJa3AXLeAC3WVBee (Fֹ37:Zۋ Zkf肥/sV[ͪu*@&[(!HZьn>iQaR- m| eŶmy@z|GZpY=Qf>7;eaG,]<sK6\u]/nbQ̙n͓cXlk<OJ9zWδez$y}vC]n}SdH~^⫯ jʋiCo?~\sl)n"#Z;D R3*;v߳[`nfP6n׎20T1ְ6F΍\yo->H4~P6@R[)ݎ&d$*rW_%{kZq` AW0-Һidc&5|+!d(i*9;nVaF wmҷh{e@XQX͂W~%Q]l9ˋBǤDžz`qY'\3ܾ\aԆoP"|D>1F)Nv UpBʒ(gϛbq{"#;eNMfL~&m}Ȼt"ǐF[A'֌Y#WmBwsq,;9ʁU(5l2_ $to9hLMpO^]x')s`wFR80s=:ttGE0w:nˌI;shܟR ͗{i9eIdt_>w] I!-kޚ;gϝQkW鬇-E{ OFIst Fة.o:*ÛG FFѷк'zԋ=V"ECq){p ͥwڸ;3,dQnLthDmp:XCڸ@ZMճ`x <=аXTIxA0m9ۧ $[m6#ɭV[m=YM ߢyq;_}u獂I[rVDꏩSI8Zajm@BC0S@YCr˱po)j֝Q y^2/vU:]]i݁ ;Q6=~Ә-fy|tDѭ^m&|ʤ#FDvql=;^0: `X=pF .c y ?C"H yuibZ2Y=^4!­۸/mm?ZxvYKC3l.Z"bDT`8EMyeg?5Gݺ_tt01Z`]U5:#l=KFOTM\H=׻+g))ujߗa} Y@W 2o7-+C܀׻{F oT3)6p7hql!``.-?6믯~ݻ^I=VDD7.|9E|'xH$H5#4B;h؊Ў.>Z*CGtl~%vq\} g(#y#sx n mݱ;5ŏ{#Gr྽`l5޻uJs08C$wklB[ +]fl/hq#_N{pD7dmA_Wf8hg uD p3V$麤tͪ?ύ|iߛ *,@i$*3WOFٺlh{yJ {g/}vB^?LJտޗu:`K_h{z50=sգ#{H7u>#///~nИ~țguON@y_|눚Yt# ︸{U}=FvD%.4w6$W.PDŽ3*z<L+EԾ*p+jS%mSRϾQb.F66NX]E,{w{j(; oB 9rgӺ1gWg,#]wd_ X#gPCDKKkǯP[>E ֏_?JaLKrh %tڳo9;eSg_s6Rxz5EʮKǢ<(>sJ3Zx쩵(*<>#Z؇Omu oTiPY!K;P彦҅}؊>uw=Lsg`oi":HBe0x8u M@uEv>?P[Ml4=WI{{&#\sГp4 8R(B8V;IX/s]].x6Xpn/_ `}INFA=]-t|x!չMYBےDz!TyWO.9Pb\T_y[>h?hc(/8 Yv^{v+EC $RӼCY}h(>/,Xƣ77yn^&0i#`/?ylߐ}}*ʱ/ |ExyLry?mKnCP>|}"x)xv,SbNLVHCKEq.$1$օb\OEpUlrdJt#$ùhlg<0p.3wHm d^"ĂI.\ zs!g>~Z`W߈}/#osoPh.jqN^ $ʶg+x(VO$ Cje@fD{>%a:]:i䬹fGDZ(pL ^h+/E 9o;w.L`xAJ 1/xր1gq쯎| йl =ʀ5`m~kø6 l%|čocHTצP)#B\A fyuβgNvۗG-cn*BQ SkN~ l8ڏ?#;|Źo7= >{0N|6Z5 ʰ[claSv:]q\fFW551Lկi#c1nb v5cچJU=:N]OGl筞ҏ"kͪD^ gfa3 @6Ab=WkY,<ε9זtX^]<kXr?TfQBB2sg'Q.=\ϪZr\:=#,{zϿ_>;c9*j:*Hw>ؓw6О%6ָW脝_qi}p,,:Ci4W돛GиtqSHCq'oݾ9]9uV5(XbS=lT$X86c3Nj\ªvA{|P5 wNwpfP -&7DxQ(ƥ^'^Dw9Ah(爵 { :G﬌lXXi;gS tGk6q6:!fӹT?W&Lm{I,81{x߭c"fh*$PHcJ}oÌ3 R934sN2%Šs0Ãu7 ɟ;O^sѿB8{TlcyqdZy;u`ۭ@[z'xrN!'>&)-ohCw%q#b Qq_]7OCp;KCbKD &22)S:7/}Zs[kskv YjspnihU/U>`+Y?\ /=[.'R~ Er&z{HA @3$)ZVBKJR,dv'W5/ '?ɰB-bir0lyE`= ɸA'v3]􋿧tTvy Œ( %1pO!Qq{HAŹ ՑT߀J0ø, M)BNL؉`c"BgH`umܡiDmZkmKIJ~,uYXڊVG%ˤՃII ak[YvHk~wEb(=迧vR{ViHhT0՛kCim"#oºJYj Al46@ʐ"g$@ry]BߧdO8x ;ǴSyEFV7mF%(yMucuVrꙹR|?1|}xߗ6AXVo,90FAeh { Ӹ}h DǏB|IA4$>>rjtID\N-% w4&6fBf͉kUi|k39褵Lqьb0F+ '3y(%3`T Xvk1i~)TfY~x`ڡATP%&4Bcn7x+Cآ5xnEc@Yrd B^8ʁ -Z- \$ap!6UBF] Rɼļ0"Ɠ.Jp,>Q>32ez 8j(BLXCmq6Ѵ 6<yUc~oF/c腈{4؃AޡE^5@ ŋ`4V){ml6eC})2xC x)QidX r, O<ť% q n5-SB / b{%v-n\>#_%!x1韊PYsAS P~W̪Os.xcZ@.AuL A><{HV?חqBeU $E*ülO9A$`Z\>9v%B LR_4)i&HqN@L=]UfWHu]]V&]m0B%ǜ_1ҊFd"$ } ~y_{>'w.Q.shuc5tsAt)n֐huZ:JKvN-Mʎu[NXr#WMOP&70<<-W"xuLEKޚK)Rj;GYdPТ;QJ=LI];a Ӵ( />eۀ72"cH )`PڬvXVȈ`f9K&șӚab#[\qyb f䢌xmŀs@qbDtYmRMb$kT=]ۧʄs~/;Aw&DYz|x_3פ>; ՈBn+ vF ><zx ά.?)8x\ORSE|O"^:|^>#ݫV]-k^-UL ?Jn%4`۟|zy}8A\I,ьvg?w{Kbwpbjq00! P&fq(a hAɾ6!O>GQ։/e}x dHMiDf}iBFNƎ/'ACDKQr܉6}as"$@V?[~{#Mȡ f51f 4`t??e5E.J; sT`riܠ t042r[z=>iң0B{d|rZˍEqIhGo OB(i&||=[΅vws ?ɴ¿wm~,UR5qkD- O,`Ra'_39@-e5m D4YmEǴ5 –q{ga2dnUck{w{M^&}-_H79}7 @Q)L:Gpn{"fvFpq0d(?chvoymBkkcjM cITzRGo4Y}Р02Up}O>y0tytHujYUU-3c_:V5Šk)|>>6e?ѿ *_NiRI >4x2ZѡQu&$ppb_z;v9?)s对ϔxw >:|-o= ?:6,d=:޺ mk4\vYC8 ___iz}G[YE1IGOBD Ij$d",* KwH[w.L+d*+q nS QKv#4u˩C6i58 !:Wg3UWOPðA* xvmǟ_ڧz^ OTiaj_>{@*i,Lz@ vH 8 ^xECM$( Brcl[EM_0XU [z,kyEVke@b:viйnNMK=deZT'WT8n*$J" 3d&LB\X%]Qto^˪TG0=n?@v7 x}k3שs-i~U|_5 GQDܘrI F4̦<,;} QE%HzjN4Z*aF(k2%*t /}_coCW<:ZƞMQ}ʭkVuiJd@ŰK] d\C#aXv;2rxN&ů> xp-uO>εqSߍ*0V:´cr-Ű1'(}>z?ۦq ͜?5=’Χ>?Q(RyġfsM@i.idPZ{DS >TJLb?'iSJo[U֣Y[[>uON3&uLku Vx9WNSG3vF6f`V}-݀lǑR_k=]`zjGSq11he{#ۇJxUg<9BGnNeyq#rq6X+ӥLA.S;Fl;Km2s1~a+hq%#,ǜϑֽq7*E'yQ[ :j lG9NQ#!$n8fxluC=͜ªu XCj*-x_N}>OrVW1QO?|X@Oš@~OA񿻏}GL|بQZDt^ǫ!~.O^FՑ X}l}pg m8ry~R=D[1-pHT5c]ZyuއɸcO%twjÉ{GTm\=צ 1K~m