summaryrefslogtreecommitdiff
path: root/net/sunrpc/socklib.c
blob: 71ba4cf513bcef3c50220db640b4ab35e365925f (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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
// SPDX-License-Identifier: GPL-2.0-only
/*
 * linux/net/sunrpc/socklib.c
 *
 * Common socket helper routines for RPC client and server
 *
 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
 */

#include <linux/compiler.h>
#include <linux/netdevice.h>
#include <linux/gfp.h>
#include <linux/skbuff.h>
#include <linux/types.h>
#include <linux/pagemap.h>
#include <linux/udp.h>
#include <linux/sunrpc/msg_prot.h>
#include <linux/sunrpc/sched.h>
#include <linux/sunrpc/xdr.h>
#include <linux/export.h>

#include "socklib.h"

/*
 * Helper structure for copying from an sk_buff.
 */
struct xdr_skb_reader {
	struct sk_buff	*skb;
	unsigned int	offset;
	size_t		count;
	__wsum		csum;
};

typedef size_t (*xdr_skb_read_actor)(struct xdr_skb_reader *desc, void *to,
				     size_t len);

/**
 * xdr_skb_read_bits - copy some data bits from skb to internal buffer
 * @desc: sk_buff copy helper
 * @to: copy destination
 * @len: number of bytes to copy
 *
 * Possibly called several times to iterate over an sk_buff and copy
 * data out of it.
 */
static size_t
xdr_skb_read_bits(struct xdr_skb_reader *desc, void *to, size_t len)
{
	if (len > desc->count)
		len = desc->count;
	if (unlikely(skb_copy_bits(desc->skb, desc->offset, to, len)))
		return 0;
	desc->count -= len;
	desc->offset += len;
	return len;
}

/**
 * xdr_skb_read_and_csum_bits - copy and checksum from skb to buffer
 * @desc: sk_buff copy helper
 * @to: copy destination
 * @len: number of bytes to copy
 *
 * Same as skb_read_bits, but calculate a checksum at the same time.
 */
static size_t xdr_skb_read_and_csum_bits(struct xdr_skb_reader *desc, void *to, size_t len)
{
	unsigned int pos;
	__wsum csum2;

	if (len > desc->count)
		len = desc->count;
	pos = desc->offset;
	csum2 = skb_copy_and_csum_bits(desc->skb, pos, to, len);
	desc->csum = csum_block_add(desc->csum, csum2, pos);
	desc->count -= len;
	desc->offset += len;
	return len;
}

/**
 * xdr_partial_copy_from_skb - copy data out of an skb
 * @xdr: target XDR buffer
 * @base: starting offset
 * @desc: sk_buff copy helper
 * @copy_actor: virtual method for copying data
 *
 */
static ssize_t
xdr_partial_copy_from_skb(struct xdr_buf *xdr, unsigned int base, struct xdr_skb_reader *desc, xdr_skb_read_actor copy_actor)
{
	struct page	**ppage = xdr->pages;
	unsigned int	len, pglen = xdr->page_len;
	ssize_t		copied = 0;
	size_t		ret;

	len = xdr->head[0].iov_len;
	if (base < len) {
		len -= base;
		ret = copy_actor(desc, (char *)xdr->head[0].iov_base + base, len);
		copied += ret;
		if (ret != len || !desc->count)
			goto out;
		base = 0;
	} else
		base -= len;

	if (unlikely(pglen == 0))
		goto copy_tail;
	if (unlikely(base >= pglen)) {
		base -= pglen;
		goto copy_tail;
	}
	if (base || xdr->page_base) {
		pglen -= base;
		base += xdr->page_base;
		ppage += base >> PAGE_SHIFT;
		base &= ~PAGE_MASK;
	}
	do {
		char *kaddr;

		/* ACL likes to be lazy in allocating pages - ACLs
		 * are small by default but can get huge. */
		if ((xdr->flags & XDRBUF_SPARSE_PAGES) && *ppage == NULL) {
			*ppage = alloc_page(GFP_NOWAIT | __GFP_NOWARN);
			if (unlikely(*ppage == NULL)) {
				if (copied == 0)
					copied = -ENOMEM;
				goto out;
			}
		}

		len = PAGE_SIZE;
		kaddr = kmap_atomic(*ppage);
		if (base) {
			len -= base;
			if (pglen < len)
				len = pglen;
			ret = copy_actor(desc, kaddr + base, len);
			base = 0;
		} else {
			if (pglen < len)
				len = pglen;
			ret = copy_actor(desc, kaddr, len);
		}
		flush_dcache_page(*ppage);
		kunmap_atomic(kaddr);
		copied += ret;
		if (ret != len || !desc->count)
			goto out;
		ppage++;
	} while ((pglen -= len) != 0);
copy_tail:
	len = xdr->tail[0].iov_len;
	if (base < len)
		copied += copy_actor(desc, (char *)xdr->tail[0].iov_base + base, len - base);
out:
	return copied;
}

/**
 * csum_partial_copy_to_xdr - checksum and copy data
 * @xdr: target XDR buffer
 * @skb: source skb
 *
 * We have set things up such that we perform the checksum of the UDP
 * packet in parallel with the copies into the RPC client iovec.  -DaveM
 */
int csum_partial_copy_to_xdr(struct xdr_buf *xdr, struct sk_buff *skb)
{
	struct xdr_skb_reader	desc;

	desc.skb = skb;
	desc.offset = 0;
	desc.count = skb->len - desc.offset;

	if (skb_csum_unnecessary(skb))
		goto no_checksum;

	desc.csum = csum_partial(skb->data, desc.offset, skb->csum);
	if (xdr_partial_copy_from_skb(xdr, 0, &desc, xdr_skb_read_and_csum_bits) < 0)
		return -1;
	if (desc.offset != skb->len) {
		__wsum csum2;
		csum2 = skb_checksum(skb, desc.offset, skb->len - desc.offset, 0);
		desc.csum = csum_block_add(desc.csum, csum2, desc.offset);
	}
	if (desc.count)
		return -1;
	if (csum_fold(desc.csum))
		return -1;
	if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) &&
	    !skb->csum_complete_sw)
		netdev_rx_csum_fault(skb->dev, skb);
	return 0;
no_checksum:
	if (xdr_partial_copy_from_skb(xdr, 0, &desc, xdr_skb_read_bits) < 0)
		return -1;
	if (desc.count)
		return -1;
	return 0;
}
EXPORT_SYMBOL_GPL(csum_partial_copy_to_xdr);

static inline int xprt_sendmsg(struct socket *sock, struct msghdr *msg,
			       size_t seek)
{
	if (seek)
		iov_iter_advance(&msg->msg_iter, seek);
	return sock_sendmsg(sock, msg);
}

static int xprt_send_kvec(struct socket *sock, struct msghdr *msg,
			  struct kvec *vec, size_t seek)
{
	iov_iter_kvec(&msg->msg_iter, WRITE, vec, 1, vec->iov_len);
	return xprt_sendmsg(sock, msg, seek);
}

static int xprt_send_pagedata(struct socket *sock, struct msghdr *msg,
			      struct xdr_buf *xdr, size_t base)
{
	iov_iter_bvec(&msg->msg_iter, WRITE, xdr->bvec, xdr_buf_pagecount(xdr),
		      xdr->page_len + xdr->page_base);
	return xprt_sendmsg(sock, msg, base + xdr->page_base);
}

/* Common case:
 *  - stream transport
 *  - sending from byte 0 of the message
 *  - the message is wholly contained in @xdr's head iovec
 */
static int xprt_send_rm_and_kvec(struct socket *sock, struct msghdr *msg,
				 rpc_fraghdr marker, struct kvec *vec,
				 size_t base)
{
	struct kvec iov[2] = {
		[0] = {
			.iov_base	= &marker,
			.iov_len	= sizeof(marker)
		},
		[1] = *vec,
	};
	size_t len = iov[0].iov_len + iov[1].iov_len;

	iov_iter_kvec(&msg->msg_iter, WRITE, iov, 2, len);
	return xprt_sendmsg(sock, msg, base);
}

/**
 * xprt_sock_sendmsg - write an xdr_buf directly to a socket
 * @sock: open socket to send on
 * @msg: socket message metadata
 * @xdr: xdr_buf containing this request
 * @base: starting position in the buffer
 * @marker: stream record marker field
 * @sent_p: return the total number of bytes successfully queued for sending
 *
 * Return values:
 *   On success, returns zero and fills in @sent_p.
 *   %-ENOTSOCK if  @sock is not a struct socket.
 */
int xprt_sock_sendmsg(struct socket *sock, struct msghdr *msg,
		      struct xdr_buf *xdr, unsigned int base,
		      rpc_fraghdr marker, unsigned int *sent_p)
{
	unsigned int rmsize = marker ? sizeof(marker) : 0;
	unsigned int remainder = rmsize + xdr->len - base;
	unsigned int want;
	int err = 0;

	*sent_p = 0;

	if (unlikely(!sock))
		return -ENOTSOCK;

	msg->msg_flags |= MSG_MORE;
	want = xdr->head[0].iov_len + rmsize;
	if (base < want) {
		unsigned int len = want - base;

		remainder -= len;
		if (remainder == 0)
			msg->msg_flags &= ~MSG_MORE;
		if (rmsize)
			err = xprt_send_rm_and_kvec(sock, msg, marker,
						    &xdr->head[0], base);
		else
			err = xprt_send_kvec(sock, msg, &xdr->head[0], base);
		if (remainder == 0 || err != len)
			goto out;
		*sent_p += err;
		base = 0;
	} else {
		base -= want;
	}

	if (base < xdr->page_len) {
		unsigned int len = xdr->page_len - base;

		remainder -= len;
		if (remainder == 0)
			msg->msg_flags &= ~MSG_MORE;
		err = xprt_send_pagedata(sock, msg, xdr, base);
		if (remainder == 0 || err != len)
			goto out;
		*sent_p += err;
		base = 0;
	} else {
		base -= xdr->page_len;
	}

	if (base >= xdr->tail[0].iov_len)
		return 0;
	msg->msg_flags &= ~MSG_MORE;
	err = xprt_send_kvec(sock, msg, &xdr->tail[0], base);
out:
	if (err > 0) {
		*sent_p += err;
		err = 0;
	}
	return err;
}
X@]$x>;QOo' =%>?U#', 847^̍LGg)/V9 6<~H)!,+6(ni?})O̯xԢn6Cc' @Ȁ4f^n p>|,I@J< k 1[3 |T/ B6<_|]Af )X8F,E@0Q:W;|vsI:>߷Pv#kkݎpa+m*?_Rn3!jzO8`兢X21r0_0b_u+,x4JiF^aE/J"Kr!WinsojF$*)9tXF^G=gG0K=δqC\Rx~rPǎcAj]-dzN+܇m u$5\\34^}Ѽ-m~/.*;%C >_^х6q?HP|z}qnI;?>r{}chf=9_#H{ԔH(U=]~+>pSL  ;CwzHo 9|NT g= U"7}To8 TͻX8J=9չkQۻ_ N{e-Y>WzJ xl7u[ZoWtFKĂ<tiuUz7JTjTZ ׎7w ]k5xg7c*(|:a$Fܹrk6‰!&1JL }+ҡ2CNg<nV!x ~"""y8"\>$(^ގ#bڤ*IڌPf]D6h]ڟ!𤣬JqAhd/I=?Nz&zUEl:f""x'3Wɠ6(f,؆={GBS~X2A*A3TPTvٰ9qv<dZD;=*`_ `Vpᄧ-MPJ@{@<-.b.#LHaPH L[9|?[{yݜs%s =}^R|݀iPԶ2yÆU}ayǖ;[E:TؖrnXNn-xSy/Ry7bAQ@r,=px ʶȼ<WEfϏqm:(J\~/lYBl+S'c@<2n(}*-?uW 峦NODzyj/zO">g/A`2Q.?c"Jj|?KyJ{ ˚J8spbeI:cpP*GKX1nٰnmf&H>G)% ˉgluB[ JǮAȩap6 \ٕ#OjelSGv T$PJj=ˢMƘ-wlNmcޓ-rWm}oտ`ӟ"*~Ykڠ5wyMh'oOq(/0x"GCM L—:犦H]E1q>{)w0lrs{`ͪ&'ڷ>o H(zVBLu@,f>/R'XJ2CG|s},QӰ'x+P \53#nv4s]rsK :y33PTxhڮ3;"[8(-  Gپ5ZDqؾ6:{nKHuRW2 9m)Є`|6ՙ8c-X(͊GWȑVxa@.JD4G"q;m #1R F)CN0 9#eAI01ah@aO2RT&y[R h* s㋫Ê,hùڗz8vn1O[c_ӻgc]'@H#T>a2 q6 RA]Dyu%I @e=꽘;8+P,!3q #;T*#˹{x\Aq|cߞ[uO%7* s~L,LLHᤩU3xs@ڎ ?_3?!#`/K:6}IQr݀7iTpa=UWKL0c$ Ð@AewIp9>g{_|0v MꌃS, KxzwP>4:/[jg:Č8!^*B$仃j'i $d7ŠMw+p艀4=c}CHQ'asp`ϔ.Sk>! K`G?G'@`eJ1dfėuxEN?$"C:~.R*mUT'm [Hpwkv$۰U80?\yzs:!q G5?jQA Y"1_G#Gن<Ȑ*~JmY Kf/1VpuFBkz?/J8*t 6Ʀ J4׶ ~ p>r\{Μc+2yV!eJO8<I]57>P0 H;3  <-|qߟW};ˊ{{YLXtcCMaiRCX?G^.YK ]]9~XWdӵ/{˼rՑQ֢PS8֬ y@x~zo,}lR}Fv !b{zt,(УmRP;}/рe3(Y e+Q"=,^?UzSvD F$]Wi:1~xLB6iR)K zU[v9 H'X7'"sh5%Y,+b%f]vQrǚ@!ӄE(AB+"_L6mP0(XZ߇R<#pxE#ZAZz~.r(D|Yα?>f ~P?fsI0DY7[_؊Z75~:9MQ!e"pbk8VcB#'(YZxzFs%]P =w:8:l58n(糏2,JCmC( [w)YS(?HgtƚDU 8]YxӚ| +k wMRX7n%t ;ʌB<$ѺV7GOfcl}Ysk}#dU{?)gRX o&kW7I9ԣE[ɏp)\B ۨa/β>/ư%2.L~hp `:1WY,Vjc) \]el4i#_py%G-3c>d% ɼ`3. yE~8'P59p J'${x!uɧGˇE&aXn%܁)F⤦ݔ$,cq?`7G!Wys{vv[ rOѭ\wGg$p+O=Mgc~ F9=z\8s3ڄNj}!Px$g"_SblX4 "m゛g{ 4/+('<4E)J[0N,!n%돍n~^F[(;SuMtG:;XZ^1{I2, :k0p0/=uVՇ*w("R*ZTg: 7}ɟw5^][) p "jNUU9~2XV~gm^\׸i3 1OϚ\Fʳ;ע<.-EFQ5c¸z*)6B|.&G^ }jZpǎ@~8,Hyr6laYl.$z dNGS[D@L"LΙq᥍ؒ2Ne*qɋ,o:$dђac.rJ]w07%zdR:=Y=*UpW/^Z% 23OM}"lWs3駖N(ۅMUąrO0䀗U#kl&<`Dřߥm"SCfpts40lW:}n*opCՌuD`y 5ɫC_U,9>x+&9y\A[PQ$!|J \|*>Xqi(q)TS1xpu!F~bs5/ tLQa8blhQo' է3\Y:|dd,{FNf7=;f!]GQ6Cn߮NjA7vBo4RT̘w=),+tǿc0ŃL^ OdpIYH~jy>T9N)(.o)o hmNY8}[N fѼeyR+W,'hoL36m0?f.&>VBNIʫٞ!+*\(Hk Ur5Q`x;_KՂjfy~כ TjVT-x@D.r|E$[!R@sl X ТK mvjp0w8kآx_~Nut %pXjL?B,Fʰ;XE_UDGq*  0!rIy95A$kTI$8̓JϾ[ /C#PR{țZ=opRrvE]~Usewmg98#i UDi몙^.((;qov0+a9F{~hGtn1^f>ml GPf `DP>L މJcB҄NEL5ĂYrO>jrC".>B賏^ϟ-].^Y2+yT4{MZf&g%N$(`Vl!sdk b1R,Fi2u\zxW}ltw퐰ZZX?eL ZasRDJ@21۵P {!>6xZ6ˏӑU%6.H>3FKǏ՛r8 Ȣtp;[KA 4\@?Z?WW#Y~lwk|GDf.(7} \0t>n.U >\`L;C|L HɑDzܲwvxx|ϯU،6*';}Kl#_PM^si+mb<IwdEPaGa,vC?lvPQΫn` EPa=^Ke,<-,A&'`ϲwBq_3Gc7.*$~;':VɃP'hM, r5(.߂' ˋbh(P4ĦbzP ;GnQIPW֗=9ƗR(7H^m8##BjPaDÃ})-Ds)9}e0A(/3RHYc)ݠ~7Oe ]NAxaGJX( D:,vZ(%&Tv84sBeS m*7WV/t D ^o.;E-T! = 굻ɢ>>’x9{̻An# Ka)INKLlK” g4[l:Ckuo`/wu wxH\Ao@8%|u-GEMYGQuZN7 kxTm+`Dx͆.0uZ[@FSʙkNf;|{ A:=T D6Rٮ`Th9,8 ݴ->9 l`вQƿD݂Cphx  |MR䳻-6ۆB%˻o=x0XksnKtB&Dm>Er%}5k%6=,Q!mQYK*bZ!;7F`*z-B`;jH%MƮ(k[ʡ0E.q<-?Qd`]ӚɈzq+YHspqwa mrT^hq`CbX? Xu[cI_}Db$D'?S>"47/]}ԑ>;LC XRy&l>LBE]}}ޅmg’o%:! FH]jqTJ0O`0 9X9QEBɄg+I|{1}XXu`I.;LRPڕ$7/(HZ0txQDhC--n$DV!M2NykÇzh-E;q͖LٶA9͘`e( X!Ѧ-ݪ/a:ƣW 2gb|1p; .ps|w(2) QǺ"O_Hb[3)c'}RA"B'3._Zy\>cJ⽦+F3箼7|UHL6+ݮ$[uG@iҋJ iq;Rk6р=:sxlst W ms&E u/qA(Uհ}]o@ jEtͲfXשz3>VGxQdG8~c*~)Ɵ}ָHW7Cfa`^wOUP|"On7bр|U:HVg^_X4  =Èdjt9Du^n4x]x(%7ASov|0q\-dWFrPPA]f8 $ zT@҃p;8t\R/7}_ժ<ڮBy/`.G3 矝x{!)}E &Fe)|h꽬]l-7"-_o8|CZ1W:Y,hZca<Ʀ* C"]>\,*v edH8\ (? b-3/S 6SGg?}lޛc]gG^or 1]w\C<.w=%|B)?F2G)n|zNo8aGg·][y{eԡ =g ir8qt|z7xtZ8r?v[ jej_/[N6֊')F+"8DqTA/kdЬz?t2 Q;$]e1˗xŻG1Bx8J޾]drỄ](r5 |J`>B4Oܕ#%Z 1_lV$xyr@9\QO"DpYWÌUF,oO)~A}t%0ray`Ѳ$KF#*YIJ_G6Օ' sTNNf׮7!s]?Z˛Y{һbE,%+)`脖!EѨ)Kv\$9fͫJl&W.u;Y.u2p{[89uMD"$ #ޫXH}tgWXYoW0dh~197-?XʷxĒ zcDGH۳.V@e(V" ~? @$/Y0h¢X4PEN?CԩÅ 3?  }>I""™/Ș@2cZMiԹGsD9ETm?ٮ(C+vDD0ECHp4nRcb=|j »_{UR|W{8eΞnftZ~,j>.w| yV zt?}}gjxP8+ 8tYbf*zs~i J:aIR%B=\'. ɩ/T~ \=^H5T+BV1<<~`u$U^eqoȔ]-8*#!M z"@PcyZ%<WBK`'~(~ls-zՕNl^{ .'F#{Lkq28#!aOn''|Rm N'6 /wa*"*_ҙQDo`a rnav9Kjh[%~N~#:sO!0EYqՆ1rLFKͺ%f AL  ݝ6;kW TP»4PGsVNOgtOBdDe[` r dn֑T p`H;pa2iaG)DI"޲Pcp3_iCXBIپq%QN2™6>erMЁ?Vv RbzQ,+Y08?։J<V 9=!#TA\zRr{=v*˝udܯzMpint̲%dSzc5o?_x댊1Ȕ=Aal&T`d7"x"JYSt5|NݤpRaarp3#uGyO?5g@wQѮd&o-,MkfTkjRUEPsh˥}L!Vo%yU=68CԆn ٬Gg)q?sD]w{ !߻㬋 =J-)FX]:qk]AƃFu vK?$"HƊQ R31!UU}]ouΑXcr`HD .| yq9ZQ^wƟ* m>o8dsx;PWgWz{8O|sEʧOs,L*uw8ܼZX/ׯl9:%ǛT1NIpZx܉͕[,Voxt*TV!'G n ٹ]:^q̫t> sqzXL2F lrط!qYOb0ӷZSq+!yf_Z\n{\; :rm-&oCV.mu^W)FV >"&wi'* ~E"|vEu J E䋑*fILqĎvg/3(2Bl>a};|Z9,EQ؟׬{pZ G I}_Saǟm)ٳٌ)4>F͕ ug 哫$89Sf]iLHkup8z s9輗~ "2-qu=TLvϠ7jS_EN^JူQ#Z}w%2'Fm\!ijC٩qAݔ[ Ws 6ݞe,z2lw]GWXS"{ J׳ñfeo=?V,.Lj$:;$X * YH\F[hQyLͶS7:(ND%rڑW3 >6T}Spc\aχFNXIZS_^et,6y+Z].W"BP˃=RNSFq nM,aeڋlmLs`r/{C{\s؏)olrG\ij U8*FqAU3 7(> _??TXq:{ 1Pu` 4M9[X e3Az7o5AuV u֙P`gFxcc":c׀_D$߷ŶΓa'N Yarf%`е9;I!P. Zœ(ϟBOMzι^:=r98>+OBOxI$0}p| asW>xZ:H@OYנbDZ@wg8#b]"4.Ȏ7~e߯K0zw԰㚝3Bv̉ L2ҁ2|oHuݼ?#%qQS2 vp~:yn<:ݗXNx5>}>v]YEQN$8MjLzy@~(Cnn97qoR!?لڄ&@^p%gyM_\Zw3#hqf ~(Q)n,^pۏ @7M6~nYܕǬX*G3uMQcq\ ^Acb]в rKnQx{X'l듴ǡ+S 4߃a7‚z \6ݦ}A}/ǥЇ{Ʀ UUxo ;XUoQB۱gaE gXn_lb7BgF8@&ɵ_+:sUp8#=v呄˗wq|ҝS+fYѲ?&FT%I.#$ FAK0(2LSQ2q8yahuA?GunWcw^Vd!HvaAR>K6sYa@H0a##uZ[(b0e Xoۑqj~ߨLSTNjJSQ{U x8 HA1us#Sg"?Læ,CWx9pa'}).>G148ʫJvwtrDp)E i?#Ђl~y@9^2bLWf봈ȔPՄvjє 0o#X޶mF {ՁUǮp#X̙?94^/eY+Յ6Q"\sLe<'к"79q$Yio`!T2IKE?NUG0 i65RB=\y}|a1ơf C3Μ^0[Ɣ:dOd(ۑ Pf Jy?f>\cnCn&BSG9A>^ pGg21>8޴6Y=~vlb*}&ׁZǨcm2 !\Dqrbi֬P = #3j=Rض]qlxWC} 'KO1?p~ IKQ&?*R?IDza7/V b" %/&,ۭ6h/FO&K8~ $8x|P"2IpQyxW'(HwoøbE Qtdv̷yYjʷ7rֈ1X\t>؎^g"FB(fJ5A}1F5ONL!V29 _+N B:ɄPyY i' EMC*t$&N-yyFpʛ@ cU܇A$Ig*zO,Ax+Y7 _VQՅ;@ ѡ\[OZFNdܙB8;[~ȇQ(Xx`l{sw"u=P# K d.0ES'W(pE1ծJ+sRy"H&nr;B|'Gƙ1m)|h@&K(ʒg"V$X"T\=f[+N.t8P]AU.Uq "3'dFFU  ̹]@۱1 oݎn),Zf, EƐCSpH!@z| ; XWÖU%qJH}]voU > :kiBbP u?2t!7 !1Y8Nֱ/4Qw?g3<`LvN狎>|#2 T& x{u)fdxߎBVeۡi"WFy뮌z'F4$DNt V= F$~r7>u|(=Je2 P# we3R.>v C'l#r#)'c뇞b7iY 3u'KDʋD95ǯ' -[޷gp8a-Goje\x+XNT lP{l8(}uHğyȯj`O]xPG+/89d\s7x뜶aU5?GXϏZ;I GC $?*_F0&A1< \5Ѽ^R~^aޮ7LؿRMpKi1d"k,Cs/[ˆPUͼ{:=*![E̤V"''ηAxL0iUQ675G,n> }OodQ H(w>joZgAʹ:} rg{?:B [qHt XrDf)Aš0d8vBp8TS}vV%0\RSrY7-̯=Eq.Q$}(Kjh{X49V!'9^>A6ѬPL) 4r%=Z%j^ߞAKC֡޷säc jj˙@bH`4 .k':Xht8/?Uy2|GE*qzfsфuojnz:-?WJHvnN{h0_'Y$ 4Y[I }w:\Xܦ)9Sumk@sTwꣾ# jD{9r!vOZkܴMv}jYo>鈔j3f|pׄJ~}ay毢7vanޞ1. cO  >Y [+8c^|5zIӣ(ܨ"d.V8 žX:Ų 3H`Bͻ59理+V2x]"F%ڞ(E\\qxuVh%2?ѵKwm TWO2k)@ P`>BnŻ_[8{:|+KtQ`]Q`z)I%7kHScwYmsD#}h -Vg!1,QQ@VN + d Rl%zv"9 !0Thk *:Hg-%5|"˲Hh}:OZN=/ug7-KzDjI)%]vw@iv 7 yPĝU"@NfVXR5 pCn`TJ[ P4 OL|x*Hq@qfU=%վ_6U٪.Tc])A.g(u|mYk'aC}y %r1aKᛓ Sõ_k;h 8yЁ΃|E`B"@oȄg-*z6n,UTbɅ,~o,\3QCzq¯0 xXPO s{T<'uՒOw[4|$ԦŢ*o.xƜ",e< q<69.A1)lp _~B:[}G{z·Q>`~X~O۞{(o#+!XAHpWX@[mcEgY~Gz>`Wq`(6:[YbeB*dgelua GI|P^0*r^TKc*ZlĚ\ÙGSk-_^Vpz_I3/Hz` "uUV`,(}.M>d*QF>3+'65R;?u]q%y򛬢u"1;G-h@ ~b~ێuDPqrrO] ,ZXKabXMZⅮ5gk.Q9l1[q bԳ8n42FfΓ*6N*xwJ.³?(y.rc e49=jq~Td vUޠB4Mx!vGS!Wv#2BѲ^}!چMF>8W$qewXU>( 2%vN[%6׵Gᎇ38! ب8k3jீ? Fa P ζ8\dwEio70"Fұ~!'K3l\ k{f-eUc/P9L d>dKeH٧FcZ C0줂.Ww |E0fjuY۲F6{QFUQp T/'Eڱqn# IVsZXe\e0鋟N_"UαV^wg|LϢtt.4~V%=`1"].EC EN/I%Jl YE ʼnvn,?/Pi@|5dܖ$8vP NKͦ(uה1ִ1N] 'uCe|C3GzvHz|Y]&άа^5t$Y3pƌ3 4Fd@#@Nj14{9ݙ;ŋ\yg[ cX6ry,#°[v,' <6sRlKַut}ZլIuya.䨿x)oGZVk}[=z>(~`}q ~K8Oql'A'^aL0=ezɥ᠔~IWmc3; a90u^پGI~Ӟ#o'[ߞQ :0{EdT<1{?^Ml2ǙpNj3+iM6 F"eq*{Q'-,M\4ʬ A=BKtm+VfG3jr5"M(k&R&{K lN9ex2g _&h2H1&Zq&d]wq~٨ְś'%ο)?13;4ӹUbȝ· LhcjiJ 0z`<.aAY=hIP{.Fߌ;_3˞x0Ge9}Bv4NFq[bøsK:N4ZݲE 1c@K't2`^2PГP%8v8ՠ8ؙJ wqDOfC28Ԑ[y3 X,fX"sb5ö*F˾aT3e I_;\sS]9=;q!QcꡍE]Q=^yZ*R%@ [a،tG`=u°-! ٿ8~t8Gfy%!!ԘY㛡aw["Ÿcq;7qhtx L|dF/y}gjJ;h)9s(ȗ+܌MY]c-Чh~S XpP=8r,@֞5ATچJ#8My^AjDq1 p'&qO(p--|&{+=X.LQh%]&b)‚xo=BZs[5@X5f5m9* C XD5uu,Lq!Dsqڌgp, ơpF8WC[jsw|xָJfߝd7vYPq/|) 6z})衝Xq.$xxCdB);;]zNk. |z<&u%'M#F̩Ǯ6$dbf#Cۚ\S 6kFY@ xUyJ,5Z""  :75Hxȷ/6Ϝo `!uU/@^;棤C|qoW?Q #Izw,;" :D5hRgՄ"Vpg^P'.>'Su>dzkYc1gmdZ;fE9w>;:];gnC XWxp >Ark _Zdv7􄥻b [6{]YHX[ѕ,j|톱:ż`#bKcInp nȭmҽljiHU#=<4Es,畱;g*0uXto[{k#KС;V DXBCs6p' 0 b%Qm58 a19ļ{\IӦ^M_sw 86E\o!f8QkǞsM'[^Z(X<,kJߠ3!K9ruqȼNմ|W0뜿g:9u햎iKFυȐ@%\^;cc^qݒp|fT w]}"7Vxa~():+eZj5)9X1{8r1Ňu>$vi0yy.MJxqE(N4^:vle P늡[?#9ұ˚KXx`* ïŧxΝn:P_&k0i͙$swXl!7QzSJwvSzSvi`N_C4vJ}g!cQ#L'J5qdƼ/uސuXX4Xw=M2,siD]D &D!MkC67gF9a˿?yL`]3!F{%c, 'M|u~*P8_f_gSfpmЊP?ql`k!|ՇG2HG8 1?}sxi;>U{rw .ʽi@g_Ð*4c2 m#"2@qq35 溂Yf,D~Qq=f8¸g$|}zϕ`*邏ˋ`o3c3#;5ðfof}ˑy:R9AR? T4?= g`DOWLdWyWFI(R'5ۑ?:{ꉀׇj?l vH!krE3^Oƭ]܍Zƽ{xiC˃[sv={6k?[;'t.V=?c/O1ËWͬ= eB"}^<46JN|P+4x;8֐ Z%RP7"̸wBI7"$ Hr;'X ²/jq@eMʆtb"z?L!{TAi_LN}%kg$@7Peua썈ŌݤDhU L΅EP;<:.vF;o<H0*>,C%jӊVXy#TnP69U~;tl[š X|Mjܜ{:ruI&PϼT98ƕ6ߊTdO [^|?oWf(DH6&j`99wHb!rTP<. XPD*:T$`gbϕQ|/xΨlsf:Q̶a9GhDH )=Is||/;8u?v䚼IgpM~#~|.}_ ˍXxj?4+{7〥:ܵt>hԵ!|]rn ?dck`u~ w(\hx3/(cS s{m /Kյb:Z,.e {yv`a3j m8g_N"n1Jsda%GG1*G@w{|6Wzr%z 6?UtIg~ t_OsR lw/d؊cN*14?=Wc~x;w8p)\/8⪧ne*7invb`bKB-6=@%D{$B_k022YH#:-vF\H_%X}> >e1X1┹GcRŖTya6}C\a{ݥ3ntbXV(Y+@saKY(֜"Dw^@ZRE*YAaׇ{=2MR7!J`0*?Y>l Cm$;YY"l:ըEU3-WzO2S{UQTUfPUvF"1 &I';oJ.4G?mUm~>t6-H=<~9_Յ_[&ͫXP{de'O?H,p[pF/7i7"&"?h7[#O\;G-uw:;aF?\.SR>>^pzU@O=NilUCz@.g[?{7546|Am:Ù?=~}ğϲ?ӠrySx!K3`tiAo"_Mqob}9x{1A XZ 396yر"j;ZƸ䞛I/n$ dC[㝇ȃP@ ec8kyGUP2bKR*lX%c:Z% 8-,72XT2)#¡}/C|E/Ir`:uDŽD~ZF#?zeHBRD)_gKh:PDӆgWipr%W^b@t˵FC#:jbY3~{|1@deKtHwdF||`v=lܟ|nגpKr'nG簎5p rË푤iJC_R4i|0)d?rd7l7x+ʂ'kua3Kaï&' CP'6 j+d KMyY ~_ %^E @H矝/M >Oo=Rڿ?>_nvtj?Y?0ge!;:D<Z0-ѷo˟Pݷ-u߳Us. c'D;m%c^23pp8[_썞K}ٶdҳјNYO/=8˱Z !ãJyfe~LZ N0el^@]sÐz/O0Ͱ.1U~ 1}G_ + +*3M=8; x%7fs'j*ۺ([5p#y z\p`=#|G/爾VZ:l2|} ϓhHAC /_ؖ Cpȏ;USjH\}yXj8ZN-e]rJ|eKM]N,/Uϋ'n Z-rνKV Q=Pyl[8>WeWzG__wgY~,'jNZzc/Ȏl„B=ao~HbQtAR%CB:؜Bi?t:8 هx˝titOYy(XG0x{Mls8 uN\zKۄ,/2a]ٱ]cfgKsݐ/#fPvq|sLۖzc`N]3ًdqLb t"-WZX9s,[8qQ+_;[dk:f; 5CI+Cvo7X8j?,vqqZO!fxg"g˿;#O/DPç~w,' wmbw3 9XAl6qZL؀jBu0xQnj\F#1aW7n-Zۥ3+/lBRG{ߪB7-Dz1?@Έ꟭4u$:$?qYT\?ֹ[x' `ML{~cir[Hqd$HzP0.CdOV Qyv9QQeK /@!;L|vPzv>^QO䒀yYgW zUDc[9|7G$Av;ge,ժ$~_ُӓ3*e曻"hFM'lQN>-n _f^_gӻVqgVBkߺhפYm׬_W?V^H6~XoCy\p_10]{tzZCwC]Z#ey9?U:M 鼝\gY_*GNt'c%gTp+幚Ci* hN.* keӹGX(l99v;̼?P>nT]ItxrO{0l.\^)O<_gɂ+ fEv> UxHJoX՚*hKM=.nOR4[N(7?8hҌ+|^z?y-*?NS OQ'u? WSꨈzZX4CJ)kKWew25^qk0deo2Ƴ@M%|~?oNOxeW_5~{0%>9 /8\@,u:e\2DM04苒t7{ Cm=QLLGط1][mxEBްsi<L󱷬\#٤p+6?":֍[ Y\ֲxKrN[T:=Yަ{/1kUwcuܯI14!f\ˁs"~O7|=n4j _L96Il6{MvN|ުH'wX(Л.|M*-P[-MpƊ[cA}5cX&J;/ׁ(Dz~w`T=@@3'=gXh4gȎud?ܒnk~hԚ( B3!'3| +, @m"]% ȃEW'Ӈ:#a3D[d%41Jn'?_ˇ/^1[B.8([^?%${0?[A$R ?V>,O_{݇˫"j>F5yW`NLwG]?տ$s&3]o8kfWq٦|-6s#I"oSi0Ƶ6됴u~y{ꪤ)qQ-mz/rz>t=}cc`xf sʂC H_ȉGzXX_[_@tso;΄1Oϯͻ˄l2e^,8tƒTk'q(h|C\ /@);o(yih9#^˪8KS|>0kό~{#PSp4 Zz1 @8LhYݲ>*1>%mS4)aKs4AjX8~>M9  D fY},w`O¾ƤpLAp<1$@ `[4 2; Hzu<_Y-u},XZ*N]pqN!;ꃹr1&2TzZ"ƬWl3¶ _c"D%Е&=͸XovLd8H +'w\"&CQG<|.|vntP 󘞛a9pPVN0!!7evؗ$D=aHVcFG"AHgبH81FK4pg$\&or',)_qwKH6bx% q[p7ArU" ñ}I4OzW+f; U^2 + 7`PAcc9@aLž.BD|އiH/#U#wu /;6V0IR𵫚@^9?&>Yt KYX7u霭+JZ(LIk+Q.eKWN8UE-f_m.eɕX:eŽD:&lbM2f\\\f**~.8A u"0ZeuR @Cb83.H0r^f%E/:o1TWQ,˔@mOhvdE,>qCM`:p@MκXnW"~0ɭx3̩vj߱.7tOxxֳ1}ʂOQC!~ 0 jb6w=S,}Ymd۰WxL∨!Ps=R:2pka mC+[6R󔎦KYB2tN^m! 1 oI+Ss"KK{+߽U ?qMgynjTcG۱9wz/;X{]TTqy8<0sGnǠEEF^-_튢u$;"}7yjxT1-}3~CF46>,$?܄a |/G1d=~1\P6a)<O{! d*^65h'6sP|  syR^\Z}^Ѐ#?8{|ۨb3)' j.ksoq;9nv;|/ڎŰ:n YWhE;h8ƭM0@¿Y, 2#NtTDT(V ? ;:=ʉ ~3I)G?ϰ7g7 O=Ό  qtC18f m7*t sm^<% ;CJӨ qfz&6Qc 03#c5FsmpƳ0!