open Types open Common open Printf open Config_file open Parser_helper type special_export = Re_export_all | Fake_export_all type exports = { export_ok : (context * string) list ; export_auto : (context * string) list ; export_tags : (string * (context * string) list) list ; special_export : special_export option ; } type uses = (string * ((context * string) list option * pos)) list type prototype = { proto_nb_min : int ; proto_nb_max : int option ; } type variable_used = Access_none | Access_write_only | Access_various type per_package = { package_name : string ; has_package_name : bool ; vars_declared : (context * string, pos * variable_used ref * prototype option) Hashtbl.t; imported : ((context * string) * (string * variable_used ref * prototype option)) list option ref; exports : exports ; uses : uses ; required_packages : (string * pos) list ; body : fromparser list; isa : (string * pos) list option ; } type per_file = { file_name : string ; require_name : string option ; lines_starts : int list ; build_time : float ; packages : per_package list ; from_basedir : bool ; } let anonymous_package_count = ref 0 let empty_exports = { export_ok = []; export_auto = []; export_tags = []; special_export = None } let use_lib = ref (List.map Info.file_to_absolute_file (readlines (Unix.open_process_in "perl -le 'print foreach @INC'"))) let ignore_package pkg = if !Flags.verbose then print_endline_flush ("ignoring package " ^ pkg); lpush ignored_packages pkg let die_with_pos pos msg = failwith (Info.pos2sfull pos ^ msg) let warn_with_pos warn_types pos msg = if Flags.are_warning_types_set warn_types then print_endline_flush (Info.pos2sfull pos ^ msg) let s2context s = match s.[0] with | '$' -> I_scalar, skip_n_char 1 s | '%' -> I_hash , skip_n_char 1 s | '@' -> I_array , skip_n_char 1 s | '&' -> I_func , skip_n_char 1 s | '*' -> I_star , skip_n_char 1 s | _ -> I_raw, s let get_current_package t = match t with | Package(Ident _ as ident) :: body -> let rec bundled_packages packages current_package found_body = function | [] -> List.rev ((Some current_package, List.rev found_body) :: packages) | Package(Ident _ as ident) :: body -> let packages = (Some current_package, List.rev found_body) :: packages in bundled_packages packages (string_of_fromparser ident) [] body | instr :: body -> bundled_packages packages current_package (instr :: found_body) body in bundled_packages [] (string_of_fromparser ident) [] body | _ -> if str_ends_with !Info.current_file ".pm" then warn_with_pos [Warn_normalized_expressions] (!Info.current_file, 0, 0) (sprintf "module %s does not have \"package xxxx;\" on its first line" (Info.absolute_file_to_file !Info.current_file)) ; [ None, t ] let from_qw_raw = function | String([s, List []], pos) -> [ s, pos ] | String(_, pos) -> warn_with_pos [] pos "not recognised yet" ; [] | Raw_string(s, pos) -> [ s, pos ] | List [] -> [] | List [ List l ] -> some_or (l_option2option_l (List.map (function | String([s, List []], pos) | Raw_string(s, pos) -> Some(s, pos) | Ident(_, _, pos) as ident -> Some(string_of_fromparser ident, pos) | e -> warn_with_pos [] (get_pos_from_expr e) "not recognised yet"; None ) l)) [] | e -> warn_with_pos [] (get_pos_from_expr e) "not recognised yet"; [] let from_qw e = List.map (fun (s, pos) -> let context, s' = s2context s in let context = match context with | I_raw -> if s'.[0] = ':' then I_raw else I_func | I_func -> warn_with_pos [Warn_import_export] pos "weird, exported name with a function context especially given"; I_func | _ -> context in context, s' ) (from_qw_raw e) let get_exported t = List.fold_left (fun exports e -> match e with | List [ Call_op("=", [ Deref(I_array, Ident(None, "EXPORT", _)); Call _ ], pos) ] | List [ Call_op("=", [ My_our("our", [(I_array, "EXPORT")], _); Call _ ], pos) ] -> if exports.special_export = None then warn_with_pos [Warn_import_export] pos "unrecognised @EXPORT" ; exports | List [ Call_op("=", [ Deref(I_array, Ident(None, "EXPORT", _)); v ], pos)] | List [ Call_op("=", [ My_our("our", [(I_array, "EXPORT")], _); v ], pos)] -> if exports.export_auto <> [] then warn_with_pos [Warn_import_export] pos "weird, @EXPORT set twice" ; { exports with export_auto = from_qw v } | Perl_checker_comment("RE-EXPORT-ALL", _) -> { exports with special_export = Some Re_export_all } | Perl_checker_comment("EXPORT-ALL", _) -> { exports with special_export = Some Fake_export_all } | List [ Call_op("=", [ Deref(I_array, Ident(None, "EXPORT_OK", _)); v ], pos)] | List [ Call_op("=", [ My_our("our", [(I_array, "EXPORT_OK")], _); v ], pos)] -> if exports.export_ok <> [] then warn_with_pos [Warn_import_export] pos "weird, @EXPORT_OK set twice" ; (match v with | Call(Deref(I_func, Ident(None, "map", _)), [ Anonymous_sub(_, Block [List [Deref(I_array, Deref(I_scalar, Ident (None, "_", _)))]], _); Call(Deref(I_func, Ident(None, "values", _)), [ Deref(I_hash, Ident(None, "EXPORT_TAGS", _))])]) -> { exports with export_ok = collect snd exports.export_tags } | _ -> { exports with export_ok = from_qw v }) | List [ Call_op("=", [ Deref(I_hash, Ident(None, "EXPORT_TAGS", _)); v ], pos)] | List [ Call_op("=", [ My_our("our", [(I_hash, "EXPORT_TAGS")], _); v ], pos)] -> (try let export_tags = match v with | List [ List l ] -> List.map (function | Raw_string(tag, _), Ref(I_array, List [List [v]]) -> let para = match v with | Deref(I_array, Ident(None, "EXPORT_OK", _)) -> exports.export_ok | _ -> from_qw v in ":" ^ tag, para | _ -> raise Not_found ) (group_by_2 l) | _ -> raise Not_found in if exports.export_tags <> [] then warn_with_pos [Warn_import_export] pos "weird, %EXPORT_TAGS set twice" ; { exports with export_tags = export_tags } with _ -> warn_with_pos [Warn_import_export] pos "unrecognised %EXPORT_TAGS" ; exports) (* $EXPORT_TAGS{all} = [ map { @$_ } values %EXPORT_TAGS ]; *) | List [Call_op("=", [ Deref_with(I_hash, I_scalar, Ident(None, "EXPORT_TAGS", _), Raw_string("all", _)); Ref(I_array, List[List[ Call(Deref(I_func, Ident(None, "map", _)), [Anonymous_sub(_, Block [List [Deref(I_array, Deref(I_scalar, Ident(None, "_", _)))]], _); Call(Deref(I_func, Ident(None, "values", _)), [Deref(I_hash, Ident(None, "EXPORT_TAGS", _))])]) ]]) ], _)] -> { exports with export_tags = (":all", collect snd exports.export_tags) :: exports.export_tags } | List (My_our _ :: _) -> let _,_ = e,e in exports | _ -> exports ) empty_exports t let uses_external_package = function | "vars" | "MDK::Common::Globals" | "Exporter" | "diagnostics" | "strict" | "lib" | "POSIX" | "Gtk" | "Storable" | "Config" | "Socket" | "IO::Socket" | "DynaLoader" | "Data::Dumper" | "Time::localtime" | "Expect" -> true | _ -> false let get_uses t = List.fold_left (fun uses e -> match e with | Use(Ident(None, "lib", _), [libs]) -> use_lib := List.map Info.file_to_absolute_file (List.map snd (from_qw libs)) @ !use_lib ; uses | Use(Ident(_, _, pos) as pkg, l) -> let package = string_of_fromparser pkg in if uses_external_package package then uses else let para = match l with | [] -> None | [ Num(_, _) ] -> None (* don't care about the version number *) | _ -> Some(collect from_qw l) in (package, (para, pos)) :: uses | _ -> uses ) [] t let get_isa t = List.fold_left (fun (isa, exporter) e -> match e with | List [ Call_op("=", [ Deref(I_array, Ident(None, "ISA", pos)) ; classes ], _) ] | List [ Call_op("=", [ My_our("our", [ I_array, "ISA" ], pos) ; classes ], _) ] -> if isa <> None || exporter <> None then die_with_pos pos "@ISA set twice"; let special, l = List.partition (fun (s, _) -> s = "DynaLoader" || s = "Exporter") (from_qw_raw classes) in let exporter = if List.mem_assoc "Exporter" special then Some pos else None in let isa = if l = [] && special <> [] then None else Some l in isa, exporter | _ -> isa, exporter ) (None, None) t let read_xs_extension_from_c global_vars_declared file_name package pos = try let cfile = Filename.chop_extension file_name ^ ".c" in let prefix = "newXS(\"" ^ package.package_name ^ "::" in ignore (fold_lines (fun in_bootstrap s -> if in_bootstrap then (try let offset = strstr s prefix + String.length prefix in let end_ = String.index_from s offset '"' in let ident = String.sub s offset (end_ - offset) in match split_name_or_fq_name ident with | None, ident -> Hashtbl.replace package.vars_declared (I_func, ident) (pos, ref Access_none, None) | Some fq, ident -> let fq = package.package_name ^ "::" ^ fq in Hashtbl.replace global_vars_declared (I_func, fq, ident) (pos, None) with Not_found -> ()); in_bootstrap || str_contains s "XS_VERSION_BOOTCHECK" ) false (open_in cfile)); if !Flags.verbose then print_endline_flush (sprintf "using xs symbols from %s" cfile) ; true with Invalid_argument _ | Sys_error _ -> false let findfile dirs f = List.find (fun dir -> Sys.file_exists (dir ^ "/" ^ f)) dirs let read_xs_extension_from_so global_vars_declared package pos = try let splitted = split_at2 ':'':' package.package_name in let rel_file = String.concat "/" ("auto" :: splitted @ [ last splitted ]) ^ ".so" in let so = (findfile !use_lib rel_file) ^ "/" ^ rel_file in let channel = Unix.open_process_in (Printf.sprintf "nm --defined-only -D \"%s\"" so) in if !Flags.verbose then print_endline_flush (sprintf "using shared-object symbols from %s" so) ; fold_lines (fun () s -> let s = skip_n_char 11 s in if str_begins_with "XS_" s then let s = skip_n_char 3 s in let len = String.length s in let rec find_package_name accu i = try let i' = String.index_from s i '_' in let accu = String.sub s i (i'-i) :: accu in if i' + 1 < len && s.[i'+1] = '_' then find_package_name accu (i' + 2) else List.rev accu, skip_n_char (i'+1) s with Not_found -> List.rev accu, skip_n_char i s in let fq, name = find_package_name [] 0 in Hashtbl.replace global_vars_declared (I_func, String.concat "::" fq, name) (pos, None) ) () channel; if not Build.debugging then ignore (Unix.close_process_in channel) ; true with Not_found -> false let has_proto perl_proto body = match perl_proto with | Some "" -> Some([], raw_pos2pos bpos, [body]) | _ -> match body with | Block [] -> Some([ I_array, "_empty" ], raw_pos2pos bpos, []) | Block (List [Call_op ("=", [My_our ("my", mys, mys_pos); Deref(I_array, Ident(None, "_", _))], _pos)] :: body) -> Some(mys, mys_pos, body) | _ -> None let get_proto perl_proto body = map_option (fun (mys, pos, _) -> let scalars, others = break_at (fun (context, _) -> context <> I_scalar) mys in (match others with | (I_array, _) :: _ :: _ -> warn_with_pos [Warn_prototypes] pos "an array must be the last variable in a prototype" | (I_hash, _) :: _ :: _ -> warn_with_pos [Warn_prototypes] pos "an hash must be the last variable in a prototype" | _ -> ()); let is_optional (_, s) = String.length s > 2 && (s.[0] = 'o' || s.[0] = 'b') && s.[1] = '_' || String.length s > 3 && s.[0] = '_' && (s.[1] = 'o' || s.[1] = 'b') && s.[2] = '_' in let must_have, optional = break_at is_optional scalars in if not (List.for_all is_optional optional) then warn_with_pos [Warn_prototypes] pos "an non-optional argument must not follow an optional argument"; let min = List.length must_have in { proto_nb_min = min; proto_nb_max = if others = [] then Some(min + List.length optional) else None } ) (has_proto perl_proto body) let get_vars_declaration global_vars_declared file_name package = List.iter (function | Sub_declaration(Ident(None, name, pos), perl_proto, body, _) -> Hashtbl.replace package.vars_declared (I_func, name) (pos, ref Access_none, get_proto perl_proto body) | Sub_declaration(Ident(Some fq, name, pos), perl_proto, body, _) -> Hashtbl.replace global_vars_declared (I_func, fq, name) (pos, get_proto perl_proto body) | List [ Call_op("=", [My_our("our", ours, pos); _], _) ] | List [ Call_op("=", [My_our("local", ([ I_scalar, "_" ] as ours), pos); _], _) ] | List [ My_our("our", ours, pos) ] | My_our("our", ours, pos) -> List.iter (fun (context, name) -> Hashtbl.replace package.vars_declared (context, name) (pos, ref Access_none, None)) ours | Use(Ident(Some "MDK::Common", "Globals", pos), [ String _ ; ours ]) | Use(Ident(None, "vars", pos), [ours]) -> List.iter (fun (context, name) -> Hashtbl.replace package.vars_declared (context, name) (pos, ref Access_none, None)) (from_qw ours) | Use(Ident(None, "vars", pos), _) -> die_with_pos pos "usage: use vars qw($var func)" | List [ Method_call(Raw_string(pkg, pos), Raw_string("bootstrap", _), _) ] -> if pkg <> package.package_name then warn_with_pos [Warn_import_export] pos "strange bootstrap (the package name is not the same as the current package)" else if not (read_xs_extension_from_c global_vars_declared file_name package pos) then if not (read_xs_extension_from_so global_vars_declared package pos) then ignore_package pkg | _ -> () ) package.body let rec fold_tree f env e = match f env e with | Some env -> env | None -> match e with | Anonymous_sub(_, e', _) | Ref(_, e') | Deref(_, e') -> fold_tree f env e' | Diamond(e') -> fold_tree_option f env e' | String(l, _) -> List.fold_left (fun env (_, e) -> fold_tree f env e) env l | Sub_declaration(e1, _, e2, _) | Deref_with(_, _, e1, e2) -> let env = fold_tree f env e1 in let env = fold_tree f env e2 in env | Use(_, l) | List l | Block l | Call_op(_, l, _) -> List.fold_left (fold_tree f) env l | Call(e', l) -> let env = fold_tree f env e' in List.fold_left (fold_tree f) env l | Method_call(e1, e2, l) -> let env = fold_tree f env e1 in let env = fold_tree f env e2 in List.fold_left (fold_tree f) env l | _ -> env and fold_tree_option f env = function | None -> env | Some e -> fold_tree f env e let get_global_info_from_package from_basedir require_name build_time t = let current_packages = get_current_package t in let packages = List.map (fun (current_package, t) -> let exports = get_exported t in let exporting_something() = exports.export_ok <> [] || exports.export_auto <> [] || exports.export_tags <> [] || exports.special_export = Some Re_export_all in let package_name = match current_package with | None -> if exporting_something() then die_with_pos (!Info.current_file, 0, 0) "file with no package name wants to export!" else (incr anonymous_package_count ; sprintf "anonymous%d" !anonymous_package_count) | Some name -> name in let isa, exporter = get_isa t in (match exporter with | None -> if exporting_something() then warn_with_pos [Warn_import_export] (!Info.current_file, 0, 0) "you must have \"@ISA = qw(Exporter)\" to EXPORT something" | Some pos -> if not (exporting_something()) then warn_with_pos [Warn_import_export] pos "Inheritating from Exporter without EXPORTing anything"); let uses = List.rev (get_uses t) in let required_packages = List.map (fun (s, (_, pos)) -> s, pos) uses in let required_packages = List.fold_left (fold_tree (fun l -> function | Perl_checker_comment(s, pos) when str_begins_with "require " s -> Some((skip_n_char 8 s, pos) :: l) | Call(Deref(I_func, Ident (None, "require", pos)), [Ident _ as pkg]) -> let package = string_of_fromparser pkg in if uses_external_package package then None else Some((package, pos) :: l) | Call(Deref(I_func, Ident (None, "require", pos)), [Raw_string(pkg, _)]) when not (String.contains pkg '/') && Filename.check_suffix pkg ".pm" -> let package = Filename.chop_suffix pkg ".pm" in if uses_external_package package then None else Some((package, pos) :: l) | _ -> None) ) required_packages t in { package_name = package_name; has_package_name = current_package <> None ; exports = exports ; imported = ref None ; vars_declared = Hashtbl.create 16 ; uses = uses ; required_packages = required_packages ; body = t ; isa = isa ; } ) current_packages in let require_name = match require_name with | Some require_name -> Some require_name | None -> match packages with | [ pkg ] when pkg.has_package_name -> Some pkg.package_name | _ -> None in { file_name = !Info.current_file ; require_name = require_name ; lines_starts = !Info.current_file_lines_starts ; build_time = build_time ; packages = packages ; from_basedir = from_basedir ; } +:U.+xc6uMo~చ dv!"{;fH"*vYkxөm!lq}<俫 VNzr,0+@ODj_2_Y=&ۉ7lZ|{䁅ox8ѯL|Eއˬ 1ɯ?5YO%$ _\tȬ7Qщ̹a Û}&^2f^[S&h:6BЊz 5w18ÉnR<9<ྴWaVN}Tjuo3YeF}P]"rt!26hY Odf6}_຺ďFE罠KqH4 ABg%z7 *K~Dz^lKXtt 8ϋB=vBSaepڧDϺ&>Ȝ ٜriqS# sy#T-eu{ޛ `PK XX<DZ+jŽ;a0@ 5@ !!s?sMҁmq^w7K'rhZy=lM* MC,^Vay$&mD%}σ!d&)5#Hr@ͬ>< +/\Mm[ǒ*ྮq6`yCn?X$!--ŒPdIȃ 9b$e_OZgp6E Sq?:*#:vÒ_[[y.+#$"m99= l|A6Y1IJ"ze>*;܈biۆC5ݒAȑתDܸuJ//-$!jg/ j0m/k'lw@xhH/ &;pv1^-CS`ϵ392GZ>^$(3n'FVyrػin5 -N)O1yt Yi`a` dQo==%i>mEŝ$ ^jSCN R H_Ak='5mOPxk0;Ӆb&-FB&:p H`d XoUR/#G7WICǣYV@@p3ے.poJPK C{q@&p@wV'}cXMm*VN?[$fYNA<)~Urg t0y`={ v06BDz#K>s&V\8sG&q`s(xo9X*Q ٽ!U%zXըAAI;T#_dIsoZ1cH#4,bOArWhnDs5$Xmzk݀ )/iR*&P3 蚑=2tמK`(,Kx5F;rtYWQb< ?JU `AMmVcvZ/9@{7{lz'yQi*m=7=Md} 5n@6!Sp̷IKqj9jĢ\_`b$-q0%݃x|l8V7D&qEtdjHY 8U)T2@T*eQ*O䬄+hf 6lg(ޢ~'PݿR}xNaaY"mhmM R_UDv =gA!2I-Pxv@<-0`L!,aD-!v0]2i=۩ D %؞jX T̢e7[M1|Q^p|uA#:njQ!Y"xbZ3{kŜO i$_ Ī4:2)@pt;a8ʰяVЋЄޞf5Iv%Lyť:.2(ͺu79ŪHƭA y)NMdfEGCTsS>˹]eD 73~&cN~ܿyۛ!sfk,F!LI@BX/rҢ>g'ϛ!^l:ivXI[sCQTl䎭,>''9ŦiʷPgzGQ FV]6=[6:&22||tl"+2O&4kJqg=dA?_:=H^E,mnT8 [gmF1H35J"a`$7*CA ut~ӆAH(˚$[&h˜ i0Y|7ETF>ʊ3dm;Pm^(`!o5^-ZeJ2a8 Φ|+.>LȰ Hnt%zE & ,5K>unX?3?>U!OL&p|;0mzE 5JVJVu!hwƞRgJL'm&y-,'`B*)\]jӥ@:߯MƂ):`m~nWY'jr'<"(GOx0;^<4]`û#(b֑*mւuIk-\zuh.H˼{,}ԷД@.@tح<_k&=5lX݊U7pNP'q{4,~Ģ?#?`jQH]))S%|%|?d? 5hYrh 0 K {$@;Ihlr>yɵAݣ> =ZV ˘!}JfA=J}}J' T1/y@XpwԳyTyV *d`EQSA.@=M6_ ly'S}f& nfrƓKA{,byIkZ?sǀ䖇L $W^wْ$`C9-Up%6>2Y kaɾ-`ѝZބ&[R1RQObvŽۥ;m*Dat s3ƩF7V.ƦI#Cy'%WN:[WB;=el :л֖1I#aqh}]{*vcBڮ%&W '{Uʍ~ 'C:Bzsƒ_8kdO~OM'8EL &JZ,?K2cXz[Ԭ>VgڈP hX}P'%O=DF}Mi+J_h:|ٽ΄.\*G\Z٢hӂ\  Do?me$H)3ز3^IXaWR{6\aV:1UY;~rƋ@W +\Lp6r#ne[v-Ү\%'p̒[(NzI1?h{Z\71^/XM$R&" @7X=FT|{c'ej|h=/[,mr;T9T+X@5?|͍xe_,IjI"=4NE[}4/ž{W%c]"?0zp.ʴɾ4DpJdyd[BR蚃iBQ%mI.6~! VG"u(qEgx^iUw?7V#[9ځZLZ/ @d5C>: 9Ax+?_~4uR^nֶ<ӎƄg%h#bAF#mynHkd`-皳3g奄b77 nVaH*6ԾymheB~SA;d#cB]&ݥNyhyPNK>Ku0٤HR*?GpmU2yH 3U}nrI>xswj%Bv(r2w=TYb<,;BlEBl0р#1TD;P{D;ټ RuiNO FaXCK o񻯠&pzvB`Brݞ|IDq ET*A^[e X^vH-cM:?ؽ{wQ}0 21"CJA%Yǂ_mrŷP t7H5rYGniz9Osπ* D0Mz*=>bz[Aj>d{ fU:)֒p|f9 !Gۏmc=6‚Qܾ3XN//h_)_,X+~|UI5^BSu߉*V?E-x+U LC !ozĢl<8D6ԇt%: eZ2y8]n wLCQB{$*8F0pJ85ݍpFC ҋh0r0I*=2٧Qr i,p\OG}}Yov)gj(79Y^ƪe ÙSSݒh,&XJρE(.Wg~koy=JfZg=)LČ)s(%!eAُԙdfo/Do6 V-ar.+aQʿ[cxvhippA_׼A.7,;[5zQ  -.9I,4ݲ7q kOMp1BsZV`Vjɢ gG@\pќ IƞN `7e9O8 i sc/v& mV6Z0&%1T7g ED~ x#I5k 9:)٤h!85tm O' vA %x >7ZQ ;&mQ ň 5A(!E+ >| v++I婴 Yyr>Xz$@$"TJ%%O2Nj^A-%~*'tpTBvdh Ffvs8lJFKɨ=cYQ01oC2+02uibÁU6f/&Ys4<2QgNhK<$ET~ԋן#yW hTHuR1nYX7 Uo.eӯn`;=aU ao' -uJ>' ίQcӂ[mR$ry*pJp\rI+X1LG;qS2碹#dR#e/>P*!' O[Ѯe%zGX{'Eh>oR,6&}@Esy0-39VHYbd!ٜT_} ^z5znl05\nyG/ߺzRnƳL7h\yLV^R#X/{$Ƅ=3yGrZ#sÈ'O16_0JӬWpoa&9wN*_T>l 5YK >njrJuZ. &1.&+ ~ H<(5/ ÖOGP-w9j g,mMfs.#UiDNʹM 7>n!Cjr@I 1#KOCxGgLGEqLnXVXtNU@C;SSͳ(e 0Z-n.zj+<B40ӑ#(WP ݹ#2I d;q 'ь'\t,,eUD R9db+ Qա'vw;!-!LT<zۋ H3 Q@BAHUrj4Ho|,e59jN~ؔ:ahK!<von鲕>Cu@,R\i rMt4lm5pѾ8`f}!V ` n=N4J~R2+V6-'LAT_C#!j'&B,9tR;<0"|q?߷];7+iw368{*Cc{+dCI&b{ֱTabF-HaR{K5xXSz&x (o6m(YuhFs~=88};"}BFsW{MSz.U܇(.]^34׵kR!F|Q:$T-mj5W<ml./T+QjIfX3ΐEtNG%3d;d1VkL>:ћ(NBQ\`zzIkyD9/ ˅@c,XÇP'0D( dFcH+'ƶ,O 5|bmҐj6H‡:k) 7r/"kR* @N[9q(9_zL )8q30$Si\u (&ՓC;H+pĘOFf:oژ]8VSM.6hj̭@X,B}PtG 5U*g 9G!%Ĉ>>E,{FwN 2+UJ{ccXfORͲ3I&G70Fo=L:FkD2_!s]zҡ2H^@;~ؿ{4dr!7tnA&J}*UΧo4ĆN{&քOY*\Hv]BsrG6OCOvz `h5V Sr~;. z?acB\(cTh1 Tؑf.f?ϐKI`9߈\J![Ό3{X`gp&@$UvڅAt*K^~xc!bbᵬ5`^BӈcB=zmwGe1PzCڪ2`v+!ye~t.6➏FWk8wܹL LVE^9,'[^+ )=pzv̪T -k'<-h%Gf [q9Q>#ԆE{;:x23~ b svhIRBp[&bzähVY +\3;陖61(pT?Zr1sE؋j6}h]8Mj~# ]U5.khpy"ozжwRMJu(r/[ߞɴK^|{+2i^ΣmxmH%h(-0u4v!@͕)0H? p$YCHoWl>7ir";NHЃŇ<_I t4̔4Wjhq|#S=jvtak28$g󗿜}/Q]!ն3>BI+[KsOy-NiԌD邌 g}K+y-)%mjEwW .oM P~rtB fyQh&&Y=h5A4:+h&|m҈ť #n JD zӂ)۩yf*m4PPFjZ;"N!ާN+uHU+^ؐ.-[dLv.`܀ Y݃ tZ;eϔ[#k^F>#@Xo> m']4nkl $ՅlԠ*LW-:E<n\]YXi9m';#UǃH' pP5-$LCEwD`UR%Ms-!/8 cr41 H!tR!SyMo|*7~[7ٍaVdHIř0>mn<ط<}{޷jy0(q.bm%9? UީKo'0 `}SʪvdPi*ǹ,Lܧ_'] ^P=؃yP^?T8Sihu Ip-e CT/ETzRzg"3efMR m& 09>KV=po4nH?4Ǔ%6y`)sistY&GH^^+݊R~ss 7Z}4hu)E}QcK,Z_nr .La<~]*UaUʜN^6 8sAW*K[-0C[""\QJZA$ u;@GbS<?xH ("Fn SR`C+Iņx^u[ ixp90L{54Nq{t@{{RPY$w,MvFpazFޝZT?: 3!P1tK_Y߷Uc |/FʛgQvr%9&,@6Բ"A"4<[j$bDPo|p5f}StR! ١ǂO5wJQ_Vc &rC'/)ظ bD~$fsZCw6##P $-bC) w 1cJg0uuGDz9MO FO`uZY)a)f/dy 9h;z@pQ;ֆ#2UdoMqlsy'g,x|rzU}s#3DýN]AN)U- 5ʝnGt/.uoWiQ6o1sKu &7u QG(G 2-zRR9:yr ިEe0!d*Ye#i9+ɱ8b8:wG/V x 3 29]ݱ68aElY5o޿`( Ϗ3Bںeݮ[װ7@9f^#_ jFW5T{@OBb`yroPjݥHq_B GN2wio-SDc3#;m ,ƚi=mO[){HeUg8:7J9;8_Un%YsD \? #k"n]&(oޟ5Ō]72Da>2Uz !1JLDP?;Rة6M\`ܝ@#ָ *!(YG{ \kHt&K")I)#w|-[9GMym"IS^qֲ?g*ۨjt*6"!9Ș75i1`oM~zEUqz ?x/=Yc (m*0R[KBC{  ,?<; *n1=t gZcdT7o *:1;_dF譈p$bSʺDžմnAak'b[Ql?N}1Qs_22޶ǞrR5DapTЃyrkTZ5f֜)c:vfpG+ DR G[+J`zD]]wA QoΒhKG=K:#yX{7uH!5[=}6j&#“pTX,\S>nOG"]vZ4 `-jqD[ܒ^P^LoJ|f*#-?|:`r])~`Iy+Gro:֧Z2#a7IP琥F!a ȯoTxɷ8+l{]#x eOŧd? 6dє8٥$=YZfZpfxL '\B{$ʹB'eyitzm_-^/Դ|R_b`0z/^iųy֌9yj\~nӰnh53({%]IyyFrDeX2§z{OzZ*WFO$QXɠ>i^7~ίK )s6@23gtƕQ2:6`CP!>"FB "]ܭ?광_Pi/b qq~郖8j8lE2p&H0˱zNq(&jc{_ 廆`c_pSU!p`xTk5H| fRLd9I7$y0rT$wۜpyu [|9 W@#a cߏD^Οxu՗rRFČ_Et9gy>oե:ݲgqZh;Y:=7)(|.=1Z[3fAuy[a,{@%쪕]7NPȈrS) YQa=z d/y z(sq Tp|Np]1۲7Z䄾]][g11TXJza#d+rrxuQ--MeHۜzȠKͱF0 Nl}5l$J*oo_ڊk?-zBQsm~86^j /mi'N6/~'3Ҫ7֦2 T 3ؓg8W%gJI+Y\8;U4'%l\$I(g0SI.dV[w՟4n0k3j)ԇ1SBM:`Ŵe5]+# } H%KM&?Fo`lrmK2JZU`ˬ6;9u6&o$m{=l?3(~4{'r0U 2\, .Hҡ*P5~`ʂ@,h6 鲋AN"U.# Yz npCI wAĿ˷4=__4*ls|kݪdu4?MS'i%ގRKQ¤#V̙V/wIJԓÊ\il YjYc9'f2||-b%fUC~J?0(Й矛TϠy* 50ʺ&y - ] s̽0-5AUzZ8}>èl]96 T_Q gvx\{ChXڙ ScԹe9^/wvu]!煓}gVG(1L=tEvO"Us&-Av"A8Ayoe5|^3@RQe'ʢg#S aA`k=y?)4&=bDyVȫ"Xj)/-X͑j_7< lb F>C\T O䫴a"JnpT ~Ow_&b諍s \Tr\VX5m|tFm(S* f!nNmlg'F2~^k'9|P1xtb:ϡ ukץ+&,>h" 1o"}Q̑t:@$o&襢 _8nVJs0m Ur\oJPy^rr8HPyUc>{29m{bu@4ȲAk+[0*(н?Ghd @Qz_vt8'Y{̳`ГYIH_/́|ӥ~J/E }bY`3 㳵 +G(؛>AĠmbS$~a)L̈Dh`(L* Lw~I;kXScjց 8n8kQ[&H(2ԝ YeHp-zh >6KG~t[6=8QQMA\p["*!eNgNuY4 l@Iu3{B*)#sRp.]ہʨ,pCy4Iյ Ɂxws:k#=7.4^e)KRO9ݖLmq bE9^S9FtyoBuWVLն=OINyB\EbfBW-&bEv5D22Kg^sg ~ 1c c~dc_z˗+oul+*j$(B :l0v*rx#qTW;Z΍$Ԧ/Nkd1p<]3_Zh77}L$5 >X{Tu1zݼS a h?&| ǹF!o9Q1)]R$&6B;YK(V%՘UCkȒ&^YJ4J3DhqNZ<*tWYM2m╎ McKڑy)8@7G9䯄`'ޢu (I çD))D[ ur)>.nL]*/ ꙣi+wÞk6s<`>6:OQӢq ?O d$GHjdFM|7W 1:)jqŷ*(,Dy~hogѣLB7z̺pUORyb X0}cms7⑺σeLtiNYuMm_^>thtdjL;hk\ yC*? jۇ'2SU־IM>8k[˓ߥBB`VS(WLtE+P0C%ܼ*Ux4GѬ<<"sh^d)Pd)5/[ӞL6۱s5v?* `ز$`DQ";Vl#P/rE{,O_tW),`  5%o'Nҡ -v@t:_ȔWm "g>QIStIv8ЩN]蓹~BlhOSYyX\Ex"a@e/u u-ޚsLM:1 q^Jw5l S93ߖk^d۞O7t ?yQo|Er,o؉7 1-di ɫ4SPO5`rnk!6HЉVR+wҶXaP)'z ,?Ǟ4:S#V@'tUĝlރ(霁ynضtc8TKe0MتdJ#j)e`+L9Jp.` a#BQYopiޥȝ9',o{;T5YASثN܎7x}!QV6]>Je= hEqsc72@0n*2RsF@$Bga`cq٧ɂ^[M+z:FݍDm*:F{IKg f X$ٕI\g|M6(IZ_V:0{F=12F.ȰXq.zFO@ydNѱ@f+O,Ny- l썋dLdy&nৰAAFaf܄W-භrfwT|3cXSǗMVx 훑_c3.d.{@ tH+-q0 qGъa)qLNd'Ą/1J6q֒u }\m̻Ee VۑMͯ۴<kdZ}>Ο0 P}]hOcOdy[ !bgokt`"ϿvQP^q|#C,e (k\'=JWH_up/uf‡Ff4Hk=3[wOKaLI\X%x8hPm( jPڊUe hk.Ljvr0/>lB*IxYZ}pide ÄXKLJ wd LɤM=7|yek˃4KI/R@P%4Tfe^!ud(_(㺻dė-/MO._a+aaSqa @$,2ʨ؛%6e 5+l?* ̏gOE4rgcE#yW.i؎cj=AxFVT4*WvOR\\3F+(%R"_[p>;T2A~^!eoU/ 6n>  .C?.an4fْaҰDL_UzuDcu{Xsiʆ9]U6 nv=N#u1![&kM\3"j{lqa.LL:Ģe|pœLgHU2LERTLSg6ӽq[H[ qy@(nm kSfjl5zhEÂA抰7O-D9pQ< Z%>w.5ԿYSUrPa}j_2JenȡI3XpjcOZ4o?^#َp1-/Pn` α^{mVU\FH9.;#9WhWfm!.n>֯hz6T| ]WgmG9\; ~ |oʦ>FCsc{} Yy-gA/|ǚIʹFBV@hj0X5Lvq%uh~819&Px/Cm`%حy!k?A6+D ?=)}H푡$v/nͅNzq,IJ&LJBV+нZ$>"bն*tbA8~p jTQYU$V9.޹JP5?mdv6 6 ѱqSO J_p,69p9͑JakHA{L@ U]Bo';ܳj+-ۓBۏ251]>a$FJ)l'S4iˁm'lZ~,Aƹ#L~Du n`pj,\%e.?kW:SQ๗"Ꮇ?2pDՑ: lD8u2$rlI&f\IƳ6LN |;so|~hV{tZ[`:@t*3 -b9ˀ’؉5UE߀Cu1(޵v%S߅m ICHZ׀V2!eoh.BuBlsgG~La軘כ/`9l t1yaJ?PzT.M|;56]v\\Rvu.2&_Z(Q_E1{z,L@dAja; ~uȝ!! lMt.B5bgƋ6??MT.]Ti0GA0ɗE@p4s>P,[[h%}Z4f!`8EƑML2W]u#Vn+jm,xݯG6thP٥Zx5З,ycRiiMdف/h6C@C2CA[՗)Try:$m1"\87]w}NU߻G\d<27i=7LQvC$ш+CcەډKuR'%yt]&TlܗJUoyz}MF7Yt~.ljiHdd>mb{Z5.\/?H=cΣ qlڠYg['oTr\1As7=_.i~)]+i vUMJT)rq rqwUDrK{`:aDg,h۪IE -.‚%?n ϾޜAf[pI~x`f,c 4%2\҃BwqJoЏ2ջTu!Cbi4a(Uc軯bsɜzџ0H4V-:BIa&0 |f9;jmb<pgF3#)Dw"K; s^SΟ4 ҙ*nVM'/!X&;%%#xJ+9y.*+= bw\2`Տ=qΪ{0Q69 *A@js~ܗ\m&'B)CmlYٱV.KnqFl4x#!pf!WGr^IF Fj#QAEQG.FGTi_sCӡkk|zG)||y]EJ/a:S㓖}.m_F8Z7 V)tVyMՈJ,_ T3cf˽m$,Gyp7>j--h} ƹ&}E!qϋ"-ϱybߐ6,Q~l))Trf|q: s O,X/5 s٪HGt +הk/Q{d`_' 'gFmZsʧ %)P{@c5!OB.B&xupr3ؾrpPt?MIJY(lT?\2O/NZYzGb0Or}:Ru=\'K0>KDwu\?+C5ERbcp* +#ȿqsOģ\9 Bƒ} 1|ꍮBZ43`w4gP؞-gÖw R'0J96'c_b݅3-l\ۡҸ>|~7=C96BP-k=„ I |a qÉjoPJF 1AbQ"tfQg`-5|@x}d/% "bG-ֹO(̶pjiE{gq_gjoZI4O#Ou(&T !z.j_1_9(Ibǁ6o8|hm G VEe }{\ۀ<q\ HFpp0b* d?3O- aͬl9Yz) NRH7\ :[mryЈKwx%6I zԯ!omkqp{kH>6)c75˼J…n')4*4sns`N7_&kɽ2ށQgQ0s%ǒˮs:Bӕ饏7M T s"^ɖL$_t *R T!"RV4ЬD{4B\q8F3E=.b~mGkm=zn`z.m_JO8|BX,,\y*f_m˝ٴ#'"<YVԛT\9.8 .|pƦ'1 +P^!$X'.)~$lOX,ܜH1򗆎gRNu9];>[09&& OAMo{ Nr3_ң5l_aޓ2qzYrQ)Ĭ{?-xDBeyvجo {wf|WTBlöRN 󮲔6' 6x3yCDh.lx:A?ho R`At\7|Sp ? ֻ~^ ՙBwP0n- QWFsP _/4)^\ҍKS@Xp)M?] K BSVKuGaF.B5eݔ| [\]Fރusse$hu}~zJߥ(f"kԿKFz7@>gMv>(/qLW}@pَ935Yߦ5o|<++NdIj(vN!0vW:ӆcɷ] ۑjҊAQ>'Yq5EQRž7mz ӳhc< b1us}`xMRz0VԢ٫u+l͙oV<- Ȇ^c_z"CDشF1?Oi&RM1Ɩ~zOD-ܭPS@OAse11tSOr9ƏnӻQګALۢ5_7ԍpwo/vrY{5vtIJJ~AەbbB*rndQX}'PLH sټhEM۝|%g0<4n8Km pS;adG~b&#4X_Țª 7(Kc;Z[`]7JA%fۓ՘v!4ڇ#/^S Aԋx8F+)Į"CT98@s{O6"9o=DxQ 6v!ew qfx߸]`8'(%<.sX*2aě:5~DmG_ܽ9WF#!籠Q^2h\WK9o5ٯy Lv*u]h}=s] ʣMcn${rܫ,A0>TH)b +ԁ +wZycmM3%M7;ɯVhsY~̑,IhBtN@n3WY N/gۇx_O |jOOUձX>T1V=H_%?);HR]Yl/ѓԫ7f=7,t`,r4EkGZ,4{cMnAޜ;X [F]صHL=2I\Ѽ@B1'|mm i\Ɛ̈gb.,I0"~-] 7$:5m!۟1O9n0ǗAa\BҙW\;'kyO}@9Tse+BQ&HF̓!9 81OJBgV5=bw'W6>E:-EI$߀Sl:W3RV!"F_97=ZtXT$ᢍYl/S$;6~ebKyd^7QMuDrKv{LF#vVe4ODtlr̊4 I4NJ$³[n;&Svj[v\'Ǔ' u(kkYfAedn?lZ mY)#Qw@\//fMmv?(]Ѱ˨i۝l޻EoKWcb`MZS! s ޼`s-1Uf3F_GŲѲ{(#L|TQnE6R!_&skuA I#z-,:~ EzAjK58}އ 1JV7&l2&\H E62R# :pʚ'-[(j8ҵT=K.g'p9W>Ζj!ؠi",Q+Su3-?mMRs%y.7l=W&Mn%|2jY+:7Rx [TZ]E!IY%uX1dn l ֍f{d+\صXz7<؝z@aL&>4H^'A!>Sμ]Emz?lW__pò?礜P^asjL}v#UfSnC*,ܷ qΦ'1uta9'BeT R^` &x79պ&M!/ yfnk4a@_!p#5ΡZB7 YFJuPD?W"ojCݿ=5a_?@z8PӬ㊥.;YIز-S5Zy Pq;9LZ1&9^Iz`B+"X/,Z)H4oqDik3 ;wԒHB?e׊ 棵Iauu+qy =_Lxs9 7p,@?_OvhuB1NM9qay⨤wnoVdPüK Kٶ¿:Os|F%Af]Y+! 7э݉@2 aͩtY_̵&B|0KZ,(&J#W3j"M*+)Ma Gb̾4C.@h]Xh< ,!;R-ĥLx(c6V;^0aNPS5;M7^카QaB IHO?bS`8(AB1G jq$]IWPbܱcs;D SCi[~ Lz 'Z1kq?$R> 娠xWyU(ؔ*/9Kľ9Z (l3L7cg;zUG η-:}}9iVVCZcx*op[ tz[(}f6h J''d"DUR@{-))Tz81v! Č9qREjك%0ٸ;z]M`֩ so<$w|wNb6KMVJiZ2.۞>'dW5(>{l)2\K q~4z}9b7˂M,Yţ#a"V7p3k TQ9k S% I< ZX;c6V7 tE 32|2'S^(pl\$K[4:qUre#PWj i!ya4t*U +oHˈq.{%V[;ķyJlHەtT=ğ]0@ ~1PW3P"S 1:1] E]LT/.I ٨mUT/&yzUOUbQPcw?|37̽lTgcX<*|=tC@\,T!jSּ%(%~>ٯ-3_`51|!O``!O9?l0kj_FG5~}/#l aY\[:r튅c6\Sdz])[R,x7?i[>5Uq夺n {a-loדb' sZnUwA> lZXv^d`$HY|n2kX,0lƁ$4MNܷ.p8| ]B8&X2䐯4 =4qXu3-0GM\7x~-i$WdLҕmK #~=!QӰIŸ:ZB1KXHGd7NIyf4K{r7dŇ{0d3M-ϧc@(h&PP|n҉+g`{h(59| 0f!ԗE'JF0"hKO*glU1pxˌCwjX~gEKn/4\VMCmŝʘ>tx*M0Ws_Zg^=5@ .\ *r2wcL]9ԃOm"\W"bLG9uL-yފVT7sIȉw~kt6N_o43FuqS  @bQ3 iʍZ?q8@,q [zi0|@,i@~z=5(Ю?FDl#KT(AF|/u:Z OF٩/ l>Ue~_X/]TJo~g"j{Cl m1P `>/%4PljKyq@Xlde_nnI+_0󠜾̛MFfDRkq>qǚL/eY*.R qN !Ѭh,hRVU~y$"u&呒"))$60̀stI.{ĉh"7w#,Ę$"xf22 օ!":;`O3VsÙ, |ݎ~GA k-ta5ى2Qڠ+rm TIK>T}6( x3lHp>$F\El+rQsj }+ HOb  nwla A\,鉍S>@_Z+U$&iBP\ I6-`fn %7ecrT_Uqz䪲E0pcA8`M}z rx ]LUF w$)#`6;F=~ˇ @ݲ6M 32Q199HG JCSU.UexJnk8ąZDC54?uFDz>.Y PP(iÜ2A_ ,l֥JI61'FacI{EUHU7~TNӚ5Mw]$ƣ^nF;U(Nop.a"-u?sQίI9$0sы4O.$TA0d<縼_qjJͭ=<'$ԊE`J+e|5˸aD"(֦Q`#Y{K@5)o0֊ݔ֠d6xajQww P0+U 0ȖT\k$q$ɛAH5pMJir T J"& Ճ9<'S6+DHNˮF"ˮw26ܵ\)D&.⪖-;.YU"?=LJ0ȋ̹ү!?ՊR⭡GEwZf==o ӏ[e?t^74hd!]Ӧ+bײ=\; MثEٟ2Z-1Ve"j L =Rs#+XkI7'V`*spzpI@)cw ,ID_ Z\H%ˤ+~HD9m3jxZF:ޯ!^\G <(s-m%u6ZV?ƪ| ntz0T5@+r(Ğ+o-*>(a3yZh[{ =ɫOh!*n޹Y-P"7t/piu[/Y6_jU?\j7 |uD ~wT4ԉ a 90c Ūhrjn4YT(p6?3\qWEG*݅c)Ky>Mn*آ޸5zs c~ˡv} 4R F!Qv?ڴʷhZ -W5*+TbOV̑mǍEWL\AJ;BtHt-GMMz#-/]"2y]͆?®].˜ROXpn3Ff_^R >{A#Wuw3$a1dHCs3Cc9U. ;re]1"zW ʔ]^3Acbf=%YcS3kX{ 頼+KY2k2OtP]X<<,vQzXnaJ,Rem.}KB%(7ݳA'b bʜ~[<ʗ.Dzge!];`V8\4;+7; @[Xbu笿tϵ-Г˙iXV.=璥^lIBjGeWmT&tl.S0U & /Q yN:.Rv&)3k$ښڛMENv< o6l/~?ͼi {uyCF~0%趢iT)Oߔ~`#b jU ^ĤUpzWX$qzTv"ɵnG8# 9]89$L6[\T$MeA6Qc lZ?*az:{7#Z˕n b, Djh\Lw2"wg@_V^Mlr򯾿JM)7H'(FcVDкZoKs#[ HxkQWǃT0[ 6ָ "xPN\ri;`t4 `:>S$7ن&=MB+>$`W 6=ޤfj8KKQ4A\Ȝ6HoU[(r HUk`5e{Һy+vBDKOLnf;_ lDz a?hv O';("fQ8dgչ:`? ғ!l0grI2aI{$ Q W J̃Hqk Yy)kvAP헆')*PʕAbUq3~Ϫx>1pb{4 XO^YLEFO/\nu{eϊRox)[҄E߇Gm&*ΰkQ\ V>%KTpkB~flZӘf"0x̭6+˾x֩#_ _&rrY5[eS--<-WNZxu^J@H/*SZyN#$5-c̰EzqLa۫`tvո~H(\D2GH;W^pwI&.[#>b߹8/?/FIKQE2": =aW ̗Z%]y |*X rj4j0b p@5a3"ɞ)8GNic^)l@QP[+5r5BrߡYޢDтr `g6rTh(­;Dž+ex2v(,,YiZMQqm\Fu5@јK Caw(-e`(ݝ1snOXdU -?t.]_P|[&ĺgnS*^vDP<x\8HTw@HxW?SfH*K- 3@4-.M`"MB`#w 5nqk:[(T 4R8FL1d^IIS q [&$z?tZeu%mѸu<ʕ fNJKZ)Vmve%: b{Ć@Ѕ:ZE*:M^/sYmFa 3J Ry]vcvJC nv]亩uY6: =R6Gu|J dw0I@kF Y,9d.Q>3QzLs`BO_Ky7]X,]c6K?f6!Pd7j#4b,m+%Hra|*Hߴ6LT3^%{]JF͑*Y ^MV yDX/r\n]B&$[i_z}{~t-+ p}*|J4$țzyR*U(rTòiO}uf孶MX+77&L0p ȑ5?kVZ )sM}uw7Zq .G_.1z-T^Y=&sRϜ^$ƒzĄ7KԻu]nzCfrAG *Dk,=-v78|J9P c) ҫ=ĊLj4YqKxc6ir_@m0$v*՜RG|@h?՗HZQ*)bEָ^o"C9 uBiXŒ;ZM84}pea 3wN>$Q(N>F=f} 6A+!$g%dfL56k /;h1qƼK9W9"T6+ ?YXJÈo@;Ϫ^IT"Gjvrq觳G$زF7c^u0Ka!gb 6soNFsOú|"⾠+ZOn1{ϑ3CB/dZ;^Լiޗ4+m傘(zHVH{* ف%E?xĜ@5gEGL9Yysz ¶ʟ!_.zDWe@P@UO ةYWMG@p*pDeA'?dEm)SE4亮)%VX.-Ӥ +9{\ e@TLbNR1FI^'O6(3 +{z3&-B }OpKܸFv혅hբlH`cb5pҭ qd)B*dt=%7$BQ%zw_DHPag4'l{&%>F%ovl*OtTAZVǮ^Ny^" *_$'F(DwoO4ӜbEc3fy& 䳍$0{a{CTvB]g+-lQRa94z&&ov}mrs6CG qY``XTBaRArOIbA %BW zҲW_*nWEUn9~uYCUBnWٰ-'kE*B͏f8],1mڈ5au7k%/ qIoFrǠmF #pPPAtF_#"8aqv(BU3N2,<[d#?; X&!]՟HP7agc|n@WlU Ac|eZc_t*;K@}L?X-8ܡa 9r?)%$_w8^y&(Ke{7r;guoU5ci&S.#?Vl61g*j XoC8Vx(ST |b^0OO|9[`v7)L;9Йv)$QHwX77sAć<@Q\;AUZH,+Z"9yyATV2Ceᮄjed;q>|/wN(`юa EJ4d5MVQ&k69NӑR ut.aR~ֽUjCߍ4z3Doc? 4VbR/竌ۃu#^HJݠ1Vh?XNT?M.Np/<"[~a G3I83O Oqp?edmY IYݐUp47N| g(u)K./̢¥N }-&&D-"KoNf3,8Om_~,;h+!/{Ta{-Hl{C78 F;,}kCng|$PϽ0J]Jv[M9(UE|,QJMTՓ@[ 1hDˠǾ}+bQ~rF83ai#[.ᯯ^6+śz\DaMʍbc,t7ך^AU[YM{)-R{%)/kh&J;ICF"j\a .|_pq J&ˋ0֤BAA:eABEm>vwsǸ6,>W B&\^yOc:]9Y ¦x!~lWY\fXrcrA;@EX5znj񽮅 ,Kud(mc5%㑘6NyW$"oeCv YX'f7 \9oz^E>?8aq+{/O$M.w3I}>0lN5]Pw&V+89WEicWd0Ɍ: ˛|Rt3ղp_E4O<\b;CC^;,#6:lrgުL9^y`U`7O/,WMz:XLv" /9g1D蜝8w1g)4V8eXypύOQs^b9WоWq3 )>ZcU2,1yAfɞ pD|о4'+#M7ם$\xKŃBs)g[M~w/AiРq\Eux;>:_ gE c4NHW!ɨ Ɔ/ werbxBmomtq7ϱx귞lB".K~>)VZz$%WPWL00iS7Bh0H$p!|`O1PRJ4L:tƱkt~3y4-6 27j GT]'p ZLk}(M'0x"LHLW<{Rfp:(UKˉ6_7r c:wЇsȎ\8!^@1?X L9v9{̢Du W:! RIGko)y̧mQ}"S 'ю2b{ACe"CH=Օy5q;,-Y${ KswP#]Al6 U+"VE#{9Y+4~[$( {Hnt_x#AH :̦i'Roʦq_J=' ՒegΞ(m*rC{A"VWkI^:$.]oW G{-A'e1 KfB֧21h7iugs}YEo#0fC+1"i9C}\b֫m^7׆)_\yk%_cnVlÜ 8|.~̢AmCDcaT8hNOXmY9OOI$ڼ~rR'*L.yJxV*M)H@yvSڬɊ9$_ xADr Fhr0P )%Tg. c^3}M+oLV# F06WvhԔXlV5'Cot>:W)ФQT g݃@E7@żsjqY໽o;;e.Kie.7Q46F0 70 14U"0H)9Q=O. /fk:¬(=4痔bA/ ":ܣHDM>C[a GҮ63Ps\tDB'J>o:~"co$ԜpNH)XW^|s [(=Y.W4ƾtCGk${6=4i[g`'Y'Am2n ,w<=uO ӰI1L %aIěCB!ӠD9Bl*XG"LaYn<>rurV3w",\CP|R嵘BSc?+AoG a*r+n9:R{\'m+Y.Uk7Xh޽?G/5ŭ{:d)8Q0ߨ/j.VX dVu$^ITw暹lrCdVwAa<\M|jnuz?jԚ'YQZZ4۝ƹ3vˌljբ |5 }&l}#ݏ+ZhKmUoZ<zʘoOnht1v?Y0x΅7EX*Kdd13B1*H_d,2SV&+ej%o:s8'I%tjTJs; 8>b*5N}U2+=s3|^w& .{]~-KԺ̄p*UoÃX$#'v&zĞmv@ sIp?(f pO#zsMg7^BCսEƐI af7ϩL57rz,fO܃I RHPp#01&OM!؍!;A SAFEH/9ٗAI- `~~P.%qent1c}b;YN| R\#2ᒙ9s;BL0ynw鏯P. u-w)L"&T*jvo&O'^ipAiɻ&!i_C%KVUh=֮G-ѦGe[67νF8\A)9:~!kPP(/ٚ_ OH:]FX 8}ĨCZ`~-H'ZΡzDpdZ")+r|]B%_8д ׺WN֡ H幵E 4ν~L8>cB3 &T72=Y(}?E}G(`H(Z {eRYW-3I3آ) 7PqhiGŖkyZ/D9 Z7XYOד& fODL ߆ŌrMs\['9O*Qx Dr)caϊoN#r ̄ǝY\QeS)x_taҚ 5/+ F{,rEsYe#G0J9p{ƅ;<K0aDN_ƶt3 K '^&yXH5n?\>q+ F%HhBk]:ܦ <'(Z x]jWe qv'[ur8ؐsa&؎tHEt)^9vL*ҧhU Nf 7-sDp"^OLQ:[!øiT2g'aͅ[!Tx5Q:~XHo+LJ P>TK\NzM̶Ӧ۪jRBۅw`K彜Ub`oQ^Y8NvzK dH Wd -73 [`G'\aوKwx(Wt}G(^t# ]^" ĹĄj7 F!3%@);9uK_Qg"]\J1=%2)44Z5!F͇%@"mXyݎT~$ w'\G9i"n.v~rj`-ZD@O_A֏M,|\6ЊrZ \cހŤ+$Lu~SRDED`t~G\R~ӗ9̊ ?Ee2n50EmZVʰ/g1kun4$QyxԦM6HD wC(@<}Hq2+BK%XGfI^pw,s)98J}y03asVSP=چ'ZCvT;F;I7Iu{p*ڕi{ eQN2LoW Xi?"h?:kκ,Ag,J.' cǗ7N2䒁CӨƣ\wz!1p8J^%nkPz澀or?N=oؘ!W l[nØJk)/`[ 49 a4W,kBjD@U' Ö7B`SV'ŗumʇ_&gpN/*Jg(k{޿͈N@z>5=i)b'yۖ#ݮ{FgCR@bAxi*J/L`r޹Gx #:wiN}Plhf%c?5Ȧmi3:e39pPww~|wݔÓt+n:18M>wpHc\eC@Gf` 3ǹȓV[2Ka@Q& }=}l[#N5(4Qh38j/N N"IW/ $t GjȖRDmbH"]#^v<,K9=sGŒgñ,FK05^zhS(P<.Yk>h!2lii@KqIkL($:^޲^Iw) oH ' M A߳x~G0X~-Lq/Mݾݮ@5iۃ,#>O&JRJ?k6Ao))O&z +V,u;;< m:: y0ѪbO\hihXTB|^qeE B?Y(I8d\S[j*772Q:NRѳdޚV  Ts+{bӈ)+L( FQb aٷu3~mIc]:.tdHb+yx=5]2_ܕv-zLmЇ8UȚ@Ay>ҙ"9SSL';|e֮ӧRE.iN#% b,-i0S@iZW6KsY\C E>EqGruP73O[5Z:ܗ_e%~05wn*g_?WVhq _:wۮCrO`nc=_`'82h犹^ZI,ol.owtl_7 1NRKNX<]tC8@a|= ~`"W@`VIWLbq(Jԭɭ8lK)]&-i7.&? ݮĔG$&|H 6W`Wp[Êhb ZT$oyE]N-nrMof|?`K65{2r΍늣 u GICp w*j&Tf0<j0qoxn/a6J| u?0xX:Tm`0 dI`xod/#<٣.rXpTktyƵ|a>@>uŽ7Xۊ`Ij-Y{Ӵ5y\BU^P (݄y&X32ܧnY]]% :4:KъnrT hم-i  7$3+חwxP,@6fS{H7g}1K"QٗtP9hWhrvsyCUԯ@<~>taMVZ>_mNWB {"6ϝ!n2 ZP:bѣ9ŏU]?ALkڏaă5Τf Y9XR|4-e^ ct+-'GWB b"H;\\l$mXM˰~ +? I^xKTYo,dejhH$U?]\a#p:uU]Mpq)x-P%SF$bc!Gjꐬt2CQoSOp' _J>,[p?*a͉j,p-x( @64r,ZX?P/Xah~]7>CA3_!gp%txU+`Io=K*#3YgQ{e8ѣ~a M=rϳD^1O鱊sw&MZ_YT!qC* >{yfμޏ-JU,KY^<*ZӶ.D逇n\*|qTy-<VeSf4֐I@!2(wrLE7 c\~rD\$?7< f::7}T <>=6B,QĪg/5b܎A Mڳv)c%*~m_'=?I$@:e-Aj]˽lޠ)FĤ v8" n&Z[wRVzW <_`\=yb}w_9VQ;g@=HrlV( !*eJF'f}BRGs?4j#zf2qjcᗡ*$BL׿sq/0{+&$XZsv!ֆ%ryvhat'xW_)#]ԠkTvz;!M7"V0 L.kSܨ, Kܖ&b_G0Ri̴icҶ`,>&j u 4,h 5ԍ*.0Wi/-V@~H\0SJ=$ѡ*%"/9WI|N^5asK_Ymup;fߍ/%tљ HeؤV%9NȑwqAgLxVj;نt zT<{=c=mhD9[G9E AQůEo1Ra,ygdrp<,,Qۜ| oQrA;9~+2[lq=C`TS>EPXGϨB3_."R)e0O ЇB6@',\Nñݿ[f#KLkie,Tx1ni>RK m>]O(]]'b1Et솁0{# FhxoQCO\h*,֯eK(<,uXYF2Â~t e88gZ"hUfT4~frIg f w<.*著qYa^%PٟW ipB2e*2Us抃ej{^ԻЌ樆iH鯼,Xvry1r.џr|zqUCز:[{ * )8*of>->JZ\ڄ]`hhK|%F-jEC,vI }H4;ӌhJ>G}&'@@J"x _`.FhAY+9znV]S"$UpDoB#\Y59S@O(+Q\WVD~fYZUtbEgX|CF:U}R,Rq8!{8&Er,IrUu%eb'V3$[jkY=W5 I6dPH.DZVW9gC4SfR.т'gq9+a aO$= u^`Hg2Bd0|\sJSFXGs{V $E =[\ q8䘚 xZ)5f4 vD=;T!N~ݹu4TD '{.Og?O+v5 ~Cv[Wt(ǚPC"(gFu==29/Qb0ifޖpAnMdI%5$Vo;MVDHWOvlF[bCXqs_:VO*8Yzbe"5bjɢg_;&6a1[h/Zs+ hZduOnl%G̻ vBy2ۋ+j-&x {}}h{70Pf-GƠ{XXl>q;#):z> Un(TCOquM*88Tϯ" _rcUJ{^ziR'@`1"VꦭoO!w 4czmA͛G/ _ 1 .vq5"u}j2kb;Ï^,L>>Cֈj z9N=,dZ]'D= xB=ln5{;g_ VµgoAvF`3^JL{90}y/LͱU'G}E ,^bɾ;eŬ ѓ H髜)[o{$t[%Caɜ[m:5Keq"zXuZ\ 4'A͍2 8vB#_e9$}@xU6 @ ے{_Ͼ8XZ`~d&-2X ـl~1LfʧIlGtS9P9OCJY롑E Aec)-[UoL'>Ey62ȎL]Ku;+St5 <9 U@n%Q-1=RE/I:ӹ $wr/0[63D%orxa3Zrm`tyzo6kOk~/C-dj,gg<[O%Y<s3-| di׎JH$wm4p'\| 9 ㎤!`"F|UEHWb & ֮z{u%eTiR#{i778#N לzEm;Ѝh1O1o(/Swqk ]=>P@QIglqznr5?p-̖t0I{^/J;S8L?:-gb=R!$VP9Z~T u‡^2Τ80z MɘAEm~z BÄ́1xH/GaJ-T;!J~"G;DuF Ovf.鸻sWh3Q[jͫ"57-U'c7)9%/\nSyH4kN@}KK#=Ys#V>BL=%^ih=nB+r+,( &Y͎[M չ]weg݌fk?2>"Fv@kz?%̌+;_2GD9,ǦDG,2I#|+1I&U:]V$5NHWG'Uc]jz)(vJ vʵ]nUua ιK9a%[#HH &Ŋ7W m4ve<ۆD3}D,\x )^K׮U08A/Ӷv3 :;/W li6`m9&=vL9@7sk]"oGg\PRRq]gX'&O8ZT{F {HbɍOwR: !@A ;,uH&6rV>1$V{JGƼ[\ؕm{uyw͙b,gzѻ&1,)g 5^|ׁoy@Q &C|&I{g/BյBdɴ5ڮI}}VB\h1 jH.P =YeYyn3 mAȫ{:qTUY`L0=#fUkwOi~NH82ւJot'5XZǵ{Wa鯕uHщ N-¹c^[yP_1ؤNd*P ΋t/)=4=T "{pWH"TPb>(RnI:1>oS燿 :d`3Ǻ$j[|w2;oI Ci':& &oDU̸B 3`jçA IQ!xd01\.\:wf53b'tL[˙nu"1>"EnVDW` c_0qJql@C6a Itb+?dM< r.5vUSGئo('GzĮܓ @*Ń-]v#)Κ fa kYN?xiSI2,Q"_@U N]RC(B"3&*DKp#< D[/T Έoz0N3MlE,z'c^ǩ%uw &=M?.5̷-Ԫ. 2c`ӄ۰q ɝ WWƚ.`7ȹi7h$d)bBSk(fY|8Ɓkj\Q knPMsk<X6mXP*iuy¢԰d&ճV ۯG朆TCTJC0$*y, 9K7 MPj[P}\'׆ b|!`[E#/{ Zصm+7Z!s|ME2v|2܋vAi13KS D:Bhs_Ŝ+xҌ$2.{hO dF J-}4 t]\;~tӦcmtaQ=+MP_ūwƜDq8C EuՈ#Q{0@,,:x^bX9o֞aFt!pm"1(۹*qx_J%qRCk%)bw(0!sI}Ě"_*lɍm1˰L2"9*Nw_<eA _m/&b( QGʍr oE^t35L.roZE<#%o[ns#s71!@ܑp\EDO4UDGڑA9^% '\0JPRaMNscHzmkbfl2ǵ\Rġ+;q?A%#c|A)d6 rv#rb}M >YZ%aX,c86=0oG֑!h,OꚆKaơ$@fYh4ࠒ9+S(.$͐`Xwtn|w k !O.:`=wARuL6'SBX?jB`"wϕ"~v7qە!#^:#0h3vHQ&H5Mrvm֬M8#PWD0rJyub[C4{y$Y0Uciv, v4J̈́lO_Ps^$.5S[jhyĘ؞ Ԟ/wdk+}_v)h0t',vjn7-apf[lUз7JF O E8dMo괸6 4HʙeM{$܆\sf}1ƛ~ФI!l[Y)oJB'BP%3B(q.5Dlwј8h=TA0l;Y+{L/8 n!찝`[kϲIZs#MzO~Ceq:'X()eI`?F\dP-> ۄyZ=IDJo[y[Ze6Ac`+UV_ 5 }\G+ #o'ć>#Ҿf+lr ٽu ?D/K`ǫ- _$Շ. k+nyANerZC Ӵ^ދ> XA7CjJ8j`څ#J=wac;]{9]:hf V(XNŹS-!zŞgiljwow1*Ȫ[? 11ݛ/wR/e2gB݆_uYU>2g#.Rr^f{W$vPx{2nP^ө@tձ3y*pO#NOFKqv^e WV5e؄Z92zB Wx3z9av ֖Ź$( ayExI"j>yV?6ĒVXL(̿S"ҖDIP L^nzWxRL[C_-`a0淽KVGUNEw+R8Ti65k{ݪ~3{@^ZTG|CrS#oB=+0&Q(QMUXƀ^ ok~Y ,Orݡ .8i#*Cm]Qу,y>+)+!/yn "_sQ;tQdDcU~ (4fGX  (mDQ ="=l6~ڼLsB%8Ʈ#'oH?1Tk޸y6T nКae½/}:1IQpzM=h}Yґ,R "F̘[b@S#lq= U+4qȂR`౳02ɚ9B*9r'~em"}",ֱxS8PfRsm@Q{Q6y`C;(g# yq LC[!8WVdz@u5dd*t"G~@qUcg  FCl{pM{7q`Z?l"I Þ1ޖr'F[t6dM& !l)ƥv.faĽe,QUl#T a%Q[n%Ky\"vS,dm)r'La\CNFLk)motpO%߯xSjM%kA_F bJhvNh"!^^a@#"2G[ ѷEJm*LhycxC+<ޞnuҏ{{+‡_uo;? \_suٓ2ݗADν VHۢ3>$e L'o't]Zg_}w4CBKN #`]6(z[2=S.4Tb4i/bϵ*zc jrJUM,Bqr+6j5vj)v|ei=k^}u{)5sDgXu bO$ɨ;׵*6؛FdR R-lrS[vg(Qtgʭ\#G|Ip:aV5Rυ2uCh>s ,>% d!q#rJThQ,z%JPw8dQ+D}FB^^1~K~~wH~rTTNdٙ))灤(h(a%BZ $>t.k@+g4V̷F!bַ9eȒ j0Cj7 - ڪ8+=rў8.g 򛳡0#BYGRr4mEfprtys~Lh&U4$6KCo7q鈌>Q`G[ 0WqBz":I!kyDBureTCG@9ޅ($itsbP.Ўn"-v^}YJɧw"?~;@̗k7*6x׸'Lj=`ppj (m!4Nc #dpI=b\|3plO  A : )E\ye I/1v>_JDEbcn.9EtqHOZeZ >j B^y_)]FpNRcY]®5lG_rZq_2h9wLYNø OwEc.IJV꨻7\`|,Y=R( ~o4Ph<*o. TX5 '=wp Kng8 _hKp57Cr_/uD/}^mW@~.e/>,rl2jV;۾ޟ"Չ 'ȜQk\{ (GA2i'ؤ ` Vfx"s0x yFq'`[Uƃqn1 Z ioTRNfKD 6)A[Ԏ.Fh'QȜO ,p/CaDC&_=m)?NQG-6SS7YL.^T Ÿ}}$:sĺsS_0]DׁAձ:^ǧL/I]]y/@pWQܤ-U-%ɴbT&-da_^+1qa~/oMl]v2߲2!ӫu=LlaQNh "ҫznrF;\(>#vP׿AX/FOo7Y}U);JYZw8bN7d-z[ I: 0c`ǀ2ů*wj!u<^|WD1tA)rQ^5kV"xp.~6jp/cJj0ra@ 74]!Gzl1<":q;lE2.zsIh(bZ49Cnշ|c)\x52g/'*cgv$jM ]̶ \{o6/ -"6bj|!e]A+;煶.ܛңn!!@ChI>[*cJ@׸B0%N6 z1F|`[,=JeDy職@㈌bqss\;ۭPW1^aun:~,[,|oIu_ te-Ų^>{A4!T2hp${Uă`Ys?&SO zί'xpC ݓ51:e(twX9k)V!\≇qI>Q> >[>o 99vZ[3?]rD5X"t-8`!gג|2K*6|vNFsF~;JPE$zXpRse+?uVhTw$(mOOY"ݬu3fs6D=Ocm?M Bu'@|dR'bˏD-"[CjBWw2,O!6sJ9|Ñ1QoM!fнQ^7_PEU;dt@tE;dR Cت}p/@WQarwEߕ(~bP^eo;5#W0<аlr[rU6 e-"bk 4ҹ mS>7mL#N gzs^[ 7y8-͊t`HbpWD0PHmr)ig 3&>{3-xO.jl`)n HG2u1±W.DΥɨQ':2JfRωŭ1geWZ"sXz1wbi3U@"3#R5jHP]1Sf W733iRebugjr\3',y]pA3/ ًхMei>mT/V E!gJi%NWhYa4hJ.6NG<,H`T)PwMImɶH 6bH4(4_L`u[LCy͵\gMBc/(nZ ojscW@9 ˆR';xqA H~MOs^s׀>)81J@xTܗN/j}^7u?Cw G hCgWjrH'Β.גgvjm1*zg/3n1d ݊\o,:g)Ѧ@Geէw}dꡃS+:`Dx5׳\5卟cY)̝eq;e*~ KziDrSMUM_N-SȚ%8F$cv=ʹۚ zF9 f;ލoװH\'PfWbƄUo^c-F= 9fKƯqz‹c~;x޼HcAgP&1vePZV*MཱུcI#It&,ߐ7&t'hh]1V;~U. .oR+["SsJT|k8^P _ N΄j9 /hsB aE^{|CgXy4Ջ6>5j$D2qcA8롟bp 2inb-˚7W/pe"]v$4}VAVo0[dM(p΋aihhpP`&%ng-t a="~[f4Wn8in62?@c/%a#?eDn+%`YrmGJnK3dϚ_$qbl[;ccӔE,5];pEi&>[ČT=2CQ6@.~Ggo?Qv, qKzO2 ZvW;'uN,P5f8)Q $+_u˶ W4:x03;Z ^w|C<7 /*HL+c4Q r2-kEL-T?yӅyMaV z5r111hF: 1+͋nzl:zHIc2?x@u98Ur ~N T=j@AAL#ZItchnbdaNTzUdYtNt8KՐԚ"0ڮklyPW5wo"JD̀ZB|{ N&4~"~w <|]Z~ᛍ 4_U %mp. kv ];"UP,kOgaE]R607z3 VkC,- wHp!c'*)[l{)oBH%/S+-bxM[\!X=$taZ  !qW1Yͤ&,^$=H()".滪*h.EwJkѺT|gY].|λA('h*TǏ  "1[淣]a9%8\t:ez\~ 0vqtCI?ÖP]irZygS]Y&n3q9M#&m1?|Ȟ䰻 eMN*LnB[PBZCxvrEYS *Aj' lswD$C׉D@\2aSG}+e( o_n4 YMh&*L{ ُl\&$%J<'FpI2Ѳ 4Zw ?4q2k+'֢8DzKGQJOZ0^}*DE'tyJ!_?Jw6C*}B _33VtA/{(*̽`DecYGY?`-c! UTwe Ep&Ɔ-s;%vNgFtjXN3Oč6hcyT;z54.vي #̡0# nt\u`>Q~1;n_ґuyqGHO"ZTܞ$ը5D mӺN^ߌU:}V=C4}R(vx/Wk_o[eGS}Zu,0oiƝKB&&%ZpD [ VWЧl8YyWd[)HAJ\Wb]z1r\bv6uB W:y W'8ZGY` XWY=(ʀ pJX;ǃdq%<7>8)19.OQQӏ23^2tT?>V4j_>kG,U,rP=S=٣1q tر6t8>{PВ Vvq]%=5BXN_Tם* L0ZSrۡ.3t6]fpT3_J111ea%9s0]mgv-n+I~h! 'u (v/d}W{/}e=C.o!SM%Ǯ*pD^ Շsl*gg~ؒAu!<ՑR`W*hи*>Qp(cuk5#c݁:_ѝ#76R| Km4"2/ I/&`I&"$*%1OJ, U Id~4w@c+ht NwA|[<L ^]hrʕ4|;z3ݜSXϳc}܇s M!$di5# !@qԚmNf@2_4c5ѿ-V <זl:ȩ J/q,[$2xJcF~*ײƠѴD.M7<{#VW[Xk`@Tw:V#n=7Cޭ,g-0/GNy ):Ts&&z./d*GEяX8,fCU22OF|QDVT?7i{ X>\/Hoͽ޺Ίވ%~b=̈$;st!ޞ?Q5K6HU!'RGDfn se.8F>9`c4|]'rkvXٟp`FSMi!Gb76[U-y #4WJH^Iٖ_i3)}vb@8|Z0%Nf;£-Йm){HM"ÅC.g8ѽ4ȅ!T|Ք/s*''="jg4ړh;S