summaryrefslogtreecommitdiff
path: root/fs/ext4/sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4/sysfs.c')
-rw-r--r--fs/ext4/sysfs.c174
1 files changed, 105 insertions, 69 deletions
diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c
index 6d332dff79dd..ddb54608ca2e 100644
--- a/fs/ext4/sysfs.c
+++ b/fs/ext4/sysfs.c
@@ -29,7 +29,10 @@ typedef enum {
attr_trigger_test_error,
attr_first_error_time,
attr_last_error_time,
+ attr_clusters_in_group,
+ attr_mb_order,
attr_feature,
+ attr_pointer_pi,
attr_pointer_ui,
attr_pointer_ul,
attr_pointer_u64,
@@ -104,7 +107,7 @@ static ssize_t reserved_clusters_store(struct ext4_sb_info *sbi,
int ret;
ret = kstrtoull(skip_spaces(buf), 0, &val);
- if (ret || val >= clusters)
+ if (ret || val >= clusters || (s64)val < 0)
return -EINVAL;
atomic64_set(&sbi->s_resv_clusters, val);
@@ -178,6 +181,9 @@ static struct ext4_attr ext4_attr_##_name = { \
#define EXT4_RO_ATTR_ES_STRING(_name,_elname,_size) \
EXT4_ATTR_STRING(_name, 0444, _size, ext4_super_block, _elname)
+#define EXT4_RW_ATTR_SBI_PI(_name,_elname) \
+ EXT4_ATTR_OFFSET(_name, 0644, pointer_pi, ext4_sb_info, _elname)
+
#define EXT4_RW_ATTR_SBI_UI(_name,_elname) \
EXT4_ATTR_OFFSET(_name, 0644, pointer_ui, ext4_sb_info, _elname)
@@ -207,23 +213,25 @@ EXT4_ATTR_FUNC(sra_exceeded_retry_limit, 0444);
EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, inode_readahead,
ext4_sb_info, s_inode_readahead_blks);
+EXT4_ATTR_OFFSET(mb_group_prealloc, 0644, clusters_in_group,
+ ext4_sb_info, s_mb_group_prealloc);
+EXT4_ATTR_OFFSET(mb_best_avail_max_trim_order, 0644, mb_order,
+ ext4_sb_info, s_mb_best_avail_max_trim_order);
EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal);
EXT4_RW_ATTR_SBI_UI(mb_stats, s_mb_stats);
EXT4_RW_ATTR_SBI_UI(mb_max_to_scan, s_mb_max_to_scan);
EXT4_RW_ATTR_SBI_UI(mb_min_to_scan, s_mb_min_to_scan);
EXT4_RW_ATTR_SBI_UI(mb_order2_req, s_mb_order2_reqs);
EXT4_RW_ATTR_SBI_UI(mb_stream_req, s_mb_stream_request);
-EXT4_RW_ATTR_SBI_UI(mb_group_prealloc, s_mb_group_prealloc);
EXT4_RW_ATTR_SBI_UI(mb_max_linear_groups, s_mb_max_linear_groups);
EXT4_RW_ATTR_SBI_UI(extent_max_zeroout_kb, s_extent_max_zeroout_kb);
EXT4_ATTR(trigger_fs_error, 0200, trigger_test_error);
-EXT4_RW_ATTR_SBI_UI(err_ratelimit_interval_ms, s_err_ratelimit_state.interval);
-EXT4_RW_ATTR_SBI_UI(err_ratelimit_burst, s_err_ratelimit_state.burst);
-EXT4_RW_ATTR_SBI_UI(warning_ratelimit_interval_ms, s_warning_ratelimit_state.interval);
-EXT4_RW_ATTR_SBI_UI(warning_ratelimit_burst, s_warning_ratelimit_state.burst);
-EXT4_RW_ATTR_SBI_UI(msg_ratelimit_interval_ms, s_msg_ratelimit_state.interval);
-EXT4_RW_ATTR_SBI_UI(msg_ratelimit_burst, s_msg_ratelimit_state.burst);
-EXT4_RW_ATTR_SBI_UI(mb_best_avail_max_trim_order, s_mb_best_avail_max_trim_order);
+EXT4_RW_ATTR_SBI_PI(err_ratelimit_interval_ms, s_err_ratelimit_state.interval);
+EXT4_RW_ATTR_SBI_PI(err_ratelimit_burst, s_err_ratelimit_state.burst);
+EXT4_RW_ATTR_SBI_PI(warning_ratelimit_interval_ms, s_warning_ratelimit_state.interval);
+EXT4_RW_ATTR_SBI_PI(warning_ratelimit_burst, s_warning_ratelimit_state.burst);
+EXT4_RW_ATTR_SBI_PI(msg_ratelimit_interval_ms, s_msg_ratelimit_state.interval);
+EXT4_RW_ATTR_SBI_PI(msg_ratelimit_burst, s_msg_ratelimit_state.burst);
#ifdef CONFIG_EXT4_DEBUG
EXT4_RW_ATTR_SBI_UL(simulate_fail, s_simulate_fail);
#endif
@@ -366,13 +374,45 @@ static ssize_t __print_tstamp(char *buf, __le32 lo, __u8 hi)
#define print_tstamp(buf, es, tstamp) \
__print_tstamp(buf, (es)->tstamp, (es)->tstamp ## _hi)
+static ssize_t ext4_generic_attr_show(struct ext4_attr *a,
+ struct ext4_sb_info *sbi, char *buf)
+{
+ void *ptr = calc_ptr(a, sbi);
+
+ if (!ptr)
+ return 0;
+
+ switch (a->attr_id) {
+ case attr_inode_readahead:
+ case attr_clusters_in_group:
+ case attr_mb_order:
+ case attr_pointer_pi:
+ case attr_pointer_ui:
+ if (a->attr_ptr == ptr_ext4_super_block_offset)
+ return sysfs_emit(buf, "%u\n", le32_to_cpup(ptr));
+ return sysfs_emit(buf, "%u\n", *((unsigned int *) ptr));
+ case attr_pointer_ul:
+ return sysfs_emit(buf, "%lu\n", *((unsigned long *) ptr));
+ case attr_pointer_u8:
+ return sysfs_emit(buf, "%u\n", *((unsigned char *) ptr));
+ case attr_pointer_u64:
+ if (a->attr_ptr == ptr_ext4_super_block_offset)
+ return sysfs_emit(buf, "%llu\n", le64_to_cpup(ptr));
+ return sysfs_emit(buf, "%llu\n", *((unsigned long long *) ptr));
+ case attr_pointer_string:
+ return sysfs_emit(buf, "%.*s\n", a->attr_size, (char *) ptr);
+ case attr_pointer_atomic:
+ return sysfs_emit(buf, "%d\n", atomic_read((atomic_t *) ptr));
+ }
+ return 0;
+}
+
static ssize_t ext4_attr_show(struct kobject *kobj,
struct attribute *attr, char *buf)
{
struct ext4_sb_info *sbi = container_of(kobj, struct ext4_sb_info,
s_kobj);
struct ext4_attr *a = container_of(attr, struct ext4_attr, attr);
- void *ptr = calc_ptr(a, sbi);
switch (a->attr_id) {
case attr_delayed_allocation_blocks:
@@ -391,45 +431,6 @@ static ssize_t ext4_attr_show(struct kobject *kobj,
return sysfs_emit(buf, "%llu\n",
(unsigned long long)
percpu_counter_sum(&sbi->s_sra_exceeded_retry_limit));
- case attr_inode_readahead:
- case attr_pointer_ui:
- if (!ptr)
- return 0;
- if (a->attr_ptr == ptr_ext4_super_block_offset)
- return sysfs_emit(buf, "%u\n",
- le32_to_cpup(ptr));
- else
- return sysfs_emit(buf, "%u\n",
- *((unsigned int *) ptr));
- case attr_pointer_ul:
- if (!ptr)
- return 0;
- return sysfs_emit(buf, "%lu\n",
- *((unsigned long *) ptr));
- case attr_pointer_u8:
- if (!ptr)
- return 0;
- return sysfs_emit(buf, "%u\n",
- *((unsigned char *) ptr));
- case attr_pointer_u64:
- if (!ptr)
- return 0;
- if (a->attr_ptr == ptr_ext4_super_block_offset)
- return sysfs_emit(buf, "%llu\n",
- le64_to_cpup(ptr));
- else
- return sysfs_emit(buf, "%llu\n",
- *((unsigned long long *) ptr));
- case attr_pointer_string:
- if (!ptr)
- return 0;
- return sysfs_emit(buf, "%.*s\n", a->attr_size,
- (char *) ptr);
- case attr_pointer_atomic:
- if (!ptr)
- return 0;
- return sysfs_emit(buf, "%d\n",
- atomic_read((atomic_t *) ptr));
case attr_feature:
return sysfs_emit(buf, "supported\n");
case attr_first_error_time:
@@ -438,29 +439,34 @@ static ssize_t ext4_attr_show(struct kobject *kobj,
return print_tstamp(buf, sbi->s_es, s_last_error_time);
case attr_journal_task:
return journal_task_show(sbi, buf);
+ default:
+ return ext4_generic_attr_show(a, sbi, buf);
}
-
- return 0;
}
-static ssize_t ext4_attr_store(struct kobject *kobj,
- struct attribute *attr,
- const char *buf, size_t len)
+static ssize_t ext4_generic_attr_store(struct ext4_attr *a,
+ struct ext4_sb_info *sbi,
+ const char *buf, size_t len)
{
- struct ext4_sb_info *sbi = container_of(kobj, struct ext4_sb_info,
- s_kobj);
- struct ext4_attr *a = container_of(attr, struct ext4_attr, attr);
- void *ptr = calc_ptr(a, sbi);
- unsigned long t;
int ret;
+ unsigned int t;
+ unsigned long lt;
+ void *ptr = calc_ptr(a, sbi);
+
+ if (!ptr)
+ return 0;
switch (a->attr_id) {
- case attr_reserved_clusters:
- return reserved_clusters_store(sbi, buf, len);
+ case attr_pointer_pi:
+ ret = kstrtouint(skip_spaces(buf), 0, &t);
+ if (ret)
+ return ret;
+ if ((int)t < 0)
+ return -EINVAL;
+ *((unsigned int *) ptr) = t;
+ return len;
case attr_pointer_ui:
- if (!ptr)
- return 0;
- ret = kstrtoul(skip_spaces(buf), 0, &t);
+ ret = kstrtouint(skip_spaces(buf), 0, &t);
if (ret)
return ret;
if (a->attr_ptr == ptr_ext4_super_block_offset)
@@ -468,20 +474,50 @@ static ssize_t ext4_attr_store(struct kobject *kobj,
else
*((unsigned int *) ptr) = t;
return len;
+ case attr_mb_order:
+ ret = kstrtouint(skip_spaces(buf), 0, &t);
+ if (ret)
+ return ret;
+ if (t > 64)
+ return -EINVAL;
+ *((unsigned int *) ptr) = t;
+ return len;
+ case attr_clusters_in_group:
+ ret = kstrtouint(skip_spaces(buf), 0, &t);
+ if (ret)
+ return ret;
+ if (t > sbi->s_clusters_per_group)
+ return -EINVAL;
+ *((unsigned int *) ptr) = t;
+ return len;
case attr_pointer_ul:
- if (!ptr)
- return 0;
- ret = kstrtoul(skip_spaces(buf), 0, &t);
+ ret = kstrtoul(skip_spaces(buf), 0, &lt);
if (ret)
return ret;
- *((unsigned long *) ptr) = t;
+ *((unsigned long *) ptr) = lt;
return len;
+ }
+ return 0;
+}
+
+static ssize_t ext4_attr_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buf, size_t len)
+{
+ struct ext4_sb_info *sbi = container_of(kobj, struct ext4_sb_info,
+ s_kobj);
+ struct ext4_attr *a = container_of(attr, struct ext4_attr, attr);
+
+ switch (a->attr_id) {
+ case attr_reserved_clusters:
+ return reserved_clusters_store(sbi, buf, len);
case attr_inode_readahead:
return inode_readahead_blks_store(sbi, buf, len);
case attr_trigger_test_error:
return trigger_test_error(sbi, buf, len);
+ default:
+ return ext4_generic_attr_store(a, sbi, buf, len);
}
- return 0;
}
static void ext4_sb_release(struct kobject *kobj)
m^nq`^GR{OF:GXwnCsNvx-=ʞ2PY3v Nxa ou!9s yV u˶UncTO ?򺞨vE\f49h}.hl42I}s;%,  )׎;`:̦-(7kO;[z ?D IڣR|TW.;kўs Z/F7JM{9(EƷ}+9gy(٩Yd̄۝꽓= %92Vu%yJC^^HD*bFF_/c".M/cY"^ ':n.zڥF!e.~5F3(Ѷ3ѣVsb-pKD ӥ*-:* U 7VDRA^yQTJ"*m%UV+k_*375|^onmGfnK;;clJ[P99\T32 T9kfru9;_*4$c * &+Tb(XHT7moT~;1^ssƚ< ԎhqO%sB{}wCvzJ MvYzpPoQچfPֶ m ÆQTz`Q"R܉ỲecSh#Z-uQo/S )mu}@E ۢ~;kV޸!Th; |״^t:r۽@Ht]X^k6ubXk%'lKj-/}97x^.XEg$~'T&D\/jQ?Ƙ:?]7iӛKZK8{q /S_%@/C7a3?kSz܂ tl=o>1ĺk/ ڵ>c(*`,`J>/KZKY8Vcͫ5 P\{\Bm`lqc3`D2. 7Bp?w;'bƶ|?B*(/slS`DD uz/BPZXߌȞ3,5\a0Oq^W^_k7IDJs߀ٲ)%OӣF^g 6ot̪aVMGȤ/?3i!t?G :{Z2A3p0AOw}zܱ'?4^Odjx!$YLC@teqAwy32bn攦 X3Ot?ʯxϤ(4q J&Ёm{Ǣ`4 tZE<- h!t\0ia+@`5a9Iꢁk'6|u}va_&@Gw~87^졗(G F /.-}(u [O(ЙDh8Ytv <AcKXܾXpe6O?k(A&ҘX**D ۷]36yavbP*)(Pgb%J U*eEļR tމGԃ~KIvVixQ{ԔYH)J}_UswQ㢙j-1DvyC @ߞ@s{]ǝG,[Pq] 4G4eS?"{hswݏx㪚޶QEf\ ^泽fo(K]m{ύ A v Fأ[VX9Z. ǜgxZ]GNmI*@$=-)zЉGI]8cn@}{:&:.>Ypyo ː߮{>Ib!0(#^\<<b0R3y*̼烞eg:tF9{EѯUڲ#r *m$ItÓ/u'7@|lf)߸#;\VJ({$F̷4j PGNyiB?> A>iEb(Rˆϵ/$f?&=;yb*ccgm? t7A0^mUj^iCMJP F/o/T~na\#DUDFg K(刊 $&bH -EktQ47'Lծ|E3h$pLA6NYXh~Rqи/˃_FUNïިav:Y;u'8g liHnvLj?EtȄ:2H O ,agpRS >ghZDa'O  %@`z:r\eG9e| 8  o%礷6Tn `a@ FY0q( rCA#kjtk BO"xzඅD725﷾<_}@Eݲ=Z~ڮs@鵄tGfݥ|VShJ1iTDCNJ/36x𧱆]eJ8so8 UlH(cTen[(^>'),u5o'KzV=RXX#ilyԘaӲˠو"U+*@;E` *;thGJ})G'[C Ӝ^6[8 /DT)zNCp|D s(I\J})_%N$q{麁)saNkB(qǛ2Cbڞ[6$wD*=%QN -bk3ƫhqG\M>9qwS:TG>+Fw/RqKiKs캵>xvhsN”Pv Q-;ꥴXr\`{gЇ(+E:VkD z=SO-%|F 9% YHEC_upԑH|]y2F]&P{2" Swiq6wϚ3LɄ̈ezw㍝1֪ 8*s}AZb"na@6`'UCn۷,Ce;iqKZvqmvɬbRٺH}oυz7Qn`! m c>ڞ&bTm;dS<˚ )׹PEF.!?#`//N8+Yb @^|Z8P[b)V  2Gbg hl 9c0ǍAЌ *#zz6"K 2cuW]CJp;n7a$ $o@Tۺ==~_7 &a[r4eR5.T׵":?Xu2>86T>m=?5ѕУ\TW^b"bX+/jdu<4k#Q2q@w[ϱOq8|1m; 5պ}[:+蠸]]v~OuڿWfͣ+WFx^@sg& l,~3h<ZQ ~?EC) -?4?myaFl8ξw灥`g@9f%fHE%NE16?xrW#VjyK~Kgv ([ՍWoT =[^Uo"h5 tiP^8}d[[кi0K} Bq4?i Y;z4E0;(c<|mQ1tR9Ѿ[vb& 0u1N; ^l՟ku0uNWπJ&$jpcԖ0ta'r'~%ʏ߬Vy0K$2 :2䷏+QwqހYÙ#ty*9< NelB|v$" WޡOGu^5U"uOpZM{zvs>.uKV:4pt0 q`ˠJ1(E0@숭yAQ5Wzr`G<F+1[˸JUsU]CGSXr4i|˿Ǥx\W\k1zDr3b  O':9l(iݓEB%}#ykV3~Lgv u<;DJ1@_$PDi[/@e|#VG-{N2P3:$+S_Hy+tP26ry1q?nB?y9Z 'xlG 8?Fq&4a?'pLŸj=dz#ç\A@'u)rMbgˏ>1a# u^^i.ycqcяjځ`HsǿP8s3 6-L9l4$KQ R D͊3gfD aM~MrXgjRop}a^(yT{fPQ0vNiJt5nKhȱ(~-͏Z#YD?q7EZVjc矯cx}ƑPJbe+ >+Gr+sb&#r4lu3S{W-UG =m_YK6B^cr2et ǩ]p.Y!Inn)AXJéELRHwJRg%wOZVL5'aL0ZYe5YRj`rjf$p555:18*mc[<)$v£Q'IL".w){̘69MLձI2ck Zݑ1 ۫UeEK0a$h8L mϳ_ ]gN5xc{FV/!`%P 6!Kxa$j8 JYV;yQ2GⓅ)#0 0ֹſr9Zl"&/x(~:@Eǩ6z JUbr/kU* [E$Aa7v:%l*lc%[c4 װ(ٗ?r-0aws+=,Nѿ]\>~m8Bn4.tk[!-1 6ZeNvSb = _V>gy}vJ6>g=\WA 6l" sa#,s}@:X.a{F0F( Zo旚a@!`B;pN  0ٞ)KMU[. Tp|vOf8د*k=,38=\lXa[.؁_1R "A{7 b10;rS&_.:+,X/A~ԳÊ[LKMpr:jJ,ӿ@N0C=;,VS8nN0YyB X0$B2gShLiSҲS{_ﴦ)Cߥ@ƕ[1ې 4 ĀeQf9l5ޡ~$,Y0E#%tM]䅈"try ުF)HxO#Ii&a#a0 ! BvY)&L6CߝBa:#zHsfn]#gejJUE/8e;աWf?(34/_gO-a% 4Q $/$JrHW/7*mM)P%*55fuO{1h^/eH@)qB/&"$! T)s#(bjOlz=T=mu0wpEatJO+D[,+z<.˩8L+&:Jy\RAɷanFO䤎(01! B㿖=R- g/_VpF0t'S癪yӾS[αU?+Xc 0pa }umt<z^6 *T A|,(i sةr،<Շ 9&DW7ZFEp7ܱ V"/P "݂DnWS|&wo 3dmiSHC+N񎕽6 5-bC<E7mM5.|ApTByi+eRT(T͘sk <[Cdfo >qks<ˮ#$1c6 O\&>s13aͅ'R6UA!oaf:>۽ߪbïL]]3w4bʭWAr|lK8ßs,pu(k{%+nl_Tl( \ lս H(Ujk>ϝ#e?y^Ipg+p;<[\HlWޣұ_cƷhwjmJixŭ%}tsfsu_3B`Dhّ2/C#%;HMN T>/S5tayղkh4??VnW Q%`}k \BIRL=|sU]Ѝ3x@ѕU:_f}4Jf99@+x*wB3GW°T(veEYc9P 81rJN -I[}+k>I2 é`X+(m~7)l#;COLT]Cf:߳NibNݐ.W0ƘMTR IW]Bw0O;!y+ljN+O#E,/&e7q iO\RP )}C EW։uBSKJJz%ͲB#x>+l/gS\+BC&v Љ>?C/F~Fe,No8lOa~b;uZld $< N;<⑄^ ;e }qDbEXS,GUՋ kָ8qnF&J0W&Ȗ M7:>!9C;q+nc0n#MXtFxR{6o{nJQOSKDQ oLYcTǤo>ctLiwfs .(2ptQY6U\A% _IP..S䅷h :kvrˡ-1Wm PhGnzzz]g4+drhcz*jwVSϷCWFs['E\ݕ)˩?L?I=I|*wgo'oϳ{h xtE"@ ee5l㿞ᦘvgײE.wXtđ+SS'3vIqn3yjIvT}j]!dD"D}md9yWno5+Wz 8uSu Ddkbcơw%?Dr_eߟȧ{@><:7WXNﵵv6-!2Q_ 1D~4I6N܇ t0dDA9~acC AT0?2wu.4̣4*`@RJQW*emfI惺|/CI1~~~\lc3qҫGEa>E'qa1:D+}6`X‰rt^o<=C5"U6( b=`r(0 ٢񠱬h;rf*/}I{߯hAB9>zM_xn 2`D~{*0=뱊ޯoTDJ yh.28G \46=~)NXcK2D3w6z(oQ<( A)2qmn84oX=S@#%U޲(J](Du xLe~DzXGųS1)c=CFj4{S e%kd_yv0>.0(@:Os"3F 2n@M2.]γW6D@̺6js.KlVUƛbN& vk ['xîn7B/HڪTRpEVh˫80Tخ7SQ]@⏻C泌%7g)a0rYJfFk~TjKNA_dD{m;YF3. ͮ=^csj:ꅑ(?_yT43b.>ha#jWbBl "Jtik`H#8O$G%̰'5]%|869O ؀:~C7ǗaĨ"S?VI m_E*?g* cR9$x4wG"[@[Hp}w^tPJf˟+v疼d)pTn&SYYV1]%/Wxi`Î^]QNfUg!ix>4 'قJ/s,#BT/*P/Ʀ}Gŕ[uԅ$_ՁNK"f5~Q_)i MToQpG(amO,xDؑsq5zVVrRff)fDTO_ Oa.?2  @֬b8 ~-эܾ4ȶǫʮqM "֕'RVg!Al nV7|ZKbB)bW~f,ʆAlz^;d_iAXUL7 M;H b7N~ApZj\>KASt"村wUQʶ"z ]P *~)๼e|mpn&;(7T2Bhb$8\ :b>M%< y f%2,{'nʩn:tsלp!XOljmyyxn_~7jc5,[=5\% NZ&a-nOkGvʳkxܳH{ފ$,7W_VP(+ͅfxZ tOB o_/eΰ/!Vy,xJ}',a/cͥ"n]oJ<dQr +׽ hr>.$CUN͉w.\IJ 1>Ux~wǎVK %YqY5%-tWOQKK'ٲ/Vj냓(Ek.L:iSWtI}Y?z4:nK5EC(Ć˟iQo Cݐr4L+'~{!Gsu`sCoIb芼ig ɘ9ƣq="fX؁,'k:)sdrAIO7{]BޏޛaXn&+ }wO _{gApB܅^R4|bE; 4E]\Wa/7cR3T>M4s\ϖvh++\{T (*e%= #48|·/XލEz!#@ez5jXw$Ab2>sP$¡rǚrI ,:I@ݻ}Ze؜h(Nr݇ zгgSS!A-Lt*P!?KL+ocOi/9Hd;˲:X c_j AyDDEibBq|Ɛ>B:ӛ[W[tgxJ<)?hMFZ C1qTz k5^ܖ9^l]'+pL( [ʱ99^W OstPHD"jִTa5/O/7X񹪲]'Tz˾C. b.Ud5:!8XGo!g]Ofp op*')Dpj6@a&JD| EVaH8HU〲k/Qa#Wc*G6˳g[ CD7¼@x_A/F]sYTHfFć#tdÇQau<y>n__##x{_<[=gK&p̹oF12f bO -8mVee BhO wM\x&>q|H @v-f  \}[,10@g1w>TKGE!"3C~fqAI>!~L>:SQs -x zRFgv @]o\^_F=Irber@:N>/D_P4ec88t1i xƕ;%ay1 ߌ3+"۟)fqY'84hLȳŏ>  2b4kH㉨#wц.p<ů[T`C]=@!VnaY|X;N<:ұm`a}oV~| ` $"&]pj ,Ib>HZPHrE!QQ?GfCڠZ:z`RdyΠ/#ñNMA^R!aY7#k..-֬tY4n`ۺ .\+!"s{b#!"?":ZFz*/ƱYI}Ő B^84[?V?Mn3 u`D*5xv P/[FKWvZ:.!frD!3 *DrJ"C >84̧g.1 8QBAA@in{@}H9ӓ kuSI:AJ8P*}pkcP}ߵZ:oPOW*j {2bHE4 σ[03]#ޥtr SuuJ< 98!^J49J3]= R,ƛ//6n04ߔ%Hfv*ɶ˜G/QW!ܘ:@hzi&絏 ,׍CX-b&4i}I5Hr:T({hЫk~c)A7 Ql.`S[>/v  Tl_ʔ0:'kjk<\$ZS}ߚCk&+]G|ᗚgG NLXN^XNdW 6k?,oZ}|~O0P> uYUu}/qWښ;:_ďgw\$Csdp&s[qtæbe`nbxFD @$Nd8|z>7 ?Ngci;K!H2[G#:^Rv*_#b䑶=]T>"Yӿjcɹk>čԿT|Ǽu}q+bQp_"Sd;CH3e0z7ZeBnC|/ w*:c3홮{I~LI*ª&,}ׅ7L?amw6<>g)fUU|ݡpvUΑ\FH ("엽 9rۈ5#cownksR\[]qF#CCs۬Q_qD j!Q!ֹTnei?ߛ68y b}]e޼89%xj)?3u+o"se` D~\8Xv^x7W#DwJ :2ٸ@tzP#Cs}6uC.ky= 8/C%Hleie3<_e^|?>-u*D^/$[M%8DUD}s?CǁAA7o\3_z7*0/}]iC0NV U~{=Us{@c`j>at{]ݹEЅb~ ۞ Q9b?; gV}r{u*hEHtpz;#6Vq Gx#[EzUTMJ'ɦG )M|;xq =z.$;:rI$ {1z̻n~ww YFEr.`r_:mHHH~Ͻ.}Ա3g;X)C ۃdnK (\ ~\?Y.Vupvnz{O7 \[Χ8܇ șGlxO AxP2n,3h0)06w(%Oe%{wx;1>TRRckh` 9zxx3b5Y){ӑ~=o~ƌa]nUd~og~ (+2 2ŌC9=Wnz]{ .gK ukӬanm(5"~beʪy[E=rbj<ζ +Wlc㿳GYBHXsTH~؎YSA#R)d ,Rp{ox^DLg@M dpL 5 r0hR 9n,XåW,j1M ΁K;lF*Y,:w7}]"HCuNDÜ7k83:0R<>fmMg5ޑ肳7= Ae|@oN1Ƿax-à-i MFOMiu/םMŕ> ¾L:PXȖhr p Un]~^7 -=ֿc̡k ): O \vWPVc@#f^0! 65V+2X5blb"jegx$$Xn',7Y,gWX 7KݏȏDk~^% #o3J^Ay! /\Ь&-`ܨJ(xQdțPV@iU'0q?,} L}OwrTכb*9upÛq]6O!<\Ń| ] h:]0Fd ߒpA]WwvplS@ϵ%"$v9CyncXlߕ䱍LnDCrB 7 x]v1AmT:  ?lÄWxqnDRm~N <9 ?{.AK.5THpRxֲ2~\hVٚdqt&/ OÚgA+57Y DEB6)D8 2 =N3(FmkooYhhkq[1챖dw~|jqkfi$&fLG".wGjFۉЁEn6 |}c %u9U^B,[2z͢VQB$k!_n 79 6uΎ~GQe8ۉ'NagO!8M#3K2190=Z-dB3g-mf?lc9!Gؠ7j r>kb[yAreq \.Kj+<87p@wj '?dޠCQHl9`q/Ի} Xn̄3kņ=R>Z֣(HEZ&^qC}@FpRj Tc0?Zj±\a6 K̒fdͼi_ΩY`KQ$N"Yh8   kY{0\ *$l@ |R-69S'. C7 T+ X㢈uj+;A`H]'D![sdcNeQsɒN(7N, 8.La9Hk3U3ͅ/٧#$ 0Iݑ/%0 m .;94T!ޢYȣ_PӽNМ>!Dt= 59B7F1 4Cwめ%Mnj)P%2N9uͥHi(.JLă7=gf*"jS&A`e-OលGă LT*YLnhmjr'z]d)~mR <@ 8-0 Eɩ35غ~S93>Yx`lDd;Xd%G1i%Yqw񹌩pfjBzsRï6ed׊1v @?Y+;M+2,HNHAcDtqgbO3H]afl۹@3j}介0N~%v!̨vqUE@DO9ĹZ4㟵k-gf, פ($@#}z!^d}㺅=`\hBbɘtYjAYC}Ꜧ}jRԬ%\ CkdE,+gEO9u8?1$/}̌Ɲ6#XϚ[Rvsyӛ 569.@LQjMEZ5U~gGgw뫕-{_ [s@Llĥ5/K<]T2-4P΢֐^̀oDq=:>y%X?3_N' )FJ~&!6T:/y|꟭>(#/uB g1\F>F^CQѥ99sh8o1BxaGĢs4s"DP,G녘96Wfޞ|*3֓h< bZR+`RP迤E}̉/# (֧Q"T M{eN$(cYb98I=l[ ‡Sk8iֱn#(B1#0 x9fU_;-\%\VC _cǸ8[hx:i8`EL2<ۨ_ɡ Cu2lRxCߺ#cU&Kq~+ic`9x>kgtyygDZ$Zb؅ZP}[1wm;K=*G0\=߷X84>6˿$y Od6 +հreضUJֱx!$ {M=H3F n\n_|xk| ^ hac#bz?_ekz2Ƣ#1dT|n8_UoFh~Jo nV$8.]  dm7^񒶟>% a!+a3??(,3o]FÅ L{H12rZl,J;K >;1'; !RXAB׼&0>k,Љid o XSw A[ k m0֪_8!ζ[Ivj'_L1BU S-ŮVLBU?;*7Fz!áCtEl{st<||Ca#Zp6^cZFW_5 TfAP\" zZkܴ2h,ϡ-GHJ:43f붙V[َ/ ̶'r`7z`Yͽwy]euq"H  Xɠl#|! sQ"7(Ig4S*D>DX(z9f,Ӎqx`dy,NCc|$laq0%I@257{=du@Ư|c2Ȫ=ZPAL{|j{N"k̹|v4_Qq_)s&MI4DMcx1 ɛ al/W9^4JIA(rk,XS >7$- 4=s ӍbDq,5O&Nh7mK.]6HAWN`] KAFgA='1${݃|@וn9Ħ Z.NAi|m" tk:zN=|q٭b[M[ |?7# N5(,(v=M+v 4PlVuf)㙧[daͬb} yA[ ! \"ܕ|ڀH {<.(}]XgzCLT̈́ NJ-pҪʣ)B *]seޱ}rv/aÊzZXlz`v=úyrfk;@(/'3D@"qػ$?w͙R~)3R_Y*|n,β{Q|0f40T }өyWm^ XYH9xĻ 2t>uYcE/АC*,9>AF*f uH0 wT\~IDsW_ӌb{AAo,XEDD߈l(shA i3Ώۖs3> 3?حk 5/^ ʃXxeyZ_9s<%;.so}"|0aU~o&&H~] ]DH.~kW~S9~DPX|q}3= SH^b풐-<-eN}8jg{>.d"$RdU3Ӿ{_i#_U%FsQG b}t9$.<-Isq3ݡ_ U-w mԸ 仌re tRIK6l})Smܓ'3F-ɹ:up/gQ$]Pқ\5m 7n`ِ[uо K - %;e,h/dTt`~8=YƝXxSxw}94HKN3)2/)i iW9KªJz !I,Ăl;H!mW('e `G(@CLxO 7lޘz"2*)Ѯ;`9?J唺fR'SN6^YmD@]z u I?PD/iQjReƮPcTcxMNBGotpr@hיxdS]-dR?@v#d9h ; 2>\Ə.4d;"WзشFn>VnN\UTGOq԰x+x-.("5-*{stO{CK \nHdQr$$L l!''KR2V>Og3 $W[\n2x l57> !`mO.𷉻劅t P0m6).S|miWcL >#k9^-ݲ`ڸQ$;桕{."U[ϴ{i۴+}ɡyUYn]|L񎫉V$X9 gWƪf/)[:>̥e$lT߲hg mXl*M,Fn#اo)Z/O#? \!OA#vN e. QKR'osT[~UM UJ2f{IDШ8rnpWH@o BçwecS ІeX^qt PEHs~4I@:7#3Ɠ0r;E㉔&~e'VVEDGͼb\ )zʥ5_\:3=^f t"4%ry#|qk܆dIYyv\j6nG.QL*~1:u'/ƇPfMK!jN`<]VYz.8{ZXo䡗mρb)@`)  ˟[zǥАYwS@mA$5ɒgASpʛ:jFy 0UN jsR:1ӵhsD [hP_sErV]CJvZżGv=zwM}Y細/9%IMCnWe2x zTL *5ц?*߲2)SH\[:,槆]h=cPUI<;,=QX|-tO$Oa$=qt.͟ZQmW|Q|ڮÔIA XÄz1M͆Ϟ }wE{W597 `QpjHWoJ /c/("^Cσ"=0 6#zN{^$4 iI7 fH(]b )Y\GEDXzpq2E?VM89ɤ4X(x>:2pİcn $ݮP1o_*E|~i״]? 9O]|y1 ni&-R$Ƞ9L;T SGۻzyo \ً%=֣ Z)%_`B~6j%hpez40ݖjxDPn =2V6Fő,4ޣgʸ /թQ&o4v׆;zwPے{ϓ1d0& {Й ~!3L'}v1N8@Ovr8w2ayQ)H`5N{ưEt<ACx#5gd„š[Ґ+S۵]7d{vks/s89*9#KI!;6G'yvw[>3LJN8u8#D :(Y%ۏ#^1GKꐂI"[oJH o)`{kMn7pV0c3s5}^W`͙-k޶o%7) p[;Uqmw9|O3z':;8jsCOz 9zzQ sg{*R%q'~vKu&#KkAY3V9w70ɏu7z*~dlI/ 1i8艢STi^W: >o1,& $;_&,yvMDg{?d,w>yJ3rqAe4x|(732]DXw#@s!*@8\p"h~S ypm"lrL9T kO`ݠ*n9̻>§MY|6V8P?VYSd ﺓbq}HE4n3qlkzU޳&|jEEW.'vԇ3&:Uޯ7|Zs[= c{&cxpdVHx%:Fg230耍X|4<a` CѺc`wwա0┡뎢|>S"d~ߧkڭnySkk7 G}/ysg>kyL6C5 aѩ,s*q0̂,@,dh`{sKjz!Ba)lc#|,YiSsƻ#\ˆB1d^4MCnK:3oj#Pnd"uȋ~_1\8Yya>toy n}g|VGI8"hfDq+8}͗!T ֙ w3Tq3f,ækt#5,k1P6&o.j ]aMG8.-C 3a-\jk1&jӌjeEKz곌 LY6c4ԀC XH+\9 ls:dEIƥ# Cx]#BVZ?LЗvB(cזzYXf`]CPwW9 )ޠ*@YbbSg)*[޲zP3T2ל,V.m!tuWԉL9 ^=_K<-R}]vv_X\8W5C^zֳmY9H=99QqRViݤrv :R#캍>g|\G:nx5k|itqxTGNvJlhϾA i|z<`!?Dg[xIC<ݾhÑ>,pHm;ZSDBb9|Up靜;v<bߚaɯY0:~tZ>~e}o!>ut*5W^1z($ŒssmuI8Î+ @ܞ5۽ w^4u]Tf"2XMn ~ G83:`c5cr'EyCڐBEFl7L 5ߏm X $ xq~pGs975.T.gf%?7פr$?P:߱`kׅ<N9P8u? Ug(}:/9%ZӚ,Jxa x.xzUX\,eaE\)J f#$vqɤ\SA\ܡefX8;3g,D̄h2!Ge2an6].$[wȐGrNRH['jcfDÞP?ə Axx])a9vT4pIWS`%^hJTo:JƊo|T9˔m7ČtA#r_Ŷ?-QD*sqͬ~ؑpEo>m͇*DebUzݢ#ӋCb mC-8t]KOVI8M)>z.+]k}Eg]wΡrhBUܡ`W^aNoKXNީɻ4/a:K_',;֞KrCy3p<8_6^ `Ѳ oD~m9F!x>Ҁj+c/&Iz\]@L:wκSB927<7[6:Q!dwQqٗXdxx0}ہf3< <ŗ(S&i~Oل!ww8XA}HalbAO]*$V^@ԉPػlGM߂½g gk@#q:hξ3ǘ_8uWBڴ?4qȒvn0EIqQDo!H,$ k^4`6Cf=j f47+%y3&"FVVLk]cq: &mgCW;gˍZl|:]c{ ۆ@u3sߑ>+㞱e2H!d#|1׭3ws8yu0\EӐKe=(E|=>VTO%^"8v ~X.ِ`b=l?S}έ^Q=XVclE)m"h% Aul(lF;v)p;G^ z= tYiZDe# xE7lgv!j&RB{s`Ɋ&G+2Eqv0k"̄|gr'K)|ojL|^dYfلiB$ˊr?5_Za#_ģHvמ"^Oƶxi~yjQ! S"ONvZ~^ a[GFj J̒ղGg;Q8sQ|xH(:GpQ*"-V~ƍ0 'fܾ*Qx,=g(ki’!!~/8:|]6h!-K I2G31%-77zY= "9 k}9PKG~Q?X.5+‘~Ƅ~L*QnCoƿiZzfP 0QqyL%2!~% !UCZs8n~E L| 5pNxB[(C@Ab[Lk-RQxDFǼbF^+;]RՀlSRނ]I Tk:0?/,5hg(LF?**g6:_*Xk!_k_H~C&KElf~i˚5%gZIԫ(<Jva$Ay0MzT3 p>CyQ~?>#ĹUYm)) MA/w*!JibTdO; ]7kѮ.ܡڢEAd=( b\!%&8;]/ r)ЂO{!ɔv\.w D{h/liڰL 5bif >h|[ԇ-ʈ?ԫMEg!a&cDl wcGMmtym *^"eF!8xh5J#Ne a~ #hڲu hk"f H7)FC.}}̡sSyyG 8 $nO1*롐31rLOQB "! ?22'aTHf ¨Kq}$^cR9jovu>[/H[ޘ=US"HGoG.ۆ"0D>2ɯ{-jŻd q "CnV\QE@At?H068!]ʯeL$7sV@e3͉!q| Mr*+icJ-M?j(4ח$C`5-7(e۸|{ "ZubMN,5CS[c13VT+xy@V|4ieh Y0w^M/G$C#h?PL6 'x)YS!8\h-i&-+O?c$C d{ @&Pza[>8nE([tkxTu4mgMX/[MoW{xQ%ƣ2Rܷd3|Aj"@|)V{#DM^ɜʺ,3|ek;'#4kKC9ZO1䈄5 >.'cy%Kf妱`TVV8kgٻR¢1TƆ,*dA"2~?p۔ż ;?h?R*:b$X$&n7#Ϫ_?o/^.|!F[~RnVYZTpx2X(- S{Fkal3fɃ~}g.Gh.alm\LU1ruHuͫ퐛sεh` o)ݻD`6AE}ĴnGId!~{B?u1p@Gs Ç=5\)d6C'(2Qȥ#EtܲIwz,7s~f= xѤ 89K@JP㾳6gBՁRGV NȯI:_BWzlg_5\~?i; ?!A;b X>e4@L.1jĴC1qeM!'MOG7q}S։!7q5 81pّ\' 5$b![0B%ܒ'?XĨSQ}g]wM^3P0$'~0$V |G*m:?Y5\A_ҫJ;S5Q ;?u%0UCVU2QAU@$yZuI ;L4q4Ȍ ?O(Dsf}S~}x_{ ~L}/N3.?ǵy}_m'R^"~}>Վ~m*P{=0R}ռyU*.i#ǛBo&#x!|V`-py \F?-CN~&z2@!;Ѩ:ZlUCx0 ] )=z {I,@(9~E8\wvPg/K_:똞?Wǘ@%u"n?C4>joJ)jJHO?cz׳b;dO ݧY9dK _qǹ` ì$AlΔ@cADVJQ3ۂ}0|yṡ(8iRh !MBH|P=lပ;-kVoCk\'nYRjhL2a6M~sxH)w'kK5l7H(`A4jC7;K>I9~S}6skԘd"gM:]CDv!>_ЯD_`~`ߨteVd7fGØ [e/.b1O5_9_izTFQhkZ!oӾ]*7D;ud!N-e?Y^Yj?9DƻL= X/KG?IefczpXVKA>tjcr?ٶCC J]O&iu٬߱>GpOrjWԎnv~e-?&_`V^(#mSQ:Ͼg}=e^>[svzmgn_)|$"C .,̠K`\ 5'Ҷ99z %1{GXLŦ8WQ {;\EL b{~ѳH&igC0Vž3=$4N:wZoN;gz#>hu:)fr3G+]I]բ3vsJ=:ۀ}nb*=p/W.p0#j9wy@׮0ê(=BxSW9d/(La>{o) 'ӀQEp*̃ P I)ݪ$G-[m^ _Gʓm'->ۯϪf6:ek Z?NǸ;wtxK}~_̉dRWɟUH iFdת~{RP=>eNJ9wo8':HVݦнPY:C?PGD(sipdx(,ҷvrΧGY_k1VYmJ9?&~w7\(ɤs\TS)F[҂:[j( O-5N1gn[.׃ ët۷8j]֖z: }t_sϻ{1#xHjl〯C;CWL!Wfp^wULnW{.e}]hk`tK +=]^8B|'|n l\aSz4~|4_J/x{=h.ܸ_9;0{?Shnn9٪vZQ8'()+UJ=gԡuWà>mO?AI \js+!1,mB\yQB{hlX4UZ:7K[Ѿ'9 Y1ሼRY {[md$׻(.AkVBS|XUhK<Fi%A\_xm3- >V?'g7|< ~yL8`!RcJ6[]5Gh{ubh͘U0*IﱝՁL kddx[Eػ/#`N0.:^'T/a臔xA>EgwQL1"x^$ais Tʴ4{=[>7N5T,6}7Exg핽j6BWC+*ת9v.HOkx, `D%GbagP!n1 O.n4y)f?.$+ ,<y(0{ c85Y&ց]HZz:-YOQl)u ,Q*B0 Cm4xm@yPQzCGTY,& #CGc.b Pě`JUcA9wmR/ZH2HC 08|pE#_~{}~? P@OWơGws,L;=~V4WG15 _]@MC|r]kǠտdrX¼2g#w߫|$H־;YY"9 ]#qI.DقܠUkji ?!h wUH"7sc#?>!'Oy$M⢼V@YZCm@8Lٲ6. 9?GwK]MHXDKKqkD5Mع*{d5Oa$@͐;ei竲@ sm"#S<(0$rݹF6m CVjV{6$<:/4636" U";鋸1=m]€]6@4c -t7-8mM{t8xf9.uJ" 'ό8-hH D! <|NoA<'~k["/@jT cdp8DӪuoI1K,4HQ,$o.NS h}ngd(. YՑzEo &w mhL H Z7E6t( =យZG*q/EXs*$:tBR;V&ɝfe9Pb{f\9 !"vuԀ0ԅ=8,u Hop1`їE mp‚rYmfe{Ml5?!ф-Z Ԥs yĹ@=/@ @ -)^ذ~3q~eGZȕ͚pG}3,g=: z>URȉ56OK\q{.ȏ t33\w&@[;m>NZ$͂NPxyzq޵b.ˑ55wNwyriKXLq~:mr\ˢ+f*W]LtCy/.U58]$S?E7_`,GI{ oKGW1yw-H[Y<^1FutoQTWQ澜 -2}YX\2)e]i49ٗmH ~,UʳfH;`rF5Ҵb{C]s&b⿣P>aY?%d{,3pϖk쭖͙-cfkGlΝD`k 49Ꜥt }' `גOW(PThͷ7 t/}Ϟˠ V,`%ѧK@_e5儧k9-ͮjJ|_9{֪.,yAG<"m|<׋%+"PӏbWUZ?UNGx+-E*=}T8G8p]27wT Pİ/yO@`g] kFje&{ߞJw9δN:Ȃu.Y[sXkH~x,㿦׌ &@