summaryrefslogtreecommitdiff
path: root/scripts/patch-kernel
blob: 49b4241e814a90c159cc272e655daa6294c7a2ea (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
325
326
327
328
329
330
331
#! /bin/sh
# Script to apply kernel patches.
#   usage: patch-kernel [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ]
#     The source directory defaults to /usr/src/linux, and the patch
#     directory defaults to the current directory.
# e.g.
#   scripts/patch-kernel . ..
#      Update the kernel tree in the current directory using patches in the
#      directory above to the latest Linus kernel
#   scripts/patch-kernel . .. -ac
#      Get the latest Linux kernel and patch it with the latest ac patch
#   scripts/patch-kernel . .. 2.4.9
#      Gets standard kernel 2.4.9
#   scripts/patch-kernel . .. 2.4.9 -ac
#      Gets 2.4.9 with latest ac patches
#   scripts/patch-kernel . .. 2.4.9 -ac11
#      Gets 2.4.9 with ac patch ac11
#   Note: It uses the patches relative to the Linus kernels, not the
#   ac to ac relative patches
#
# It determines the current kernel version from the top-level Makefile.
# It then looks for patches for the next sublevel in the patch directory.
# This is applied using "patch -p1 -s" from within the kernel directory.
# A check is then made for "*.rej" files to see if the patch was
# successful.  If it is, then all of the "*.orig" files are removed.
#
#       Nick Holloway <Nick.Holloway@alfie.demon.co.uk>, 2nd January 1995.
#
# Added support for handling multiple types of compression. What includes
# gzip, bzip, bzip2, zip, compress, and plaintext.
#
#       Adam Sulmicki <adam@cfar.umd.edu>, 1st January 1997.
#
# Added ability to stop at a given version number
# Put the full version number (i.e. 2.3.31) as the last parameter
#       Dave Gilbert <linux@treblig.org>, 11th December 1999.

# Fixed previous patch so that if we are already at the correct version
# not to patch up.
#
# Added -ac option, use -ac or -ac9 (say) to stop at a particular version
#       Dave Gilbert <linux@treblig.org>, 29th September 2001.
#
# Add support for (use of) EXTRAVERSION (to support 2.6.8.x, e.g.);
# update usage message;
# fix some whitespace damage;
# be smarter about stopping when current version is larger than requested;
#	Randy Dunlap <rdunlap@xenotime.net>, 2004-AUG-18.
#
# Add better support for (non-incremental) 2.6.x.y patches;
# If an ending version number if not specified, the script automatically
# increments the SUBLEVEL (x in 2.6.x.y) until no more patch files are found;
# however, EXTRAVERSION (y in 2.6.x.y) is never automatically incremented
# but must be specified fully.
#
# patch-kernel does not normally support reverse patching, but does so when
# applying EXTRAVERSION (x.y) patches, so that moving from 2.6.11.y to 2.6.11.z
# is easy and handled by the script (reverse 2.6.11.y and apply 2.6.11.z).
#	Randy Dunlap <rdunlap@xenotime.net>, 2005-APR-08.

PNAME=patch-kernel

# Set directories from arguments, or use defaults.
sourcedir=${1-/usr/src/linux}
patchdir=${2-.}
stopvers=${3-default}

if [ "$1" = -h -o "$1" = --help -o ! -r "$sourcedir/Makefile" ]; then
cat << USAGE
usage: $PNAME [-h] [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ]
  source directory defaults to /usr/src/linux,
  patch directory defaults to the current directory,
  stopversion defaults to <all in patchdir>.
USAGE
exit 1
fi

# See if we have any -ac options
for PARM in $*
do
  case $PARM in
	  -ac*)
		  gotac=$PARM;

	esac;
done

# ---------------------------------------------------------------------------
# arg1 is filename
noFile () {
	echo "cannot find patch file: ${patch}"
	exit 1
}

# ---------------------------------------------------------------------------
backwards () {
	echo "$PNAME does not support reverse patching"
	exit 1
}

# ---------------------------------------------------------------------------
# Find a file, first parameter is basename of file
# it tries many compression mechanisms and sets variables to say how to get it
findFile () {
  filebase=$1;

  if [ -r ${filebase}.gz ]; then
		ext=".gz"
		name="gzip"
		uncomp="gunzip -dc"
  elif [ -r ${filebase}.bz  ]; then
		ext=".bz"
		name="bzip"
		uncomp="bunzip -dc"
  elif [ -r ${filebase}.bz2 ]; then
		ext=".bz2"
		name="bzip2"
		uncomp="bunzip2 -dc"
  elif [ -r ${filebase}.xz ]; then
                ext=".xz"
                name="xz"
                uncomp="xz -dc"
  elif [ -r ${filebase}.zip ]; then
		ext=".zip"
		name="zip"
		uncomp="unzip -d"
  elif [ -r ${filebase}.Z ]; then
		ext=".Z"
		name="uncompress"
		uncomp="uncompress -c"
  elif [ -r ${filebase} ]; then
		ext=""
		name="plaintext"
		uncomp="cat"
  else
	return 1;
  fi

  return 0;
}

# ---------------------------------------------------------------------------
# Apply a patch and check it goes in cleanly
# First param is patch name (e.g. patch-2.4.9-ac5) - without path or extension

applyPatch () {
  echo -n "Applying $1 (${name})... "
  if $uncomp ${patchdir}/$1${ext} | patch -p1 -s -N -E -d $sourcedir
  then
    echo "done."
  else
    echo "failed.  Clean up yourself."
    return 1;
  fi
  if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ]
  then
    echo "Aborting.  Reject files found."
    return 1;
  fi
  # Remove backup files
  find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;

  return 0;
}

# ---------------------------------------------------------------------------
# arg1 is patch filename
reversePatch () {
	echo -n "Reversing $1 (${name}) ... "
	if $uncomp ${patchdir}/"$1"${ext} | patch -p1 -Rs -N -E -d $sourcedir
	then
		echo "done."
	else
		echo "failed.  Clean it up."
		exit 1
	fi
	if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ]
	then
		echo "Aborting.  Reject files found."
		return 1
	fi
	# Remove backup files
	find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;

	return 0
}

# set current VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION
# force $TMPFILEs below to be in local directory: a slash character prevents
# the dot command from using the search path.
TMPFILE=`mktemp ./.tmpver.XXXXXX` || { echo "cannot make temp file" ; exit 1; }
grep -E "^(VERSION|PATCHLEVEL|SUBLEVEL|EXTRAVERSION)" $sourcedir/Makefile > $TMPFILE
tr -d [:blank:] < $TMPFILE > $TMPFILE.1
. $TMPFILE.1
rm -f $TMPFILE*
if [ -z "$VERSION" -o -z "$PATCHLEVEL" -o -z "$SUBLEVEL" ]
then
    echo "unable to determine current kernel version" >&2
    exit 1
fi

NAME=`grep ^NAME $sourcedir/Makefile`
NAME=${NAME##*=}

echo "Current kernel version is $VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION} ($NAME)"

# strip EXTRAVERSION to just a number (drop leading '.' and trailing additions)
EXTRAVER=
if [ x$EXTRAVERSION != "x" ]
then
	EXTRAVER=${EXTRAVERSION#.}
	EXTRAVER=${EXTRAVER%%[[:punct:]]*}
	#echo "$PNAME: changing EXTRAVERSION from $EXTRAVERSION to $EXTRAVER"
fi

#echo "stopvers=$stopvers"
if [ $stopvers != "default" ]; then
	STOPSUBLEVEL=`echo $stopvers | cut -d. -f3`
	STOPEXTRA=`echo $stopvers | cut -d. -f4`
	STOPFULLVERSION=${stopvers%%.$STOPEXTRA}
	#echo "#___STOPSUBLEVEL=/$STOPSUBLEVEL/, STOPEXTRA=/$STOPEXTRA/"
else
	STOPSUBLEVEL=9999
	STOPEXTRA=9999
fi

# This all assumes a 2.6.x[.y] kernel tree.
# Don't allow backwards/reverse patching.
if [ $STOPSUBLEVEL -lt $SUBLEVEL ]; then
	backwards
fi

if [ x$EXTRAVER != "x" ]; then
	CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$EXTRAVER"
else
	CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
fi

if [ x$EXTRAVER != "x" ]; then
	echo "backing up to: $VERSION.$PATCHLEVEL.$SUBLEVEL"
	patch="patch-${CURRENTFULLVERSION}"
	findFile $patchdir/${patch} || noFile ${patch}
	reversePatch ${patch} || exit 1
fi

# now current is 2.6.x, with no EXTRA applied,
# so update to target SUBLEVEL (2.6.SUBLEVEL)
# and then to target EXTRAVER (2.6.SUB.EXTRAVER) if requested.
# If not ending sublevel is specified, it is incremented until
# no further sublevels are found.

if [ $STOPSUBLEVEL -gt $SUBLEVEL ]; then
while :				# incrementing SUBLEVEL (s in v.p.s)
do
    CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
    EXTRAVER=
    if [ x$STOPFULLVERSION = x$CURRENTFULLVERSION ]; then
        echo "Stopping at $CURRENTFULLVERSION base as requested."
        break
    fi

    SUBLEVEL=$(($SUBLEVEL + 1))
    FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
    #echo "#___ trying $FULLVERSION ___"

    if [ $(($SUBLEVEL)) -gt $(($STOPSUBLEVEL)) ]; then
	echo "Stopping since sublevel ($SUBLEVEL) is beyond stop-sublevel ($STOPSUBLEVEL)"
	exit 1
    fi

    patch=patch-$FULLVERSION
    # See if the file exists and find extension
    findFile $patchdir/${patch} || noFile ${patch}

    # Apply the patch and check all is OK
    applyPatch $patch || break
done
#echo "#___sublevel all done"
fi

# There is no incremental searching for extraversion...
if [ "$STOPEXTRA" != "" ]; then
while :				# just to allow break
do
# apply STOPEXTRA directly (not incrementally) (x in v.p.s.x)
	FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL.$STOPEXTRA"
	#echo "#... trying $FULLVERSION ..."
	patch=patch-$FULLVERSION

	# See if the file exists and find extension
	findFile $patchdir/${patch} || noFile ${patch}

	# Apply the patch and check all is OK
	applyPatch $patch || break
	#echo "#___extraver all done"
	break
done
fi

if [ x$gotac != x ]; then
  # Out great user wants the -ac patches
	# They could have done -ac (get latest) or -acxx where xx=version they want
	if [ $gotac = "-ac" ]; then
	  # They want the latest version
		HIGHESTPATCH=0
		for PATCHNAMES in $patchdir/patch-${CURRENTFULLVERSION}-ac*\.*
		do
			ACVALUE=`echo $PATCHNAMES | sed -e 's/^.*patch-[0-9.]*-ac\([0-9]*\).*/\1/'`
			# Check it is actually a recognised patch type
			findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${ACVALUE} || break

		  if [ $ACVALUE -gt $HIGHESTPATCH ]; then
			  HIGHESTPATCH=$ACVALUE
		  fi
		done

		if [ $HIGHESTPATCH -ne 0 ]; then
			findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH} || break
			applyPatch patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH}
		else
		  echo "No -ac patches found"
		fi
	else
	  # They want an exact version
		findFile $patchdir/patch-${CURRENTFULLVERSION}${gotac} || {
		  echo "Sorry, I couldn't find the $gotac patch for $CURRENTFULLVERSION.  Hohum."
			exit 1
		}
		applyPatch patch-${CURRENTFULLVERSION}${gotac}
	fi
fi
OP0 s}wvB/(Gz uN%H}9fO:x?`^e&ꤳmŘ"=:C n0o#]|]E >/ /4V /"J- 2~[TMΘݕ{ uԳ_)#,A..w3_ _OvC"01B_M›$q3k.2xgN1YϮ\ @ 8&#et Bw(BZ\5ݣ_AkuӇ RIRz)rcM>{mw_ #AO1fC_]dd6h}\Q0q q+p~c |ZVKߝ7NƵ* n~.맢y#A/!z^4K~*ehqpY], Z3׈~LjUӾq$cU(@\$>oa.(HYe8j>rD;OQv6~ac;3Ip6M"n-7𫌼Byqc L4sYzbSsn> ;'{j5V]h"i׈QfU % Lm Q I^ ѷ1|Iنg,uU°%5w^{D'^3ί)bݤ˵qQ*=LmA Hiѿ^bH\L[GZb7_ #P 덺 Yt>_G& h8#WC̛ 1:xY 1#|}S9jкFٴz4y`,Y^,̪Y]#3F\X=BPZxGPow!,eT4OvFKMBۚ^+#!I(dY Di9*Jk\LydVeц`j+ǧcncӬzj2˧&YFm͕8(yL3Xr$^y8X\ǃ5pӴYe4kZ&2i(ۓNnY cUtwikK_vܝa:ղٺ2EJ.-F`u~ۇ%鬠Jl1aǬ2DkN?q TJ5#gĆ߷ Iv@l,*w@\ښ!v+o-~LvWlY:SHoKe7$ 8m~H MQqGhz-Y%I)@;0迣v  o{iZaATm&nSˁ8diGP Fx/21<1"Hɀrǘ^Ђ/}:ٟQFJ=GFͳZŹ]xu=˨MmoˬP8|}ZgQ, Kϯcñ|88bCnlԪh' {C)H9K j$aT#Om~YpG{l鉲$z >\r8/ =hq <30dT<B-a"-Z' OoÎt~gGѐx* @x [JRC5DH5u\f㖹:D >N߷{6`!Sɾ . |e/5A+|kb.PsP]{}m'p`#SmNȏ4ŀnk/_k99n0#d4c }z ({w8+/ l4 J͹rAAq۽s_Aή2Au2v /`b/j5fׇnk jh;-UG+pޭx-g1:_k]p5`l) A>e.uq&-GEDF|Oc JsකԐ{P>$'G?&usy1>hQwD.x~y@Yi,ez#[Z,|^hXH6H8b,fy9-sY0"lN]H%J8K@*W^1փEGEqR:ϯLcr\J!Z!A k~->Tu/S(RG;h{Q>ͱlsisTs ŀR: 5mY"5+X<׍cZG'Ie98Ѐh~*χƳB%U]+tGu`PT`C k`6VF-R`MZ ) X2#?BŸi}Ur Ar0?1>H gIЭ-0ÌC&hKQGlo1FkSy^!] t؅=0kuN~۳QߐQm  |-?z}3%ї1`6^E9TuV>1wKƨ F{Q6d=zQZSt4'BC^gxG@ēeKEC%80Ma˒b$}BbicJ)뎝y@"E L(!}_6="MZς!EEְ z,|[%X9masI 38Er'GrG#L#og[:E˓`D'i@i#1_su}Ր_]^(H|fj6ڢKMu5JliweZ:+0i-v0a%9tzꊒ?A@p"UMQzed"._klpvRZ|d׏u]WK|G99{ݘ ήUFnWޑEH.G<@lkp@a(?kxp$6LY[[,%8qcǯty`ZW4ׄYC[%1KU)Vfi`kΦhd&lJ޸ Kڽɋ¬7/"==#Oa0UYg D 07D"pyEN q*q_j16_uO'%qנgleȯ⺡Z@/Kŝ ֮A+`9\<)7کZtJu|z1,8$Pd};Gh{ B ? C邆pDt̞kŬX!كZq?Jya/C$c.=뢰?4{Y؞PE8q{]&d$A7DU6/#aɿBxɢ+*38ZB gb$` U*^2u'GDƦ̚)=e|`_,'T2Ak@T, }>C\#%s (J|0tQY6E.!~_3~%q7_آcOףj2ݲ=lj>EzyM&E,-J>pPmWK[#ɤTDzԬ!Xt[P~cS >3!$:_0PX+AC@($GةtawTmgl.sʲY9^ljubޜkī~yߚ2Oȁ9Ny,[ zPl\&F+F5wNS&ڌqEA&iE8NM曏_Rsk-oYK]ms t`78 цq~G-YlK” U\¸t shtT<Ĉ)秄j US$͓ !;+?f1wW2O@"YY'(s@[xs'sUA"9A<~#3տlM&1jN$.|rDžt)$)ܛwA;a:S1s zefOkntDDsϚ?:Exgwɮ|-ưVb ֺrPp{MB|조spv8n4m&:7D O$D aԐ}-=i$FZjzX0Zdd$Ml+`}H[6` Yԟ߽HgXwˁ]gW|lӉwmƩ:p8bI/Ǚ &WΖ;~3 H  Pqg*?3lGPZ$MU7 ^Y4ja/V(ofRjZ}W [tp^[7 TGmRI>cY؊5r<@kv\LvM& n$C}D]ABk(fwdſ`煒 7SMQGۭ}>Y Nhû"*)鯷KZpS3 f\(AWc=RK. {ѤFJ( \U N"*ѯ啰n6t$gqp ) |X:",Mj,6}V,Fk͜r+Ior%&Kꁶ#0?mtfߵ?v/-Kyb!wg96kG'ߠP$`l!cᅣkč7mFWy"pQ9r=j,z"sR{ X@ 2>bp#rdfHbyQgh4;>Q_^Y=CfCŰrcB3*9)Iζ2J{QtQ&BN*FKL?#"<7k!E݆"40U *D3SZVE_ ׻٦ޔunV݃l^xok r|fPLP)p/[9>dCX3lo^\ M) Rf*P,穬gqo߻2' m"V r;y MD2~X!fiRAv)Lyr*=gd˚3bBt(`d`h[@ Nmۏ$&sy" l.!S\܊@X2n /$j :ZX5ʑ}-r+mNO$V92x]e*A> FA[#|(+ǍlK3hknöYzu< QSV~ZX8zN CFc*S~2ژ/J O ۱Q-f֯2`?b7qq`t1"a_+ uuH-ֶM+Ṷ&$XInzGGuҋמu3͎ 1nHl hA4e/סɗK(jvE#t$吡"rtE]U`W' *Ew]~> 0XNjhp ͌ou@OZOOs}9W1׆ZGjWZZc(٫Q>^8Erlf#zg_]QXsB\dv->B;۟ՙ~7-3zVWJN@՛> N n Z"FBwUxזvsb/?( #3 E {̦c1䖀V!v@OG/# xAw#NK Or_: C#|ܟ@y Ga9A%#d!k.⢢ߓ'IfL7bdSl3&@sV~5qmiP*=_ 9}(veF}@PhKB;o}F  '(C80W|gP4t!aw~ŗy I 8)0p1A$W/+/ƎP0L:ńJ:0]}v UpK58d5]~˶At5JNO֗ !5>-@\lj]sE =QۤUJ`AL<4\ȝGP^lH ",(pˌŅKߗFicQ7]kfTH@}Anr;xU$ B cHM.೼ׯk;5}L| 8 OG|X0Xc'VP!DAOİ=W[s`~^kzf%8`ע;~hfBeopTTU[y0+;{W',ё)ՒD@6an ~soi(`3kmpi+)9^(BZ H4mP&!?D#Xu Ϸ?ۺW\Q|8{q淋${5j+'^Tub"33hs evjj퇱i-$p66mc`t0$"'CUH_jtM,:Du`,W9|CZwoR^}HE8M%٪%* :*Z:_4b;OTkidE`Be ӎ<9op6 D܆qԔU>t~"H-Bk\o;=2vB!LĻ8V'hyAVwbS$DM`-~4p"+["!a=J#~dcIR*%A_ Cz .zMۊʲ}lI_,sˈ0 r[X@N[xU*#7T;̶(r@`Enw3H!7Lt1BЇ׼N-GqV^_R>1z ESE0$``JTH(\f@7 \H?sF͢?(diRpXr!k$ۅ?۫wBEgL>l%Ǻ,~lzmU6\?lxpQFȑjc`7+l6m`9FhF7a?`0P0[WѾus;CsLʰ4N]!Ѻ&qyع-ֲ=U`J孛}W" Mβh&QT1t Yc !yK]ze@_ EW"Ⱦkj-,2:sJ0PQZOa؄qtMC3Qnja}E+1/ֲwT:uaOg}n|kvzMl7ʕ[=3JT}IqUΫ`m8%@H(6T렐ս(#d9뱭;0^ I,p PFf^ccYA8nsaZpAϯP24aSNqUZ;g^޷zq􅖱kpzg|9sI{Q4 m1ZF;ވΰYj^GՖLȱ%[KۋO WXj 8@>7 bn\{CD#_nf`_ǚ1_g鞓Lg͜]kтZli>EbK2ZQ$x!$8 `)"O@Nr|ݴiv_4z 5j#r?5v1r9v3{fM]J axy =NJ#:Yv R,n, @WlجPxan;jT’ICÊἨހ.Z6zG1B )!Ik4X~WAT/GN"HT#[ \de i5 NaIf%(@86ZLq6>@X$YbtmޙRϱW8Zf$-*6z2cbul~7vٚ3bF ^g#6kty&ţ4Py#ޤwcwN>_\6Yad7V=D I L}w-+yf(5,jy<2yϗ79fΝdd) u~:Fsإa櫦=j !h$ %fp聂{f5IS[Ͽ9ͼϣɋZ(|ɊH[wM+ްF|(T88"KF/}NFD9E8qg>BK9(X#]&/d.e9ciҚO?$T0_Ua[R!{>8Pm !|&6؄ 7BӋ b+rE\$| ,gc-g+Tzo[y-K])cҀG3gf|si ]^$4 n;ְU inTY‡sn>P߹He肂d4Rb %h p2uRAAzVSck o朇Ft2n]\ޢ1~JYp1Bdؐf@ˤ%TXf/"F;3ά&tY<.OOnM K c "ܚA߼3εNjsQfŒeU{솹۫[Ea3]&!Ǹ# byI ?ͧs7WFq06#}۱>aG̣VH*HK|܋"kꠛa8yNOX`9t,jx~w/`i)+bk.wAs"#@v#21QfTtHy ]0(E$!XUyjyx:;oXߊnGH`U\UrN0,]jV/<]ǝҒ ~\Tϡ L_H,U@SPa& yLjߔP^4{՛6h59S&Qllѝ~'!l*\sBrWH}~|rH*Er{z]6A#4tޕ8݁NOAA8FFk0?$0[o[?ys[;ebP/q/2 4 !ʳl2yAZYnZ-'\#[^Nn3͊N*ySJZ4j|`-'-Yw+5ApQ".PDkDARf*3XPId.rb`60![``ectA8$H߅ᾙD7w8q ^ ~#[n60A2R9֊ Rz3g5;WoEUPO4گ0W,闵krӜf6Y-cA戽 nM_ ٫\f,=33F[K2ר=fV翈V]@,OQA`B"nPj( iFc 91z){OᄂsdT#h-pZ^Q6'zjrhSiك @YbPU6PwE1d6"XRQǨI~}BnvaosFHۭr(7xưQ<+$ D ~l D +5ʾDD6q՞D "_$V,E G}l7۶@& }Si,6!V30<4/A7xMM'a3քՈeꉑs6m [rF۩u o\vXEҀjcuku#`]X^90XbJX,>1sV>t|ӣ)P{FҊ籔˧{9/aa梎Tnk)OPe}t}E"E.;^ŴQU\5d<%n,V)=D^_5xf@i #S@$lB6{b\(ZNb"#G@*B.msӅQLWdܗ!q6{@F86OSVS+q16I˹C ^ ,ǐ8y ´eUaX`ilJ?)Q?k`8U3=!vL%A:)9Ayu;&A(H!fC7HCWuc.U-`Y|.P;--ڵ\]Tp53 9s~FD0(;¨ blwVN+Ȅw EF M}Q b#6@2'"Tbw3MNpvںgd/$*75Җ +7̣I&KYx( g KCр,Tl`~v1M{= xvݏ8gB! DO1@HR^v%W>"#7y dzX#F98<@۳lKʮ7ln~g ޘ#fZ֦*)/3g A*1dh8 ~0`ОbYaI`O<5wnFt@;~О)$ _ݍJG}&l8PG\̡p'bo´ٯ_9gvNFf_p_EuF[[zۦ\`u=ڊFT3*%Tp[,cMlq7YHX0du.$gf]LRjCg圹ktGی8md %}rE"ߒ<;!t&qbBKՐV܎HoM!(y>&PI$(9ڭXŃ[FѨzz?A^rഐ,X Th n"躇Z{os8GY*rÊp7}oaT[0STQ[3mvgSpld88T>[$_qW`go~8!őx4VA$YĞ:3TSCqvnfۖ@@(sC p s($Yf ܱgyXfXhZ>˨|ť#E~W]r-62"Kp1;9OIހzbcE5/amiI\~w ~SuYRL]f.0ם٫/ S7'y)n`Ep'(Açߏj=^b-h:]/s‹ _R,CZX||YD~M%@WeJl 3=Pmt ; 1;3وoaK_xxC.^j`h-cb1}xF3tvAD0歔*1F'4&&,&;0)V/*6{^@dD]Hp>?^]crKĔIi{ě °|S_9:Ly>ܤOlUݔߑ8ws>-EN#PW ݅Dxy B! ʸ/h'ưq|-ZWB,/>dz YS?F phczUyMMs!BKXjPrٔ-4?7=?Gɣ_V+o}`ؠ2aw.4,!t$g\PcU6K7ل`bHf?Ek7k9.tU׋NXI؃`m *x.&ͳ.4ҮcWQeb)_~+fѮŶtw!P(! w IvĻCpAF_cCx{7{(F]PSt̟:yim)EyBaL wX|#4VN@r15c[Ծf; ~~8,ukٌ$򁑈dKa|_O,+7aS 冀I'T[\oGRd\"(*BdA"@ֲ`gwC~qoA̎o;Q"vIavHmj)m} }$|^R#Ob_-!9(`ٜFմ yX;~7&FR%J0{J9:f\R)K` qZ-| w͚ٚ;2 bf\JHia}Gno6!dl=+խh*%\Sl&^.D$7(+G^gɞR's@#=SP>Ҏ&lC$;8G"HBd9I1{LjJAbd>v\gQ-ym}:{PǎuD?hxy 1Zy0G/+*ˍBv4NFq0!Ƌq1V%""g܈M ޑP5cL,e܎% #TleFЁJ z9< fh\#[`j-ЈF2v9NLgg(ݞ&܈bWyp 4yG\ㅝ44YAJL&9K?DW8{e^3AHt&|T^<%s/8)#;^pt( qoPⰭӎo5d`UY^˲n|hu/?n+9x|f).ۑLe\ 8`adel~NxH"hXA8@ſ8r,@֞5ATچI~-@dS2 XjDU#ް[2 4l*bFO6 3pgq:Xve Q ̸A B%Qp9K2 )<][H.2\+'^:iHtV"faӠ(D+ <m#5 thO#O  ávf/4:eȟ= 3ρ `ӎI-|S0sB 8ρ;8[J↱0Y[YfxƧm}82-D8A>0:oVc8\'8.@k,9 f|] !JK"_ @ԑ̈, k8l _sw#S%C _i6;r6p n3jO$%/%@@2Ҏf+sXЈX5CuF]Ƞ,.r0GBհ9/W@뉎v r-='& M`dD Ab1AKK\s n2B[qOlrOc\>Lt7niVČ@s@ŇljZŊ px{`^3xuLݼL>]\u#jP"}`&;VՊz~k5sqZ\4ȱ!O'㮡q U#HDۯ;vưEnuew~rzFd[Rjӂ;To|q%$f_)P%oC\q)䰒&8zcXmú.x5RW pӞlqkqH{Be޷M 9fNrN-cuV2Ld%6 +AA*fp ;"z6e*,نXySL^: ,u V/',zza K+hh ocapgwp rU 5.\u]rkC9$4Ĩ˸F@c=OʃNe&J-pDf>NyI9Bo`橇wn>`^? B, _qUJݐ:z<yֶڌ Her(Z]-/:^ߚ>xljtx$BGK'P-Qrjcxq;",=>=r!>ܖHkqPz+q$|C8(@V`RU敯x, .)ZݐO$BHG#$g(Jnlm3UwcW{#㓡kr,0gNz=p*ȰjB^{)xcLg2(xeogoIY/.mdq0>J$nbY!%1YN V) m&ϛ-8YQ^b(A46Җ9=1; q{3|%ԟ;ؘ "NF(F k+Bh\Ǟz4vl΋f%$,AZ!ľ8y!'RDoW;`v?Qs;!wB$r۰Pb=K8b\ɩpD&za4nfq)Ael܊ (!#`Xj{ viٳ!bgT푼 yw辏m_N+*#.hH:#L7C] qhƹ37!XϵlǽzPԇ&?ߟ=(X.|6S3ͧ0$] \AV(|[*t~ )hkM?PBOдշt!Ynm&@(ǫ}Θ -<uJL}~fTq.Hi3jWM3˯_( VphC4s=gT:ɲţV^j6 7ȗb椦FY8=[=~דdEF0]fAao_G'U$R ;i& Iw`m%G ɏ>3ærNGE{p$#j 񾌧AUrܖfQL^, jDZIؓd9p[!@or ^Lt0B!PM+[jcbdk3/BDZ 6W:AS2zͷٍK#(Pr2)NB>dVBGڭr }a4aZ_ņTrrqj5~IkΉ # [˻;T Q*>X/pz%_wSS y3P>$j`T`Ɉ#eV<ߟ '?؏gx4'A Pew35B&P@R\~yݹCR0DA1,TkmM}@u7 +)蛯7:<-,S_-t(DͫLIO}#Ӈ7Z!3N$cwpHwlFHtl\{bhI r92\.Nz/EHoV CNJՆ/ꯥ?'blTrEHύ') )Pm]Iy A13?];9qd?39r4_|hpCa"5|nqFt .JBőt9/i 4"ALmeK2 #_<TP'X𥀯O|95_(T.Yg( RiLKlaOSF󑑜~3n"\:v} |j]}Yр~bCjxZ+EjjX H l{FC.(_ܳt_v]ҠU`ڡU;\&H=!8yc`d2E-@atW=PŻ {lOzXZliMC1^oi2Կ\4pdEܟ13a! cAj:D^ L L%` J(Ie2*۳v0 pDAx>g5AIY~9Jpws  g\EPً~6M,7pQ%XjPw4=k?nxl;<  2'Rd`zGsdF$qA1p=aJ𤁴)z0 >1{ &V#eT0t ×VŚ]W.ӄSêC>ѫq0qԡLJ4x9 JzA}׈NϿC.xD#BV"ڿtCzAwTL 08B?/&.qBB^h80FP[g#YA?V3DP>L[=GDݯf(ju]KͺfBP_ 5ə]|n8. ;V>VQ=u?.-ǔ~$#\5Cj`**zR-b;՚L3C P=n協#8.%ܫݬ1bL9 +o. ŖnKh M 55p> No*"ak!!ufwY:-c\t>M =I=/qqg'HH/\r>ƾJMGIn;V >x ]f+_f3B$E ?u2[ C⁎DcoFh9XkurG+Fl',0H䴟.1,ér9vmZa>RlȱȀW.+`9=ϥf>`㩌!ƍ`鰃⧈uvvF ~ԡj>R>λ|B^yOU>PQ 18'p{EΦrfTH4xn;Q|~6+AY."[%R;RVU3wAW=z<R GBWy\i}oJ|y3g/\ԲgȐgb==,Oa2r?Q:d5@eYT ?id3,e[P=,A  ,"e(Sb4LPӸ@SAIQ'y'KGww]%h& "s {Sz3 i;$q?؟P‰Qƍ_5#ƝsGe?ٿu؂_0-&oo'QTUhT)2?Cxtx08n1g:b}:Z"y:pjr}?ӯЭ!FM9i=oPv\ 7{Y]xF3gHA y&#wFI"~\6؞״rVTߥ/͚I;F?>dMf0 ):=V[* rB'*P0PR 3O!BMg@[gbs+}P?Zb _{\b [[_߮^jIn|WXH H:o|FKrZ ٢*F6vۼ̉}q$( \E㕇Y1=6Ad Z3fIs|fH@׻~~}VQQҀ{*O#dzdz?CEĻ>ߖMaO SH $(a#ӊ2C0-R#f*} #ѮB4 U(:BQI:d/2@J OCҿ>Me~ 69> Pehma׫_&__O18'@,{I lP|A_{z(+!ɂߙh?!Tiׯ^Fl_̶iji}@q_/Ks #'=7,{rGL~gd?_WL/G7[(pUwY"ء|ߣ}Rr4Krv͐ $xh|wp``3M%@SSnnۚZlՀWqOʣHKgjmexcqrhc =6 gmwGcIIW? oL|u_D(s]V ׇU v-i>4ʟ|د>CʃAx}w;hscX_Lyz ӿ:̹dQ\|Z:x֠GOp{AS=Q|oz8 ,9<=b沛n|K]#[1OLc c߂U99 s}9"s:&k R>K-t#g{%ˌ_ׄ^xsry~ssbrbʡݻm5~M[]v>_>n<0!NVSuwn)` &C$FAefRzW(RqjMf9-q?N>'ʐ5~Q:Ou L~ϝ$;ir߬,uO*|@߸pBmz07bYW|Ƨϗ'& 'ӵFf JD>{;_;/uR{5jSF300G;T&0f nxB>.-/){2yw<94,-s@@jXA=_it(׼W_ѣb\[^A&-~ﶾhӦ^lcĥ|ǥ>Ph~p\ Zٗ围e*_N^JW#)gd~u(#G4O{+Am[r[j( O%6N1[-겲 {>QPgR>}˺_QwjχXP ߝ~RGnCnz?;ϖ_+BVp]OXHop ]dl7Yg7P-9 鼝\gYT^(<+z|ֆ9ϐlW8'~|vϓU-|axhybG6{cݏ ,0w͠!M:@ݽcs^BB1-VׂyaYMW,Ll7WC ycnw T`!A[hÑֽmU!ؾG,y F̧+ʸk&?? bp9eQꩉ?/P*yCQhkLtfX/HDKac?@+uFYe5dڑum#DQڦ\WCQlenc{c;Y5nﳐ db˟}{JP^bHsvaȠRة~o/~ @#|պǞ.RO@#//6yu'>}p&Cu(?3a+wA.Re4~ʆCΣH?&3Y^!5iwr$Pb|3_Gz](%.d qsJj΃'\YktCI2[3":ΟΡY]s[&!1v{8ؿV[T6^tWĬW<9.ﵾXY .V &Rv6 3̹O~. u~a)CA:GR!uHڬGՔ#Hch>@|x4^]fute'\*DE;V',0jY ~<듼l96F`̸~?'d/$ Tǝ߮ZvS;d|0I.,搫ZAq!z{רr '[״oPf~TTx\ogfWg Cwށ8~[n9İ5%g2&!?ga󫓘)"bM%=I M!tIVe )xPAObHD($q$J ((&`?o$ hb&8M&b`>_gt~o^ @}Tā @dq-,,}Aq73Wq^xYjQ5v DH5:Wvp{77 `g x_ >av u[V{G(?)1Ml! 0mMDgZ9D@Y "s ڈ!j"M6JO_IH</4M$3G }Ssyj:h#_y}Ǧ@|O?v2N'mnl_.d9P'wCxGs '/NIRu5GN4 rR9: ǻJH#nC9z㎷ 5<`+7!LJWv{,rJ?(1e@+BQQz0N#B" z߷W ;DD% *[֑it(@ s\HDA-~7D€pd@h܏w1 -d J zHv@ƐҺϓ>9sE7PXͪ<|a#} odQ6⾸`^Uj(-l;es@Qܽ089}\svIV:zVO{B`-l@-Tg̠X_q$ryz!`mg/k̓uuWcVڊKk],θlȆa326sj\@wC65@Ƽ^BH`i;}Йud-]і#vw@VP.dۺ|7a PluT5`6H6}m#Y׷l)@4KB" IVFZðM("-4 ZZx""A<8"dI9u2#nQS1v:Z0qodDHGEAI%8U7!YY AȑcpQMן1ml„B(^{6#`1932ԽY:GtPNPƥ&^䠷?_Y'z4fnQezŋrw( <=Ͳx7?mZxl$uvvJ/T%Ag# c1⥻ _4cߖ+7wM10D 2/dG~\hP)l9U  b=֍}؁.Q (HQ"5+fZV6 q deiTǕo"wCaD7 ],rh .elCfv )nȚegv1*qo}8'EVXa~GUaAEv>U@H7B~`/ ZM!TWcX4Kw }/|c`vyaZRFV.9V IZ( s-_Dq;3??.}׳N2`Z+0_H3Wo4.,bM2]xW0,h*,S?S Q6G.8W+E#}} G.g]gEÒ ,Ʃ}uִM ^<{bp+lbݾI_q#\qCM`p=ޑ\Du%g{K`n^kWAߢcV>3sk0~3޵(MXX=?֢X"(KT+(\K$J8UVjDQd|[}yzZ+_hJZy\/ HG8H>Plả9VE+PA^aia9Qqq8(AK0R@294T2I^P) 40YÅh0S8АZ5 tf"hC$WGq,|^ /A[Y2(ގ8Qѷ~bC]p: X貚$D#+WF)\8Ë3tQQ|ҸR{xC0b㚺~9n>xz\z_5aC+e卯Sh)'@ɻOUkj(pD/MNu#d{S{zvd.ˢ̙0 FeԎ-~ǘBf[ΓN5ob^%~W,M6w"On(̝*LB`C<$W 4qB %dk^ Sl@Kk3c3?!JlpfU.nA2X?E`\%`&L^<&r04hCi&l{OҼ1ylzƯQ>l5 :HCK _Nֶr8p ;%LB̓VܕyûaG"3+мO^(XCgpLӇk nP`U]ABs]uVo,ڀb,L OW3`xCD}p0^s1pPP5^.9p::>G5Ɲ>vvR5GLG<wSϩMtnNQ!/ ]3L9:g,頕(*Vmߦ.Q۱'oeg`,* qkOuú n*-#|@<,\]l|} O- 9~O;O_q+{K.6PtՕuH^F 쨷l*$qz~@x*,X$0~68ޡvgX]GP^*Wѐ9ENm:M|ͬU|<~?6z> %!|E(xAZ^!yEmIg_Cwujt#\YWh%\m(}5_YRHvre`H}?ZuS$fAi~ Nζ:d$ >O.@я[23C[^p oANՎdACSδF8PLH1=q@!ImQӎZIQ |=穉ǚ!.y1f!zj ?O\`[%llA=Bi@">߿:5֐]$5ܽL;dM[@l =Ä>?b9D>ouR[<ݢ~'ՇyƱ+57>:ӻ.?Z߷@D~DVĨͧn:]/D?U?%}qHT`ģ!pjzmWK5Oˮ6N&SXK;k2X3գownJ6}'$qܳllĉ7hT WY8{o<(Ks>bqWB4sƎ_,}?c54~ҵ)UD'?+9Aǜ9/=ܵZ˨COL@crm>ia~K"y=١/B]#Qn!spAs^׌ݫTaFqܔyg혶o@RC1 qE4+tJ!!;%[5*Qm<BG#-s8W?o c9 #:Ue}}]8쿵[c0B4›ţ-^_,b0&4Y Q@Ԉ'9`63{8㈸ BPgZn׳_BF]=ߓ$6R;P h 2^{Zx:ѸL&C~*&D.|Z> E^rGx-[9 }\%}?5wnzS|cH4#zuÞi-oI0}O:0k^| sES|,zͭQ ^ګs,i[{a3wuqب^d%HBY@Tpȍm9Fˊ_)޺oBz7I΀ ^0@ͺ(^ xAD^')pÖ Q)9S_ T^ =]??逿^\mqUS%y{$џO׵[2|/8lo&Vkqsi[۾cNjvfyf9!źesſeZ3SH.su->\[dFE$"jޟTq|O ш_~.~-+~7TS ߴ]*5 #:jw3:=r;5ƃ O%쨼aAU!,Wy-WrrÈN ~?,1ԻQh1Tg5=/?( # qaKQ@&f !`P? E+P5D CY@_؈!-}{6sty4N9.ˁo貒]@-lO[ <ք o>]ր ?mAؘ^>{TKdՇѧv^6p}6iLCh ndy7M| P>/@k P&f"M<>Gys~iv9Qw`BIQ5tܡwsH!A2ٔBBWvf\<3 I Pѯ0poo~dL?^"0ֈ~5>&@Pn=FvTOF"ȳꍙ?c3:e_OD(mTnj<SMJ #syۜsQ6ۆD1B1b< VlIL6 @#"h`wtu,L p(^^MkPEB 6jz:**EP=AZLV(P5mF+hp'1En; d {ue o]@j{cEJ&J&J@*(j(j(Bh(h(*)jTQBO^9vI O[gV'_(fMu 3pSNJJHv۵wRNoۤ OOOq@M(.|1O1}Tj*HLn(\n6Gd;ě@zK!('Hhrn~A  q @t^a0>E0TU"L!4MUT!CDT$)@D(ר8*"B$d$hhhqib)X Ye )LF B )h) B) B XhJ*&"&!DEM/gm3;({ATٟ1{PbKI0:4+ft]དྷ*>sw@Q 4<%҃ʹu$1I>s ԣ wjvGP9 #;F Ivm!|ѿW ( wQF&nİ5e!=x&jy;$w^)NBtw?BJ"@TT5T 'QaVrDAX]7;eUݲ-̗A_I:^Q=rD}СjLՄsҭ4Qƴrz99$ۀ ^ q} OYBLQ`B9%f|4X,`~5Q}ڰPE#6}I#g8f]tc-UnԠ L0JL _ȫ=p_)(y(@@@JA@XY}YQ|m,9f\v@EBDڅLaJ?KġE`΀c8](R/#ŕ LQUUUUSRA,+J*瀟eF*(XPaC!A{w҅UUUR EPlLJf`) MhD(@@*R#CUPJEQKPMEUAPQ Ѕ4RRw1UUU%a94UIIBSI0%+aNi0N^'r|8 &7v\=2Dȁ) @frۖ}}=h` IU~zu`5&u .x]IƷ0}?+4SbX;뛃tѤzuR.\ICP\|u%okd(pR36|7. S9fò($!%pL,orv0V @ MXB`B&|p,Vk]}7:rjYY)~I_O7Y턧oYxu;} 4%Y!Iʁ(冈[F"*#߅@S88]~I)k)E$ ;qREcPɤ42CǪǿeg{/=oL[sC Zxٵ4Aퟹyo,R1(D?Ώ9|o5_եNrLIpN]! 2X T۶޹BbZBE_+jHbYQFj Jv2֊1=~﫟` iGKA}cXQ`*b ۅ_fC)/L](FY]He>;胤H qMÂ۫irLѴۨ³>ahmi|7Vn`ʕPU$Ƕ>p뱌lFdx ^׾_S1`A3ŜirzԺ. f?הj/g'm;|#.~v2ʵleֵԳW.yCO7u&^'-}]vfv_[ܹ9ٓ[ݵ0blt @į=f$|[$>;3P/>pP ,*(> ? *GƥlIO^(@C@%Eۮ㥲 0[m?N!9aƒBì( GmpGU%p$ \V5DA} F Bl SHIe i_ݿB p悈|툢vfA$XJ iHepF5Zͬ!Q@]B2&ůO0Nn.S G傑j@%rL„F%(ze4ne$BrxD?Dx3 80aP8&tBQ b~Y/e89t V 1 + OiՄa+/gs\ dWL$ ҆AǪSGo0| NB\w10쒞ꢯ^ա/n=_xlxvF5|Ѿ7=kDcfU&$'t